MACE  1.0.0
 All Classes Namespaces Files Functions Variables Enumerations Defines
libs/rpc/include/mace/rpc/json/tcp_server.hpp
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_