+IMPLEMENT_ABSTRACT_CLASS(wxMemoryInputStream, wxInputStream)
+
+wxMemoryInputStream::wxMemoryInputStream(const void *data, size_t len)
+{
+ m_i_streambuf = new wxStreamBuffer(wxStreamBuffer::read);
+ m_i_streambuf->SetBufferIO((void *)data, len); // const_cast
+ m_i_streambuf->SetIntPosition(0); // seek to start pos
+ m_i_streambuf->Fixed(true);
+
+ m_length = len;
+}
+
+wxMemoryInputStream::wxMemoryInputStream(const wxMemoryOutputStream& stream)
+{
+ const wxFileOffset lenFile = stream.GetLength();
+ if ( lenFile == wxInvalidOffset )
+ {
+ m_i_streambuf = NULL;
+ m_lasterror = wxSTREAM_EOF;
+ return;
+ }
+
+ const size_t len = wx_truncate_cast(size_t, lenFile);
+ wxASSERT_MSG( len == lenFile + size_t(0), wxT("huge files not supported") );
+
+ 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;
+}
+
+void
+wxMemoryInputStream::InitFromStream(wxInputStream& stream, wxFileOffset lenFile)
+{
+ if ( lenFile == wxInvalidOffset )
+ lenFile = stream.GetLength();
+
+ if ( lenFile == wxInvalidOffset )
+ {
+ m_i_streambuf = NULL;
+ m_lasterror = wxSTREAM_EOF;
+ return;
+ }
+
+ const size_t len = wx_truncate_cast(size_t, lenFile);
+ wxASSERT_MSG( (wxFileOffset)len == lenFile, wxT("huge files not supported") );
+
+ m_i_streambuf = new wxStreamBuffer(wxStreamBuffer::read);
+ m_i_streambuf->SetBufferIO(len); // create buffer
+ stream.Read(m_i_streambuf->GetBufferStart(), len);
+ m_i_streambuf->SetIntPosition(0); // seek to start pos
+ m_i_streambuf->Fixed(true);
+ m_length = stream.LastRead();
+}
+
+bool wxMemoryInputStream::CanRead() const