115 lines
5.4 KiB
C
115 lines
5.4 KiB
C
/***************************************************************************
|
|
* chm_lib.h - CHM archive manipulation routines *
|
|
* ------------------- *
|
|
* *
|
|
* author: Jed Wing <jedwin@ugcs.caltech.edu> *
|
|
* version: 0.3 *
|
|
* notes: These routines are meant for the manipulation of microsoft *
|
|
* .chm (compiled html help) files, but may likely be used *
|
|
* for the manipulation of any ITSS archive, if ever ITSS *
|
|
* archives are used for any other purpose. *
|
|
* *
|
|
* Note also that the section names are statically handled. *
|
|
* To be entirely correct, the section names should be read *
|
|
* from the section names meta-file, and then the various *
|
|
* content sections and the "transforms" to apply to the data *
|
|
* they contain should be inferred from the section name and *
|
|
* the meta-files referenced using that name; however, all of *
|
|
* the files I've been able to get my hands on appear to have *
|
|
* only two sections: Uncompressed and MSCompressed. *
|
|
* Additionally, the ITSS.DLL file included with Windows does *
|
|
* not appear to handle any different transforms than the *
|
|
* simple LZX-transform. Furthermore, the list of transforms *
|
|
* to apply is broken, in that only half the required space *
|
|
* is allocated for the list. (It appears as though the *
|
|
* space is allocated for ASCII strings, but the strings are *
|
|
* written as unicode. As a result, only the first half of *
|
|
* the string appears.) So this is probably not too big of *
|
|
* a deal, at least until CHM v4 (MS .lit files), which also *
|
|
* incorporate encryption, of some description. *
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*
|
|
***************************************************************************/
|
|
|
|
#ifndef INCLUDED_CHMLIB_H
|
|
#define INCLUDED_CHMLIB_H
|
|
|
|
typedef ULONGLONG LONGUINT64;
|
|
typedef LONGLONG LONGINT64;
|
|
|
|
/* the two available spaces in a CHM file */
|
|
/* N.B.: The format supports arbitrarily many spaces, but only */
|
|
/* two appear to be used at present. */
|
|
#define CHM_UNCOMPRESSED (0)
|
|
#define CHM_COMPRESSED (1)
|
|
|
|
/* structure representing an ITS (CHM) file stream */
|
|
struct chmFile;
|
|
|
|
/* structure representing an element from an ITS file stream */
|
|
#define CHM_MAX_PATHLEN (256)
|
|
struct chmUnitInfo
|
|
{
|
|
LONGUINT64 start;
|
|
LONGUINT64 length;
|
|
int space;
|
|
WCHAR path[CHM_MAX_PATHLEN+1];
|
|
};
|
|
|
|
struct chmFile* chm_openW(const WCHAR *filename) DECLSPEC_HIDDEN;
|
|
struct chmFile *chm_dup(struct chmFile *oldHandle) DECLSPEC_HIDDEN;
|
|
|
|
/* close an ITS archive */
|
|
void chm_close(struct chmFile *h) DECLSPEC_HIDDEN;
|
|
|
|
/* resolve a particular object from the archive */
|
|
#define CHM_RESOLVE_SUCCESS (0)
|
|
#define CHM_RESOLVE_FAILURE (1)
|
|
int chm_resolve_object(struct chmFile *h,
|
|
const WCHAR *objPath,
|
|
struct chmUnitInfo *ui) DECLSPEC_HIDDEN;
|
|
|
|
/* retrieve part of an object from the archive */
|
|
LONGINT64 chm_retrieve_object(struct chmFile *h,
|
|
struct chmUnitInfo *ui,
|
|
unsigned char *buf,
|
|
LONGUINT64 addr,
|
|
LONGINT64 len) DECLSPEC_HIDDEN;
|
|
|
|
/* enumerate the objects in the .chm archive */
|
|
typedef int (*CHM_ENUMERATOR)(struct chmFile *h,
|
|
struct chmUnitInfo *ui,
|
|
void *context);
|
|
#define CHM_ENUMERATE_NORMAL (1)
|
|
#define CHM_ENUMERATE_META (2)
|
|
#define CHM_ENUMERATE_SPECIAL (4)
|
|
#define CHM_ENUMERATE_FILES (8)
|
|
#define CHM_ENUMERATE_DIRS (16)
|
|
#define CHM_ENUMERATE_ALL (31)
|
|
#define CHM_ENUMERATOR_FAILURE (0)
|
|
#define CHM_ENUMERATOR_CONTINUE (1)
|
|
#define CHM_ENUMERATOR_SUCCESS (2)
|
|
int chm_enumerate_dir(struct chmFile *h,
|
|
const WCHAR *prefix,
|
|
int what,
|
|
CHM_ENUMERATOR e,
|
|
void *context) DECLSPEC_HIDDEN;
|
|
|
|
#endif /* INCLUDED_CHMLIB_H */
|