/*
 * ConfigDataElement.cpp
 *
 *  Created on: Jan 9, 2012
 *      Author: godin
 */

#include "ConfigDataElement.h"
#include <math.h>

Mutex ConfigDataElement::ListMutex_;
FlexArray<ConfigDataElement*> ConfigDataElement::ConfigDataElements_( false, 256 );

ConfigDataElement::ConfigDataElement( const ConfigURI& name,
                                      DataValue* initialValue )
    : SimpleDataElement( name, initialValue, nanf( "" ) ),
      configValue_( initialValue->copy() ),
      isConfigValue_( true ),
      requiresRestart_( false ),
      secure_( false )
{
    MutexLocker lock( ListMutex_ );
    ConfigDataElements_.push( this );
}

ConfigDataElement::~ConfigDataElement()
{
    MutexLocker lock( ListMutex_ );
    delete configValue_;
    ConfigDataElements_.pop( this );
}

void ConfigDataElement::setConfigValue( DataValue* setFromValue )
{
    configValue_->setFrom( *setFromValue );
}

void ConfigDataElement::applyConfigValue( const Timestamp& ifWrittenBefore )
{
    if( !isConfigValue_ && getTimestamp() < ifWrittenBefore )
    {
        MutexLocker lock( mutex_ );
        setTimestamp( Timestamp::Now() );
        getDataValue()->setFrom( *configValue_ );
        isConfigValue_ = true;
    }
}

void ConfigDataElement::setTimestamp( const Timestamp& timestamp )
{
    DataElement::setTimestamp( timestamp );
    isConfigValue_ = false;
}

void ConfigDataElement::ApplyConfigValues( const Timestamp& ifWrittenBefore )
{
    MutexLocker lock( ListMutex_ );
    for( unsigned int i = 0; i < ConfigDataElements_.size(); ++i )
    {
        ConfigDataElements_.get( i )->applyConfigValue( ifWrittenBefore );
    }
}

ConfigDataElement* ConfigDataElement::GetConfigDataElement( unsigned int index )
{
    return ConfigDataElements_.get( index );
}
