00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef restcgi_content_h
00023 #define restcgi_content_h
00024 #include "apidefs.h"
00025 #include "hdr.h"
00026 #include <string>
00027 #include <boost/shared_ptr.hpp>
00028 namespace restcgi {
00029 class env;
00030 class endpoint;
00032 class RESTCGI_API content {
00033 public:
00034 typedef restcgi::content_hdr hdr_type;
00035 virtual ~content();
00036 const hdr_type& hdr() const {return hdr_;}
00037 protected:
00038 content(const boost::shared_ptr<endpoint>& ep, const hdr_type& h);
00039 boost::shared_ptr<endpoint> endpoint_;
00040 private:
00041 hdr_type hdr_;
00042 };
00053 class RESTCGI_API icontent : public content {
00054 public:
00055 typedef boost::shared_ptr<icontent> pointer;
00056 typedef boost::shared_ptr<const icontent> const_pointer;
00057 typedef std::istream istream_type;
00058 ~icontent();
00061 istream_type& istream();
00062 private:
00063 icontent(const icontent&);
00064 icontent& operator =(const icontent&);
00065 friend class method;
00066 icontent(const boost::shared_ptr<endpoint>& ep, const hdr_type& h);
00067 };
00069 template<typename T> icontent& operator >>(icontent& ic, T& v) {ic.istream() >> v; return ic;}
00077 class RESTCGI_API ocontent : public content {
00078 public:
00079 ~ocontent();
00080 typedef boost::shared_ptr<ocontent> pointer;
00081 typedef boost::shared_ptr<const ocontent> const_pointer;
00082 typedef std::ostream ostream_type;
00083
00084
00085 ostream_type& ostream();
00086 private:
00087 ocontent(const ocontent&);
00088 ocontent& operator =(const ocontent&);
00089 friend class method;
00090 ocontent(const boost::shared_ptr<endpoint>& ep, const hdr_type& h);
00091 };
00093 template<typename T> ocontent& operator <<(ocontent& oc, const T& v) {oc.ostream() << v; return oc;}
00095 inline ocontent& operator <<(ocontent& oc, std::ostream& (*v)(std::ostream&)) {oc.ostream() << v; return oc;}
00096 }
00097 #endif