File: litlib.h

package info (click to toggle)
convlit 1.8-2
  • links: PTS
  • area: main
  • in suites: bullseye
  • size: 612 kB
  • sloc: ansic: 8,141; makefile: 58
file content (245 lines) | stat: -rw-r--r-- 7,481 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
/*****************************************************************************/ /*--[litlib.h]-----------------------------------------------------------------
 | Copyright (C) 2002 Dan A. Jackson 
 |
 | This file is part of the "openclit" library for processing .LIT files.
 |
 | "Openclit" is free software; you can redistribute it and/or modify
 | it under the terms of the GNU General Public License as published by
 | the Free Software Foundation; either version 2 of the License, or
 | (at your option) any later version.
 |
 | This program 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 General Public License for more details.
 |
 | You should have received a copy of the GNU General Public License
 | along with this program; if not, write to the Free Software
 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
 | The GNU General Public License may also be available at the following
 | URL: http://www.gnu.org/licenses/gpl.html
*/

#ifndef LITLIB_H
#define LITLIB_H

#include "littypes.h"


/* This function supplied by the client */
#define ERR_RW 3
#define ERR_R  1
#define ERR_W  2

#define ERR_LIBC  0x0080
#define ERR_WIN32 0x0100

void lit_error(int what, char * fmt, ...);

/* Return value is the number of chars written */
typedef int (* HTMLWRITEFCN)(void *, U8 *, int);

/* Return value is a "free-able" block of memory */
typedef U8* (* READFCN)(void *,U32, int);

/* Return value is the number of bytes written */
typedef int (* WRITEFCN)(void *,U32, U8 *,int);

/* 
 | this function is called with NULL to initialize DRM5, and then 
 | later with the data to decrypt 
 */
typedef int (* DRM5FCN)(void *,U8 *, int);


typedef struct lit_attr_map {
        unsigned int    id;
        const char * name;
} lit_attr_map;



/* Accesses for atoms continue off the end of this structure */
typedef struct lit_atom_list
{
    int num_attrs;
    lit_attr_map * attrmap;
    int num_atoms;
    char * atom_names[1];
} lit_atom_list; 


#define ENTRY_SOURCE_INVALID    0
#define ENTRY_SOURCE_LITFILE    1
#define ENTRY_SOURCE_POINTER    2

typedef struct entry_type
{
    struct  entry_type * next;

    /* Where this data is coming from */
    int     data_source;

    /* This means different things depending on what the source is --
     * if the source is ENTRY_SOURCE_LITFILE, then this is either NULL 
     * (ie, this is in the current LIT file), or points to a different
     * "lit_file" structure, in which case, reading this entry involves a
     * recursive call with the name with THAT lit_file structure.
     *
     * For ENTRY_SOURCE_POINTER this points directly to the data */
    void    * data_pointer;

    /* What section does this entry belong to. */
    U64     section;

    /* Offset into current file */
    U64     offset;

    /* Byte count of data (not necessarily valid for "ENTRY_SOURCE_LITFILE" */
    U64     size;

    /* Size of name (not including trailing zero */
    int     namelen;

    /* First character of null terminated name. */
    U8      name;

} entry_type;


typedef struct name_mapping {
    U8 * sInternal;
    U8 * sOriginal;
    U8 * sType; 
    U32  offset;   /* Totally redundant, but useful for writing */
} name_mapping;

#define NUM_MANIFEST_MAPS  4
typedef struct manifest_type {
    int num_mappings[NUM_MANIFEST_MAPS];    
    name_mapping * mappings[NUM_MANIFEST_MAPS]; 
} manifest_type;

#define MAX_SECTION_NAME    128
typedef struct section_type 
{
    U8     * data_pointer;
    int    size;
    U8     name[MAX_SECTION_NAME+1];
} section_type;

typedef struct lit_file
{
    /* Abstract pointer to file information, passed into "open" */
    void        * file_pointer;

    /* Function pointer to read from a particular location */
    READFCN     readat;
    /* Function pointer to write at a particular location */
    WRITEFCN    writeat;

    /* The extent of DRM5 support in the library */
    DRM5FCN     drm5_callback;
    void        * drm5_data; 

    /* Total size of the file in bytes */
    U32         filesize;

    /* Offset into the file where content starts */
    U32         content_offset;

    /* Number of entries in the internal directory structure */
    int         num_file_entries;
    /* Pointer to first entry (typically '/') in the internal
     * directory structure */
    entry_type  * entry;

    /* Number of "sections" in the name list -- 
     * Typically there will be 4 sections, which are
     *   0 -  Uncompressed    (LIT format files are in this section)
     *   1 -  MSCompressed    (Not used for these files)
     *   2 -  EbEncryptDS     (The ebook files themselves)
     *   3 -  EbEncryptOnlyDS (Encryption validation strings, mainly)
     */
    int     num_sections;
    section_type * sections;

    /* Currently valid are:
     *      1 - Sealed
     *      3 - Inscribed
     *      5 - Owner Exclusive (Not Handled)
     */
    int     drmlevel;

    /* DES key for the book itself */
    U8      bookkey[8];

    /* GUIDs from the header */
    U8      header_guid[16];
    U8      piece3_guid[16];
    U8      piece4_guid[16];

    /* LIT fields that are mostly fixed.. */
    U32     entry_chunklen; /* usually 0x2000 */
    U32     count_chunklen; /* Usually 0x200  */

    /* Lit informational fields, filled in by a lit creator... */
    U32     language_id;


    /* These fields are uncertain, and will almost definitely be 
     * renamed at some point in the future */
    U32     creator_id;
    U32     entry_unknown;
    U32     count_unknown;
    /* Almost certainly wrong! */
    U32     timestamp;
} lit_file;

#define	DRM_LEVEL_INVALID       -1234


#define E_LIT_BAD_STRUCT        -2000 
#define E_LIT_INTERNAL_ERROR    -2001
#define E_LIT_OUT_OF_MEMORY     -2002
#define E_LIT_NULL_POINTER      -2003

#define E_LIT_READ_ERROR        -2010
#define E_LIT_LZX_ERROR         -2011 
#define E_LIT_WRITE_ERROR       -2012

#define E_LIT_FILE_NOT_FOUND    -2030

#define E_LIT_FORMAT_ERROR      -2100
#define E_LIT_NEWER_VERSION     -2110
#define E_LIT_64BIT_VALUE       -2120
#define E_LIT_DECRYPT_FAIL      -2130
#define E_LIT_BAD_UTF8          -2140
#define E_LIT_NOT_ENOUGH_SPACE  -2150
#define E_LIT_NOT_ENOUGH_BYTES  -2160

#define E_LIT_UNSUPPORTED       -2500

#define E_LIT_DRM_ERROR         -2600 

int lit_change_drm_level(lit_file * litfile, int newlevel, U8 * drm_data,
                    int data_size);
int lit_close(lit_file * litfile);
int lit_clone(lit_file * litfile, lit_file * newlitfile);
int lit_read_from_file(lit_file * litfile);
void lit_free_atoms(lit_atom_list * atoms);
int lit_get_file(lit_file * litfile, const char * name, U8 ** ptr, int * psize);
char *lit_lookup_mapping(manifest_type * pmanifest,U8 *,int size);
int lit_put_file(lit_file * litfile, const char * name, U8 * ptr, int size, 
        int section);
lit_atom_list * lit_read_atoms(lit_file * litfile, char * content_name);
int lit_read_from_file(lit_file * litfile);
int lit_read_manifest(lit_file * litfile, manifest_type * pmanifest);
int lit_remove_files(lit_file *, const char * prefix);
int lit_free_manifest(manifest_type * pmanifest);
int lit_reconstitute_html(U8 * pHtml,int base, int nBytes, int html_type,
        manifest_type * pmanifest, lit_atom_list * pCustomTags,
	HTMLWRITEFCN htmlwrite, void * writedata );
int lit_write_to_file(lit_file * litfile);
#endif