-    wxFSFile *fi;
-    wxFileSystem fsys;
-    wxInputStream *s;
-    wxString bookFull;
-
-    int sz;
-    char *buff, *lineptr;
-    char linebuf[300];
-
-    wxString title = _("noname"),
-             safetitle,
-             start = wxEmptyString,
-             contents = wxEmptyString, index = wxEmptyString;
-
-    if (wxIsAbsolutePath(book)) bookFull = book;
-    else bookFull = wxGetCwd() + "/" + book;
-
-    fi = fsys.OpenFile(bookFull);
-    if (fi == NULL) return FALSE;
-    fsys.ChangePathTo(bookFull);
-    s = fi -> GetStream();
-    sz = s -> GetSize();
-    buff = new char[sz+1];
-    buff[sz] = 0;
-    s -> Read(buff, sz);
-    lineptr = buff;
-    delete fi;
-
-    while ((lineptr = ReadLine(lineptr, linebuf)) != NULL) {
-        if (strstr(linebuf, "Title=") == linebuf)
-            title = linebuf + strlen("Title=");
-        if (strstr(linebuf, "Default topic=") == linebuf)
-            start = linebuf + strlen("Default topic=");
-        if (strstr(linebuf, "Index file=") == linebuf)
-            index = linebuf + strlen("Index file=");
-        if (strstr(linebuf, "Contents file=") == linebuf)
-            contents = linebuf + strlen("Contents file=");
-    }
-    delete[] buff;
-
-    return AddBookParam(title, contents, index, start, fsys.GetPath());
+    if (book.Right(4).Lower() == wxT(".zip") ||
+        book.Right(4).Lower() == wxT(".htb") /*html book*/)
+    {
+        wxFileSystem fsys;
+        wxString s;
+        bool rt = FALSE;
+
+        s = fsys.FindFirst(book + wxT("#zip:") + wxT("*.hhp"), wxFILE);
+        while (!s.IsEmpty())
+        {
+            if (AddBook(s)) rt = TRUE;
+            s = fsys.FindNext();
+        }
+
+        return rt;
+    }
+    else
+    {
+        wxFSFile *fi;
+        wxFileSystem fsys;
+
+        wxString title = _("noname"),
+                 safetitle,
+                 start = wxEmptyString,
+                 contents = wxEmptyString,
+                 index = wxEmptyString,
+                 charset = wxEmptyString;
+
+        fi = fsys.OpenFile(book);
+        if (fi == NULL)
+        {
+            wxLogError(_("Cannot open HTML help book: %s"), book.c_str());
+            return FALSE;
+        }
+        fsys.ChangePathTo(book);
+
+        const wxChar *lineptr;
+        wxChar linebuf[300];
+        wxString tmp;
+        wxHtmlFilterPlainText filter;
+        tmp = filter.ReadFile(*fi);
+        lineptr = tmp.c_str();
+
+        do 
+        {
+            lineptr = ReadLine(lineptr, linebuf, 300);
+            
+            for (wxChar *ch = linebuf; *ch != wxT('\0') && *ch != wxT('='); ch++)
+               *ch = tolower(*ch);
+
+            if (wxStrstr(linebuf, _T("title=")) == linebuf)
+                title = linebuf + wxStrlen(_T("title="));
+            if (wxStrstr(linebuf, _T("default topic=")) == linebuf)
+                start = linebuf + wxStrlen(_T("default topic="));
+            if (wxStrstr(linebuf, _T("index file=")) == linebuf)
+                index = linebuf + wxStrlen(_T("index file="));
+            if (wxStrstr(linebuf, _T("contents file=")) == linebuf)
+                contents = linebuf + wxStrlen(_T("contents file="));
+            if (wxStrstr(linebuf, _T("charset=")) == linebuf)
+                charset = linebuf + wxStrlen(_T("charset="));
+        } while (lineptr != NULL);
+
+        wxFontEncoding enc;
+        if (charset == wxEmptyString) enc = wxFONTENCODING_SYSTEM;
+        else enc = wxFontMapper::Get()->CharsetToEncoding(charset);
+        bool rtval = AddBookParam(*fi, enc,
+                                  title, contents, index, start, fsys.GetPath());
+        delete fi;
+        return rtval;
+    }