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

#include <cstdlib>
#include "LcmInstance.h"

const char *LcmInstance::LcmUrl_ = NULL;
LcmInstance* LcmInstance::LcmInstance_ = NULL;
Mutex LcmInstance::LCMInstanceMutex_;


LcmInstance::LcmInstance()
{
    LcmUrl_ = getenv( "LCM_DEFAULT_URL" );
    if( !LcmUrl_ )
    {
        LcmUrl_ = "udpm://239.255.76.67:7667?ttl=64";
    }

    lcm_ = new lcm::LCM( LcmUrl_ );
}

LcmInstance::~LcmInstance()
{
    if( lcm_ )
    {
        delete lcm_;
        lcm_ = NULL;
    }
}

void LcmInstance::CreateInstance()
{
    MutexLocker lock( LCMInstanceMutex_ );
    if( !LcmInstance_ )
    {
        LcmInstance_ = new LcmInstance();
    }

    // Create an LCM instance
    if( !LcmInstance_->lcm_ )
    {
        LcmInstance_->lcm_ = new lcm::LCM( LcmUrl_ );
    }

    // Check if initialization succeeded during object construction
    if( !LcmInstance_->lcm_->good() )
    {
        Uninitialize();
    }
}

void LcmInstance::Uninitialize()
{
    if( LcmInstance_ && LcmInstance_->lcm_ )
    {
        delete LcmInstance_->lcm_;
        LcmInstance_->lcm_ = NULL;
    }
}

bool LcmInstance::IsValid()
{
    if( !LcmInstance_ || !LcmInstance_->lcm_ )
    {
        CreateInstance();
    }

    return ( LcmInstance_->lcm_ != NULL );
}

lcm::LCM *LcmInstance::GetInstance()
{
    if( !LcmInstance_ || !LcmInstance_->lcm_ )
    {
        CreateInstance();
    }

    return LcmInstance_->lcm_;
}

const char *LcmInstance::GetURL()
{
    return LcmUrl_;
}
