#if wxUSE_STREAMS
+#include "wx/stream.h"
+
#ifndef WX_PRECOMP
#include "wx/log.h"
#endif
#include <ctype.h>
-#include "wx/stream.h"
#include "wx/datstrm.h"
#include "wx/textfile.h"
size_t wxStreamBuffer::Read(void *buffer, size_t size)
{
+ wxASSERT_MSG( buffer, _T("Warning: Null pointer is about to be used") );
+
+ /* Clear buffer first */
+ memset(buffer, 0x00, size);
+
// lasterror is reset before all new IO calls
if ( m_stream )
m_stream->Reset();
size_t wxStreamBuffer::Write(const void *buffer, size_t size)
{
+ wxASSERT_MSG( buffer, _T("Warning: Null pointer is about to be send") );
+
if (m_stream)
{
// lasterror is reset before all new IO calls
size_t wxStreamBase::GetSize() const
{
wxFileOffset length = GetLength();
- if ( length == wxInvalidOffset )
+ if ( length == (wxFileOffset)wxInvalidOffset )
return 0;
const size_t len = wx_truncate_cast(size_t, length);
size_t wxInputStream::GetWBack(void *buf, size_t size)
{
+ wxASSERT_MSG( buf, _T("Warning: Null pointer is about to be used") );
+
+ /* Clear buffer first */
+ memset(buf, 0x00, size);
+
if (!m_wback)
return 0;
size_t wxInputStream::Ungetch(const void *buf, size_t bufsize)
{
+ wxASSERT_MSG( buf, _T("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 Ungetch(&c, sizeof(c)) != 0;
}
-char wxInputStream::GetC()
+int wxInputStream::GetC()
{
- char c;
+ unsigned char c;
Read(&c, sizeof(c));
- return c;
+ return LastRead() ? c : wxEOF;
}
wxInputStream& wxInputStream::Read(void *buf, size_t size)
{
+ wxASSERT_MSG( buf, _T("Warning: Null pointer is about to be read") );
+
char *p = (char *)buf;
m_lastcount = 0;
wxInputStream& wxInputStream::Read(wxOutputStream& stream_out)
{
+ size_t lastcount = 0;
char buf[BUF_TEMP_SIZE];
for ( ;; )
if ( stream_out.Write(buf, bytes_read).LastWrite() != bytes_read )
break;
+
+ lastcount += bytes_read;
}
+ m_lastcount = lastcount;
+
return *this;
}
// ----------------------------------------------------------------------------
wxFilterInputStream::wxFilterInputStream()
+ : m_parent_i_stream(NULL),
+ m_owns(false)
{
- m_parent_i_stream = NULL;
}
wxFilterInputStream::wxFilterInputStream(wxInputStream& stream)
+ : m_parent_i_stream(&stream),
+ m_owns(false)
+{
+}
+
+wxFilterInputStream::wxFilterInputStream(wxInputStream *stream)
+ : m_parent_i_stream(stream),
+ m_owns(true)
{
- m_parent_i_stream = &stream;
}
wxFilterInputStream::~wxFilterInputStream()
{
+ if (m_owns)
+ delete m_parent_i_stream;
}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
wxFilterOutputStream::wxFilterOutputStream()
+ : m_parent_o_stream(NULL),
+ m_owns(false)
{
- m_parent_o_stream = NULL;
}
wxFilterOutputStream::wxFilterOutputStream(wxOutputStream& stream)
+ : m_parent_o_stream(&stream),
+ m_owns(false)
+{
+}
+
+wxFilterOutputStream::wxFilterOutputStream(wxOutputStream *stream)
+ : m_parent_o_stream(stream),
+ m_owns(true)
+{
+}
+
+bool wxFilterOutputStream::Close()
{
- m_parent_o_stream = &stream;
+ if (m_parent_o_stream && m_owns)
+ return m_parent_o_stream->Close();
+ else
+ return true;
}
wxFilterOutputStream::~wxFilterOutputStream()
{
+ if (m_owns)
+ delete m_parent_o_stream;
+}
+
+// ----------------------------------------------------------------------------
+// wxFilterClassFactoryBase
+// ----------------------------------------------------------------------------
+
+IMPLEMENT_ABSTRACT_CLASS(wxFilterClassFactoryBase, wxObject)
+
+wxString wxFilterClassFactoryBase::PopExtension(const wxString& location) const
+{
+ return location.substr(0, FindExtension(location));
+}
+
+wxString::size_type wxFilterClassFactoryBase::FindExtension(
+ const wxChar *location) const
+{
+ size_t len = wxStrlen(location);
+
+ for (const wxChar *const *p = GetProtocols(wxSTREAM_FILEEXT); *p; p++)
+ {
+ size_t l = wxStrlen(*p);
+
+ if (l <= len && wxStrcmp(*p, location + len - l) == 0)
+ return len - l;
+ }
+
+ return wxString::npos;
+}
+
+bool wxFilterClassFactoryBase::CanHandle(const wxChar *protocol,
+ wxStreamProtocolType type) const
+{
+ if (type == wxSTREAM_FILEEXT)
+ return FindExtension(protocol) != wxString::npos;
+ else
+ for (const wxChar *const *p = GetProtocols(type); *p; p++)
+ if (wxStrcmp(*p, protocol) == 0)
+ return true;
+
+ return false;
+}
+
+// ----------------------------------------------------------------------------
+// wxFilterClassFactory
+// ----------------------------------------------------------------------------
+
+IMPLEMENT_ABSTRACT_CLASS(wxFilterClassFactory, wxFilterClassFactoryBase)
+
+wxFilterClassFactory *wxFilterClassFactory::sm_first = NULL;
+
+void wxFilterClassFactory::Remove()
+{
+ if (m_next != this)
+ {
+ wxFilterClassFactory **pp = &sm_first;
+
+ while (*pp != this)
+ pp = &(*pp)->m_next;
+
+ *pp = m_next;
+
+ m_next = this;
+ }
}
// ----------------------------------------------------------------------------