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; }
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; }
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; }
void AsioServerTransport::closeSessionState( AsioSessionStateWeakPtr sessionStateWeakPtr) { AsioSessionStatePtr sessionStatePtr(sessionStateWeakPtr.lock()); if (sessionStatePtr) { sessionStatePtr->close(); } }
AsioSessionStatePtr AsioServerTransport::createSessionState() { AsioSessionStatePtr sessionStatePtr( implCreateSessionState() ); SessionPtr sessionPtr( getSessionManager().createSession() ); sessionPtr->setSessionState( *sessionStatePtr ); sessionStatePtr->setSessionPtr(sessionPtr); sessionStatePtr->mWeakThisPtr = sessionStatePtr; registerSession(sessionStatePtr->mWeakThisPtr); return sessionStatePtr; }
void AsioServerTransport::notifyClose( AsioSessionStateWeakPtr sessionStateWeakPtr) { AsioSessionStatePtr sessionStatePtr(sessionStateWeakPtr.lock()); if (sessionStatePtr) { Lock lock(sessionStatePtr->mMutex); sessionStatePtr->mHasBeenClosed = true; } }
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); }
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; }