00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00036 #ifndef OW_HTTPCHUNKEDOSTREAM_HPP_INCLUDE_GUARD_
00037 #define OW_HTTPCHUNKEDOSTREAM_HPP_INCLUDE_GUARD_
00038 #include "OW_config.h"
00039 #include "OW_BaseStreamBuffer.hpp"
00040 #include "OW_Array.hpp"
00041 #include "OW_AutoPtr.hpp"
00042 #include "OW_String.hpp"
00043 #ifdef OW_HAVE_OSTREAM
00044 #include <ostream>
00045 #elif defined(OW_HAVE_OSTREAM_H)
00046 #include <ostream.h>
00047 #else
00048 #include <iostream>
00049 #endif
00050 
00051 namespace OW_NAMESPACE
00052 {
00053 
00054 class OW_HTTP_API HTTPChunkedOStreamBuffer : public BaseStreamBuffer
00055 {
00056 public: 
00057    HTTPChunkedOStreamBuffer(std::ostream& ostr);
00058    virtual ~HTTPChunkedOStreamBuffer();
00059 
00060 protected:
00061    virtual int sync();
00062 private:
00063    std::ostream& m_ostr;
00064    virtual int buffer_to_device(const char* c, int n);
00065    
00066    HTTPChunkedOStreamBuffer(const HTTPChunkedOStreamBuffer&);
00067    HTTPChunkedOStreamBuffer& operator=(const HTTPChunkedOStreamBuffer&);
00068 
00069    friend class HTTPChunkedOStream; 
00070 };
00072 class OW_HTTP_API HTTPChunkedOStreamBase 
00073 {
00074 public:
00075    HTTPChunkedOStreamBase(std::ostream& ostr)
00076       : m_strbuf(ostr) {}
00077    HTTPChunkedOStreamBuffer m_strbuf;
00078 };
00080 class OW_HTTP_API HTTPChunkedOStream : private HTTPChunkedOStreamBase, 
00081    public std::ostream
00082 {
00083 public:
00090    HTTPChunkedOStream(std::ostream& ostr);
00091    
00092    ~HTTPChunkedOStream();
00093 
00094    enum ESendLastChunkFlag
00095    {
00096       E_DISCARD_LAST_CHUNK,
00097       E_SEND_LAST_CHUNK
00098    };
00104    void termOutput(ESendLastChunkFlag sendLastChunk = E_SEND_LAST_CHUNK);
00108    std::ostream& getOutputStreamOrig() { return m_ostr; };
00114    void addTrailer(const String& key, const String& value);
00115 private:
00116    std::ostream& m_ostr;
00117 
00118 #ifdef OW_WIN32
00119 #pragma warning (push)
00120 #pragma warning (disable: 4251)
00121 #endif
00122 
00123    Array<String> m_trailers;
00124 
00125 #ifdef OW_WIN32
00126 #pragma warning (pop)
00127 #endif
00128 
00129    
00130    HTTPChunkedOStream(const HTTPChunkedOStream&);
00131    HTTPChunkedOStream& operator=(const HTTPChunkedOStream&);
00132 };
00133 
00134 } 
00135 
00136 #endif