19 #ifndef INCLUDE_RCF_RCFSESSION_HPP
20 #define INCLUDE_RCF_RCFSESSION_HPP
24 #include <boost/any.hpp>
25 #include <boost/enable_shared_from_this.hpp>
26 #include <boost/function.hpp>
27 #include <boost/shared_ptr.hpp>
29 #include <RCF/Filter.hpp>
30 #include <RCF/Export.hpp>
31 #include <RCF/MethodInvocation.hpp>
32 #include <RCF/SerializationProtocol.hpp>
33 #include <RCF/ServerTransport.hpp>
34 #include <RCF/StubEntry.hpp>
36 #if RCF_FEATURE_FILETRANSFER==1
37 #include <RCF/FileDownload.hpp>
38 #include <RCF/FileUpload.hpp>
47 typedef boost::shared_ptr<Filter> FilterPtr;
51 typedef boost::shared_ptr<RcfSession> RcfSessionPtr;
52 typedef boost::weak_ptr<RcfSession> RcfSessionWeakPtr;
58 class UdpServerTransport;
59 class UdpNetworkSession;
61 class FileTransferService;
63 class FileDownloadInfo;
67 typedef boost::shared_ptr<FileUploadInfo> FileUploadInfoPtr;
68 typedef boost::shared_ptr<FileDownloadInfo> FileDownloadInfoPtr;
70 typedef std::pair<boost::uint32_t, RcfSessionWeakPtr> PingBackTimerEntry;
73 typedef boost::shared_ptr<Certificate> CertificatePtr;
75 class AsioNetworkSession;
94 class AllocateServerParameters;
113 class ServerParameters;
115 class PingBackService;
117 struct TypeInfoCompare
120 const std::type_info* lhs,
121 const std::type_info* rhs)
const
123 if (lhs->before(*rhs))
131 class RCF_EXPORT RcfSession :
132 public boost::enable_shared_from_this<RcfSession>
135 RcfSession(RcfServer &server);
138 typedef boost::function1<void, RcfSession&> OnWriteCompletedCallback;
139 typedef boost::function1<void, RcfSession&> OnWriteInitiatedCallback;
140 typedef boost::function1<void, RcfSession&> OnDestroyCallback;
142 typedef std::map<const std::type_info *, boost::any, TypeInfoCompare> SessionObjectMap;
143 SessionObjectMap mSessionObjects;
148 T * getSessionObjectImpl(
bool createIfDoesntExist)
150 typedef boost::shared_ptr<T> TPtr;
152 const std::type_info & whichType =
typeid(T);
153 const std::type_info * pWhichType = &whichType;
155 SessionObjectMap::iterator iter = mSessionObjects.find(pWhichType);
156 if (iter != mSessionObjects.end())
158 boost::any & a = iter->second;
159 TPtr * ptPtr = boost::any_cast<TPtr>(&a);
160 RCF_ASSERT(ptPtr && *ptPtr);
163 else if (createIfDoesntExist)
165 TPtr tPtr(
new T() );
166 mSessionObjects[pWhichType] = tPtr;
178 void deleteSessionObject()
180 typedef boost::shared_ptr<T> TPtr;
182 const std::type_info & whichType =
typeid(T);
183 const std::type_info * pWhichType = &whichType;
185 SessionObjectMap::iterator iter = mSessionObjects.find(pWhichType);
186 if (iter != mSessionObjects.end())
188 mSessionObjects.erase(iter);
193 T & createSessionObject()
195 deleteSessionObject<T>();
196 T * pt = getSessionObjectImpl<T>(
true);
200 RCF_THROW(Exception(_RcfError_SessionObjectNotCreated(
typeid(T).name())));
206 T & getSessionObject(
bool createIfDoesntExist =
false)
208 T * pt = getSessionObjectImpl<T>(createIfDoesntExist);
211 RCF_THROW( Exception(_RcfError_SessionObjectDoesNotExist(
typeid(T).name())));
217 T * querySessionObject()
219 T * pt = getSessionObjectImpl<T>(
false);
229 void addOnWriteCompletedCallback(
230 const OnWriteCompletedCallback & onWriteCompletedCallback);
232 void extractOnWriteCompletedCallbacks(
233 std::vector<OnWriteCompletedCallback> & onWriteCompletedCallbacks);
235 void setOnDestroyCallback(
236 OnDestroyCallback onDestroyCallback);
240 const RemoteAddress &
243 RcfServer & getRcfServer();
247 bool hasDefaultServerStub();
248 StubEntryPtr getDefaultStubEntryPtr();
249 void setDefaultStubEntryPtr(StubEntryPtr stubEntryPtr);
250 void setCachedStubEntryPtr(StubEntryPtr stubEntryPtr);
252 void setEnableSfPointerTracking(
bool enable);
253 bool getEnableSfPointerTracking()
const;
255 boost::uint32_t getRuntimeVersion();
256 void setRuntimeVersion(boost::uint32_t version);
258 boost::uint32_t getArchiveVersion();
259 void setArchiveVersion(boost::uint32_t version);
261 bool getNativeWstringSerialization();
262 void setNativeWstringSerialization(
bool enable);
264 void setUserData(
const boost::any & userData);
265 boost::any & getUserData();
267 void getMessageFilters(std::vector<FilterPtr> &filters);
268 void getTransportFilters(std::vector<FilterPtr> &filters);
270 void lockTransportFilters();
271 void unlockTransportFilters();
272 bool transportFiltersLocked();
274 SerializationProtocolIn & getSpIn();
275 SerializationProtocolOut & getSpOut();
278 void setFiltered(
bool filtered);
280 std::vector<FilterPtr> & getFilters();
282 void setCloseSessionAfterWrite(
bool close);
284 boost::uint32_t getPingBackIntervalMs();
286 boost::uint32_t getPingTimestamp();
287 void setPingTimestamp();
289 boost::uint32_t getPingIntervalMs();
290 void setPingIntervalMs(boost::uint32_t pingIntervalMs);
292 boost::uint32_t getTouchTimestamp();
299 void setWeakThisPtr();
301 void setRequestUserData(
const std::string & userData);
302 std::string getRequestUserData();
304 void setResponseUserData(
const std::string & userData);
305 std::string getResponseUserData();
309 void cancelDownload();
311 #if RCF_FEATURE_FILETRANSFER==1
313 void addDownloadStream(
314 boost::uint32_t sessionLocalId,
315 FileStream fileStream);
319 Mutex mStopCallInProgressMutex;
320 bool mStopCallInProgress;
341 friend class AllocateServerParameters;
360 friend class ServerParameters;
362 friend class PingBackService;
363 friend class FilterService;
365 friend class StubAccess;
367 RcfServer & mRcfServer;
370 std::vector<OnWriteCompletedCallback> mOnWriteCompletedCallbacks;
371 std::vector<OnWriteInitiatedCallback> mOnWriteInitiatedCallbacks;
372 OnDestroyCallback mOnDestroyCallback;
374 boost::uint32_t mRuntimeVersion;
375 boost::uint32_t mArchiveVersion;
377 bool mUseNativeWstringSerialization;
378 bool mEnableSfPointerTracking;
380 bool mTransportFiltersLocked;
382 SerializationProtocolIn mIn;
383 SerializationProtocolOut mOut;
386 std::vector<FilterPtr> mFilters;
389 MethodInvocationRequest mRequest;
391 bool mCloseSessionAfterWrite;
392 boost::uint32_t mPingTimestamp;
393 boost::uint32_t mPingIntervalMs;
394 boost::uint32_t mTouchTimestamp;
395 ByteBuffer mPingBackByteBuffer;
396 PingBackTimerEntry mPingBackTimerEntry;
399 bool mWritingPingBack;
400 std::vector<ByteBuffer> mQueuedSendBuffers;
402 void clearParameters();
404 void onReadCompleted();
405 void onWriteCompleted();
407 void processJsonRpcRequest();
409 void processRequest();
410 void processOobMessages();
411 void invokeServant();
414 void sendResponseException(
const std::exception &e);
415 void sendResponseUncaughtException();
417 void encodeRemoteException(
418 SerializationProtocolOut & out,
419 const RemoteException & e);
421 void sendSessionResponse();
423 void registerForPingBacks();
424 void unregisterForPingBacks();
426 void verifyTransportProtocol(RCF::TransportProtocol protocol);
428 friend class RcfServer;
429 friend class RemoteCallContextImpl;
431 I_Parameters * mpParameters;
432 std::vector<char> mParametersVec;
435 std::vector< std::vector<char> > mParmsVec;
439 RcfSessionWeakPtr mWeakThisPtr;
445 friend class UdpServerTransport;
446 friend class UdpNetworkSession;
447 friend class FileStreamImpl;
449 #if RCF_FEATURE_FILETRANSFER==1
453 friend class FileTransferService;
455 FileDownloadInfoPtr mDownloadInfoPtr;
456 FileUploadInfoPtr mUploadInfoPtr;
458 typedef std::map<boost::uint32_t, FileUploadInfoPtr> SessionUploads;
459 typedef std::map<boost::uint32_t, FileDownload> SessionDownloads;
461 SessionUploads mSessionUploads;
462 SessionDownloads mSessionDownloads;
468 boost::any mUserData;
469 StubEntryPtr mDefaultStubEntryPtr;
470 StubEntryPtr mCachedStubEntryPtr;
473 NetworkSession & getNetworkSession()
const;
474 void setNetworkSession(NetworkSession & networkSession);
477 friend class HttpSessionFilter;
478 NetworkSession * mpNetworkSession;
481 std::string mCurrentCallDesc;
485 tstring getClientUsername();
486 TransportProtocol getTransportProtocol();
487 TransportType getTransportType();
489 bool getEnableCompression();
491 CertificatePtr getClientCertificatePtr();
493 bool getIsCallbackSession()
const;
494 void setIsCallbackSession(
bool isCallbackSession);
496 RemoteCallRequest getRemoteCallRequest()
const;
498 time_t getConnectedAtTime()
const;
500 std::size_t getConnectionDuration()
const;
502 std::size_t getRemoteCallCount()
const;
503 boost::uint64_t getTotalBytesReceived()
const;
504 boost::uint64_t getTotalBytesSent()
const;
506 bool isConnected()
const;
510 void setConnectedAtTime(time_t connectedAtTime);
512 friend class SspiServerFilter;
513 friend class Win32NamedPipeNetworkSession;
515 tstring mClientUsername;
516 TransportProtocol mTransportProtocol;
517 bool mEnableCompression;
519 bool mTransportProtocolVerified;
520 bool mIsCallbackSession;
522 time_t mConnectedAtTime;
524 std::size_t mRemoteCallCount;
529 #endif // ! INCLUDE_RCF_RCFSESSION_HPP