00001
00002
00003
00004
00005
00006 #ifndef BOOST_RPC_CALL_HPP
00007 #define BOOST_RPC_CALL_HPP
00008
00009 #include <boost/rpc/config.hpp>
00010 #include <boost/detail/arity.hpp>
00011 #include <boost/call_traits.hpp>
00012 #include <boost/rpc/detail/archive_out_param.hpp>
00013 #include <boost/rpc/call_options.hpp>
00014
00015 namespace boost {
00016 namespace rpc {
00017
00019 class acknowledgement
00020 {
00021 public:
00022 virtual ~acknowledgement() {};
00024 boost::future<void> completion()
00025 {
00026 return completion_promise;
00027 }
00029 void complete() {completion_promise.set();}
00030 private:
00031 boost::promise<void> completion_promise;
00032 };
00033
00034 class handler_base : public acknowledgement
00035 {
00036 public:
00038 virtual void result_string(const std::string &str) = 0;
00039 virtual bool has_out_parameters() = 0;
00040
00041 call_options options;
00042 };
00043
00044 typedef boost::shared_ptr<acknowledgement> acknowledgement_ptr;
00045
00047 class call_base
00048 {
00049 public:
00051 virtual const std::string ¶meters() const = 0;
00052 virtual std::auto_ptr<handler_base> spawn_handler() = 0;
00053 virtual ~call_base() {}
00054 };
00055
00056
00057 template<typename ReturnType>
00058 class async_returning_call : public call_base
00059 {
00060 };
00061
00062 template<typename ReturnType>
00063 class returning_handler : public handler_base
00064 {
00065 public:
00066 typedef typename boost::detail::storable<ReturnType>::type storable_return_type;
00067
00069
00071 typename boost::call_traits<storable_return_type>::const_reference
00072 return_value() const {return return_val;}
00073 protected:
00074 template<typename Archive>
00075 void extract_return_val(Archive &archive, const boost::rpc::call_options &options)
00076 {
00077 if (options.marshal_option >= call_options::return_only)
00078 archive & return_val;
00079 }
00080 storable_return_type return_val;
00081 };
00082
00083 template<>
00084 class returning_handler<void> : public handler_base
00085 {
00086 public:
00087 typedef void storable_return_type;
00088
00089 void return_value() const {}
00090 protected:
00091 template<typename Archive>
00092 void extract_return_val(Archive &archive, const boost::rpc::call_options &options)
00093 {}
00094 };
00095
00096 template<typename ReturnType>
00097 class async_returning_handler : public returning_handler<ReturnType>
00098 {
00099 public:
00100 typedef boost::shared_ptr<async_returning_handler<ReturnType> > ptr;
00101
00102 virtual void assign_promises() = 0;
00103 const boost::promise<ReturnType> &return_promise() {return return_prom;}
00104 operator boost::future<ReturnType> () {return return_prom;}
00105 protected:
00106 promise<ReturnType> return_prom;
00107 };
00108
00110 template<typename Signature, typename ArchivePair = binary_archive
00111 #ifndef DOXYGEN_DOCS_ONLY
00112 ,typename Enable=void, typename Enable2=void
00113 #endif
00114 >
00115 class handler
00116 #ifdef DOXYGEN_DOCS_ONLY
00117 #include <boost/rpc/detail/handler_template.hpp>
00118 #endif
00119 ;
00120
00121 #define BOOST_ARITY_SEPARATE_VOID_RETURN
00122 #define BOOST_ARITY_ITERATION_PARAMS \
00123 (3,(0,BOOST_RPC_MAX_ARGS,<boost/rpc/detail/handler_template.hpp>))
00124 #include <boost/detail/arity_iterate.hpp>
00125 #undef BOOST_ARITY_ITERATION_PARAMS
00126 #undef BOOST_ARITY_SEPARATE_VOID_RETURN
00127
00128 template<typename Id, typename Signature, typename ArchivePair = binary_archive
00129 #ifndef DOXYGEN_DOCS_ONLY
00130 ,typename Enable=void
00131 #endif
00132 >
00133 class call
00134 #ifdef DOXYGEN_DOCS_ONLY
00135 #include <boost/rpc/detail/call_template.hpp>
00136 #endif
00137 ;
00138
00139 #define BOOST_ARITY_ITERATION_PARAMS \
00140 (3,(0,BOOST_RPC_MAX_ARGS,<boost/rpc/detail/call_template.hpp>))
00141 #include <boost/detail/arity_iterate.hpp>
00142 #undef BOOST_ARITY_ITERATION_PARAMS
00143
00144 }
00145 }
00146
00147 #endif // BOOST_RPC_CALL_HPP