MACE
1.0.0
|
00001 #ifndef _MACE_RPC_SERVER_HPP_ 00002 #define _MACE_RPC_SERVER_HPP_ 00003 #include <mace/cmt/thread.hpp> 00004 #include <mace/stub/ptr.hpp> 00005 00006 namespace mace { namespace rpc { 00007 00017 template<typename InterfaceType, typename ConnectionType> 00018 class server { 00019 public: 00020 typedef boost::shared_ptr<server> ptr; 00021 typedef ConnectionType connection_type; 00022 struct session_creator { 00023 virtual ~session_creator(){} 00024 virtual boost::any init_connection( const typename ConnectionType::ptr& ) = 0; 00025 }; 00026 00027 template<typename SessionType> 00028 server( const boost::function<boost::shared_ptr<SessionType>()>& sg ) 00029 :sc( new session_creator_impl<SessionType>(sg) ){} 00030 00031 template<typename SessionType> 00032 server( const boost::shared_ptr<SessionType>& shared_session ) 00033 :sc( new shared_session_creator<SessionType>(shared_session) ){} 00034 00035 protected: 00036 template<typename SessionType> 00037 struct session_creator_impl : public session_creator { 00038 session_creator_impl( const boost::function<boost::shared_ptr<SessionType>()>& sg ) 00039 :session_generator(sg){ } 00040 00041 virtual boost::any init_connection( const typename ConnectionType::ptr& con ) { 00042 mace::stub::ptr<InterfaceType> session( session_generator() ); 00043 mace::stub::visit( session, typename ConnectionType::template add_interface_visitor<InterfaceType>( *con, session ) ); 00044 return session; 00045 } 00046 boost::function<boost::shared_ptr<SessionType>()> session_generator; 00047 }; 00048 00049 template<typename SessionType> 00050 struct shared_session_creator : public session_creator { 00051 shared_session_creator( const boost::shared_ptr<SessionType>& ss ):shared_session(ss){} 00052 00053 virtual boost::any init_connection( const typename ConnectionType::ptr& con ) { 00054 mace::stub::ptr<InterfaceType> session; 00055 session = shared_session; 00056 mace::stub::visit( session, typename ConnectionType::template add_interface_visitor<InterfaceType>( *con, session ) ); 00057 return session; 00058 } 00059 boost::shared_ptr<SessionType> shared_session; 00060 }; 00061 boost::scoped_ptr<session_creator> sc; 00062 }; 00063 00064 } } // mace::rpc 00065 00066 #endif // _MACE_RPC_JSON_TCP_SERVER_HPP_