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

#include "LcmSlateRequest.h"
#include <vector>


LcmSlateRequest::LcmSlateRequest( Component* owner, const Str& channel, lcm::LCM* lcm, short sourceID )
    : SlateBridge( owner ),
      LcmListener( channel, lcm, sourceID ),
      debug_( false )
{}

LcmSlateRequest::~LcmSlateRequest()
{}

int LcmSlateRequest::unsubscribe()
{
    clearRequested();
    LcmUniversalReporter::RemoveAllReports();
    return LcmListener::unsubscribe();
}

void LcmSlateRequest::handleMessage( const lcm::ReceiveBuffer *rbuf,
                                     const std::string &chan,
                                     const TethysLcmTypes::LrauvLcmMessage *msg )
{
    if( debug_ ) owner_->getLogger().syslog( "Recived LCM message on channel " + Str( chan.c_str() ) + ".", Syslog::INFO );

    if( checkSource( msg->source ) )
    {
        // Unpack the message
        unpackMsg( msg );
        std::vector<const char*> names = msg_.listNames();

        for( size_t i = 0; i < names.size(); ++i )
        {
            Str name = names[i];

            if( debug_ ) owner_->getLogger().syslog( "Handling slate request for " + name + ".", Syslog::INFO );

            bool ok( true );
            switch( msg_.getType( name.cStr() ) )
            {
            case lrauv_lcm_tools::Byte:
                ok &= slateRequest( msg_.getByteArray( name.cStr() ) );
                break;

            case lrauv_lcm_tools::Int:
                ok &= slateRequest( msg_.getIntArray( name.cStr() ) );
                break;

            case lrauv_lcm_tools::Float:
                ok &= slateRequest( msg_.getFloatArray( name.cStr() ) );
                break;

            case lrauv_lcm_tools::Double:
                ok &= slateRequest( msg_.getDoubleArray( name.cStr() ) );
                break;

            case lrauv_lcm_tools::String:
            case lrauv_lcm_tools::Unknown:
            default:
                break;
            }

            if( !ok ) owner_->getLogger().syslog( "Failed to request data from " + name + ".", Syslog::ERROR );
        }
    }
    else
    {
        owner_->getLogger().syslog( "Ignoring message from unknown source " + Str( ( int )msg->source ).asHex() + ".", Syslog::ERROR );
    }
}

bool LcmSlateRequest::slateRequest( const TethysLcmTypes::ByteArray *array )
{
    return slateRequestT( array );
}

bool LcmSlateRequest::slateRequest( const TethysLcmTypes::IntArray *array )
{
    return slateRequestT( array );
}

bool LcmSlateRequest::slateRequest( const TethysLcmTypes::FloatArray *array )
{
    return slateRequestT( array );
}

bool LcmSlateRequest::slateRequest( const TethysLcmTypes::DoubleArray *array )
{
    return slateRequestT( array );
}

