annotate src/readpst.c @ 121:8399ef94c11b

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