1 /*************************************************************************** 2 * chm_lib.h - CHM archive manipulation routines * 3 * ------------------- * 4 * * 5 * author: Jed Wing <jedwin@ugcs.caltech.edu> * 6 * version: 0.3 * 7 * notes: These routines are meant for the manipulation of microsoft * 8 * .chm (compiled html help) files, but may likely be used * 9 * for the manipulation of any ITSS archive, if ever ITSS * 10 * archives are used for any other purpose. * 11 * * 12 * Note also that the section names are statically handled. * 13 * To be entirely correct, the section names should be read * 14 * from the section names meta-file, and then the various * 15 * content sections and the "transforms" to apply to the data * 16 * they contain should be inferred from the section name and * 17 * the meta-files referenced using that name; however, all of * 18 * the files I've been able to get my hands on appear to have * 19 * only two sections: Uncompressed and MSCompressed. * 20 * Additionally, the ITSS.DLL file included with Windows does * 21 * not appear to handle any different transforms than the * 22 * simple LZX-transform. Furthermore, the list of transforms * 23 * to apply is broken, in that only half the required space * 24 * is allocated for the list. (It appears as though the * 25 * space is allocated for ASCII strings, but the strings are * 26 * written as unicode. As a result, only the first half of * 27 * the string appears.) So this is probably not too big of * 28 * a deal, at least until CHM v4 (MS .lit files), which also * 29 * incorporate encryption, of some description. * 30 ***************************************************************************/ 31 32 /*************************************************************************** 33 * 34 * This library is free software; you can redistribute it and/or 35 * modify it under the terms of the GNU Lesser General Public 36 * License as published by the Free Software Foundation; either 37 * version 2.1 of the License, or (at your option) any later version. 38 * 39 * This library is distributed in the hope that it will be useful, 40 * but WITHOUT ANY WARRANTY; without even the implied warranty of 41 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 42 * Lesser General Public License for more details. 43 * 44 * You should have received a copy of the GNU Lesser General Public 45 * License along with this library; if not, write to the Free Software 46 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 47 * 48 ***************************************************************************/ 49 50 #ifndef INCLUDED_CHMLIB_H 51 #define INCLUDED_CHMLIB_H 52 53 typedef ULONGLONG LONGUINT64; 54 typedef LONGLONG LONGINT64; 55 56 /* the two available spaces in a CHM file */ 57 /* N.B.: The format supports arbitrarily many spaces, but only */ 58 /* two appear to be used at present. */ 59 #define CHM_UNCOMPRESSED (0) 60 #define CHM_COMPRESSED (1) 61 62 /* structure representing an ITS (CHM) file stream */ 63 struct chmFile; 64 65 /* structure representing an element from an ITS file stream */ 66 #define CHM_MAX_PATHLEN (256) 67 struct chmUnitInfo 68 { 69 LONGUINT64 start; 70 LONGUINT64 length; 71 int space; 72 WCHAR path[CHM_MAX_PATHLEN+1]; 73 }; 74 75 struct chmFile* chm_openW(const WCHAR *filename) DECLSPEC_HIDDEN; 76 struct chmFile *chm_dup(struct chmFile *oldHandle) DECLSPEC_HIDDEN; 77 78 /* close an ITS archive */ 79 void chm_close(struct chmFile *h) DECLSPEC_HIDDEN; 80 81 /* resolve a particular object from the archive */ 82 #define CHM_RESOLVE_SUCCESS (0) 83 #define CHM_RESOLVE_FAILURE (1) 84 int chm_resolve_object(struct chmFile *h, 85 const WCHAR *objPath, 86 struct chmUnitInfo *ui) DECLSPEC_HIDDEN; 87 88 /* retrieve part of an object from the archive */ 89 LONGINT64 chm_retrieve_object(struct chmFile *h, 90 struct chmUnitInfo *ui, 91 unsigned char *buf, 92 LONGUINT64 addr, 93 LONGINT64 len) DECLSPEC_HIDDEN; 94 95 /* enumerate the objects in the .chm archive */ 96 typedef int (*CHM_ENUMERATOR)(struct chmFile *h, 97 struct chmUnitInfo *ui, 98 void *context); 99 #define CHM_ENUMERATE_NORMAL (1) 100 #define CHM_ENUMERATE_META (2) 101 #define CHM_ENUMERATE_SPECIAL (4) 102 #define CHM_ENUMERATE_FILES (8) 103 #define CHM_ENUMERATE_DIRS (16) 104 #define CHM_ENUMERATE_ALL (31) 105 #define CHM_ENUMERATOR_FAILURE (0) 106 #define CHM_ENUMERATOR_CONTINUE (1) 107 #define CHM_ENUMERATOR_SUCCESS (2) 108 BOOL chm_enumerate_dir(struct chmFile *h, 109 const WCHAR *prefix, 110 int what, 111 CHM_ENUMERATOR e, 112 void *context) DECLSPEC_HIDDEN; 113 114 #endif /* INCLUDED_CHMLIB_H */ 115