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