annotate src/readpst.c @ 79:56fa05fd5271

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