- 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;
+ }
+
+ // NB: We convert input file to wchar_t here in Unicode mode, based on
+ // either Content-Type header or <meta> tags. In ANSI mode, we don't
+ // do it as it is done by wxHtmlParser (for this reason, we add <meta>
+ // tag if we used Content-Type header).
+#if wxUSE_UNICODE
+ int charsetPos;
+ if ((charsetPos = file.GetMimeType().Find(wxT("; charset="))) != wxNOT_FOUND)
+ {
+ wxString charset = file.GetMimeType().Mid(charsetPos + 10);
+ wxCSConv conv(charset);
+ ReadString(doc, s, conv);
+ }
+ else
+ {
+ size_t size = s->GetSize();
+ wxCharBuffer buf( size );
+ s->Read( buf.data(), size );
+ wxString tmpdoc( buf, wxConvISO8859_1);
+
+ wxString charset = wxHtmlParser::ExtractCharsetInformation(tmpdoc);
+ if (charset.empty())
+ doc = tmpdoc;
+ else
+ {
+ wxCSConv conv(charset);
+ doc = wxString( buf, conv );
+ }
+ }
+#else // !wxUSE_UNICODE
+ ReadString(doc, s, wxConvLibc);
+ // add meta tag if we obtained this through http:
+ if (!file.GetMimeType().empty())
+ {
+ wxString hdr;
+ wxString mime = file.GetMimeType();
+ hdr.Printf(wxT("<meta http-equiv=\"Content-Type\" content=\"%s\">"), mime.c_str());
+ return hdr+doc;
+ }
+#endif