#include "wx/wxprec.h"
#include "wx/defs.h"
-#if wxUSE_HTML
+#if wxUSE_HTML && wxUSE_STREAMS
#ifdef __BORDLANDC__
#pragma hdrstop
#endif
#ifndef WXPRECOMP
-#include "wx/wx.h"
+ #include "wx/log.h"
+ #include "wx/intl.h"
#endif
#include "wx/html/htmlfilt.h"
#include "wx/html/htmlwin.h"
+// utility function: read a wxString from a wxInputStream
+void wxPrivate_ReadString(wxString& str, wxInputStream* s)
+{
+ size_t streamSize = s->GetSize();
+
+ if(streamSize == ~(size_t)0)
+ {
+ const size_t bufSize = 4095;
+ char buffer[bufSize+1];
+ size_t lastRead;
+
+ do
+ {
+ s->Read(buffer, bufSize);
+ lastRead = s->LastRead();
+ buffer[lastRead] = 0;
+ str.Append(buffer);
+ }
+ while(lastRead == bufSize);
+ }
+ else
+ {
+ char* src = new char[streamSize+1];
+ s->Read(src, streamSize);
+ src[streamSize] = 0;
+ str = src;
+ delete [] src;
+ }
+}
/*
wxString wxHtmlFilterPlainText::ReadFile(const wxFSFile& file) const
{
wxInputStream *s = file.GetStream();
- char *src;
wxString doc, doc2;
if (s == NULL) return wxEmptyString;
- src = new char[s -> GetSize()+1];
- src[s -> GetSize()] = 0;
- s -> Read(src, s -> GetSize());
- doc = src;
- delete [] src;
+ wxPrivate_ReadString(doc, s);
+ doc.Replace(wxT("&"), wxT("&"), TRUE);
doc.Replace(wxT("<"), wxT("<"), TRUE);
doc.Replace(wxT(">"), wxT(">"), TRUE);
doc2 = "<HTML><BODY><PRE>\n" + doc + "\n</PRE></BODY></HTML>";
// This is true in most case but some page can return:
// "text/html; char-encoding=...."
// So we use Find instead
- return (file.GetMimeType().Find(_("text/html")) == 0);
+ return (file.GetMimeType().Find(wxT("text/html")) == 0);
}
wxString wxHtmlFilterHTML::ReadFile(const wxFSFile& file) const
{
wxInputStream *s = file.GetStream();
- char *src;
wxString doc;
- if (s == NULL) return wxEmptyString;
- src = new char[s -> GetSize() + 1];
- src[s -> GetSize()] = 0;
- s -> Read(src, s -> GetSize());
- doc = src;
- delete[] src;
+ if (s == NULL)
+ {
+ wxLogError(_("Cannot open HTML document: %s"), file.GetLocation().c_str());
+ return wxEmptyString;
+ }
+ wxPrivate_ReadString(doc, s);
- // add meta tag if we obtained this through http:
+ // add meta tag if we obtained this through http:
if (file.GetMimeType().Find(_T("; charset=")) == 0)
{
wxString s(_T("<meta http-equiv=\"Content-Type\" content=\""));
s << file.GetMimeType() << _T("\">");
- return s;
+ return s+doc;
}
- else return doc;
+ return doc;
}