'LibPst'
msg.cpp
Go to the documentation of this file.
1 extern "C" {
2  #include "define.h"
3  #include "msg.h"
4 }
5 
6 #include <gsf/gsf-utils.h>
7 
8 #include <gsf/gsf-input-stdio.h>
9 #include <gsf/gsf-infile.h>
10 #include <gsf/gsf-infile-stdio.h>
11 
12 #include <gsf/gsf-output-stdio.h>
13 #include <gsf/gsf-outfile.h>
14 #include <gsf/gsf-outfile-msole.h>
15 
16 #include <list>
17 #include <vector>
18 #include <string>
19 
20 using namespace std;
21 
22 struct property {
23  uint32_t tag;
24  uint32_t flags;
25  uint32_t length; // or value
26  uint32_t reserved;
27 };
28 typedef list<property> property_list;
29 
30 
36 static void convert_8bit(pst_string &str, const char *charset);
37 static void convert_8bit(pst_string &str, const char *charset) {
38  if (!str.str) return; // null
39  if (!str.is_utf8) return; // not utf8
40 
41  DEBUG_ENT("convert_8bit");
42  pst_vbuf *newer = pst_vballoc(2);
43  size_t strsize = strlen(str.str);
44  size_t rc = pst_vb_utf8to8bit(newer, str.str, strsize, charset);
45  if (rc == (size_t)-1) {
46  // unable to convert, change the charset to utf8
47  free(newer->b);
48  DEBUG_INFO(("Failed to convert utf-8 to %s\n", charset));
49  DEBUG_HEXDUMPC(str.str, strsize, 0x10);
50  }
51  else {
52  // null terminate the output string
53  pst_vbgrow(newer, 1);
54  newer->b[newer->dlen] = '\0';
55  free(str.str);
56  str.str = newer->b;
57  }
58  free(newer);
59  DEBUG_RET();
60 }
61 
62 
63 static void empty_property(GsfOutfile *out, uint32_t tag);
64 static void empty_property(GsfOutfile *out, uint32_t tag) {
65  vector<char> n(50);
66  snprintf(&n[0], n.size(), "__substg1.0_%08X", tag);
67  GsfOutput* dst = gsf_outfile_new_child(out, &n[0], false);
68  gsf_output_close(dst);
69  g_object_unref(G_OBJECT(dst));
70 }
71 
72 
73 static void string_property(GsfOutfile *out, property_list &prop, uint32_t tag, const char *contents, size_t size);
74 static void string_property(GsfOutfile *out, property_list &prop, uint32_t tag, const char *contents, size_t size) {
75  if (!contents) return;
76  size_t term = ((tag & 0x0000ffff) == 0x001e) ? 1 :
77  ((tag & 0x0000ffff) == 0x001f) ? 2 : 0; // null terminator
78  vector<char> n(50);
79  snprintf(&n[0], n.size(), "__substg1.0_%08X", tag);
80  GsfOutput* dst = gsf_outfile_new_child(out, &n[0], false);
81  gsf_output_write(dst, size, (const guint8*)contents);
82  if (term) {
83  memset(&n[0], 0, term);
84  gsf_output_write(dst, term, (const guint8*)&n[0]);
85  size += term;
86  }
87  gsf_output_close(dst);
88  g_object_unref(G_OBJECT(dst));
89 
90  property p;
91  p.tag = tag;
92  p.flags = 0x6; // make all the properties writable
93  p.length = size;
94  p.reserved = 0;
95  prop.push_back(p);
96 }
97 
98 
99 static void string_property(GsfOutfile *out, property_list &prop, uint32_t tag, FILE *fp);
100 static void string_property(GsfOutfile *out, property_list &prop, uint32_t tag, FILE *fp) {
101  vector<char> n(50);
102  snprintf(&n[0], n.size(), "__substg1.0_%08X", tag);
103  GsfOutput* dst = gsf_outfile_new_child(out, &n[0], false);
104 
105  size_t size = 0;
106  const size_t bsize = 10000;
107  char buf[bsize];
108 
109  while (1) {
110  size_t s = fread(buf, 1, bsize, fp);
111  if (!s) break;
112  gsf_output_write(dst, s, (const guint8*)buf);
113  }
114 
115  gsf_output_close(dst);
116  g_object_unref(G_OBJECT(dst));
117 
118  property p;
119  p.tag = tag;
120  p.flags = 0x6; // make all the properties writable
121  p.length = size;
122  p.reserved = 0;
123  prop.push_back(p);
124 }
125 
126 
127 static void string_property(GsfOutfile *out, property_list &prop, uint32_t tag, const char* charset, pst_string &contents);
128 static void string_property(GsfOutfile *out, property_list &prop, uint32_t tag, const char* charset, pst_string &contents) {
129  if (contents.str) {
130  convert_8bit(contents, charset);
131  string_property(out, prop, tag, contents.str, strlen(contents.str));
132  }
133 }
134 
135 
136 static void strin0_property(GsfOutfile *out, property_list &prop, uint32_t tag, const char* charset, pst_string &contents);
137 static void strin0_property(GsfOutfile *out, property_list &prop, uint32_t tag, const char* charset, pst_string &contents) {
138  if (contents.str) {
139  convert_8bit(contents, charset);
140  string_property(out, prop, tag, contents.str, strlen(contents.str)+1);
141  }
142 }
143 
144 
145 static void string_property(GsfOutfile *out, property_list &prop, uint32_t tag, const string &contents);
146 static void string_property(GsfOutfile *out, property_list &prop, uint32_t tag, const string &contents) {
147  string_property(out, prop, tag, contents.c_str(), contents.size());
148 }
149 
150 
151 static void string_property(GsfOutfile *out, property_list &prop, uint32_t tag, pst_binary &contents);
152 static void string_property(GsfOutfile *out, property_list &prop, uint32_t tag, pst_binary &contents) {
153  if (contents.size) string_property(out, prop, tag, contents.data, contents.size);
154 }
155 
156 
157 static void write_properties(GsfOutfile *out, property_list &prop, const guint8* header, size_t hlen);
158 static void write_properties(GsfOutfile *out, property_list &prop, const guint8* header, size_t hlen) {
159  GsfOutput* dst = gsf_outfile_new_child(out, "__properties_version1.0", false);
160  gsf_output_write(dst, hlen, header);
161  for (property_list::iterator i=prop.begin(); i!=prop.end(); i++) {
162  property &p = *i;
163  gsf_output_write(dst, sizeof(property), (const guint8*)&p);
164  }
165  gsf_output_close(dst);
166  g_object_unref(G_OBJECT(dst));
167 }
168 
169 
170 static void int_property(property_list &prop_list, uint32_t tag, uint32_t flags, uint32_t value);
171 static void int_property(property_list &prop_list, uint32_t tag, uint32_t flags, uint32_t value) {
172  property p;
173  p.tag = tag;
174  p.flags = flags;
175  p.length = value;
176  p.reserved = 0;
177  prop_list.push_back(p);
178 }
179 
180 
181 static void i64_property(property_list &prop_list, uint32_t tag, uint32_t flags, FILETIME *value);
182 static void i64_property(property_list &prop_list, uint32_t tag, uint32_t flags, FILETIME *value) {
183  if (value) {
184  property p;
185  p.tag = tag;
186  p.flags = flags;
187  p.length = value->dwLowDateTime;
188  p.reserved = value->dwHighDateTime;
189  prop_list.push_back(p);
190  }
191 }
192 
193 
194 static void nzi_property(property_list &prop_list, uint32_t tag, uint32_t flags, uint32_t value);
195 static void nzi_property(property_list &prop_list, uint32_t tag, uint32_t flags, uint32_t value) {
196  if (value) int_property(prop_list, tag, flags, value);
197 }
198 
199 
200 void write_msg_email(char *fname, pst_item* item, pst_file* pst) {
201  // this is not an email item
202  if (!item->email) return;
203  DEBUG_ENT("write_msg_email");
204 
205  pst_item_email &email = *(item->email);
206 
207  char charset[30];
208  const char* body_charset = pst_default_charset(item, sizeof(charset), charset);
209  DEBUG_INFO(("%s body charset seems to be %s\n", fname, body_charset));
210  body_charset = "iso-8859-1//TRANSLIT//IGNORE";
211 
212  gsf_init();
213 
214  GsfOutfile *outfile;
215  GsfOutput *output;
216  GError *err = NULL;
217 
218  output = gsf_output_stdio_new(fname, &err);
219  if (output == NULL) {
220  gsf_shutdown();
221  DEBUG_INFO(("unable to open output .msg file %s\n", fname));
222  DEBUG_RET();
223  return;
224  }
225 
226  struct top_property_header {
227  uint32_t reserved1;
228  uint32_t reserved2;
229  uint32_t next_recipient; // same as recipient count
230  uint32_t next_attachment; // same as attachment count
231  uint32_t recipient_count;
232  uint32_t attachment_count;
233  uint32_t reserved3;
234  uint32_t reserved4;
235  };
236 
237  top_property_header top_head;
238  memset(&top_head, 0, sizeof(top_head));
239 
240  outfile = gsf_outfile_msole_new(output);
241  g_object_unref(G_OBJECT(output));
242 
243  output = GSF_OUTPUT(outfile);
244  property_list prop_list;
245 
246  int_property(prop_list, 0x00170003, 0x6, email.importance);
247  nzi_property(prop_list, 0x0023000B, 0x6, email.delivery_report);
248  nzi_property(prop_list, 0x00260003, 0x6, email.priority);
249  nzi_property(prop_list, 0x0029000B, 0x6, email.read_receipt);
250  nzi_property(prop_list, 0x002E0003, 0x6, email.original_sensitivity);
251  nzi_property(prop_list, 0x00360003, 0x6, email.sensitivity);
252  nzi_property(prop_list, 0x0C17000B, 0x6, email.reply_requested);
253  nzi_property(prop_list, 0x0E01000B, 0x6, email.delete_after_submit);
254  int_property(prop_list, 0x0E070003, 0x6, item->flags);
255  i64_property(prop_list, 0x00390040, 0x6, email.sent_date);
256  GsfOutfile *out = GSF_OUTFILE (output);
257  string_property(out, prop_list, 0x001A001E, item->ascii_type);
258  string_property(out, prop_list, 0x0037001E, body_charset, item->subject);
259  strin0_property(out, prop_list, 0x003B0102, body_charset, email.outlook_sender);
260  string_property(out, prop_list, 0x003D001E, string(""));
261  string_property(out, prop_list, 0x0040001E, body_charset, email.outlook_received_name1);
262  string_property(out, prop_list, 0x0042001E, body_charset, email.outlook_sender_name);
263  string_property(out, prop_list, 0x0044001E, body_charset, email.outlook_recipient_name);
264  string_property(out, prop_list, 0x0050001E, body_charset, email.reply_to);
265  strin0_property(out, prop_list, 0x00510102, body_charset, email.outlook_recipient);
266  strin0_property(out, prop_list, 0x00520102, body_charset, email.outlook_recipient2);
267  string_property(out, prop_list, 0x0064001E, body_charset, email.sender_access);
268  string_property(out, prop_list, 0x0065001E, body_charset, email.sender_address);
269  string_property(out, prop_list, 0x0070001E, body_charset, email.processed_subject);
270  string_property(out, prop_list, 0x00710102, email.conversation_index);
271  string_property(out, prop_list, 0x0072001E, body_charset, email.original_bcc);
272  string_property(out, prop_list, 0x0073001E, body_charset, email.original_cc);
273  string_property(out, prop_list, 0x0074001E, body_charset, email.original_to);
274  string_property(out, prop_list, 0x0075001E, body_charset, email.recip_access);
275  string_property(out, prop_list, 0x0076001E, body_charset, email.recip_address);
276  string_property(out, prop_list, 0x0077001E, body_charset, email.recip2_access);
277  string_property(out, prop_list, 0x0078001E, body_charset, email.recip2_address);
278  string_property(out, prop_list, 0x007D001E, body_charset, email.header);
279  string_property(out, prop_list, 0x0C1A001E, body_charset, email.outlook_sender_name2);
280  strin0_property(out, prop_list, 0x0C1D0102, body_charset, email.outlook_sender2);
281  string_property(out, prop_list, 0x0C1E001E, body_charset, email.sender2_access);
282  string_property(out, prop_list, 0x0C1F001E, body_charset, email.sender2_address);
283  string_property(out, prop_list, 0x0E02001E, body_charset, email.bcc_address);
284  string_property(out, prop_list, 0x0E03001E, body_charset, email.cc_address);
285  string_property(out, prop_list, 0x0E04001E, body_charset, email.sentto_address);
286  string_property(out, prop_list, 0x0E1D001E, body_charset, email.outlook_normalized_subject);
287  string_property(out, prop_list, 0x1000001E, body_charset, item->body);
288  string_property(out, prop_list, 0x1013001E, body_charset, email.htmlbody);
289  string_property(out, prop_list, 0x1035001E, body_charset, email.messageid);
290  string_property(out, prop_list, 0x1042001E, body_charset, email.in_reply_to);
291  string_property(out, prop_list, 0x1046001E, body_charset, email.return_path_address);
292  // any property over 0x8000 needs entries in the __nameid to make them
293  // either string named or numerical named properties.
294 
295  {
296  vector<char> n(50);
297  {
298  snprintf(&n[0], n.size(), "__recip_version1.0_#%08X", top_head.recipient_count);
299  GsfOutput *output = gsf_outfile_new_child(out, &n[0], true);
300  {
301  int v = 1; // to
302  property_list prop_list;
303  int_property(prop_list, 0x0C150003, 0x6, v); // PidTagRecipientType
304  int_property(prop_list, 0x30000003, 0x6, top_head.recipient_count); // PR_ROWID
305  GsfOutfile *out = GSF_OUTFILE (output);
306  string_property(out, prop_list, 0x3001001E, body_charset, item->file_as);
307  if (item->contact) {
308  string_property(out, prop_list, 0x3002001E, body_charset, item->contact->address1_transport);
309  string_property(out, prop_list, 0x3003001E, body_charset, item->contact->address1);
310  string_property(out, prop_list, 0x5ff6001E, body_charset, item->contact->address1);
311  }
312  strin0_property(out, prop_list, 0x300B0102, body_charset, email.outlook_search_key);
313  write_properties(out, prop_list, (const guint8*)&top_head, 8); // convenient 8 bytes of reserved zeros
314  gsf_output_close(output);
315  g_object_unref(G_OBJECT(output));
316  top_head.next_recipient++;
317  top_head.recipient_count++;
318  }
319  }
320  if (email.cc_address.str) {
321  snprintf(&n[0], n.size(), "__recip_version1.0_#%08X", top_head.recipient_count);
322  GsfOutput *output = gsf_outfile_new_child(out, &n[0], true);
323  {
324  int v = 2; // cc
325  property_list prop_list;
326  int_property(prop_list, 0x0C150003, 0x6, v); // PidTagRecipientType
327  int_property(prop_list, 0x30000003, 0x6, top_head.recipient_count); // PR_ROWID
328  GsfOutfile *out = GSF_OUTFILE (output);
329  string_property(out, prop_list, 0x3001001E, body_charset, email.cc_address);
330  string_property(out, prop_list, 0x3003001E, body_charset, email.cc_address);
331  string_property(out, prop_list, 0x5ff6001E, body_charset, email.cc_address);
332  write_properties(out, prop_list, (const guint8*)&top_head, 8); // convenient 8 bytes of reserved zeros
333  gsf_output_close(output);
334  g_object_unref(G_OBJECT(output));
335  top_head.next_recipient++;
336  top_head.recipient_count++;
337  }
338  }
339  if (email.bcc_address.str) {
340  snprintf(&n[0], n.size(), "__recip_version1.0_#%08X", top_head.recipient_count);
341  GsfOutput *output = gsf_outfile_new_child(out, &n[0], true);
342  {
343  int v = 3; // bcc
344  property_list prop_list;
345  int_property(prop_list, 0x0C150003, 0x6, v); // PidTagRecipientType
346  int_property(prop_list, 0x30000003, 0x6, top_head.recipient_count); // PR_ROWID
347  GsfOutfile *out = GSF_OUTFILE (output);
348  string_property(out, prop_list, 0x3001001E, body_charset, email.bcc_address);
349  string_property(out, prop_list, 0x3003001E, body_charset, email.bcc_address);
350  string_property(out, prop_list, 0x5ff6001E, body_charset, email.bcc_address);
351  write_properties(out, prop_list, (const guint8*)&top_head, 8); // convenient 8 bytes of reserved zeros
352  gsf_output_close(output);
353  g_object_unref(G_OBJECT(output));
354  top_head.next_recipient++;
355  top_head.recipient_count++;
356  }
357  }
358  }
359 
360  pst_item_attach *a = item->attach;
361  while (a) {
362  if (a->method == PST_ATTACH_EMBEDDED) {
363  // not implemented yet
364  }
365  else if (a->data.data || a->i_id) {
366  vector<char> n(50);
367  snprintf(&n[0], n.size(), "__attach_version1.0_#%08X", top_head.attachment_count);
368  GsfOutput *output = gsf_outfile_new_child(out, &n[0], true);
369  {
370  FILE *fp = fopen("temp_file_attachment", "w+b");
371  if (fp) {
372  pst_attach_to_file(pst, a, fp); // data is now in the file
373  fseek(fp, 0, SEEK_SET);
374  property_list prop_list;
375  int_property(prop_list, 0x0E210003, 0x2, top_head.attachment_count); // MAPI_ATTACH_NUM
376  int_property(prop_list, 0x0FF40003, 0x2, 2); // PR_ACCESS read
377  int_property(prop_list, 0x0FF70003, 0x2, 0); // PR_ACCESS_LEVEL read only
378  int_property(prop_list, 0x0FFE0003, 0x2, 7); // PR_OBJECT_TYPE attachment
379  int_property(prop_list, 0x37050003, 0x7, 1); // PR_ATTACH_METHOD by value
380  int_property(prop_list, 0x370B0003, 0x7, a->position); // PR_RENDERING_POSITION
381  int_property(prop_list, 0x37100003, 0x6, a->sequence); // PR_ATTACH_MIME_SEQUENCE
382  GsfOutfile *out = GSF_OUTFILE (output);
383  string_property(out, prop_list, 0x0FF90102, item->record_key);
384  string_property(out, prop_list, 0x37010102, fp);
385  if (a->filename2.str) {
386  // have long file name
387  string_property(out, prop_list, 0x3707001E, body_charset, a->filename2);
388  }
389  else if (a->filename1.str) {
390  // have short file name
391  string_property(out, prop_list, 0x3704001E, body_charset, a->filename1);
392  }
393  else {
394  // make up a name
395  const char *n = "inline";
396  string_property(out, prop_list, 0x3704001E, n, strlen(n));
397  }
398  string_property(out, prop_list, 0x370E001E, body_charset, a->mimetype);
399  write_properties(out, prop_list, (const guint8*)&top_head, 8); // convenient 8 bytes of reserved zeros
400  gsf_output_close(output);
401  g_object_unref(G_OBJECT(output));
402  top_head.next_attachment++;
403  top_head.attachment_count++;
404  fclose(fp);
405  }
406  }
407  }
408  a = a->next;
409  }
410 
411  write_properties(out, prop_list, (const guint8*)&top_head, sizeof(top_head));
412 
413  {
414  GsfOutput *output = gsf_outfile_new_child(out, "__nameid_version1.0", true);
415  {
416  GsfOutfile *out = GSF_OUTFILE (output);
417  empty_property(out, 0x00020102);
418  empty_property(out, 0x00030102);
419  empty_property(out, 0x00040102);
420  gsf_output_close(output);
421  g_object_unref(G_OBJECT(output));
422  }
423  }
424 
425  gsf_output_close(output);
426  g_object_unref(G_OBJECT(output));
427 
428  gsf_shutdown();
429  DEBUG_RET();
430 }
431 
pst_string sender_address
mapi element 0x0065 PR_SENT_REPRESENTING_EMAIL_ADDRESS
Definition: libpst.h:299
pst_string original_cc
mapi element 0x0073 PR_ORIGINAL_DISPLAY_CC
Definition: libpst.h:225
pst_string outlook_received_name1
mapi element 0x0040 PR_RECEIVED_BY_NAME
Definition: libpst.h:331
pst_item_contact * contact
contact mapi elements
Definition: libpst.h:790
int32_t importance
mapi element 0x0017 PR_IMPORTANCE
Definition: libpst.h:199
int32_t flags
mapi element 0x0e07 PR_MESSAGE_FLAGS
Definition: libpst.h:825
pst_string subject
mapi element 0x0037 PR_SUBJECT
Definition: libpst.h:835
pst_vbuf * pst_vballoc(size_t len)
Definition: vbuf.c:130
pst_binary record_key
mapi element 0x0ff9 PR_RECORD_KEY
Definition: libpst.h:845
pst_string header
mapi element 0x007d PR_TRANSPORT_MESSAGE_HEADERS
Definition: libpst.h:192
int32_t original_sensitivity
mapi element 0x002e PR_ORIGINAL_SENSITIVITY
Definition: libpst.h:221
pst_binary conversation_index
mapi element 0x0071 PR_CONVERSATION_INDEX
Definition: libpst.h:174
int delete_after_submit
mapi element 0x0e01 PR_DELETE_AFTER_SUBMIT
Definition: libpst.h:182
pst_string processed_subject
mapi element 0x0070 PR_CONVERSATION_TOPIC
Definition: libpst.h:247
char * ascii_type
mapi element 0x001a PR_MESSAGE_CLASS or 0x3613 PR_CONTAINER_CLASS
Definition: libpst.h:813
void write_msg_email(char *fname, pst_item *item, pst_file *pst)
Definition: msg.cpp:200
size_t dlen
Definition: vbuf.h:10
pst_string address1_transport
mapi element 0x3002 PR_ADDRTYPE, or 0x8082
Definition: libpst.h:407
Definition: vbuf.h:9
static void nzi_property(property_list &prop_list, uint32_t tag, uint32_t flags, uint32_t value)
Definition: msg.cpp:195
size_t size
Definition: libpst.h:154
pst_string outlook_sender
mapi element 0x003b PR_SENT_REPRESENTING_SEARCH_KEY
Definition: libpst.h:235
pst_string sender2_access
mapi element 0x0c1e PR_SENDER_ADDRTYPE
Definition: libpst.h:301
#define DEBUG_INFO(x)
Definition: define.h:166
This contains the common mapi elements, and pointers to structures for each major mapi item type...
Definition: libpst.h:780
#define DEBUG_ENT(x)
Definition: define.h:171
list< property > property_list
Definition: msg.cpp:28
int32_t method
mapi element 0x3705 PR_ATTACH_METHOD
Definition: libpst.h:633
uint32_t tag
Definition: msg.cpp:23
static void convert_8bit(pst_string &str, const char *charset)
Convert str to an 8 bit charset if it is utf8, null strings are preserved.
Definition: msg.cpp:37
static void write_properties(GsfOutfile *out, property_list &prop, const guint8 *header, size_t hlen)
Definition: msg.cpp:158
#define DEBUG_RET()
Definition: define.h:176
This contains the attachment related mapi elements.
Definition: libpst.h:608
const char * pst_default_charset(pst_item *item, int buflen, char *result)
Get the default character set for this item.
Definition: libpst.c:4451
pst_string reply_to
mapi element 0x0050 PR_REPLY_RECIPIENT_NAMES
Definition: libpst.h:265
pst_string outlook_recipient_name
mapi element 0x0044 PR_RCVD_REPRESENTING_NAME
Definition: libpst.h:231
pst_binary data
mapi element 0x3701 PR_ATTACH_DATA_OBJ
Definition: libpst.h:618
a simple wrapper for binary blobs
Definition: libpst.h:153
pst_string file_as
mapi element 0x3001 PR_DISPLAY_NAME
Definition: libpst.h:827
pst_string messageid
mapi element 0x1035
Definition: libpst.h:215
#define PST_ATTACH_EMBEDDED
Definition: libpst.h:86
uint32_t length
Definition: msg.cpp:25
pst_string outlook_sender_name2
mapi element 0x0c1a PR_SENDER_NAME
Definition: libpst.h:333
pst_string outlook_search_key
mapi element 0x300b PR_SEARCH_KEY
Definition: libpst.h:337
The string is either utf8 encoded, or it is in the code page specified by the containing mapi object...
Definition: libpst.h:144
size_t pst_vb_utf8to8bit(pst_vbuf *dest, const char *inbuf, int iblen, const char *charset)
Definition: vbuf.c:246
pst_string recip2_address
mapi element 0x0078 PR_RCVD_REPRESENTING_EMAIL_ADDRESS
Definition: libpst.h:259
int32_t priority
mapi element 0x0026 PR_PRIORITY
Definition: libpst.h:245
pst_string recip_access
mapi element 0x0075 PR_RECEIVED_BY_ADDRTYPE
Definition: libpst.h:253
pst_string outlook_recipient2
mapi element 0x0052 PR_RCVD_REPRESENTING_SEARCH_KEY
Definition: libpst.h:233
pst_string mimetype
mapi element 0x370e PR_ATTACH_MIME_TAG
Definition: libpst.h:614
void pst_vbgrow(pst_vbuf *vb, size_t len)
out: vbavail(vb) >= len, data are preserved
Definition: vbuf.c:146
pst_string cc_address
mapi element 0x0e03 PR_DISPLAY_CC
Definition: libpst.h:170
char * data
Definition: libpst.h:155
pst_string sentto_address
mapi element 0x0e04 PR_DISPLAY_TO
Definition: libpst.h:315
FILETIME * sent_date
mapi element 0x0039 PR_CLIENT_SUBMIT_TIME
Definition: libpst.h:311
int delivery_report
mapi element 0x0023 PR_ORIGINATOR_DELIVERY_REPORT_REQUESTED
Definition: libpst.h:186
pst_string filename1
mapi element 0x3704 PR_ATTACH_FILENAME
Definition: libpst.h:610
pst_string body
mapi element 0x1000 PR_BODY
Definition: libpst.h:833
Definition: msg.cpp:22
uint32_t flags
Definition: msg.cpp:24
static void int_property(property_list &prop_list, uint32_t tag, uint32_t flags, uint32_t value)
Definition: msg.cpp:171
#define DEBUG_HEXDUMPC(x, s, c)
Definition: define.h:168
uint32_t dwLowDateTime
Definition: common.h:28
char * b
Definition: vbuf.h:13
uint32_t dwHighDateTime
Definition: common.h:29
pst_string sender_access
mapi element 0x0064 PR_SENT_REPRESENTING_ADDRTYPE
Definition: libpst.h:297
pst_string outlook_recipient
mapi element 0x0051 PR_RECEIVED_BY_SEARCH_KEY
Definition: libpst.h:229
int read_receipt
mapi element 0x0029 PR_READ_RECEIPT_REQUESTED
Definition: libpst.h:251
uint64_t i_id
calculated from id2_val during creation of record
Definition: libpst.h:622
pst_string bcc_address
mapi element 0x0e02 PR_DISPLAY_BCC
Definition: libpst.h:172
static void strin0_property(GsfOutfile *out, property_list &prop, uint32_t tag, const char *charset, pst_string &contents)
Definition: msg.cpp:137
pst_string htmlbody
mapi element 0x1013
Definition: libpst.h:194
int32_t sequence
mapi element 0x3710 PR_ATTACH_MIME_SEQUENCE
Definition: libpst.h:637
int reply_requested
mapi element 0x0c17 PR_REPLY_REQUESTED
Definition: libpst.h:263
pst_string in_reply_to
mapi element 0x1042
Definition: libpst.h:201
pst_string outlook_normalized_subject
mapi element 0x0e1d PR_NORMALIZED_SUBJECT
Definition: libpst.h:335
pst_string outlook_sender_name
mapi element 0x0042 PR_SENT_REPRESENTING_NAME
Definition: libpst.h:237
uint32_t reserved
Definition: msg.cpp:26
int is_utf8
Definition: libpst.h:147
pst_string sender2_address
mapi element 0x0c1f PR_SENDER_EMAIL_ADDRESS
Definition: libpst.h:303
This contains the email related mapi elements.
Definition: libpst.h:161
pst_string return_path_address
mapi element 0x1046, this seems to be the message-id of the rfc822 mail that is being returned ...
Definition: libpst.h:267
pst_string filename2
mapi element 0x3707 PR_ATTACH_LONG_FILENAME
Definition: libpst.h:612
size_t pst_attach_to_file(pst_file *pf, pst_item_attach *attach, FILE *fp)
Write a binary attachment to a file.
Definition: libpst.c:600
pst_string recip_address
mapi element 0x0076 PR_RECEIVED_BY_EMAIL_ADDRESS
Definition: libpst.h:255
static void i64_property(property_list &prop_list, uint32_t tag, uint32_t flags, FILETIME *value)
Definition: msg.cpp:182
static void empty_property(GsfOutfile *out, uint32_t tag)
Definition: msg.cpp:64
pst_item_email * email
email mapi elements
Definition: libpst.h:786
int32_t sensitivity
mapi element 0x0036 PR_SENSITIVITY
Definition: libpst.h:309
pst_item_attach * attach
linked list of attachments
Definition: libpst.h:792
pst_string address1
mapi element 0x3003 PR_EMAIL_ADDRESS, or 0x8083
Definition: libpst.h:401
pst_string recip2_access
mapi element 0x0077 PR_RCVD_REPRESENTING_ADDRTYPE
Definition: libpst.h:257
pst_string original_to
mapi element 0x0074 PR_ORIGINAL_DISPLAY_TO
Definition: libpst.h:227
struct pst_item_attach * next
Definition: libpst.h:638
int32_t position
mapi element 0x370b PR_RENDERING_POSITION
Definition: libpst.h:635
pst_string outlook_sender2
mapi element 0x0c1d PR_SENDER_SEARCH_KEY
Definition: libpst.h:239
pst_string original_bcc
mapi element 0x0072 PR_ORIGINAL_DISPLAY_BCC
Definition: libpst.h:223
static void string_property(GsfOutfile *out, property_list &prop, uint32_t tag, const char *contents, size_t size)
Definition: msg.cpp:74
char * str
Definition: libpst.h:148