Mercurial > libpst
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 |
rev | line source |
---|---|
16 | 1 /*** |
2 * readpst.c | |
3 * Part of the LibPST project | |
4 * Written by David Smith | |
43 | 5 * dave.s@earthcorp.com |
16 | 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 | 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 | 16 |
17 // max size of the c_time char*. It will store the date of the email | |
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 | 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 | 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 | 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 | 26 int32_t skip_count; |
16 | 27 }; |
31 | 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 | 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 | 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 | 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 | 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 | 44 char* my_stristr(char *haystack, char *needle); |
45 void check_filename(char *fname); | |
328 | 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 | 67 void create_enter_dir(struct file_ll* f, pst_item *item); |
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 | 73 |
16 | 74 // Normal mode just creates mbox format files in the current directory. Each file is named |
75 // the same as the folder's name that it represents | |
76 #define MODE_NORMAL 0 | |
77 | 77 |
16 | 78 // KMail mode creates a directory structure suitable for being used directly |
79 // by the KMail application | |
80 #define MODE_KMAIL 1 | |
77 | 81 |
16 | 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 | 84 #define MODE_RECURSE 2 |
77 | 85 |
86 // separate mode creates the same directory structure as recurse. The emails are stored in | |
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 | 89 #define MODE_SEPARATE 3 |
90 | |
16 | 91 |
92 // Output Normal just prints the standard information about what is going on | |
93 #define OUTPUT_NORMAL 0 | |
77 | 94 |
16 | 95 // Output Quiet is provided so that only errors are printed |
96 #define OUTPUT_QUIET 1 | |
97 | |
98 // default mime-type for attachments that have a null mime-type | |
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 | 101 |
102 // output mode for contacts | |
103 #define CMODE_VCARD 0 | |
43 | 104 #define CMODE_LIST 1 |
16 | 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 | 116 // output settings for RTF bodies |
117 // filename for the attachment | |
118 #define RTF_ATTACH_NAME "rtf-body.rtf" | |
119 // mime type for the attachment | |
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 | 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 | 140 char* acceptable_extensions = NULL; |
39 | 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 | 182 if (status != 0) { |
183 exit(status); | |
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 | 208 // If children have called sem_post but not exited yet, we could have available > 0 but active_children == max_children |
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 | 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 | 241 { |
43 | 242 struct file_ll ff; |
243 pst_item *item = NULL; | |
39 | 244 |
43 | 245 DEBUG_ENT("process"); |
246 create_enter_dir(&ff, outeritem); | |
39 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 405 } |
406 close_enter_dir(&ff); | |
407 DEBUG_RET(); | |
39 | 408 } |
409 | |
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 | 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 | 415 char * fname = NULL; |
48 | 416 char *d_log = NULL; |
43 | 417 int c,x; |
418 char *temp = NULL; //temporary char pointer | |
419 prog_name = argv[0]; | |
16 | 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 | 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 | 431 switch (c) { |
328 | 432 case 'a': |
433 if (optarg) { | |
434 int n = strlen(optarg); | |
435 acceptable_extensions = (char*)pst_malloc(n+2); | |
436 strcpy(acceptable_extensions, optarg); | |
437 acceptable_extensions[n+1] = '\0'; // double null terminates array of non-empty null terminated strings. | |
438 char *p = acceptable_extensions; | |
439 while (*p) { | |
440 if (*p == ',') *p = '\0'; | |
441 p++; | |
442 } | |
443 } | |
444 break; | |
43 | 445 case 'b': |
446 save_rtf_body = 0; | |
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 | 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 | 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 | 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 | 466 else { |
467 usage(); | |
468 exit(0); | |
469 } | |
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 | 474 case 'd': |
475 d_log = optarg; | |
476 break; | |
477 case 'h': | |
478 usage(); | |
479 exit(0); | |
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 | 484 break; |
485 case 'k': | |
486 mode = MODE_KMAIL; | |
487 break; | |
488 case 'M': | |
77 | 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 | 510 break; |
511 case 'o': | |
512 output_dir = optarg; | |
513 break; | |
514 case 'q': | |
515 output_mode = OUTPUT_QUIET; | |
516 break; | |
517 case 'r': | |
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 | 520 break; |
521 case 'S': | |
77 | 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 | 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 | 565 case 'w': |
566 overwrite = 1; | |
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 | 571 default: |
572 usage(); | |
573 exit(1); | |
574 break; | |
575 } | |
576 } | |
577 | |
578 if (argc > optind) { | |
579 fname = argv[optind]; | |
580 } else { | |
581 usage(); | |
582 exit(2); | |
583 } | |
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 | 609 #ifdef DEBUG_ALL |
610 // force a log file | |
611 if (!d_log) d_log = "readpst.log"; | |
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 | 618 DEBUG_ENT("main"); |
16 | 619 |
43 | 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 | 622 RET_DERROR(pst_load_index(&pstfile), 2, ("Index Error\n")); |
623 | |
624 pst_load_extended_attributes(&pstfile); | |
16 | 625 |
43 | 626 if (chdir(output_dir)) { |
627 x = errno; | |
628 pst_close(&pstfile); | |
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 | 631 } |
632 | |
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 | 635 if (!item || !item->message_store) { |
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 | 638 } |
16 | 639 |
43 | 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 | 642 if (!(temp = strrchr(fname, '/'))) |
643 if (!(temp = strrchr(fname, '\\'))) | |
644 temp = fname; | |
645 else | |
646 temp++; // get past the "\\" | |
647 else | |
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 | 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 | 655 |
43 | 656 d_ptr = pst_getTopOfFolders(&pstfile, item); |
657 if (!d_ptr) { | |
658 DEBUG_RET(); | |
659 DIE(("Top of folders record not found. Cannot continue\n")); | |
660 } | |
16 | 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 | 678 return 0; |
16 | 679 } |
31 | 680 |
681 | |
16 | 682 void write_email_body(FILE *f, char *body) { |
43 | 683 char *n = body; |
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 | 695 } |
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 | 698 DEBUG_RET(); |
16 | 699 } |
31 | 700 |
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 | 704 char *a, *b; |
705 DEBUG_ENT("removeCR"); | |
706 a = b = c; | |
707 while (*a != '\0') { | |
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 | 710 a++; |
711 } | |
712 *b = '\0'; | |
713 DEBUG_RET(); | |
16 | 714 } |
31 | 715 |
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 | 718 DEBUG_ENT("usage"); |
719 version(); | |
720 printf("Usage: %s [OPTIONS] {PST FILENAME}\n", prog_name); | |
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 | 727 printf("\t-S\t- Separate. Write emails in the separate format\n"); |
328 | 728 printf("\t-a <attachment-extension-list>\t- Discard any attachment without an extension on the list\n"); |
43 | 729 printf("\t-b\t- Don't save RTF-Body attachments\n"); |
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 | 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 | 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 | 738 printf("\t-q\t- Quiet. Only print error messages\n"); |
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 | 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 | 746 DEBUG_RET(); |
16 | 747 } |
31 | 748 |
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 | 751 DEBUG_ENT("version"); |
50 | 752 printf("ReadPST / LibPST v%s\n", VERSION); |
16 | 753 #if BYTE_ORDER == BIG_ENDIAN |
43 | 754 printf("Big Endian implementation being used.\n"); |
16 | 755 #elif BYTE_ORDER == LITTLE_ENDIAN |
43 | 756 printf("Little Endian implementation being used.\n"); |
16 | 757 #else |
758 # error "Byte order not supported by this library" | |
759 #endif | |
43 | 760 DEBUG_RET(); |
16 | 761 } |
31 | 762 |
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 | 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 | 768 int x; |
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 | 771 sprintf(dir, OUTPUT_KMAIL_DIR_TEMPLATE, fname); |
772 check_filename(dir); | |
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 | 775 x = errno; |
776 DIE(("mk_kmail_dir: Cannot create directory %s: %s\n", dir, strerror(x))); | |
777 } | |
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 | 783 free (dir); |
16 | 784 |
43 | 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 | 787 sprintf(index, KMAIL_INDEX, fname); |
788 unlink(index); | |
789 free(index); | |
16 | 790 |
43 | 791 DEBUG_RET(); |
16 | 792 } |
31 | 793 |
794 | |
16 | 795 int close_kmail_dir() { |
43 | 796 int x; |
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 | 801 } |
802 DEBUG_RET(); | |
803 return 0; | |
16 | 804 } |
31 | 805 |
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 | 855 int x; |
856 DEBUG_ENT("mk_recurse_dir"); | |
857 check_filename(dir); | |
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 | 860 x = errno; |
861 DIE(("mk_recurse_dir: Cannot create directory %s: %s\n", dir, strerror(x))); | |
862 } | |
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 | 865 x = errno; |
866 DIE(("mk_recurse_dir: Cannot change to directory %s: %s\n", dir, strerror(x))); | |
867 } | |
868 DEBUG_RET(); | |
16 | 869 } |
31 | 870 |
871 | |
16 | 872 int close_recurse_dir() { |
43 | 873 int x; |
874 DEBUG_ENT("close_recurse_dir"); | |
875 if (chdir("..")) { | |
876 x = errno; | |
877 DIE(("close_recurse_dir: Cannot go up dir (..): %s\n", strerror(x))); | |
878 } | |
879 DEBUG_RET(); | |
880 return 0; | |
16 | 881 } |
31 | 882 |
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 | 885 size_t dirsize = strlen(dir) + 10; |
886 char dir_name[dirsize]; | |
887 int x = 0, y = 0; | |
16 | 888 |
77 | 889 DEBUG_ENT("mk_separate_dir"); |
43 | 890 do { |
891 if (y == 0) | |
892 snprintf(dir_name, dirsize, "%s", dir); | |
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 | 895 |
43 | 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 | 898 if (D_MKDIR(dir_name)) { |
899 if (errno != EEXIST) { // if there is an error, and it doesn't already exist | |
900 x = errno; | |
77 | 901 DIE(("mk_separate_dir: Cannot create directory %s: %s\n", dir, strerror(x))); |
43 | 902 } |
903 } else { | |
904 break; | |
905 } | |
906 y++; | |
907 } while (overwrite == 0); | |
16 | 908 |
43 | 909 if (chdir(dir_name)) { |
910 x = errno; | |
77 | 911 DIE(("mk_separate_dir: Cannot change to directory %s: %s\n", dir, strerror(x))); |
43 | 912 } |
16 | 913 |
43 | 914 if (overwrite) { |
915 // we should probably delete all files from this directory | |
16 | 916 #if !defined(WIN32) && !defined(__CYGWIN__) |
43 | 917 DIR * sdir = NULL; |
918 struct dirent *dirent = NULL; | |
919 struct stat filestat; | |
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 | 922 } else { |
923 while ((dirent = readdir(sdir))) { | |
924 if (lstat(dirent->d_name, &filestat) != -1) | |
925 if (S_ISREG(filestat.st_mode)) { | |
926 if (unlink(dirent->d_name)) { | |
927 y = errno; | |
77 | 928 DIE(("mk_separate_dir: unlink returned error on file %s: %s\n", dirent->d_name, strerror(y))); |
43 | 929 } |
930 } | |
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 | 933 } |
26 | 934 #endif |
43 | 935 } |
16 | 936 |
43 | 937 DEBUG_RET(); |
16 | 938 } |
31 | 939 |
940 | |
77 | 941 int close_separate_dir() { |
43 | 942 int x; |
77 | 943 DEBUG_ENT("close_separate_dir"); |
43 | 944 if (chdir("..")) { |
945 x = errno; | |
77 | 946 DIE(("close_separate_dir: Cannot go up dir (..): %s\n", strerror(x))); |
43 | 947 } |
948 DEBUG_RET(); | |
949 return 0; | |
16 | 950 } |
31 | 951 |
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 | 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 | 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 | 965 } |
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 | 986 } |
31 | 987 |
988 | |
16 | 989 char *my_stristr(char *haystack, char *needle) { |
43 | 990 // my_stristr varies from strstr in that its searches are case-insensitive |
991 char *x=haystack, *y=needle, *z = NULL; | |
52 | 992 if (!haystack || !needle) { |
43 | 993 return NULL; |
52 | 994 } |
43 | 995 while (*y != '\0' && *x != '\0') { |
996 if (tolower(*y) == tolower(*x)) { | |
997 // move y on one | |
998 y++; | |
999 if (!z) { | |
1000 z = x; // store first position in haystack where a match is made | |
1001 } | |
1002 } else { | |
1003 y = needle; // reset y to the beginning of the needle | |
1004 z = NULL; // reset the haystack storage point | |
1005 } | |
1006 x++; // advance the search in the haystack | |
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 | 1010 return z; |
16 | 1011 } |
31 | 1012 |
1013 | |
41
183ae993b9ad
security fix for potential buffer overrun in lz decompress
carl
parents:
39
diff
changeset
|
1014 void check_filename(char *fname) { |
43 | 1015 char *t = fname; |
1016 DEBUG_ENT("check_filename"); | |
1017 if (!t) { | |
1018 DEBUG_RET(); | |
52 | 1019 return; |
43 | 1020 } |
1021 while ((t = strpbrk(t, "/\\:"))) { | |
1022 // while there are characters in the second string that we don't want | |
1023 *t = '_'; //replace them with an underscore | |
1024 } | |
1025 DEBUG_RET(); | |
16 | 1026 } |
31 | 1027 |
1028 | |
328 | 1029 /** |
1030 * check if the file name extension is acceptable. If not, the attachment | |
1031 * will be discarded | |
1032 * @param attach pst attachment object | |
1033 * @return true if the attachment filename contains an extension that we want. | |
1034 */ | |
1035 int acceptable_ext(pst_item_attach* attach) | |
1036 { | |
1037 if (!acceptable_extensions || *acceptable_extensions == '\0') return 1; // acceptable list missing or empty | |
1038 char *attach_filename = (attach->filename2.str) ? attach->filename2.str | |
1039 : attach->filename1.str; | |
1040 if (!attach_filename) return 1; // attachment with no name is always acceptable | |
1041 char *e = strrchr(attach_filename, '.'); | |
1042 if (!e) return 1; // attachment with no extension is always acceptable. | |
1043 DEBUG_ENT("acceptable_ext"); | |
1044 DEBUG_INFO(("attachment extension %s\n", e)); | |
1045 int rc = 0; | |
1046 char *a = acceptable_extensions; | |
1047 while (*a) { | |
1048 if (pst_stricmp(a, e) == 0) { | |
1049 rc = 1; | |
1050 break; | |
1051 } | |
1052 a += strlen(a) + 1; | |
1053 } | |
1054 DEBUG_INFO(("attachment acceptable returns %d\n", rc)); | |
1055 DEBUG_RET(); | |
1056 return rc; | |
1057 } | |
1058 | |
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 | 1061 { |
43 | 1062 FILE *fp = NULL; |
1063 int x = 0; | |
1064 char *temp = NULL; | |
31 | 1065 |
43 | 1066 // If there is a long filename (filename2) use that, otherwise |
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 | 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 | 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 | 1083 check_filename(f_name); |
1084 if (!attach_filename) { | |
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 | 1087 sprintf(temp, "%s-attach%i", f_name, attach_num); |
1088 } else { | |
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 | 1091 do { |
1092 if (fp) fclose(fp); | |
1093 if (x == 0) | |
1094 sprintf(temp, "%s-%s", f_name, attach_filename); | |
1095 else | |
1096 sprintf(temp, "%s-%s-%i", f_name, attach_filename, x); | |
1097 } while ((fp = fopen(temp, "r")) && ++x < 99999999); | |
1098 if (x > 99999999) { | |
1099 DIE(("error finding attachment name. exhausted possibilities to %s\n", temp)); | |
1100 } | |
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 | 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 | 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 | 1107 fclose(fp); |
1108 } | |
1109 if (temp) free(temp); | |
1110 DEBUG_RET(); | |
25 | 1111 } |
1112 | |
31 | 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 | 1183 { |
43 | 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 | 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 | 1231 fprintf(f_output, "\n\n"); |
1232 DEBUG_RET(); | |
25 | 1233 } |
1234 | |
31 | 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 | 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 | 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 | 1548 char *temp = NULL; |
1549 time_t em_time; | |
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 | 1554 DEBUG_ENT("write_normal_email"); |
25 | 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 | 1579 // convert the sent date if it exists, or set it to a fixed date |
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 | 1582 c_time = ctime(&em_time); |
1583 if (c_time) | |
1584 c_time[strlen(c_time)-1] = '\0'; //remove end \n | |
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 | 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 | 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 | 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 | 1605 // but only for the outermost message |
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 | 1608 } |
25 | 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 | 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 | 1649 } |
25 | 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 | 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 | 1656 } |
31 | 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 | 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 | 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 | 1709 } else { |
1710 fprintf(f_output, "Subject: \n"); | |
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 | 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 | 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 | 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 | 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 | 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 | 1766 } |
31 | 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 | 1790 } |
25 | 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 | 1803 } |
31 | 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 | 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 | 1825 } |
31 | 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 | 1852 if (acceptable_ext(attach)) { |
1853 if (mode == MODE_SEPARATE && !mode_MH) | |
1854 write_separate_attachment(f_name, attach, ++attach_num, pst); | |
1855 else | |
1856 write_inline_attachment(f_output, attach, boundary, pst); | |
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 | 1859 } |
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 | 1863 DEBUG_RET(); |
25 | 1864 } |
1865 | |
31 | 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 | 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 | 1872 // We can only call rfc escape once per printf, since the second call |
1873 // may free the buffer returned by the first call. | |
1874 // I had tried to place those into a single printf - Carl. | |
39 | 1875 |
43 | 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 | 1932 // the specification I am following is (hopefully) RFC2426 vCard Mime Directory Profile |
43 | 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 | 1935 |
43 | 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 | 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 | 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 | 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 | 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 | 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 | 1964 } |
39 | 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 | 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 | 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 | 1976 } |
39 | 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 | 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 | 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 | 1988 } |
39 | 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 | 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 | 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 | 2017 |
43 | 2018 fprintf(f_output, "VERSION: 3.0\n"); |
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 | 2021 DEBUG_RET(); |
25 | 2022 } |
2023 | |
31 | 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 | 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 | 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 | 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 | 2109 if (appointment) { |
2110 switch (appointment->showas) { | |
50 | 2111 case PST_FREEBUSY_TENTATIVE: |
2112 fprintf(f_output, "STATUS:TENTATIVE\n"); | |
2113 break; | |
2114 case PST_FREEBUSY_FREE: | |
2115 // mark as transparent and as confirmed | |
2116 fprintf(f_output, "TRANSP:TRANSPARENT\n"); | |
2117 case PST_FREEBUSY_BUSY: | |
2118 case PST_FREEBUSY_OUT_OF_OFFICE: | |
2119 fprintf(f_output, "STATUS:CONFIRMED\n"); | |
2120 break; | |
43 | 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 | 2152 switch (appointment->label) { |
50 | 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 | 2155 break; |
2156 case PST_APP_LABEL_IMPORTANT: | |
2157 fprintf(f_output, "CATEGORIES:IMPORTANT\n"); | |
2158 break; | |
2159 case PST_APP_LABEL_BUSINESS: | |
2160 fprintf(f_output, "CATEGORIES:BUSINESS\n"); | |
2161 break; | |
2162 case PST_APP_LABEL_PERSONAL: | |
2163 fprintf(f_output, "CATEGORIES:PERSONAL\n"); | |
2164 break; | |
2165 case PST_APP_LABEL_VACATION: | |
2166 fprintf(f_output, "CATEGORIES:VACATION\n"); | |
2167 break; | |
2168 case PST_APP_LABEL_MUST_ATTEND: | |
2169 fprintf(f_output, "CATEGORIES:MUST-ATTEND\n"); | |
2170 break; | |
2171 case PST_APP_LABEL_TRAVEL_REQ: | |
2172 fprintf(f_output, "CATEGORIES:TRAVEL-REQUIRED\n"); | |
2173 break; | |
2174 case PST_APP_LABEL_NEEDS_PREP: | |
2175 fprintf(f_output, "CATEGORIES:NEEDS-PREPARATION\n"); | |
2176 break; | |
2177 case PST_APP_LABEL_BIRTHDAY: | |
2178 fprintf(f_output, "CATEGORIES:BIRTHDAY\n"); | |
2179 break; | |
2180 case PST_APP_LABEL_ANNIVERSARY: | |
2181 fprintf(f_output, "CATEGORIES:ANNIVERSARY\n"); | |
2182 break; | |
2183 case PST_APP_LABEL_PHONE_CALL: | |
2184 fprintf(f_output, "CATEGORIES:PHONE-CALL\n"); | |
2185 break; | |
43 | 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 | 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 | 2198 } |
2199 | |
31 | 2200 |
39 | 2201 void create_enter_dir(struct file_ll* f, pst_item *item) |
25 | 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 | 2208 |
43 | 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 | 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 | 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 | 2251 } |
25 | 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 | 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 | 2285 } |
2286 } | |
2287 } | |
2288 DEBUG_RET(); | |
25 | 2289 } |
2290 | |
39 | 2291 |
2292 void close_enter_dir(struct file_ll *f) | |
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 | 2320 free(f->dname); |
39 | 2321 |
43 | 2322 if (mode == MODE_KMAIL) |
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 | 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 | 2332 close_separate_dir(); |
39 | 2333 } |
2334 |