00001 #ifndef _BOOST_RPC_JSON_SERVER_HPP_
00002 #define _BOOST_RPC_JSON_SERVER_HPP_
00003 #include <boost/reflect/any_ptr.hpp>
00004 #include <boost/rpc/json/connection.hpp>
00005 #include <boost/exception/all.hpp>
00006
00007 namespace boost { namespace rpc { namespace json {
00008
00012 template<typename InterfaceType>
00013 class server {
00014 public:
00015 typedef boost::shared_ptr<server> ptr;
00016 typedef boost::reflect::any_ptr<InterfaceType> interface_type;
00017
00018 template<typename T>
00019 server( T v, const json::connection::ptr& c )
00020 :m_interface(v),m_con(c) {
00021 boost::reflect::visit( m_interface, visitor( *this ) );
00022 m_con->start();
00023 }
00024
00025 private:
00026 struct visitor {
00027 visitor( server& s ):m_self(s){}
00028
00029 template<typename Member, typename VTable>
00030 void operator()( Member VTable::* m, const char* name )const {
00031 m_self.m_con->add_method_handler( name,
00032 detail::rpc_recv_functor<typename Member::fused_params,
00033 Member&, Member::is_signal>((*m_self.m_interface).*m,*m_self.m_con,name) );
00034 }
00035 server& m_self;
00036 };
00037
00038 connection::ptr m_con;
00039 interface_type m_interface;
00040 };
00041
00042 } } }
00043
00044 #endif