Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/file/src/cdf.h
39478 views
1
/*-
2
* Copyright (c) 2008 Christos Zoulas
3
* All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
*
14
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
15
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
16
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
18
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24
* POSSIBILITY OF SUCH DAMAGE.
25
*/
26
/*
27
* Parse Composite Document Files, the format used in Microsoft Office
28
* document files before they switched to zipped XML.
29
* Info from: http://sc.openoffice.org/compdocfileformat.pdf
30
*
31
* N.B. This is the "Composite Document File" format, and not the
32
* "Compound Document Format", nor the "Channel Definition Format".
33
*/
34
35
#ifndef _H_CDF_
36
#define _H_CDF_
37
38
#ifdef WIN32
39
#include <winsock2.h>
40
#define timespec timeval
41
#define tv_nsec tv_usec
42
#endif
43
#ifdef __DJGPP__
44
#define timespec timeval
45
#define tv_nsec tv_usec
46
#endif
47
48
typedef int32_t cdf_secid_t;
49
50
#define CDF_LOOP_LIMIT 10000
51
#define CDF_ELEMENT_LIMIT 100000
52
53
#define CDF_SECID_NULL 0
54
#define CDF_SECID_FREE -1
55
#define CDF_SECID_END_OF_CHAIN -2
56
#define CDF_SECID_SECTOR_ALLOCATION_TABLE -3
57
#define CDF_SECID_MASTER_SECTOR_ALLOCATION_TABLE -4
58
59
typedef struct {
60
uint64_t h_magic;
61
#define CDF_MAGIC 0xE11AB1A1E011CFD0LL
62
uint64_t h_uuid[2];
63
uint16_t h_revision;
64
uint16_t h_version;
65
uint16_t h_byte_order;
66
uint16_t h_sec_size_p2;
67
uint16_t h_short_sec_size_p2;
68
uint8_t h_unused0[10];
69
uint32_t h_num_sectors_in_sat;
70
uint32_t h_secid_first_directory;
71
uint8_t h_unused1[4];
72
uint32_t h_min_size_standard_stream;
73
cdf_secid_t h_secid_first_sector_in_short_sat;
74
uint32_t h_num_sectors_in_short_sat;
75
cdf_secid_t h_secid_first_sector_in_master_sat;
76
uint32_t h_num_sectors_in_master_sat;
77
cdf_secid_t h_master_sat[436/4];
78
} cdf_header_t;
79
80
#define CDF_SEC_SIZE(h) CAST(size_t, 1 << (h)->h_sec_size_p2)
81
#define CDF_SEC_POS(h, secid) (CDF_SEC_SIZE(h) + (secid) * CDF_SEC_SIZE(h))
82
#define CDF_SHORT_SEC_SIZE(h) CAST(size_t, 1 << (h)->h_short_sec_size_p2)
83
#define CDF_SHORT_SEC_POS(h, secid) ((secid) * CDF_SHORT_SEC_SIZE(h))
84
85
typedef int32_t cdf_dirid_t;
86
#define CDF_DIRID_NULL -1
87
88
typedef int64_t cdf_timestamp_t;
89
#define CDF_BASE_YEAR 1601
90
#define CDF_TIME_PREC 10000000
91
92
typedef struct {
93
uint16_t d_name[32];
94
uint16_t d_namelen;
95
uint8_t d_type;
96
#define CDF_DIR_TYPE_EMPTY 0
97
#define CDF_DIR_TYPE_USER_STORAGE 1
98
#define CDF_DIR_TYPE_USER_STREAM 2
99
#define CDF_DIR_TYPE_LOCKBYTES 3
100
#define CDF_DIR_TYPE_PROPERTY 4
101
#define CDF_DIR_TYPE_ROOT_STORAGE 5
102
uint8_t d_color;
103
#define CDF_DIR_COLOR_READ 0
104
#define CDF_DIR_COLOR_BLACK 1
105
cdf_dirid_t d_left_child;
106
cdf_dirid_t d_right_child;
107
cdf_dirid_t d_storage;
108
uint64_t d_storage_uuid[2];
109
uint32_t d_flags;
110
cdf_timestamp_t d_created;
111
cdf_timestamp_t d_modified;
112
cdf_secid_t d_stream_first_sector;
113
uint32_t d_size;
114
uint32_t d_unused0;
115
} cdf_directory_t;
116
117
#define CDF_DIRECTORY_SIZE 128
118
119
typedef struct {
120
cdf_secid_t *sat_tab;
121
size_t sat_len;
122
} cdf_sat_t;
123
124
typedef struct {
125
cdf_directory_t *dir_tab;
126
size_t dir_len;
127
} cdf_dir_t;
128
129
typedef struct {
130
void *sst_tab;
131
size_t sst_len; /* Number of sectors */
132
size_t sst_dirlen; /* Directory sector size */
133
size_t sst_ss; /* Sector size */
134
} cdf_stream_t;
135
136
typedef struct {
137
uint32_t cl_dword;
138
uint16_t cl_word[2];
139
uint8_t cl_two[2];
140
uint8_t cl_six[6];
141
} cdf_classid_t;
142
143
typedef struct {
144
uint16_t si_byte_order;
145
uint16_t si_zero;
146
uint16_t si_os_version;
147
uint16_t si_os;
148
cdf_classid_t si_class;
149
uint32_t si_count;
150
} cdf_summary_info_header_t;
151
152
#define CDF_SECTION_DECLARATION_OFFSET 0x1c
153
154
typedef struct {
155
cdf_classid_t sd_class;
156
uint32_t sd_offset;
157
} cdf_section_declaration_t;
158
159
typedef struct {
160
uint32_t sh_len;
161
uint32_t sh_properties;
162
} cdf_section_header_t;
163
164
typedef struct {
165
uint32_t pi_id;
166
uint32_t pi_type;
167
union {
168
uint16_t _pi_u16;
169
int16_t _pi_s16;
170
uint32_t _pi_u32;
171
int32_t _pi_s32;
172
uint64_t _pi_u64;
173
int64_t _pi_s64;
174
cdf_timestamp_t _pi_tp;
175
float _pi_f;
176
double _pi_d;
177
struct {
178
uint32_t s_len;
179
const char *s_buf;
180
} _pi_str;
181
} pi_val;
182
#define pi_u64 pi_val._pi_u64
183
#define pi_s64 pi_val._pi_s64
184
#define pi_u32 pi_val._pi_u32
185
#define pi_s32 pi_val._pi_s32
186
#define pi_u16 pi_val._pi_u16
187
#define pi_s16 pi_val._pi_s16
188
#define pi_f pi_val._pi_f
189
#define pi_d pi_val._pi_d
190
#define pi_tp pi_val._pi_tp
191
#define pi_str pi_val._pi_str
192
} cdf_property_info_t;
193
194
#define CDF_ROUND(val, by) (((val) + (by) - 1) & ~((by) - 1))
195
196
/* Variant type definitions */
197
#define CDF_EMPTY 0x00000000
198
#define CDF_NULL 0x00000001
199
#define CDF_SIGNED16 0x00000002
200
#define CDF_SIGNED32 0x00000003
201
#define CDF_FLOAT 0x00000004
202
#define CDF_DOUBLE 0x00000005
203
#define CDF_CY 0x00000006
204
#define CDF_DATE 0x00000007
205
#define CDF_BSTR 0x00000008
206
#define CDF_DISPATCH 0x00000009
207
#define CDF_ERROR 0x0000000a
208
#define CDF_BOOL 0x0000000b
209
#define CDF_VARIANT 0x0000000c
210
#define CDF_UNKNOWN 0x0000000d
211
#define CDF_DECIMAL 0x0000000e
212
#define CDF_SIGNED8 0x00000010
213
#define CDF_UNSIGNED8 0x00000011
214
#define CDF_UNSIGNED16 0x00000012
215
#define CDF_UNSIGNED32 0x00000013
216
#define CDF_SIGNED64 0x00000014
217
#define CDF_UNSIGNED64 0x00000015
218
#define CDF_INT 0x00000016
219
#define CDF_UINT 0x00000017
220
#define CDF_VOID 0x00000018
221
#define CDF_HRESULT 0x00000019
222
#define CDF_PTR 0x0000001a
223
#define CDF_SAFEARRAY 0x0000001b
224
#define CDF_CARRAY 0x0000001c
225
#define CDF_USERDEFINED 0x0000001d
226
#define CDF_LENGTH32_STRING 0x0000001e
227
#define CDF_LENGTH32_WSTRING 0x0000001f
228
#define CDF_FILETIME 0x00000040
229
#define CDF_BLOB 0x00000041
230
#define CDF_STREAM 0x00000042
231
#define CDF_STORAGE 0x00000043
232
#define CDF_STREAMED_OBJECT 0x00000044
233
#define CDF_STORED_OBJECT 0x00000045
234
#define CDF_BLOB_OBJECT 0x00000046
235
#define CDF_CLIPBOARD 0x00000047
236
#define CDF_CLSID 0x00000048
237
#define CDF_VECTOR 0x00001000
238
#define CDF_ARRAY 0x00002000
239
#define CDF_BYREF 0x00004000
240
#define CDF_RESERVED 0x00008000
241
#define CDF_ILLEGAL 0x0000ffff
242
#define CDF_ILLEGALMASKED 0x00000fff
243
#define CDF_TYPEMASK 0x00000fff
244
245
#define CDF_PROPERTY_CODE_PAGE 0x00000001
246
#define CDF_PROPERTY_TITLE 0x00000002
247
#define CDF_PROPERTY_SUBJECT 0x00000003
248
#define CDF_PROPERTY_AUTHOR 0x00000004
249
#define CDF_PROPERTY_KEYWORDS 0x00000005
250
#define CDF_PROPERTY_COMMENTS 0x00000006
251
#define CDF_PROPERTY_TEMPLATE 0x00000007
252
#define CDF_PROPERTY_LAST_SAVED_BY 0x00000008
253
#define CDF_PROPERTY_REVISION_NUMBER 0x00000009
254
#define CDF_PROPERTY_TOTAL_EDITING_TIME 0x0000000a
255
#define CDF_PROPERTY_LAST_PRINTED 0X0000000b
256
#define CDF_PROPERTY_CREATE_TIME 0x0000000c
257
#define CDF_PROPERTY_LAST_SAVED_TIME 0x0000000d
258
#define CDF_PROPERTY_NUMBER_OF_PAGES 0x0000000e
259
#define CDF_PROPERTY_NUMBER_OF_WORDS 0x0000000f
260
#define CDF_PROPERTY_NUMBER_OF_CHARACTERS 0x00000010
261
#define CDF_PROPERTY_THUMBNAIL 0x00000011
262
#define CDF_PROPERTY_NAME_OF_APPLICATION 0x00000012
263
#define CDF_PROPERTY_SECURITY 0x00000013
264
#define CDF_PROPERTY_LOCALE_ID 0x80000000
265
266
typedef struct {
267
int i_fd;
268
const unsigned char *i_buf;
269
size_t i_len;
270
} cdf_info_t;
271
272
273
typedef struct {
274
uint16_t ce_namlen;
275
uint32_t ce_num;
276
uint64_t ce_timestamp;
277
uint16_t ce_name[256];
278
} cdf_catalog_entry_t;
279
280
typedef struct {
281
size_t cat_num;
282
cdf_catalog_entry_t cat_e[1];
283
} cdf_catalog_t;
284
285
struct timespec;
286
file_protected int cdf_timestamp_to_timespec(struct timespec *,
287
cdf_timestamp_t);
288
file_protected int cdf_timespec_to_timestamp(cdf_timestamp_t *,
289
const struct timespec *);
290
file_protected int cdf_read_header(const cdf_info_t *, cdf_header_t *);
291
file_protected void cdf_swap_header(cdf_header_t *);
292
file_protected void cdf_unpack_header(cdf_header_t *, char *);
293
file_protected void cdf_swap_dir(cdf_directory_t *);
294
file_protected void cdf_unpack_dir(cdf_directory_t *, char *);
295
file_protected void cdf_swap_class(cdf_classid_t *);
296
file_protected ssize_t cdf_read_sector(const cdf_info_t *, void *, size_t,
297
size_t, const cdf_header_t *, cdf_secid_t);
298
file_protected ssize_t cdf_read_short_sector(const cdf_stream_t *, void *,
299
size_t, size_t, const cdf_header_t *, cdf_secid_t);
300
file_protected int cdf_read_sat(const cdf_info_t *, cdf_header_t *,
301
cdf_sat_t *);
302
file_protected size_t cdf_count_chain(const cdf_sat_t *, cdf_secid_t, size_t);
303
file_protected int cdf_read_long_sector_chain(const cdf_info_t *,
304
const cdf_header_t *, const cdf_sat_t *, cdf_secid_t, size_t,
305
cdf_stream_t *);
306
file_protected int cdf_read_short_sector_chain(const cdf_header_t *,
307
const cdf_sat_t *, const cdf_stream_t *, cdf_secid_t, size_t,
308
cdf_stream_t *);
309
file_protected int cdf_read_sector_chain(const cdf_info_t *,
310
const cdf_header_t *, const cdf_sat_t *, const cdf_sat_t *,
311
const cdf_stream_t *, cdf_secid_t, size_t, cdf_stream_t *);
312
file_protected int cdf_read_dir(const cdf_info_t *, const cdf_header_t *,
313
const cdf_sat_t *, cdf_dir_t *);
314
file_protected int cdf_read_ssat(const cdf_info_t *, const cdf_header_t *,
315
const cdf_sat_t *, cdf_sat_t *);
316
file_protected int cdf_read_short_stream(const cdf_info_t *,
317
const cdf_header_t *, const cdf_sat_t *, const cdf_dir_t *,
318
cdf_stream_t *, const cdf_directory_t **);
319
file_protected int cdf_read_property_info(const cdf_stream_t *,
320
const cdf_header_t *, uint32_t, cdf_property_info_t **, size_t *, size_t *);
321
file_protected int cdf_read_user_stream(const cdf_info_t *,
322
const cdf_header_t *, const cdf_sat_t *, const cdf_sat_t *,
323
const cdf_stream_t *, const cdf_dir_t *, const char *, cdf_stream_t *);
324
file_protected int cdf_find_stream(const cdf_dir_t *, const char *, int);
325
file_protected int cdf_zero_stream(cdf_stream_t *);
326
file_protected int cdf_read_doc_summary_info(const cdf_info_t *,
327
const cdf_header_t *, const cdf_sat_t *, const cdf_sat_t *,
328
const cdf_stream_t *, const cdf_dir_t *, cdf_stream_t *);
329
file_protected int cdf_read_summary_info(const cdf_info_t *,
330
const cdf_header_t *, const cdf_sat_t *, const cdf_sat_t *,
331
const cdf_stream_t *, const cdf_dir_t *, cdf_stream_t *);
332
file_protected int cdf_unpack_summary_info(const cdf_stream_t *,
333
const cdf_header_t *, cdf_summary_info_header_t *, cdf_property_info_t **,
334
size_t *);
335
file_protected int cdf_unpack_catalog(const cdf_header_t *,
336
const cdf_stream_t *, cdf_catalog_t **);
337
file_protected int cdf_print_classid(char *, size_t, const cdf_classid_t *);
338
file_protected int cdf_print_property_name(char *, size_t, uint32_t);
339
file_protected int cdf_print_elapsed_time(char *, size_t, cdf_timestamp_t);
340
file_protected uint16_t cdf_tole2(uint16_t);
341
file_protected uint32_t cdf_tole4(uint32_t);
342
file_protected uint64_t cdf_tole8(uint64_t);
343
file_protected char *cdf_ctime(const time_t *, char *);
344
file_protected char *cdf_u16tos8(char *, size_t, const uint16_t *);
345
346
#ifdef CDF_DEBUG
347
file_protected void cdf_dump_header(const cdf_header_t *);
348
file_protected void cdf_dump_sat(const char *, const cdf_sat_t *, size_t);
349
file_protected void cdf_dump(const void *, size_t);
350
file_protected void cdf_dump_stream(const cdf_stream_t *);
351
file_protected void cdf_dump_dir(const cdf_info_t *, const cdf_header_t *,
352
const cdf_sat_t *, const cdf_sat_t *, const cdf_stream_t *,
353
const cdf_dir_t *);
354
file_protected void cdf_dump_property_info(const cdf_property_info_t *, size_t);
355
file_protected void cdf_dump_summary_info(const cdf_header_t *,
356
const cdf_stream_t *);
357
file_protected void cdf_dump_catalog(const cdf_header_t *,
358
const cdf_stream_t *);
359
#endif
360
361
362
#endif /* _H_CDF_ */
363
364