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