TempFileStream.hpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002 * Copyright (C) 2004 Vintela, Inc. All rights reserved.
00003 * Copyright (C) 2005 Novell, Inc. All rights reserved.
00004 *
00005 * Redistribution and use in source and binary forms, with or without
00006 * modification, are permitted provided that the following conditions are met:
00007 *
00008 *  - Redistributions of source code must retain the above copyright notice,
00009 *    this list of conditions and the following disclaimer.
00010 *
00011 *  - Redistributions in binary form must reproduce the above copyright notice,
00012 *    this list of conditions and the following disclaimer in the documentation
00013 *    and/or other materials provided with the distribution.
00014 *
00015 *  - Neither the name of Vintela, Inc., Novell, Inc., nor the names of its
00016 *    contributors may be used to endorse or promote products derived from this
00017 *    software without specific prior written permission.
00018 *
00019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
00020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00021 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00022 * ARE DISCLAIMED. IN NO EVENT SHALL Vintela, Inc., Novell, Inc., OR THE 
00023 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
00024 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
00025 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
00026 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
00027 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
00028 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
00029 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00030 *******************************************************************************/
00031 
00032 
00047 #ifndef BLOCXX_TEMPFILESTREAM_HPP_INCLUDE_GUARD_
00048 #define BLOCXX_TEMPFILESTREAM_HPP_INCLUDE_GUARD_
00049 #include "blocxx/BLOCXX_config.h"
00050 #include "blocxx/Types.hpp"
00051 #include "blocxx/String.hpp"
00052 #include "blocxx/AutoPtr.hpp"
00053 #include "blocxx/CommonFwd.hpp"
00054 
00055 #if defined(BLOCXX_HAVE_STREAMBUF)
00056 #include <streambuf>
00057 #elif defined(BLOCXX_HAVE_STREAMBUF_H)
00058 #include <streambuf.h>
00059 #endif
00060 
00061 #if defined(BLOCXX_HAVE_ISTREAM) && defined(BLOCXX_HAVE_OSTREAM)
00062 #include <istream>
00063 #include <ostream>
00064 #else
00065 #include <iostream>
00066 #endif
00067 
00068 namespace BLOCXX_NAMESPACE
00069 {
00070 
00071 class BLOCXX_COMMON_API TempFileBuffer : public std::streambuf
00072 {
00073 public:
00074    TempFileBuffer(size_t bufSize);
00075    TempFileBuffer(String const& filename, size_t bufSize);
00076    ~TempFileBuffer();
00077    std::streamsize getSize();
00078    void rewind();
00079    void reset();
00080    String releaseFile();
00081    bool usingTempFile() const;
00082 protected:
00083    // for input
00084    int underflow();
00085    // for output
00086    std::streamsize xsputn(const char* s, std::streamsize n);
00087    virtual int overflow(int c);
00088    //virtual int sync();
00089    void initBuffers();
00090    void initGetBuffer();
00091    void initPutBuffer();
00092    int buffer_to_device(const char* c, int n);
00093    int buffer_from_device(char* c, int n);
00094 private:
00095    size_t m_bufSize;
00096    char* m_buffer;
00097    TmpFile* m_tempFile;
00098    std::streamsize m_readPos;
00099    std::streamsize m_writePos;
00100    bool m_isEOF;
00101    int buffer_in();
00102    int buffer_out();
00103    // prohibit copying and assigning
00104    TempFileBuffer(const TempFileBuffer& arg);
00105    TempFileBuffer& operator=(const TempFileBuffer& arg);
00106 };
00107 class BLOCXX_COMMON_API TempFileStream : public std::iostream
00108 {
00109 public:
00110    TempFileStream(size_t bufSize = 4096);
00111    TempFileStream(String const& filename, size_t bufSize = 4096);
00112    std::streamsize getSize() { return m_buffer->getSize(); }
00113    void rewind();
00114    void reset();
00115    String releaseFile();
00116    bool usingTempFile() const;
00117 private:
00118 
00119 #ifdef BLOCXX_WIN32
00120 #pragma warning (push)
00121 #pragma warning (disable: 4251)
00122 #endif
00123 
00124    AutoPtr<TempFileBuffer> m_buffer;
00125 
00126 #ifdef BLOCXX_WIN32
00127 #pragma warning (pop)
00128 #endif
00129 
00130    // disallow copying and assigning
00131    TempFileStream(const TempFileStream&);
00132    TempFileStream& operator=(const TempFileStream&);
00133 };
00134 
00135 } // end namespace BLOCXX_NAMESPACE
00136 
00137 #endif
00138 

Generated on Fri Jun 16 15:39:09 2006 for blocxx by  doxygen 1.4.6