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

#include "MessagingDataWriter.h"
#include "component/MessagingComponent.h"


MessagingDataWriter::MessagingDataWriter( Component* owner,
        DataElement& element,
        UniversalDataElement* universal,
        Logger::TimePrecisionType timePrecisionType,
        const Str& channel )
    : DataWriter( owner, element, universal, timePrecisionType )
{
    // set the wirter's messaging channel name, default to component name
    channel_ = ( channel == Str::EMPTY_STR ) ? owner->getName().cStr() : channel;
}

MessagingDataWriter::~MessagingDataWriter()
{
}

bool MessagingDataWriter::write( const Unit& unit, const int value, const Timestamp& timestamp )
{
    // write to slate
    bool retVal = DataWriter::write( unit, value, timestamp );

    if( retVal && owner_->broadcastEnabled() )
    {
        retVal &= owner_->setMessage( channel_, getElement() );
    }

    // return true if both writes succeed
    return retVal;
}

bool MessagingDataWriter::write( const Unit& unit, const double value, const Timestamp& timestamp )
{
    // write to slate
    bool retVal = DataWriter::write( unit, value, timestamp );

    if( retVal && owner_->broadcastEnabled() )
    {
        retVal &= owner_->setMessage( channel_, getElement() );
    }

    // return true if both writes succeed
    return retVal;
}

bool MessagingDataWriter::write( const Unit& unit, const unsigned char value, const Timestamp& timestamp )
{
    // write to slate
    bool retVal = DataWriter::write( unit, value, timestamp );

    if( retVal && owner_->broadcastEnabled() )
    {
        retVal &= owner_->setMessage( channel_, getElement() );
    }

    // return true if both writes succeed
    return retVal;
}

bool MessagingDataWriter::write( const DataValue& value, const Timestamp& timestamp )
{
    // write to slate
    bool retVal = DataWriter::write( value, timestamp );

    if( retVal && owner_->broadcastEnabled() )
    {
        retVal &= owner_->setMessage( channel_, getElement() );
    }

    // return true if both writes succeed
    return retVal;
}

void MessagingDataWriter::setChannelName( const Str& channel )
{
    channel_ = channel;
}

const Str& MessagingDataWriter::getChannelName( void ) const
{
    return channel_;
}
