annotate src/readpst.c @ 143:fdc58ad2c758 stable-0-6-28

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