annotate src/readpst.c @ 60:97b7706bdda2

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