+size_t wxInputStream::GetWBack(void *buf, size_t size)
+{
+ wxASSERT_MSG( buf, wxT("Warning: Null pointer is about to be used") );
+
+ /* Clear buffer first */
+ memset(buf, 0x00, size);
+
+ if (!m_wback)
+ return 0;
+
+ // how many bytes do we have in the buffer?
+ size_t toget = m_wbacksize - m_wbackcur;
+
+ if ( size < toget )
+ {
+ // we won't read everything
+ toget = size;
+ }
+
+ // copy the data from the cache
+ memcpy(buf, m_wback + m_wbackcur, toget);
+
+ m_wbackcur += toget;
+ if ( m_wbackcur == m_wbacksize )
+ {
+ // TODO: should we really free it here all the time? maybe keep it?
+ free(m_wback);
+ m_wback = NULL;
+ m_wbacksize = 0;
+ m_wbackcur = 0;
+ }
+
+ // return the number of bytes copied
+ return toget;
+}
+
+size_t wxInputStream::Ungetch(const void *buf, size_t bufsize)
+{
+ wxASSERT_MSG( buf, wxT("Warning: Null pointer is about to be used in Ungetch()") );
+
+ if ( m_lasterror != wxSTREAM_NO_ERROR && m_lasterror != wxSTREAM_EOF )
+ {
+ // can't operate on this stream until the error is cleared
+ return 0;
+ }
+
+ char *ptrback = AllocSpaceWBack(bufsize);
+ if (!ptrback)
+ return 0;
+
+ // Eof() shouldn't return true any longer
+ if ( m_lasterror == wxSTREAM_EOF )
+ m_lasterror = wxSTREAM_NO_ERROR;
+
+ memcpy(ptrback, buf, bufsize);
+ return bufsize;
+}
+
+bool wxInputStream::Ungetch(char c)
+{
+ return Ungetch(&c, sizeof(c)) != 0;
+}
+
+int wxInputStream::GetC()
+{
+ unsigned char c;
+ Read(&c, sizeof(c));
+ return LastRead() ? c : wxEOF;
+}
+
+wxInputStream& wxInputStream::Read(void *buf, size_t size)
+{
+ wxASSERT_MSG( buf, wxT("Warning: Null pointer is about to be read") );
+
+ char *p = (char *)buf;
+ m_lastcount = 0;
+
+ size_t read = GetWBack(buf, size);
+ for ( ;; )
+ {
+ size -= read;
+ m_lastcount += read;
+ p += read;
+
+ if ( !size )
+ {
+ // we read the requested amount of data
+ break;
+ }
+
+ if ( p != buf && !CanRead() )
+ {
+ // we have already read something and we would block in OnSysRead()
+ // now: don't do it but return immediately
+ break;
+ }
+
+ read = OnSysRead(p, size);
+ if ( !read )
+ {
+ // no more data available
+ break;
+ }
+ }
+
+ return *this;
+}
+
+char wxInputStream::Peek()