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->getProactor());

        AsioSessionStatePtr sessionStatePtr = sessionState.shared_from_this();

        // TODO: what to do for non-TCP sockets
        return 
            sessionStatePtr.get() 
            && isFdConnected(sessionStatePtr->implGetNative());
    }
    bool AsioServerTransport::reflect(
        const SessionPtr &sessionPtr1, 
        const SessionPtr &sessionPtr2)
    {
        RCF2_TRACE("");

        AsioSessionState & sessionState1 = 
            dynamic_cast<AsioSessionState &>(sessionPtr1->getProactor());

        AsioSessionStatePtr sessionStatePtr1 = sessionState1.shared_from_this();

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

        AsioSessionStatePtr sessionStatePtr2 = sessionState2.shared_from_this();

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

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

        return true;
    }