/** \file
 *
 *  Contains the DataWriter class implementation.
 *
 *  Copyright (c) 2007,2008,2009 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 *
 */

#include "DataWriter.h"
#include "DataElement.h"

#include "component/Component.h"

DataWriter::DataWriter( Component* owner,
                        DataElement& element,
                        UniversalDataElement* universal,
                        Logger::TimePrecisionType timePrecisionType )
    : DataAccessor( owner, element, DATA_WRITER, universal, timePrecisionType ),
      componentRequestingData_( false )
{
    element.registerWriter( this );
    owner_->registerWriter( this );
}

DataWriter::~DataWriter()
{
    element_.unregisterWriter( this );
    owner_->unregisterWriter( this );
}

//-------------------------------------------------------------------
///
bool DataWriter::setUnavailable( bool unavailable )
{
    return getElement().setUnavailable( unavailable, this );
}

bool DataWriter::isUnavailable( )
{
    return getElement().isUnavailable();
}

bool DataWriter::setInvalid( bool invalid )
{
    return getElement().setInvalid( invalid, this );
}

bool DataWriter::isInvalid()
{
    return getElement().isInvalid();
}

void DataWriter::registerChange( void )
{
    getElement().registerChangePending( this );
    getElement().registerChangeDone();
}

/// Set functions
bool DataWriter::write( const Unit& unit, const int value, const Timestamp& timestamp )
{
    owner_->setWriteTimestamp( timestamp );
    return getElement().set( *this, unit, value, timestamp );
}
bool DataWriter::write( const Unit& unit, const double value, const Timestamp& timestamp )
{
    owner_->setWriteTimestamp( timestamp );
    return element_.set( *this, unit, value, timestamp );
}
bool DataWriter::write( const Unit& unit, const unsigned char value, const Timestamp& timestamp )
{
    owner_->setWriteTimestamp( timestamp );
    return element_.set( *this, unit, value, timestamp );
}
bool DataWriter::write( const DataValue& value, const Timestamp& timestamp )
{
    owner_->setWriteTimestamp( timestamp );
    return element_.set( *this, value, timestamp );
}

const Timestamp& DataWriter::getTimestamp()
{
    return element_.getTimestamp();
}

/// Returns true if one of the readers registered with this
/// writer's dataElement is requesting data
bool DataWriter::isDataRequested()
{
    return element_.isDataRequested() || componentRequestingData_;
}

/// Returns true if there is a non-failed "implementor" reader of this writer
bool DataWriter::isImplemented()
{
    return element_.isImplemented();
}

/// Virtual method. Returns the name of owning component
const Str& DataWriter::getChannelName( void ) const
{
    return owner_->getName();
}

void DataWriter::setChannelName( const Str& channel )
{
    owner_->getLogger().syslog( "Set channel name is not implemented for " + getUri() + "'s DataWriter.", Syslog::ERROR );
    return;
}
