コード例 #1
0
SessionPtr AsioServerTransport::createServerSession(
    ClientTransportAutoPtr & clientTransportAutoPtr,
    StubEntryPtr stubEntryPtr,
    bool keepClientConnection)
{
    AsioSessionStatePtr sessionStatePtr(createSessionState());
    SessionPtr sessionPtr(sessionStatePtr->getSessionPtr());
    sessionPtr->setIsCallbackSession(true);

    sessionStatePtr->implTransferNativeFrom(*clientTransportAutoPtr);

    if (stubEntryPtr)
    {
        sessionPtr->setDefaultStubEntryPtr(stubEntryPtr);
    }

    clientTransportAutoPtr.reset();
    if (keepClientConnection)
    {
        clientTransportAutoPtr.reset( createClientTransport(sessionPtr).release() );
    }

    sessionStatePtr->mState = AsioSessionState::WritingData;
    sessionStatePtr->onAppReadWriteCompleted(0);
    return sessionPtr;
}
コード例 #2
0
    Win32NamedPipeServerTransport::SessionStatePtr 
    Win32NamedPipeServerTransport::createSessionState()
    {
        const std::size_t       MaxPipeInstances    = PIPE_UNLIMITED_INSTANCES;
        const DWORD             OutBufferSize       = 4096;
        const DWORD             InBufferSize        = 4096;
        const DWORD             DefaultTimeoutMs    = 0;

        HANDLE hPipe = CreateNamedPipe( 
            mPipeName.c_str(),
            PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
            PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
            MaxPipeInstances,
            OutBufferSize,
            InBufferSize,
            DefaultTimeoutMs,
            mpSec);

        DWORD dwErr = GetLastError();

        RCF_VERIFY(hPipe != INVALID_HANDLE_VALUE, Exception(_RcfError_Pipe(), dwErr));

        mpIocp->AssociateDevice(hPipe, 0);
        
        SessionStatePtr sessionStatePtr(new SessionState(*this, hPipe));

        sessionStatePtr->mWeakThisPtr = sessionStatePtr;

        return sessionStatePtr;
    }
コード例 #3
0
AsioSessionState::~AsioSessionState()
{
    RCF_DTOR_BEGIN

    // TODO: invoke accept if appropriate
    // TODO: need a proper acceptex strategy in the first place
    //RCF_ASSERT(mState != Accepting);

    mTransport.unregisterSession(mWeakThisPtr);

    RCF_LOG_4()(mState)(mSessionPtr.get())(mSessionPtr->mDisableIo)
            << "AsioSessionState - destructor.";

    // close reflecting session if appropriate
    if (mReflecting)
    {
        AsioSessionStatePtr sessionStatePtr(mReflecteeWeakPtr.lock());
        if (sessionStatePtr)
        {
            sessionStatePtr->close();
        }
    }

    RCF_DTOR_END;
}
コード例 #4
0
void AsioServerTransport::closeSessionState(
    AsioSessionStateWeakPtr sessionStateWeakPtr)
{
    AsioSessionStatePtr sessionStatePtr(sessionStateWeakPtr.lock());
    if (sessionStatePtr)
    {
        sessionStatePtr->close();
    }
}
コード例 #5
0
AsioSessionStatePtr AsioServerTransport::createSessionState()
{
    AsioSessionStatePtr sessionStatePtr( implCreateSessionState() );
    SessionPtr sessionPtr( getSessionManager().createSession() );
    sessionPtr->setSessionState( *sessionStatePtr );
    sessionStatePtr->setSessionPtr(sessionPtr);
    sessionStatePtr->mWeakThisPtr = sessionStatePtr;
    registerSession(sessionStatePtr->mWeakThisPtr);
    return sessionStatePtr;
}
コード例 #6
0
 void AsioServerTransport::notifyClose(
     AsioSessionStateWeakPtr sessionStateWeakPtr)
 {
     AsioSessionStatePtr sessionStatePtr(sessionStateWeakPtr.lock());
     if (sessionStatePtr)
     {
         Lock lock(sessionStatePtr->mMutex);
         sessionStatePtr->mHasBeenClosed = true;
     }
 }
コード例 #7
0
    IocpSessionStatePtr Win32NamedPipeServerTransport::implCreateServerSession(
        I_ClientTransport & clientTransport)
    {
        Win32NamedPipeClientTransport & w32PipeClientTransport =
            dynamic_cast<Win32NamedPipeClientTransport &>(clientTransport);

        HANDLE hPipe = w32PipeClientTransport.releaseHandle();
        RCF_ASSERT(hPipe);

        SessionStatePtr sessionStatePtr( new Win32NamedPipeSessionState(*this, hPipe));

        mpIocp->AssociateDevice(hPipe, 0);

        sessionStatePtr->mEnableReconnect = false;

        sessionStatePtr->mWeakThisPtr = sessionStatePtr;

        sessionStatePtr->mRemotePipeName = w32PipeClientTransport.getPipeName();

        return IocpSessionStatePtr(sessionStatePtr);
    }
コード例 #8
0
    SessionPtr AsioServerTransport::createServerSession(
        ClientTransportAutoPtr clientTransportAutoPtr,
        StubEntryPtr stubEntryPtr)
    {
        RCF2_TRACE("");

        AsioSessionStatePtr sessionStatePtr(createSessionState());
        SessionPtr sessionPtr(sessionStatePtr->getSessionPtr());
        sessionStatePtr->implTransferNativeFrom(*clientTransportAutoPtr);

        if (stubEntryPtr)
        {
            RcfSessionPtr rcfSessionPtr = 
                boost::static_pointer_cast<RcfSession>( 
                sessionStatePtr->mSessionPtr );

            rcfSessionPtr->setDefaultStubEntryPtr(stubEntryPtr);
        }

        sessionStatePtr->mState = AsioSessionState::WritingData;
        sessionStatePtr->onReadWrite(0, boost::system::error_code());
        return sessionPtr;
    }