: m_buffer_start;
}
+void wxStreamBuffer::Truncate()
+{
+ size_t new_size = m_buffer_pos - m_buffer_start;
+ if ( new_size == m_buffer_size )
+ return;
+
+ if ( !new_size )
+ {
+ FreeBuffer();
+ InitBuffer();
+ return;
+ }
+
+ char *new_start = (char *)realloc(m_buffer_start, new_size);
+ wxCHECK_RET( new_size, _T("shrinking buffer shouldn't fail") );
+
+ m_buffer_start = new_start;
+ m_buffer_size = new_size;
+ m_buffer_end = m_buffer_start + m_buffer_size;
+ m_buffer_pos = m_buffer_end;
+}
+
// fill the buffer with as much data as possible (only for read buffers)
bool wxStreamBuffer::FillBuffer()
{
// wxStreamBase
// ----------------------------------------------------------------------------
+IMPLEMENT_ABSTRACT_CLASS(wxStreamBase, wxObject)
+
wxStreamBase::wxStreamBase()
{
m_lasterror = wxSTREAM_NO_ERROR;
// wxInputStream
// ----------------------------------------------------------------------------
+IMPLEMENT_ABSTRACT_CLASS(wxInputStream, wxStreamBase)
+
wxInputStream::wxInputStream()
{
m_wback = NULL;
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)
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;
}
// wxOutputStream
// ----------------------------------------------------------------------------
+IMPLEMENT_ABSTRACT_CLASS(wxOutputStream, wxStreamBase)
+
wxOutputStream::wxOutputStream()
{
}
// wxCountingOutputStream
// ----------------------------------------------------------------------------
+IMPLEMENT_DYNAMIC_CLASS(wxCountingOutputStream, wxOutputStream)
+
wxCountingOutputStream::wxCountingOutputStream ()
{
m_currentPos = 0;
// wxFilterInputStream
// ----------------------------------------------------------------------------
+IMPLEMENT_ABSTRACT_CLASS(wxFilterInputStream, wxInputStream)
+
wxFilterInputStream::wxFilterInputStream()
: m_parent_i_stream(NULL),
m_owns(false)
// wxFilterOutputStream
// ----------------------------------------------------------------------------
+IMPLEMENT_ABSTRACT_CLASS(wxFilterOutputStream, wxOutputStream)
+
wxFilterOutputStream::wxFilterOutputStream()
: m_parent_o_stream(NULL),
m_owns(false)
}
// ----------------------------------------------------------------------------
-// wxFilterClassFactory
+// wxFilterClassFactoryBase
// ----------------------------------------------------------------------------
-IMPLEMENT_ABSTRACT_CLASS(wxFilterClassFactory, wxObject)
+IMPLEMENT_ABSTRACT_CLASS(wxFilterClassFactoryBase, wxObject)
-wxFilterClassFactory *wxFilterClassFactory::sm_first = NULL;
+wxString wxFilterClassFactoryBase::PopExtension(const wxString& location) const
+{
+ return location.substr(0, FindExtension(location));
+}
-bool wxFilterClassFactory::CanHandle(const wxChar *protocol,
- wxStreamProtocolType type) const
+wxString::size_type wxFilterClassFactoryBase::FindExtension(
+ const wxString& location) const
{
- if (type == wxSTREAM_FILEEXTENSION)
+ for (const wxChar *const *p = GetProtocols(wxSTREAM_FILEEXT); *p; p++)
{
- size_t len = wxStrlen(protocol);
+ if ( location.EndsWith(*p) )
+ return location.length() - wxStrlen(*p);
+ }
- for (const wxChar * const *p = GetProtocols(type); p && *p; p++)
- {
- size_t l = wxStrlen(*p);
+ return wxString::npos;
+}
- if (l <= len && wxStrcmp(*p, protocol + len - l) == 0)
- return true;
- }
- }
+bool wxFilterClassFactoryBase::CanHandle(const wxString& protocol,
+ wxStreamProtocolType type) const
+{
+ if (type == wxSTREAM_FILEEXT)
+ return FindExtension(protocol) != wxString::npos;
else
- {
- for (const wxChar * const *p = GetProtocols(type); p && *p; p++)
- if (wxStrcmp(*p, protocol) == 0)
+ for (const wxChar *const *p = GetProtocols(type); *p; p++)
+ if (protocol == *p)
return true;
- }
return false;
}
+// ----------------------------------------------------------------------------
+// wxFilterClassFactory
+// ----------------------------------------------------------------------------
+
+IMPLEMENT_ABSTRACT_CLASS(wxFilterClassFactory, wxFilterClassFactoryBase)
+
+wxFilterClassFactory *wxFilterClassFactory::sm_first = NULL;
+
void wxFilterClassFactory::Remove()
{
if (m_next != this)