blocxx
TempFileStream.hpp
Go to the documentation of this file.
1/*******************************************************************************
2* Copyright (C) 2005, Vintela, Inc. All rights reserved.
3* Copyright (C) 2006, Novell, Inc. All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7*
8* * Redistributions of source code must retain the above copyright notice,
9* this list of conditions and the following disclaimer.
10* * Redistributions in binary form must reproduce the above copyright
11* notice, this list of conditions and the following disclaimer in the
12* documentation and/or other materials provided with the distribution.
13* * Neither the name of
14* Vintela, Inc.,
15* nor Novell, Inc.,
16* nor the names of its contributors or employees may be used to
17* endorse or promote products derived from this software without
18* specific prior written permission.
19*
20* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30* POSSIBILITY OF SUCH DAMAGE.
31*******************************************************************************/
32
33
39#ifndef BLOCXX_TEMPFILESTREAM_HPP_INCLUDE_GUARD_
40#define BLOCXX_TEMPFILESTREAM_HPP_INCLUDE_GUARD_
41#include "blocxx/BLOCXX_config.h"
42#include "blocxx/Types.hpp"
43#include "blocxx/String.hpp"
44#include "blocxx/AutoPtr.hpp"
45#include "blocxx/CommonFwd.hpp"
46#include "blocxx/File.hpp"
47
48#if defined(BLOCXX_HAVE_STREAMBUF)
49#include <streambuf>
50#elif defined(BLOCXX_HAVE_STREAMBUF_H)
51#include <streambuf.h>
52#endif
53
54#if defined(BLOCXX_HAVE_ISTREAM) && defined(BLOCXX_HAVE_OSTREAM)
55#include <istream>
56#include <ostream>
57#else
58#include <iostream>
59#endif
60
70namespace BLOCXX_NAMESPACE
71{
72
73class BLOCXX_COMMON_API TempFileBuffer : public std::streambuf
74{
75public:
77 {
79 E_KEEP_FILE
80 };
81
91 TempFileBuffer(size_t bufSize, EKeepFileFlag keepflg=E_DONT_KEEP_FILE);
104 TempFileBuffer(const String& dir, size_t bufSize, EKeepFileFlag keepflg=E_DONT_KEEP_FILE);
112 std::streamsize getSize();
116 void rewind();
125 void reset();
134 String releaseFileAndReset();
141 bool usingTempFile() const;
142protected:
143 // for input
144 int underflow();
145 // for output
146 std::streamsize xsputn(const char* s, std::streamsize n);
147 virtual int overflow(int c);
148 //virtual int sync();
149 void initBuffers();
150 void initGetBuffer();
151 void initPutBuffer();
152 int buffer_to_device(const char* c, int n);
153 int buffer_from_device(char* c, int n);
154private:
155 size_t m_bufSize;
156 char* m_buffer;
158 std::streamsize m_readPos;
159 std::streamsize m_writePos;
164
165 int buffer_in();
166 int buffer_out();
167 // prohibit copying and assigning
170};
171
172
179class BLOCXX_COMMON_API TempFileStream : public std::iostream
180{
181public:
195 TempFileStream(size_t bufSize = 4096, TempFileBuffer::EKeepFileFlag keepflg=TempFileBuffer::E_DONT_KEEP_FILE);
210 TempFileStream(const String& dir, size_t bufSize = 4096,
211 TempFileBuffer::EKeepFileFlag keepflg=TempFileBuffer::E_DONT_KEEP_FILE);
216 std::streamsize getSize() { return m_buffer->getSize(); }
220 void rewind();
225 void reset();
234 String releaseFileAndReset();
241 bool usingTempFile() const;
242private:
243
244#ifdef BLOCXX_WIN32
245#pragma warning (push)
246#pragma warning (disable: 4251)
247#endif
248
250
251#ifdef BLOCXX_WIN32
252#pragma warning (pop)
253#endif
254
255 // disallow copying and assigning
258};
259
260} // end namespace BLOCXX_NAMESPACE
261
262#endif
The AutoPtr class provides a simple class for smart pointers to single objects (for multiple,...
Definition AutoPtr.hpp:63
The purpose of the File class is to provide an abstraction layer over the platform dependant function...
Definition File.hpp:55
This String class is an abstract data type that represents as NULL terminated string of characters.
Definition String.hpp:67
TempFileBuffer & operator=(const TempFileBuffer &arg)
TempFileBuffer(const TempFileBuffer &arg)
TempFileStream is an iostream that uses an underlying temp file to hold its content to reduce memory ...
TempFileStream & operator=(const TempFileStream &)
TempFileStream(const TempFileStream &)
AutoPtr< TempFileBuffer > m_buffer
Taken from RFC 1321.