annotate src/readpst.c @ 141:fd4297884319

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