From: Vadim Zeitlin Date: Sat, 2 Apr 2005 22:37:58 +0000 (+0000) Subject: added wxMemoryInputStream(wxMemoryOutputStream&) ctor (patch 1170635) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/96461cc29d03b4a7ab72abaae2e7edace93dd2a5 added wxMemoryInputStream(wxMemoryOutputStream&) ctor (patch 1170635) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@33293 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index 6a6388c212..290f75ec69 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -15,6 +15,7 @@ All: - Added WXK_SPECIAL keycodes for special hardware buttons. - Fixed bug with wxFile::Seek(-1, wxFromCurrent). - Added wxString/C array constructors to wxArrayString. +- Added wxMemoryInputStream(wxMemoryOutputStream&) constructor (Stas Sergeev) All (GUI): diff --git a/docs/latex/wx/strmmem.tex b/docs/latex/wx/strmmem.tex index 49dab77982..c3f3866aea 100644 --- a/docs/latex/wx/strmmem.tex +++ b/docs/latex/wx/strmmem.tex @@ -28,12 +28,24 @@ Initializes a new read-only memory stream which will use the specified buffer {\it data} of length {\it len}. The stream does not take ownership of the buffer, i.e. that it will not delete in its destructor. +\func{}{wxMemoryInputStream}{\param{const wxMemoryOutputStream&}{ stream}} + +Creates a new read-only memory stream, initilalizing it with the +data from the given output stream \arg{stream}. + \membersection{wxMemoryInputStream::\destruct{wxMemoryInputStream}}\label{wxmemoryinputstreamdtor} \func{}{\destruct{wxMemoryInputStream}}{\void} Destructor. +\membersection{wxMemoryInputStream::GetInputStreamBuffer}\label{wxmemoryinputstreamgetistrmbuf} + +\constfunc{wxStreamBuffer *}{GetInputStreamBuffer}{\void} + +Returns the pointer to the stream object used as an internal buffer +for that stream. + % ----------------------------------------------------------------------------- % wxMemoryOutputStream % ----------------------------------------------------------------------------- @@ -87,3 +99,9 @@ the buffer. CopyTo returns the number of bytes copied to the buffer. Generally it is either len or the size of the stream buffer. +\membersection{wxMemoryOutputStream::GetOutputStreamBuffer}\label{wxmemoryoutputstreamgetostrmbuf} + +\constfunc{wxStreamBuffer *}{GetOutputStreamBuffer}{\void} + +Returns the pointer to the stream object used as an internal buffer +for that stream. diff --git a/include/wx/mstream.h b/include/wx/mstream.h index a679e6bb8f..d1b8a6230c 100644 --- a/include/wx/mstream.h +++ b/include/wx/mstream.h @@ -18,10 +18,13 @@ #include "wx/stream.h" +class WXDLLIMPEXP_BASE wxMemoryOutputStream; + class WXDLLIMPEXP_BASE wxMemoryInputStream : public wxInputStream { public: wxMemoryInputStream(const void *data, size_t length); + wxMemoryInputStream(const wxMemoryOutputStream& stream); virtual ~wxMemoryInputStream(); virtual wxFileOffset GetLength() const { return m_length; } virtual bool Eof() const; diff --git a/src/common/mstream.cpp b/src/common/mstream.cpp index 21cc9ee95c..bab2afe326 100644 --- a/src/common/mstream.cpp +++ b/src/common/mstream.cpp @@ -52,6 +52,22 @@ wxMemoryInputStream::wxMemoryInputStream(const void *data, size_t len) m_length = len; } +wxMemoryInputStream::wxMemoryInputStream(const wxMemoryOutputStream& stream) +{ + int len = stream.GetLength(); + if (len == wxInvalidOffset) { + m_i_streambuf = NULL; + m_lasterror = wxSTREAM_EOF; + return; + } + m_i_streambuf = new wxStreamBuffer(wxStreamBuffer::read); + m_i_streambuf->SetBufferIO(len); // create buffer + stream.CopyTo(m_i_streambuf->GetBufferStart(), len); + m_i_streambuf->SetIntPosition(0); // seek to start pos + m_i_streambuf->Fixed(true); + m_length = len; +} + wxMemoryInputStream::~wxMemoryInputStream() { delete m_i_streambuf; diff --git a/tests/streams/memstream.cpp b/tests/streams/memstream.cpp index 7dee2c224e..6b5d2e6103 100644 --- a/tests/streams/memstream.cpp +++ b/tests/streams/memstream.cpp @@ -56,10 +56,12 @@ public: CPPUNIT_TEST(Output_TellO); // Other test specific for Memory stream test case. + CPPUNIT_TEST(Ctor_InFromOut); CPPUNIT_TEST_SUITE_END(); protected: // Add own test here. + void Ctor_InFromOut(); private: const char *GetDataBuffer(); @@ -103,6 +105,21 @@ wxMemoryOutputStream *memStream::DoCreateOutStream() return pMemOutStream; } +void memStream::Ctor_InFromOut() +{ + wxMemoryOutputStream *pMemOutStream = DoCreateOutStream(); + pMemOutStream->Write(GetDataBuffer(), DATABUFFER_SIZE); + wxMemoryInputStream *pMemInStream = new wxMemoryInputStream(*pMemOutStream); + CPPUNIT_ASSERT(pMemInStream->IsOk()); + CPPUNIT_ASSERT(pMemInStream->GetLength() == pMemOutStream->GetLength()); + int len = pMemInStream->GetLength(); + wxStreamBuffer *in = pMemInStream->GetInputStreamBuffer(); + wxStreamBuffer *out = pMemOutStream->GetOutputStreamBuffer(); + void *pIn = in->GetBufferStart(); + void *pOut = out->GetBufferStart(); + CPPUNIT_ASSERT(pIn != pOut); + CPPUNIT_ASSERT(memcmp(pIn, pOut, len) == 0); +} // Register the stream sub suite, by using some stream helper macro. // Note: Don't forget to connect it to the base suite (See: bstream.cpp => StreamCase::suite())