ClientTransportAutoPtr AsioServerTransport::createClientTransport(
        SessionPtr sessionPtr)
    {
        RCF2_TRACE("");

        AsioSessionState & sessionState = 
            dynamic_cast<AsioSessionState &>(sessionPtr->getProactor());

        AsioSessionStatePtr sessionStatePtr = sessionState.shared_from_this();

        sessionStatePtr->mDemuxerPtr = mDemuxerPtr;

        ClientTransportAutoPtr clientTransportPtr =
            sessionStatePtr->implCreateClientTransport();

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

        coClientTransport.setNotifyCloseFunctor( boost::bind(
            &AsioServerTransport::notifyClose,
            this,
            AsioSessionStateWeakPtr(sessionStatePtr)));

        coClientTransport.setCloseFunctor( 
            sessionStatePtr->implGetCloseFunctor() );

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

    AsioSessionStatePtr sessionStatePtr = sessionState.sharedFromThis();

    return sessionStatePtr.get() && sessionStatePtr->implIsConnected();
}
    bool AsioServerTransport::isConnected(const SessionPtr &sessionPtr)
    {
        AsioSessionState & sessionState = 
            dynamic_cast<AsioSessionState &>(sessionPtr->getProactor());

        AsioSessionStatePtr sessionStatePtr = sessionState.shared_from_this();

        // TODO: what to do for non-TCP sockets
        return 
            sessionStatePtr.get() 
            && isFdConnected(sessionStatePtr->implGetNative());
    }
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;
}