annotate src/readpst.c @ 164:ab384fed78c5

Compensate for iconv conversion to utf-7 that produces strings that are not null terminated. Don't produce empty attachment files in separate mode.
author Carl Byington <carl@five-ten-sg.com>
date Mon, 16 Mar 2009 18:31:39 -0700
parents 581fab9f1dc7
children 40e9de445038
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
1 /***
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
2 * readpst.c
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
3 * Part of the LibPST project
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
4 * Written by David Smith
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
5 * dave.s@earthcorp.com
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
6 */
59
7d5c637aaafb General cleanup and code fixes.
Carl Byington <carl@five-ten-sg.com>
parents: 52
diff changeset
7
122
bdb38b434c0a more changes from Fridrich Strba to avoid installing our config.h
Carl Byington <carl@five-ten-sg.com>
parents: 121
diff changeset
8 #include "define.h"
bdb38b434c0a more changes from Fridrich Strba to avoid installing our config.h
Carl Byington <carl@five-ten-sg.com>
parents: 121
diff changeset
9 #include "lzfu.h"
bdb38b434c0a more changes from Fridrich Strba to avoid installing our config.h
Carl Byington <carl@five-ten-sg.com>
parents: 121
diff changeset
10
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
11 #define OUTPUT_TEMPLATE "%s"
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
12 #define OUTPUT_KMAIL_DIR_TEMPLATE ".%s.directory"
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
13 #define KMAIL_INDEX ".%s.index"
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
14 #define SEP_MAIL_FILE_TEMPLATE "%i"
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
15
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
16 // max size of the c_time char*. It will store the date of the email
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
17 #define C_TIME_SIZE 500
59
7d5c637aaafb General cleanup and code fixes.
Carl Byington <carl@five-ten-sg.com>
parents: 52
diff changeset
18
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
19 struct file_ll {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
20 char *name;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
21 char *dname;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
22 FILE * output;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
23 int32_t stored_count;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
24 int32_t email_count;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
25 int32_t skip_count;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
26 int32_t type;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
27 };
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
28
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
29 void process(pst_item *outeritem, pst_desc_ll *d_ptr);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
30 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
31 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
32 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
33 void version();
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
34 char* mk_kmail_dir(char* fname);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
35 int close_kmail_dir();
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
36 char* mk_recurse_dir(char* dir, int32_t folder_type);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
37 int close_recurse_dir();
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
38 char* mk_separate_dir(char *dir);
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
39 int close_separate_dir();
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
40 int mk_separate_file(struct file_ll *f);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
41 char* my_stristr(char *haystack, char *needle);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
42 void check_filename(char *fname);
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
43 void write_separate_attachment(char f_name[], pst_item_attach* attach, int attach_num, pst_file* pst);
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
44 void write_embedded_message(FILE* f_output, pst_item_attach* attach, char *boundary, pst_file* pf, 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
45 void write_inline_attachment(FILE* f_output, pst_item_attach* attach, 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
46 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
47 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
48 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
49 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
50 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
51 int test_base64(char *body);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
52 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
53 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
54 void write_body_part(FILE* f_output, pst_string *body, char *mime, char *charset, char *boundary, pst_file* pst);
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
55 void write_normal_email(FILE* f_output, char f_name[], pst_item* item, int mode, int mode_MH, pst_file* pst, int save_rtf, 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
56 void write_vcard(FILE* f_output, pst_item *item, pst_item_contact* contact, char comment[]);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
57 void write_appointment(FILE* f_output, pst_item *item, pst_item_appointment* appointment,
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
58 FILETIME* create_date, FILETIME* modify_date);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
59 void create_enter_dir(struct file_ll* f, pst_item *item);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
60 void close_enter_dir(struct file_ll *f);
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 33
diff changeset
61
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
62 const char* prog_name;
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 33
diff changeset
63 char* output_dir = ".";
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 33
diff changeset
64 char* kmail_chdir = NULL;
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
65
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
66 // Normal mode just creates mbox format files in the current directory. Each file is named
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
67 // the same as the folder's name that it represents
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
68 #define MODE_NORMAL 0
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
69
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
70 // KMail mode creates a directory structure suitable for being used directly
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
71 // by the KMail application
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
72 #define MODE_KMAIL 1
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
73
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
74 // recurse mode creates a directory structure like the PST file. Each directory
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
75 // contains only one file which stores the emails in mbox format.
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
76 #define MODE_RECURSE 2
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
78 // separate mode creates the same directory structure as recurse. The emails are stored in
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
79 // separate files, numbering from 1 upward. Attachments belonging to the emails are
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
80 // saved as email_no-filename (e.g. 1-samplefile.doc or 000001-Attachment2.zip)
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
81 #define MODE_SEPARATE 3
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
82
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
83 // Decrypt the whole file (even the parts that aren't encrypted) and ralph it to stdout
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
84 #define MODE_DECSPEW 4
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
85
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
86
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
87 // Output Normal just prints the standard information about what is going on
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
88 #define OUTPUT_NORMAL 0
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
89
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
90 // Output Quiet is provided so that only errors are printed
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
91 #define OUTPUT_QUIET 1
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
92
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
93 // default mime-type for attachments that have a null mime-type
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
94 #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
95 #define RFC822 "message/rfc822"
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
96
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
97 // output mode for contacts
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
98 #define CMODE_VCARD 0
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
99 #define CMODE_LIST 1
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
100
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
101 // 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
102 #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
103 #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
104
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
105 // output settings for RTF bodies
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
106 // filename for the attachment
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
107 #define RTF_ATTACH_NAME "rtf-body.rtf"
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
108 // mime type for the attachment
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
109 #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
110
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
111 // global settings
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
112 int mode = MODE_NORMAL;
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
113 int mode_MH = 0; // a submode of MODE_SEPARATE
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
114 int output_mode = OUTPUT_NORMAL;
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
115 int contact_mode = CMODE_VCARD;
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
116 int deleted_mode = DMODE_EXCLUDE;
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
117 int contact_mode_specified = 0;
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
118 int overwrite = 0;
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
119 int save_rtf_body = 1;
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
120 pst_file pstfile;
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
121 regex_t meta_charset_pattern;
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
122
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
123
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
124 void process(pst_item *outeritem, pst_desc_ll *d_ptr)
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
125 {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
126 struct file_ll ff;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
127 pst_item *item = NULL;
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
128
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
129 DEBUG_ENT("process");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
130 memset(&ff, 0, sizeof(ff));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
131 create_enter_dir(&ff, outeritem);
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
132
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
133 while (d_ptr) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
134 DEBUG_MAIN(("main: New item record\n"));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
135 if (!d_ptr->desc) {
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
136 DEBUG_WARN(("main: ERROR item's desc record is NULL\n"));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
137 ff.skip_count++;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
138 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
139 else {
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
140 DEBUG_MAIN(("main: Desc Email ID %#"PRIx64" [d_ptr->d_id = %#"PRIx64"]\n", d_ptr->desc->i_id, d_ptr->d_id));
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
141
143
fdc58ad2c758 fix embedded rfc822 messages with attachments
Carl Byington <carl@five-ten-sg.com>
parents: 142
diff changeset
142 item = pst_parse_item(&pstfile, d_ptr, NULL);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
143 DEBUG_MAIN(("main: About to process item\n"));
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
144 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
145 DEBUG_EMAIL(("item->subject = %s\n", item->subject.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
146 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
147 if (item) {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
148 if (item->folder && d_ptr->child && item->file_as.str && (deleted_mode == DMODE_INCLUDE || strcasecmp(item->file_as.str, "Deleted Items"))) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
149 //if this is a non-empty folder other than deleted items, we want to recurse into it
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
150 if (output_mode != OUTPUT_QUIET) printf("Processing Folder \"%s\"\n", item->file_as.str);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
151 process(item, d_ptr->child);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
152
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
153 } else if (item->contact && (item->type == PST_TYPE_CONTACT)) {
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
154 if (mode == MODE_SEPARATE) mk_separate_file(&ff);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
155 ff.email_count++;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
156 DEBUG_MAIN(("main: Processing Contact\n"));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
157 if (ff.type != PST_TYPE_CONTACT) {
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
158 DEBUG_MAIN(("main: I have a contact, but the folder type %"PRIi32" isn't a contacts folder. Processing anyway\n", ff.type));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
159 }
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
160 if (contact_mode == CMODE_VCARD) {
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
161 pst_convert_utf8_null(item, &item->comment);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
162 write_vcard(ff.output, item, item->contact, item->comment.str);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
163 }
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
164 else {
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
165 pst_convert_utf8(item, &item->contact->fullname);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
166 pst_convert_utf8(item, &item->contact->address1);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
167 fprintf(ff.output, "%s <%s>\n", item->contact->fullname.str, item->contact->address1.str);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
168 }
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
169
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
170 } else if (item->email && (item->type == PST_TYPE_NOTE || 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
171 char *extra_mime_headers = NULL;
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
172 if (mode == MODE_SEPARATE) mk_separate_file(&ff);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
173 ff.email_count++;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
174 DEBUG_MAIN(("main: Processing Email\n"));
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
175 if ((ff.type != PST_TYPE_NOTE) && (ff.type != PST_TYPE_REPORT)) {
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
176 DEBUG_MAIN(("main: I have an email type %"PRIi32", but the folder type %"PRIi32" isn't an email folder. Processing anyway\n", item->type, ff.type));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
177 }
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
178 write_normal_email(ff.output, ff.name, item, mode, mode_MH, &pstfile, save_rtf_body, &extra_mime_headers);
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
179
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
180 } else if (item->journal && (item->type == PST_TYPE_JOURNAL)) {
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
181 if (mode == MODE_SEPARATE) mk_separate_file(&ff);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
182 ff.email_count++;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
183 DEBUG_MAIN(("main: Processing Journal Entry\n"));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
184 if (ff.type != PST_TYPE_JOURNAL) {
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
185 DEBUG_MAIN(("main: I have a journal entry, but the folder type %"PRIi32" isn't a journal folder. Processing anyway\n", ff.type));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
186 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
187 fprintf(ff.output, "BEGIN:VJOURNAL\n");
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
188 if (item->subject.str) {
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
189 pst_convert_utf8(item, &item->subject);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
190 fprintf(ff.output, "SUMMARY:%s\n", pst_rfc2426_escape(item->subject.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
191 }
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
192 if (item->body.str) {
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
193 pst_convert_utf8(item, &item->body);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
194 fprintf(ff.output, "DESCRIPTION:%s\n", pst_rfc2426_escape(item->body.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
195 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
196 if (item->journal->start)
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
197 fprintf(ff.output, "DTSTART;VALUE=DATE-TIME:%s\n", pst_rfc2445_datetime_format(item->journal->start));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
198 fprintf(ff.output, "END:VJOURNAL\n\n");
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
199
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
200 } else if (item->appointment && (item->type == PST_TYPE_APPOINTMENT)) {
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
201 if (mode == MODE_SEPARATE) mk_separate_file(&ff);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
202 ff.email_count++;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
203 DEBUG_MAIN(("main: Processing Appointment Entry\n"));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
204 if (ff.type != PST_TYPE_APPOINTMENT) {
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
205 DEBUG_MAIN(("main: I have an appointment, but folder type %"PRIi32" isn't an appointment folder. Processing anyway\n", ff.type));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
206 }
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
207 write_appointment(ff.output, item, item->appointment, item->create_date, item->modify_date);
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
208
79
56fa05fd5271 Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents: 77
diff changeset
209 } else if (item->message_store) {
56fa05fd5271 Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents: 77
diff changeset
210 // there should only be one message_store, and we have already done it
56fa05fd5271 Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents: 77
diff changeset
211 DEBUG_MAIN(("item with message store content, type %i %s folder type %i, skipping it\n", item->type, item->ascii_type, ff.type));
56fa05fd5271 Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents: 77
diff changeset
212
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
213 } else {
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
214 // these all seem to be things that MS agrees are not included in the item count
cfd6175f9334 Start work on pst2dii to convert to Summation dii load file format.
Carl Byington <carl@five-ten-sg.com>
parents: 59
diff changeset
215 //ff.skip_count++;
cfd6175f9334 Start work on pst2dii to convert to Summation dii load file format.
Carl Byington <carl@five-ten-sg.com>
parents: 59
diff changeset
216 DEBUG_MAIN(("main: Unknown item type %i (%s) name (%s)\n",
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
217 item->type, item->ascii_type, item->file_as.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
218 }
46
b2a7f2e0926a more fixes for 64 bit format
carl
parents: 45
diff changeset
219 pst_freeItem(item);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
220 } else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
221 ff.skip_count++;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
222 DEBUG_MAIN(("main: A NULL item was seen\n"));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
223 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
224 d_ptr = d_ptr->next;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
225 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
226 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
227 close_enter_dir(&ff);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
228 DEBUG_RET();
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
229 }
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
230
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
231
34
07177825c91b fix signed/unsigned to allow very small pst files with only leaf nodes
carl
parents: 33
diff changeset
232
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
233 int main(int argc, char* const* argv) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
234 pst_item *item = NULL;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
235 pst_desc_ll *d_ptr;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
236 char * fname = NULL;
48
f66078abed38 more fixes for 64 bit format
carl
parents: 46
diff changeset
237 char *d_log = NULL;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
238 int c,x;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
239 char *temp = NULL; //temporary char pointer
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
240 prog_name = argv[0];
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
241
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
242 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
243 srand((unsigned)now);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
244
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
245 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
246 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
247 exit(3);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
248 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
249
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
250 // command-line option handling
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
251 while ((c = getopt(argc, argv, "bCc:Dd:hko:qrSMVw"))!= -1) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
252 switch (c) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
253 case 'b':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
254 save_rtf_body = 0;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
255 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
256 case 'C':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
257 mode = MODE_DECSPEW;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
258 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
259 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
260 if (optarg && optarg[0]=='v') {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
261 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
262 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
263 }
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
264 else if (optarg && optarg[0]=='l') {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
265 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
266 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
267 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
268 else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
269 usage();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
270 exit(0);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
271 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
272 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
273 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
274 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
275 break;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
276 case 'd':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
277 d_log = optarg;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
278 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
279 case 'h':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
280 usage();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
281 exit(0);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
282 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
283 case 'V':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
284 version();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
285 exit(0);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
286 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
287 case 'k':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
288 mode = MODE_KMAIL;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
289 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
290 case 'M':
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
291 mode = MODE_SEPARATE;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
292 mode_MH = 1;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
293 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
294 case 'o':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
295 output_dir = optarg;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
296 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
297 case 'q':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
298 output_mode = OUTPUT_QUIET;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
299 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
300 case 'r':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
301 mode = MODE_RECURSE;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
302 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
303 case 'S':
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
304 mode = MODE_SEPARATE;
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
305 mode_MH = 0;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
306 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
307 case 'w':
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
308 overwrite = 1;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
309 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
310 default:
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
311 usage();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
312 exit(1);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
313 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
314 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
315 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
316
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
317 if (argc > optind) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
318 fname = argv[optind];
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
319 } else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
320 usage();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
321 exit(2);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
322 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
323
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
324 #ifdef DEBUG_ALL
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
325 // force a log file
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
326 if (!d_log) d_log = "readpst.log";
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
327 #endif // defined DEBUG_ALL
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
328 DEBUG_INIT(d_log);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
329 DEBUG_REGISTER_CLOSE();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
330 DEBUG_ENT("main");
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
331
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
332 if (mode == MODE_DECSPEW) {
70
b12f4e50e2e8 Patch from Joachim Metz <joachim.metz@gmail.com> for 64 bit compile.
Carl Byington <carl@five-ten-sg.com>
parents: 63
diff changeset
333 FILE *fp;
b12f4e50e2e8 Patch from Joachim Metz <joachim.metz@gmail.com> for 64 bit compile.
Carl Byington <carl@five-ten-sg.com>
parents: 63
diff changeset
334 char buf[1024];
b12f4e50e2e8 Patch from Joachim Metz <joachim.metz@gmail.com> for 64 bit compile.
Carl Byington <carl@five-ten-sg.com>
parents: 63
diff changeset
335 size_t l = 0;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
336 if (NULL == (fp = fopen(fname, "rb"))) {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
337 WARN(("Couldn't open file %s\n", fname));
52
034641c26ab9 code cleanup
carl
parents: 50
diff changeset
338 DEBUG_RET();
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
339 return 1;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
340 }
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
341
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
342 while (0 != (l = fread(buf, 1, 1024, fp))) {
79
56fa05fd5271 Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents: 77
diff changeset
343 if (0 != pst_decrypt(0, buf, l, PST_COMP_ENCRYPT))
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
344 WARN(("pst_decrypt() failed (I'll try to continue)\n"));
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
345
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
346 if (l != pst_fwrite(buf, 1, l, stdout)) {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
347 WARN(("Couldn't output to stdout?\n"));
52
034641c26ab9 code cleanup
carl
parents: 50
diff changeset
348 DEBUG_RET();
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
349 return 1;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
350 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
351 }
52
034641c26ab9 code cleanup
carl
parents: 50
diff changeset
352 DEBUG_RET();
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
353 return 0;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
354 }
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
355
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
356 if (output_mode != OUTPUT_QUIET) printf("Opening PST file and indexes...\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
357
59
7d5c637aaafb General cleanup and code fixes.
Carl Byington <carl@five-ten-sg.com>
parents: 52
diff changeset
358 RET_DERROR(pst_open(&pstfile, fname), 1, ("Error opening File\n"));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
359 RET_DERROR(pst_load_index(&pstfile), 2, ("Index Error\n"));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
360
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
361 pst_load_extended_attributes(&pstfile);
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
362
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
363 if (chdir(output_dir)) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
364 x = errno;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
365 pst_close(&pstfile);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
366 DEBUG_RET();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
367 DIE(("main: Cannot change to output dir %s: %s\n", output_dir, strerror(x)));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
368 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
369
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
370 if (output_mode != OUTPUT_QUIET) printf("About to start processing first record...\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
371
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
372 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
373 item = pst_parse_item(&pstfile, d_ptr, NULL);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
374 if (!item || !item->message_store) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
375 DEBUG_RET();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
376 DIE(("main: Could not get root record\n"));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
377 }
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
378
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
379 // 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
380 if (!item->file_as.str) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
381 if (!(temp = strrchr(fname, '/')))
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
382 if (!(temp = strrchr(fname, '\\')))
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
383 temp = fname;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
384 else
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
385 temp++; // get past the "\\"
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
386 else
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
387 temp++; // get past the "/"
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
388 item->file_as.str = (char*)xmalloc(strlen(temp)+1);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
389 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
390 item->file_as.is_utf8 = 1;
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
391 DEBUG_MAIN(("file_as was blank, so am using %s\n", item->file_as.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
392 }
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
393 DEBUG_MAIN(("main: Root Folder Name: %s\n", item->file_as.str));
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
394
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
395 d_ptr = pst_getTopOfFolders(&pstfile, item);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
396 if (!d_ptr) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
397 DEBUG_RET();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
398 DIE(("Top of folders record not found. Cannot continue\n"));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
399 }
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
400
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
401 process(item, d_ptr->child); // do the children of TOPF
46
b2a7f2e0926a more fixes for 64 bit format
carl
parents: 45
diff changeset
402 pst_freeItem(item);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
403 pst_close(&pstfile);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
404 DEBUG_RET();
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
405 regfree(&meta_charset_pattern);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
406 return 0;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
407 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
408
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
409
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
410 void write_email_body(FILE *f, char *body) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
411 char *n = body;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
412 DEBUG_ENT("write_email_body");
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
413 DEBUG_INFO(("buffer pointer %p\n", body));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
414 while (n) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
415 if (strncmp(body, "From ", 5) == 0)
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
416 fprintf(f, ">");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
417 if ((n = strchr(body, '\n'))) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
418 n++;
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
419 pst_fwrite(body, n-body, 1, f); //write just a line
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
420 body = n;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
421 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
422 }
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
423 pst_fwrite(body, strlen(body), 1, f);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
424 DEBUG_RET();
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
425 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
426
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
427
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
428 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
429 // converts \r\n to \n
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
430 char *a, *b;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
431 DEBUG_ENT("removeCR");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
432 a = b = c;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
433 while (*a != '\0') {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
434 *b = *a;
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
435 if (*a != '\r') b++;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
436 a++;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
437 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
438 *b = '\0';
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
439 DEBUG_RET();
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
440 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
441
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
442
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
443 void usage() {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
444 DEBUG_ENT("usage");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
445 version();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
446 printf("Usage: %s [OPTIONS] {PST FILENAME}\n", prog_name);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
447 printf("OPTIONS:\n");
104
39ba19372732 many fixes in pst2ldif by Robert Harris
Carl Byington <carl@five-ten-sg.com>
parents: 100
diff changeset
448 printf("\t-V\t- Version. Display program version\n");
79
56fa05fd5271 Patch from Robert Simpson for encryption type 2.
Carl Byington <carl@five-ten-sg.com>
parents: 77
diff changeset
449 printf("\t-C\t- Decrypt (compressible encryption) the entire file and output on stdout (not typically useful)\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
450 printf("\t-D\t- Include deleted items in output\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
451 printf("\t-M\t- MH. Write emails in the MH format\n");
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
452 printf("\t-S\t- Separate. Write emails in the separate format\n");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
453 printf("\t-b\t- Don't save RTF-Body attachments\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
454 printf("\t-c[v|l]\t- Set the Contact output mode. -cv = VCard, -cl = EMail list\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
455 printf("\t-d <filename> \t- Debug to file. This is a binary log. Use readpstlog to print it\n");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
456 printf("\t-h\t- Help. This screen\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
457 printf("\t-k\t- KMail. Output in kmail format\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
458 printf("\t-o <dirname>\t- Output directory to write files to. CWD is changed *after* opening pst file\n");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
459 printf("\t-q\t- Quiet. Only print error messages\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
460 printf("\t-r\t- Recursive. Output in a recursive format\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
461 printf("\t-w\t- Overwrite any output mbox files\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
462 DEBUG_RET();
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
463 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
464
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
465
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
466 void version() {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
467 DEBUG_ENT("version");
50
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
468 printf("ReadPST / LibPST v%s\n", VERSION);
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
469 #if BYTE_ORDER == BIG_ENDIAN
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
470 printf("Big Endian implementation being used.\n");
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
471 #elif BYTE_ORDER == LITTLE_ENDIAN
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
472 printf("Little Endian implementation being used.\n");
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
473 #else
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
474 # error "Byte order not supported by this library"
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
475 #endif
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
476 #ifdef __GNUC__
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
477 printf("GCC %d.%d : %s %s\n", __GNUC__, __GNUC_MINOR__, __DATE__, __TIME__);
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
478 #endif
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
479 DEBUG_RET();
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
480 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
481
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
482
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
483 char *mk_kmail_dir(char *fname) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
484 //change to that directory
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
485 //make a directory based on OUTPUT_KMAIL_DIR_TEMPLATE
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
486 //allocate space for OUTPUT_TEMPLATE and form a char* with fname
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
487 //return that value
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
488 char *dir, *out_name, *index;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
489 int x;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
490 DEBUG_ENT("mk_kmail_dir");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
491 if (kmail_chdir && chdir(kmail_chdir)) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
492 x = errno;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
493 DIE(("mk_kmail_dir: Cannot change to directory %s: %s\n", kmail_chdir, strerror(x)));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
494 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
495 dir = malloc(strlen(fname)+strlen(OUTPUT_KMAIL_DIR_TEMPLATE)+1);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
496 sprintf(dir, OUTPUT_KMAIL_DIR_TEMPLATE, fname);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
497 check_filename(dir);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
498 if (D_MKDIR(dir)) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
499 //error occured
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
500 if (errno != EEXIST) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
501 x = errno;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
502 DIE(("mk_kmail_dir: Cannot create directory %s: %s\n", dir, strerror(x)));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
503 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
504 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
505 kmail_chdir = realloc(kmail_chdir, strlen(dir)+1);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
506 strcpy(kmail_chdir, dir);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
507 free (dir);
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
508
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
509 //we should remove any existing indexes created by KMail, cause they might be different now
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
510 index = malloc(strlen(fname)+strlen(KMAIL_INDEX)+1);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
511 sprintf(index, KMAIL_INDEX, fname);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
512 unlink(index);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
513 free(index);
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
514
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
515 out_name = malloc(strlen(fname)+strlen(OUTPUT_TEMPLATE)+1);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
516 sprintf(out_name, OUTPUT_TEMPLATE, fname);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
517 DEBUG_RET();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
518 return out_name;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
519 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
520
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
521
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
522 int close_kmail_dir() {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
523 // change ..
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
524 int x;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
525 DEBUG_ENT("close_kmail_dir");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
526 if (kmail_chdir) { //only free kmail_chdir if not NULL. do not change directory
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
527 free(kmail_chdir);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
528 kmail_chdir = NULL;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
529 } else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
530 if (chdir("..")) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
531 x = errno;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
532 DIE(("close_kmail_dir: Cannot move up dir (..): %s\n", strerror(x)));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
533 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
534 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
535 DEBUG_RET();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
536 return 0;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
537 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
538
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
539
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
540 // this will create a directory by that name, then make an mbox file inside
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
541 // that dir. any subsequent dirs will be created by name, and they will
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
542 // contain mbox files
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
543 char *mk_recurse_dir(char *dir, int32_t folder_type) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
544 int x;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
545 char *out_name;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
546 DEBUG_ENT("mk_recurse_dir");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
547 check_filename(dir);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
548 if (D_MKDIR (dir)) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
549 if (errno != EEXIST) { // not an error because it exists
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
550 x = errno;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
551 DIE(("mk_recurse_dir: Cannot create directory %s: %s\n", dir, strerror(x)));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
552 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
553 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
554 if (chdir (dir)) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
555 x = errno;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
556 DIE(("mk_recurse_dir: Cannot change to directory %s: %s\n", dir, strerror(x)));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
557 }
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
558 switch (folder_type) {
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
559 case PST_TYPE_APPOINTMENT:
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
560 out_name = strdup("calendar");
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
561 break;
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
562 case PST_TYPE_CONTACT:
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
563 out_name = strdup("contacts");
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
564 break;
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
565 case PST_TYPE_JOURNAL:
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
566 out_name = strdup("journal");
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
567 break;
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
568 case PST_TYPE_STICKYNOTE:
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
569 case PST_TYPE_TASK:
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
570 case PST_TYPE_NOTE:
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
571 case PST_TYPE_OTHER:
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
572 case PST_TYPE_REPORT:
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
573 default:
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
574 out_name = strdup("mbox");
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
575 break;
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
576 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
577 DEBUG_RET();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
578 return out_name;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
579 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
580
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
581
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
582 int close_recurse_dir() {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
583 int x;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
584 DEBUG_ENT("close_recurse_dir");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
585 if (chdir("..")) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
586 x = errno;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
587 DIE(("close_recurse_dir: Cannot go up dir (..): %s\n", strerror(x)));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
588 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
589 DEBUG_RET();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
590 return 0;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
591 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
592
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
593
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
594 char *mk_separate_dir(char *dir) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
595 size_t dirsize = strlen(dir) + 10;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
596 char dir_name[dirsize];
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
597 int x = 0, y = 0;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
598
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
599 DEBUG_ENT("mk_separate_dir");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
600 do {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
601 if (y == 0)
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
602 snprintf(dir_name, dirsize, "%s", dir);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
603 else
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
604 snprintf(dir_name, dirsize, "%s" SEP_MAIL_FILE_TEMPLATE, dir, y); // enough for 9 digits allocated above
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
605
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
606 check_filename(dir_name);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
607 DEBUG_MAIN(("about to try creating %s\n", dir_name));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
608 if (D_MKDIR(dir_name)) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
609 if (errno != EEXIST) { // if there is an error, and it doesn't already exist
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
610 x = errno;
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
611 DIE(("mk_separate_dir: Cannot create directory %s: %s\n", dir, strerror(x)));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
612 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
613 } else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
614 break;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
615 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
616 y++;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
617 } while (overwrite == 0);
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
618
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
619 if (chdir(dir_name)) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
620 x = errno;
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
621 DIE(("mk_separate_dir: Cannot change to directory %s: %s\n", dir, strerror(x)));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
622 }
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
623
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
624 if (overwrite) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
625 // we should probably delete all files from this directory
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
626 #if !defined(WIN32) && !defined(__CYGWIN__)
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
627 DIR * sdir = NULL;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
628 struct dirent *dirent = NULL;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
629 struct stat filestat;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
630 if (!(sdir = opendir("./"))) {
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
631 WARN(("mk_separate_dir: Cannot open dir \"%s\" for deletion of old contents\n", "./"));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
632 } else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
633 while ((dirent = readdir(sdir))) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
634 if (lstat(dirent->d_name, &filestat) != -1)
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
635 if (S_ISREG(filestat.st_mode)) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
636 if (unlink(dirent->d_name)) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
637 y = errno;
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
638 DIE(("mk_separate_dir: unlink returned error on file %s: %s\n", dirent->d_name, strerror(y)));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
639 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
640 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
641 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
642 }
26
9eeba3f4ca4b more cleanup from Arne
carl
parents: 25
diff changeset
643 #endif
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
644 }
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
645
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
646 // we don't return a filename here cause it isn't necessary.
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
647 DEBUG_RET();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
648 return NULL;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
649 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
650
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
651
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
652 int close_separate_dir() {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
653 int x;
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
654 DEBUG_ENT("close_separate_dir");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
655 if (chdir("..")) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
656 x = errno;
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
657 DIE(("close_separate_dir: Cannot go up dir (..): %s\n", strerror(x)));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
658 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
659 DEBUG_RET();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
660 return 0;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
661 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
662
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
663
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
664 int mk_separate_file(struct file_ll *f) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
665 const int name_offset = 1;
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
666 DEBUG_ENT("mk_separate_file");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
667 DEBUG_MAIN(("opening next file to save email\n"));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
668 if (f->email_count > 999999999) { // bigger than nine 9's
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
669 DIE(("mk_separate_file: The number of emails in this folder has become too high to handle"));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
670 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
671 sprintf(f->name, SEP_MAIL_FILE_TEMPLATE, f->email_count + name_offset);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
672 if (f->output) fclose(f->output);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
673 f->output = NULL;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
674 check_filename(f->name);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
675 if (!(f->output = fopen(f->name, "w"))) {
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
676 DIE(("mk_separate_file: Cannot open file to save email \"%s\"\n", f->name));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
677 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
678 DEBUG_RET();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
679 return 0;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
680 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
681
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
682
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
683 char *my_stristr(char *haystack, char *needle) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
684 // my_stristr varies from strstr in that its searches are case-insensitive
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
685 char *x=haystack, *y=needle, *z = NULL;
52
034641c26ab9 code cleanup
carl
parents: 50
diff changeset
686 if (!haystack || !needle) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
687 return NULL;
52
034641c26ab9 code cleanup
carl
parents: 50
diff changeset
688 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
689 while (*y != '\0' && *x != '\0') {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
690 if (tolower(*y) == tolower(*x)) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
691 // move y on one
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
692 y++;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
693 if (!z) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
694 z = x; // store first position in haystack where a match is made
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
695 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
696 } else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
697 y = needle; // reset y to the beginning of the needle
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
698 z = NULL; // reset the haystack storage point
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
699 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
700 x++; // advance the search in the haystack
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
701 }
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
702 // 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
703 if (*y != '\0') return NULL;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
704 return z;
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
705 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
706
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
707
41
183ae993b9ad security fix for potential buffer overrun in lz decompress
carl
parents: 39
diff changeset
708 void check_filename(char *fname) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
709 char *t = fname;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
710 DEBUG_ENT("check_filename");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
711 if (!t) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
712 DEBUG_RET();
52
034641c26ab9 code cleanup
carl
parents: 50
diff changeset
713 return;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
714 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
715 while ((t = strpbrk(t, "/\\:"))) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
716 // while there are characters in the second string that we don't want
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
717 *t = '_'; //replace them with an underscore
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
718 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
719 DEBUG_RET();
16
c508ee15dfca switch to automake/autoconf
carl
parents:
diff changeset
720 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
721
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
722
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
723 void write_separate_attachment(char f_name[], pst_item_attach* attach, int attach_num, pst_file* pst)
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
724 {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
725 FILE *fp = NULL;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
726 int x = 0;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
727 char *temp = NULL;
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
728
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
729 // If there is a long filename (filename2) use that, otherwise
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
730 // 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
731 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
732 : attach->filename1.str;
46
b2a7f2e0926a more fixes for 64 bit format
carl
parents: 45
diff changeset
733 DEBUG_ENT("write_separate_attachment");
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
734
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
735 if (!attach->data) {
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
736 // 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
737 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
738 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
739 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
740 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
741 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
742 }
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
743 }
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
744
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
745 check_filename(f_name);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
746 if (!attach_filename) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
747 // generate our own (dummy) filename for the attachement
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
748 temp = xmalloc(strlen(f_name)+15);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
749 sprintf(temp, "%s-attach%i", f_name, attach_num);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
750 } else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
751 // have an attachment name, make sure it's unique
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
752 temp = xmalloc(strlen(f_name)+strlen(attach_filename)+15);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
753 do {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
754 if (fp) fclose(fp);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
755 if (x == 0)
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
756 sprintf(temp, "%s-%s", f_name, attach_filename);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
757 else
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
758 sprintf(temp, "%s-%s-%i", f_name, attach_filename, x);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
759 } while ((fp = fopen(temp, "r")) && ++x < 99999999);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
760 if (x > 99999999) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
761 DIE(("error finding attachment name. exhausted possibilities to %s\n", temp));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
762 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
763 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
764 DEBUG_EMAIL(("Saving attachment to %s\n", temp));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
765 if (!(fp = fopen(temp, "w"))) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
766 WARN(("write_separate_attachment: Cannot open attachment save file \"%s\"\n", temp));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
767 } else {
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
768 if (attach->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
769 pst_fwrite(attach->data, (size_t)1, attach->size, fp);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
770 else {
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
771 (void)pst_attach_to_file(pst, attach, fp);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
772 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
773 fclose(fp);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
774 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
775 if (temp) free(temp);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
776 DEBUG_RET();
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
777 }
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
778
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
779
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
780 void write_embedded_message(FILE* f_output, pst_item_attach* attach, char *boundary, pst_file* pf, 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
781 {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
782 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
783 DEBUG_ENT("write_embedded_message");
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
784 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
785 fprintf(f_output, "Content-Type: %s\n\n", attach->mimetype.str);
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
786 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
787
fdc58ad2c758 fix embedded rfc822 messages with attachments
Carl Byington <carl@five-ten-sg.com>
parents: 142
diff changeset
788 pst_desc_ll 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
789 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
790 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
791 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
792 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
793 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
794 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
795 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
796 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
797 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
798 d_ptr.child_tail = NULL;
143
fdc58ad2c758 fix embedded rfc822 messages with attachments
Carl Byington <carl@five-ten-sg.com>
parents: 142
diff changeset
799
fdc58ad2c758 fix embedded rfc822 messages with attachments
Carl Byington <carl@five-ten-sg.com>
parents: 142
diff changeset
800 pst_item *item = pst_parse_item(pf, &d_ptr, attach->id2_head);
fdc58ad2c758 fix embedded rfc822 messages with attachments
Carl Byington <carl@five-ten-sg.com>
parents: 142
diff changeset
801 write_normal_email(f_output, "", item, MODE_NORMAL, 0, pf, 0, extra_mime_headers);
fdc58ad2c758 fix embedded rfc822 messages with attachments
Carl Byington <carl@five-ten-sg.com>
parents: 142
diff changeset
802 pst_freeItem(item);
fdc58ad2c758 fix embedded rfc822 messages with attachments
Carl Byington <carl@five-ten-sg.com>
parents: 142
diff changeset
803
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
804 DEBUG_RET();
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
805 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
806
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
807
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
808 void write_inline_attachment(FILE* f_output, pst_item_attach* attach, char *boundary, pst_file* pst)
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
809 {
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
810 char *attach_filename;
46
b2a7f2e0926a more fixes for 64 bit format
carl
parents: 45
diff changeset
811 char *enc = NULL; // base64 encoded attachment
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
812 DEBUG_ENT("write_inline_attachment");
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
813 DEBUG_EMAIL(("Attachment Size is %"PRIu64", id %#"PRIx64"\n", (uint64_t)attach->size, attach->i_id));
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
814 if (attach->data) {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
815 enc = base64_encode (attach->data, attach->size);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
816 if (!enc) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
817 DEBUG_EMAIL(("ERROR base64_encode returned NULL. Must have failed\n"));
52
034641c26ab9 code cleanup
carl
parents: 50
diff changeset
818 DEBUG_RET();
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
819 return;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
820 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
821 }
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
822 else {
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
823 // 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
824 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
825 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
826 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
827 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
828 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
829 }
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
830 }
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
831
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
832 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
833 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
834 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
835 } else {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
836 fprintf(f_output, "Content-Type: %s\n", attach->mimetype.str);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
837 }
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
838 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
839
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
840 // If there is a long filename (filename2) use that, otherwise
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
841 // 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
842 attach_filename = (attach->filename2.str) ? attach->filename2.str : attach->filename1.str;
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
843 if (!attach_filename) {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
844 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
845 } else {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
846 fprintf(f_output, "Content-Disposition: attachment; filename=\"%s\"\n\n", attach_filename);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
847 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
848
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
849 if (attach->data) {
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
850 pst_fwrite(enc, 1, strlen(enc), f_output);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
851 DEBUG_EMAIL(("Attachment Size after encoding is %i\n", strlen(enc)));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
852 free(enc); // caught by valgrind
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
853 } else {
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
854 (void)pst_attach_to_file_base64(pst, attach, f_output);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
855 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
856 fprintf(f_output, "\n\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
857 DEBUG_RET();
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
858 }
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
859
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
860
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
861 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
862 {
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
863 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
864 if (my_stristr(header, field) || (strncasecmp(header, field+1, strlen(field)-1) == 0)) {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
865 DEBUG_EMAIL(("header block has %s header\n", field+1));
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
866 *flag = 1;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
867 }
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
868 DEBUG_RET();
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
869 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
870
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
871
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
872 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
873 {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
874 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
875 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
876 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
877 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
878 field++;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
879 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
880 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
881 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
882 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
883 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
884 if (*s == '"') {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
885 s++;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
886 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
887 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
888 else {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
889 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
890 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
891 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
892 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
893 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
894 save = *e;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
895 *e = '\0';
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
896 snprintf(body_subfield, size_subfield, "%s", s); // copy the subfield to our buffer
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
897 *e = save;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
898 DEBUG_EMAIL(("body %s %s from headers\n", subfield, body_subfield));
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
899 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
900 DEBUG_RET();
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
901 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
902
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
903 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
904 {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
905 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
906 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
907 return t;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
908 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
909
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
910
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
911 // 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
912 // 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
913 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
914 {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
915 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
916 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
917 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
918 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
919 return e;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
920 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
921
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
922
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
923 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
924 {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
925 char *t = header_get_field(header, field);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
926 if (t) {
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
927 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
928 if (e) {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
929 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
930 while (*e != '\0') {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
931 *t = *e;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
932 t++;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
933 e++;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
934 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
935 *t = '\0';
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
936 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
937 else {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
938 // 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
939 *t = '\0';
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
940 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
941 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
942 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
943
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
944
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
945 int test_base64(char *body)
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
946 {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
947 int b64 = 0;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
948 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
949 DEBUG_ENT("test_base64");
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
950 while (*b != 0) {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
951 if ((*b < 32) && (*b != 9) && (*b != 10)) {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
952 DEBUG_EMAIL(("found base64 byte %d\n", (int)*b));
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
953 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
954 b64 = 1;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
955 break;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
956 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
957 b++;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
958 }
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
959 DEBUG_RET();
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
960 return b64;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
961 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
962
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
963
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
964 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
965 {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
966 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
967 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
968 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
969 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
970 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
971 if (rc == 0) {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
972 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
973 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
974 if (s != -1) {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
975 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
976 html[e] = '\0';
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
977 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
978 html[e] = save;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
979 DEBUG_EMAIL(("charset %s from html text\n", charset));
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
980 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
981 else {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
982 DEBUG_EMAIL(("matching %d %d %d %d", match[0].rm_so, match[0].rm_eo, match[1].rm_so, match[1].rm_eo));
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
983 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
984 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
985 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
986 else {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
987 DEBUG_EMAIL(("regexec returns %d\n", rc));
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
988 }
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
989 DEBUG_RET();
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
990 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
991
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
992
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
993 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
994 {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
995 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
996 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
997 if (headers) {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
998 char *temp, *t;
146
0695de3b5a98 fix for 64bit on Fedora 11
Carl Byington <carl@five-ten-sg.com>
parents: 143
diff changeset
999 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
1000 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
1001 t = header_get_field(headers, "\nContent-Type: ");
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1002 if (t) {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1003 t++;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1004 DEBUG_EMAIL(("found content type header\n"));
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1005 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
1006 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
1007 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
1008 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
1009 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
1010 s += 2;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1011 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
1012 headers = temp+2; // found rfc822 header
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1013 DEBUG_EMAIL(("found 822 headers\n%s\n", headers));
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1014 break;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1015 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1016 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1017 }
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
1018 //DEBUG_EMAIL(("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
1019 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
1020 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1021 *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
1022 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1023 DEBUG_RET();
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1024 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1025
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1026
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1027 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
1028 {
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1029 DEBUG_ENT("write_body_part");
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1030 if (body->is_utf8 && (strcasecmp("utf-8", charset))) {
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
1031 // try to convert to the specified charset since the target
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
1032 // is not utf-8, and the data came from a unicode (utf16) field
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
1033 // and is now in utf-8.
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1034 size_t rc;
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1035 DEBUG_EMAIL(("Convert %s utf-8 to %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
1036 vbuf *newer = vballoc(2);
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
1037 rc = vb_utf8to8bit(newer, body->str, strlen(body->str), charset);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1038 if (rc == (size_t)-1) {
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
1039 // unable to convert, change the charset to utf8
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1040 free(newer->b);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1041 DEBUG_EMAIL(("Failed to convert %s utf-8 to %s\n", mime, charset));
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
1042 charset = "utf-8";
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1043 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1044 else {
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
1045 // null terminate the output string
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
1046 vbgrow(newer, 1);
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
1047 newer->b[newer->dlen] = '\0';
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1048 free(body->str);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1049 body->str = newer->b;
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1050 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1051 free(newer);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1052 }
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1053 removeCR(body->str);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1054 int base64 = test_base64(body->str);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1055 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
1056 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
1057 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
1058 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
1059 if (base64) {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1060 char *enc = base64_encode(body->str, strlen(body->str));
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1061 if (enc) {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1062 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
1063 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
1064 free(enc);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1065 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1066 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1067 else {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1068 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
1069 }
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1070 DEBUG_RET();
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1071 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1072
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1073
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1074 void write_normal_email(FILE* f_output, char f_name[], pst_item* item, int mode, int mode_MH, pst_file* pst, int save_rtf, char** extra_mime_headers)
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1075 {
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1076 char boundary[60];
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1077 char body_charset[60];
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1078 char body_report[60];
129
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1079 char sender[60];
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1080 int sender_known = 0;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1081 char *temp = NULL;
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1082 int attach_num;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1083 time_t em_time;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1084 char *c_time;
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1085 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
1086 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
1087 has_from = has_subject = has_to = has_cc = has_date = has_msgid = 0;
46
b2a7f2e0926a more fixes for 64 bit format
carl
parents: 45
diff changeset
1088 DEBUG_ENT("write_normal_email");
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1089
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1090 pst_convert_utf8_null(item, &item->email->header);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1091 headers = (item->email->header.str) ? item->email->header.str : *extra_mime_headers;
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1092
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1093 // setup default body character set and report type
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1094 strncpy(body_charset, pst_default_charset(item), sizeof(body_charset));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1095 body_charset[sizeof(body_charset)-1] = '\0';
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1096 body_report[0] = '\0';
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1097
129
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1098 // setup default sender
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1099 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
1100 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
1101 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
1102 sender_known = 1;
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1103 }
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1104 else {
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1105 temp = "MAILER-DAEMON";
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1106 }
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1107 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
1108 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
1109
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1110 // convert the sent date if it exists, or set it to a fixed date
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1111 if (item->email->sent_date) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1112 em_time = fileTimeToUnixTime(item->email->sent_date, 0);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1113 c_time = ctime(&em_time);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1114 if (c_time)
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1115 c_time[strlen(c_time)-1] = '\0'; //remove end \n
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1116 else
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1117 c_time = "Fri Dec 28 12:06:21 2001";
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1118 } else
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1119 c_time= "Fri Dec 28 12:06:21 2001";
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1120
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1121 // create our MIME boundary here.
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1122 snprintf(boundary, sizeof(boundary), "--boundary-LibPST-iamunique-%i_-_-", rand());
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1123
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1124 // 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
1125 if (headers ) {
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1126 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
1127 removeCR(headers);
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1128
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1129 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
1130 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
1131 // 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
1132 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
1133 // 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
1134 // we use these to find the actual rfc822 headers for embedded message/rfc822 mime parts
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1135 *extra_mime_headers = temp+2;
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1136 DEBUG_EMAIL(("Found extra mime headers\n%s\n", temp+2));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1137 }
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1138
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1139 // Check if the headers have all the necessary fields
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1140 header_has_field(headers, "\nFrom: ", &has_from);
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1141 header_has_field(headers, "\nTo: ", &has_to);
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1142 header_has_field(headers, "\nSubject: ", &has_subject);
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1143 header_has_field(headers, "\nDate: ", &has_date);
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1144 header_has_field(headers, "\nCC: ", &has_cc);
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1145 header_has_field(headers, "\nMessage-Id: ", &has_msgid);
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1146
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1147 // look for charset and report-type in Content-Type header
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1148 t = header_get_field(headers, "\nContent-Type: ");
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1149 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
1150 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
1151
129
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1152 // 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
1153 if (!sender_known) {
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1154 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
1155 if (t) {
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1156 // 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
1157 t++;
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1158 char *n = strchr(t, '\n');
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1159 char *s = strchr(t, '<');
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1160 char *e = strchr(t, '>');
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1161 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
1162 char save = *e;
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1163 *e = '\0';
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1164 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
1165 *e = save;
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1166 }
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1167 }
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1168 }
fc11b1d1ad34 fix initial from header in mbox format.
Carl Byington <carl@five-ten-sg.com>
parents: 125
diff changeset
1169
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1170 // 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
1171 header_strip_field(headers, "\nMicrosoft Mail Internet Headers");
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1172 header_strip_field(headers, "\nMIME-Version: ");
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1173 header_strip_field(headers, "\nContent-Type: ");
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1174 header_strip_field(headers, "\nContent-Transfer-Encoding: ");
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1175 header_strip_field(headers, "\nContent-class: ");
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1176 header_strip_field(headers, "\nX-MimeOLE: ");
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1177 header_strip_field(headers, "\nBcc:");
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1178 header_strip_field(headers, "\nX-From_: ");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1179 }
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1180
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1181 DEBUG_EMAIL(("About to print Header\n"));
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1182
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1183 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
1184 pst_convert_utf8(item, &item->subject);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1185 DEBUG_EMAIL(("item->subject = %s\n", item->subject.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1186 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1187
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
1188 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
1189 // 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
1190 // 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
1191 // 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
1192 // those quotes, and they don't seem to cause problems for anyone else.
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 fprintf(f_output, "From \"%s\" %s\n", 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
1194 }
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
1195
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1196 // 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
1197 if (headers) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1198 int len;
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1199 fprintf(f_output, "%s", headers);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1200 // make sure the headers end with a \n
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1201 len = strlen(headers);
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1202 if (!len || (headers[len-1] != '\n')) fprintf(f_output, "\n");
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1203 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1204
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1205 // 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
1206
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1207 if (!has_from) {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1208 fprintf(f_output, "From: \"%s\" <%s>\n", item->email->outlook_sender_name.str, sender);
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1209 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1210
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1211 if (!has_subject) {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1212 if (item->subject.str) {
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1213 fprintf(f_output, "Subject: %s\n", item->subject.str);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1214 } else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1215 fprintf(f_output, "Subject: \n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1216 }
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1217 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1218
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1219 if (!has_to && item->email->sentto_address.str) {
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1220 pst_convert_utf8(item, &item->email->sentto_address);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1221 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
1222 }
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
1223
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1224 if (!has_cc && item->email->cc_address.str) {
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1225 pst_convert_utf8(item, &item->email->cc_address);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1226 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
1227 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1228
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1229 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
1230 char c_time[C_TIME_SIZE];
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1231 strftime(c_time, C_TIME_SIZE, "%a, %d %b %Y %H:%M:%S %z", gmtime(&em_time));
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1232 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
1233 }
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1234
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1235 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
1236 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
1237 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
1238 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1239
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
1240 // 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
1241 // 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
1242 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
1243 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
1244 && strcmp(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
1245 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
1246 }
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
1247
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1248 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
1249 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
1250 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
1251 }
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
1252
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1253 // add our own mime headers
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1254 fprintf(f_output, "MIME-Version: 1.0\n");
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1255 if (body_report[0] != '\0') {
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1256 // 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
1257 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
1258 }
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1259 else if (item->attach || (item->email->rtf_compressed && save_rtf)
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1260 || item->email->encrypted_body
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1261 || item->email->encrypted_htmlbody) {
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1262 // use multipart/mixed if we have attachments
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1263 fprintf(f_output, "Content-Type: multipart/mixed;\n\tboundary=\"%s\"\n", boundary);
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1264 } else {
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1265 // else use multipart/alternative
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1266 fprintf(f_output, "Content-Type: multipart/alternative;\n\tboundary=\"%s\"\n", boundary);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1267 }
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1268 fprintf(f_output, "\n"); // end of headers, start of body
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1269
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1270 // now dump the body parts
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1271 if (item->body.str) {
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1272 write_body_part(f_output, &item->body, "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
1273 }
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
1274
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1275 if ((item->email->report_text.str) && (body_report[0] != '\0')) {
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1276 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
1277 fprintf(f_output, "\n");
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1278 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1279
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1280 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
1281 find_html_charset(item->email->htmlbody.str, body_charset, sizeof(body_charset));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1282 write_body_part(f_output, &item->email->htmlbody, "text/html", body_charset, boundary, pst);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1283 }
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1284
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1285 if (item->email->rtf_compressed && save_rtf) {
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
1286 pst_item_attach* attach = (pst_item_attach*)xmalloc(sizeof(pst_item_attach));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1287 DEBUG_EMAIL(("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
1288 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
1289 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
1290 item->attach = 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
1291 attach->data = lzfu_decompress(item->email->rtf_compressed, item->email->rtf_compressed_size, &attach->size);
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1292 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
1293 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
1294 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
1295 attach->mimetype.is_utf8 = 1;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1296 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1297
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1298 if (item->email->encrypted_body || item->email->encrypted_htmlbody) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1299 // if either the body or htmlbody is encrypted, add them as attachments
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1300 if (item->email->encrypted_body) {
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
1301 pst_item_attach* attach = (pst_item_attach*)xmalloc(sizeof(pst_item_attach));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1302 DEBUG_EMAIL(("Adding Encrypted 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
1303 attach = (pst_item_attach*) xmalloc(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
1304 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
1305 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
1306 item->attach = 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
1307 attach->data = item->email->encrypted_body;
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
1308 attach->size = item->email->encrypted_body_size;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1309 item->email->encrypted_body = NULL;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1310 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1311
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1312 if (item->email->encrypted_htmlbody) {
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
1313 pst_item_attach* attach = (pst_item_attach*)xmalloc(sizeof(pst_item_attach));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1314 DEBUG_EMAIL(("Adding encrypted HTML 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
1315 attach = (pst_item_attach*) xmalloc(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
1316 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
1317 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
1318 item->attach = 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
1319 attach->data = item->email->encrypted_htmlbody;
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
1320 attach->size = item->email->encrypted_htmlbody_size;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1321 item->email->encrypted_htmlbody = NULL;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1322 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1323 write_email_body(f_output, "The body of this email is encrypted. This isn't supported yet, but the body is now an attachment\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1324 }
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1325
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1326 // 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
1327 {
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
1328 pst_item_attach* 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
1329 attach_num = 0;
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
1330 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
1331 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
1332 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
1333 pst_convert_utf8_null(item, &attach->mimetype);
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
1334 DEBUG_EMAIL(("Attempting Attachment encoding\n"));
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1335 if (!attach->data && attach->mimetype.str && !strcmp(attach->mimetype.str, RFC822)) {
141
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1336 DEBUG_EMAIL(("seem to have special embedded message attachment\n"));
fd4297884319 improve decoding of multipart/report and message/rfc822 mime types
Carl Byington <carl@five-ten-sg.com>
parents: 139
diff changeset
1337 find_rfc822_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
1338 write_embedded_message(f_output, attach, boundary, pst, 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
1339 }
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
1340 else if (attach->data || 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
1341 if (mode == MODE_SEPARATE && !mode_MH)
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
1342 write_separate_attachment(f_name, attach, ++attach_num, pst);
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
1343 else
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
1344 write_inline_attachment(f_output, attach, boundary, pst);
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
1345 }
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1346 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1347 }
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
1348
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
1349 // end of this mail message
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
1350 if (mode != MODE_SEPARATE) { /* do not add a boundary after the last attachment for mode_MH */
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1351 DEBUG_EMAIL(("Writing buffer between emails\n"));
121
8399ef94c11b strip and regenerate all MIME headers to avoid duplicates.
Carl Byington <carl@five-ten-sg.com>
parents: 120
diff changeset
1352 fprintf(f_output, "\n--%s--\n", boundary);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1353 fprintf(f_output, "\n\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1354 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1355 DEBUG_RET();
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1356 }
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1357
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1358
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1359 void write_vcard(FILE* f_output, pst_item *item, pst_item_contact* contact, char comment[])
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1360 {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1361 // We can only call rfc escape once per printf, since the second call
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1362 // may free the buffer returned by the first call.
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1363 // I had tried to place those into a single printf - Carl.
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1364
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1365 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
1366
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1367 // make everything utf8
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1368 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
1369 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
1370 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
1371 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
1372 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
1373 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
1374 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
1375 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
1376 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
1377 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
1378 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
1379 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
1380 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
1381 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
1382 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
1383 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
1384 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
1385 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
1386 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
1387 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
1388 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
1389 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
1390 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
1391 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
1392 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
1393 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
1394 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
1395 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
1396 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
1397 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
1398 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
1399 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
1400 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
1401 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
1402 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
1403 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
1404 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
1405 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
1406 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
1407 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
1408 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
1409 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
1410 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
1411 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
1412 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
1413 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
1414 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
1415 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
1416 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
1417 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
1418 pst_convert_utf8_null(item, &contact->company_name);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1419
50
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1420 // the specification I am following is (hopefully) RFC2426 vCard Mime Directory Profile
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1421 fprintf(f_output, "BEGIN:VCARD\n");
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1422 fprintf(f_output, "FN:%s\n", pst_rfc2426_escape(contact->fullname.str));
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1423
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1424 //fprintf(f_output, "N:%s;%s;%s;%s;%s\n",
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1425 fprintf(f_output, "N:%s;", (!contact->surname.str) ? "" : pst_rfc2426_escape(contact->surname.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1426 fprintf(f_output, "%s;", (!contact->first_name.str) ? "" : pst_rfc2426_escape(contact->first_name.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1427 fprintf(f_output, "%s;", (!contact->middle_name.str) ? "" : pst_rfc2426_escape(contact->middle_name.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1428 fprintf(f_output, "%s;", (!contact->display_name_prefix.str) ? "" : pst_rfc2426_escape(contact->display_name_prefix.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1429 fprintf(f_output, "%s\n", (!contact->suffix.str) ? "" : pst_rfc2426_escape(contact->suffix.str));
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1430
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1431 if (contact->nickname.str)
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1432 fprintf(f_output, "NICKNAME:%s\n", pst_rfc2426_escape(contact->nickname.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1433 if (contact->address1.str)
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1434 fprintf(f_output, "EMAIL:%s\n", pst_rfc2426_escape(contact->address1.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1435 if (contact->address2.str)
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1436 fprintf(f_output, "EMAIL:%s\n", pst_rfc2426_escape(contact->address2.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1437 if (contact->address3.str)
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1438 fprintf(f_output, "EMAIL:%s\n", pst_rfc2426_escape(contact->address3.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1439 if (contact->birthday)
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1440 fprintf(f_output, "BDAY:%s\n", pst_rfc2425_datetime_format(contact->birthday));
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
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 if (contact->home_address.str) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1443 //fprintf(f_output, "ADR;TYPE=home:%s;%s;%s;%s;%s;%s;%s\n",
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1444 fprintf(f_output, "ADR;TYPE=home:%s;", (!contact->home_po_box.str) ? "" : pst_rfc2426_escape(contact->home_po_box.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1445 fprintf(f_output, "%s;", ""); // extended Address
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1446 fprintf(f_output, "%s;", (!contact->home_street.str) ? "" : pst_rfc2426_escape(contact->home_street.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1447 fprintf(f_output, "%s;", (!contact->home_city.str) ? "" : pst_rfc2426_escape(contact->home_city.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1448 fprintf(f_output, "%s;", (!contact->home_state.str) ? "" : pst_rfc2426_escape(contact->home_state.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1449 fprintf(f_output, "%s;", (!contact->home_postal_code.str) ? "" : pst_rfc2426_escape(contact->home_postal_code.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1450 fprintf(f_output, "%s\n", (!contact->home_country.str) ? "" : pst_rfc2426_escape(contact->home_country.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1451 fprintf(f_output, "LABEL;TYPE=home:%s\n", pst_rfc2426_escape(contact->home_address.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1452 }
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1453
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1454 if (contact->business_address.str) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1455 //fprintf(f_output, "ADR;TYPE=work:%s;%s;%s;%s;%s;%s;%s\n",
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1456 fprintf(f_output, "ADR;TYPE=work:%s;", (!contact->business_po_box.str) ? "" : pst_rfc2426_escape(contact->business_po_box.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1457 fprintf(f_output, "%s;", ""); // extended Address
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1458 fprintf(f_output, "%s;", (!contact->business_street.str) ? "" : pst_rfc2426_escape(contact->business_street.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1459 fprintf(f_output, "%s;", (!contact->business_city.str) ? "" : pst_rfc2426_escape(contact->business_city.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1460 fprintf(f_output, "%s;", (!contact->business_state.str) ? "" : pst_rfc2426_escape(contact->business_state.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1461 fprintf(f_output, "%s;", (!contact->business_postal_code.str) ? "" : pst_rfc2426_escape(contact->business_postal_code.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1462 fprintf(f_output, "%s\n", (!contact->business_country.str) ? "" : pst_rfc2426_escape(contact->business_country.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1463 fprintf(f_output, "LABEL;TYPE=work:%s\n", pst_rfc2426_escape(contact->business_address.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1464 }
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1465
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1466 if (contact->other_address.str) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1467 //fprintf(f_output, "ADR;TYPE=postal:%s;%s;%s;%s;%s;%s;%s\n",
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1468 fprintf(f_output, "ADR;TYPE=postal:%s;",(!contact->other_po_box.str) ? "" : pst_rfc2426_escape(contact->other_po_box.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1469 fprintf(f_output, "%s;", ""); // extended Address
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1470 fprintf(f_output, "%s;", (!contact->other_street.str) ? "" : pst_rfc2426_escape(contact->other_street.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1471 fprintf(f_output, "%s;", (!contact->other_city.str) ? "" : pst_rfc2426_escape(contact->other_city.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1472 fprintf(f_output, "%s;", (!contact->other_state.str) ? "" : pst_rfc2426_escape(contact->other_state.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1473 fprintf(f_output, "%s;", (!contact->other_postal_code.str) ? "" : pst_rfc2426_escape(contact->other_postal_code.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1474 fprintf(f_output, "%s\n", (!contact->other_country.str) ? "" : pst_rfc2426_escape(contact->other_country.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1475 fprintf(f_output, "LABEL;TYPE=postal:%s\n", pst_rfc2426_escape(contact->other_address.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1476 }
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1477
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1478 if (contact->business_fax.str) fprintf(f_output, "TEL;TYPE=work,fax:%s\n", pst_rfc2426_escape(contact->business_fax.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1479 if (contact->business_phone.str) fprintf(f_output, "TEL;TYPE=work,voice:%s\n", pst_rfc2426_escape(contact->business_phone.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1480 if (contact->business_phone2.str) fprintf(f_output, "TEL;TYPE=work,voice:%s\n", pst_rfc2426_escape(contact->business_phone2.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1481 if (contact->car_phone.str) fprintf(f_output, "TEL;TYPE=car,voice:%s\n", pst_rfc2426_escape(contact->car_phone.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1482 if (contact->home_fax.str) fprintf(f_output, "TEL;TYPE=home,fax:%s\n", pst_rfc2426_escape(contact->home_fax.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1483 if (contact->home_phone.str) fprintf(f_output, "TEL;TYPE=home,voice:%s\n", pst_rfc2426_escape(contact->home_phone.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1484 if (contact->home_phone2.str) fprintf(f_output, "TEL;TYPE=home,voice:%s\n", pst_rfc2426_escape(contact->home_phone2.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1485 if (contact->isdn_phone.str) fprintf(f_output, "TEL;TYPE=isdn:%s\n", pst_rfc2426_escape(contact->isdn_phone.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1486 if (contact->mobile_phone.str) fprintf(f_output, "TEL;TYPE=cell,voice:%s\n", pst_rfc2426_escape(contact->mobile_phone.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1487 if (contact->other_phone.str) fprintf(f_output, "TEL;TYPE=msg:%s\n", pst_rfc2426_escape(contact->other_phone.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1488 if (contact->pager_phone.str) fprintf(f_output, "TEL;TYPE=pager:%s\n", pst_rfc2426_escape(contact->pager_phone.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1489 if (contact->primary_fax.str) fprintf(f_output, "TEL;TYPE=fax,pref:%s\n", pst_rfc2426_escape(contact->primary_fax.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1490 if (contact->primary_phone.str) fprintf(f_output, "TEL;TYPE=phone,pref:%s\n", pst_rfc2426_escape(contact->primary_phone.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1491 if (contact->radio_phone.str) fprintf(f_output, "TEL;TYPE=pcs:%s\n", pst_rfc2426_escape(contact->radio_phone.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1492 if (contact->telex.str) fprintf(f_output, "TEL;TYPE=bbs:%s\n", pst_rfc2426_escape(contact->telex.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1493 if (contact->job_title.str) fprintf(f_output, "TITLE:%s\n", pst_rfc2426_escape(contact->job_title.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1494 if (contact->profession.str) fprintf(f_output, "ROLE:%s\n", pst_rfc2426_escape(contact->profession.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1495 if (contact->assistant_name.str || contact->assistant_phone.str) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1496 fprintf(f_output, "AGENT:BEGIN:VCARD\n");
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1497 if (contact->assistant_name.str) fprintf(f_output, "FN:%s\n", pst_rfc2426_escape(contact->assistant_name.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1498 if (contact->assistant_phone.str) fprintf(f_output, "TEL:%s\n", pst_rfc2426_escape(contact->assistant_phone.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1499 }
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1500 if (contact->company_name.str) fprintf(f_output, "ORG:%s\n", pst_rfc2426_escape(contact->company_name.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1501 if (comment) fprintf(f_output, "NOTE:%s\n", pst_rfc2426_escape(comment));
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1502
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1503 fprintf(f_output, "VERSION: 3.0\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1504 fprintf(f_output, "END:VCARD\n\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1505 DEBUG_RET();
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1506 }
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1507
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1508
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1509 void write_appointment(FILE* f_output, pst_item *item, pst_item_appointment* appointment,
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1510 FILETIME* create_date, FILETIME* modify_date)
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1511 {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1512 // make everything utf8
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1513 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
1514 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
1515 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
1516
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1517 fprintf(f_output, "BEGIN:VEVENT\n");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1518 if (create_date)
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1519 fprintf(f_output, "CREATED:%s\n", pst_rfc2445_datetime_format(create_date));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1520 if (modify_date)
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1521 fprintf(f_output, "LAST-MOD:%s\n", pst_rfc2445_datetime_format(modify_date));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1522 if (item->subject.str)
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1523 fprintf(f_output, "SUMMARY:%s\n", pst_rfc2426_escape(item->subject.str));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1524 if (item->body.str)
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1525 fprintf(f_output, "DESCRIPTION:%s\n", pst_rfc2426_escape(item->body.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1526 if (appointment && appointment->start)
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1527 fprintf(f_output, "DTSTART;VALUE=DATE-TIME:%s\n", pst_rfc2445_datetime_format(appointment->start));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1528 if (appointment && appointment->end)
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1529 fprintf(f_output, "DTEND;VALUE=DATE-TIME:%s\n", pst_rfc2445_datetime_format(appointment->end));
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1530 if (appointment && appointment->location.str)
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1531 fprintf(f_output, "LOCATION:%s\n", pst_rfc2426_escape(appointment->location.str));
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1532 if (appointment) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1533 switch (appointment->showas) {
50
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1534 case PST_FREEBUSY_TENTATIVE:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1535 fprintf(f_output, "STATUS:TENTATIVE\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1536 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1537 case PST_FREEBUSY_FREE:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1538 // mark as transparent and as confirmed
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1539 fprintf(f_output, "TRANSP:TRANSPARENT\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1540 case PST_FREEBUSY_BUSY:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1541 case PST_FREEBUSY_OUT_OF_OFFICE:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1542 fprintf(f_output, "STATUS:CONFIRMED\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1543 break;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1544 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1545 switch (appointment->label) {
50
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1546 case PST_APP_LABEL_NONE:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1547 fprintf(f_output, "CATEGORIES:NONE\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1548 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1549 case PST_APP_LABEL_IMPORTANT:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1550 fprintf(f_output, "CATEGORIES:IMPORTANT\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1551 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1552 case PST_APP_LABEL_BUSINESS:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1553 fprintf(f_output, "CATEGORIES:BUSINESS\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1554 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1555 case PST_APP_LABEL_PERSONAL:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1556 fprintf(f_output, "CATEGORIES:PERSONAL\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1557 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1558 case PST_APP_LABEL_VACATION:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1559 fprintf(f_output, "CATEGORIES:VACATION\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1560 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1561 case PST_APP_LABEL_MUST_ATTEND:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1562 fprintf(f_output, "CATEGORIES:MUST-ATTEND\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1563 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1564 case PST_APP_LABEL_TRAVEL_REQ:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1565 fprintf(f_output, "CATEGORIES:TRAVEL-REQUIRED\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1566 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1567 case PST_APP_LABEL_NEEDS_PREP:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1568 fprintf(f_output, "CATEGORIES:NEEDS-PREPARATION\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1569 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1570 case PST_APP_LABEL_BIRTHDAY:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1571 fprintf(f_output, "CATEGORIES:BIRTHDAY\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1572 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1573 case PST_APP_LABEL_ANNIVERSARY:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1574 fprintf(f_output, "CATEGORIES:ANNIVERSARY\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1575 break;
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1576 case PST_APP_LABEL_PHONE_CALL:
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1577 fprintf(f_output, "CATEGORIES:PHONE-CALL\n");
fb3818370dd6 more fixes for 64 bit format
carl
parents: 48
diff changeset
1578 break;
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1579 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1580 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1581 fprintf(f_output, "END:VEVENT\n\n");
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1582 }
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1583
31
b88ceb81dba2 mege changes from Joe Nahmias
carl
parents: 28
diff changeset
1584
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1585 void create_enter_dir(struct file_ll* f, pst_item *item)
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1586 {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1587 pst_convert_utf8(item, &item->file_as);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1588 f->email_count = 0;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1589 f->skip_count = 0;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1590 f->type = item->type;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1591 f->stored_count = (item->folder) ? item->folder->email_count : 0;
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1592
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1593 DEBUG_ENT("create_enter_dir");
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1594 if (mode == MODE_KMAIL)
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
1595 f->name = mk_kmail_dir(item->file_as.str);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1596 else if (mode == MODE_RECURSE)
154
581fab9f1dc7 avoid emitting bogus empty email messages into contacts and calendar files
Carl Byington <carl@five-ten-sg.com>
parents: 151
diff changeset
1597 f->name = mk_recurse_dir(item->file_as.str, f->type);
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
1598 else if (mode == MODE_SEPARATE) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1599 // do similar stuff to recurse here.
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1600 mk_separate_dir(item->file_as.str);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1601 f->name = (char*) xmalloc(10);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1602 memset(f->name, 0, 10);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1603 // sprintf(f->name, SEP_MAIL_FILE_TEMPLATE, f->email_count);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1604 } else {
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1605 f->name = (char*) xmalloc(strlen(item->file_as.str)+strlen(OUTPUT_TEMPLATE)+1);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1606 sprintf(f->name, OUTPUT_TEMPLATE, item->file_as.str);
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1607 }
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1608
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1609 f->dname = (char*) xmalloc(strlen(item->file_as.str)+1);
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1610 strcpy(f->dname, item->file_as.str);
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1611
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1612 if (overwrite != 1) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1613 int x = 0;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1614 char *temp = (char*) xmalloc (strlen(f->name)+10); //enough room for 10 digits
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1615
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1616 sprintf(temp, "%s", f->name);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1617 check_filename(temp);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1618 while ((f->output = fopen(temp, "r"))) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1619 DEBUG_MAIN(("need to increase filename because one already exists with that name\n"));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1620 DEBUG_MAIN(("- increasing it to %s%d\n", f->name, x));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1621 x++;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1622 sprintf(temp, "%s%08d", f->name, x);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1623 DEBUG_MAIN(("- trying \"%s\"\n", f->name));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1624 if (x == 99999999) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1625 DIE(("create_enter_dir: Why can I not create a folder %s? I have tried %i extensions...\n", f->name, x));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1626 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1627 fclose(f->output);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1628 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1629 if (x > 0) { //then the f->name should change
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1630 free (f->name);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1631 f->name = temp;
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1632 } else {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1633 free(temp);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1634 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1635 }
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1636
151
cda7c812ec01 track character set individually for each mapi element
Carl Byington <carl@five-ten-sg.com>
parents: 150
diff changeset
1637 DEBUG_MAIN(("f->name = %s\nitem->folder_name = %s\n", f->name, item->file_as.str));
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
1638 if (mode != MODE_SEPARATE) {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1639 check_filename(f->name);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1640 if (!(f->output = fopen(f->name, "w"))) {
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1641 DIE(("create_enter_dir: Could not open file \"%s\" for write\n", f->name));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1642 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1643 }
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1644 DEBUG_RET();
25
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1645 }
73e8959cd86b patches from Arne
carl
parents: 21
diff changeset
1646
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1647
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1648 void close_enter_dir(struct file_ll *f)
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1649 {
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1650 DEBUG_MAIN(("main: Email Count for folder %s is %i\n", f->dname, f->email_count));
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1651 if (output_mode != OUTPUT_QUIET)
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1652 printf("\t\"%s\" - %i items done, skipped %i, should have been %i\n",
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1653 f->dname, f->email_count, f->skip_count, f->stored_count);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1654 if (f->output) fclose(f->output);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1655 free(f->name);
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1656 free(f->dname);
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1657
43
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1658 if (mode == MODE_KMAIL)
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1659 close_kmail_dir();
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1660 else if (mode == MODE_RECURSE)
f6db1f060a95 start on outlook 2003 64 bit format
carl
parents: 41
diff changeset
1661 close_recurse_dir();
77
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
1662 else if (mode == MODE_SEPARATE)
87216aefc6df spelling fixup
Carl Byington <carl@five-ten-sg.com>
parents: 75
diff changeset
1663 close_separate_dir();
39
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1664 }
2ad7ef0a3c4f more valgrind fixes
carl
parents: 38
diff changeset
1665