Mercurial > libpst
annotate src/libpst.h @ 118:0f1492b7fe8b
patch from Fridrich Strba for building on mingw and general cleanup of autoconf files
add processing for pst files of type 0x0f
start adding support for properly building and installing libpst.so and the header files required to use it.
remove version.h since the version number is now in config.h
more const correctness issues regarding getopt()
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Sat, 31 Jan 2009 12:12:36 -0800 |
parents | ed2a260bbb98 |
children | 6395ced2b8b2 |
rev | line source |
---|---|
16 | 1 /*** |
2 * libpst.h | |
3 * Part of LibPST project | |
4 * Written by David Smith | |
46 | 5 * dave.s@earthcorp.com |
16 | 6 */ |
7 // LibPST - Library for Accessing Outlook .pst files | |
8 // Dave Smith - davesmith@users.sourceforge.net | |
9 | |
10 #ifndef LIBPST_H | |
11 #define LIBPST_H | |
12 | |
118
0f1492b7fe8b
patch from Fridrich Strba for building on mingw and general cleanup of autoconf files
Carl Byington <carl@five-ten-sg.com>
parents:
116
diff
changeset
|
13 #ifndef _WIN32 |
75
987aa872294e
Use ftello/fseeko to properly handle large files.
Carl Byington <carl@five-ten-sg.com>
parents:
73
diff
changeset
|
14 #include <stdint.h> |
87
3ec5ad97e926
Use inttypes.h for portable printing of 64 bit items.
Carl Byington <carl@five-ten-sg.com>
parents:
79
diff
changeset
|
15 #include <inttypes.h> |
75
987aa872294e
Use ftello/fseeko to properly handle large files.
Carl Byington <carl@five-ten-sg.com>
parents:
73
diff
changeset
|
16 #ifndef FILETIME_DEFINED |
118
0f1492b7fe8b
patch from Fridrich Strba for building on mingw and general cleanup of autoconf files
Carl Byington <carl@five-ten-sg.com>
parents:
116
diff
changeset
|
17 #define FILETIME_DEFINED |
0f1492b7fe8b
patch from Fridrich Strba for building on mingw and general cleanup of autoconf files
Carl Byington <carl@five-ten-sg.com>
parents:
116
diff
changeset
|
18 //Win32 Filetime struct - copied from WINE |
0f1492b7fe8b
patch from Fridrich Strba for building on mingw and general cleanup of autoconf files
Carl Byington <carl@five-ten-sg.com>
parents:
116
diff
changeset
|
19 typedef struct { |
0f1492b7fe8b
patch from Fridrich Strba for building on mingw and general cleanup of autoconf files
Carl Byington <carl@five-ten-sg.com>
parents:
116
diff
changeset
|
20 uint32_t dwLowDateTime; |
0f1492b7fe8b
patch from Fridrich Strba for building on mingw and general cleanup of autoconf files
Carl Byington <carl@five-ten-sg.com>
parents:
116
diff
changeset
|
21 uint32_t dwHighDateTime; |
0f1492b7fe8b
patch from Fridrich Strba for building on mingw and general cleanup of autoconf files
Carl Byington <carl@five-ten-sg.com>
parents:
116
diff
changeset
|
22 } FILETIME; |
75
987aa872294e
Use ftello/fseeko to properly handle large files.
Carl Byington <carl@five-ten-sg.com>
parents:
73
diff
changeset
|
23 #endif |
987aa872294e
Use ftello/fseeko to properly handle large files.
Carl Byington <carl@five-ten-sg.com>
parents:
73
diff
changeset
|
24 #endif |
16 | 25 |
26 // According to Jan Wolter, sys/param.h is the most portable source of endian | |
27 // information on UNIX systems. see http://www.unixpapa.com/incnote/byteorder.html | |
118
0f1492b7fe8b
patch from Fridrich Strba for building on mingw and general cleanup of autoconf files
Carl Byington <carl@five-ten-sg.com>
parents:
116
diff
changeset
|
28 #ifdef _WIN32 |
16 | 29 #define BYTE_ORDER LITTLE_ENDIAN |
30 #else | |
31 #include <sys/param.h> | |
118
0f1492b7fe8b
patch from Fridrich Strba for building on mingw and general cleanup of autoconf files
Carl Byington <carl@five-ten-sg.com>
parents:
116
diff
changeset
|
32 #endif // defined _WIN32 |
16 | 33 |
34 #if BYTE_ORDER == BIG_ENDIAN | |
35 # define LE64_CPU(x) \ | |
90
631d02d30a1c
More fixes for 32/64 bit portability on big endian ppc.
Carl Byington <carl@five-ten-sg.com>
parents:
87
diff
changeset
|
36 x = ((((x) & UINT64_C(0xff00000000000000)) >> 56) | \ |
631d02d30a1c
More fixes for 32/64 bit portability on big endian ppc.
Carl Byington <carl@five-ten-sg.com>
parents:
87
diff
changeset
|
37 (((x) & UINT64_C(0x00ff000000000000)) >> 40) | \ |
631d02d30a1c
More fixes for 32/64 bit portability on big endian ppc.
Carl Byington <carl@five-ten-sg.com>
parents:
87
diff
changeset
|
38 (((x) & UINT64_C(0x0000ff0000000000)) >> 24) | \ |
631d02d30a1c
More fixes for 32/64 bit portability on big endian ppc.
Carl Byington <carl@five-ten-sg.com>
parents:
87
diff
changeset
|
39 (((x) & UINT64_C(0x000000ff00000000)) >> 8 ) | \ |
631d02d30a1c
More fixes for 32/64 bit portability on big endian ppc.
Carl Byington <carl@five-ten-sg.com>
parents:
87
diff
changeset
|
40 (((x) & UINT64_C(0x00000000ff000000)) << 8 ) | \ |
631d02d30a1c
More fixes for 32/64 bit portability on big endian ppc.
Carl Byington <carl@five-ten-sg.com>
parents:
87
diff
changeset
|
41 (((x) & UINT64_C(0x0000000000ff0000)) << 24) | \ |
631d02d30a1c
More fixes for 32/64 bit portability on big endian ppc.
Carl Byington <carl@five-ten-sg.com>
parents:
87
diff
changeset
|
42 (((x) & UINT64_C(0x000000000000ff00)) << 40) | \ |
631d02d30a1c
More fixes for 32/64 bit portability on big endian ppc.
Carl Byington <carl@five-ten-sg.com>
parents:
87
diff
changeset
|
43 (((x) & UINT64_C(0x00000000000000ff)) << 56)); |
16 | 44 # define LE32_CPU(x) \ |
45 x = ((((x) & 0xff000000) >> 24) | \ | |
46 | 46 (((x) & 0x00ff0000) >> 8 ) | \ |
47 (((x) & 0x0000ff00) << 8 ) | \ | |
48 (((x) & 0x000000ff) << 24)); | |
16 | 49 # define LE16_CPU(x) \ |
50 x = ((((x) & 0xff00) >> 8) | \ | |
46 | 51 (((x) & 0x00ff) << 8)); |
16 | 52 #elif BYTE_ORDER == LITTLE_ENDIAN |
53 # define LE64_CPU(x) {} | |
54 # define LE32_CPU(x) {} | |
55 # define LE16_CPU(x) {} | |
56 #else | |
57 # error "Byte order not supported by this library" | |
58 #endif // BYTE_ORDER | |
59 | |
60 | |
79
56fa05fd5271
Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents:
75
diff
changeset
|
61 #define PST_TYPE_NOTE 1 |
16 | 62 #define PST_TYPE_APPOINTMENT 8 |
79
56fa05fd5271
Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents:
75
diff
changeset
|
63 #define PST_TYPE_CONTACT 9 |
56fa05fd5271
Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents:
75
diff
changeset
|
64 #define PST_TYPE_JOURNAL 10 |
16 | 65 #define PST_TYPE_STICKYNOTE 11 |
79
56fa05fd5271
Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents:
75
diff
changeset
|
66 #define PST_TYPE_TASK 12 |
56fa05fd5271
Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents:
75
diff
changeset
|
67 #define PST_TYPE_OTHER 13 |
56fa05fd5271
Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents:
75
diff
changeset
|
68 #define PST_TYPE_REPORT 14 |
16 | 69 |
70 // defines whether decryption is done on this bit of data | |
71 #define PST_NO_ENC 0 | |
79
56fa05fd5271
Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents:
75
diff
changeset
|
72 #define PST_ENC 1 |
16 | 73 |
74 // defines types of possible encryption | |
79
56fa05fd5271
Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents:
75
diff
changeset
|
75 #define PST_NO_ENCRYPT 0 |
16 | 76 #define PST_COMP_ENCRYPT 1 |
79
56fa05fd5271
Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents:
75
diff
changeset
|
77 #define PST_ENCRYPT 2 |
16 | 78 |
79 // defines different types of mappings | |
46 | 80 #define PST_MAP_ATTRIB (uint32_t)1 |
81 #define PST_MAP_HEADER (uint32_t)2 | |
16 | 82 |
83 // define my custom email attributes. | |
84 #define PST_ATTRIB_HEADER -1 | |
85 | |
86 // defines types of free/busy values for appointment->showas | |
87 #define PST_FREEBUSY_FREE 0 | |
88 #define PST_FREEBUSY_TENTATIVE 1 | |
89 #define PST_FREEBUSY_BUSY 2 | |
90 #define PST_FREEBUSY_OUT_OF_OFFICE 3 | |
91 | |
92 // defines labels for appointment->label | |
46 | 93 #define PST_APP_LABEL_NONE 0 // None |
16 | 94 #define PST_APP_LABEL_IMPORTANT 1 // Important |
46 | 95 #define PST_APP_LABEL_BUSINESS 2 // Business |
96 #define PST_APP_LABEL_PERSONAL 3 // Personal | |
97 #define PST_APP_LABEL_VACATION 4 // Vacation | |
16 | 98 #define PST_APP_LABEL_MUST_ATTEND 5 // Must Attend |
99 #define PST_APP_LABEL_TRAVEL_REQ 6 // Travel Required | |
100 #define PST_APP_LABEL_NEEDS_PREP 7 // Needs Preparation | |
46 | 101 #define PST_APP_LABEL_BIRTHDAY 8 // Birthday |
16 | 102 #define PST_APP_LABEL_ANNIVERSARY 9 // Anniversary |
103 #define PST_APP_LABEL_PHONE_CALL 10// Phone Call | |
104 | |
50 | 105 // define type of reccuring event |
106 #define PST_APP_RECUR_NONE 0 | |
107 #define PST_APP_RECUR_DAILY 1 | |
108 #define PST_APP_RECUR_WEEKLY 2 | |
109 #define PST_APP_RECUR_MONTHLY 3 | |
110 #define PST_APP_RECUR_YEARLY 4 | |
111 | |
49 | 112 |
46 | 113 typedef struct pst_misc_6_struct { |
49 | 114 int32_t i1; |
115 int32_t i2; | |
116 int32_t i3; | |
117 int32_t i4; | |
118 int32_t i5; | |
119 int32_t i6; | |
16 | 120 } pst_misc_6; |
121 | |
49 | 122 |
46 | 123 typedef struct pst_entryid_struct { |
49 | 124 int32_t u1; |
125 char entryid[16]; | |
126 uint32_t id; | |
16 | 127 } pst_entryid; |
128 | |
49 | 129 |
46 | 130 typedef struct pst_desc_struct32 { |
49 | 131 uint32_t d_id; |
132 uint32_t desc_id; | |
133 uint32_t list_id; | |
134 uint32_t parent_id; | |
43 | 135 } pst_desc32; |
16 | 136 |
49 | 137 |
46 | 138 typedef struct pst_desc_structn { |
49 | 139 uint64_t d_id; |
140 uint64_t desc_id; | |
141 uint64_t list_id; | |
142 uint32_t parent_id; // not 64 bit ?? | |
143 uint32_t u1; // padding | |
43 | 144 } pst_descn; |
145 | |
49 | 146 |
46 | 147 typedef struct pst_index_struct32 { |
49 | 148 uint32_t id; |
149 uint32_t offset; | |
150 uint16_t size; | |
151 int16_t u1; | |
43 | 152 } pst_index32; |
153 | |
49 | 154 |
46 | 155 typedef struct pst_index_struct { |
49 | 156 uint64_t id; |
157 uint64_t offset; | |
158 uint16_t size; | |
159 int16_t u0; | |
160 int32_t u1; | |
16 | 161 } pst_index; |
162 | |
49 | 163 |
46 | 164 typedef struct pst_index_tree32 { |
49 | 165 uint32_t id; |
166 uint32_t offset; | |
167 uint32_t size; | |
168 int32_t u1; | |
169 struct pst_index_tree * next; | |
43 | 170 } pst_index_ll32; |
171 | |
49 | 172 |
46 | 173 typedef struct pst_index_tree { |
49 | 174 uint64_t id; |
175 uint64_t offset; | |
176 uint64_t size; | |
177 int64_t u1; | |
178 struct pst_index_tree * next; | |
16 | 179 } pst_index_ll; |
180 | |
49 | 181 |
46 | 182 typedef struct pst_index2_tree { |
49 | 183 uint64_t id2; |
184 pst_index_ll *id; | |
185 struct pst_index2_tree * next; | |
16 | 186 } pst_index2_ll; |
187 | |
49 | 188 |
46 | 189 typedef struct pst_desc_tree { |
49 | 190 uint64_t id; |
101
1fc33da23175
fix for orphan children when building descriptor tree, avoid writing uninitialized data to debug log file
Carl Byington <carl@five-ten-sg.com>
parents:
94
diff
changeset
|
191 uint64_t parent_id; |
49 | 192 pst_index_ll * list_index; |
193 pst_index_ll * desc; | |
194 int32_t no_child; | |
195 struct pst_desc_tree * prev; | |
196 struct pst_desc_tree * next; | |
197 struct pst_desc_tree * parent; | |
198 struct pst_desc_tree * child; | |
199 struct pst_desc_tree * child_tail; | |
16 | 200 } pst_desc_ll; |
201 | |
49 | 202 |
46 | 203 typedef struct pst_item_email_subject { |
49 | 204 int off1; |
205 int off2; | |
206 char *subj; | |
16 | 207 } pst_item_email_subject; |
208 | |
49 | 209 |
46 | 210 typedef struct pst_item_email { |
49 | 211 FILETIME *arrival_date; |
212 int autoforward; // 1 = true, 0 = not set, -1 = false | |
213 char *body; | |
116
ed2a260bbb98
improve handling of content-type charset values in mime parts
Carl Byington <carl@five-ten-sg.com>
parents:
102
diff
changeset
|
214 char *body_charset; // null if not specified |
49 | 215 char *cc_address; |
59
7d5c637aaafb
General cleanup and code fixes.
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
216 char *bcc_address; |
49 | 217 char *common_name; |
218 int32_t conv_index; | |
219 int conversion_prohib; // 1 = true, 0 = false | |
220 int delete_after_submit; // 1 = true, 0 = false | |
221 int delivery_report; // 1 = true, 0 = false | |
222 char *encrypted_body; | |
50 | 223 size_t encrypted_body_size; |
49 | 224 char *encrypted_htmlbody; |
50 | 225 size_t encrypted_htmlbody_size; |
49 | 226 int32_t flag; |
227 char *header; | |
228 char *htmlbody; | |
229 int32_t importance; | |
230 char *in_reply_to; | |
231 int message_cc_me; // 1 = true, 0 = false | |
232 int message_recip_me; // 1 = true, 0 = false | |
233 int message_to_me; // 1 = true, 0 = false | |
234 char *messageid; | |
235 int32_t orig_sensitivity; | |
63
cfd6175f9334
Start work on pst2dii to convert to Summation dii load file format.
Carl Byington <carl@five-ten-sg.com>
parents:
59
diff
changeset
|
236 char *original_bcc; |
cfd6175f9334
Start work on pst2dii to convert to Summation dii load file format.
Carl Byington <carl@five-ten-sg.com>
parents:
59
diff
changeset
|
237 char *original_cc; |
cfd6175f9334
Start work on pst2dii to convert to Summation dii load file format.
Carl Byington <carl@five-ten-sg.com>
parents:
59
diff
changeset
|
238 char *original_to; |
49 | 239 char *outlook_recipient; |
63
cfd6175f9334
Start work on pst2dii to convert to Summation dii load file format.
Carl Byington <carl@five-ten-sg.com>
parents:
59
diff
changeset
|
240 char *outlook_recipient_name; |
49 | 241 char *outlook_recipient2; |
242 char *outlook_sender; | |
243 char *outlook_sender_name; | |
244 char *outlook_sender2; | |
245 int32_t priority; | |
246 char *proc_subject; | |
247 int read_receipt; // 1 = true, 0 = false | |
248 char *recip_access; | |
249 char *recip_address; | |
250 char *recip2_access; | |
251 char *recip2_address; | |
252 int reply_requested; // 1 = true, 0 = false | |
253 char *reply_to; | |
254 char *return_path_address; | |
255 int32_t rtf_body_char_count; | |
256 int32_t rtf_body_crc; | |
257 char *rtf_body_tag; | |
258 char *rtf_compressed; | |
63
cfd6175f9334
Start work on pst2dii to convert to Summation dii load file format.
Carl Byington <carl@five-ten-sg.com>
parents:
59
diff
changeset
|
259 uint32_t rtf_compressed_size; |
49 | 260 int rtf_in_sync; // 1 = true, 0 = doesn't exist, -1 = false |
261 int32_t rtf_ws_prefix_count; | |
262 int32_t rtf_ws_trailing_count; | |
263 char *sender_access; | |
264 char *sender_address; | |
265 char *sender2_access; | |
266 char *sender2_address; | |
267 int32_t sensitivity; | |
268 FILETIME *sent_date; | |
269 pst_entryid *sentmail_folder; | |
270 char *sentto_address; | |
271 pst_item_email_subject *subject; | |
16 | 272 } pst_item_email; |
273 | |
49 | 274 |
46 | 275 typedef struct pst_item_folder { |
49 | 276 int32_t email_count; |
277 int32_t unseen_email_count; | |
278 int32_t assoc_count; | |
279 int subfolder; // 1 = true, 0 = false | |
16 | 280 } pst_item_folder; |
281 | |
49 | 282 |
46 | 283 typedef struct pst_item_message_store { |
51 | 284 pst_entryid *top_of_personal_folder; // 0x35e0 |
285 pst_entryid *default_outbox_folder; // 0x35e2 | |
286 pst_entryid *deleted_items_folder; // 0x35e3 | |
287 pst_entryid *sent_items_folder; // 0x35e4 | |
288 pst_entryid *user_views_folder; // 0x35e5 | |
289 pst_entryid *common_view_folder; // 0x35e6 | |
290 pst_entryid *search_root_folder; // 0x35e7 | |
291 pst_entryid *top_of_folder; // 0x7c07 | |
292 int32_t valid_mask; // 0x35df // what folders the message store contains | |
293 int32_t pwd_chksum; // 0x76ff | |
16 | 294 } pst_item_message_store; |
295 | |
49 | 296 |
46 | 297 typedef struct pst_item_contact { |
49 | 298 char *access_method; |
299 char *account_name; | |
300 char *address1; | |
301 char *address1a; | |
302 char *address1_desc; | |
303 char *address1_transport; | |
304 char *address2; | |
305 char *address2a; | |
306 char *address2_desc; | |
307 char *address2_transport; | |
308 char *address3; | |
309 char *address3a; | |
310 char *address3_desc; | |
311 char *address3_transport; | |
312 char *assistant_name; | |
313 char *assistant_phone; | |
314 char *billing_information; | |
315 FILETIME *birthday; | |
51 | 316 char *business_address; // 0x801b |
49 | 317 char *business_city; |
318 char *business_country; | |
319 char *business_fax; | |
320 char *business_homepage; | |
321 char *business_phone; | |
322 char *business_phone2; | |
323 char *business_po_box; | |
324 char *business_postal_code; | |
325 char *business_state; | |
326 char *business_street; | |
327 char *callback_phone; | |
328 char *car_phone; | |
329 char *company_main_phone; | |
330 char *company_name; | |
331 char *computer_name; | |
332 char *customer_id; | |
333 char *def_postal_address; | |
334 char *department; | |
335 char *display_name_prefix; | |
336 char *first_name; | |
337 char *followup; | |
338 char *free_busy_address; | |
339 char *ftp_site; | |
340 char *fullname; | |
51 | 341 int16_t gender; |
49 | 342 char *gov_id; |
343 char *hobbies; | |
51 | 344 char *home_address; // 0x801a |
49 | 345 char *home_city; |
346 char *home_country; | |
347 char *home_fax; | |
348 char *home_phone; | |
349 char *home_phone2; | |
350 char *home_po_box; | |
351 char *home_postal_code; | |
352 char *home_state; | |
353 char *home_street; | |
354 char *initials; | |
355 char *isdn_phone; | |
356 char *job_title; | |
357 char *keyword; | |
358 char *language; | |
359 char *location; | |
51 | 360 int mail_permission; // 1 = true, 0 = false |
49 | 361 char *manager_name; |
362 char *middle_name; | |
363 char *mileage; | |
364 char *mobile_phone; | |
365 char *nickname; | |
366 char *office_loc; | |
367 char *org_id; | |
51 | 368 char *other_address; // 0x801c |
49 | 369 char *other_city; |
370 char *other_country; | |
371 char *other_phone; | |
372 char *other_po_box; | |
373 char *other_postal_code; | |
374 char *other_state; | |
375 char *other_street; | |
376 char *pager_phone; | |
377 char *personal_homepage; | |
378 char *pref_name; | |
379 char *primary_fax; | |
380 char *primary_phone; | |
381 char *profession; | |
382 char *radio_phone; | |
51 | 383 int rich_text; // 1 = true, 0 = false |
49 | 384 char *spouse_name; |
385 char *suffix; | |
386 char *surname; | |
387 char *telex; | |
388 char *transmittable_display_name; | |
389 char *ttytdd_phone; | |
390 FILETIME *wedding_anniversary; | |
51 | 391 char *work_address_street; // 0x8045 |
392 char *work_address_city; // 0x8046 | |
393 char *work_address_state; // 0x8047 | |
394 char *work_address_postalcode; // 0x8048 | |
395 char *work_address_country; // 0x8049 | |
396 char *work_address_postofficebox; // 0x804a | |
16 | 397 } pst_item_contact; |
398 | |
49 | 399 |
46 | 400 typedef struct pst_item_attach { |
49 | 401 char *filename1; |
402 char *filename2; | |
403 char *mimetype; | |
404 char *data; | |
405 size_t size; | |
406 uint64_t id2_val; | |
407 uint64_t id_val; // calculated from id2_val during creation of record | |
408 int32_t method; | |
409 int32_t position; | |
410 int32_t sequence; | |
411 struct pst_item_attach *next; | |
16 | 412 } pst_item_attach; |
413 | |
49 | 414 |
46 | 415 typedef struct pst_item_extra_field { |
49 | 416 char *field_name; |
417 char *value; | |
418 struct pst_item_extra_field *next; | |
16 | 419 } pst_item_extra_field; |
420 | |
49 | 421 |
46 | 422 typedef struct pst_item_journal { |
49 | 423 FILETIME *end; |
424 FILETIME *start; | |
425 char *type; | |
16 | 426 } pst_item_journal; |
427 | |
49 | 428 |
46 | 429 typedef struct pst_item_appointment { |
49 | 430 FILETIME *end; |
50 | 431 char *location; |
432 int alarm; // 1 = true, 0 = false | |
49 | 433 FILETIME *reminder; |
50 | 434 int32_t alarm_minutes; |
435 char *alarm_filename; | |
49 | 436 FILETIME *start; |
50 | 437 char *timezonestring; |
438 int32_t showas; | |
439 int32_t label; | |
440 int all_day; // 1 = true, 0 = false | |
441 char *recurrence; | |
442 int32_t recurrence_type; | |
443 FILETIME *recurrence_start; | |
444 FILETIME *recurrence_end; | |
16 | 445 } pst_item_appointment; |
446 | |
49 | 447 |
46 | 448 typedef struct pst_item { |
49 | 449 struct pst_item_email *email; // data reffering to email |
450 struct pst_item_folder *folder; // data reffering to folder | |
451 struct pst_item_contact *contact; // data reffering to contact | |
452 struct pst_item_attach *attach; // linked list of attachments | |
453 struct pst_item_message_store *message_store; // data referring to the message store | |
454 struct pst_item_extra_field *extra_fields; // linked list of extra headers and such | |
455 struct pst_item_journal *journal; // data reffering to a journal entry | |
456 struct pst_item_appointment *appointment; // data reffering to a calendar entry | |
457 int type; | |
458 char *ascii_type; | |
459 char *file_as; | |
460 char *comment; | |
461 int32_t message_size; | |
462 char *outlook_version; | |
463 char *record_key; // probably 16 bytes long. | |
464 size_t record_key_size; | |
465 int response_requested; // 1 = true, 0 = false | |
466 FILETIME *create_date; | |
467 FILETIME *modify_date; | |
468 int private_member; // 1 = true, 0 = false | |
16 | 469 } pst_item; |
470 | |
49 | 471 |
46 | 472 typedef struct pst_x_attrib_ll { |
49 | 473 uint32_t type; |
474 uint32_t mytype; | |
475 uint32_t map; | |
476 void *data; | |
477 struct pst_x_attrib_ll *next; | |
16 | 478 } pst_x_attrib_ll; |
479 | |
49 | 480 |
52 | 481 typedef struct pst_block_recorder { |
482 struct pst_block_recorder *next; | |
483 off_t offset; | |
484 size_t size; | |
485 int readcount; | |
486 } pst_block_recorder; | |
487 | |
488 | |
46 | 489 typedef struct pst_file { |
49 | 490 pst_index_ll *i_head, *i_tail; |
52 | 491 pst_desc_ll *d_head, *d_tail; |
49 | 492 pst_x_attrib_ll *x_head; |
52 | 493 pst_block_recorder *block_head; |
46 | 494 |
49 | 495 //set this to 0 to read 32-bit pst files (pre Outlook 2003) |
496 //set this to 1 to read 64-bit pst files (Outlook 2003 and later) | |
497 int do_read64; | |
46 | 498 |
49 | 499 uint64_t index1; |
500 uint64_t index1_back; | |
501 uint64_t index2; | |
502 uint64_t index2_back; | |
503 FILE * fp; // file pointer to opened PST file | |
504 uint64_t size; // pst file size | |
505 unsigned char encryption; // pst encryption setting | |
506 unsigned char ind_type; // pst index type | |
16 | 507 } pst_file; |
508 | |
49 | 509 |
46 | 510 typedef struct pst_block_offset { |
49 | 511 int16_t from; |
512 int16_t to; | |
16 | 513 } pst_block_offset; |
514 | |
49 | 515 |
46 | 516 typedef struct pst_block_offset_pointer { |
52 | 517 char *from; |
518 char *to; | |
519 int needfree; | |
35 | 520 } pst_block_offset_pointer; |
521 | |
49 | 522 |
523 typedef struct pst_num_item { | |
52 | 524 uint32_t id; // not an id1 or id2, this is actually some sort of type code |
525 char *data; | |
526 uint32_t type; | |
527 size_t size; | |
528 char *extra; | |
49 | 529 } pst_num_item; |
530 | |
16 | 531 |
46 | 532 typedef struct pst_num_array { |
49 | 533 int32_t count_item; |
534 int32_t orig_count; | |
535 int32_t count_array; | |
536 struct pst_num_item ** items; | |
537 struct pst_num_array *next; | |
16 | 538 } pst_num_array; |
539 | |
49 | 540 |
541 typedef struct pst_holder { | |
94
997cf1373f9e
fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents:
90
diff
changeset
|
542 char **buf; |
997cf1373f9e
fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents:
90
diff
changeset
|
543 FILE *fp; |
997cf1373f9e
fix base64 encoding that could create long lines
Carl Byington <carl@five-ten-sg.com>
parents:
90
diff
changeset
|
544 int base64; |
49 | 545 } pst_holder; |
546 | |
547 | |
548 typedef struct pst_subblock { | |
52 | 549 char *buf; |
550 size_t read_size; | |
551 size_t i_offset; | |
49 | 552 } pst_subblock; |
553 | |
554 | |
555 typedef struct pst_subblocks { | |
556 size_t subblock_count; | |
557 pst_subblock *subs; | |
558 } pst_subblocks; | |
559 | |
16 | 560 |
561 // prototypes | |
59
7d5c637aaafb
General cleanup and code fixes.
Carl Byington <carl@five-ten-sg.com>
parents:
52
diff
changeset
|
562 int pst_open(pst_file *pf, char *name); |
46 | 563 int pst_close(pst_file *pf); |
564 pst_desc_ll * pst_getTopOfFolders(pst_file *pf, pst_item *root); | |
52 | 565 size_t pst_attach_to_mem(pst_file *pf, pst_item_attach *attach, char **b); |
46 | 566 size_t pst_attach_to_file(pst_file *pf, pst_item_attach *attach, FILE* fp); |
567 size_t pst_attach_to_file_base64(pst_file *pf, pst_item_attach *attach, FILE* fp); | |
568 int pst_load_index (pst_file *pf); | |
569 pst_desc_ll* pst_getNextDptr(pst_desc_ll* d); | |
570 int pst_load_extended_attributes(pst_file *pf); | |
16 | 571 |
46 | 572 int pst_build_id_ptr(pst_file *pf, off_t offset, int32_t depth, uint64_t linku1, uint64_t start_val, uint64_t end_val); |
102
8c4482be0b4c
remove unreachable code
Carl Byington <carl@five-ten-sg.com>
parents:
101
diff
changeset
|
573 int pst_build_desc_ptr(pst_file *pf, off_t offset, int32_t depth, uint64_t linku1, uint64_t start_val, uint64_t end_val); |
46 | 574 pst_item* pst_getItem(pst_file *pf, pst_desc_ll *d_ptr); |
575 pst_item* pst_parse_item (pst_file *pf, pst_desc_ll *d_ptr); | |
48 | 576 pst_num_array* pst_parse_block(pst_file *pf, uint64_t block_id, pst_index2_ll *i2_head, pst_num_array *na_head); |
46 | 577 int pst_process(pst_num_array *list, pst_item *item, pst_item_attach *attach); |
578 void pst_free_list(pst_num_array *list); | |
579 void pst_freeItem(pst_item *item); | |
580 void pst_free_id2(pst_index2_ll * head); | |
581 void pst_free_id (pst_index_ll *head); | |
582 void pst_free_desc (pst_desc_ll *head); | |
583 void pst_free_xattrib(pst_x_attrib_ll *x); | |
49 | 584 int pst_getBlockOffsetPointer(pst_file *pf, pst_index2_ll *i2_head, pst_subblocks *subblocks, uint32_t offset, pst_block_offset_pointer *p); |
52 | 585 int pst_getBlockOffset(char *buf, size_t read_size, uint32_t i_offset, uint32_t offset, pst_block_offset *p); |
46 | 586 pst_index2_ll* pst_build_id2(pst_file *pf, pst_index_ll* list, pst_index2_ll* head_ptr); |
587 pst_index_ll* pst_getID(pst_file* pf, uint64_t id); | |
588 pst_index_ll* pst_getID2(pst_index2_ll * ptr, uint64_t id); | |
589 pst_desc_ll* pst_getDptr(pst_file *pf, uint64_t id); | |
51 | 590 size_t pst_read_block_size(pst_file *pf, off_t offset, size_t size, char **buf); |
79
56fa05fd5271
Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents:
75
diff
changeset
|
591 int pst_decrypt(uint64_t id, char *buf, size_t size, unsigned char type); |
46 | 592 uint64_t pst_getIntAt(pst_file *pf, char *buf); |
593 uint64_t pst_getIntAtPos(pst_file *pf, off_t pos); | |
52 | 594 size_t pst_getAtPos(pst_file *pf, off_t pos, void* buf, size_t size); |
595 size_t pst_ff_getIDblock_dec(pst_file *pf, uint64_t id, char **b); | |
596 size_t pst_ff_getIDblock(pst_file *pf, uint64_t id, char** b); | |
597 size_t pst_ff_getID2block(pst_file *pf, uint64_t id2, pst_index2_ll *id2_head, char** buf); | |
49 | 598 size_t pst_ff_getID2data(pst_file *pf, pst_index_ll *ptr, pst_holder *h); |
599 size_t pst_ff_compile_ID(pst_file *pf, uint64_t id, pst_holder *h, size_t size); | |
16 | 600 |
46 | 601 int pst_strincmp(char *a, char *b, size_t x); |
602 int pst_stricmp(char *a, char *b); | |
603 size_t pst_fwrite(const void*ptr, size_t size, size_t nmemb, FILE*stream); | |
47 | 604 char * pst_wide_to_single(char *wt, size_t size); |
43 | 605 |
46 | 606 char * pst_rfc2426_escape(char *str); |
607 int pst_chr_count(char *str, char x); | |
608 char * pst_rfc2425_datetime_format(FILETIME *ft); | |
609 char * pst_rfc2445_datetime_format(FILETIME *ft); | |
43 | 610 |
51 | 611 void pst_printDptr(pst_file *pf, pst_desc_ll *ptr); |
612 void pst_printIDptr(pst_file* pf); | |
613 void pst_printID2ptr(pst_index2_ll *ptr); | |
16 | 614 |
615 #endif // defined LIBPST_H |