C:/Development/boost_sandbox/rpc/boost/rpc/call.hpp

00001 // Copyright Stjepan Rajko 2007. Use, modification and
00002 // distribution is subject to the Boost Software License, Version
00003 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
00004 // http://www.boost.org/LICENSE_1_0.txt)
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 &parameters() 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 // DOXYGEN_DOCS_ONLY
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 // DOXYGEN_DOCS_ONLY
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 } // namespace rpc
00145 } // namespace boost
00146 
00147 #endif // BOOST_RPC_CALL_HPP

Generated on Sun May 20 15:47:56 2007 by  doxygen 1.5.2