annotate src/readpst.c @ 386:f1f9920cc7b1

Add AM_GNU_GETTEXT macros AM_ICONV relies on config.rpath and autopoint/gettextize will only copy these in when the AM_GNU_GETTEXT macros are present. This is needed for the next commit that deletes config.rpath since it is cruft that should be copied in by autotools not embedded. Run autopoint to copy in config.rpath and leave it to automake to copy into the tarball.
author Paul Wise <pabs3@bonedaddy.net>
date Sat, 21 Dec 2019 21:25:44 +0800
parents 1e1970f93f94
children 5c0ce43c7532
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
1 /***
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
2 * readpst.c
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
3 * Part of the LibPST project
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
4 * Written by David Smith
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
5 * dave.s@earthcorp.com
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
6 */
59
7d5c637aaafb General cleanup and code fixes.
Carl Byington <carl@five-ten-sg.com>
parents: 52
diff changeset
7
122
bdb38b434c0a more changes from Fridrich Strba to avoid installing our config.h
Carl Byington <carl@five-ten-sg.com>
parents: 121
diff changeset
8 #include "define.h"
bdb38b434c0a more changes from Fridrich Strba to avoid installing our config.h
Carl Byington <carl@five-ten-sg.com>
parents: 121
diff changeset
9 #include "lzfu.h"
308
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
10 #include "msg.h"
122
bdb38b434c0a more changes from Fridrich Strba to avoid installing our config.h
Carl Byington <carl@five-ten-sg.com>
parents: 121
diff changeset
11
367
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
12 #define OUTPUT_TEMPLATE "%s.%s"
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
13 #define OUTPUT_KMAIL_DIR_TEMPLATE ".%s.directory"
367
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
14 #define KMAIL_INDEX "../.%s.index"
239
aa50c23a6935 patch from Lee Ayres to add file name extensions in separate mode; allow mixed items types in a folder in separate mode
Carl Byington <carl@five-ten-sg.com>
parents: 238
diff changeset
15 #define SEP_MAIL_FILE_TEMPLATE "%i%s"
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
17 // max size of the c_time char*. It will store the date of the email
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
18 #define C_TIME_SIZE 500
59
7d5c637aaafb General cleanup and code fixes.
Carl Byington <carl@five-ten-sg.com>
parents: 52
diff changeset
19
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
20 struct file_ll {
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
21 char *name[PST_TYPE_MAX];
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
22 char *dname;
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
23 FILE * output[PST_TYPE_MAX];
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
24 int32_t stored_count;
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
25 int32_t item_count;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
26 int32_t skip_count;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
27 };
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
28
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
29 int grim_reaper();
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
30 pid_t try_fork(char* folder);
186
0a4f7ecd7452 more cleanup of external names in the shared library
Carl Byington <carl@five-ten-sg.com>
parents: 182
diff changeset
31 void process(pst_item *outeritem, pst_desc_tree *d_ptr);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
32 void write_email_body(FILE *f, char *body);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
33 void removeCR(char *c);
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
34 void usage();
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
35 void version();
367
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
36 void mk_kmail_dir(char* fname);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
37 int close_kmail_dir();
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
38 void mk_recurse_dir(char* dir);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
39 int close_recurse_dir();
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
40 void mk_separate_dir(char *dir);
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
41 int close_separate_dir();
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
42 void mk_separate_file(struct file_ll *f, int32_t t, char *extension, int openit);
291
bc23fba0da8e possible fix for corrupted output forking for separate messages
Carl Byington <carl@five-ten-sg.com>
parents: 290
diff changeset
43 void close_separate_file(struct file_ll *f);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
44 char* my_stristr(char *haystack, char *needle);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
45 void check_filename(char *fname);
328
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
46 int acceptable_ext(pst_item_attach* attach);
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
47 void write_separate_attachment(char f_name[], pst_item_attach* attach, int attach_num, pst_file* pst);
300
47abe56076da embedded rfc822 messages might contain rtf encoded bodies
Carl Byington <carl@five-ten-sg.com>
parents: 298
diff changeset
48 void write_embedded_message(FILE* f_output, pst_item_attach* attach, char *boundary, pst_file* pf, int save_rtf, char** extra_mime_headers);
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
49 void write_inline_attachment(FILE* f_output, pst_item_attach* attach, char *boundary, pst_file* pst);
277
86078d0c2e9c ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 276
diff changeset
50 int valid_headers(char *header);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
51 void header_has_field(char *header, char *field, int *flag);
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
52 void header_get_subfield(char *field, const char *subfield, char *body_subfield, size_t size_subfield);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
53 char* header_get_field(char *header, char *field);
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
54 char* header_end_field(char *field);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
55 void header_strip_field(char *header, char *field);
345
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
56 int test_base64(char *body, size_t len);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
57 void find_html_charset(char *html, char *charset, size_t charsetlen);
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
58 void find_rfc822_headers(char** extra_mime_headers);
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
59 void write_body_part(FILE* f_output, pst_string *body, char *mime, char *charset, char *boundary, pst_file* pst);
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
60 void write_schedule_part_data(FILE* f_output, pst_item* item, const char* sender, const char* method);
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
61 void write_schedule_part(FILE* f_output, pst_item* item, const char* sender, const char* boundary);
323
2474d01043cd fix From quoting on embedded rfc/822 messages
Carl Byington <carl@five-ten-sg.com>
parents: 316
diff changeset
62 void write_normal_email(FILE* f_output, char f_name[], pst_item* item, int mode, int mode_MH, pst_file* pst, int save_rtf, int embedding, char** extra_mime_headers);
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
63 void write_vcard(FILE* f_output, pst_item *item, pst_item_contact* contact, char comment[]);
242
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
64 int write_extra_categories(FILE* f_output, pst_item* item);
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
65 void write_journal(FILE* f_output, pst_item* item);
242
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
66 void write_appointment(FILE* f_output, pst_item *item);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
67 void create_enter_dir(struct file_ll* f, pst_item *item);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
68 void close_enter_dir(struct file_ll *f);
373
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
69 char* quote_string(char *inp);
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 33
diff changeset
70
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
71 const char* prog_name;
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 33
diff changeset
72 char* output_dir = ".";
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
73
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
74 // Normal mode just creates mbox format files in the current directory. Each file is named
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
75 // the same as the folder's name that it represents
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
76 #define MODE_NORMAL 0
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
77
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
78 // KMail mode creates a directory structure suitable for being used directly
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
79 // by the KMail application
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
80 #define MODE_KMAIL 1
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
81
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
82 // recurse mode creates a directory structure like the PST file. Each directory
254
fb66d428347d switch to mboxrd quoting
Carl Byington <carl@five-ten-sg.com>
parents: 247
diff changeset
83 // contains only one file which stores the emails in mboxrd format.
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
84 #define MODE_RECURSE 2
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
85
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
86 // separate mode creates the same directory structure as recurse. The emails are stored in
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
87 // separate files, numbering from 1 upward. Attachments belonging to the emails are
239
aa50c23a6935 patch from Lee Ayres to add file name extensions in separate mode; allow mixed items types in a folder in separate mode
Carl Byington <carl@five-ten-sg.com>
parents: 238
diff changeset
88 // saved as email_no-filename (e.g. 1-samplefile.doc or 1-Attachment2.zip)
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
89 #define MODE_SEPARATE 3
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
90
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
91
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
92 // Output Normal just prints the standard information about what is going on
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
93 #define OUTPUT_NORMAL 0
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
94
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
95 // Output Quiet is provided so that only errors are printed
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
96 #define OUTPUT_QUIET 1
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
97
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
98 // default mime-type for attachments that have a null mime-type
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
99 #define MIME_TYPE_DEFAULT "application/octet-stream"
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
100 #define RFC822 "message/rfc822"
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
101
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
102 // output mode for contacts
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
103 #define CMODE_VCARD 0
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
104 #define CMODE_LIST 1
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
105
100
1e4a7610d525 fixes from Justin Greer to add -D option to include deleted items, to add missing email headers, to fix bug in my_stristr()
Carl Byington <carl@five-ten-sg.com>
parents: 79
diff changeset
106 // output mode for deleted items
1e4a7610d525 fixes from Justin Greer to add -D option to include deleted items, to add missing email headers, to fix bug in my_stristr()
Carl Byington <carl@five-ten-sg.com>
parents: 79
diff changeset
107 #define DMODE_EXCLUDE 0
1e4a7610d525 fixes from Justin Greer to add -D option to include deleted items, to add missing email headers, to fix bug in my_stristr()
Carl Byington <carl@five-ten-sg.com>
parents: 79
diff changeset
108 #define DMODE_INCLUDE 1
1e4a7610d525 fixes from Justin Greer to add -D option to include deleted items, to add missing email headers, to fix bug in my_stristr()
Carl Byington <carl@five-ten-sg.com>
parents: 79
diff changeset
109
230
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
110 // Output type mode flags
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
111 #define OTMODE_EMAIL 1
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
112 #define OTMODE_APPOINTMENT 2
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
113 #define OTMODE_JOURNAL 4
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
114 #define OTMODE_CONTACT 8
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
115
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
116 // output settings for RTF bodies
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
117 // filename for the attachment
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
118 #define RTF_ATTACH_NAME "rtf-body.rtf"
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
119 // mime type for the attachment
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
120 #define RTF_ATTACH_TYPE "application/rtf"
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 33
diff changeset
121
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
122 // global settings
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
123 int mode = MODE_NORMAL;
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
124 int mode_MH = 0; // a submode of MODE_SEPARATE
239
aa50c23a6935 patch from Lee Ayres to add file name extensions in separate mode; allow mixed items types in a folder in separate mode
Carl Byington <carl@five-ten-sg.com>
parents: 238
diff changeset
125 int mode_EX = 0; // a submode of MODE_SEPARATE
308
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
126 int mode_MSG = 0; // a submode of MODE_SEPARATE
231
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
127 int mode_thunder = 0; // a submode of MODE_RECURSE
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
128 int output_mode = OUTPUT_NORMAL;
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
129 int contact_mode = CMODE_VCARD;
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
130 int deleted_mode = DMODE_EXCLUDE;
230
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
131 int output_type_mode = 0xff; // Default to all.
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
132 int contact_mode_specified = 0;
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
133 int overwrite = 0;
345
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
134 int prefer_utf8 = 0;
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
135 int save_rtf_body = 1;
239
aa50c23a6935 patch from Lee Ayres to add file name extensions in separate mode; allow mixed items types in a folder in separate mode
Carl Byington <carl@five-ten-sg.com>
parents: 238
diff changeset
136 int file_name_len = 10; // enough room for MODE_SPEARATE file name
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
137 pst_file pstfile;
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
138 regex_t meta_charset_pattern;
298
201464dd356e add default character set for items where the pst file does not specify a character set
Carl Byington <carl@five-ten-sg.com>
parents: 297
diff changeset
139 char* default_charset = NULL;
328
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
140 char* acceptable_extensions = NULL;
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
141
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
142 int number_processors = 1; // number of cpus we have
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
143 int max_children = 0; // based on number of cpus and command line args
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
144 int max_child_specified = 0;// have command line arg -j
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
145 int active_children; // number of children of this process, cannot be larger than max_children
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
146 pid_t* child_processes; // setup by main(), and at the start of new child process
200
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
147
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
148 #ifdef HAVE_SEMAPHORE_H
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
149 int shared_memory_id;
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
150 sem_t* global_children = NULL;
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
151 sem_t* output_mutex = NULL;
200
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
152 #endif
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
153
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
154
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
155 int grim_reaper(int waitall)
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
156 {
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
157 int available = 0;
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
158 #ifdef HAVE_FORK
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
159 #ifdef HAVE_SEMAPHORE_H
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
160 if (global_children) {
288
fa7fc1ac6385 add gprof profiling option; allow fork for parallel processing of individual email folders in separate mode
Carl Byington <carl@five-ten-sg.com>
parents: 285
diff changeset
161 //sem_getvalue(global_children, &available);
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
162 //printf("grim reaper %s for pid %d (parent %d) with %d children, %d available\n", (waitall) ? "all" : "", getpid(), getppid(), active_children, available);
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
163 //fflush(stdout);
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
164 int i,j;
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
165 for (i=0; i<active_children; i++) {
258
8ad8fd1c5451 check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents: 257
diff changeset
166 int status;
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
167 pid_t child = child_processes[i];
258
8ad8fd1c5451 check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents: 257
diff changeset
168 pid_t ch = waitpid(child, &status, ((waitall) ? 0 : WNOHANG));
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
169 if (ch == child) {
258
8ad8fd1c5451 check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents: 257
diff changeset
170 // check termination status
259
78e95fab9a8b add some debug checking for process exit status
Carl Byington <carl@five-ten-sg.com>
parents: 258
diff changeset
171 //if (WIFEXITED(status)) {
78e95fab9a8b add some debug checking for process exit status
Carl Byington <carl@five-ten-sg.com>
parents: 258
diff changeset
172 // int ext = WEXITSTATUS(status);
78e95fab9a8b add some debug checking for process exit status
Carl Byington <carl@five-ten-sg.com>
parents: 258
diff changeset
173 // printf("Process %d exited with status %d\n", child, ext);
78e95fab9a8b add some debug checking for process exit status
Carl Byington <carl@five-ten-sg.com>
parents: 258
diff changeset
174 // fflush(stdout);
78e95fab9a8b add some debug checking for process exit status
Carl Byington <carl@five-ten-sg.com>
parents: 258
diff changeset
175 //}
258
8ad8fd1c5451 check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents: 257
diff changeset
176 if (WIFSIGNALED(status)) {
8ad8fd1c5451 check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents: 257
diff changeset
177 int sig = WTERMSIG(status);
8ad8fd1c5451 check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents: 257
diff changeset
178 DEBUG_INFO(("Process %d terminated with signal %d\n", child, sig));
259
78e95fab9a8b add some debug checking for process exit status
Carl Byington <carl@five-ten-sg.com>
parents: 258
diff changeset
179 //printf("Process %d terminated with signal %d\n", child, sig);
78e95fab9a8b add some debug checking for process exit status
Carl Byington <carl@five-ten-sg.com>
parents: 258
diff changeset
180 //fflush(stdout);
258
8ad8fd1c5451 check return codes from forked processes
Carl Byington <carl@five-ten-sg.com>
parents: 257
diff changeset
181 }
358
6abc3054cba2 From Jeffrey Morlan:
Carl Byington <carl@five-ten-sg.com>
parents: 357
diff changeset
182 if (status != 0) {
6abc3054cba2 From Jeffrey Morlan:
Carl Byington <carl@five-ten-sg.com>
parents: 357
diff changeset
183 exit(status);
6abc3054cba2 From Jeffrey Morlan:
Carl Byington <carl@five-ten-sg.com>
parents: 357
diff changeset
184 }
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
185 // this has terminated, remove it from the list
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
186 for (j=i; j<active_children-1; j++) {
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
187 child_processes[j] = child_processes[j+1];
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
188 }
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
189 active_children--;
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
190 i--;
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
191 }
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
192 }
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
193 sem_getvalue(global_children, &available);
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
194 //printf("grim reaper %s for pid %d with %d children, %d available\n", (waitall) ? "all" : "", getpid(), active_children, available);
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
195 //fflush(stdout);
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
196 }
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
197 #endif
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
198 #endif
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
199 return available;
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
200 }
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
202
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
203 pid_t try_fork(char *folder)
200
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
204 {
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
205 #ifdef HAVE_FORK
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
206 #ifdef HAVE_SEMAPHORE_H
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
207 int available = grim_reaper(0);
357
544d57fe6bc6 From Jeffrey Morlan:
Carl Byington <carl@five-ten-sg.com>
parents: 354
diff changeset
208 // If children have called sem_post but not exited yet, we could have available > 0 but active_children == max_children
544d57fe6bc6 From Jeffrey Morlan:
Carl Byington <carl@five-ten-sg.com>
parents: 354
diff changeset
209 if (available && active_children < max_children) {
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
210 sem_wait(global_children);
200
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
211 pid_t child = fork();
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
212 if (child < 0) {
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
213 // fork failed, pretend it worked and we are the child
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
214 return 0;
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
215 }
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
216 else if (child == 0) {
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
217 // fork worked, and we are the child, reinitialize *our* list of children
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
218 active_children = 0;
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
219 memset(child_processes, 0, sizeof(pid_t) * max_children);
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
220 pst_reopen(&pstfile); // close and reopen the pst file to get an independent file position pointer
200
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
221 }
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
222 else {
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
223 // fork worked, and we are the parent, record this child that we need to wait for
205
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
224 //pid_t me = getpid();
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
225 //printf("parent %d forked child pid %d to process folder %s\n", me, child, folder);
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
226 //fflush(stdout);
200
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
227 child_processes[active_children++] = child;
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
228 }
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
229 return child;
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
230 }
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
231 else {
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
232 return 0; // pretend to have forked and we are the child
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
233 }
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
234 #endif
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
235 #endif
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
236 return 0;
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
237 }
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
238
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
239
186
0a4f7ecd7452 more cleanup of external names in the shared library
Carl Byington <carl@five-ten-sg.com>
parents: 182
diff changeset
240 void process(pst_item *outeritem, pst_desc_tree *d_ptr)
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
241 {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
242 struct file_ll ff;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
243 pst_item *item = NULL;
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
244
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
245 DEBUG_ENT("process");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
246 create_enter_dir(&ff, outeritem);
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
247
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
248 for (; d_ptr; d_ptr = d_ptr->next) {
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
249 DEBUG_INFO(("New item record\n"));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
250 if (!d_ptr->desc) {
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
251 ff.skip_count++;
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
252 DEBUG_WARN(("ERROR item's desc record is NULL\n"));
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
253 continue;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
254 }
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
255 DEBUG_INFO(("Desc Email ID %#"PRIx64" [d_ptr->d_id = %#"PRIx64"]\n", d_ptr->desc->i_id, d_ptr->d_id));
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
256
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
257 item = pst_parse_item(&pstfile, d_ptr, NULL);
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
258 DEBUG_INFO(("About to process item\n"));
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
259
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
260 if (!item) {
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
261 ff.skip_count++;
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
262 DEBUG_INFO(("A NULL item was seen\n"));
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
263 continue;
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
264 }
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
265
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
266 if (item->subject.str) {
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
267 DEBUG_INFO(("item->subject = %s\n", item->subject.str));
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
268 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
269
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
270 if (item->folder && item->file_as.str) {
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
271 DEBUG_INFO(("Processing Folder \"%s\"\n", item->file_as.str));
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
272 if (output_mode != OUTPUT_QUIET) {
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
273 pst_debug_lock();
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
274 printf("Processing Folder \"%s\"\n", item->file_as.str);
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
275 fflush(stdout);
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
276 pst_debug_unlock();
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
277 }
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
278 ff.item_count++;
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
279 if (d_ptr->child && (deleted_mode == DMODE_INCLUDE || strcasecmp(item->file_as.str, "Deleted Items"))) {
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
280 //if this is a non-empty folder other than deleted items, we want to recurse into it
200
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
281 pid_t parent = getpid();
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
282 pid_t child = try_fork(item->file_as.str);
200
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
283 if (child == 0) {
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
284 // we are the child process, or the original parent if no children were available
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
285 pid_t me = getpid();
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
286 process(item, d_ptr->child);
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
287 #ifdef HAVE_FORK
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
288 #ifdef HAVE_SEMAPHORE_H
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
289 if (me != parent) {
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
290 // we really were a child, forked for the sole purpose of processing this folder
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
291 // free my child count slot before really exiting, since
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
292 // all I am doing here is waiting for my children to exit
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
293 sem_post(global_children);
200
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
294 grim_reaper(1); // wait for all my child processes to exit
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
295 exit(0); // really exit
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
296 }
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
297 #endif
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
298 #endif
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
299 }
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
300 }
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
301
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
302 } else if (item->contact && (item->type == PST_TYPE_CONTACT)) {
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
303 DEBUG_INFO(("Processing Contact\n"));
233
1d50ff3c5091 better rfc822 embedded message decoding
Carl Byington <carl@five-ten-sg.com>
parents: 231
diff changeset
304 if (!(output_type_mode & OTMODE_CONTACT)) {
230
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
305 ff.skip_count++;
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
306 DEBUG_INFO(("skipping contact: not in output type list\n"));
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
307 }
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
308 else {
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
309 ff.item_count++;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
310 if (mode == MODE_SEPARATE) mk_separate_file(&ff, PST_TYPE_CONTACT, (mode_EX) ? ".vcf" : "", 1);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
311 if (contact_mode == CMODE_VCARD) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
312 pst_convert_utf8_null(item, &item->comment);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
313 write_vcard(ff.output[PST_TYPE_CONTACT], item, item->contact, item->comment.str);
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
314 }
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
315 else {
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
316 pst_convert_utf8(item, &item->contact->fullname);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
317 pst_convert_utf8(item, &item->contact->address1);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
318 fprintf(ff.output[PST_TYPE_CONTACT], "%s <%s>\n", item->contact->fullname.str, item->contact->address1.str);
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
319 }
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
320 if (mode == MODE_SEPARATE) close_separate_file(&ff);
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
321 }
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
322
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
323 } else if (item->email && ((item->type == PST_TYPE_NOTE) || (item->type == PST_TYPE_SCHEDULE) || (item->type == PST_TYPE_REPORT))) {
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
324 DEBUG_INFO(("Processing Email\n"));
233
1d50ff3c5091 better rfc822 embedded message decoding
Carl Byington <carl@five-ten-sg.com>
parents: 231
diff changeset
325 if (!(output_type_mode & OTMODE_EMAIL)) {
230
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
326 ff.skip_count++;
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
327 DEBUG_INFO(("skipping email: not in output type list\n"));
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
328 }
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
329 else {
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
330 char *extra_mime_headers = NULL;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
331 ff.item_count++;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
332 if (mode == MODE_SEPARATE) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
333 // process this single email message, possibly forking
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
334 pid_t parent = getpid();
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
335 pid_t child = try_fork(item->file_as.str);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
336 if (child == 0) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
337 // we are the child process, or the original parent if no children were available
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
338 pid_t me = getpid();
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
339 mk_separate_file(&ff, PST_TYPE_NOTE, (mode_EX) ? ".eml" : "", 1);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
340 write_normal_email(ff.output[PST_TYPE_NOTE], ff.name[PST_TYPE_NOTE], item, mode, mode_MH, &pstfile, save_rtf_body, PST_TYPE_NOTE, &extra_mime_headers);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
341 close_separate_file(&ff);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
342 if (mode_MSG) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
343 mk_separate_file(&ff, PST_TYPE_NOTE, ".msg", 0);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
344 write_msg_email(ff.name[PST_TYPE_NOTE], item, &pstfile);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
345 }
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
346 #ifdef HAVE_FORK
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
347 #ifdef HAVE_SEMAPHORE_H
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
348 if (me != parent) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
349 // we really were a child, forked for the sole purpose of processing this message
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
350 // free my child count slot before really exiting, since
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
351 // all I am doing here is waiting for my children to exit
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
352 sem_post(global_children);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
353 grim_reaper(1); // wait for all my child processes to exit - there should not be any
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
354 exit(0); // really exit
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
355 }
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
356 #endif
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
357 #endif
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
358 }
233
1d50ff3c5091 better rfc822 embedded message decoding
Carl Byington <carl@five-ten-sg.com>
parents: 231
diff changeset
359 }
1d50ff3c5091 better rfc822 embedded message decoding
Carl Byington <carl@five-ten-sg.com>
parents: 231
diff changeset
360 else {
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
361 // process this single email message, cannot fork since not separate mode
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
362 write_normal_email(ff.output[PST_TYPE_NOTE], ff.name[PST_TYPE_NOTE], item, mode, mode_MH, &pstfile, save_rtf_body, 0, &extra_mime_headers);
233
1d50ff3c5091 better rfc822 embedded message decoding
Carl Byington <carl@five-ten-sg.com>
parents: 231
diff changeset
363 }
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
364 }
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
365
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
366 } else if (item->journal && (item->type == PST_TYPE_JOURNAL)) {
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
367 DEBUG_INFO(("Processing Journal Entry\n"));
233
1d50ff3c5091 better rfc822 embedded message decoding
Carl Byington <carl@five-ten-sg.com>
parents: 231
diff changeset
368 if (!(output_type_mode & OTMODE_JOURNAL)) {
230
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
369 ff.skip_count++;
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
370 DEBUG_INFO(("skipping journal entry: not in output type list\n"));
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
371 }
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
372 else {
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
373 ff.item_count++;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
374 if (mode == MODE_SEPARATE) mk_separate_file(&ff, PST_TYPE_JOURNAL, (mode_EX) ? ".ics" : "", 1);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
375 write_journal(ff.output[PST_TYPE_JOURNAL], item);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
376 fprintf(ff.output[PST_TYPE_JOURNAL], "\n");
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
377 if (mode == MODE_SEPARATE) close_separate_file(&ff);
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
378 }
79
56fa05fd5271 Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents: 77
diff changeset
379
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
380 } else if (item->appointment && (item->type == PST_TYPE_APPOINTMENT)) {
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
381 DEBUG_INFO(("Processing Appointment Entry\n"));
233
1d50ff3c5091 better rfc822 embedded message decoding
Carl Byington <carl@five-ten-sg.com>
parents: 231
diff changeset
382 if (!(output_type_mode & OTMODE_APPOINTMENT)) {
230
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
383 ff.skip_count++;
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
384 DEBUG_INFO(("skipping appointment: not in output type list\n"));
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
385 }
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
386 else {
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
387 ff.item_count++;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
388 if (mode == MODE_SEPARATE) mk_separate_file(&ff, PST_TYPE_APPOINTMENT, (mode_EX) ? ".ics" : "", 1);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
389 write_schedule_part_data(ff.output[PST_TYPE_APPOINTMENT], item, NULL, NULL);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
390 fprintf(ff.output[PST_TYPE_APPOINTMENT], "\n");
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
391 if (mode == MODE_SEPARATE) close_separate_file(&ff);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
392 }
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
393
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
394 } else if (item->message_store) {
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
395 // there should only be one message_store, and we have already done it
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
396 ff.skip_count++;
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
397 DEBUG_WARN(("item with message store content, type %i %s, skipping it\n", item->type, item->ascii_type));
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
398
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
399 } else {
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
400 ff.skip_count++;
350
7a91e30826d8 Hans Liss - debug level output
Carl Byington <carl@five-ten-sg.com>
parents: 349
diff changeset
401 DEBUG_WARN(("Unknown item type %i (%s) name (%s)\n",
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
402 item->type, item->ascii_type, item->file_as.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
403 }
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
404 pst_freeItem(item);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
405 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
406 close_enter_dir(&ff);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
407 DEBUG_RET();
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
408 }
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
409
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
410
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 33
diff changeset
411
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
412 int main(int argc, char* const* argv) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
413 pst_item *item = NULL;
186
0a4f7ecd7452 more cleanup of external names in the shared library
Carl Byington <carl@five-ten-sg.com>
parents: 182
diff changeset
414 pst_desc_tree *d_ptr;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
415 char * fname = NULL;
48
f66078abed38 more fixes for 64 bit format
carl
parents: 46
diff changeset
416 char *d_log = NULL;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
417 int c,x;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
418 char *temp = NULL; //temporary char pointer
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
419 prog_name = argv[0];
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
420
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
421 time_t now = time(NULL);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
422 srand((unsigned)now);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
423
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
424 if (regcomp(&meta_charset_pattern, "<meta[^>]*content=\"[^>]*charset=([^>\";]*)[\";]", REG_ICASE | REG_EXTENDED)) {
123
ab2a11e72250 more cleanup of #include files.
Carl Byington <carl@five-ten-sg.com>
parents: 122
diff changeset
425 printf("cannot compile regex pattern to find content charset in html bodies\n");
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
426 exit(3);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
427 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
428
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
429 // command-line option handling
350
7a91e30826d8 Hans Liss - debug level output
Carl Byington <carl@five-ten-sg.com>
parents: 349
diff changeset
430 while ((c = getopt(argc, argv, "a:bC:c:Dd:emhj:kMo:qrSt:uVwL:8"))!= -1) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
431 switch (c) {
328
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
432 case 'a':
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
433 if (optarg) {
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
434 int n = strlen(optarg);
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
435 acceptable_extensions = (char*)pst_malloc(n+2);
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
436 strcpy(acceptable_extensions, optarg);
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
437 acceptable_extensions[n+1] = '\0'; // double null terminates array of non-empty null terminated strings.
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
438 char *p = acceptable_extensions;
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
439 while (*p) {
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
440 if (*p == ',') *p = '\0';
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
441 p++;
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
442 }
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
443 }
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
444 break;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
445 case 'b':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
446 save_rtf_body = 0;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
447 break;
298
201464dd356e add default character set for items where the pst file does not specify a character set
Carl Byington <carl@five-ten-sg.com>
parents: 297
diff changeset
448 case 'C':
201464dd356e add default character set for items where the pst file does not specify a character set
Carl Byington <carl@five-ten-sg.com>
parents: 297
diff changeset
449 if (optarg) {
201464dd356e add default character set for items where the pst file does not specify a character set
Carl Byington <carl@five-ten-sg.com>
parents: 297
diff changeset
450 default_charset = optarg;
201464dd356e add default character set for items where the pst file does not specify a character set
Carl Byington <carl@five-ten-sg.com>
parents: 297
diff changeset
451 }
201464dd356e add default character set for items where the pst file does not specify a character set
Carl Byington <carl@five-ten-sg.com>
parents: 297
diff changeset
452 else {
201464dd356e add default character set for items where the pst file does not specify a character set
Carl Byington <carl@five-ten-sg.com>
parents: 297
diff changeset
453 usage();
201464dd356e add default character set for items where the pst file does not specify a character set
Carl Byington <carl@five-ten-sg.com>
parents: 297
diff changeset
454 exit(0);
201464dd356e add default character set for items where the pst file does not specify a character set
Carl Byington <carl@five-ten-sg.com>
parents: 297
diff changeset
455 }
201464dd356e add default character set for items where the pst file does not specify a character set
Carl Byington <carl@five-ten-sg.com>
parents: 297
diff changeset
456 break;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
457 case 'c':
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
458 if (optarg && optarg[0]=='v') {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
459 contact_mode=CMODE_VCARD;
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
460 contact_mode_specified = 1;
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
461 }
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
462 else if (optarg && optarg[0]=='l') {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
463 contact_mode=CMODE_LIST;
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
464 contact_mode_specified = 1;
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
465 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
466 else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
467 usage();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
468 exit(0);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
469 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
470 break;
100
1e4a7610d525 fixes from Justin Greer to add -D option to include deleted items, to add missing email headers, to fix bug in my_stristr()
Carl Byington <carl@five-ten-sg.com>
parents: 79
diff changeset
471 case 'D':
1e4a7610d525 fixes from Justin Greer to add -D option to include deleted items, to add missing email headers, to fix bug in my_stristr()
Carl Byington <carl@five-ten-sg.com>
parents: 79
diff changeset
472 deleted_mode = DMODE_INCLUDE;
1e4a7610d525 fixes from Justin Greer to add -D option to include deleted items, to add missing email headers, to fix bug in my_stristr()
Carl Byington <carl@five-ten-sg.com>
parents: 79
diff changeset
473 break;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
474 case 'd':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
475 d_log = optarg;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
476 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
477 case 'h':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
478 usage();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
479 exit(0);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
480 break;
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
481 case 'j':
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
482 max_children = atoi(optarg);
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
483 max_child_specified = 1;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
484 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
485 case 'k':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
486 mode = MODE_KMAIL;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
487 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
488 case 'M':
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
489 mode = MODE_SEPARATE;
308
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
490 mode_MH = 1;
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
491 mode_EX = 0;
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
492 mode_MSG = 0;
239
aa50c23a6935 patch from Lee Ayres to add file name extensions in separate mode; allow mixed items types in a folder in separate mode
Carl Byington <carl@five-ten-sg.com>
parents: 238
diff changeset
493 break;
aa50c23a6935 patch from Lee Ayres to add file name extensions in separate mode; allow mixed items types in a folder in separate mode
Carl Byington <carl@five-ten-sg.com>
parents: 238
diff changeset
494 case 'e':
aa50c23a6935 patch from Lee Ayres to add file name extensions in separate mode; allow mixed items types in a folder in separate mode
Carl Byington <carl@five-ten-sg.com>
parents: 238
diff changeset
495 mode = MODE_SEPARATE;
308
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
496 mode_MH = 1;
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
497 mode_EX = 1;
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
498 mode_MSG = 0;
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
499 file_name_len = 14;
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
500 break;
350
7a91e30826d8 Hans Liss - debug level output
Carl Byington <carl@five-ten-sg.com>
parents: 349
diff changeset
501 case 'L':
7a91e30826d8 Hans Liss - debug level output
Carl Byington <carl@five-ten-sg.com>
parents: 349
diff changeset
502 pst_debug_setlevel(atoi(optarg));
7a91e30826d8 Hans Liss - debug level output
Carl Byington <carl@five-ten-sg.com>
parents: 349
diff changeset
503 break;
308
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
504 case 'm':
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
505 mode = MODE_SEPARATE;
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
506 mode_MH = 1;
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
507 mode_EX = 1;
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
508 mode_MSG = 1;
239
aa50c23a6935 patch from Lee Ayres to add file name extensions in separate mode; allow mixed items types in a folder in separate mode
Carl Byington <carl@five-ten-sg.com>
parents: 238
diff changeset
509 file_name_len = 14;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
510 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
511 case 'o':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
512 output_dir = optarg;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
513 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
514 case 'q':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
515 output_mode = OUTPUT_QUIET;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
516 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
517 case 'r':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
518 mode = MODE_RECURSE;
231
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
519 mode_thunder = 0;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
520 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
521 case 'S':
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
522 mode = MODE_SEPARATE;
308
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
523 mode_MH = 0;
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
524 mode_EX = 0;
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
525 mode_MSG = 0;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
526 break;
230
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
527 case 't':
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
528 // email, appointment, contact, other
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
529 if (!optarg) {
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
530 usage();
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
531 exit(0);
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
532 }
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
533 temp = optarg;
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
534 output_type_mode = 0;
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
535 while (*temp > 0) {
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
536 switch (temp[0]) {
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
537 case 'e':
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
538 output_type_mode |= OTMODE_EMAIL;
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
539 break;
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
540 case 'a':
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
541 output_type_mode |= OTMODE_APPOINTMENT;
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
542 break;
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
543 case 'j':
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
544 output_type_mode |= OTMODE_JOURNAL;
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
545 break;
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
546 case 'c':
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
547 output_type_mode |= OTMODE_CONTACT;
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
548 break;
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
549 default:
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
550 usage();
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
551 exit(0);
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
552 break;
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
553 }
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
554 temp++;
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
555 }
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
556 break;
231
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
557 case 'u':
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
558 mode = MODE_RECURSE;
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
559 mode_thunder = 1;
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
560 break;
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
561 case 'V':
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
562 version();
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
563 exit(0);
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
564 break;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
565 case 'w':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
566 overwrite = 1;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
567 break;
345
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
568 case '8':
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
569 prefer_utf8 = 1;
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
570 break;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
571 default:
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
572 usage();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
573 exit(1);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
574 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
575 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
576 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
577
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
578 if (argc > optind) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
579 fname = argv[optind];
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
580 } else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
581 usage();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
582 exit(2);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
583 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
584
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
585 #ifdef _SC_NPROCESSORS_ONLN
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
586 number_processors = sysconf(_SC_NPROCESSORS_ONLN);
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
587 #endif
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
588 max_children = (max_child_specified) ? max_children : number_processors * 4;
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
589 active_children = 0;
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
590 child_processes = (pid_t *)pst_malloc(sizeof(pid_t) * max_children);
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
591 memset(child_processes, 0, sizeof(pid_t) * max_children);
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
592
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
593 #ifdef HAVE_SEMAPHORE_H
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
594 if (max_children) {
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
595 shared_memory_id = shmget(IPC_PRIVATE, sizeof(sem_t)*2, 0777);
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
596 if (shared_memory_id >= 0) {
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
597 global_children = (sem_t *)shmat(shared_memory_id, NULL, 0);
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
598 if (global_children == (sem_t *)-1) global_children = NULL;
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
599 if (global_children) {
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
600 output_mutex = &(global_children[1]);
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
601 sem_init(global_children, 1, max_children);
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
602 sem_init(output_mutex, 1, 1);
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
603 }
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
604 shmctl(shared_memory_id, IPC_RMID, NULL);
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
605 }
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
606 }
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
607 #endif
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
608
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
609 #ifdef DEBUG_ALL
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
610 // force a log file
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
611 if (!d_log) d_log = "readpst.log";
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
612 #endif // defined DEBUG_ALL
212
8e17efed33c1 patch from Fridrich Strba to build on win32
Carl Byington <carl@five-ten-sg.com>
parents: 211
diff changeset
613 #ifdef HAVE_SEMAPHORE_H
8e17efed33c1 patch from Fridrich Strba to build on win32
Carl Byington <carl@five-ten-sg.com>
parents: 211
diff changeset
614 DEBUG_INIT(d_log, output_mutex);
8e17efed33c1 patch from Fridrich Strba to build on win32
Carl Byington <carl@five-ten-sg.com>
parents: 211
diff changeset
615 #else
8e17efed33c1 patch from Fridrich Strba to build on win32
Carl Byington <carl@five-ten-sg.com>
parents: 211
diff changeset
616 DEBUG_INIT(d_log, NULL);
8e17efed33c1 patch from Fridrich Strba to build on win32
Carl Byington <carl@five-ten-sg.com>
parents: 211
diff changeset
617 #endif
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
618 DEBUG_ENT("main");
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
619
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
620 if (output_mode != OUTPUT_QUIET) printf("Opening PST file and indexes...\n");
298
201464dd356e add default character set for items where the pst file does not specify a character set
Carl Byington <carl@five-ten-sg.com>
parents: 297
diff changeset
621 RET_DERROR(pst_open(&pstfile, fname, default_charset), 1, ("Error opening File\n"));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
622 RET_DERROR(pst_load_index(&pstfile), 2, ("Index Error\n"));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
623
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
624 pst_load_extended_attributes(&pstfile);
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
625
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
626 if (chdir(output_dir)) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
627 x = errno;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
628 pst_close(&pstfile);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
629 DEBUG_RET();
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
630 DIE(("Cannot change to output dir %s: %s\n", output_dir, strerror(x)));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
631 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
632
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
633 d_ptr = pstfile.d_head; // first record is main record
143
fdc58ad2c758 fix embedded rfc822 messages with attachments
Carl Byington <carl@five-ten-sg.com>
parents: 142
diff changeset
634 item = pst_parse_item(&pstfile, d_ptr, NULL);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
635 if (!item || !item->message_store) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
636 DEBUG_RET();
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
637 DIE(("Could not get root record\n"));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
638 }
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
639
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
640 // default the file_as to the same as the main filename if it doesn't exist
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
641 if (!item->file_as.str) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
642 if (!(temp = strrchr(fname, '/')))
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
643 if (!(temp = strrchr(fname, '\\')))
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
644 temp = fname;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
645 else
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
646 temp++; // get past the "\\"
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
647 else
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
648 temp++; // get past the "/"
172
6954d315aaa8 move version-info into main configure.in, and set it properly.
Carl Byington <carl@five-ten-sg.com>
parents: 171
diff changeset
649 item->file_as.str = (char*)pst_malloc(strlen(temp)+1);
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
650 strcpy(item->file_as.str, temp);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
651 item->file_as.is_utf8 = 1;
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
652 DEBUG_INFO(("file_as was blank, so am using %s\n", item->file_as.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
653 }
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
654 DEBUG_INFO(("Root Folder Name: %s\n", item->file_as.str));
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
655
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
656 d_ptr = pst_getTopOfFolders(&pstfile, item);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
657 if (!d_ptr) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
658 DEBUG_RET();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
659 DIE(("Top of folders record not found. Cannot continue\n"));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
660 }
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
661
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
662 process(item, d_ptr->child); // do the children of TOPF
200
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
663 grim_reaper(1); // wait for all child processes
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
664
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
665 pst_freeItem(item);
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
666 pst_close(&pstfile);
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
667 DEBUG_RET();
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
668
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
669 #ifdef HAVE_SEMAPHORE_H
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
670 if (global_children) {
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
671 sem_destroy(global_children);
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
672 sem_destroy(output_mutex);
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
673 shmdt(global_children);
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
674 }
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
675 #endif
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
676
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
677 regfree(&meta_charset_pattern);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
678 return 0;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
679 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
680
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
681
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
682 void write_email_body(FILE *f, char *body) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
683 char *n = body;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
684 DEBUG_ENT("write_email_body");
254
fb66d428347d switch to mboxrd quoting
Carl Byington <carl@five-ten-sg.com>
parents: 247
diff changeset
685 if (mode != MODE_SEPARATE) {
fb66d428347d switch to mboxrd quoting
Carl Byington <carl@five-ten-sg.com>
parents: 247
diff changeset
686 while (n) {
fb66d428347d switch to mboxrd quoting
Carl Byington <carl@five-ten-sg.com>
parents: 247
diff changeset
687 char *p = body;
fb66d428347d switch to mboxrd quoting
Carl Byington <carl@five-ten-sg.com>
parents: 247
diff changeset
688 while (*p == '>') p++;
fb66d428347d switch to mboxrd quoting
Carl Byington <carl@five-ten-sg.com>
parents: 247
diff changeset
689 if (strncmp(p, "From ", 5) == 0) fprintf(f, ">");
fb66d428347d switch to mboxrd quoting
Carl Byington <carl@five-ten-sg.com>
parents: 247
diff changeset
690 if ((n = strchr(body, '\n'))) {
fb66d428347d switch to mboxrd quoting
Carl Byington <carl@five-ten-sg.com>
parents: 247
diff changeset
691 n++;
fb66d428347d switch to mboxrd quoting
Carl Byington <carl@five-ten-sg.com>
parents: 247
diff changeset
692 pst_fwrite(body, n-body, 1, f); //write just a line
fb66d428347d switch to mboxrd quoting
Carl Byington <carl@five-ten-sg.com>
parents: 247
diff changeset
693 body = n;
fb66d428347d switch to mboxrd quoting
Carl Byington <carl@five-ten-sg.com>
parents: 247
diff changeset
694 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
695 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
696 }
73
3cb02cb1e6cd Patch from Robert Simpson to fix doubly-linked list in the cache_ptr code, and allow arrays of unicode strings (without converting them).
Carl Byington <carl@five-ten-sg.com>
parents: 70
diff changeset
697 pst_fwrite(body, strlen(body), 1, f);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
698 DEBUG_RET();
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
699 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
700
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
701
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
702 void removeCR (char *c) {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
703 // converts \r\n to \n
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
704 char *a, *b;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
705 DEBUG_ENT("removeCR");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
706 a = b = c;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
707 while (*a != '\0') {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
708 *b = *a;
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
709 if (*a != '\r') b++;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
710 a++;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
711 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
712 *b = '\0';
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
713 DEBUG_RET();
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
714 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
715
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
716
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
717 void usage() {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
718 DEBUG_ENT("usage");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
719 version();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
720 printf("Usage: %s [OPTIONS] {PST FILENAME}\n", prog_name);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
721 printf("OPTIONS:\n");
104
39ba19372732 many fixes in pst2ldif by Robert Harris
Carl Byington <carl@five-ten-sg.com>
parents: 100
diff changeset
722 printf("\t-V\t- Version. Display program version\n");
304
5338d93889aa preserve bcc headers, document -C switch to set default character set, space after colon is not required in header fields
Carl Byington <carl@five-ten-sg.com>
parents: 300
diff changeset
723 printf("\t-C charset\t- character set for items with an unspecified character set\n");
100
1e4a7610d525 fixes from Justin Greer to add -D option to include deleted items, to add missing email headers, to fix bug in my_stristr()
Carl Byington <carl@five-ten-sg.com>
parents: 79
diff changeset
724 printf("\t-D\t- Include deleted items in output\n");
350
7a91e30826d8 Hans Liss - debug level output
Carl Byington <carl@five-ten-sg.com>
parents: 349
diff changeset
725 printf("\t-L <level> \t- Set debug level; 1=debug,2=info,3=warn.\n");
239
aa50c23a6935 patch from Lee Ayres to add file name extensions in separate mode; allow mixed items types in a folder in separate mode
Carl Byington <carl@five-ten-sg.com>
parents: 238
diff changeset
726 printf("\t-M\t- Write emails in the MH (rfc822) format\n");
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
727 printf("\t-S\t- Separate. Write emails in the separate format\n");
328
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
728 printf("\t-a <attachment-extension-list>\t- Discard any attachment without an extension on the list\n");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
729 printf("\t-b\t- Don't save RTF-Body attachments\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
730 printf("\t-c[v|l]\t- Set the Contact output mode. -cv = VCard, -cl = EMail list\n");
238
410b6422d65b fix --help usage; readpstlog is gone
Carl Byington <carl@five-ten-sg.com>
parents: 236
diff changeset
731 printf("\t-d <filename> \t- Debug to file.\n");
239
aa50c23a6935 patch from Lee Ayres to add file name extensions in separate mode; allow mixed items types in a folder in separate mode
Carl Byington <carl@five-ten-sg.com>
parents: 238
diff changeset
732 printf("\t-e\t- As with -M, but include extensions on output files\n");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
733 printf("\t-h\t- Help. This screen\n");
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
734 printf("\t-j <integer>\t- Number of parallel jobs to run\n");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
735 printf("\t-k\t- KMail. Output in kmail format\n");
308
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
736 printf("\t-m\t- As with -e, but write .msg files also\n");
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
737 printf("\t-o <dirname>\t- Output directory to write files to. CWD is changed *after* opening pst file\n");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
738 printf("\t-q\t- Quiet. Only print error messages\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
739 printf("\t-r\t- Recursive. Output in a recursive format\n");
231
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
740 printf("\t-t[eajc]\t- Set the output type list. e = email, a = attachment, j = journal, c = contact\n");
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
741 printf("\t-u\t- Thunderbird mode. Write two extra .size and .type files\n");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
742 printf("\t-w\t- Overwrite any output mbox files\n");
345
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
743 printf("\t-8\t- Output bodies in UTF-8, rather than original encoding, if UTF-8 version is available\n");
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
744 printf("\n");
308
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
745 printf("Only one of -M -S -e -k -m -r should be specified\n");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
746 DEBUG_RET();
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
747 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
748
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
749
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
750 void version() {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
751 DEBUG_ENT("version");
50
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
752 printf("ReadPST / LibPST v%s\n", VERSION);
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
753 #if BYTE_ORDER == BIG_ENDIAN
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
754 printf("Big Endian implementation being used.\n");
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
755 #elif BYTE_ORDER == LITTLE_ENDIAN
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
756 printf("Little Endian implementation being used.\n");
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
757 #else
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
758 # error "Byte order not supported by this library"
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
759 #endif
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
760 DEBUG_RET();
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
761 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
762
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
763
367
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
764 void mk_kmail_dir(char *fname) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
765 //make a directory based on OUTPUT_KMAIL_DIR_TEMPLATE
367
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
766 //change to that directory
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
767 char *dir, *index;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
768 int x;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
769 DEBUG_ENT("mk_kmail_dir");
289
cc8ee701f190 pst_block_offset elements are unsigned; consistent usage of pst_malloc and pst_realloc
Carl Byington <carl@five-ten-sg.com>
parents: 288
diff changeset
770 dir = pst_malloc(strlen(fname)+strlen(OUTPUT_KMAIL_DIR_TEMPLATE)+1);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
771 sprintf(dir, OUTPUT_KMAIL_DIR_TEMPLATE, fname);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
772 check_filename(dir);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
773 if (D_MKDIR(dir)) {
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
774 if (errno != EEXIST) { // not an error because it exists
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
775 x = errno;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
776 DIE(("mk_kmail_dir: Cannot create directory %s: %s\n", dir, strerror(x)));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
777 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
778 }
367
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
779 if (chdir(dir)) {
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
780 x = errno;
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
781 DIE(("mk_kmail_dir: Cannot change to directory %s: %s\n", dir, strerror(x)));
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
782 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
783 free (dir);
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
784
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
785 //we should remove any existing indexes created by KMail, cause they might be different now
289
cc8ee701f190 pst_block_offset elements are unsigned; consistent usage of pst_malloc and pst_realloc
Carl Byington <carl@five-ten-sg.com>
parents: 288
diff changeset
786 index = pst_malloc(strlen(fname)+strlen(KMAIL_INDEX)+1);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
787 sprintf(index, KMAIL_INDEX, fname);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
788 unlink(index);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
789 free(index);
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
790
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
791 DEBUG_RET();
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
792 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
793
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
794
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
795 int close_kmail_dir() {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
796 int x;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
797 DEBUG_ENT("close_kmail_dir");
367
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
798 if (chdir("..")) {
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
799 x = errno;
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
800 DIE(("close_kmail_dir: Cannot move up dir (..): %s\n", strerror(x)));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
801 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
802 DEBUG_RET();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
803 return 0;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
804 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
805
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
806
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
807 char *item_type_to_name(int32_t item_type) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
808 char *name;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
809 switch (item_type) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
810 case PST_TYPE_APPOINTMENT:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
811 name = "calendar";
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
812 break;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
813 case PST_TYPE_CONTACT:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
814 name = "contacts";
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
815 break;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
816 case PST_TYPE_JOURNAL:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
817 name = "journal";
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
818 break;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
819 case PST_TYPE_STICKYNOTE:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
820 case PST_TYPE_TASK:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
821 case PST_TYPE_NOTE:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
822 case PST_TYPE_OTHER:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
823 case PST_TYPE_REPORT:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
824 default:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
825 name = "mbox";
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
826 break;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
827 }
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
828 return name;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
829 }
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
830
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
831
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
832 int32_t reduced_item_type(int32_t item_type) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
833 int32_t reduced;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
834 switch (item_type) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
835 case PST_TYPE_APPOINTMENT:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
836 case PST_TYPE_CONTACT:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
837 case PST_TYPE_JOURNAL:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
838 reduced = item_type;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
839 break;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
840 case PST_TYPE_STICKYNOTE:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
841 case PST_TYPE_TASK:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
842 case PST_TYPE_NOTE:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
843 case PST_TYPE_OTHER:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
844 case PST_TYPE_REPORT:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
845 default:
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
846 reduced = PST_TYPE_NOTE;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
847 break;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
848 }
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
849 return reduced;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
850 }
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
851
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
852
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
853 // this will create a directory by that name
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
854 void mk_recurse_dir(char *dir) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
855 int x;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
856 DEBUG_ENT("mk_recurse_dir");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
857 check_filename(dir);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
858 if (D_MKDIR (dir)) {
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
859 if (errno != EEXIST) { // not an error because it exists
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
860 x = errno;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
861 DIE(("mk_recurse_dir: Cannot create directory %s: %s\n", dir, strerror(x)));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
862 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
863 }
367
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
864 if (chdir(dir)) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
865 x = errno;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
866 DIE(("mk_recurse_dir: Cannot change to directory %s: %s\n", dir, strerror(x)));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
867 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
868 DEBUG_RET();
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
869 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
870
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
871
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
872 int close_recurse_dir() {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
873 int x;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
874 DEBUG_ENT("close_recurse_dir");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
875 if (chdir("..")) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
876 x = errno;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
877 DIE(("close_recurse_dir: Cannot go up dir (..): %s\n", strerror(x)));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
878 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
879 DEBUG_RET();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
880 return 0;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
881 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
882
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
883
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
884 void mk_separate_dir(char *dir) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
885 size_t dirsize = strlen(dir) + 10;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
886 char dir_name[dirsize];
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
887 int x = 0, y = 0;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
888
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
889 DEBUG_ENT("mk_separate_dir");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
890 do {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
891 if (y == 0)
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
892 snprintf(dir_name, dirsize, "%s", dir);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
893 else
257
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
894 snprintf(dir_name, dirsize, "%s" SEP_MAIL_FILE_TEMPLATE, dir, y, ""); // enough for 9 digits allocated above
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
895
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
896 check_filename(dir_name);
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
897 DEBUG_INFO(("about to try creating %s\n", dir_name));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
898 if (D_MKDIR(dir_name)) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
899 if (errno != EEXIST) { // if there is an error, and it doesn't already exist
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
900 x = errno;
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
901 DIE(("mk_separate_dir: Cannot create directory %s: %s\n", dir, strerror(x)));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
902 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
903 } else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
904 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
905 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
906 y++;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
907 } while (overwrite == 0);
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
908
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
909 if (chdir(dir_name)) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
910 x = errno;
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
911 DIE(("mk_separate_dir: Cannot change to directory %s: %s\n", dir, strerror(x)));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
912 }
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
913
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
914 if (overwrite) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
915 // we should probably delete all files from this directory
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
916 #if !defined(WIN32) && !defined(__CYGWIN__)
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
917 DIR * sdir = NULL;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
918 struct dirent *dirent = NULL;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
919 struct stat filestat;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
920 if (!(sdir = opendir("./"))) {
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
921 DEBUG_WARN(("mk_separate_dir: Cannot open dir \"%s\" for deletion of old contents\n", "./"));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
922 } else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
923 while ((dirent = readdir(sdir))) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
924 if (lstat(dirent->d_name, &filestat) != -1)
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
925 if (S_ISREG(filestat.st_mode)) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
926 if (unlink(dirent->d_name)) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
927 y = errno;
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
928 DIE(("mk_separate_dir: unlink returned error on file %s: %s\n", dirent->d_name, strerror(y)));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
929 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
930 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
931 }
344
aedcf979f439 fix unchecked errors found by cppcheck
Carl Byington <carl@five-ten-sg.com>
parents: 328
diff changeset
932 closedir(sdir); // cppcheck detected leak
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
933 }
26
9eeba3f4ca4b more cleanup from Arne
carl
parents: 25
diff changeset
934 #endif
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
935 }
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
936
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
937 DEBUG_RET();
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
938 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
939
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
940
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
941 int close_separate_dir() {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
942 int x;
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
943 DEBUG_ENT("close_separate_dir");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
944 if (chdir("..")) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
945 x = errno;
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
946 DIE(("close_separate_dir: Cannot go up dir (..): %s\n", strerror(x)));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
947 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
948 DEBUG_RET();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
949 return 0;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
950 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
951
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
952
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
953 void mk_separate_file(struct file_ll *f, int32_t t, char *extension, int openit) {
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
954 DEBUG_ENT("mk_separate_file");
367
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
955 DEBUG_INFO(("opening next file to save email type %s\n", item_type_to_name(t)));
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
956 if (f->item_count > 999999999) { // bigger than nine 9's
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
957 DIE(("mk_separate_file: The number of emails in this folder has become too high to handle\n"));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
958 }
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
959 sprintf(f->name[t], SEP_MAIL_FILE_TEMPLATE, f->item_count, extension);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
960 check_filename(f->name[t]);
308
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
961 if (openit) {
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
962 if (!(f->output[t] = fopen(f->name[t], "w"))) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
963 DIE(("mk_separate_file: Cannot open file to save email \"%s\"\n", f->name[t]));
308
97c53c6868ab add -m option to readpst to create Outlook .msg files
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
964 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
965 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
966 DEBUG_RET();
291
bc23fba0da8e possible fix for corrupted output forking for separate messages
Carl Byington <carl@five-ten-sg.com>
parents: 290
diff changeset
967 }
bc23fba0da8e possible fix for corrupted output forking for separate messages
Carl Byington <carl@five-ten-sg.com>
parents: 290
diff changeset
968
bc23fba0da8e possible fix for corrupted output forking for separate messages
Carl Byington <carl@five-ten-sg.com>
parents: 290
diff changeset
969
bc23fba0da8e possible fix for corrupted output forking for separate messages
Carl Byington <carl@five-ten-sg.com>
parents: 290
diff changeset
970 void close_separate_file(struct file_ll *f) {
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
971 int32_t t;
291
bc23fba0da8e possible fix for corrupted output forking for separate messages
Carl Byington <carl@five-ten-sg.com>
parents: 290
diff changeset
972 DEBUG_ENT("close_separate_file");
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
973 for (t=0; t<PST_TYPE_MAX; t++) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
974 if (f->output[t]) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
975 struct stat st;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
976 fclose(f->output[t]);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
977 stat(f->name[t], &st);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
978 if (!st.st_size) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
979 DEBUG_WARN(("removing empty output file %s\n", f->name[t]));
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
980 remove(f->name[t]);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
981 }
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
982 f->output[t] = NULL;
291
bc23fba0da8e possible fix for corrupted output forking for separate messages
Carl Byington <carl@five-ten-sg.com>
parents: 290
diff changeset
983 }
bc23fba0da8e possible fix for corrupted output forking for separate messages
Carl Byington <carl@five-ten-sg.com>
parents: 290
diff changeset
984 }
bc23fba0da8e possible fix for corrupted output forking for separate messages
Carl Byington <carl@five-ten-sg.com>
parents: 290
diff changeset
985 DEBUG_RET();
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
986 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
987
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
988
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
989 char *my_stristr(char *haystack, char *needle) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
990 // my_stristr varies from strstr in that its searches are case-insensitive
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
991 char *x=haystack, *y=needle, *z = NULL;
52
034641c26ab9 code cleanup
carl
parents: 50
diff changeset
992 if (!haystack || !needle) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
993 return NULL;
52
034641c26ab9 code cleanup
carl
parents: 50
diff changeset
994 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
995 while (*y != '\0' && *x != '\0') {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
996 if (tolower(*y) == tolower(*x)) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
997 // move y on one
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
998 y++;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
999 if (!z) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1000 z = x; // store first position in haystack where a match is made
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1001 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1002 } else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1003 y = needle; // reset y to the beginning of the needle
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1004 z = NULL; // reset the haystack storage point
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1005 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1006 x++; // advance the search in the haystack
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1007 }
100
1e4a7610d525 fixes from Justin Greer to add -D option to include deleted items, to add missing email headers, to fix bug in my_stristr()
Carl Byington <carl@five-ten-sg.com>
parents: 79
diff changeset
1008 // If the haystack ended before our search finished, it's not a match.
1e4a7610d525 fixes from Justin Greer to add -D option to include deleted items, to add missing email headers, to fix bug in my_stristr()
Carl Byington <carl@five-ten-sg.com>
parents: 79
diff changeset
1009 if (*y != '\0') return NULL;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1010 return z;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
1011 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1012
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1013
41
183ae993b9ad security fix for potential buffer overrun in lz decompress
carl
parents: 39
diff changeset
1014 void check_filename(char *fname) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1015 char *t = fname;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1016 DEBUG_ENT("check_filename");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1017 if (!t) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1018 DEBUG_RET();
52
034641c26ab9 code cleanup
carl
parents: 50
diff changeset
1019 return;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1020 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1021 while ((t = strpbrk(t, "/\\:"))) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1022 // while there are characters in the second string that we don't want
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1023 *t = '_'; //replace them with an underscore
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1024 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1025 DEBUG_RET();
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
1026 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1027
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1028
328
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1029 /**
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1030 * check if the file name extension is acceptable. If not, the attachment
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1031 * will be discarded
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1032 * @param attach pst attachment object
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1033 * @return true if the attachment filename contains an extension that we want.
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1034 */
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1035 int acceptable_ext(pst_item_attach* attach)
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1036 {
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1037 if (!acceptable_extensions || *acceptable_extensions == '\0') return 1; // acceptable list missing or empty
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1038 char *attach_filename = (attach->filename2.str) ? attach->filename2.str
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1039 : attach->filename1.str;
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1040 if (!attach_filename) return 1; // attachment with no name is always acceptable
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1041 char *e = strrchr(attach_filename, '.');
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1042 if (!e) return 1; // attachment with no extension is always acceptable.
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1043 DEBUG_ENT("acceptable_ext");
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1044 DEBUG_INFO(("attachment extension %s\n", e));
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1045 int rc = 0;
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1046 char *a = acceptable_extensions;
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1047 while (*a) {
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1048 if (pst_stricmp(a, e) == 0) {
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1049 rc = 1;
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1050 break;
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1051 }
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1052 a += strlen(a) + 1;
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1053 }
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1054 DEBUG_INFO(("attachment acceptable returns %d\n", rc));
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1055 DEBUG_RET();
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1056 return rc;
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1057 }
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1058
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1059
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1060 void write_separate_attachment(char f_name[], pst_item_attach* attach, int attach_num, pst_file* pst)
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1061 {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1062 FILE *fp = NULL;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1063 int x = 0;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1064 char *temp = NULL;
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1065
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1066 // If there is a long filename (filename2) use that, otherwise
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1067 // use the 8.3 filename (filename1)
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1068 char *attach_filename = (attach->filename2.str) ? attach->filename2.str
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1069 : attach->filename1.str;
46
b2a7f2e0926a more fixes for 64 bit format
carl
parents: 45
diff changeset
1070 DEBUG_ENT("write_separate_attachment");
266
3f323c867cb4 adding more debug code
Carl Byington <carl@five-ten-sg.com>
parents: 264
diff changeset
1071 DEBUG_INFO(("Attachment %s Size is %#"PRIx64", data = %#"PRIxPTR", id %#"PRIx64"\n", attach_filename, (uint64_t)attach->data.size, attach->data.data, attach->i_id));
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1072
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
1073 if (!attach->data.data) {
164
ab384fed78c5 Compensate for iconv conversion to utf-7 that produces strings that are not null terminated.
Carl Byington <carl@five-ten-sg.com>
parents: 154
diff changeset
1074 // make sure we can fetch data from the id
ab384fed78c5 Compensate for iconv conversion to utf-7 that produces strings that are not null terminated.
Carl Byington <carl@five-ten-sg.com>
parents: 154
diff changeset
1075 pst_index_ll *ptr = pst_getID(pst, attach->i_id);
ab384fed78c5 Compensate for iconv conversion to utf-7 that produces strings that are not null terminated.
Carl Byington <carl@five-ten-sg.com>
parents: 154
diff changeset
1076 if (!ptr) {
ab384fed78c5 Compensate for iconv conversion to utf-7 that produces strings that are not null terminated.
Carl Byington <carl@five-ten-sg.com>
parents: 154
diff changeset
1077 DEBUG_WARN(("Couldn't find i_id %#"PRIx64". Cannot save attachment to file\n", attach->i_id));
ab384fed78c5 Compensate for iconv conversion to utf-7 that produces strings that are not null terminated.
Carl Byington <carl@five-ten-sg.com>
parents: 154
diff changeset
1078 DEBUG_RET();
ab384fed78c5 Compensate for iconv conversion to utf-7 that produces strings that are not null terminated.
Carl Byington <carl@five-ten-sg.com>
parents: 154
diff changeset
1079 return;
ab384fed78c5 Compensate for iconv conversion to utf-7 that produces strings that are not null terminated.
Carl Byington <carl@five-ten-sg.com>
parents: 154
diff changeset
1080 }
ab384fed78c5 Compensate for iconv conversion to utf-7 that produces strings that are not null terminated.
Carl Byington <carl@five-ten-sg.com>
parents: 154
diff changeset
1081 }
ab384fed78c5 Compensate for iconv conversion to utf-7 that produces strings that are not null terminated.
Carl Byington <carl@five-ten-sg.com>
parents: 154
diff changeset
1082
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1083 check_filename(f_name);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1084 if (!attach_filename) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1085 // generate our own (dummy) filename for the attachement
172
6954d315aaa8 move version-info into main configure.in, and set it properly.
Carl Byington <carl@five-ten-sg.com>
parents: 171
diff changeset
1086 temp = pst_malloc(strlen(f_name)+15);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1087 sprintf(temp, "%s-attach%i", f_name, attach_num);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1088 } else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1089 // have an attachment name, make sure it's unique
172
6954d315aaa8 move version-info into main configure.in, and set it properly.
Carl Byington <carl@five-ten-sg.com>
parents: 171
diff changeset
1090 temp = pst_malloc(strlen(f_name)+strlen(attach_filename)+15);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1091 do {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1092 if (fp) fclose(fp);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1093 if (x == 0)
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1094 sprintf(temp, "%s-%s", f_name, attach_filename);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1095 else
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1096 sprintf(temp, "%s-%s-%i", f_name, attach_filename, x);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1097 } while ((fp = fopen(temp, "r")) && ++x < 99999999);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1098 if (x > 99999999) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1099 DIE(("error finding attachment name. exhausted possibilities to %s\n", temp));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1100 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1101 }
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
1102 DEBUG_INFO(("Saving attachment to %s\n", temp));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1103 if (!(fp = fopen(temp, "w"))) {
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
1104 DEBUG_WARN(("write_separate_attachment: Cannot open attachment save file \"%s\"\n", temp));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1105 } else {
195
320cfcba8058 add python module interface to the shared library for easy scripting.
Carl Byington <carl@five-ten-sg.com>
parents: 191
diff changeset
1106 (void)pst_attach_to_file(pst, attach, fp);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1107 fclose(fp);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1108 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1109 if (temp) free(temp);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1110 DEBUG_RET();
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1111 }
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1112
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1113
300
47abe56076da embedded rfc822 messages might contain rtf encoded bodies
Carl Byington <carl@five-ten-sg.com>
parents: 298
diff changeset
1114 void write_embedded_message(FILE* f_output, pst_item_attach* attach, char *boundary, pst_file* pf, int save_rtf, char** extra_mime_headers)
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1115 {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1116 pst_index_ll *ptr;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1117 DEBUG_ENT("write_embedded_message");
164
ab384fed78c5 Compensate for iconv conversion to utf-7 that produces strings that are not null terminated.
Carl Byington <carl@five-ten-sg.com>
parents: 154
diff changeset
1118 ptr = pst_getID(pf, attach->i_id);
143
fdc58ad2c758 fix embedded rfc822 messages with attachments
Carl Byington <carl@five-ten-sg.com>
parents: 142
diff changeset
1119
186
0a4f7ecd7452 more cleanup of external names in the shared library
Carl Byington <carl@five-ten-sg.com>
parents: 182
diff changeset
1120 pst_desc_tree d_ptr;
150
06aa84023b48 rename some structure fields to reflect our better understanding of the pst format
Carl Byington <carl@five-ten-sg.com>
parents: 146
diff changeset
1121 d_ptr.d_id = 0;
06aa84023b48 rename some structure fields to reflect our better understanding of the pst format
Carl Byington <carl@five-ten-sg.com>
parents: 146
diff changeset
1122 d_ptr.parent_d_id = 0;
06aa84023b48 rename some structure fields to reflect our better understanding of the pst format
Carl Byington <carl@five-ten-sg.com>
parents: 146
diff changeset
1123 d_ptr.assoc_tree = NULL;
06aa84023b48 rename some structure fields to reflect our better understanding of the pst format
Carl Byington <carl@five-ten-sg.com>
parents: 146
diff changeset
1124 d_ptr.desc = ptr;
06aa84023b48 rename some structure fields to reflect our better understanding of the pst format
Carl Byington <carl@five-ten-sg.com>
parents: 146
diff changeset
1125 d_ptr.no_child = 0;
06aa84023b48 rename some structure fields to reflect our better understanding of the pst format
Carl Byington <carl@five-ten-sg.com>
parents: 146
diff changeset
1126 d_ptr.prev = NULL;
06aa84023b48 rename some structure fields to reflect our better understanding of the pst format
Carl Byington <carl@five-ten-sg.com>
parents: 146
diff changeset
1127 d_ptr.next = NULL;
06aa84023b48 rename some structure fields to reflect our better understanding of the pst format
Carl Byington <carl@five-ten-sg.com>
parents: 146
diff changeset
1128 d_ptr.parent = NULL;
06aa84023b48 rename some structure fields to reflect our better understanding of the pst format
Carl Byington <carl@five-ten-sg.com>
parents: 146
diff changeset
1129 d_ptr.child = NULL;
06aa84023b48 rename some structure fields to reflect our better understanding of the pst format
Carl Byington <carl@five-ten-sg.com>
parents: 146
diff changeset
1130 d_ptr.child_tail = NULL;
143
fdc58ad2c758 fix embedded rfc822 messages with attachments
Carl Byington <carl@five-ten-sg.com>
parents: 142
diff changeset
1131
fdc58ad2c758 fix embedded rfc822 messages with attachments
Carl Byington <carl@five-ten-sg.com>
parents: 142
diff changeset
1132 pst_item *item = pst_parse_item(pf, &d_ptr, attach->id2_head);
231
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
1133 // It appears that if the embedded message contains an appointment/
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
1134 // calendar item, pst_parse_item returns NULL due to the presence of
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
1135 // an unexpected reference type of 0x1048, which seems to represent
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
1136 // an array of GUIDs representing a CLSID. It's likely that this is
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
1137 // a reference to an internal Outlook COM class.
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
1138 // Log the skipped item and continue on.
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
1139 if (!item) {
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
1140 DEBUG_WARN(("write_embedded_message: pst_parse_item was unable to parse the embedded message in attachment ID %llu", attach->i_id));
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
1141 } else {
255
ab87f9070ed2 fix to ignore embedded objects that are not email messages
Carl Byington <carl@five-ten-sg.com>
parents: 254
diff changeset
1142 if (!item->email) {
ab87f9070ed2 fix to ignore embedded objects that are not email messages
Carl Byington <carl@five-ten-sg.com>
parents: 254
diff changeset
1143 DEBUG_WARN(("write_embedded_message: pst_parse_item returned type %d, not an email message", item->type));
ab87f9070ed2 fix to ignore embedded objects that are not email messages
Carl Byington <carl@five-ten-sg.com>
parents: 254
diff changeset
1144 } else {
ab87f9070ed2 fix to ignore embedded objects that are not email messages
Carl Byington <carl@five-ten-sg.com>
parents: 254
diff changeset
1145 fprintf(f_output, "\n--%s\n", boundary);
ab87f9070ed2 fix to ignore embedded objects that are not email messages
Carl Byington <carl@five-ten-sg.com>
parents: 254
diff changeset
1146 fprintf(f_output, "Content-Type: %s\n\n", attach->mimetype.str);
323
2474d01043cd fix From quoting on embedded rfc/822 messages
Carl Byington <carl@five-ten-sg.com>
parents: 316
diff changeset
1147 write_normal_email(f_output, "", item, MODE_NORMAL, 0, pf, save_rtf, 1, extra_mime_headers);
255
ab87f9070ed2 fix to ignore embedded objects that are not email messages
Carl Byington <carl@five-ten-sg.com>
parents: 254
diff changeset
1148 }
231
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
1149 pst_freeItem(item);
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
1150 }
143
fdc58ad2c758 fix embedded rfc822 messages with attachments
Carl Byington <carl@five-ten-sg.com>
parents: 142
diff changeset
1151
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1152 DEBUG_RET();
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1153 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1154
373
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1155 /**
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1156 * Backslash-escape quotes and backslashes in the given string.
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1157 */
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1158 char *quote_string(char *inp) {
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1159 int i = 0;
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1160 int count = 0;
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1161 char *curr = inp;
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1162 while (*curr) {
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1163 if (*curr == '\"' || *curr == '\\') {
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1164 count++;
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1165 }
380
1e1970f93f94 allow all 7 days in bydays recurring appointment, update for fedora python packaging
Carl Byington <carl@five-ten-sg.com>
parents: 373
diff changeset
1166 curr++;
373
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1167 i++;
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1168 }
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1169 char *res = malloc(i + count + 1);
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1170 char *curr_in = inp;
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1171 char *curr_out = res;
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1172 while (*curr_in) {
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1173 if (*curr_in == '\"' || *curr_in == '\\') {
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1174 *curr_out++ = '\\';
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1175 }
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1176 *curr_out++ = *curr_in++;
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1177 }
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1178 *curr_out = '\0';
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1179 return res;
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1180 }
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1181
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1182 void write_inline_attachment(FILE* f_output, pst_item_attach* attach, char *boundary, pst_file* pst)
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1183 {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1184 DEBUG_ENT("write_inline_attachment");
266
3f323c867cb4 adding more debug code
Carl Byington <carl@five-ten-sg.com>
parents: 264
diff changeset
1185 DEBUG_INFO(("Attachment Size is %#"PRIx64", data = %#"PRIxPTR", id %#"PRIx64"\n", (uint64_t)attach->data.size, attach->data.data, attach->i_id));
195
320cfcba8058 add python module interface to the shared library for easy scripting.
Carl Byington <carl@five-ten-sg.com>
parents: 191
diff changeset
1186
320cfcba8058 add python module interface to the shared library for easy scripting.
Carl Byington <carl@five-ten-sg.com>
parents: 191
diff changeset
1187 if (!attach->data.data) {
142
2189a6b8134e improve character set handling - don't try to convert utf-8 to single byte for fields that were not originally unicode.
Carl Byington <carl@five-ten-sg.com>
parents: 141
diff changeset
1188 // make sure we can fetch data from the id
164
ab384fed78c5 Compensate for iconv conversion to utf-7 that produces strings that are not null terminated.
Carl Byington <carl@five-ten-sg.com>
parents: 154
diff changeset
1189 pst_index_ll *ptr = pst_getID(pst, attach->i_id);
142
2189a6b8134e improve character set handling - don't try to convert utf-8 to single byte for fields that were not originally unicode.
Carl Byington <carl@five-ten-sg.com>
parents: 141
diff changeset
1190 if (!ptr) {
2189a6b8134e improve character set handling - don't try to convert utf-8 to single byte for fields that were not originally unicode.
Carl Byington <carl@five-ten-sg.com>
parents: 141
diff changeset
1191 DEBUG_WARN(("Couldn't find ID pointer. Cannot save attachment to file\n"));
2189a6b8134e improve character set handling - don't try to convert utf-8 to single byte for fields that were not originally unicode.
Carl Byington <carl@five-ten-sg.com>
parents: 141
diff changeset
1192 DEBUG_RET();
2189a6b8134e improve character set handling - don't try to convert utf-8 to single byte for fields that were not originally unicode.
Carl Byington <carl@five-ten-sg.com>
parents: 141
diff changeset
1193 return;
2189a6b8134e improve character set handling - don't try to convert utf-8 to single byte for fields that were not originally unicode.
Carl Byington <carl@five-ten-sg.com>
parents: 141
diff changeset
1194 }
2189a6b8134e improve character set handling - don't try to convert utf-8 to single byte for fields that were not originally unicode.
Carl Byington <carl@five-ten-sg.com>
parents: 141
diff changeset
1195 }
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1196
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1197 fprintf(f_output, "\n--%s\n", boundary);
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1198 if (!attach->mimetype.str) {
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1199 fprintf(f_output, "Content-Type: %s\n", MIME_TYPE_DEFAULT);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1200 } else {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1201 fprintf(f_output, "Content-Type: %s\n", attach->mimetype.str);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1202 }
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1203 fprintf(f_output, "Content-Transfer-Encoding: base64\n");
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1204
352
09dd5299d91c Added Content-ID header support
Igor Stroh <igor.stroh@rulim.de>
parents: 350
diff changeset
1205 if (attach->content_id.str) {
354
843705c25b45 code cleanup; content-id in brackets
Carl Byington <carl@five-ten-sg.com>
parents: 352
diff changeset
1206 fprintf(f_output, "Content-ID: <%s>\n", attach->content_id.str);
352
09dd5299d91c Added Content-ID header support
Igor Stroh <igor.stroh@rulim.de>
parents: 350
diff changeset
1207 }
09dd5299d91c Added Content-ID header support
Igor Stroh <igor.stroh@rulim.de>
parents: 350
diff changeset
1208
257
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1209 if (attach->filename2.str) {
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1210 // use the long filename, converted to proper encoding if needed.
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1211 // it is already utf8
373
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1212 char *escaped = quote_string(attach->filename2.str);
257
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1213 pst_rfc2231(&attach->filename2);
373
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1214 fprintf(f_output, "Content-Disposition: attachment; \n filename*=%s;\n", attach->filename2.str);
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1215 // Also include the (escaped) utf8 filename in the 'filename' header directly - this is not strictly valid
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1216 // (since this header should be ASCII) but is almost always handled correctly (and in fact this is the only
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1217 // way to get MS Outlook to correctly read a UTF8 filename, AFAICT, which is why we're doing it).
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1218 fprintf(f_output, " filename=\"%s\"\n\n", escaped);
0ccc746c8079 Zachary Travis - Add support for the OST 2013 format, and Content-Disposition filename key fix for outlook compatibility
Carl Byington <carl@five-ten-sg.com>
parents: 367
diff changeset
1219 free(escaped);
257
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1220 }
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1221 else if (attach->filename1.str) {
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1222 // short filename never needs encoding
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1223 fprintf(f_output, "Content-Disposition: attachment; filename=\"%s\"\n\n", attach->filename1.str);
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1224 }
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1225 else {
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1226 // no filename is inline
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1227 fprintf(f_output, "Content-Disposition: inline\n\n");
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1228 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1229
195
320cfcba8058 add python module interface to the shared library for easy scripting.
Carl Byington <carl@five-ten-sg.com>
parents: 191
diff changeset
1230 (void)pst_attach_to_file_base64(pst, attach, f_output);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1231 fprintf(f_output, "\n\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1232 DEBUG_RET();
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1233 }
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1234
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1235
365
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1236 int header_match(char *header, char*field) {
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1237 int n = strlen(field);
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1238 if (strncasecmp(header, field, n) == 0) return 1; // tag:{space}
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1239 if ((field[n-1] == ' ') && (strncasecmp(header, field, n-1) == 0)) {
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1240 char *crlftab = "\r\n\t";
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1241 DEBUG_INFO(("Possible wrapped header = %s\n", header));
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1242 if (strncasecmp(header+n-1, crlftab, 3) == 0) return 1; // tag:{cr}{lf}{tab}
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1243 }
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1244 return 0;
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1245 }
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1246
277
86078d0c2e9c ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 276
diff changeset
1247 int valid_headers(char *header)
86078d0c2e9c ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 276
diff changeset
1248 {
86078d0c2e9c ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 276
diff changeset
1249 // headers are sometimes really bogus - they seem to be fragments of the
86078d0c2e9c ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 276
diff changeset
1250 // message body, so we only use them if they seem to be real rfc822 headers.
282
57c3bcf22c4f ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 281
diff changeset
1251 // this list is composed of ones that we have seen in real pst files.
57c3bcf22c4f ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 281
diff changeset
1252 // there are surely others. the problem is - given an arbitrary character
57c3bcf22c4f ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 281
diff changeset
1253 // string, is it a valid (or even reasonable) set of rfc822 headers?
278
06e723720db0 ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 277
diff changeset
1254 if (header) {
365
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1255 if (header_match(header, "Content-Type: " )) return 1;
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1256 if (header_match(header, "Date: " )) return 1;
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1257 if (header_match(header, "From: " )) return 1;
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1258 if (header_match(header, "MIME-Version: " )) return 1;
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1259 if (header_match(header, "Microsoft Mail Internet Headers")) return 1;
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1260 if (header_match(header, "Received: " )) return 1;
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1261 if (header_match(header, "Return-Path: " )) return 1;
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1262 if (header_match(header, "Subject: " )) return 1;
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1263 if (header_match(header, "To: " )) return 1;
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1264 if (header_match(header, "X-ASG-Debug-ID: " )) return 1;
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1265 if (header_match(header, "X-Barracuda-URL: " )) return 1;
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1266 if (header_match(header, "X-x: " )) return 1;
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1267 if (strlen(header) > 2) {
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1268 DEBUG_INFO(("Ignore bogus headers = %s\n", header));
278
06e723720db0 ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 277
diff changeset
1269 }
365
e4c414ff8fa2 allow first internet header to be wrapped
Carl Byington <carl@five-ten-sg.com>
parents: 363
diff changeset
1270 return 0;
277
86078d0c2e9c ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 276
diff changeset
1271 }
278
06e723720db0 ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 277
diff changeset
1272 else return 0;
277
86078d0c2e9c ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 276
diff changeset
1273 }
86078d0c2e9c ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 276
diff changeset
1274
86078d0c2e9c ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 276
diff changeset
1275
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1276 void header_has_field(char *header, char *field, int *flag)
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1277 {
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1278 DEBUG_ENT("header_has_field");
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1279 if (my_stristr(header, field) || (strncasecmp(header, field+1, strlen(field)-1) == 0)) {
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
1280 DEBUG_INFO(("header block has %s header\n", field+1));
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1281 *flag = 1;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1282 }
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1283 DEBUG_RET();
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1284 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1285
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1286
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1287 void header_get_subfield(char *field, const char *subfield, char *body_subfield, size_t size_subfield)
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1288 {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1289 if (!field) return;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1290 DEBUG_ENT("header_get_subfield");
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1291 char search[60];
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1292 snprintf(search, sizeof(search), " %s=", subfield);
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1293 field++;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1294 char *n = header_end_field(field);
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1295 char *s = my_stristr(field, search);
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1296 if (n && s && (s < n)) {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1297 char *e, *f, save;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1298 s += strlen(search); // skip over subfield=
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1299 if (*s == '"') {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1300 s++;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1301 e = strchr(s, '"');
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1302 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1303 else {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1304 e = strchr(s, ';');
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1305 f = strchr(s, '\n');
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1306 if (e && f && (f < e)) e = f;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1307 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1308 if (!e || (e > n)) e = n; // use the trailing lf as terminator if nothing better
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1309 save = *e;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1310 *e = '\0';
345
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1311 snprintf(body_subfield, size_subfield, "%s", s); // copy the subfield to our buffer
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1312 *e = save;
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
1313 DEBUG_INFO(("body %s %s from headers\n", subfield, body_subfield));
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1314 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1315 DEBUG_RET();
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1316 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1317
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1318 char* header_get_field(char *header, char *field)
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1319 {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1320 char *t = my_stristr(header, field);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1321 if (!t && (strncasecmp(header, field+1, strlen(field)-1) == 0)) t = header;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1322 return t;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1323 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1324
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1325
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1326 // return pointer to \n at the end of this header field,
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1327 // or NULL if this field goes to the end of the string.
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1328 char *header_end_field(char *field)
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1329 {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1330 char *e = strchr(field+1, '\n');
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1331 while (e && ((e[1] == ' ') || (e[1] == '\t'))) {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1332 e = strchr(e+1, '\n');
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1333 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1334 return e;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1335 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1336
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1337
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1338 void header_strip_field(char *header, char *field)
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1339 {
349
a57c15b3108a Jeffrey Morlan - fix multiple Content-Type headers
Carl Byington <carl@five-ten-sg.com>
parents: 345
diff changeset
1340 char *t;
a57c15b3108a Jeffrey Morlan - fix multiple Content-Type headers
Carl Byington <carl@five-ten-sg.com>
parents: 345
diff changeset
1341 while ((t = header_get_field(header, field))) {
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1342 char *e = header_end_field(t);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1343 if (e) {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1344 if (t == header) e++; // if *t is not \n, we don't want to keep the \n at *e either.
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1345 while (*e != '\0') {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1346 *t = *e;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1347 t++;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1348 e++;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1349 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1350 *t = '\0';
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1351 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1352 else {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1353 // this was the last header field, truncate the headers
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1354 *t = '\0';
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1355 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1356 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1357 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1358
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1359
345
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1360 int test_base64(char *body, size_t len)
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1361 {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1362 int b64 = 0;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1363 uint8_t *b = (uint8_t *)body;
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1364 DEBUG_ENT("test_base64");
345
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1365 while (len--) {
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1366 if ((*b < 32) && (*b != 9) && (*b != 10)) {
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
1367 DEBUG_INFO(("found base64 byte %d\n", (int)*b));
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1368 DEBUG_HEXDUMPC(body, strlen(body), 0x10);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1369 b64 = 1;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1370 break;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1371 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1372 b++;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1373 }
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1374 DEBUG_RET();
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1375 return b64;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1376 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1377
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1378
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1379 void find_html_charset(char *html, char *charset, size_t charsetlen)
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1380 {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1381 const int index = 1;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1382 const int nmatch = index+1;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1383 regmatch_t match[nmatch];
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1384 DEBUG_ENT("find_html_charset");
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1385 int rc = regexec(&meta_charset_pattern, html, nmatch, match, 0);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1386 if (rc == 0) {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1387 int s = match[index].rm_so;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1388 int e = match[index].rm_eo;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1389 if (s != -1) {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1390 char save = html[e];
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1391 html[e] = '\0';
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1392 snprintf(charset, charsetlen, "%s", html+s); // copy the html charset
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1393 html[e] = save;
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
1394 DEBUG_INFO(("charset %s from html text\n", charset));
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1395 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1396 else {
203
9fb600ef4e03 cleanup debug logging
Carl Byington <carl@five-ten-sg.com>
parents: 202
diff changeset
1397 DEBUG_INFO(("matching %d %d %d %d\n", match[0].rm_so, match[0].rm_eo, match[1].rm_so, match[1].rm_eo));
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1398 DEBUG_HEXDUMPC(html, strlen(html), 0x10);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1399 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1400 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1401 else {
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
1402 DEBUG_INFO(("regexec returns %d\n", rc));
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1403 }
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1404 DEBUG_RET();
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1405 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1406
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1407
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1408 void find_rfc822_headers(char** extra_mime_headers)
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1409 {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1410 DEBUG_ENT("find_rfc822_headers");
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1411 char *headers = *extra_mime_headers;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1412 if (headers) {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1413 char *temp, *t;
146
0695de3b5a98 fix for 64bit on Fedora 11
Carl Byington <carl@five-ten-sg.com>
parents: 143
diff changeset
1414 while ((temp = strstr(headers, "\n\n"))) {
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1415 temp[1] = '\0';
304
5338d93889aa preserve bcc headers, document -C switch to set default character set, space after colon is not required in header fields
Carl Byington <carl@five-ten-sg.com>
parents: 300
diff changeset
1416 t = header_get_field(headers, "\nContent-Type:");
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1417 if (t) {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1418 t++;
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
1419 DEBUG_INFO(("found content type header\n"));
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1420 char *n = strchr(t, '\n');
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1421 char *s = strstr(t, ": ");
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1422 char *e = strchr(t, ';');
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1423 if (!e || (e > n)) e = n;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1424 if (s && (s < e)) {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1425 s += 2;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1426 if (!strncasecmp(s, RFC822, e-s)) {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1427 headers = temp+2; // found rfc822 header
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
1428 DEBUG_INFO(("found 822 headers\n%s\n", headers));
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1429 break;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1430 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1431 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1432 }
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
1433 //DEBUG_INFO(("skipping to next block after\n%s\n", headers));
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1434 headers = temp+2; // skip to next chunk of headers
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1435 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1436 *extra_mime_headers = headers;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1437 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1438 DEBUG_RET();
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1439 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1440
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1441
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1442 void write_body_part(FILE* f_output, pst_string *body, char *mime, char *charset, char *boundary, pst_file* pst)
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1443 {
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1444 DEBUG_ENT("write_body_part");
345
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1445 removeCR(body->str);
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1446 size_t body_len = strlen(body->str);
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1447
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1448 if (body->is_utf8 && (strcasecmp("utf-8", charset))) {
345
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1449 if (prefer_utf8) {
142
2189a6b8134e improve character set handling - don't try to convert utf-8 to single byte for fields that were not originally unicode.
Carl Byington <carl@five-ten-sg.com>
parents: 141
diff changeset
1450 charset = "utf-8";
345
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1451 } else {
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1452 // try to convert to the specified charset since the target
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1453 // is not utf-8, and the data came from a unicode (utf16) field
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1454 // and is now in utf-8.
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1455 size_t rc;
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1456 DEBUG_INFO(("Convert %s utf-8 to %s\n", mime, charset));
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1457 pst_vbuf *newer = pst_vballoc(2);
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1458 rc = pst_vb_utf8to8bit(newer, body->str, body_len, charset);
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1459 if (rc == (size_t)-1) {
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1460 // unable to convert, change the charset to utf8
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1461 free(newer->b);
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1462 DEBUG_INFO(("Failed to convert %s utf-8 to %s\n", mime, charset));
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1463 charset = "utf-8";
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1464 } else {
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1465 // null terminate the output string
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1466 pst_vbgrow(newer, 1);
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1467 newer->b[newer->dlen] = '\0';
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1468 free(body->str);
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1469 body->str = newer->b;
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1470 body_len = newer->dlen;
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1471 }
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1472 free(newer);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1473 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1474 }
345
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1475 int base64 = test_base64(body->str, body_len);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1476 fprintf(f_output, "\n--%s\n", boundary);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1477 fprintf(f_output, "Content-Type: %s; charset=\"%s\"\n", mime, charset);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1478 if (base64) fprintf(f_output, "Content-Transfer-Encoding: base64\n");
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1479 fprintf(f_output, "\n");
345
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1480 // Any body that uses an encoding with NULLs, e.g. UTF16, will be base64-encoded here.
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1481 if (base64) {
345
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1482 char *enc = pst_base64_encode(body->str, body_len);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1483 if (enc) {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1484 write_email_body(f_output, enc);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1485 fprintf(f_output, "\n");
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1486 free(enc);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1487 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1488 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1489 else {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1490 write_email_body(f_output, body->str);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1491 }
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1492 DEBUG_RET();
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1493 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1494
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1495
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1496 void write_schedule_part_data(FILE* f_output, pst_item* item, const char* sender, const char* method)
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1497 {
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1498 fprintf(f_output, "BEGIN:VCALENDAR\n");
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1499 fprintf(f_output, "VERSION:2.0\n");
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
1500 fprintf(f_output, "PRODID:LibPST v%s\n", VERSION);
239
aa50c23a6935 patch from Lee Ayres to add file name extensions in separate mode; allow mixed items types in a folder in separate mode
Carl Byington <carl@five-ten-sg.com>
parents: 238
diff changeset
1501 if (method) fprintf(f_output, "METHOD:%s\n", method);
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
1502 fprintf(f_output, "BEGIN:VEVENT\n");
247
85d77d7b034b another patche from Kenneth Berland for solaris
Carl Byington <carl@five-ten-sg.com>
parents: 246
diff changeset
1503 if (sender) {
85d77d7b034b another patche from Kenneth Berland for solaris
Carl Byington <carl@five-ten-sg.com>
parents: 246
diff changeset
1504 if (item->email->outlook_sender_name.str) {
297
8b3a827b71f4 add alarm reminders to calendar events
Carl Byington <carl@five-ten-sg.com>
parents: 292
diff changeset
1505 fprintf(f_output, "ORGANIZER;CN=\"%s\":MAILTO:%s\n", item->email->outlook_sender_name.str, sender);
8b3a827b71f4 add alarm reminders to calendar events
Carl Byington <carl@five-ten-sg.com>
parents: 292
diff changeset
1506 } else {
8b3a827b71f4 add alarm reminders to calendar events
Carl Byington <carl@five-ten-sg.com>
parents: 292
diff changeset
1507 fprintf(f_output, "ORGANIZER;CN=\"\":MAILTO:%s\n", sender);
8b3a827b71f4 add alarm reminders to calendar events
Carl Byington <carl@five-ten-sg.com>
parents: 292
diff changeset
1508 }
247
85d77d7b034b another patche from Kenneth Berland for solaris
Carl Byington <carl@five-ten-sg.com>
parents: 246
diff changeset
1509 }
242
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
1510 write_appointment(f_output, item);
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1511 fprintf(f_output, "END:VCALENDAR\n");
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1512 }
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1513
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1514
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1515 void write_schedule_part(FILE* f_output, pst_item* item, const char* sender, const char* boundary)
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1516 {
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1517 const char* method = "REQUEST";
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1518 const char* charset = "utf-8";
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
1519 char fname[30];
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1520 if (!item->appointment) return;
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1521
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1522 // inline appointment request
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1523 fprintf(f_output, "\n--%s\n", boundary);
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1524 fprintf(f_output, "Content-Type: %s; method=\"%s\"; charset=\"%s\"\n\n", "text/calendar", method, charset);
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1525 write_schedule_part_data(f_output, item, sender, method);
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1526 fprintf(f_output, "\n");
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1527
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1528 // attachment appointment request
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1529 snprintf(fname, sizeof(fname), "i%i.ics", rand());
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1530 fprintf(f_output, "\n--%s\n", boundary);
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1531 fprintf(f_output, "Content-Type: %s; charset=\"%s\"; name=\"%s\"\n", "text/calendar", "utf-8", fname);
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1532 fprintf(f_output, "Content-Disposition: attachment; filename=\"%s\"\n\n", fname);
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1533 write_schedule_part_data(f_output, item, sender, method);
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1534 fprintf(f_output, "\n");
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1535 }
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1536
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1537
323
2474d01043cd fix From quoting on embedded rfc/822 messages
Carl Byington <carl@five-ten-sg.com>
parents: 316
diff changeset
1538 void write_normal_email(FILE* f_output, char f_name[], pst_item* item, int mode, int mode_MH, pst_file* pst, int save_rtf, int embedding, char** extra_mime_headers)
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1539 {
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1540 char boundary[60];
205
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1541 char altboundary[66];
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1542 char *altboundaryp = NULL;
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1543 char body_charset[30];
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1544 char buffer_charset[30];
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1545 char body_report[60];
129
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1546 char sender[60];
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1547 int sender_known = 0;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1548 char *temp = NULL;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1549 time_t em_time;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1550 char *c_time;
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1551 char *headers = NULL;
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1552 int has_from, has_subject, has_to, has_cc, has_date, has_msgid;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1553 has_from = has_subject = has_to = has_cc = has_date = has_msgid = 0;
46
b2a7f2e0926a more fixes for 64 bit format
carl
parents: 45
diff changeset
1554 DEBUG_ENT("write_normal_email");
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1555
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1556 pst_convert_utf8_null(item, &item->email->header);
277
86078d0c2e9c ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 276
diff changeset
1557 headers = valid_headers(item->email->header.str) ? item->email->header.str :
86078d0c2e9c ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 276
diff changeset
1558 valid_headers(*extra_mime_headers) ? *extra_mime_headers :
86078d0c2e9c ignore internet headers that don't seem to be real rfc822 headers
Carl Byington <carl@five-ten-sg.com>
parents: 276
diff changeset
1559 NULL;
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1560
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1561 // setup default body character set and report type
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1562 strncpy(body_charset, pst_default_charset(item, sizeof(buffer_charset), buffer_charset), sizeof(body_charset));
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1563 body_charset[sizeof(body_charset)-1] = '\0';
234
ed0cb66b23d4 better detection of dsn delivery reports
Carl Byington <carl@five-ten-sg.com>
parents: 233
diff changeset
1564 strncpy(body_report, "delivery-status", sizeof(body_report));
ed0cb66b23d4 better detection of dsn delivery reports
Carl Byington <carl@five-ten-sg.com>
parents: 233
diff changeset
1565 body_report[sizeof(body_report)-1] = '\0';
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1566
129
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1567 // setup default sender
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1568 pst_convert_utf8(item, &item->email->sender_address);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1569 if (item->email->sender_address.str && strchr(item->email->sender_address.str, '@')) {
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1570 temp = item->email->sender_address.str;
129
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1571 sender_known = 1;
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1572 }
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1573 else {
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1574 temp = "MAILER-DAEMON";
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1575 }
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1576 strncpy(sender, temp, sizeof(sender));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1577 sender[sizeof(sender)-1] = '\0';
129
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1578
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1579 // convert the sent date if it exists, or set it to a fixed date
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1580 if (item->email->sent_date) {
182
b65e8d0a088a more cleanup on external names in the shared object file
Carl Byington <carl@five-ten-sg.com>
parents: 172
diff changeset
1581 em_time = pst_fileTimeToUnixTime(item->email->sent_date);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1582 c_time = ctime(&em_time);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1583 if (c_time)
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1584 c_time[strlen(c_time)-1] = '\0'; //remove end \n
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1585 else
345
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1586 c_time = "Thu Jan 1 00:00:00 1970";
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1587 } else
345
a8577226f7a9 fixes from AJ Shankar for attachment processing and body encodings that contain embedded null chars
Carl Byington <carl@five-ten-sg.com>
parents: 344
diff changeset
1588 c_time = "Thu Jan 1 00:00:00 1970";
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1589
205
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1590 // create our MIME boundaries here.
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1591 snprintf(boundary, sizeof(boundary), "--boundary-LibPST-iamunique-%i_-_-", rand());
205
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1592 snprintf(altboundary, sizeof(altboundary), "alt-%s", boundary);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1593
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1594 // we will always look at the headers to discover some stuff
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1595 if (headers ) {
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1596 char *t;
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1597 removeCR(headers);
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1598
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1599 temp = strstr(headers, "\n\n");
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1600 if (temp) {
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1601 // cut off our real rfc822 headers here
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1602 temp[1] = '\0';
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1603 // pointer to all the embedded MIME headers.
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1604 // we use these to find the actual rfc822 headers for embedded message/rfc822 mime parts
275
e02c81c39232 add some debug code
Carl Byington <carl@five-ten-sg.com>
parents: 274
diff changeset
1605 // but only for the outermost message
e02c81c39232 add some debug code
Carl Byington <carl@five-ten-sg.com>
parents: 274
diff changeset
1606 if (!*extra_mime_headers) *extra_mime_headers = temp+2;
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
1607 DEBUG_INFO(("Found extra mime headers\n%s\n", temp+2));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1608 }
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1609
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1610 // Check if the headers have all the necessary fields
304
5338d93889aa preserve bcc headers, document -C switch to set default character set, space after colon is not required in header fields
Carl Byington <carl@five-ten-sg.com>
parents: 300
diff changeset
1611 header_has_field(headers, "\nFrom:", &has_from);
5338d93889aa preserve bcc headers, document -C switch to set default character set, space after colon is not required in header fields
Carl Byington <carl@five-ten-sg.com>
parents: 300
diff changeset
1612 header_has_field(headers, "\nTo:", &has_to);
5338d93889aa preserve bcc headers, document -C switch to set default character set, space after colon is not required in header fields
Carl Byington <carl@five-ten-sg.com>
parents: 300
diff changeset
1613 header_has_field(headers, "\nSubject:", &has_subject);
5338d93889aa preserve bcc headers, document -C switch to set default character set, space after colon is not required in header fields
Carl Byington <carl@five-ten-sg.com>
parents: 300
diff changeset
1614 header_has_field(headers, "\nDate:", &has_date);
5338d93889aa preserve bcc headers, document -C switch to set default character set, space after colon is not required in header fields
Carl Byington <carl@five-ten-sg.com>
parents: 300
diff changeset
1615 header_has_field(headers, "\nCC:", &has_cc);
5338d93889aa preserve bcc headers, document -C switch to set default character set, space after colon is not required in header fields
Carl Byington <carl@five-ten-sg.com>
parents: 300
diff changeset
1616 header_has_field(headers, "\nMessage-Id:", &has_msgid);
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1617
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1618 // look for charset and report-type in Content-Type header
304
5338d93889aa preserve bcc headers, document -C switch to set default character set, space after colon is not required in header fields
Carl Byington <carl@five-ten-sg.com>
parents: 300
diff changeset
1619 t = header_get_field(headers, "\nContent-Type:");
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1620 header_get_subfield(t, "charset", body_charset, sizeof(body_charset));
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1621 header_get_subfield(t, "report-type", body_report, sizeof(body_report));
100
1e4a7610d525 fixes from Justin Greer to add -D option to include deleted items, to add missing email headers, to fix bug in my_stristr()
Carl Byington <carl@five-ten-sg.com>
parents: 79
diff changeset
1622
129
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1623 // derive a proper sender email address
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1624 if (!sender_known) {
304
5338d93889aa preserve bcc headers, document -C switch to set default character set, space after colon is not required in header fields
Carl Byington <carl@five-ten-sg.com>
parents: 300
diff changeset
1625 t = header_get_field(headers, "\nFrom:");
129
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1626 if (t) {
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1627 // assume address is on the first line, rather than on a continuation line
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1628 t++;
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1629 char *n = strchr(t, '\n');
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1630 char *s = strchr(t, '<');
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1631 char *e = strchr(t, '>');
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1632 if (s && e && n && (s < e) && (e < n)) {
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1633 char save = *e;
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1634 *e = '\0';
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1635 snprintf(sender, sizeof(sender), "%s", s+1);
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1636 *e = save;
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1637 }
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1638 }
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1639 }
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1640
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1641 // Strip out the mime headers and some others that we don't want to emit
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1642 header_strip_field(headers, "\nMicrosoft Mail Internet Headers");
304
5338d93889aa preserve bcc headers, document -C switch to set default character set, space after colon is not required in header fields
Carl Byington <carl@five-ten-sg.com>
parents: 300
diff changeset
1643 header_strip_field(headers, "\nMIME-Version:");
5338d93889aa preserve bcc headers, document -C switch to set default character set, space after colon is not required in header fields
Carl Byington <carl@five-ten-sg.com>
parents: 300
diff changeset
1644 header_strip_field(headers, "\nContent-Type:");
5338d93889aa preserve bcc headers, document -C switch to set default character set, space after colon is not required in header fields
Carl Byington <carl@five-ten-sg.com>
parents: 300
diff changeset
1645 header_strip_field(headers, "\nContent-Transfer-Encoding:");
5338d93889aa preserve bcc headers, document -C switch to set default character set, space after colon is not required in header fields
Carl Byington <carl@five-ten-sg.com>
parents: 300
diff changeset
1646 header_strip_field(headers, "\nContent-class:");
5338d93889aa preserve bcc headers, document -C switch to set default character set, space after colon is not required in header fields
Carl Byington <carl@five-ten-sg.com>
parents: 300
diff changeset
1647 header_strip_field(headers, "\nX-MimeOLE:");
5338d93889aa preserve bcc headers, document -C switch to set default character set, space after colon is not required in header fields
Carl Byington <carl@five-ten-sg.com>
parents: 300
diff changeset
1648 header_strip_field(headers, "\nX-From_:");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1649 }
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1650
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
1651 DEBUG_INFO(("About to print Header\n"));
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1652
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1653 if (item && item->subject.str) {
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1654 pst_convert_utf8(item, &item->subject);
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
1655 DEBUG_INFO(("item->subject = %s\n", item->subject.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1656 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1657
139
1b3922080ca8 add forensic headers to capture some other data of interest; switch back to quoted From separator line
Carl Byington <carl@five-ten-sg.com>
parents: 129
diff changeset
1658 if (mode != MODE_SEPARATE) {
142
2189a6b8134e improve character set handling - don't try to convert utf-8 to single byte for fields that were not originally unicode.
Carl Byington <carl@five-ten-sg.com>
parents: 141
diff changeset
1659 // most modes need this separator line.
2189a6b8134e improve character set handling - don't try to convert utf-8 to single byte for fields that were not originally unicode.
Carl Byington <carl@five-ten-sg.com>
parents: 141
diff changeset
1660 // procmail produces this separator without the quotes around the
2189a6b8134e improve character set handling - don't try to convert utf-8 to single byte for fields that were not originally unicode.
Carl Byington <carl@five-ten-sg.com>
parents: 141
diff changeset
1661 // sender email address, but apparently some Mac email client needs
2189a6b8134e improve character set handling - don't try to convert utf-8 to single byte for fields that were not originally unicode.
Carl Byington <carl@five-ten-sg.com>
parents: 141
diff changeset
1662 // those quotes, and they don't seem to cause problems for anyone else.
323
2474d01043cd fix From quoting on embedded rfc/822 messages
Carl Byington <carl@five-ten-sg.com>
parents: 316
diff changeset
1663 char *quo = (embedding) ? ">" : "";
2474d01043cd fix From quoting on embedded rfc/822 messages
Carl Byington <carl@five-ten-sg.com>
parents: 316
diff changeset
1664 fprintf(f_output, "%sFrom \"%s\" %s\n", quo, sender, c_time);
139
1b3922080ca8 add forensic headers to capture some other data of interest; switch back to quoted From separator line
Carl Byington <carl@five-ten-sg.com>
parents: 129
diff changeset
1665 }
1b3922080ca8 add forensic headers to capture some other data of interest; switch back to quoted From separator line
Carl Byington <carl@five-ten-sg.com>
parents: 129
diff changeset
1666
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1667 // print the supplied email headers
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1668 if (headers) {
230
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
1669 int len = strlen(headers);
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
1670 if (len > 0) {
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
1671 fprintf(f_output, "%s", headers);
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
1672 // make sure the headers end with a \n
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
1673 if (headers[len-1] != '\n') fprintf(f_output, "\n");
257
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1674 //char *h = headers;
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1675 //while (*h) {
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1676 // char *e = strchr(h, '\n');
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1677 // int d = 1; // normally e points to trailing \n
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1678 // if (!e) {
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1679 // e = h + strlen(h); // e points to trailing null
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1680 // d = 0;
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1681 // }
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1682 // // we could do rfc2047 encoding here if needed
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1683 // fprintf(f_output, "%.*s\n", (int)(e-h), h);
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1684 // h = e + d;
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1685 //}
230
42b38d65f7e4 patches from Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 213
diff changeset
1686 }
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1687 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1688
292
e0e5844d91b3 patch from Leo Antunes for Status: header
Carl Byington <carl@five-ten-sg.com>
parents: 291
diff changeset
1689 // record read status
e0e5844d91b3 patch from Leo Antunes for Status: header
Carl Byington <carl@five-ten-sg.com>
parents: 291
diff changeset
1690 if ((item->flags & PST_FLAG_READ) == PST_FLAG_READ) {
e0e5844d91b3 patch from Leo Antunes for Status: header
Carl Byington <carl@five-ten-sg.com>
parents: 291
diff changeset
1691 fprintf(f_output, "Status: RO\n");
e0e5844d91b3 patch from Leo Antunes for Status: header
Carl Byington <carl@five-ten-sg.com>
parents: 291
diff changeset
1692 }
e0e5844d91b3 patch from Leo Antunes for Status: header
Carl Byington <carl@five-ten-sg.com>
parents: 291
diff changeset
1693
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1694 // create required header fields that are not already written
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1695
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1696 if (!has_from) {
246
5a82d41c883d patches from Kenneth Berland for solaris
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
1697 if (item->email->outlook_sender_name.str){
257
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1698 pst_rfc2047(item, &item->email->outlook_sender_name, 1);
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1699 fprintf(f_output, "From: %s <%s>\n", item->email->outlook_sender_name.str, sender);
246
5a82d41c883d patches from Kenneth Berland for solaris
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
1700 } else {
5a82d41c883d patches from Kenneth Berland for solaris
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
1701 fprintf(f_output, "From: <%s>\n", sender);
5a82d41c883d patches from Kenneth Berland for solaris
Carl Byington <carl@five-ten-sg.com>
parents: 242
diff changeset
1702 }
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1703 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1704
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1705 if (!has_subject) {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1706 if (item->subject.str) {
257
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1707 pst_rfc2047(item, &item->subject, 0);
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1708 fprintf(f_output, "Subject: %s\n", item->subject.str);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1709 } else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1710 fprintf(f_output, "Subject: \n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1711 }
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1712 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1713
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1714 if (!has_to && item->email->sentto_address.str) {
257
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1715 pst_rfc2047(item, &item->email->sentto_address, 0);
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1716 fprintf(f_output, "To: %s\n", item->email->sentto_address.str);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1717 }
100
1e4a7610d525 fixes from Justin Greer to add -D option to include deleted items, to add missing email headers, to fix bug in my_stristr()
Carl Byington <carl@five-ten-sg.com>
parents: 79
diff changeset
1718
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1719 if (!has_cc && item->email->cc_address.str) {
257
c947b8812120 rfc2047 and rfc2231 encoding for non-ascii headers and attachment filenames
Carl Byington <carl@five-ten-sg.com>
parents: 255
diff changeset
1720 pst_rfc2047(item, &item->email->cc_address, 0);
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1721 fprintf(f_output, "Cc: %s\n", item->email->cc_address.str);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1722 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1723
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1724 if (!has_date && item->email->sent_date) {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1725 char c_time[C_TIME_SIZE];
200
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
1726 struct tm stm;
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
1727 gmtime_r(&em_time, &stm);
d360f96f71f6 start changes for parallel readpst on multi-processor machines
Carl Byington <carl@five-ten-sg.com>
parents: 199
diff changeset
1728 strftime(c_time, C_TIME_SIZE, "%a, %d %b %Y %H:%M:%S %z", &stm);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1729 fprintf(f_output, "Date: %s\n", c_time);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1730 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1731
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1732 if (!has_msgid && item->email->messageid.str) {
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1733 pst_convert_utf8(item, &item->email->messageid);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1734 fprintf(f_output, "Message-Id: %s\n", item->email->messageid.str);
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1735 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1736
139
1b3922080ca8 add forensic headers to capture some other data of interest; switch back to quoted From separator line
Carl Byington <carl@five-ten-sg.com>
parents: 129
diff changeset
1737 // add forensic headers to capture some .pst stuff that is not really
1b3922080ca8 add forensic headers to capture some other data of interest; switch back to quoted From separator line
Carl Byington <carl@five-ten-sg.com>
parents: 129
diff changeset
1738 // needed or used by mail clients
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1739 pst_convert_utf8_null(item, &item->email->sender_address);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1740 if (item->email->sender_address.str && !strchr(item->email->sender_address.str, '@')
233
1d50ff3c5091 better rfc822 embedded message decoding
Carl Byington <carl@five-ten-sg.com>
parents: 231
diff changeset
1741 && strcmp(item->email->sender_address.str, ".")
1d50ff3c5091 better rfc822 embedded message decoding
Carl Byington <carl@five-ten-sg.com>
parents: 231
diff changeset
1742 && (strlen(item->email->sender_address.str) > 0)) {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1743 fprintf(f_output, "X-libpst-forensic-sender: %s\n", item->email->sender_address.str);
139
1b3922080ca8 add forensic headers to capture some other data of interest; switch back to quoted From separator line
Carl Byington <carl@five-ten-sg.com>
parents: 129
diff changeset
1744 }
1b3922080ca8 add forensic headers to capture some other data of interest; switch back to quoted From separator line
Carl Byington <carl@five-ten-sg.com>
parents: 129
diff changeset
1745
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1746 if (item->email->bcc_address.str) {
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1747 pst_convert_utf8(item, &item->email->bcc_address);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1748 fprintf(f_output, "X-libpst-forensic-bcc: %s\n", item->email->bcc_address.str);
139
1b3922080ca8 add forensic headers to capture some other data of interest; switch back to quoted From separator line
Carl Byington <carl@five-ten-sg.com>
parents: 129
diff changeset
1749 }
1b3922080ca8 add forensic headers to capture some other data of interest; switch back to quoted From separator line
Carl Byington <carl@five-ten-sg.com>
parents: 129
diff changeset
1750
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1751 // add our own mime headers
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1752 fprintf(f_output, "MIME-Version: 1.0\n");
234
ed0cb66b23d4 better detection of dsn delivery reports
Carl Byington <carl@five-ten-sg.com>
parents: 233
diff changeset
1753 if (item->type == PST_TYPE_REPORT) {
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1754 // multipart/report for DSN/MDN reports
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1755 fprintf(f_output, "Content-Type: multipart/report; report-type=%s;\n\tboundary=\"%s\"\n", body_report, boundary);
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1756 }
205
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1757 else {
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1758 fprintf(f_output, "Content-Type: multipart/mixed;\n\tboundary=\"%s\"\n", boundary);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1759 }
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1760 fprintf(f_output, "\n"); // end of headers, start of body
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1761
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1762 // now dump the body parts
234
ed0cb66b23d4 better detection of dsn delivery reports
Carl Byington <carl@five-ten-sg.com>
parents: 233
diff changeset
1763 if ((item->type == PST_TYPE_REPORT) && (item->email->report_text.str)) {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1764 write_body_part(f_output, &item->email->report_text, "text/plain", body_charset, boundary, pst);
142
2189a6b8134e improve character set handling - don't try to convert utf-8 to single byte for fields that were not originally unicode.
Carl Byington <carl@five-ten-sg.com>
parents: 141
diff changeset
1765 fprintf(f_output, "\n");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1766 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1767
205
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1768 if (item->body.str && item->email->htmlbody.str) {
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1769 // start the nested alternative part
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1770 fprintf(f_output, "\n--%s\n", boundary);
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1771 fprintf(f_output, "Content-Type: multipart/alternative;\n\tboundary=\"%s\"\n", altboundary);
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1772 altboundaryp = altboundary;
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1773 }
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1774 else {
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1775 altboundaryp = boundary;
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1776 }
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1777
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1778 if (item->body.str) {
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1779 write_body_part(f_output, &item->body, "text/plain", body_charset, altboundaryp, pst);
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1780 }
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1781
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1782 if (item->email->htmlbody.str) {
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1783 find_html_charset(item->email->htmlbody.str, body_charset, sizeof(body_charset));
205
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1784 write_body_part(f_output, &item->email->htmlbody, "text/html", body_charset, altboundaryp, pst);
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1785 }
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1786
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1787 if (item->body.str && item->email->htmlbody.str) {
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1788 // end the nested alternative part
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1789 fprintf(f_output, "\n--%s--\n", altboundary);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1790 }
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1791
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
1792 if (item->email->rtf_compressed.data && save_rtf) {
172
6954d315aaa8 move version-info into main configure.in, and set it properly.
Carl Byington <carl@five-ten-sg.com>
parents: 171
diff changeset
1793 pst_item_attach* attach = (pst_item_attach*)pst_malloc(sizeof(pst_item_attach));
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
1794 DEBUG_INFO(("Adding RTF body as attachment\n"));
125
23a36ac0514d recover dropped pragma pack line, use int64_t rather than off_t to avoid forcing users of the shared library to enable large file support.
Carl Byington <carl@five-ten-sg.com>
parents: 123
diff changeset
1795 memset(attach, 0, sizeof(pst_item_attach));
23a36ac0514d recover dropped pragma pack line, use int64_t rather than off_t to avoid forcing users of the shared library to enable large file support.
Carl Byington <carl@five-ten-sg.com>
parents: 123
diff changeset
1796 attach->next = item->attach;
23a36ac0514d recover dropped pragma pack line, use int64_t rather than off_t to avoid forcing users of the shared library to enable large file support.
Carl Byington <carl@five-ten-sg.com>
parents: 123
diff changeset
1797 item->attach = attach;
172
6954d315aaa8 move version-info into main configure.in, and set it properly.
Carl Byington <carl@five-ten-sg.com>
parents: 171
diff changeset
1798 attach->data.data = pst_lzfu_decompress(item->email->rtf_compressed.data, item->email->rtf_compressed.size, &attach->data.size);
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1799 attach->filename2.str = strdup(RTF_ATTACH_NAME);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1800 attach->filename2.is_utf8 = 1;
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1801 attach->mimetype.str = strdup(RTF_ATTACH_TYPE);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1802 attach->mimetype.is_utf8 = 1;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1803 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1804
205
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1805 if (item->email->encrypted_body.data) {
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1806 pst_item_attach* attach = (pst_item_attach*)pst_malloc(sizeof(pst_item_attach));
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1807 DEBUG_INFO(("Adding encrypted text body as attachment\n"));
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1808 memset(attach, 0, sizeof(pst_item_attach));
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1809 attach->next = item->attach;
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1810 item->attach = attach;
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1811 attach->data.data = item->email->encrypted_body.data;
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1812 attach->data.size = item->email->encrypted_body.size;
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1813 item->email->encrypted_body.data = NULL;
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1814 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1815
205
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1816 if (item->email->encrypted_htmlbody.data) {
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1817 pst_item_attach* attach = (pst_item_attach*)pst_malloc(sizeof(pst_item_attach));
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1818 DEBUG_INFO(("Adding encrypted HTML body as attachment\n"));
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1819 memset(attach, 0, sizeof(pst_item_attach));
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1820 attach->next = item->attach;
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1821 item->attach = attach;
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1822 attach->data.data = item->email->encrypted_htmlbody.data;
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1823 attach->data.size = item->email->encrypted_htmlbody.size;
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1824 item->email->encrypted_htmlbody.data = NULL;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1825 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1826
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1827 if (item->type == PST_TYPE_SCHEDULE) {
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1828 write_schedule_part(f_output, item, sender, boundary);
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1829 }
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
1830
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1831 // other attachments
125
23a36ac0514d recover dropped pragma pack line, use int64_t rather than off_t to avoid forcing users of the shared library to enable large file support.
Carl Byington <carl@five-ten-sg.com>
parents: 123
diff changeset
1832 {
23a36ac0514d recover dropped pragma pack line, use int64_t rather than off_t to avoid forcing users of the shared library to enable large file support.
Carl Byington <carl@five-ten-sg.com>
parents: 123
diff changeset
1833 pst_item_attach* attach;
191
4b498fd68464 add pst_attach_to_mem() back into the shared library interface.
Carl Byington <carl@five-ten-sg.com>
parents: 186
diff changeset
1834 int attach_num = 0;
125
23a36ac0514d recover dropped pragma pack line, use int64_t rather than off_t to avoid forcing users of the shared library to enable large file support.
Carl Byington <carl@five-ten-sg.com>
parents: 123
diff changeset
1835 for (attach = item->attach; attach; attach = attach->next) {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1836 pst_convert_utf8_null(item, &attach->filename1);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1837 pst_convert_utf8_null(item, &attach->filename2);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1838 pst_convert_utf8_null(item, &attach->mimetype);
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
1839 DEBUG_INFO(("Attempting Attachment encoding\n"));
233
1d50ff3c5091 better rfc822 embedded message decoding
Carl Byington <carl@five-ten-sg.com>
parents: 231
diff changeset
1840 if (attach->method == PST_ATTACH_EMBEDDED) {
236
093e0e9248bb cleanup rfc822 embedded message code
Carl Byington <carl@five-ten-sg.com>
parents: 234
diff changeset
1841 DEBUG_INFO(("have an embedded rfc822 message attachment\n"));
233
1d50ff3c5091 better rfc822 embedded message decoding
Carl Byington <carl@five-ten-sg.com>
parents: 231
diff changeset
1842 if (attach->mimetype.str) {
236
093e0e9248bb cleanup rfc822 embedded message code
Carl Byington <carl@five-ten-sg.com>
parents: 234
diff changeset
1843 DEBUG_INFO(("which already has a mime-type of %s\n", attach->mimetype.str));
233
1d50ff3c5091 better rfc822 embedded message decoding
Carl Byington <carl@five-ten-sg.com>
parents: 231
diff changeset
1844 free(attach->mimetype.str);
1d50ff3c5091 better rfc822 embedded message decoding
Carl Byington <carl@five-ten-sg.com>
parents: 231
diff changeset
1845 }
1d50ff3c5091 better rfc822 embedded message decoding
Carl Byington <carl@five-ten-sg.com>
parents: 231
diff changeset
1846 attach->mimetype.str = strdup(RFC822);
1d50ff3c5091 better rfc822 embedded message decoding
Carl Byington <carl@five-ten-sg.com>
parents: 231
diff changeset
1847 attach->mimetype.is_utf8 = 1;
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1848 find_rfc822_headers(extra_mime_headers);
300
47abe56076da embedded rfc822 messages might contain rtf encoded bodies
Carl Byington <carl@five-ten-sg.com>
parents: 298
diff changeset
1849 write_embedded_message(f_output, attach, boundary, pst, save_rtf, extra_mime_headers);
125
23a36ac0514d recover dropped pragma pack line, use int64_t rather than off_t to avoid forcing users of the shared library to enable large file support.
Carl Byington <carl@five-ten-sg.com>
parents: 123
diff changeset
1850 }
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
1851 else if (attach->data.data || attach->i_id) {
328
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1852 if (acceptable_ext(attach)) {
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1853 if (mode == MODE_SEPARATE && !mode_MH)
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1854 write_separate_attachment(f_name, attach, ++attach_num, pst);
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1855 else
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1856 write_inline_attachment(f_output, attach, boundary, pst);
c507af52515a add readpst -a option
Carl Byington <carl@five-ten-sg.com>
parents: 323
diff changeset
1857 }
164
ab384fed78c5 Compensate for iconv conversion to utf-7 that produces strings that are not null terminated.
Carl Byington <carl@five-ten-sg.com>
parents: 154
diff changeset
1858 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1859 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1860 }
125
23a36ac0514d recover dropped pragma pack line, use int64_t rather than off_t to avoid forcing users of the shared library to enable large file support.
Carl Byington <carl@five-ten-sg.com>
parents: 123
diff changeset
1861
205
5f3fa53cb0e1 make nested mime multipart/alternative to hold the text/html parts
Carl Byington <carl@five-ten-sg.com>
parents: 203
diff changeset
1862 fprintf(f_output, "\n--%s--\n\n", boundary);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1863 DEBUG_RET();
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1864 }
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1865
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1866
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1867 void write_vcard(FILE* f_output, pst_item* item, pst_item_contact* contact, char comment[])
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1868 {
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1869 char* result = NULL;
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1870 size_t resultlen = 0;
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1871 char time_buffer[30];
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1872 // We can only call rfc escape once per printf, since the second call
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1873 // may free the buffer returned by the first call.
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1874 // I had tried to place those into a single printf - Carl.
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1875
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1876 DEBUG_ENT("write_vcard");
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1877
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1878 // make everything utf8
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1879 pst_convert_utf8_null(item, &contact->fullname);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1880 pst_convert_utf8_null(item, &contact->surname);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1881 pst_convert_utf8_null(item, &contact->first_name);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1882 pst_convert_utf8_null(item, &contact->middle_name);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1883 pst_convert_utf8_null(item, &contact->display_name_prefix);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1884 pst_convert_utf8_null(item, &contact->suffix);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1885 pst_convert_utf8_null(item, &contact->nickname);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1886 pst_convert_utf8_null(item, &contact->address1);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1887 pst_convert_utf8_null(item, &contact->address2);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1888 pst_convert_utf8_null(item, &contact->address3);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1889 pst_convert_utf8_null(item, &contact->home_po_box);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1890 pst_convert_utf8_null(item, &contact->home_street);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1891 pst_convert_utf8_null(item, &contact->home_city);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1892 pst_convert_utf8_null(item, &contact->home_state);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1893 pst_convert_utf8_null(item, &contact->home_postal_code);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1894 pst_convert_utf8_null(item, &contact->home_country);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1895 pst_convert_utf8_null(item, &contact->home_address);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1896 pst_convert_utf8_null(item, &contact->business_po_box);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1897 pst_convert_utf8_null(item, &contact->business_street);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1898 pst_convert_utf8_null(item, &contact->business_city);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1899 pst_convert_utf8_null(item, &contact->business_state);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1900 pst_convert_utf8_null(item, &contact->business_postal_code);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1901 pst_convert_utf8_null(item, &contact->business_country);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1902 pst_convert_utf8_null(item, &contact->business_address);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1903 pst_convert_utf8_null(item, &contact->other_po_box);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1904 pst_convert_utf8_null(item, &contact->other_street);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1905 pst_convert_utf8_null(item, &contact->other_city);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1906 pst_convert_utf8_null(item, &contact->other_state);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1907 pst_convert_utf8_null(item, &contact->other_postal_code);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1908 pst_convert_utf8_null(item, &contact->other_country);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1909 pst_convert_utf8_null(item, &contact->other_address);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1910 pst_convert_utf8_null(item, &contact->business_fax);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1911 pst_convert_utf8_null(item, &contact->business_phone);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1912 pst_convert_utf8_null(item, &contact->business_phone2);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1913 pst_convert_utf8_null(item, &contact->car_phone);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1914 pst_convert_utf8_null(item, &contact->home_fax);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1915 pst_convert_utf8_null(item, &contact->home_phone);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1916 pst_convert_utf8_null(item, &contact->home_phone2);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1917 pst_convert_utf8_null(item, &contact->isdn_phone);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1918 pst_convert_utf8_null(item, &contact->mobile_phone);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1919 pst_convert_utf8_null(item, &contact->other_phone);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1920 pst_convert_utf8_null(item, &contact->pager_phone);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1921 pst_convert_utf8_null(item, &contact->primary_fax);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1922 pst_convert_utf8_null(item, &contact->primary_phone);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1923 pst_convert_utf8_null(item, &contact->radio_phone);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1924 pst_convert_utf8_null(item, &contact->telex);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1925 pst_convert_utf8_null(item, &contact->job_title);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1926 pst_convert_utf8_null(item, &contact->profession);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1927 pst_convert_utf8_null(item, &contact->assistant_name);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1928 pst_convert_utf8_null(item, &contact->assistant_phone);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1929 pst_convert_utf8_null(item, &contact->company_name);
242
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
1930 pst_convert_utf8_null(item, &item->body);
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1931
50
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1932 // the specification I am following is (hopefully) RFC2426 vCard Mime Directory Profile
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1933 fprintf(f_output, "BEGIN:VCARD\n");
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1934 fprintf(f_output, "FN:%s\n", pst_rfc2426_escape(contact->fullname.str, &result, &resultlen));
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1935
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1936 //fprintf(f_output, "N:%s;%s;%s;%s;%s\n",
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1937 fprintf(f_output, "N:%s;", (!contact->surname.str) ? "" : pst_rfc2426_escape(contact->surname.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1938 fprintf(f_output, "%s;", (!contact->first_name.str) ? "" : pst_rfc2426_escape(contact->first_name.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1939 fprintf(f_output, "%s;", (!contact->middle_name.str) ? "" : pst_rfc2426_escape(contact->middle_name.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1940 fprintf(f_output, "%s;", (!contact->display_name_prefix.str) ? "" : pst_rfc2426_escape(contact->display_name_prefix.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1941 fprintf(f_output, "%s\n", (!contact->suffix.str) ? "" : pst_rfc2426_escape(contact->suffix.str, &result, &resultlen));
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1942
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1943 if (contact->nickname.str)
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1944 fprintf(f_output, "NICKNAME:%s\n", pst_rfc2426_escape(contact->nickname.str, &result, &resultlen));
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1945 if (contact->address1.str)
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1946 fprintf(f_output, "EMAIL:%s\n", pst_rfc2426_escape(contact->address1.str, &result, &resultlen));
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1947 if (contact->address2.str)
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1948 fprintf(f_output, "EMAIL:%s\n", pst_rfc2426_escape(contact->address2.str, &result, &resultlen));
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1949 if (contact->address3.str)
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1950 fprintf(f_output, "EMAIL:%s\n", pst_rfc2426_escape(contact->address3.str, &result, &resultlen));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1951 if (contact->birthday)
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
1952 fprintf(f_output, "BDAY:%s\n", pst_rfc2425_datetime_format(contact->birthday, sizeof(time_buffer), time_buffer));
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1953
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1954 if (contact->home_address.str) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1955 //fprintf(f_output, "ADR;TYPE=home:%s;%s;%s;%s;%s;%s;%s\n",
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1956 fprintf(f_output, "ADR;TYPE=home:%s;", (!contact->home_po_box.str) ? "" : pst_rfc2426_escape(contact->home_po_box.str, &result, &resultlen));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1957 fprintf(f_output, "%s;", ""); // extended Address
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1958 fprintf(f_output, "%s;", (!contact->home_street.str) ? "" : pst_rfc2426_escape(contact->home_street.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1959 fprintf(f_output, "%s;", (!contact->home_city.str) ? "" : pst_rfc2426_escape(contact->home_city.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1960 fprintf(f_output, "%s;", (!contact->home_state.str) ? "" : pst_rfc2426_escape(contact->home_state.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1961 fprintf(f_output, "%s;", (!contact->home_postal_code.str) ? "" : pst_rfc2426_escape(contact->home_postal_code.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1962 fprintf(f_output, "%s\n", (!contact->home_country.str) ? "" : pst_rfc2426_escape(contact->home_country.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1963 fprintf(f_output, "LABEL;TYPE=home:%s\n", pst_rfc2426_escape(contact->home_address.str, &result, &resultlen));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1964 }
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1965
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1966 if (contact->business_address.str) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1967 //fprintf(f_output, "ADR;TYPE=work:%s;%s;%s;%s;%s;%s;%s\n",
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1968 fprintf(f_output, "ADR;TYPE=work:%s;", (!contact->business_po_box.str) ? "" : pst_rfc2426_escape(contact->business_po_box.str, &result, &resultlen));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1969 fprintf(f_output, "%s;", ""); // extended Address
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1970 fprintf(f_output, "%s;", (!contact->business_street.str) ? "" : pst_rfc2426_escape(contact->business_street.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1971 fprintf(f_output, "%s;", (!contact->business_city.str) ? "" : pst_rfc2426_escape(contact->business_city.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1972 fprintf(f_output, "%s;", (!contact->business_state.str) ? "" : pst_rfc2426_escape(contact->business_state.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1973 fprintf(f_output, "%s;", (!contact->business_postal_code.str) ? "" : pst_rfc2426_escape(contact->business_postal_code.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1974 fprintf(f_output, "%s\n", (!contact->business_country.str) ? "" : pst_rfc2426_escape(contact->business_country.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1975 fprintf(f_output, "LABEL;TYPE=work:%s\n", pst_rfc2426_escape(contact->business_address.str, &result, &resultlen));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1976 }
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1977
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1978 if (contact->other_address.str) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1979 //fprintf(f_output, "ADR;TYPE=postal:%s;%s;%s;%s;%s;%s;%s\n",
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1980 fprintf(f_output, "ADR;TYPE=postal:%s;",(!contact->other_po_box.str) ? "" : pst_rfc2426_escape(contact->other_po_box.str, &result, &resultlen));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1981 fprintf(f_output, "%s;", ""); // extended Address
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1982 fprintf(f_output, "%s;", (!contact->other_street.str) ? "" : pst_rfc2426_escape(contact->other_street.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1983 fprintf(f_output, "%s;", (!contact->other_city.str) ? "" : pst_rfc2426_escape(contact->other_city.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1984 fprintf(f_output, "%s;", (!contact->other_state.str) ? "" : pst_rfc2426_escape(contact->other_state.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1985 fprintf(f_output, "%s;", (!contact->other_postal_code.str) ? "" : pst_rfc2426_escape(contact->other_postal_code.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1986 fprintf(f_output, "%s\n", (!contact->other_country.str) ? "" : pst_rfc2426_escape(contact->other_country.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1987 fprintf(f_output, "LABEL;TYPE=postal:%s\n", pst_rfc2426_escape(contact->other_address.str, &result, &resultlen));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1988 }
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1989
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1990 if (contact->business_fax.str) fprintf(f_output, "TEL;TYPE=work,fax:%s\n", pst_rfc2426_escape(contact->business_fax.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1991 if (contact->business_phone.str) fprintf(f_output, "TEL;TYPE=work,voice:%s\n", pst_rfc2426_escape(contact->business_phone.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1992 if (contact->business_phone2.str) fprintf(f_output, "TEL;TYPE=work,voice:%s\n", pst_rfc2426_escape(contact->business_phone2.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1993 if (contact->car_phone.str) fprintf(f_output, "TEL;TYPE=car,voice:%s\n", pst_rfc2426_escape(contact->car_phone.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1994 if (contact->home_fax.str) fprintf(f_output, "TEL;TYPE=home,fax:%s\n", pst_rfc2426_escape(contact->home_fax.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1995 if (contact->home_phone.str) fprintf(f_output, "TEL;TYPE=home,voice:%s\n", pst_rfc2426_escape(contact->home_phone.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1996 if (contact->home_phone2.str) fprintf(f_output, "TEL;TYPE=home,voice:%s\n", pst_rfc2426_escape(contact->home_phone2.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1997 if (contact->isdn_phone.str) fprintf(f_output, "TEL;TYPE=isdn:%s\n", pst_rfc2426_escape(contact->isdn_phone.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1998 if (contact->mobile_phone.str) fprintf(f_output, "TEL;TYPE=cell,voice:%s\n", pst_rfc2426_escape(contact->mobile_phone.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
1999 if (contact->other_phone.str) fprintf(f_output, "TEL;TYPE=msg:%s\n", pst_rfc2426_escape(contact->other_phone.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2000 if (contact->pager_phone.str) fprintf(f_output, "TEL;TYPE=pager:%s\n", pst_rfc2426_escape(contact->pager_phone.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2001 if (contact->primary_fax.str) fprintf(f_output, "TEL;TYPE=fax,pref:%s\n", pst_rfc2426_escape(contact->primary_fax.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2002 if (contact->primary_phone.str) fprintf(f_output, "TEL;TYPE=phone,pref:%s\n", pst_rfc2426_escape(contact->primary_phone.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2003 if (contact->radio_phone.str) fprintf(f_output, "TEL;TYPE=pcs:%s\n", pst_rfc2426_escape(contact->radio_phone.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2004 if (contact->telex.str) fprintf(f_output, "TEL;TYPE=bbs:%s\n", pst_rfc2426_escape(contact->telex.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2005 if (contact->job_title.str) fprintf(f_output, "TITLE:%s\n", pst_rfc2426_escape(contact->job_title.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2006 if (contact->profession.str) fprintf(f_output, "ROLE:%s\n", pst_rfc2426_escape(contact->profession.str, &result, &resultlen));
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
2007 if (contact->assistant_name.str || contact->assistant_phone.str) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2008 fprintf(f_output, "AGENT:BEGIN:VCARD\n");
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2009 if (contact->assistant_name.str) fprintf(f_output, "FN:%s\n", pst_rfc2426_escape(contact->assistant_name.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2010 if (contact->assistant_phone.str) fprintf(f_output, "TEL:%s\n", pst_rfc2426_escape(contact->assistant_phone.str, &result, &resultlen));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2011 }
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2012 if (contact->company_name.str) fprintf(f_output, "ORG:%s\n", pst_rfc2426_escape(contact->company_name.str, &result, &resultlen));
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2013 if (comment) fprintf(f_output, "NOTE:%s\n", pst_rfc2426_escape(comment, &result, &resultlen));
242
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2014 if (item->body.str) fprintf(f_output, "NOTE:%s\n", pst_rfc2426_escape(item->body.str, &result, &resultlen));
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2015
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2016 write_extra_categories(f_output, item);
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
2017
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2018 fprintf(f_output, "VERSION: 3.0\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2019 fprintf(f_output, "END:VCARD\n\n");
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2020 if (result) free(result);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2021 DEBUG_RET();
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
2022 }
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
2023
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
2024
242
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2025 /**
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2026 * write extra vcard or vcalendar categories from the extra keywords fields
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2027 *
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2028 * @param f_output open file pointer
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2029 * @param item pst item containing the keywords
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2030 * @return true if we write a categories line
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2031 */
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2032 int write_extra_categories(FILE* f_output, pst_item* item)
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2033 {
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2034 char* result = NULL;
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2035 size_t resultlen = 0;
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2036 pst_item_extra_field *ef = item->extra_fields;
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2037 const char *fmt = "CATEGORIES:%s";
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2038 int category_started = 0;
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2039 while (ef) {
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2040 if (strcmp(ef->field_name, "Keywords") == 0) {
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2041 fprintf(f_output, fmt, pst_rfc2426_escape(ef->value, &result, &resultlen));
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2042 fmt = ", %s";
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2043 category_started = 1;
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2044 }
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2045 ef = ef->next;
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2046 }
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2047 if (category_started) fprintf(f_output, "\n");
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2048 if (result) free(result);
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2049 return category_started;
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2050 }
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2051
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2052
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2053 void write_journal(FILE* f_output, pst_item* item)
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
2054 {
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2055 char* result = NULL;
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2056 size_t resultlen = 0;
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2057 char time_buffer[30];
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2058 pst_item_journal* journal = item->journal;
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2059
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2060 // make everything utf8
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2061 pst_convert_utf8_null(item, &item->subject);
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2062 pst_convert_utf8_null(item, &item->body);
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2063
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2064 fprintf(f_output, "BEGIN:VJOURNAL\n");
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2065 fprintf(f_output, "DTSTAMP:%s\n", pst_rfc2445_datetime_format_now(sizeof(time_buffer), time_buffer));
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2066 if (item->create_date)
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2067 fprintf(f_output, "CREATED:%s\n", pst_rfc2445_datetime_format(item->create_date, sizeof(time_buffer), time_buffer));
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2068 if (item->modify_date)
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2069 fprintf(f_output, "LAST-MOD:%s\n", pst_rfc2445_datetime_format(item->modify_date, sizeof(time_buffer), time_buffer));
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2070 if (item->subject.str)
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2071 fprintf(f_output, "SUMMARY:%s\n", pst_rfc2426_escape(item->subject.str, &result, &resultlen));
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2072 if (item->body.str)
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2073 fprintf(f_output, "DESCRIPTION:%s\n", pst_rfc2426_escape(item->body.str, &result, &resultlen));
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2074 if (journal && journal->start)
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2075 fprintf(f_output, "DTSTART;VALUE=DATE-TIME:%s\n", pst_rfc2445_datetime_format(journal->start, sizeof(time_buffer), time_buffer));
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2076 fprintf(f_output, "END:VJOURNAL\n");
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2077 if (result) free(result);
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2078 }
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2079
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2080
242
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2081 void write_appointment(FILE* f_output, pst_item* item)
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2082 {
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2083 char* result = NULL;
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2084 size_t resultlen = 0;
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2085 char time_buffer[30];
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2086 pst_item_appointment* appointment = item->appointment;
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2087
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
2088 // make everything utf8
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
2089 pst_convert_utf8_null(item, &item->subject);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
2090 pst_convert_utf8_null(item, &item->body);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
2091 pst_convert_utf8_null(item, &appointment->location);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
2092
297
8b3a827b71f4 add alarm reminders to calendar events
Carl Byington <carl@five-ten-sg.com>
parents: 292
diff changeset
2093 fprintf(f_output, "UID:%#"PRIx64"\n", item->block_id);
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2094 fprintf(f_output, "DTSTAMP:%s\n", pst_rfc2445_datetime_format_now(sizeof(time_buffer), time_buffer));
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2095 if (item->create_date)
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2096 fprintf(f_output, "CREATED:%s\n", pst_rfc2445_datetime_format(item->create_date, sizeof(time_buffer), time_buffer));
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2097 if (item->modify_date)
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2098 fprintf(f_output, "LAST-MOD:%s\n", pst_rfc2445_datetime_format(item->modify_date, sizeof(time_buffer), time_buffer));
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
2099 if (item->subject.str)
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2100 fprintf(f_output, "SUMMARY:%s\n", pst_rfc2426_escape(item->subject.str, &result, &resultlen));
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
2101 if (item->body.str)
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2102 fprintf(f_output, "DESCRIPTION:%s\n", pst_rfc2426_escape(item->body.str, &result, &resultlen));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2103 if (appointment && appointment->start)
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2104 fprintf(f_output, "DTSTART;VALUE=DATE-TIME:%s\n", pst_rfc2445_datetime_format(appointment->start, sizeof(time_buffer), time_buffer));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2105 if (appointment && appointment->end)
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2106 fprintf(f_output, "DTEND;VALUE=DATE-TIME:%s\n", pst_rfc2445_datetime_format(appointment->end, sizeof(time_buffer), time_buffer));
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
2107 if (appointment && appointment->location.str)
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2108 fprintf(f_output, "LOCATION:%s\n", pst_rfc2426_escape(appointment->location.str, &result, &resultlen));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2109 if (appointment) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2110 switch (appointment->showas) {
50
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2111 case PST_FREEBUSY_TENTATIVE:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2112 fprintf(f_output, "STATUS:TENTATIVE\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2113 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2114 case PST_FREEBUSY_FREE:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2115 // mark as transparent and as confirmed
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2116 fprintf(f_output, "TRANSP:TRANSPARENT\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2117 case PST_FREEBUSY_BUSY:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2118 case PST_FREEBUSY_OUT_OF_OFFICE:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2119 fprintf(f_output, "STATUS:CONFIRMED\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2120 break;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2121 }
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2122 if (appointment->is_recurring) {
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2123 const char* rules[] = {"DAILY", "WEEKLY", "MONTHLY", "YEARLY"};
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2124 const char* days[] = {"SU", "MO", "TU", "WE", "TH", "FR", "SA"};
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2125 pst_recurrence *rdata = pst_convert_recurrence(appointment);
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2126 fprintf(f_output, "RRULE:FREQ=%s", rules[rdata->type]);
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2127 if (rdata->count) fprintf(f_output, ";COUNT=%u", rdata->count);
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
2128 if ((rdata->interval != 1) &&
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
2129 (rdata->interval)) fprintf(f_output, ";INTERVAL=%u", rdata->interval);
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2130 if (rdata->dayofmonth) fprintf(f_output, ";BYMONTHDAY=%d", rdata->dayofmonth);
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2131 if (rdata->monthofyear) fprintf(f_output, ";BYMONTH=%d", rdata->monthofyear);
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2132 if (rdata->position) fprintf(f_output, ";BYSETPOS=%d", rdata->position);
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2133 if (rdata->bydaymask) {
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2134 char byday[40];
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2135 int empty = 1;
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2136 int i=0;
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2137 memset(byday, 0, sizeof(byday));
380
1e1970f93f94 allow all 7 days in bydays recurring appointment, update for fedora python packaging
Carl Byington <carl@five-ten-sg.com>
parents: 373
diff changeset
2138 for (i=0; i<7; i++) {
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2139 int bit = 1 << i;
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2140 if (bit & rdata->bydaymask) {
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2141 char temp[40];
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
2142 snprintf(temp, sizeof(temp), "%s%s%s", byday, (empty) ? ";BYDAY=" : ";", days[i]);
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2143 strcpy(byday, temp);
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2144 empty = 0;
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2145 }
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2146 }
201
3850a3b11745 fixes for parallel readpst
Carl Byington <carl@five-ten-sg.com>
parents: 200
diff changeset
2147 fprintf(f_output, "%s", byday);
199
e3a46f66332b more changes in recurrence decoding
Carl Byington <carl@five-ten-sg.com>
parents: 198
diff changeset
2148 }
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2149 fprintf(f_output, "\n");
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2150 pst_free_recurrence(rdata);
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2151 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2152 switch (appointment->label) {
50
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2153 case PST_APP_LABEL_NONE:
242
67b24d6a45d6 patch from Hugo DesRosiers to export categories and notes into vcards.
Carl Byington <carl@five-ten-sg.com>
parents: 239
diff changeset
2154 if (!write_extra_categories(f_output, item)) fprintf(f_output, "CATEGORIES:NONE\n");
50
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2155 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2156 case PST_APP_LABEL_IMPORTANT:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2157 fprintf(f_output, "CATEGORIES:IMPORTANT\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2158 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2159 case PST_APP_LABEL_BUSINESS:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2160 fprintf(f_output, "CATEGORIES:BUSINESS\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2161 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2162 case PST_APP_LABEL_PERSONAL:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2163 fprintf(f_output, "CATEGORIES:PERSONAL\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2164 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2165 case PST_APP_LABEL_VACATION:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2166 fprintf(f_output, "CATEGORIES:VACATION\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2167 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2168 case PST_APP_LABEL_MUST_ATTEND:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2169 fprintf(f_output, "CATEGORIES:MUST-ATTEND\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2170 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2171 case PST_APP_LABEL_TRAVEL_REQ:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2172 fprintf(f_output, "CATEGORIES:TRAVEL-REQUIRED\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2173 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2174 case PST_APP_LABEL_NEEDS_PREP:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2175 fprintf(f_output, "CATEGORIES:NEEDS-PREPARATION\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2176 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2177 case PST_APP_LABEL_BIRTHDAY:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2178 fprintf(f_output, "CATEGORIES:BIRTHDAY\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2179 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2180 case PST_APP_LABEL_ANNIVERSARY:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2181 fprintf(f_output, "CATEGORIES:ANNIVERSARY\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2182 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2183 case PST_APP_LABEL_PHONE_CALL:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2184 fprintf(f_output, "CATEGORIES:PHONE-CALL\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
2185 break;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2186 }
297
8b3a827b71f4 add alarm reminders to calendar events
Carl Byington <carl@five-ten-sg.com>
parents: 292
diff changeset
2187 // ignore bogus alarms
8b3a827b71f4 add alarm reminders to calendar events
Carl Byington <carl@five-ten-sg.com>
parents: 292
diff changeset
2188 if (appointment->alarm && (appointment->alarm_minutes >= 0) && (appointment->alarm_minutes < 1440)) {
8b3a827b71f4 add alarm reminders to calendar events
Carl Byington <carl@five-ten-sg.com>
parents: 292
diff changeset
2189 fprintf(f_output, "BEGIN:VALARM\n");
8b3a827b71f4 add alarm reminders to calendar events
Carl Byington <carl@five-ten-sg.com>
parents: 292
diff changeset
2190 fprintf(f_output, "TRIGGER:-PT%dM\n", appointment->alarm_minutes);
8b3a827b71f4 add alarm reminders to calendar events
Carl Byington <carl@five-ten-sg.com>
parents: 292
diff changeset
2191 fprintf(f_output, "ACTION:DISPLAY\n");
8b3a827b71f4 add alarm reminders to calendar events
Carl Byington <carl@five-ten-sg.com>
parents: 292
diff changeset
2192 fprintf(f_output, "DESCRIPTION:Reminder\n");
8b3a827b71f4 add alarm reminders to calendar events
Carl Byington <carl@five-ten-sg.com>
parents: 292
diff changeset
2193 fprintf(f_output, "END:VALARM\n");
8b3a827b71f4 add alarm reminders to calendar events
Carl Byington <carl@five-ten-sg.com>
parents: 292
diff changeset
2194 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2195 }
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2196 fprintf(f_output, "END:VEVENT\n");
211
94bde95d7e18 the shared library interface should now be thread safe
Carl Byington <carl@five-ten-sg.com>
parents: 205
diff changeset
2197 if (result) free(result);
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
2198 }
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
2199
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
2200
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
2201 void create_enter_dir(struct file_ll* f, pst_item *item)
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
2202 {
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2203 memset(f, 0, sizeof(*f));
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2204 f->stored_count = (item->folder) ? item->folder->item_count : 0;
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
2205 pst_convert_utf8(item, &item->file_as);
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2206 f->dname = (char*) pst_malloc(strlen(item->file_as.str)+1);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2207 strcpy(f->dname, item->file_as.str);
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
2208
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2209 DEBUG_ENT("create_enter_dir");
367
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2210 if (mode == MODE_KMAIL) {
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2211 int32_t t;
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2212 mk_kmail_dir(item->file_as.str);
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2213 for (t=0; t<PST_TYPE_MAX; t++) {
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2214 if (t == reduced_item_type(t)) {
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2215 f->name[t] = (char*) pst_malloc(strlen(item->file_as.str)+strlen(OUTPUT_TEMPLATE)+30);
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2216 sprintf(f->name[t], OUTPUT_TEMPLATE, item->file_as.str, item_type_to_name(t));
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2217 }
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2218 }
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2219 } else if (mode == MODE_RECURSE) {
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2220 int32_t t;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2221 mk_recurse_dir(item->file_as.str);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2222 for (t=0; t<PST_TYPE_MAX; t++) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2223 if (t == reduced_item_type(t)) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2224 f->name[t] = strdup(item_type_to_name(t));
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2225 }
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2226 }
231
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
2227 if (mode_thunder) {
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
2228 FILE *type_file = fopen(".type", "w");
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
2229 fprintf(type_file, "%d\n", item->type);
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
2230 fclose(type_file);
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
2231 }
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
2232 } else if (mode == MODE_SEPARATE) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2233 // do similar stuff to recurse here.
367
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2234 int32_t t;
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
2235 mk_separate_dir(item->file_as.str);
367
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2236 for (t=0; t<PST_TYPE_MAX; t++) {
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2237 if (t == reduced_item_type(t)) {
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2238 f->name[t] = (char*) pst_malloc(file_name_len);
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2239 memset(f->name[t], 0, file_name_len);
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2240 }
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2241 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2242 } else {
367
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2243 // MODE_NORMAL
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2244 int32_t t;
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2245 for (t=0; t<PST_TYPE_MAX; t++) {
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2246 if (t == reduced_item_type(t)) {
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2247 f->name[t] = (char*) pst_malloc(strlen(item->file_as.str)+strlen(OUTPUT_TEMPLATE)+30);
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2248 sprintf(f->name[t], OUTPUT_TEMPLATE, item->file_as.str, item_type_to_name(t));
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2249 }
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2250 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2251 }
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
2252
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2253 if (mode != MODE_SEPARATE) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2254 int32_t t;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2255 for (t=0; t<PST_TYPE_MAX; t++) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2256 if (f->name[t]) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2257 if (!overwrite) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2258 int x = 0;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2259 char *temp = (char*) pst_malloc (strlen(f->name[t])+10); //enough room for 10 digits
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
2260
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2261 sprintf(temp, "%s", f->name[t]);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2262 check_filename(temp);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2263 while ((f->output[t] = fopen(temp, "r"))) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2264 DEBUG_INFO(("need to increase filename because one already exists with that name\n"));
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2265 x++;
366
67a3ee227495 fix bug in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 365
diff changeset
2266 sprintf(temp, "%s%08d", f->name[t], x);
67a3ee227495 fix bug in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 365
diff changeset
2267 DEBUG_INFO(("- bump file name and try \"%s\"\n", temp));
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2268 if (x == 99999999) {
366
67a3ee227495 fix bug in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 365
diff changeset
2269 DIE(("create_enter_dir: Why can I not create a folder %s? I have tried %i extensions...\n", f->name[t], x));
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2270 }
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2271 fclose(f->output[t]);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2272 }
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2273 if (x > 0) { //then the f->name should change
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2274 free (f->name[t]);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2275 f->name[t] = temp;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2276 } else {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2277 free(temp);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2278 }
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2279 }
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2280 check_filename(f->name[t]);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2281 if (!(f->output[t] = fopen(f->name[t], "w"))) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2282 DIE(("create_enter_dir: Could not open file \"%s\" for write\n", f->name[t]));
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2283 }
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2284 DEBUG_INFO(("f->name = %s\nitem->folder_name = %s\n", f->name[t], item->file_as.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2285 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2286 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2287 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2288 DEBUG_RET();
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
2289 }
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
2290
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
2291
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
2292 void close_enter_dir(struct file_ll *f)
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
2293 {
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2294 int32_t t;
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
2295 DEBUG_INFO(("processed item count for folder %s is %i, skipped %i, total %i \n",
167
40e9de445038 improve consistency checking when fetching items from the pst file.
Carl Byington <carl@five-ten-sg.com>
parents: 164
diff changeset
2296 f->dname, f->item_count, f->skip_count, f->stored_count));
202
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
2297 if (output_mode != OUTPUT_QUIET) {
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
2298 pst_debug_lock();
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
2299 printf("\t\"%s\" - %i items done, %i items skipped.\n", f->dname, f->item_count, f->skip_count);
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
2300 fflush(stdout);
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
2301 pst_debug_unlock();
2f38c4ce606f remove readpstlog, switch to plain ascii debug log files
Carl Byington <carl@five-ten-sg.com>
parents: 201
diff changeset
2302 }
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2303 for (t=0; t<PST_TYPE_MAX; t++) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2304 if (f->output[t]) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2305 if (mode == MODE_SEPARATE) DEBUG_WARN(("close_enter_dir finds open separate file\n"));
367
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2306 fclose(f->output[t]);
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2307 f->output[t] = NULL;
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2308 }
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2309 if (f->name[t]) {
363
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2310 struct stat st;
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2311 stat(f->name[t], &st);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2312 if (!st.st_size) {
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2313 DEBUG_WARN(("removing empty output file %s\n", f->name[t]));
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2314 remove(f->name[t]);
3a1d25c579c6 allow folders containing multiple item types; better detection of valid internet headers
Carl Byington <carl@five-ten-sg.com>
parents: 358
diff changeset
2315 }
367
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2316 free(f->name[t]);
6b7c19a820e1 fix bugs in code allowing folders containing multiple item types
Carl Byington <carl@five-ten-sg.com>
parents: 366
diff changeset
2317 f->name[t] = NULL;
198
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2318 }
7c60d6d1c681 decode more recurrence mapi elements
Carl Byington <carl@five-ten-sg.com>
parents: 197
diff changeset
2319 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2320 free(f->dname);
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
2321
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2322 if (mode == MODE_KMAIL)
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2323 close_kmail_dir();
231
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
2324 else if (mode == MODE_RECURSE) {
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
2325 if (mode_thunder) {
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
2326 FILE *type_file = fopen(".size", "w");
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
2327 fprintf(type_file, "%i %i\n", f->item_count, f->stored_count);
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
2328 fclose(type_file);
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
2329 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
2330 close_recurse_dir();
231
fe64279df92b patches from Chris White, Roberto Polli, Justin Greer
Carl Byington <carl@five-ten-sg.com>
parents: 230
diff changeset
2331 } else if (mode == MODE_SEPARATE)
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
2332 close_separate_dir();
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
2333 }
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
2334