bool NXConnection::Advance( unsigned int timeout )
{
  if( ErrorOccurred() )
    return false;

  if( !pProxy && SessionNeedToStartNewProxy( pSession) == NX_Ok )
  {
    NX_LOG_LOGDEBUG( "create proxy connection.");
    pProxy = CreateProxyConnection( pSession );
    if( InitProxyConnection( pProxy ) == NX_Exception )
      return false;
  }


  int iState = GetStateId();

  if( iState >= NX_ReadyForConnection && iState < NX_InitProxy )
  {
	if( EndServerConnection( pConnection ) != NX_Ok )
    {
      return ( AdvanceServerConnection( pConnection, timeout ) != NX_Exception );
    }
  }

  if( pProxy && EndProxyConnection( pProxy ) != NX_Ok )
  {
    if ( AdvanceProxyConnection( pProxy, timeout ) != NX_Exception )
      return ( AdvanceServerConnection( pConnection, timeout ) != NX_Exception );
  }

  return true;
}
string NXConnection::GetLogPath() const
{
  string file_path = "";
  if( GetStateId() < NX_ProxyReady )
    file_path = options->GetNXSshLogPath();
  else
  {
    char *pLogPath = GetStringParameter( pSession, NX_ProxyLogPath, "" );
    file_path = pLogPath;
    delete pLogPath;
  }

  return file_path;
}
void NXConnection::Stop()
{
  NX_LOG_LOGDEBUG( "Info: stop connection called.");
  int iState = GetStateId();

  if( iState > NX_ReadyForConnection && iState < NX_InitProxy )
  {
    NX_LOG_LOGDEBUG( "Info: terminating server connection.");
    TerminateServerConnection( pConnection );
  }

  if( iState > NX_InitProxy )
  {
    NX_LOG_LOGDEBUG( "terminating proxy connection." );
    TerminateProxyConnection( pProxy );
  }
}
    /*****************************************************************************
    * Function - GetStateStringId
    * DESCRIPTION:
    *****************************************************************************/
    U16 InputFunctionState::GetStateStringId(CHANNEL_SOURCE_TYPE source, U8 index)
    {
      int ai_state = -1;
      int di_state = -1;

      GetStateId(source, index, &ai_state, &di_state);

      if (ai_state != -1)
      {
        return mpAiFuncState->GetStateStringId(ai_state);
      }
      else if (di_state != -1)
      {
        return mpDiFuncState->GetStateStringId(di_state);
      }
      
      return SID_NONE;
    }
    /*****************************************************************************
    * Function - GetStateAsString
    * DESCRIPTION:
    *****************************************************************************/
    const char* InputFunctionState::GetStateAsString(CHANNEL_SOURCE_TYPE source, U8 index)
    {
      int ai_state = -1;
      int di_state = -1;

      GetStateId(source, index, &ai_state, &di_state);

      if (ai_state != -1)
      {
        return mpAiFuncState->GetStateAsString(ai_state);
      }
      else if (di_state != -1)
      {
        return mpDiFuncState->GetStateAsString(di_state);
      }

      return "";
    }
bool NXConnection::SessionAccepted() const
{
   return (GetStateId() == NX_SessionAccepted );
}
bool NXConnection::Accepted() const
{
  return ( GetStateId() == NX_ProxyConnected );
}