annotate src/readpst.c @ 120:6395ced2b8b2

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