bool AsioServerTransport::isConnected(const SessionPtr &sessionPtr)
{
    AsioSessionState & sessionState =
        dynamic_cast<AsioSessionState &>(sessionPtr->getSessionState());

    AsioSessionStatePtr sessionStatePtr = sessionState.sharedFromThis();

    return sessionStatePtr.get() && sessionStatePtr->implIsConnected();
}
bool AsioServerTransport::reflect(
    const SessionPtr &sessionPtr1,
    const SessionPtr &sessionPtr2)
{
    AsioSessionState & sessionState1 =
        dynamic_cast<AsioSessionState &>(sessionPtr1->getSessionState());

    AsioSessionStatePtr sessionStatePtr1 = sessionState1.sharedFromThis();

    AsioSessionState & sessionState2 =
        dynamic_cast<AsioSessionState &>(sessionPtr2->getSessionState());

    AsioSessionStatePtr sessionStatePtr2 = sessionState2.sharedFromThis();

    sessionStatePtr1->mReflecteeWeakPtr = sessionStatePtr2;
    sessionStatePtr2->mReflecteeWeakPtr = sessionStatePtr1;

    sessionStatePtr1->mReflecting = true;
    sessionStatePtr2->mReflecting = true;

    return true;
}
ClientTransportAutoPtr AsioServerTransport::createClientTransport(
    SessionPtr sessionPtr)
{
    AsioSessionState & sessionState =
        dynamic_cast<AsioSessionState &>(sessionPtr->getSessionState());

    AsioSessionStatePtr sessionStatePtr = sessionState.sharedFromThis();

    ClientTransportAutoPtr clientTransportPtr =
        sessionStatePtr->implCreateClientTransport();

    ConnectionOrientedClientTransport & coClientTransport =
        static_cast<ConnectionOrientedClientTransport &>(
            *clientTransportPtr);

    coClientTransport.setRcfSession(sessionState.mSessionPtr);

    sessionState.mSocketOpsMutexPtr.reset( new Mutex() );
    coClientTransport.setSocketOpsMutex(sessionState.mSocketOpsMutexPtr);

    return clientTransportPtr;
}