#include "wx/tokenzr.h"
#include "wx/wfstream.h"
#include "wx/busyinfo.h"
+#include "wx/encconv.h"
+#include "wx/fontmap.h"
+#include "wx/log.h"
#include "wx/html/htmlpars.h"
#include "wx/html/htmldefs.h"
wxHtmlBookRecord *m_Book;
public:
- HP_TagHandler(wxHtmlBookRecord *b) : wxHtmlTagHandler() {m_Book = b; m_Items = NULL; m_ItemsCnt = 0; m_Name = m_Page = wxEmptyString; m_Level = 0; }
+ HP_TagHandler(wxHtmlBookRecord *b) : wxHtmlTagHandler() {m_Book = b; m_Items = NULL; m_ItemsCnt = 0; m_Name = m_Page = wxEmptyString; m_Level = 0; m_ID = -1; }
wxString GetSupportedTags() { return wxT("UL,OBJECT,PARAM"); }
bool HandleTag(const wxHtmlTag& tag);
void WriteOut(wxHtmlContentsItem*& array, int& size);
HP_TagHandler *handler = new HP_TagHandler(book);
parser.AddTagHandler(handler);
- f = ( contentsfile.IsEmpty() ? 0 : fsys.OpenFile(contentsfile) );
+ f = ( contentsfile.IsEmpty() ? (wxFSFile*) NULL : fsys.OpenFile(contentsfile) );
if (f) {
sz = f -> GetStream() -> GetSize();
buf = new char[sz + 1];
handler -> WriteOut(m_Contents, m_ContentsCnt);
delete[] buf;
}
+ else
+ wxLogError(_("Cannot open contents file: %s"), contentsfile.mb_str());
- f = ( indexfile.IsEmpty() ? 0 : fsys.OpenFile(indexfile) );
+ f = ( indexfile.IsEmpty() ? (wxFSFile*) NULL : fsys.OpenFile(indexfile) );
if (f) {
sz = f -> GetStream() -> GetSize();
buf = new char[sz + 1];
handler -> WriteOut(m_Index, m_IndexCnt);
delete[] buf;
}
+ else if (!indexfile.IsEmpty())
+ wxLogError(_("Cannot open index file: %s"), indexfile.mb_str());
return TRUE;
}
f -> Read(&x, sizeof(x));
version = wxINT32_SWAP_ON_BE(x);
- if (version != CURRENT_CACHED_BOOK_VERSION) return FALSE;
+ if (version != CURRENT_CACHED_BOOK_VERSION)
+ {
+ wxLogError(_("Incorrect version of HTML help book"));
+ return FALSE;
// NOTE: when adding new version, please ensure backward compatibility!
-
+ }
+
/* load contents : */
f -> Read(&x, sizeof(x));
}
+
+static wxString SafeFileName(const wxString& s)
+{
+ wxString res(s);
+ res.Replace(wxT("#"), wxT("_"));
+ res.Replace(wxT(":"), wxT("_"));
+ res.Replace(wxT("\\"), wxT("_"));
+ res.Replace(wxT("/"), wxT("_"));
+ return res;
+}
+
bool wxHtmlHelpData::AddBookParam(const wxFSFile& bookfile,
+ wxFontEncoding encoding,
const wxString& title, const wxString& contfile,
const wxString& indexfile, const wxString& deftopic,
const wxString& path)
wxFileSystem fsys;
wxFSFile *fi;
wxHtmlBookRecord *bookr;
+
+ int IndexOld = m_IndexCnt,
+ ContentsOld = m_ContentsCnt;
if (! path.IsEmpty())
fsys.ChangePathTo(path, TRUE);
if (m_TempPath != wxEmptyString)
{
wxFileOutputStream *outs = new wxFileOutputStream(m_TempPath +
- wxFileNameFromPath(bookfile.GetLocation()) + wxT(".cached"));
+ SafeFileName(wxFileNameFromPath(bookfile.GetLocation())) + wxT(".cached"));
SaveCachedBook(bookr, outs);
delete outs;
}
// Now store the contents range
bookr->SetContentsRange(cont_start, m_ContentsCnt);
+
+ // Convert encoding, if neccessary:
+ if (encoding != wxFONTENCODING_SYSTEM)
+ {
+ wxFontEncodingArray a = wxEncodingConverter::GetPlatformEquivalents(encoding);
+ if (a.GetCount() != 0 && a[0] != encoding)
+ {
+ int i;
+ wxEncodingConverter conv;
+ conv.Init(encoding, a[0]);
+
+ for (i = IndexOld; i < m_IndexCnt; i++)
+ conv.Convert(m_Index[i].m_Name);
+ for (i = ContentsOld; i < m_ContentsCnt; i++)
+ conv.Convert(m_Contents[i].m_Name);
+ }
+ }
m_BookRecords.Add(bookr);
if (m_IndexCnt > 0)
char linebuf[300];
wxString title = _("noname"),
- safetitle,
- start = wxEmptyString,
- contents = wxEmptyString, index = wxEmptyString;
+ safetitle,
+ start = wxEmptyString,
+ contents = wxEmptyString,
+ index = wxEmptyString,
+ charset = wxEmptyString;
if (wxIsAbsolutePath(book)) bookFull = book;
else bookFull = wxGetCwd() + "/" + book;
fi = fsys.OpenFile(bookFull);
- if (fi == NULL) return FALSE;
+ if (fi == NULL)
+ {
+ wxLogError(_("Cannot open HTML help book: %s"), bookFull.mb_str());
+ return FALSE;
+ }
fsys.ChangePathTo(bookFull);
s = fi -> GetStream();
sz = s -> GetSize();
index = linebuf + strlen("Index file=");
if (strstr(linebuf, "Contents file=") == linebuf)
contents = linebuf + strlen("Contents file=");
+ if (strstr(linebuf, "Charset=") == linebuf)
+ charset = linebuf + strlen("Charset=");
} while (lineptr != NULL);
delete[] buff;
-
- bool rtval = AddBookParam(*fi, title, contents, index, start, fsys.GetPath());
+
+ wxFontEncoding enc;
+ if (charset == wxEmptyString) enc = wxFONTENCODING_SYSTEM;
+ else enc = wxTheFontMapper -> CharsetToEncoding(charset);
+ bool rtval = AddBookParam(*fi, enc,
+ title, contents, index, start, fsys.GetPath());
delete fi;
return rtval;
}