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

#include "DataAccessor.h"

#include "component/Component.h"
#include "data/DataAccess.h"
#include "data/DataElement.h"
#include "data/UniversalDataElement.h"
#include "data/Slate.h"

const char* const DataAccessor::REQUEST_STRATEGY_STRS[STRATEGY_COUNT] =
{
    "MinPower",
    "MinError",
    "MinLatency",
    "MaxFrequency",
    "AllDevices",
};

DataAccessor::RequestStrategy DataAccessor::Str2RequestStrategy( const char* const strategyStr )
{
    for( int i = NO_STRATEGY + 1; i < STRATEGY_COUNT; ++i )
    {
        if( strncmp( strategyStr, REQUEST_STRATEGY_STRS[i],
                     strlen( REQUEST_STRATEGY_STRS[i] ) + 1 ) == 0 )
        {
            return ( RequestStrategy )i;
        }
    }
    return NO_STRATEGY;
}

const char* DataAccessor::RequestStrategy2Str( DataAccessor::RequestStrategy strategy )
{
    if( strategy >= 0 && strategy < STRATEGY_COUNT )
    {
        return REQUEST_STRATEGY_STRS[ strategy];
    }
    return "none.";
}

const ElementURI& DataAccessor::getUri( void ) const
{
    return element_.getUri();
}

/// Protected Constructor
DataAccessor::DataAccessor( Component* owner, DataElement& element,
                            AccessorType accessorType, UniversalDataElement* universal,
                            Logger::TimePrecisionType timePrecision )
    : owner_( owner ),
      element_( element ),
      accessorType_( accessorType ),
      timePrecision_( timePrecision ),
      dataAccess_( Slate::GetDataAccess( *this, universal ) )
{}
