comparison libpst.c @ 11:bf12a9d4524c

more code cleanup
author carl
date Fri, 17 Feb 2006 22:48:32 -0800
parents a818f3c2e589
children 3f627519a92d
comparison
equal deleted inserted replaced
10:a818f3c2e589 11:bf12a9d4524c
184 184
185 DEBUG_RET(); 185 DEBUG_RET();
186 return 0; 186 return 0;
187 } 187 }
188 188
189
189 int32_t pst_close(pst_file *pf) { 190 int32_t pst_close(pst_file *pf) {
190 DEBUG_ENT("pst_close"); 191 DEBUG_ENT("pst_close");
191 if (pf->fp == NULL) { 192 if (pf->fp == NULL) {
192 WARN(("cannot close NULL fp\n")); 193 WARN(("cannot close NULL fp\n"));
193 DEBUG_RET(); 194 DEBUG_RET();
203 _pst_free_desc (pf->d_head); 204 _pst_free_desc (pf->d_head);
204 _pst_free_xattrib (pf->x_head); 205 _pst_free_xattrib (pf->x_head);
205 DEBUG_RET(); 206 DEBUG_RET();
206 return 0; 207 return 0;
207 } 208 }
209
208 210
209 pst_desc_ll* pst_getTopOfFolders(pst_file *pf, pst_item *root) { 211 pst_desc_ll* pst_getTopOfFolders(pst_file *pf, pst_item *root) {
210 pst_desc_ll *ret; 212 pst_desc_ll *ret;
211 // pst_item *i; 213 // pst_item *i;
212 // char *a, *b; 214 // char *a, *b;
224 } 226 }
225 DEBUG_RET(); 227 DEBUG_RET();
226 return ret; 228 return ret;
227 } 229 }
228 230
231
229 int32_t pst_attach_to_mem(pst_file *pf, pst_item_attach *attach, unsigned char **b){ 232 int32_t pst_attach_to_mem(pst_file *pf, pst_item_attach *attach, unsigned char **b){
230 int32_t size=0; 233 int32_t size=0;
231 pst_index_ll *ptr; 234 pst_index_ll *ptr;
232 struct holder h = {b, NULL, 0, "", 0}; 235 struct holder h = {b, NULL, 0, "", 0};
233 DEBUG_ENT("pst_attach_to_mem"); 236 DEBUG_ENT("pst_attach_to_mem");
244 } 247 }
245 DEBUG_RET(); 248 DEBUG_RET();
246 return size; 249 return size;
247 } 250 }
248 251
252
249 int32_t pst_attach_to_file(pst_file *pf, pst_item_attach *attach, FILE* fp) { 253 int32_t pst_attach_to_file(pst_file *pf, pst_item_attach *attach, FILE* fp) {
250 pst_index_ll *ptr; 254 pst_index_ll *ptr;
251 struct holder h = {NULL, fp, 0, "", 0}; 255 struct holder h = {NULL, fp, 0, "", 0};
252 int32_t size; 256 int32_t size;
253 DEBUG_ENT("pst_attach_to_file"); 257 DEBUG_ENT("pst_attach_to_file");
265 pst_fwrite(attach->data, 1, size, fp); 269 pst_fwrite(attach->data, 1, size, fp);
266 } 270 }
267 DEBUG_RET(); 271 DEBUG_RET();
268 return 1; 272 return 1;
269 } 273 }
274
270 275
271 int32_t pst_attach_to_file_base64(pst_file *pf, pst_item_attach *attach, FILE* fp) { 276 int32_t pst_attach_to_file_base64(pst_file *pf, pst_item_attach *attach, FILE* fp) {
272 pst_index_ll *ptr; 277 pst_index_ll *ptr;
273 struct holder h = {NULL, fp, 1, "", 0}; 278 struct holder h = {NULL, fp, 1, "", 0};
274 int32_t size; 279 int32_t size;
293 } 298 }
294 DEBUG_RET(); 299 DEBUG_RET();
295 return 1; 300 return 1;
296 } 301 }
297 302
303
298 int32_t pst_load_index (pst_file *pf) { 304 int32_t pst_load_index (pst_file *pf) {
299 int32_t x,y; 305 int32_t x;
306 u_int32_t y;
300 DEBUG_ENT("pst_load_index"); 307 DEBUG_ENT("pst_load_index");
301 if (pf == NULL) { 308 if (pf == NULL) {
302 WARN(("Cannot load index for a NULL pst_file\n")); 309 WARN(("Cannot load index for a NULL pst_file\n"));
303 DEBUG_RET(); 310 DEBUG_RET();
304 return -1; 311 return -1;
305 } 312 }
306 313
307 x = _pst_build_id_ptr(pf, pf->index1, 0, pf->index1_count, -1, INT32_MAX); 314 x = _pst_build_id_ptr(pf, pf->index1, 0, pf->index1_count, -1, INT32_MAX);
308 DEBUG_INDEX(("build id ptr returns %i\n", x)); 315 DEBUG_INDEX(("build id ptr returns %i\n", x));
309 316
310 y = -1; 317 y = 0;
311 x = _pst_build_desc_ptr(pf, pf->index2, 0, pf->index2_count, &y, 0x21, INT32_MAX); 318 x = _pst_build_desc_ptr(pf, pf->index2, 0, pf->index2_count, &y, 0x21, INT32_MAX);
312 DEBUG_INDEX(("build desc ptr returns %i\n", x)); 319 DEBUG_INDEX(("build desc ptr returns %i\n", x));
313 320
314 DEBUG_CODE(_pst_printDptr(pf);); 321 DEBUG_CODE(_pst_printDptr(pf););
315 DEBUG_RET(); 322 DEBUG_RET();
316 return 0; 323 return 0;
317 } 324 }
325
318 326
319 pst_desc_ll* pst_getNextDptr(pst_desc_ll* d) { 327 pst_desc_ll* pst_getNextDptr(pst_desc_ll* d) {
320 pst_desc_ll* r = NULL; 328 pst_desc_ll* r = NULL;
321 DEBUG_ENT("pst_getNextDptr"); 329 DEBUG_ENT("pst_getNextDptr");
322 if (d != NULL) { 330 if (d != NULL) {
326 } 334 }
327 } 335 }
328 DEBUG_RET(); 336 DEBUG_RET();
329 return r; 337 return r;
330 } 338 }
339
331 340
332 typedef struct _pst_x_attrib { 341 typedef struct _pst_x_attrib {
333 u_int16_t extended; 342 u_int16_t extended;
334 u_int16_t zero; 343 u_int16_t zero;
335 u_int16_t type; 344 u_int16_t type;
459 pf->x_head = p_head; 468 pf->x_head = p_head;
460 DEBUG_RET(); 469 DEBUG_RET();
461 return 1; 470 return 1;
462 } 471 }
463 472
473
464 #define BLOCK_SIZE 516 // index blocks 474 #define BLOCK_SIZE 516 // index blocks
465 #define DESC_BLOCK_SIZE 520 // descriptor blocks 475 #define DESC_BLOCK_SIZE 520 // descriptor blocks
466 #define ITEM_COUNT_OFFSET 0x1f0 // count byte 476 #define ITEM_COUNT_OFFSET 0x1f0 // count byte
467 #define LEVEL_INDICATOR_OFFSET 0x1f3 // node or leaf 477 #define LEVEL_INDICATOR_OFFSET 0x1f3 // node or leaf
468 #define BACKLINK_OFFSET 0x1f8 // backlink u1 value 478 #define BACKLINK_OFFSET 0x1f8 // backlink u1 value
469 #define ITEM_SIZE 12 479 #define ITEM_SIZE 12
480 #define DESC_SIZE 16
470 #define INDEX_COUNT_MAX 41 // max active items 481 #define INDEX_COUNT_MAX 41 // max active items
471 #define DESC_COUNT_MAX 31 // max active items 482 #define DESC_COUNT_MAX 31 // max active items
472 483
473 int32_t _pst_build_id_ptr(pst_file *pf, int32_t offset, int32_t depth, int32_t linku1, int32_t start_val, int32_t end_val) { 484 int32_t _pst_build_id_ptr(pst_file *pf, int32_t offset, int32_t depth, int32_t linku1, int32_t start_val, int32_t end_val) {
474 struct _pst_table_ptr_struct table, table2; 485 struct _pst_table_ptr_struct table, table2;
592 DEBUG_RET(); 603 DEBUG_RET();
593 return 0; 604 return 0;
594 } 605 }
595 606
596 607
597 608 int32_t _pst_build_desc_ptr (pst_file *pf, int32_t offset, int32_t depth, int32_t linku1, u_int32_t *high_id, int32_t start_val, int32_t end_val) {
598 int32_t _pst_build_desc_ptr (pst_file *pf, int32_t offset, int32_t depth, int32_t linku1, int32_t *high_id, int32_t start_val, int32_t end_val) {
599 struct _pst_table_ptr_struct table, table2; 609 struct _pst_table_ptr_struct table, table2;
600 pst_desc desc_rec; 610 pst_desc desc_rec;
601 pst_desc_ll *d_ptr=NULL, *d_par=NULL; 611 pst_desc_ll *d_ptr=NULL, *d_par=NULL;
602 int32_t d_ptr_count = 0; 612 int32_t d_ptr_count = 0;
603 int32_t x, item_count; 613 int32_t x, item_count;
627 DEBUG_RET(); 637 DEBUG_RET();
628 return -1; 638 return -1;
629 } 639 }
630 bptr = buf; 640 bptr = buf;
631 item_count = (int)(unsigned)(buf[ITEM_COUNT_OFFSET]); 641 item_count = (int)(unsigned)(buf[ITEM_COUNT_OFFSET]);
632 if (item_count > DESC_COUNT_MAX) {
633 DEBUG_WARN(("Item count %i too large, max is %i\n", item_count, DESC_COUNT_MAX));
634 if (buf) free(buf);
635 DEBUG_RET();
636 return -1;
637 }
638 memcpy(&desc_rec, buf+BACKLINK_OFFSET, sizeof(desc_rec)); 642 memcpy(&desc_rec, buf+BACKLINK_OFFSET, sizeof(desc_rec));
639 LE32_CPU(desc_rec.d_id); 643 LE32_CPU(desc_rec.d_id);
640 if (desc_rec.d_id != linku1) { 644 if (desc_rec.d_id != linku1) {
641 DEBUG_WARN(("Backlink %#x in this node does not match required %#x\n", desc_rec.d_id, linku1)); 645 DEBUG_WARN(("Backlink %#x in this node does not match required %#x\n", desc_rec.d_id, linku1));
642 if (buf) free(buf); 646 if (buf) free(buf);
644 return -1; 648 return -1;
645 } 649 }
646 if (buf[LEVEL_INDICATOR_OFFSET] == '\0') { 650 if (buf[LEVEL_INDICATOR_OFFSET] == '\0') {
647 // this node contains leaf pointers 651 // this node contains leaf pointers
648 DEBUG_HEXDUMPC(buf, DESC_BLOCK_SIZE, 16); 652 DEBUG_HEXDUMPC(buf, DESC_BLOCK_SIZE, 16);
653 if (item_count > DESC_COUNT_MAX) {
654 DEBUG_WARN(("Item count %i too large, max is %i\n", item_count, DESC_COUNT_MAX));
655 if (buf) free(buf);
656 DEBUG_RET();
657 return -1;
658 }
649 x = 0; 659 x = 0;
650 while (x < item_count) { 660 while (x < item_count) {
651 memcpy(&desc_rec, bptr, sizeof(desc_rec)); 661 memcpy(&desc_rec, bptr, sizeof(desc_rec));
652 LE32_CPU(desc_rec.d_id); 662 LE32_CPU(desc_rec.d_id);
653 LE32_CPU(desc_rec.desc_id); 663 LE32_CPU(desc_rec.desc_id);
753 //add the d_par to the cache 763 //add the d_par to the cache
754 DEBUG_INDEX(("Update - Cache addition\n")); 764 DEBUG_INDEX(("Update - Cache addition\n"));
755 d_ptr_ptr = (struct _pst_d_ptr_ll*) xmalloc(sizeof(struct _pst_d_ptr_ll)); 765 d_ptr_ptr = (struct _pst_d_ptr_ll*) xmalloc(sizeof(struct _pst_d_ptr_ll));
756 d_ptr_ptr->prev = NULL; 766 d_ptr_ptr->prev = NULL;
757 d_ptr_ptr->next = d_ptr_head; 767 d_ptr_ptr->next = d_ptr_head;
758 d_ptr_ptr->ptr = d_par; 768 d_ptr_ptr->ptr = d_par;
759 d_ptr_head = d_ptr_ptr; 769 d_ptr_head = d_ptr_ptr;
760 if (d_ptr_tail == NULL) 770 if (d_ptr_tail == NULL) d_ptr_tail = d_ptr_ptr;
761 d_ptr_tail = d_ptr_ptr;
762 d_ptr_count++; 771 d_ptr_count++;
763 if (d_ptr_count > 100) { 772 if (d_ptr_count > 100) {
764 //remove on from the end 773 //remove on from the end
765 d_ptr_ptr = d_ptr_tail; 774 d_ptr_ptr = d_ptr_tail;
766 d_ptr_tail = d_ptr_ptr->prev; 775 d_ptr_tail = d_ptr_ptr->prev;
767 free (d_ptr_ptr); 776 free (d_ptr_ptr);
768 d_ptr_count--; 777 d_ptr_count--;
769 } 778 }
770 } 779 }
771 DEBUG_INDEX(("Found a parent\n")); 780 DEBUG_INDEX(("Found a parent\n"));
772 d_par->no_child++; 781 d_par->no_child++;
773 d_ptr->parent = d_par; 782 d_ptr->parent = d_par;
783 DEBUG_INDEX(("Updating New High\n")); 792 DEBUG_INDEX(("Updating New High\n"));
784 *high_id = desc_rec.d_id; 793 *high_id = desc_rec.d_id;
785 } 794 }
786 DEBUG_INDEX(("New Record\n")); 795 DEBUG_INDEX(("New Record\n"));
787 d_ptr = (pst_desc_ll*) xmalloc(sizeof(pst_desc_ll)); 796 d_ptr = (pst_desc_ll*) xmalloc(sizeof(pst_desc_ll));
788 // DEBUG_INDEX(("Item pointer is %p\n", d_ptr));
789 d_ptr->id = desc_rec.d_id; 797 d_ptr->id = desc_rec.d_id;
790 d_ptr->list_index = _pst_getID(pf, desc_rec.list_id); 798 d_ptr->list_index = _pst_getID(pf, desc_rec.list_id);
791 d_ptr->desc = _pst_getID(pf, desc_rec.desc_id); 799 d_ptr->desc = _pst_getID(pf, desc_rec.desc_id);
792 d_ptr->prev = NULL; 800 d_ptr->prev = NULL;
793 d_ptr->next = NULL; 801 d_ptr->next = NULL;
804 DEBUG_INDEX(("Record is its own parent. What is this world coming to?\n")); 812 DEBUG_INDEX(("Record is its own parent. What is this world coming to?\n"));
805 } 813 }
806 if (pf->d_tail != NULL) pf->d_tail->next = d_ptr; 814 if (pf->d_tail != NULL) pf->d_tail->next = d_ptr;
807 if (pf->d_head == NULL) pf->d_head = d_ptr; 815 if (pf->d_head == NULL) pf->d_head = d_ptr;
808 d_ptr->prev = pf->d_tail; 816 d_ptr->prev = pf->d_tail;
809 pf->d_tail = d_ptr; 817 pf->d_tail = d_ptr;
810 } else { 818 } else {
811 d_ptr_ptr = d_ptr_head; 819 d_ptr_ptr = d_ptr_head;
812 while (d_ptr_ptr != NULL && d_ptr_ptr->ptr->id != desc_rec.parent_id) { 820 while (d_ptr_ptr != NULL && d_ptr_ptr->ptr->id != desc_rec.parent_id) {
813 d_ptr_ptr = d_ptr_ptr->next; 821 d_ptr_ptr = d_ptr_ptr->next;
814 } 822 }
839 //add the d_par to the cache 847 //add the d_par to the cache
840 DEBUG_INDEX(("Normal - Cache addition\n")); 848 DEBUG_INDEX(("Normal - Cache addition\n"));
841 d_ptr_ptr = (struct _pst_d_ptr_ll*) xmalloc(sizeof(struct _pst_d_ptr_ll)); 849 d_ptr_ptr = (struct _pst_d_ptr_ll*) xmalloc(sizeof(struct _pst_d_ptr_ll));
842 d_ptr_ptr->prev = NULL; 850 d_ptr_ptr->prev = NULL;
843 d_ptr_ptr->next = d_ptr_head; 851 d_ptr_ptr->next = d_ptr_head;
844 d_ptr_ptr->ptr = d_par; 852 d_ptr_ptr->ptr = d_par;
845 d_ptr_head = d_ptr_ptr; 853 d_ptr_head = d_ptr_ptr;
846 if (d_ptr_tail == NULL) d_ptr_tail = d_ptr_ptr; 854 if (d_ptr_tail == NULL) d_ptr_tail = d_ptr_ptr;
847 d_ptr_count++; 855 d_ptr_count++;
848 if (d_ptr_count > 100) { 856 if (d_ptr_count > 100) {
849 //remove one from the end 857 //remove one from the end
850 d_ptr_ptr = d_ptr_tail; 858 d_ptr_ptr = d_ptr_tail;
851 d_ptr_tail = d_ptr_ptr->prev; 859 d_ptr_tail = d_ptr_ptr->prev;
852 free (d_ptr_ptr); 860 free (d_ptr_ptr);
853 d_ptr_count--; 861 d_ptr_count--;
854 } 862 }
855 } 863 }
856 864
857 DEBUG_INDEX(("Found a parent\n")); 865 DEBUG_INDEX(("Found a parent\n"));
858 d_par->no_child++; 866 d_par->no_child++;
859 d_ptr->parent = d_par; 867 d_ptr->parent = d_par;
860 if (d_par->child_tail != NULL) 868 if (d_par->child_tail != NULL) d_par->child_tail->next = d_ptr;
861 d_par->child_tail->next = d_ptr; 869 if (d_par->child == NULL) d_par->child = d_ptr;
862 if (d_par->child == NULL)
863 d_par->child = d_ptr;
864 d_ptr->prev = d_par->child_tail; 870 d_ptr->prev = d_par->child_tail;
865 d_par->child_tail = d_ptr; 871 d_par->child_tail = d_ptr;
866 } 872 }
867 } 873 }
868 } 874 }
893 } 899 }
894 } 900 }
895 } 901 }
896 } else { 902 } else {
897 // this node contains node pointers 903 // this node contains node pointers
898 DEBUG_HEXDUMPC(buf, DESC_BLOCK_SIZE, 12); 904 DEBUG_HEXDUMPC(buf, DESC_BLOCK_SIZE, ITEM_SIZE);
905 if (item_count > INDEX_COUNT_MAX) {
906 DEBUG_WARN(("Item count %i too large, max is %i\n", item_count, INDEX_COUNT_MAX));
907 if (buf) free(buf);
908 DEBUG_RET();
909 return -1;
910 }
899 x = 0; 911 x = 0;
900 while (x < item_count) { 912 while (x < item_count) {
901 memcpy(&table, bptr, sizeof(table)); 913 memcpy(&table, bptr, sizeof(table));
902 LE32_CPU(table.start); 914 LE32_CPU(table.start);
903 LE32_CPU(table.u1); 915 LE32_CPU(table.u1);
936 while (d_ptr_head != NULL) { 948 while (d_ptr_head != NULL) {
937 d_ptr_ptr = d_ptr_head->next; 949 d_ptr_ptr = d_ptr_head->next;
938 free(d_ptr_head); 950 free(d_ptr_head);
939 d_ptr_head = d_ptr_ptr; 951 d_ptr_head = d_ptr_ptr;
940 } 952 }
953 // TODO - need to free lost and found list also!!
954 // TODO - and show error for any remaining lf items
941 if (buf) free(buf); 955 if (buf) free(buf);
942 DEBUG_RET(); 956 DEBUG_RET();
943 return 0; 957 return 0;
944 } 958 }
945 959
1062 _pst_free_id2(id2_head); 1076 _pst_free_id2(id2_head);
1063 DEBUG_RET(); 1077 DEBUG_RET();
1064 return item; 1078 return item;
1065 } 1079 }
1066 1080
1081
1067 pst_num_array * _pst_parse_block(pst_file *pf, u_int32_t block_id, pst_index2_ll *i2_head) { 1082 pst_num_array * _pst_parse_block(pst_file *pf, u_int32_t block_id, pst_index2_ll *i2_head) {
1068 unsigned char *buf = NULL; 1083 unsigned char *buf = NULL;
1069 pst_num_array *na_ptr = NULL, *na_head = NULL; 1084 pst_num_array *na_ptr = NULL, *na_head = NULL;
1070 pst_block_offset block_offset; 1085 pst_block_offset block_offset;
1071 // pst_index_ll *rec = NULL; 1086 // pst_index_ll *rec = NULL;
1072 u_int32_t size = 0, t_ptr = 0, fr_ptr = 0, to_ptr = 0, ind_ptr = 0, x = 0, stop = 0; 1087 u_int32_t size = 0, t_ptr = 0, fr_ptr = 0, to_ptr = 0, ind_ptr = 0, x = 0;
1073 u_int32_t num_recs = 0, count_rec = 0, ind2_ptr = 0, list_start = 0, num_list = 0, cur_list = 0; 1088 u_int32_t num_recs = 0, count_rec = 0, ind2_ptr = 0, list_start = 0, num_list = 0, cur_list = 0;
1074 int32_t block_type, rec_size; 1089 int32_t block_type, rec_size;
1075 size_t read_size=0; 1090 size_t read_size=0;
1076 pst_x_attrib_ll *mapptr; 1091 pst_x_attrib_ll *mapptr;
1077 1092
1109 u_int32_t id; 1124 u_int32_t id;
1110 u_int32_t u1; 1125 u_int32_t u1;
1111 } * type_d_rec; 1126 } * type_d_rec;
1112 1127
1113 DEBUG_ENT("_pst_parse_block"); 1128 DEBUG_ENT("_pst_parse_block");
1114 /* if (block == NULL) {
1115 DEBUG_EMAIL(("block == NULL. Cannot continue with this block\n"));
1116 DEBUG_RET();
1117 return NULL;
1118 }*/
1119
1120 // DEBUG_EMAIL(("About to read %i bytes from offset %#x\n", block->size, block->offset));
1121
1122 if ((read_size = _pst_ff_getIDblock_dec(pf, block_id, &buf)) == 0) { 1129 if ((read_size = _pst_ff_getIDblock_dec(pf, block_id, &buf)) == 0) {
1123 // if (_pst_read_block_size(pf, block->offset, block->size, &buf, PST_ENC, 0) < block->size) {
1124 WARN(("Error reading block id %#x\n", block_id)); 1130 WARN(("Error reading block id %#x\n", block_id));
1125 if (buf) free (buf); 1131 if (buf) free (buf);
1126 DEBUG_RET(); 1132 DEBUG_RET();
1127 return NULL; 1133 return NULL;
1128 } 1134 }
1129 DEBUG_EMAIL(("pointer to buf is %p\n", buf));
1130 1135
1131 memcpy(&block_hdr, buf, sizeof(block_hdr)); 1136 memcpy(&block_hdr, buf, sizeof(block_hdr));
1132 LE16_CPU(block_hdr.index_offset); 1137 LE16_CPU(block_hdr.index_offset);
1133 LE16_CPU(block_hdr.type); 1138 LE16_CPU(block_hdr.type);
1134 LE16_CPU(block_hdr.offset); 1139 LE16_CPU(block_hdr.offset);
1232 1237
1233 DEBUG_EMAIL(("Mallocing number of items %i\n", num_recs)); 1238 DEBUG_EMAIL(("Mallocing number of items %i\n", num_recs));
1234 while (count_rec < num_recs) { 1239 while (count_rec < num_recs) {
1235 na_ptr = (pst_num_array*) xmalloc(sizeof(pst_num_array)); 1240 na_ptr = (pst_num_array*) xmalloc(sizeof(pst_num_array));
1236 memset(na_ptr, 0, sizeof(pst_num_array)); 1241 memset(na_ptr, 0, sizeof(pst_num_array));
1237 if (na_head == NULL) { 1242 na_ptr->next = na_head;
1238 na_head = na_ptr; 1243 na_head = na_ptr;
1239 na_ptr->next = NULL;
1240 }
1241 else {
1242 na_ptr->next = na_head;
1243 na_head = na_ptr;
1244 }
1245 // allocate an array of count num_recs to contain sizeof(struct_pst_num_item) 1244 // allocate an array of count num_recs to contain sizeof(struct_pst_num_item)
1246 na_ptr->items = (struct _pst_num_item**) xmalloc(sizeof(struct _pst_num_item)*num_list); 1245 na_ptr->items = (struct _pst_num_item**) xmalloc(sizeof(struct _pst_num_item)*num_list);
1247 na_ptr->count_item = num_list; 1246 na_ptr->count_item = num_list;
1248 na_ptr->count_array = num_recs; // each record will have a record of the total number of records 1247 na_ptr->count_array = num_recs; // each record will have a record of the total number of records
1249 x = 0; 1248 x = 0;
1250 1249
1251 DEBUG_EMAIL(("going to read %i (%#x) items\n", na_ptr->count_item, na_ptr->count_item)); 1250 DEBUG_EMAIL(("going to read %i (%#x) items\n", na_ptr->count_item, na_ptr->count_item));
1252 1251
1253 fr_ptr = list_start; // init fr_ptr to the start of the list. 1252 fr_ptr = list_start; // init fr_ptr to the start of the list.
1254 cur_list = 0; 1253 cur_list = 0;
1255 stop = 0; 1254 while (cur_list < num_list) { //we will increase fr_ptr as we progress through index
1256 while (!stop && cur_list < num_list) { //we will increase fr_ptr as we progress through index
1257 if (block_type == 1) { 1255 if (block_type == 1) {
1258 memcpy(&table_rec, &(buf[fr_ptr]), sizeof(table_rec)); 1256 memcpy(&table_rec, &(buf[fr_ptr]), sizeof(table_rec));
1259 LE16_CPU(table_rec.type); 1257 LE16_CPU(table_rec.type);
1260 LE16_CPU(table_rec.ref_type); 1258 LE16_CPU(table_rec.ref_type);
1261 fr_ptr += sizeof(table_rec); 1259 fr_ptr += sizeof(table_rec);
1266 LE16_CPU(table2_rec.type); 1264 LE16_CPU(table2_rec.type);
1267 LE16_CPU(table2_rec.ind2_off); 1265 LE16_CPU(table2_rec.ind2_off);
1268 LE16_CPU(table2_rec.u1); 1266 LE16_CPU(table2_rec.u1);
1269 1267
1270 // table_rec and table2_rec are arranged differently, so assign the values across 1268 // table_rec and table2_rec are arranged differently, so assign the values across
1271 table_rec.type = table2_rec.type; 1269 table_rec.type = table2_rec.type;
1272 table_rec.ref_type = table2_rec.ref_type; 1270 table_rec.ref_type = table2_rec.ref_type;
1273 if ((ind2_ptr+table2_rec.ind2_off > 0) && 1271 if ((ind2_ptr+table2_rec.ind2_off > 0) &&
1274 (ind2_ptr+table2_rec.ind2_off < read_size-sizeof(table_rec.value))) 1272 (ind2_ptr+table2_rec.ind2_off < read_size-sizeof(table_rec.value)))
1275 memcpy(&(table_rec.value), &(buf[ind2_ptr+table2_rec.ind2_off]), sizeof(table_rec.value)); 1273 memcpy(&(table_rec.value), &(buf[ind2_ptr+table2_rec.ind2_off]), sizeof(table_rec.value));
1276 else { 1274 else {
1289 cur_list++; // get ready to read next bit from list 1287 cur_list++; // get ready to read next bit from list
1290 DEBUG_EMAIL(("reading block %i (type=%#x, ref_type=%#x, value=%#x)\n", 1288 DEBUG_EMAIL(("reading block %i (type=%#x, ref_type=%#x, value=%#x)\n",
1291 x, table_rec.type, table_rec.ref_type, table_rec.value)); 1289 x, table_rec.type, table_rec.ref_type, table_rec.value));
1292 1290
1293 na_ptr->items[x] = (struct _pst_num_item*) xmalloc(sizeof(struct _pst_num_item)); 1291 na_ptr->items[x] = (struct _pst_num_item*) xmalloc(sizeof(struct _pst_num_item));
1294 // DEBUG_EMAIL(("_pst_parse_block: record address = %p\n", na_ptr->items[x]));
1295 memset(na_ptr->items[x], 0, sizeof(struct _pst_num_item)); //init it 1292 memset(na_ptr->items[x], 0, sizeof(struct _pst_num_item)); //init it
1296 1293
1297 // check here to see if the id of the attribute is a mapped one 1294 // check here to see if the id of the attribute is a mapped one
1298 mapptr = pf->x_head; 1295 mapptr = pf->x_head;
1299 while (mapptr != NULL && mapptr->map < table_rec.type) mapptr = mapptr->next; 1296 while (mapptr != NULL && mapptr->map < table_rec.type) mapptr = mapptr->next;
1358 DEBUG_WARN(("not able to read the ID2 data. Setting to be read later. %#x\n", table_rec.value)); 1355 DEBUG_WARN(("not able to read the ID2 data. Setting to be read later. %#x\n", table_rec.value));
1359 na_ptr->items[x]->size = 0; 1356 na_ptr->items[x]->size = 0;
1360 na_ptr->items[x]->data = NULL; 1357 na_ptr->items[x]->data = NULL;
1361 na_ptr->items[x]->type = table_rec.value; 1358 na_ptr->items[x]->type = table_rec.value;
1362 } 1359 }
1363 DEBUG_EMAIL(("Read %i bytes to a buffer at %p\n", na_ptr->items[x]->size, na_ptr->items[x]->data));
1364 } else if (table_rec.value != 0) { 1360 } else if (table_rec.value != 0) {
1365 if ((table_rec.value >> 4)+ind_ptr > read_size) { 1361 if ((table_rec.value >> 4)+ind_ptr > read_size) {
1366 // check that we will not be outside the buffer we have read 1362 // check that we will not be outside the buffer we have read
1367 DEBUG_WARN(("table_rec.value [%#x] is outside of block [%#x]\n", table_rec.value, read_size)); 1363 DEBUG_WARN(("table_rec.value [%#x] is outside of block [%#x]\n", table_rec.value, read_size));
1368 na_ptr->count_item --; 1364 na_ptr->count_item --;
1396 type_d_rec->id)); 1392 type_d_rec->id));
1397 na_ptr->items[x]->size = 0; 1393 na_ptr->items[x]->size = 0;
1398 na_ptr->items[x]->data = NULL; 1394 na_ptr->items[x]->data = NULL;
1399 na_ptr->items[x]->type = type_d_rec->id; 1395 na_ptr->items[x]->type = type_d_rec->id;
1400 } 1396 }
1401 DEBUG_EMAIL(("Read %i bytes into a buffer at %p\n", na_ptr->items[x]->size, na_ptr->items[x]->data));
1402 } 1397 }
1403 } else { 1398 } else {
1404 DEBUG_EMAIL(("Ignoring 0 value in offset\n")); 1399 DEBUG_EMAIL(("Ignoring 0 value in offset\n"));
1405 if (na_ptr->items[x]->data) 1400 if (na_ptr->items[x]->data)
1406 free (na_ptr->items[x]->data); 1401 free (na_ptr->items[x]->data);
1420 DEBUG_RET(); 1415 DEBUG_RET();
1421 return NULL; 1416 return NULL;
1422 } 1417 }
1423 x++; 1418 x++;
1424 } 1419 }
1425 DEBUG_EMAIL(("increasing ind2_ptr by %i [%#x] bytes. Was %#x, Now %#x\n", 1420 DEBUG_EMAIL(("increasing ind2_ptr by %i [%#x] bytes. Was %#x, Now %#x\n", rec_size, rec_size, ind2_ptr, ind2_ptr+rec_size));
1426 rec_size, rec_size, ind2_ptr,
1427 ind2_ptr+rec_size));
1428 ind2_ptr += rec_size; 1421 ind2_ptr += rec_size;
1429 count_rec++; 1422 count_rec++;
1430 } 1423 }
1431 if (buf != NULL) free(buf); 1424 if (buf != NULL) free(buf);
1432 DEBUG_RET(); 1425 DEBUG_RET();
1441 #define MALLOC_MESSAGESTORE(x) { if (x->message_store == NULL) { x->message_store = (pst_item_message_store*) xmalloc(sizeof(pst_item_message_store)); memset(x->message_store, 0, sizeof(pst_item_message_store)); } } 1434 #define MALLOC_MESSAGESTORE(x) { if (x->message_store == NULL) { x->message_store = (pst_item_message_store*) xmalloc(sizeof(pst_item_message_store)); memset(x->message_store, 0, sizeof(pst_item_message_store)); } }
1442 #define MALLOC_JOURNAL(x) { if (x->journal == NULL) { x->journal = (pst_item_journal*) xmalloc(sizeof(pst_item_journal)); memset(x->journal, 0, sizeof(pst_item_journal));} } 1435 #define MALLOC_JOURNAL(x) { if (x->journal == NULL) { x->journal = (pst_item_journal*) xmalloc(sizeof(pst_item_journal)); memset(x->journal, 0, sizeof(pst_item_journal));} }
1443 #define MALLOC_APPOINTMENT(x) { if (x->appointment == NULL) { x->appointment = (pst_item_appointment*) xmalloc(sizeof(pst_item_appointment)); memset(x->appointment, 0, sizeof(pst_item_appointment)); } } 1436 #define MALLOC_APPOINTMENT(x) { if (x->appointment == NULL) { x->appointment = (pst_item_appointment*) xmalloc(sizeof(pst_item_appointment)); memset(x->appointment, 0, sizeof(pst_item_appointment)); } }
1444 // malloc space and copy the current item's data -- plus one on the size for good luck (and string termination) 1437 // malloc space and copy the current item's data -- plus one on the size for good luck (and string termination)
1445 #define LIST_COPY(targ, type) { \ 1438 #define LIST_COPY(targ, type) { \
1446 targ = type realloc(targ, list->items[x]->size+1); \ 1439 targ = type realloc(targ, list->items[x]->size+1); \
1447 memset(targ, 0, list->items[x]->size+1); \ 1440 memset(targ, 0, list->items[x]->size+1); \
1448 memcpy(targ, list->items[x]->data, list->items[x]->size); \ 1441 memcpy(targ, list->items[x]->data, list->items[x]->size); \
1449 } 1442 }
1443
1450 1444
1451 /* free(list->items[x]->data); \ 1445 /* free(list->items[x]->data); \
1452 list->items[x]->data=NULL; \*/ 1446 list->items[x]->data=NULL; \*/
1453 1447
1454 //#define INC_CHECK_X() { if (++x >= list->count_item) break; } 1448 //#define INC_CHECK_X() { if (++x >= list->count_item) break; }
1455 #define NULL_CHECK(x) { if (x == NULL) { DEBUG_EMAIL(("NULL_CHECK: Null Found\n")); break;} } 1449 #define NULL_CHECK(x) { if (x == NULL) { DEBUG_EMAIL(("NULL_CHECK: Null Found\n")); break;} }
1456 1450
1457 #define MOVE_NEXT(targ) { \ 1451 #define MOVE_NEXT(targ) { \
1458 if (next){\ 1452 if (next){\
1459 if ((char*)targ == NULL) {\ 1453 if ((char*)targ == NULL) {\
1460 DEBUG_EMAIL(("MOVE_NEXT: Target is NULL. Will stop processing this option\n"));\ 1454 DEBUG_EMAIL(("MOVE_NEXT: Target is NULL. Will stop processing this option\n"));\
1461 break;\ 1455 break;\
1456 }\
1457 targ = targ->next;\
1458 if ((char*)targ == NULL) {\
1459 DEBUG_EMAIL(("MOVE_NEXT: Target is NULL after next. Will stop processing this option\n"));\
1460 break;\
1461 }\
1462 next=0;\
1462 }\ 1463 }\
1463 targ = targ->next;\ 1464 }
1464 if ((char*)targ == NULL) {\ 1465
1465 DEBUG_EMAIL(("MOVE_NEXT: Target is NULL after next. Will stop processing this option\n"));\
1466 break;\
1467 }\
1468 next=0;\
1469 }\
1470 }
1471 1466
1472 int32_t _pst_process(pst_num_array *list , pst_item *item) { 1467 int32_t _pst_process(pst_num_array *list , pst_item *item) {
1473 int32_t x, t; 1468 int32_t x, t;
1474 int32_t next = 0; 1469 int32_t next = 0;
1475 pst_item_attach *attach; 1470 pst_item_attach *attach;
1476 pst_item_extra_field *ef; 1471 pst_item_extra_field *ef;
1477 1472
1478 DEBUG_ENT("_pst_process"); 1473 DEBUG_ENT("_pst_process");
1479 if (item == NULL) { 1474 if (item == NULL) {
1480 DEBUG_EMAIL(("item cannot be NULL.\n")); 1475 DEBUG_EMAIL(("item cannot be NULL.\n"));
1476 DEBUG_RET();
1477 return -1;
1478 }
1479
1480 attach = item->current_attach; // a working variable
1481
1482 while (list != NULL) {
1483 x = 0;
1484 while (x < list->count_item) {
1485 // check here to see if the id is one that is mapped.
1486 DEBUG_EMAIL(("#%d - id: %#x type: %#x length: %#x\n", x, list->items[x]->id, list->items[x]->type, list->items[x]->size));
1487
1488 switch (list->items[x]->id) {
1489 case PST_ATTRIB_HEADER: // CUSTOM attribute for saying the Extra Headers
1490 DEBUG_EMAIL(("Extra Field - "));
1491 ef = (pst_item_extra_field*) xmalloc(sizeof(pst_item_extra_field));
1492 memset(ef, 0, sizeof(pst_item_extra_field));
1493 ef->field_name = (char*) xmalloc(strlen(list->items[x]->extra)+1);
1494 strcpy(ef->field_name, list->items[x]->extra);
1495 LIST_COPY(ef->value, (char*));
1496 ef->next = item->extra_fields;
1497 item->extra_fields = ef;
1498 DEBUG_EMAIL(("\"%s\" = \"%s\"\n", ef->field_name, ef->value));
1499 break;
1500 case 0x0002: // PR_ALTERNATE_RECIPIENT_ALLOWED
1501 // If set to true, the sender allows this email to be autoforwarded
1502 DEBUG_EMAIL(("AutoForward allowed - "));
1503 MALLOC_EMAIL(item);
1504 if (*((short int*)list->items[x]->data) != 0) {
1505 DEBUG_EMAIL(("True\n"));
1506 item->email->autoforward = 1;
1507 } else {
1508 DEBUG_EMAIL(("False\n"));
1509 item->email->autoforward = -1;
1510 }
1511 // INC_CHECK_X();
1512 break;
1513 case 0x0003: // Extended Attributes table
1514 DEBUG_EMAIL(("Extended Attributes Table - NOT PROCESSED\n"));
1515 break;
1516 case 0x0017: // PR_IMPORTANCE
1517 // How important the sender deems it to be
1518 // 0 - Low
1519 // 1 - Normal
1520 // 2 - High
1521
1522 DEBUG_EMAIL(("Importance Level - "));
1523 MALLOC_EMAIL(item);
1524 memcpy(&(item->email->importance), list->items[x]->data, sizeof(item->email->importance));
1525 LE32_CPU(item->email->importance);
1526 t = item->email->importance;
1527 DEBUG_EMAIL(("%s [%i]\n", (t==0?"Low":(t==1?"Normal":"High")), t));
1528 // INC_CHECK_X();
1529 break;
1530 case 0x001A: // PR_MESSAGE_CLASS Ascii type of messages - NOT FOLDERS
1531 // must be case insensitive
1532 DEBUG_EMAIL(("IPM.x - "));
1533 LIST_COPY(item->ascii_type, (char*));
1534 if (pst_strincmp("IPM.Note", item->ascii_type, 8) == 0)
1535 // the string begins with IPM.Note...
1536 item->type = PST_TYPE_NOTE;
1537 else if (pst_stricmp("IPM", item->ascii_type) == 0)
1538 // the whole string is just IPM
1539 item->type = PST_TYPE_NOTE;
1540 else if (pst_strincmp("IPM.Contact", item->ascii_type, 11) == 0)
1541 // the string begins with IPM.Contact...
1542 item->type = PST_TYPE_CONTACT;
1543 else if (pst_strincmp("REPORT.IPM.Note", item->ascii_type, 15) == 0)
1544 // the string begins with the above
1545 item->type = PST_TYPE_REPORT;
1546 else if (pst_strincmp("IPM.Activity", item->ascii_type, 12) == 0)
1547 item->type = PST_TYPE_JOURNAL;
1548 else if (pst_strincmp("IPM.Appointment", item->ascii_type, 15) == 0)
1549 item->type = PST_TYPE_APPOINTMENT;
1550 else
1551 item->type = PST_TYPE_OTHER;
1552
1553 DEBUG_EMAIL(("%s\n", item->ascii_type));
1554 // INC_CHECK_X(); //increment x here so that the next if statement has a chance of matching the next item
1555 break;
1556 case 0x0023: // PR_ORIGINATOR_DELIVERY_REPORT_REQUESTED
1557 // set if the sender wants a delivery report from all recipients
1558 DEBUG_EMAIL(("Global Delivery Report - "));
1559 MALLOC_EMAIL(item);
1560 if (*(int16_t*)list->items[x]->data != 0) {
1561 DEBUG_EMAIL(("True\n"));
1562 item->email->delivery_report = 1;
1563 } else {
1564 DEBUG_EMAIL(("False\n"));
1565 item->email->delivery_report = 0;
1566 }
1567 // INC_CHECK_X();
1568 break;
1569 case 0x0026: // PR_PRIORITY
1570 // Priority of a message
1571 // -1 NonUrgent
1572 // 0 Normal
1573 // 1 Urgent
1574 DEBUG_EMAIL(("Priority - "));
1575 MALLOC_EMAIL(item);
1576 memcpy(&(item->email->priority), list->items[x]->data, sizeof(item->email->priority));
1577 LE32_CPU(item->email->priority);
1578 t = item->email->priority;
1579 DEBUG_EMAIL(("%s [%i]\n", (t<0?"NonUrgent":(t==0?"Normal":"Urgent")), t));
1580 // INC_CHECK_X();
1581 break;
1582 case 0x0029:// PR_READ_RECEIPT_REQUESTED
1583 DEBUG_EMAIL(("Read Receipt - "));
1584 MALLOC_EMAIL(item);
1585 if (*(short int*)list->items[x]->data != 0) {
1586 DEBUG_EMAIL(("True\n"));
1587 item->email->read_receipt = 1;
1588 } else {
1589 DEBUG_EMAIL(("False\n"));
1590 item->email->read_receipt = 0;
1591 }
1592 // INC_CHECK_X();
1593 break;
1594 case 0x002B: // PR_RECIPIENT_REASSIGNMENT_PROHIBITED
1595 DEBUG_EMAIL(("Reassignment Prohibited (Private) - "));
1596 if (*(short int*)list->items[x]->data != 0) {
1597 DEBUG_EMAIL(("True\n"));
1598 item->private_member = 1;
1599 } else {
1600 DEBUG_EMAIL(("False\n"));
1601 item->private_member = 0;
1602 }
1603 break;
1604 case 0x002E: // PR_ORIGINAL_SENSITIVITY
1605 // the sensitivity of the message before being replied to or forwarded
1606 // 0 - None
1607 // 1 - Personal
1608 // 2 - Private
1609 // 3 - Company Confidential
1610 DEBUG_EMAIL(("Original Sensitivity - "));
1611 MALLOC_EMAIL(item);
1612 memcpy(&(item->email->orig_sensitivity), list->items[x]->data, sizeof(item->email->orig_sensitivity));
1613 LE32_CPU(item->email->orig_sensitivity);
1614 t = item->email->orig_sensitivity;
1615 DEBUG_EMAIL(("%s [%i]\n", (t==0?"None":(t==1?"Personal":
1616 (t==2?"Private":"Company Confidential"))), t));
1617 // INC_CHECK_X();
1618 break;
1619 case 0x0036: // PR_SENSITIVITY
1620 // sender's opinion of the sensitivity of an email
1621 // 0 - None
1622 // 1 - Personal
1623 // 2 - Private
1624 // 3 - Company Confidiential
1625 DEBUG_EMAIL(("Sensitivity - "));
1626 MALLOC_EMAIL(item);
1627 memcpy(&(item->email->sensitivity), list->items[x]->data, sizeof(item->email->sensitivity));
1628 LE32_CPU(item->email->sensitivity);
1629 t = item->email->sensitivity;
1630 DEBUG_EMAIL(("%s [%i]\n", (t==0?"None":(t==1?"Personal":
1631 (t==2?"Private":"Company Confidential"))), t));
1632 // INC_CHECK_X();
1633 break;
1634 case 0x0037: // PR_SUBJECT raw subject
1635 // if (list->items[x]->id == 0x0037) {
1636 DEBUG_EMAIL(("Raw Subject - "));
1637 MALLOC_EMAIL(item);
1638 item->email->subject = (pst_item_email_subject*) realloc(item->email->subject, sizeof(pst_item_email_subject));
1639 memset(item->email->subject, 0, sizeof(pst_item_email_subject));
1640 DEBUG_EMAIL((" [size = %i] ", list->items[x]->size));
1641 if (list->items[x]->size > 0) {
1642 if (isprint(list->items[x]->data[0])) {
1643 // then there are no control bytes at the front
1644 item->email->subject->off1 = 0;
1645 item->email->subject->off2 = 0;
1646 item->email->subject->subj = realloc(item->email->subject->subj, list->items[x]->size+1);
1647 memset(item->email->subject->subj, 0, list->items[x]->size+1);
1648 memcpy(item->email->subject->subj, list->items[x]->data, list->items[x]->size);
1649 } else {
1650 DEBUG_EMAIL(("Raw Subject has control codes\n"));
1651 // there might be some control bytes in the first and second bytes
1652 item->email->subject->off1 = list->items[x]->data[0];
1653 item->email->subject->off2 = list->items[x]->data[1];
1654 item->email->subject->subj = realloc(item->email->subject->subj, (list->items[x]->size-2)+1);
1655 memset(item->email->subject->subj, 0, list->items[x]->size-1);
1656 memcpy(item->email->subject->subj, &(list->items[x]->data[2]), list->items[x]->size-2);
1657 }
1658 DEBUG_EMAIL(("%s\n", item->email->subject->subj));
1659 } else {
1660 // obviously outlook has decided not to be straight with this one.
1661 item->email->subject->off1 = 0;
1662 item->email->subject->off2 = 0;
1663 item->email->subject = NULL;
1664 DEBUG_EMAIL(("NULL subject detected\n"));
1665 }
1666 break;
1667 // INC_CHECK_X();
1668 case 0x0039: // PR_CLIENT_SUBMIT_TIME Date Email Sent/Created
1669 DEBUG_EMAIL(("Date sent - "));
1670 MALLOC_EMAIL(item);
1671 LIST_COPY(item->email->sent_date, (FILETIME*));
1672 LE32_CPU(item->email->sent_date->dwLowDateTime);
1673 LE32_CPU(item->email->sent_date->dwHighDateTime);
1674 DEBUG_EMAIL(("%s", fileTimeToAscii(item->email->sent_date)));
1675 // INC_CHECK_X();
1676 break;
1677 case 0x003B: // PR_SENT_REPRESENTING_SEARCH_KEY Sender address 1
1678 DEBUG_EMAIL(("Sent on behalf of address 1 - "));
1679 MALLOC_EMAIL(item);
1680 LIST_COPY(item->email->outlook_sender, (char*));
1681 DEBUG_EMAIL(("%s\n", item->email->outlook_sender));
1682 // INC_CHECK_X();
1683 break;
1684 case 0x003F: // PR_RECEIVED_BY_ENTRYID Structure containing Recipient
1685 DEBUG_EMAIL(("Recipient Structure 1 -- NOT HANDLED\n"));
1686 // INC_CHECK_X();
1687 break;
1688 case 0x0040: // PR_RECEIVED_BY_NAME Name of Recipient Structure
1689 DEBUG_EMAIL(("Received By Name 1 -- NOT HANDLED\n"));
1690 //INC_CHECK_X();
1691 break;
1692 case 0x0041: // PR_SENT_REPRESENTING_ENTRYID Structure containing Sender
1693 DEBUG_EMAIL(("Sent on behalf of Structure 1 -- NOT HANDLED\n"));
1694 //INC_CHECK_X();
1695 break;
1696 case 0x0042: // PR_SENT_REPRESENTING_NAME Name of Sender Structure
1697 DEBUG_EMAIL(("Sent on behalf of Structure Name - "));
1698 MALLOC_EMAIL(item);
1699 LIST_COPY(item->email->outlook_sender_name, (char*));
1700 DEBUG_EMAIL(("%s\n", item->email->outlook_sender_name));
1701 //INC_CHECK_X();
1702 break;
1703 case 0x0043: // PR_RCVD_REPRESENTING_ENTRYID Recipient Structure 2
1704 DEBUG_EMAIL(("Received on behalf of Structure -- NOT HANDLED\n"));
1705 //INC_CHECK_X();
1706 break;
1707 case 0x0044: // PR_RCVD_REPRESENTING_NAME Name of Recipient Structure 2
1708 DEBUG_EMAIL(("Received on behalf of Structure Name -- NOT HANDLED\n"));
1709 //INC_CHECK_X();
1710 break;
1711 case 0x004F: // PR_REPLY_RECIPIENT_ENTRIES Reply-To Structure
1712 DEBUG_EMAIL(("Reply-To Structure -- NOT HANDLED\n"));
1713 //INC_CHECK_X();
1714 break;
1715 case 0x0050: // PR_REPLY_RECIPIENT_NAMES Name of Reply-To Structure
1716 DEBUG_EMAIL(("Name of Reply-To Structure -"));
1717 MALLOC_EMAIL(item);
1718 LIST_COPY(item->email->reply_to, (char*));
1719 DEBUG_EMAIL(("%s\n", item->email->reply_to));
1720 //INC_CHECK_X();
1721 break;
1722 case 0x0051: // PR_RECEIVED_BY_SEARCH_KEY Recipient Address 1
1723 DEBUG_EMAIL(("Recipient's Address 1 (Search Key) - "));
1724 MALLOC_EMAIL(item);
1725 LIST_COPY (item->email->outlook_recipient, (char*));
1726 DEBUG_EMAIL(("%s\n", item->email->outlook_recipient));
1727 //INC_CHECK_X();
1728 break;
1729 case 0x0052: // PR_RCVD_REPRESENTING_SEARCH_KEY Recipient Address 2
1730 DEBUG_EMAIL(("Received on behalf of Address (Search Key) - "));
1731 MALLOC_EMAIL(item);
1732 LIST_COPY(item->email->outlook_recipient2, (char*));
1733 DEBUG_EMAIL(("%s\n", item->email->outlook_recipient2));
1734 //INC_CHECK_X();
1735 break;
1736 case 0x0057: // PR_MESSAGE_TO_ME
1737 // this user is listed explicitly in the TO address
1738 DEBUG_EMAIL(("My address in TO field - "));
1739 MALLOC_EMAIL(item);
1740 if (*(int16_t*)list->items[x]->data != 0) {
1741 DEBUG_EMAIL(("True\n"));
1742 item->email->message_to_me = 1;
1743 } else {
1744 DEBUG_EMAIL(("False\n"));
1745 item->email->message_to_me = 0;
1746 }
1747 //INC_CHECK_X();
1748 break;
1749 case 0x0058: // PR_MESSAGE_CC_ME
1750 // this user is listed explicitly in the CC address
1751 DEBUG_EMAIL(("My address in CC field - "));
1752 MALLOC_EMAIL(item);
1753 if (*(int16_t*)list->items[x]->data != 0) {
1754 DEBUG_EMAIL(("True\n"));
1755 item->email->message_cc_me = 1;
1756 } else {
1757 DEBUG_EMAIL(("False\n"));
1758 item->email->message_cc_me = 0;
1759 }
1760 //INC_CHECK_X();
1761 break;
1762 case 0x0059: //PR_MESSAGE_RECIP_ME
1763 // this user appears in TO, CC or BCC address list
1764 DEBUG_EMAIL(("Message addressed to me - "));
1765 MALLOC_EMAIL(item);
1766 if (*(int16_t*)list->items[x]->data != 0) {
1767 DEBUG_EMAIL(("True\n"));
1768 item->email->message_recip_me = 1;
1769 } else {
1770 DEBUG_EMAIL(("False\n"));
1771 item->email->message_recip_me = 0;
1772 }
1773 //INC_CHECK_X();
1774 break;
1775 case 0x0063: // PR_RESPONSE_REQUESTED
1776 DEBUG_EMAIL(("Response requested - "));
1777 if (*(int16_t*)list->items[x]->data != 0) {
1778 DEBUG_EMAIL(("True\n"));
1779 item->response_requested = 1;
1780 } else {
1781 DEBUG_EMAIL(("False\n"));
1782 item->response_requested = 0;
1783 }
1784 break;
1785 case 0x0064: // PR_SENT_REPRESENTING_ADDRTYPE Access method for Sender Address
1786 DEBUG_EMAIL(("Sent on behalf of address type - "));
1787 MALLOC_EMAIL(item);
1788 LIST_COPY(item->email->sender_access, (char*));
1789 DEBUG_EMAIL(("%s\n", item->email->sender_access));
1790 //INC_CHECK_X();
1791 break;
1792 case 0x0065: // PR_SENT_REPRESENTING_EMAIL_ADDRESS Sender Address
1793 DEBUG_EMAIL(("Sent on behalf of Address - "));
1794 MALLOC_EMAIL(item);
1795 LIST_COPY(item->email->sender_address, (char*));
1796 DEBUG_EMAIL(("%s\n", item->email->sender_address));
1797 //INC_CHECK_X();
1798 break;
1799 case 0x0070: // PR_CONVERSATION_TOPIC Processed Subject
1800 DEBUG_EMAIL(("Processed Subject (Conversation Topic) - "));
1801 MALLOC_EMAIL(item);
1802 LIST_COPY(item->email->proc_subject, (char*));
1803 DEBUG_EMAIL(("%s\n", item->email->proc_subject));
1804 //INC_CHECK_X();
1805 break;
1806 case 0x0071: // PR_CONVERSATION_INDEX Date 2
1807 DEBUG_EMAIL(("Conversation Index - "));
1808 MALLOC_EMAIL(item);
1809 memcpy(&(item->email->conv_index), list->items[x]->data, sizeof(item->email->conv_index));
1810 DEBUG_EMAIL(("%i\n", item->email->conv_index));
1811 //INC_CHECK_X();
1812 break;
1813 case 0x0075: // PR_RECEIVED_BY_ADDRTYPE Recipient Access Method
1814 DEBUG_EMAIL(("Received by Address type - "));
1815 MALLOC_EMAIL(item);
1816 LIST_COPY(item->email->recip_access, (char*));
1817 DEBUG_EMAIL(("%s\n", item->email->recip_access));
1818 //INC_CHECK_X();
1819 break;
1820 case 0x0076: // PR_RECEIVED_BY_EMAIL_ADDRESS Recipient Address
1821 DEBUG_EMAIL(("Received by Address - "));
1822 MALLOC_EMAIL(item);
1823 LIST_COPY(item->email->recip_address, (char*));
1824 DEBUG_EMAIL(("%s\n", item->email->recip_address));
1825 //INC_CHECK_X();
1826 break;
1827 case 0x0077: // PR_RCVD_REPRESENTING_ADDRTYPE Recipient Access Method 2
1828 DEBUG_EMAIL(("Received on behalf of Address type - "));
1829 MALLOC_EMAIL(item);
1830 LIST_COPY(item->email->recip2_access, (char*));
1831 DEBUG_EMAIL(("%s\n", item->email->recip2_access));
1832 //INC_CHECK_X();
1833 break;
1834 case 0x0078: // PR_RCVD_REPRESENTING_EMAIL_ADDRESS Recipient Address 2
1835 DEBUG_EMAIL(("Received on behalf of Address -"));
1836 MALLOC_EMAIL(item);
1837 LIST_COPY(item->email->recip2_address, (char*));
1838 DEBUG_EMAIL(("%s\n", item->email->recip2_address));
1839 //INC_CHECK_X();
1840 break;
1841 case 0x007D: // PR_TRANSPORT_MESSAGE_HEADERS Internet Header
1842 DEBUG_EMAIL(("Internet Header - "));
1843 MALLOC_EMAIL(item);
1844 LIST_COPY(item->email->header, (char*));
1845 //DEBUG_EMAIL(("%s\n", item->email->header));
1846 DEBUG_EMAIL(("NOT PRINTED\n"));
1847 //INC_CHECK_X();
1848 break;
1849 case 0x0C17: // PR_REPLY_REQUESTED
1850 DEBUG_EMAIL(("Reply Requested - "));
1851 MALLOC_EMAIL(item);
1852 if (*(int16_t*)list->items[x]->data != 0) {
1853 DEBUG_EMAIL(("True\n"));
1854 item->email->reply_requested = 1;
1855 } else {
1856 DEBUG_EMAIL(("False\n"));
1857 item->email->reply_requested = 0;
1858 }
1859 break;
1860 case 0x0C19: // PR_SENDER_ENTRYID Sender Structure 2
1861 DEBUG_EMAIL(("Sender Structure 2 -- NOT HANDLED\n"));
1862 //INC_CHECK_X();
1863 break;
1864 case 0x0C1A: // PR_SENDER_NAME Name of Sender Structure 2
1865 DEBUG_EMAIL(("Name of Sender Structure 2 -- NOT HANDLED\n"));
1866 //INC_CHECK_X();
1867 break;
1868 case 0x0C1D: // PR_SENDER_SEARCH_KEY Name of Sender Address 2
1869 DEBUG_EMAIL(("Name of Sender Address 2 (Sender search key) - "));
1870 MALLOC_EMAIL(item);
1871 LIST_COPY(item->email->outlook_sender2, (char*));
1872 DEBUG_EMAIL(("%s\n", item->email->outlook_sender2));
1873 //INC_CHECK_X();
1874 break;
1875 case 0x0C1E: // PR_SENDER_ADDRTYPE Sender Address 2 access method
1876 DEBUG_EMAIL(("Sender Address type - "));
1877 MALLOC_EMAIL(item);
1878 LIST_COPY(item->email->sender2_access, (char*));
1879 DEBUG_EMAIL(("%s\n", item->email->sender2_access));
1880 //INC_CHECK_X();
1881 break;
1882 case 0x0C1F: // PR_SENDER_EMAIL_ADDRESS Sender Address 2
1883 DEBUG_EMAIL(("Sender Address - "));
1884 MALLOC_EMAIL(item);
1885 LIST_COPY(item->email->sender2_address, (char*));
1886 DEBUG_EMAIL(("%s\n", item->email->sender2_address));
1887 //INC_CHECK_X();
1888 break;
1889 case 0x0E01: // PR_DELETE_AFTER_SUBMIT
1890 // I am not too sure how this works
1891 DEBUG_EMAIL(("Delete after submit - "));
1892 MALLOC_EMAIL(item);
1893 if (*(int16_t*) list->items[x]->data != 0) {
1894 DEBUG_EMAIL(("True\n"));
1895 item->email->delete_after_submit = 1;
1896 } else {
1897 DEBUG_EMAIL(("False\n"));
1898 item->email->delete_after_submit = 0;
1899 }
1900 //INC_CHECK_X();
1901 break;
1902 case 0x0E03: // PR_DISPLAY_CC CC Addresses
1903 DEBUG_EMAIL(("Display CC Addresses - "));
1904 MALLOC_EMAIL(item);
1905 LIST_COPY(item->email->cc_address, (char*));
1906 DEBUG_EMAIL(("%s\n", item->email->cc_address));
1907 //INC_CHECK_X();
1908 break;
1909 case 0x0E04: // PR_DISPLAY_TO Address Sent-To
1910 DEBUG_EMAIL(("Display Sent-To Address - "));
1911 MALLOC_EMAIL(item);
1912 LIST_COPY(item->email->sentto_address, (char*));
1913 DEBUG_EMAIL(("%s\n", item->email->sentto_address));
1914 //INC_CHECK_X();
1915 break;
1916 case 0x0E06: // PR_MESSAGE_DELIVERY_TIME Date 3 - Email Arrival Date
1917 DEBUG_EMAIL(("Date 3 (Delivery Time) - "));
1918 MALLOC_EMAIL(item);
1919 LIST_COPY(item->email->arrival_date, (FILETIME*));
1920 DEBUG_EMAIL(("%s", fileTimeToAscii(item->email->arrival_date)));
1921 //INC_CHECK_X();
1922 break;
1923 case 0x0E07: // PR_MESSAGE_FLAGS Email Flag
1924 // 0x01 - Read
1925 // 0x02 - Unmodified
1926 // 0x04 - Submit
1927 // 0x08 - Unsent
1928 // 0x10 - Has Attachments
1929 // 0x20 - From Me
1930 // 0x40 - Associated
1931 // 0x80 - Resend
1932 // 0x100 - RN Pending
1933 // 0x200 - NRN Pending
1934 DEBUG_EMAIL(("Message Flags - "));
1935 MALLOC_EMAIL(item);
1936 memcpy(&(item->email->flag), list->items[x]->data, sizeof(item->email->flag));
1937 LE32_CPU(item->email->flag);
1938 DEBUG_EMAIL(("%i\n", item->email->flag));
1939 //INC_CHECK_X();
1940 break;
1941 case 0x0E08: // PR_MESSAGE_SIZE Total size of a message object
1942 DEBUG_EMAIL(("Message Size - "));
1943 memcpy(&(item->message_size), list->items[x]->data, sizeof(item->message_size));
1944 LE32_CPU(item->message_size);
1945 DEBUG_EMAIL(("%i [%#x]\n", item->message_size, item->message_size));
1946 //INC_CHECK_X();
1947 break;
1948 case 0x0E0A: // PR_SENTMAIL_ENTRYID
1949 // folder that this message is sent to after submission
1950 DEBUG_EMAIL(("Sentmail EntryID - "));
1951 MALLOC_EMAIL(item);
1952 LIST_COPY(item->email->sentmail_folder, (pst_entryid*));
1953 LE32_CPU(item->email->sentmail_folder->id);
1954 DEBUG_EMAIL(("[id = %#x]\n", item->email->sentmail_folder->id));
1955 //INC_CHECK_X();
1956 break;
1957 case 0x0E1F: // PR_RTF_IN_SYNC
1958 // True means that the rtf version is same as text body
1959 // False means rtf version is more up-to-date than text body
1960 // if this value doesn't exist, text body is more up-to-date than rtf and
1961 // cannot update to the rtf
1962 DEBUG_EMAIL(("Compressed RTF in Sync - "));
1963 MALLOC_EMAIL(item);
1964 if (*(int16_t*)list->items[x]->data != 0) {
1965 DEBUG_EMAIL(("True\n"));
1966 item->email->rtf_in_sync = 1;
1967 } else {
1968 DEBUG_EMAIL(("False\n"));
1969 item->email->rtf_in_sync = 0;
1970 }
1971 //INC_CHECK_X();
1972 break;
1973 case 0x0E20: // PR_ATTACH_SIZE binary Attachment data in record
1974 DEBUG_EMAIL(("Attachment Size - "));
1975 NULL_CHECK(attach);
1976 MOVE_NEXT(attach);
1977 memcpy(&(attach->size), list->items[x]->data, sizeof(attach->size));
1978 DEBUG_EMAIL(("%i\n", attach->size));
1979 //INC_CHECK_X();
1980 break;
1981 case 0x0FF9: // PR_RECORD_KEY Record Header 1
1982 DEBUG_EMAIL(("Record Key 1 - "));
1983 LIST_COPY(item->record_key, (char*));
1984 item->record_key_size = list->items[x]->size;
1985 DEBUG_EMAIL_HEXPRINT(item->record_key, item->record_key_size);
1986 DEBUG_EMAIL(("\n"));
1987 //INC_CHECK_X();
1988 break;
1989 case 0x1000: // PR_BODY Plain Text body
1990 DEBUG_EMAIL(("Plain Text body - "));
1991 MALLOC_EMAIL(item);
1992 LIST_COPY(item->email->body, (char*));
1993 //DEBUG_EMAIL("%s\n", item->email->body);
1994 DEBUG_EMAIL(("NOT PRINTED\n"));
1995 //INC_CHECK_X();
1996 break;
1997 case 0x1006: // PR_RTF_SYNC_BODY_CRC
1998 DEBUG_EMAIL(("RTF Sync Body CRC - "));
1999 MALLOC_EMAIL(item);
2000 memcpy(&(item->email->rtf_body_crc), list->items[x]->data, sizeof(item->email->rtf_body_crc));
2001 LE32_CPU(item->email->rtf_body_crc);
2002 DEBUG_EMAIL(("%#x\n", item->email->rtf_body_crc));
2003 //INC_CHECK_X();
2004 break;
2005 case 0x1007: // PR_RTF_SYNC_BODY_COUNT
2006 // a count of the *significant* charcters in the rtf body. Doesn't count
2007 // whitespace and other ignorable characters
2008 DEBUG_EMAIL(("RTF Sync Body character count - "));
2009 MALLOC_EMAIL(item);
2010 memcpy(&(item->email->rtf_body_char_count), list->items[x]->data, sizeof(item->email->rtf_body_char_count));
2011 LE32_CPU(item->email->rtf_body_char_count);
2012 DEBUG_EMAIL(("%i [%#x]\n", item->email->rtf_body_char_count, item->email->rtf_body_char_count));
2013 //INC_CHECK_X();
2014 break;
2015 case 0x1008: // PR_RTF_SYNC_BODY_TAG
2016 // the first couple of lines of RTF body so that after modification, then beginning can
2017 // once again be found
2018 DEBUG_EMAIL(("RTF Sync body tag - "));
2019 MALLOC_EMAIL(item);
2020 LIST_COPY(item->email->rtf_body_tag, (char*));
2021 DEBUG_EMAIL(("%s\n", item->email->rtf_body_tag));
2022 //INC_CHECK_X();
2023 break;
2024 case 0x1009: // PR_RTF_COMPRESSED
2025 // some compression algorithm has been applied to this. At present
2026 // it is unknown
2027 DEBUG_EMAIL(("RTF Compressed body - "));
2028 MALLOC_EMAIL(item);
2029 LIST_COPY(item->email->rtf_compressed, (char*));
2030 DEBUG_EMAIL(("NOT PRINTED\n"));
2031 //INC_CHECK_X();
2032 break;
2033 case 0x1010: // PR_RTF_SYNC_PREFIX_COUNT
2034 // a count of the ignored characters before the first significant character
2035 DEBUG_EMAIL(("RTF whitespace prefix count - "));
2036 MALLOC_EMAIL(item);
2037 memcpy(&(item->email->rtf_ws_prefix_count), list->items[x]->data, sizeof(item->email->rtf_ws_prefix_count));
2038 DEBUG_EMAIL(("%i\n", item->email->rtf_ws_prefix_count));
2039 //INC_CHECK_X();
2040 break;
2041 case 0x1011: // PR_RTF_SYNC_TRAILING_COUNT
2042 // a count of the ignored characters after the last significant character
2043 DEBUG_EMAIL(("RTF whitespace tailing count - "));
2044 MALLOC_EMAIL(item);
2045 memcpy(&(item->email->rtf_ws_trailing_count), list->items[x]->data, sizeof(item->email->rtf_ws_trailing_count));
2046 DEBUG_EMAIL(("%i\n", item->email->rtf_ws_trailing_count));
2047 //INC_CHECK_X();
2048 break;
2049 case 0x1013: // HTML body
2050 DEBUG_EMAIL(("HTML body - "));
2051 MALLOC_EMAIL(item);
2052 LIST_COPY(item->email->htmlbody, (char*));
2053 // DEBUG_EMAIL(("%s\n", item->email->htmlbody));
2054 DEBUG_EMAIL(("NOT PRINTED\n"));
2055 //INC_CHECK_X();
2056 break;
2057 case 0x1035: // Message ID
2058 DEBUG_EMAIL(("Message ID - "));
2059 MALLOC_EMAIL(item);
2060 LIST_COPY(item->email->messageid, (char*));
2061 DEBUG_EMAIL(("%s\n", item->email->messageid));
2062 //INC_CHECK_X();
2063 break;
2064 case 0x1042: // in-reply-to
2065 DEBUG_EMAIL(("In-Reply-To - "));
2066 MALLOC_EMAIL(item);
2067 LIST_COPY(item->email->in_reply_to, (char*));
2068 DEBUG_EMAIL(("%s\n", item->email->in_reply_to));
2069 //INC_CHECK_X();
2070 break;
2071 case 0x1046: // Return Path
2072 DEBUG_EMAIL(("Return Path - "));
2073 MALLOC_EMAIL(item);
2074 LIST_COPY(item->email->return_path_address, (char*));
2075 DEBUG_EMAIL(("%s\n", item->email->return_path_address));
2076 //INC_CHECK_X();
2077 break;
2078 case 0x3001: // PR_DISPLAY_NAME File As
2079 DEBUG_EMAIL(("Display Name - "));
2080 LIST_COPY(item->file_as, (char*));
2081 DEBUG_EMAIL(("%s\n", item->file_as));
2082 //INC_CHECK_X();
2083 break;
2084 case 0x3002: // PR_ADDRTYPE
2085 DEBUG_EMAIL(("Address Type - "));
2086 MALLOC_CONTACT(item);
2087 LIST_COPY(item->contact->address1_transport, (char*));
2088 DEBUG_EMAIL(("|%s|\n", item->contact->address1_transport));
2089 //INC_CHECK_X();
2090 break;
2091 case 0x3003: // PR_EMAIL_ADDRESS
2092 // Contact's email address
2093 DEBUG_EMAIL(("Contact Address - "));
2094 MALLOC_CONTACT(item);
2095 LIST_COPY(item->contact->address1, (char*));
2096 DEBUG_EMAIL(("|%s|\n", item->contact->address1));
2097 //INC_CHECK_X();
2098 break;
2099 case 0x3004: // PR_COMMENT Comment for item - usually folders
2100 DEBUG_EMAIL(("Comment - "));
2101 LIST_COPY(item->comment, (char*));
2102 DEBUG_EMAIL(("%s\n", item->comment));
2103 //INC_CHECK_X();
2104 break;
2105 case 0x3007: // PR_CREATION_TIME Date 4 - Creation Date?
2106 DEBUG_EMAIL(("Date 4 (Item Creation Date) - "));
2107 LIST_COPY(item->create_date, (FILETIME*));
2108 DEBUG_EMAIL(("%s", fileTimeToAscii(item->create_date)));
2109 //INC_CHECK_X();
2110 break;
2111 case 0x3008: // PR_LAST_MODIFICATION_TIME Date 5 - Modify Date
2112 DEBUG_EMAIL(("Date 5 (Modify Date) - "));
2113 LIST_COPY(item->modify_date, (FILETIME*));
2114 DEBUG_EMAIL(("%s", fileTimeToAscii(item->modify_date)));
2115 //INC_CHECK_X();
2116 break;
2117 case 0x300B: // PR_SEARCH_KEY Record Header 2
2118 DEBUG_EMAIL(("Record Search 2 -- NOT HANDLED\n"));
2119 //INC_CHECK_X();
2120 break;
2121 case 0x35DF: // PR_VALID_FOLDER_MASK
2122 // States which folders are valid for this message store
2123 // FOLDER_IPM_SUBTREE_VALID 0x1
2124 // FOLDER_IPM_INBOX_VALID 0x2
2125 // FOLDER_IPM_OUTBOX_VALID 0x4
2126 // FOLDER_IPM_WASTEBOX_VALID 0x8
2127 // FOLDER_IPM_SENTMAIL_VALID 0x10
2128 // FOLDER_VIEWS_VALID 0x20
2129 // FOLDER_COMMON_VIEWS_VALID 0x40
2130 // FOLDER_FINDER_VALID 0x80
2131 DEBUG_EMAIL(("Valid Folder Mask - "));
2132 MALLOC_MESSAGESTORE(item);
2133 memcpy(&(item->message_store->valid_mask), list->items[x]->data, sizeof(int));
2134 LE32_CPU(item->message_store->valid_mask);
2135 DEBUG_EMAIL(("%i\n", item->message_store->valid_mask));
2136 //INC_CHECK_X();
2137 break;
2138 case 0x35E0: // PR_IPM_SUBTREE_ENTRYID Top of Personal Folder Record
2139 DEBUG_EMAIL(("Top of Personal Folder Record - "));
2140 MALLOC_MESSAGESTORE(item);
2141 LIST_COPY(item->message_store->top_of_personal_folder, (pst_entryid*));
2142 LE32_CPU(item->message_store->top_of_personal_folder->id);
2143 DEBUG_EMAIL(("[id = %#x]\n", item->message_store->top_of_personal_folder->id));
2144 //INC_CHECK_X();
2145 break;
2146 case 0x35E3: // PR_IPM_WASTEBASKET_ENTRYID Deleted Items Folder Record
2147 DEBUG_EMAIL(("Deleted Items Folder record - "));
2148 MALLOC_MESSAGESTORE(item);
2149 LIST_COPY(item->message_store->deleted_items_folder, (pst_entryid*));
2150 LE32_CPU(item->message_store->deleted_items_folder->id);
2151 DEBUG_EMAIL(("[id = %#x]\n", item->message_store->deleted_items_folder->id));
2152 //INC_CHECK_X();
2153 break;
2154 case 0x35E7: // PR_FINDER_ENTRYID Search Root Record
2155 DEBUG_EMAIL(("Search Root record - "));
2156 MALLOC_MESSAGESTORE(item);
2157 LIST_COPY(item->message_store->search_root_folder, (pst_entryid*));
2158 LE32_CPU(item->message_store->search_root_folder->id);
2159 DEBUG_EMAIL(("[id = %#x]\n", item->message_store->search_root_folder->id));
2160 //INC_CHECK_X();
2161 break;
2162 case 0x3602: // PR_CONTENT_COUNT Number of emails stored in a folder
2163 DEBUG_EMAIL(("Folder Email Count - "));
2164 MALLOC_FOLDER(item);
2165 memcpy(&(item->folder->email_count), list->items[x]->data, sizeof(item->folder->email_count));
2166 LE32_CPU(item->folder->email_count);
2167 DEBUG_EMAIL(("%i\n", item->folder->email_count));
2168 //INC_CHECK_X();
2169 break;
2170 case 0x3603: // PR_CONTENT_UNREAD Number of unread emails
2171 DEBUG_EMAIL(("Unread Email Count - "));
2172 MALLOC_FOLDER(item);
2173 memcpy(&(item->folder->unseen_email_count), list->items[x]->data, sizeof(item->folder->unseen_email_count));
2174 LE32_CPU(item->folder->unseen_email_count);
2175 DEBUG_EMAIL(("%i\n", item->folder->unseen_email_count));
2176 //INC_CHECK_X();
2177 break;
2178 case 0x360A: // PR_SUBFOLDERS Has children
2179 DEBUG_EMAIL(("Has Subfolders - "));
2180 MALLOC_FOLDER(item);
2181 if (*((int32_t*)list->items[x]->data) != 0) {
2182 DEBUG_EMAIL(("True\n"));
2183 item->folder->subfolder = 1;
2184 } else {
2185 DEBUG_EMAIL(("False\n"));
2186 item->folder->subfolder = 0;
2187 }
2188 //INC_CHECK_X();
2189 break;
2190 case 0x3613: // PR_CONTAINER_CLASS IPF.x
2191 DEBUG_EMAIL(("IPF.x - "));
2192 LIST_COPY(item->ascii_type, (char*));
2193 if (strncmp("IPF.Note", item->ascii_type, 8) == 0)
2194 item->type = PST_TYPE_NOTE;
2195 else if (strncmp("IPF.Contact", item->ascii_type, 11) == 0)
2196 item->type = PST_TYPE_CONTACT;
2197 else if (strncmp("IPF.Journal", item->ascii_type, 11) == 0)
2198 item->type = PST_TYPE_JOURNAL;
2199 else if (strncmp("IPF.Appointment", item->ascii_type, 15) == 0)
2200 item->type = PST_TYPE_APPOINTMENT;
2201 else if (strncmp("IPF.StickyNote", item->ascii_type, 14) == 0)
2202 item->type = PST_TYPE_STICKYNOTE;
2203 else if (strncmp("IPF.Task", item->ascii_type, 8) == 0)
2204 item->type = PST_TYPE_TASK;
2205 else
2206 item->type = PST_TYPE_OTHER;
2207
2208 DEBUG_EMAIL(("%s [%i]\n", item->ascii_type, item->type));
2209 //INC_CHECK_X();
2210 break;
2211 case 0x3617: // PR_ASSOC_CONTENT_COUNT
2212 // associated content are items that are attached to this folder
2213 // but are hidden from users
2214 DEBUG_EMAIL(("Associate Content count - "));
2215 MALLOC_FOLDER(item);
2216 memcpy(&(item->folder->assoc_count), list->items[x]->data, sizeof(item->folder->assoc_count));
2217 LE32_CPU(item->folder->assoc_count);
2218 DEBUG_EMAIL(("%i [%#x]\n", item->folder->assoc_count, item->folder->assoc_count));
2219 //INC_CHECK_X();
2220 break;
2221 case 0x3701: // PR_ATTACH_DATA_OBJ binary data of attachment
2222 DEBUG_EMAIL(("Binary Data [Size %i] - ", list->items[x]->size));
2223 NULL_CHECK(attach);
2224 MOVE_NEXT(attach);
2225 if (list->items[x]->data == NULL) { //special case
2226 attach->id2_val = list->items[x]->type;
2227 DEBUG_EMAIL(("Seen a Reference. The data hasn't been loaded yet. [%#x][%#x]\n",
2228 attach->id2_val, list->items[x]->type));
2229 } else {
2230 LIST_COPY(attach->data, (char*));
2231 attach->size = list->items[x]->size;
2232 DEBUG_EMAIL(("NOT PRINTED\n"));
2233 }
2234 //INC_CHECK_X();
2235 break;
2236 case 0x3704: // PR_ATTACH_FILENAME Attachment filename (8.3)
2237 DEBUG_EMAIL(("Attachment Filename - "));
2238 NULL_CHECK(attach);
2239 MOVE_NEXT(attach);
2240 LIST_COPY(attach->filename1, (char*));
2241 DEBUG_EMAIL(("%s\n", attach->filename1));
2242 //INC_CHECK_X();
2243 break;
2244 case 0x3705: // PR_ATTACH_METHOD
2245 // 0 - No Attachment
2246 // 1 - Attach by Value
2247 // 2 - Attach by reference
2248 // 3 - Attach by ref resolve
2249 // 4 - Attach by ref only
2250 // 5 - Embedded Message
2251 // 6 - OLE
2252 DEBUG_EMAIL(("Attachement method - "));
2253 NULL_CHECK(attach);
2254 MOVE_NEXT(attach);
2255 memcpy(&(attach->method), list->items[x]->data, sizeof(attach->method));
2256 LE32_CPU(attach->method);
2257 t = attach->method;
2258 DEBUG_EMAIL(("%s [%i]\n", (t==0?"No Attachment":
2259 (t==1?"Attach By Value":
2260 (t==2?"Attach By Reference":
2261 (t==3?"Attach by Ref. Resolve":
2262 (t==4?"Attach by Ref. Only":
2263 (t==5?"Embedded Message":"OLE")))))),t));
2264 //INC_CHECK_X();
2265 break;
2266 case 0x370B: // PR_RENDERING_POSITION
2267 // position in characters that the attachment appears in the plain text body
2268 DEBUG_EMAIL(("Attachment Position - "));
2269 NULL_CHECK(attach);
2270 MOVE_NEXT(attach);
2271 memcpy(&(attach->position), list->items[x]->data, sizeof(attach->position));
2272 LE32_CPU(attach->position);
2273 DEBUG_EMAIL(("%i [%#x]\n", attach->position));
2274 //INC_CHECK_X();
2275 break;
2276 case 0x3707: // PR_ATTACH_LONG_FILENAME Attachment filename (long?)
2277 DEBUG_EMAIL(("Attachment Filename long - "));
2278 NULL_CHECK(attach);
2279 MOVE_NEXT(attach);
2280 LIST_COPY(attach->filename2, (char*));
2281 DEBUG_EMAIL(("%s\n", attach->filename2));
2282 //INC_CHECK_X();
2283 break;
2284 case 0x370E: // PR_ATTACH_MIME_TAG Mime type of encoding
2285 DEBUG_EMAIL(("Attachment mime encoding - "));
2286 NULL_CHECK(attach);
2287 MOVE_NEXT(attach);
2288 LIST_COPY(attach->mimetype, (char*));
2289 DEBUG_EMAIL(("%s\n", attach->mimetype));
2290 //INC_CHECK_X();
2291 break;
2292 case 0x3710: // PR_ATTACH_MIME_SEQUENCE
2293 // sequence number for mime parts. Includes body
2294 DEBUG_EMAIL(("Attachment Mime Sequence - "));
2295 NULL_CHECK(attach);
2296 MOVE_NEXT(attach);
2297 memcpy(&(attach->sequence), list->items[x]->data, sizeof(attach->sequence));
2298 LE32_CPU(attach->sequence);
2299 DEBUG_EMAIL(("%i\n", attach->sequence));
2300 //INC_CHECK_X();
2301 break;
2302 case 0x3A00: // PR_ACCOUNT
2303 DEBUG_EMAIL(("Contact's Account name - "));
2304 MALLOC_CONTACT(item);
2305 LIST_COPY(item->contact->account_name, (char*));
2306 DEBUG_EMAIL(("%s\n", item->contact->account_name));
2307 break;
2308 case 0x3A01: // PR_ALTERNATE_RECIPIENT
2309 DEBUG_EMAIL(("Contact Alternate Recipient - NOT PROCESSED\n"));
2310 break;
2311 case 0x3A02: // PR_CALLBACK_TELEPHONE_NUMBER
2312 DEBUG_EMAIL(("Callback telephone number - "));
2313 MALLOC_CONTACT(item);
2314 LIST_COPY(item->contact->callback_phone, (char*));
2315 DEBUG_EMAIL(("%s\n", item->contact->callback_phone));
2316 break;
2317 case 0x3A03: // PR_CONVERSION_PROHIBITED
2318 DEBUG_EMAIL(("Message Conversion Prohibited - "));
2319 MALLOC_EMAIL(item);
2320 if (*(int16_t*)list->items[x]->data != 0) {
2321 DEBUG_EMAIL(("True\n"));
2322 item->email->conversion_prohib = 1;
2323 } else {
2324 DEBUG_EMAIL(("False\n"));
2325 item->email->conversion_prohib = 0;
2326 }
2327 break;
2328 case 0x3A05: // PR_GENERATION suffix
2329 DEBUG_EMAIL(("Contacts Suffix - "));
2330 MALLOC_CONTACT(item);
2331 LIST_COPY(item->contact->suffix, (char*));
2332 DEBUG_EMAIL(("%s\n", item->contact->suffix));
2333 break;
2334 case 0x3A06: // PR_GIVEN_NAME Contact's first name
2335 DEBUG_EMAIL(("Contacts First Name - "));
2336 MALLOC_CONTACT(item);
2337 LIST_COPY(item->contact->first_name, (char*));
2338 DEBUG_EMAIL(("%s\n", item->contact->first_name));
2339 //INC_CHECK_X();
2340 break;
2341 case 0x3A07: // PR_GOVERNMENT_ID_NUMBER
2342 DEBUG_EMAIL(("Contacts Government ID Number - "));
2343 MALLOC_CONTACT(item);
2344 LIST_COPY(item->contact->gov_id, (char*));
2345 DEBUG_EMAIL(("%s\n", item->contact->gov_id));
2346 break;
2347 case 0x3A08: // PR_BUSINESS_TELEPHONE_NUMBER
2348 DEBUG_EMAIL(("Business Telephone Number - "));
2349 MALLOC_CONTACT(item);
2350 LIST_COPY(item->contact->business_phone, (char*));
2351 DEBUG_EMAIL(("%s\n", item->contact->business_phone));
2352 break;
2353 case 0x3A09: // PR_HOME_TELEPHONE_NUMBER
2354 DEBUG_EMAIL(("Home Telephone Number - "));
2355 MALLOC_CONTACT(item);
2356 LIST_COPY(item->contact->home_phone, (char*));
2357 DEBUG_EMAIL(("%s\n", item->contact->home_phone));
2358 break;
2359 case 0x3A0A: // PR_INITIALS Contact's Initials
2360 DEBUG_EMAIL(("Contacts Initials - "));
2361 MALLOC_CONTACT(item);
2362 LIST_COPY(item->contact->initials, (char*));
2363 DEBUG_EMAIL(("%s\n", item->contact->initials));
2364 //INC_CHECK_X();
2365 break;
2366 case 0x3A0B: // PR_KEYWORD
2367 DEBUG_EMAIL(("Keyword - "));
2368 MALLOC_CONTACT(item);
2369 LIST_COPY(item->contact->keyword, (char*));
2370 DEBUG_EMAIL(("%s\n", item->contact->keyword));
2371 break;
2372 case 0x3A0C: // PR_LANGUAGE
2373 DEBUG_EMAIL(("Contact's Language - "));
2374 MALLOC_CONTACT(item);
2375 LIST_COPY(item->contact->language, (char*));
2376 DEBUG_EMAIL(("%s\n", item->contact->language));
2377 break;
2378 case 0x3A0D: // PR_LOCATION
2379 DEBUG_EMAIL(("Contact's Location - "));
2380 MALLOC_CONTACT(item);
2381 LIST_COPY(item->contact->location, (char*));
2382 DEBUG_EMAIL(("%s\n", item->contact->location));
2383 break;
2384 case 0x3A0E: // PR_MAIL_PERMISSION - Can the recipient receive and send email
2385 DEBUG_EMAIL(("Mail Permission - "));
2386 MALLOC_CONTACT(item);
2387 if (*(int16_t*)list->items[x]->data != 0) {
2388 DEBUG_EMAIL(("True\n"));
2389 item->contact->mail_permission = 1;
2390 } else {
2391 DEBUG_EMAIL(("False\n"));
2392 item->contact->mail_permission = 0;
2393 }
2394 break;
2395 case 0x3A0F: // PR_MHS_COMMON_NAME
2396 DEBUG_EMAIL(("MHS Common Name - "));
2397 MALLOC_EMAIL(item);
2398 LIST_COPY(item->email->common_name, (char*));
2399 DEBUG_EMAIL(("%s\n", item->email->common_name));
2400 break;
2401 case 0x3A10: // PR_ORGANIZATIONAL_ID_NUMBER
2402 DEBUG_EMAIL(("Organizational ID # - "));
2403 MALLOC_CONTACT(item);
2404 LIST_COPY(item->contact->org_id, (char*));
2405 DEBUG_EMAIL(("%s\n", item->contact->org_id));
2406 break;
2407 case 0x3A11: // PR_SURNAME Contact's Surname
2408 DEBUG_EMAIL(("Contacts Surname - "));
2409 MALLOC_CONTACT(item);
2410 LIST_COPY(item->contact->surname, (char*));
2411 DEBUG_EMAIL(("%s\n", item->contact->surname));
2412 //INC_CHECK_X();
2413 break;
2414 case 0x3A12: // PR_ORIGINAL_ENTRY_ID
2415 DEBUG_EMAIL(("Original Entry ID - NOT PROCESSED\n"));
2416 break;
2417 case 0x3A13: // PR_ORIGINAL_DISPLAY_NAME
2418 DEBUG_EMAIL(("Original Display Name - NOT PROCESSED\n"));
2419 break;
2420 case 0x3A14: // PR_ORIGINAL_SEARCH_KEY
2421 DEBUG_EMAIL(("Original Search Key - NOT PROCESSED\n"));
2422 break;
2423 case 0x3A15: // PR_POSTAL_ADDRESS
2424 DEBUG_EMAIL(("Default Postal Address - "));
2425 MALLOC_CONTACT(item);
2426 LIST_COPY(item->contact->def_postal_address, (char*));
2427 DEBUG_EMAIL(("%s\n", item->contact->def_postal_address));
2428 break;
2429 case 0x3A16: // PR_COMPANY_NAME
2430 DEBUG_EMAIL(("Company Name - "));
2431 MALLOC_CONTACT(item);
2432 LIST_COPY(item->contact->company_name, (char*));
2433 DEBUG_EMAIL(("%s\n", item->contact->company_name));
2434 break;
2435 case 0x3A17: // PR_TITLE - Job Title
2436 DEBUG_EMAIL(("Job Title - "));
2437 MALLOC_CONTACT(item);
2438 LIST_COPY(item->contact->job_title, (char*));
2439 DEBUG_EMAIL(("%s\n", item->contact->job_title));
2440 break;
2441 case 0x3A18: // PR_DEPARTMENT_NAME
2442 DEBUG_EMAIL(("Department Name - "));
2443 MALLOC_CONTACT(item);
2444 LIST_COPY(item->contact->department, (char*));
2445 DEBUG_EMAIL(("%s\n", item->contact->department));
2446 break;
2447 case 0x3A19: // PR_OFFICE_LOCATION
2448 DEBUG_EMAIL(("Office Location - "));
2449 MALLOC_CONTACT(item);
2450 LIST_COPY(item->contact->office_loc, (char*));
2451 DEBUG_EMAIL(("%s\n", item->contact->office_loc));
2452 break;
2453 case 0x3A1A: // PR_PRIMARY_TELEPHONE_NUMBER
2454 DEBUG_EMAIL(("Primary Telephone - "));
2455 MALLOC_CONTACT(item);
2456 LIST_COPY(item->contact->primary_phone, (char*));
2457 DEBUG_EMAIL(("%s\n", item->contact->primary_phone));
2458 break;
2459 case 0x3A1B: // PR_BUSINESS2_TELEPHONE_NUMBER
2460 DEBUG_EMAIL(("Business Phone Number 2 - "));
2461 MALLOC_CONTACT(item);
2462 LIST_COPY(item->contact->business_phone2, (char*));
2463 DEBUG_EMAIL(("%s\n", item->contact->business_phone2));
2464 break;
2465 case 0x3A1C: // PR_MOBILE_TELEPHONE_NUMBER
2466 DEBUG_EMAIL(("Mobile Phone Number - "));
2467 MALLOC_CONTACT(item);
2468 LIST_COPY(item->contact->mobile_phone, (char*));
2469 DEBUG_EMAIL(("%s\n", item->contact->mobile_phone));
2470 break;
2471 case 0x3A1D: // PR_RADIO_TELEPHONE_NUMBER
2472 DEBUG_EMAIL(("Radio Phone Number - "));
2473 MALLOC_CONTACT(item);
2474 LIST_COPY(item->contact->radio_phone, (char*));
2475 DEBUG_EMAIL(("%s\n", item->contact->radio_phone));
2476 break;
2477 case 0x3A1E: // PR_CAR_TELEPHONE_NUMBER
2478 DEBUG_EMAIL(("Car Phone Number - "));
2479 MALLOC_CONTACT(item);
2480 LIST_COPY(item->contact->car_phone, (char*));
2481 DEBUG_EMAIL(("%s\n", item->contact->car_phone));
2482 break;
2483 case 0x3A1F: // PR_OTHER_TELEPHONE_NUMBER
2484 DEBUG_EMAIL(("Other Phone Number - "));
2485 MALLOC_CONTACT(item);
2486 LIST_COPY(item->contact->other_phone, (char*));
2487 DEBUG_EMAIL(("%s\n", item->contact->other_phone));
2488 break;
2489 case 0x3A20: // PR_TRANSMITTABLE_DISPLAY_NAME
2490 DEBUG_EMAIL(("Transmittable Display Name - "));
2491 MALLOC_CONTACT(item);
2492 LIST_COPY(item->contact->transmittable_display_name, (char*));
2493 DEBUG_EMAIL(("%s\n", item->contact->transmittable_display_name));
2494 break;
2495 case 0x3A21: // PR_PAGER_TELEPHONE_NUMBER
2496 DEBUG_EMAIL(("Pager Phone Number - "));
2497 MALLOC_CONTACT(item);
2498 LIST_COPY(item->contact->pager_phone, (char*));
2499 DEBUG_EMAIL(("%s\n", item->contact->pager_phone));
2500 break;
2501 case 0x3A22: // PR_USER_CERTIFICATE
2502 DEBUG_EMAIL(("User Certificate - NOT PROCESSED"));
2503 break;
2504 case 0x3A23: // PR_PRIMARY_FAX_NUMBER
2505 DEBUG_EMAIL(("Primary Fax Number - "));
2506 MALLOC_CONTACT(item);
2507 LIST_COPY(item->contact->primary_fax, (char*));
2508 DEBUG_EMAIL(("%s\n", item->contact->primary_fax));
2509 break;
2510 case 0x3A24: // PR_BUSINESS_FAX_NUMBER
2511 DEBUG_EMAIL(("Business Fax Number - "));
2512 MALLOC_CONTACT(item);
2513 LIST_COPY(item->contact->business_fax, (char*));
2514 DEBUG_EMAIL(("%s\n", item->contact->business_fax));
2515 break;
2516 case 0x3A25: // PR_HOME_FAX_NUMBER
2517 DEBUG_EMAIL(("Home Fax Number - "));
2518 MALLOC_CONTACT(item);
2519 LIST_COPY(item->contact->home_fax, (char*));
2520 DEBUG_EMAIL(("%s\n", item->contact->home_fax));
2521 break;
2522 case 0x3A26: // PR_BUSINESS_ADDRESS_COUNTRY
2523 DEBUG_EMAIL(("Business Address Country - "));
2524 MALLOC_CONTACT(item);
2525 LIST_COPY(item->contact->business_country, (char*));
2526 DEBUG_EMAIL(("%s\n", item->contact->business_country));
2527 break;
2528 case 0x3A27: // PR_BUSINESS_ADDRESS_CITY
2529 DEBUG_EMAIL(("Business Address City - "));
2530 MALLOC_CONTACT(item);
2531 LIST_COPY(item->contact->business_city, (char*));
2532 DEBUG_EMAIL(("%s\n", item->contact->business_city));
2533 break;
2534 case 0x3A28: // PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE
2535 DEBUG_EMAIL(("Business Address State - "));
2536 MALLOC_CONTACT(item);
2537 LIST_COPY(item->contact->business_state, (char*));
2538 DEBUG_EMAIL(("%s\n", item->contact->business_state));
2539 break;
2540 case 0x3A29: // PR_BUSINESS_ADDRESS_STREET
2541 DEBUG_EMAIL(("Business Address Street - "));
2542 MALLOC_CONTACT(item);
2543 LIST_COPY(item->contact->business_street, (char*));
2544 DEBUG_EMAIL(("%s\n", item->contact->business_street));
2545 break;
2546 case 0x3A2A: // PR_BUSINESS_POSTAL_CODE
2547 DEBUG_EMAIL(("Business Postal Code - "));
2548 MALLOC_CONTACT(item);
2549 LIST_COPY(item->contact->business_postal_code, (char*));
2550 DEBUG_EMAIL(("%s\n", item->contact->business_postal_code));
2551 break;
2552 case 0x3A2B: // PR_BUSINESS_PO_BOX
2553 DEBUG_EMAIL(("Business PO Box - "));
2554 MALLOC_CONTACT(item);
2555 LIST_COPY(item->contact->business_po_box, (char*));
2556 DEBUG_EMAIL(("%s\n", item->contact->business_po_box));
2557 break;
2558 case 0x3A2C: // PR_TELEX_NUMBER
2559 DEBUG_EMAIL(("Telex Number - "));
2560 MALLOC_CONTACT(item);
2561 LIST_COPY(item->contact->telex, (char*));
2562 DEBUG_EMAIL(("%s\n", item->contact->telex));
2563 break;
2564 case 0x3A2D: // PR_ISDN_NUMBER
2565 DEBUG_EMAIL(("ISDN Number - "));
2566 MALLOC_CONTACT(item);
2567 LIST_COPY(item->contact->isdn_phone, (char*));
2568 DEBUG_EMAIL(("%s\n", item->contact->isdn_phone));
2569 break;
2570 case 0x3A2E: // PR_ASSISTANT_TELEPHONE_NUMBER
2571 DEBUG_EMAIL(("Assistant Phone Number - "));
2572 MALLOC_CONTACT(item);
2573 LIST_COPY(item->contact->assistant_phone, (char*));
2574 DEBUG_EMAIL(("%s\n", item->contact->assistant_phone));
2575 break;
2576 case 0x3A2F: // PR_HOME2_TELEPHONE_NUMBER
2577 DEBUG_EMAIL(("Home Phone 2 - "));
2578 MALLOC_CONTACT(item);
2579 LIST_COPY(item->contact->home_phone2, (char*));
2580 DEBUG_EMAIL(("%s\n", item->contact->home_phone2));
2581 break;
2582 case 0x3A30: // PR_ASSISTANT
2583 DEBUG_EMAIL(("Assistant's Name - "));
2584 MALLOC_CONTACT(item);
2585 LIST_COPY(item->contact->assistant_name, (char*));
2586 DEBUG_EMAIL(("%s\n", item->contact->assistant_name));
2587 break;
2588 case 0x3A40: // PR_SEND_RICH_INFO
2589 DEBUG_EMAIL(("Can receive Rich Text - "));
2590 MALLOC_CONTACT(item);
2591 if(*(int16_t*)list->items[x]->data != 0) {
2592 DEBUG_EMAIL(("True\n"));
2593 item->contact->rich_text = 1;
2594 } else {
2595 DEBUG_EMAIL(("False\n"));
2596 item->contact->rich_text = 0;
2597 }
2598 break;
2599 case 0x3A41: // PR_WEDDING_ANNIVERSARY
2600 DEBUG_EMAIL(("Wedding Anniversary - "));
2601 MALLOC_CONTACT(item);
2602 LIST_COPY(item->contact->wedding_anniversary, (FILETIME*));
2603 DEBUG_EMAIL(("%s\n", fileTimeToAscii(item->contact->wedding_anniversary)));
2604 break;
2605 case 0x3A42: // PR_BIRTHDAY
2606 DEBUG_EMAIL(("Birthday - "));
2607 MALLOC_CONTACT(item);
2608 LIST_COPY(item->contact->birthday, (FILETIME*));
2609 DEBUG_EMAIL(("%s\n", fileTimeToAscii(item->contact->birthday)));
2610 break;
2611 case 0x3A43: // PR_HOBBIES
2612 DEBUG_EMAIL(("Hobbies - "));
2613 MALLOC_CONTACT(item);
2614 LIST_COPY(item->contact->hobbies, (char*));
2615 DEBUG_EMAIL(("%s\n", item->contact->hobbies));
2616 break;
2617 case 0x3A44: // PR_MIDDLE_NAME
2618 DEBUG_EMAIL(("Middle Name - "));
2619 MALLOC_CONTACT(item);
2620 LIST_COPY(item->contact->middle_name, (char*));
2621 DEBUG_EMAIL(("%s\n", item->contact->middle_name));
2622 break;
2623 case 0x3A45: // PR_DISPLAY_NAME_PREFIX
2624 DEBUG_EMAIL(("Display Name Prefix (Title) - "));
2625 MALLOC_CONTACT(item);
2626 LIST_COPY(item->contact->display_name_prefix, (char*));
2627 DEBUG_EMAIL(("%s\n", item->contact->display_name_prefix));
2628 break;
2629 case 0x3A46: // PR_PROFESSION
2630 DEBUG_EMAIL(("Profession - "));
2631 MALLOC_CONTACT(item);
2632 LIST_COPY(item->contact->profession, (char*));
2633 DEBUG_EMAIL(("%s\n", item->contact->profession));
2634 break;
2635 case 0x3A47: // PR_PREFERRED_BY_NAME
2636 DEBUG_EMAIL(("Preferred By Name - "));
2637 MALLOC_CONTACT(item);
2638 LIST_COPY(item->contact->pref_name, (char*));
2639 DEBUG_EMAIL(("%s\n", item->contact->pref_name));
2640 break;
2641 case 0x3A48: // PR_SPOUSE_NAME
2642 DEBUG_EMAIL(("Spouse's Name - "));
2643 MALLOC_CONTACT(item);
2644 LIST_COPY(item->contact->spouse_name, (char*));
2645 DEBUG_EMAIL(("%s\n", item->contact->spouse_name));
2646 break;
2647 case 0x3A49: // PR_COMPUTER_NETWORK_NAME
2648 DEBUG_EMAIL(("Computer Network Name - "));
2649 MALLOC_CONTACT(item);
2650 LIST_COPY(item->contact->computer_name, (char*));
2651 DEBUG_EMAIL(("%s\n", item->contact->computer_name));
2652 break;
2653 case 0x3A4A: // PR_CUSTOMER_ID
2654 DEBUG_EMAIL(("Customer ID - "));
2655 MALLOC_CONTACT(item);
2656 LIST_COPY(item->contact->customer_id, (char*));
2657 DEBUG_EMAIL(("%s\n", item->contact->customer_id));
2658 break;
2659 case 0x3A4B: // PR_TTYTDD_PHONE_NUMBER
2660 DEBUG_EMAIL(("TTY/TDD Phone - "));
2661 MALLOC_CONTACT(item);
2662 LIST_COPY(item->contact->ttytdd_phone, (char*));
2663 DEBUG_EMAIL(("%s\n", item->contact->ttytdd_phone));
2664 break;
2665 case 0x3A4C: // PR_FTP_SITE
2666 DEBUG_EMAIL(("Ftp Site - "));
2667 MALLOC_CONTACT(item);
2668 LIST_COPY(item->contact->ftp_site, (char*));
2669 DEBUG_EMAIL(("%s\n", item->contact->ftp_site));
2670 break;
2671 case 0x3A4D: // PR_GENDER
2672 DEBUG_EMAIL(("Gender - "));
2673 MALLOC_CONTACT(item);
2674 memcpy(&item->contact->gender, list->items[x]->data, sizeof(int16_t));
2675 LE16_CPU(item->contact->gender);
2676 switch(item->contact->gender) {
2677 case 0:
2678 DEBUG_EMAIL(("Unspecified\n"));
2679 break;
2680 case 1:
2681 DEBUG_EMAIL(("Female\n"));
2682 break;
2683 case 2:
2684 DEBUG_EMAIL(("Male\n"));
2685 break;
2686 default:
2687 DEBUG_EMAIL(("Error processing\n"));
2688 }
2689 break;
2690 case 0x3A4E: // PR_MANAGER_NAME
2691 DEBUG_EMAIL(("Manager's Name - "));
2692 MALLOC_CONTACT(item);
2693 LIST_COPY(item->contact->manager_name, (char*));
2694 DEBUG_EMAIL(("%s\n", item->contact->manager_name));
2695 break;
2696 case 0x3A4F: // PR_NICKNAME
2697 DEBUG_EMAIL(("Nickname - "));
2698 MALLOC_CONTACT(item);
2699 LIST_COPY(item->contact->nickname, (char*));
2700 DEBUG_EMAIL(("%s\n", item->contact->nickname));
2701 break;
2702 case 0x3A50: // PR_PERSONAL_HOME_PAGE
2703 DEBUG_EMAIL(("Personal Home Page - "));
2704 MALLOC_CONTACT(item);
2705 LIST_COPY(item->contact->personal_homepage, (char*));
2706 DEBUG_EMAIL(("%s\n", item->contact->personal_homepage));
2707 break;
2708 case 0x3A51: // PR_BUSINESS_HOME_PAGE
2709 DEBUG_EMAIL(("Business Home Page - "));
2710 MALLOC_CONTACT(item);
2711 LIST_COPY(item->contact->business_homepage, (char*));
2712 DEBUG_EMAIL(("%s\n", item->contact->business_homepage));
2713 break;
2714 case 0x3A57: // PR_COMPANY_MAIN_PHONE_NUMBER
2715 DEBUG_EMAIL(("Company Main Phone - "));
2716 MALLOC_CONTACT(item);
2717 LIST_COPY(item->contact->company_main_phone, (char*));
2718 DEBUG_EMAIL(("%s\n", item->contact->company_main_phone));
2719 break;
2720 case 0x3A58: // PR_CHILDRENS_NAMES
2721 DEBUG_EMAIL(("Children's Names - NOT PROCESSED\n"));
2722 break;
2723 case 0x3A59: // PR_HOME_ADDRESS_CITY
2724 DEBUG_EMAIL(("Home Address City - "));
2725 MALLOC_CONTACT(item);
2726 LIST_COPY(item->contact->home_city, (char*));
2727 DEBUG_EMAIL(("%s\n", item->contact->home_city));
2728 break;
2729 case 0x3A5A: // PR_HOME_ADDRESS_COUNTRY
2730 DEBUG_EMAIL(("Home Address Country - "));
2731 MALLOC_CONTACT(item);
2732 LIST_COPY(item->contact->home_country, (char*));
2733 DEBUG_EMAIL(("%s\n", item->contact->home_country));
2734 break;
2735 case 0x3A5B: // PR_HOME_ADDRESS_POSTAL_CODE
2736 DEBUG_EMAIL(("Home Address Postal Code - "));
2737 MALLOC_CONTACT(item);
2738 LIST_COPY(item->contact->home_postal_code, (char*));
2739 DEBUG_EMAIL(("%s\n", item->contact->home_postal_code));
2740 break;
2741 case 0x3A5C: // PR_HOME_ADDRESS_STATE_OR_PROVINCE
2742 DEBUG_EMAIL(("Home Address State or Province - "));
2743 MALLOC_CONTACT(item);
2744 LIST_COPY(item->contact->home_state, (char*));
2745 DEBUG_EMAIL(("%s\n", item->contact->home_state));
2746 break;
2747 case 0x3A5D: // PR_HOME_ADDRESS_STREET
2748 DEBUG_EMAIL(("Home Address Street - "));
2749 MALLOC_CONTACT(item);
2750 LIST_COPY(item->contact->home_street, (char*));
2751 DEBUG_EMAIL(("%s\n", item->contact->home_street));
2752 break;
2753 case 0x3A5E: // PR_HOME_ADDRESS_POST_OFFICE_BOX
2754 DEBUG_EMAIL(("Home Address Post Office Box - "));
2755 MALLOC_CONTACT(item);
2756 LIST_COPY(item->contact->home_po_box, (char*));
2757 DEBUG_EMAIL(("%s\n", item->contact->home_po_box));
2758 break;
2759 case 0x3A5F: // PR_OTHER_ADDRESS_CITY
2760 DEBUG_EMAIL(("Other Address City - "));
2761 MALLOC_CONTACT(item);
2762 LIST_COPY(item->contact->other_city, (char*));
2763 DEBUG_EMAIL(("%s\n", item->contact->other_city));
2764 break;
2765 case 0x3A60: // PR_OTHER_ADDRESS_COUNTRY
2766 DEBUG_EMAIL(("Other Address Country - "));
2767 MALLOC_CONTACT(item);
2768 LIST_COPY(item->contact->other_country, (char*));
2769 DEBUG_EMAIL(("%s\n", item->contact->other_country));
2770 break;
2771 case 0x3A61: // PR_OTHER_ADDRESS_POSTAL_CODE
2772 DEBUG_EMAIL(("Other Address Postal Code - "));
2773 MALLOC_CONTACT(item);
2774 LIST_COPY(item->contact->other_postal_code, (char*));
2775 DEBUG_EMAIL(("%s\n", item->contact->other_postal_code));
2776 break;
2777 case 0x3A62: // PR_OTHER_ADDRESS_STATE_OR_PROVINCE
2778 DEBUG_EMAIL(("Other Address State - "));
2779 MALLOC_CONTACT(item);
2780 LIST_COPY(item->contact->other_state, (char*));
2781 DEBUG_EMAIL(("%s\n", item->contact->other_state));
2782 break;
2783 case 0x3A63: // PR_OTHER_ADDRESS_STREET
2784 DEBUG_EMAIL(("Other Address Street - "));
2785 MALLOC_CONTACT(item);
2786 LIST_COPY(item->contact->other_street, (char*));
2787 DEBUG_EMAIL(("%s\n", item->contact->other_street));
2788 break;
2789 case 0x3A64: // PR_OTHER_ADDRESS_POST_OFFICE_BOX
2790 DEBUG_EMAIL(("Other Address Post Office box - "));
2791 MALLOC_CONTACT(item);
2792 LIST_COPY(item->contact->other_po_box, (char*));
2793 DEBUG_EMAIL(("%s\n", item->contact->other_po_box));
2794 break;
2795 case 0x65E3: // Entry ID?
2796 DEBUG_EMAIL(("Entry ID - "));
2797 item->record_key = (char*) xmalloc(16+1);
2798 memcpy(item->record_key, &(list->items[x]->data[1]), 16); //skip first byte
2799 item->record_key[16]='\0';
2800 item->record_key_size=16;
2801 DEBUG_EMAIL_HEXPRINT((char*)item->record_key, 16);
2802 //INC_CHECK_X();
2803 break;
2804 case 0x67F2: // ID2 value of the attachments proper record
2805 DEBUG_EMAIL(("Attachment ID2 value - "));
2806 if (attach != NULL){
2807 MOVE_NEXT(attach);
2808 memcpy(&(attach->id2_val), list->items[x]->data, sizeof(attach->id2_val));
2809 LE32_CPU(attach->id2_val);
2810 DEBUG_EMAIL(("%#x\n", attach->id2_val));
2811 } else {
2812 DEBUG_EMAIL(("NOT AN ATTACHMENT: %#x\n", list->items[x]->id));
2813 }
2814 //INC_CHECK_X();
2815 break;
2816 case 0x67FF: // Extra Property Identifier (Password CheckSum)
2817 DEBUG_EMAIL(("Password checksum [0x67FF] - "));
2818 MALLOC_MESSAGESTORE(item);
2819 memcpy(&(item->message_store->pwd_chksum), list->items[x]->data,
2820 sizeof(item->message_store->pwd_chksum));
2821 DEBUG_EMAIL(("%#x\n", item->message_store->pwd_chksum));
2822 //INC_CHECK_X();
2823 break;
2824 case 0x6F02: // Secure HTML Body
2825 DEBUG_EMAIL(("Secure HTML Body - "));
2826 MALLOC_EMAIL(item);
2827 LIST_COPY(item->email->encrypted_htmlbody, (char*));
2828 item->email->encrypted_htmlbody_size = list->items[x]->size;
2829 DEBUG_EMAIL(("Not Printed\n"));
2830 //INC_CHECK_X();
2831 break;
2832 case 0x6F04: // Secure Text Body
2833 DEBUG_EMAIL(("Secure Text Body - "));
2834 MALLOC_EMAIL(item);
2835 LIST_COPY(item->email->encrypted_body, (char*));
2836 item->email->encrypted_body_size = list->items[x]->size;
2837 DEBUG_EMAIL(("Not Printed\n"));
2838 //INC_CHECK_X();
2839 break;
2840 case 0x7C07: // top of folders ENTRYID
2841 DEBUG_EMAIL(("Top of folders RecID [0x7c07] - "));
2842 MALLOC_MESSAGESTORE(item);
2843 item->message_store->top_of_folder = (pst_entryid*) xmalloc(sizeof(pst_entryid));
2844 memcpy(item->message_store->top_of_folder, list->items[x]->data, sizeof(pst_entryid));
2845 LE32_CPU(item->message_store->top_of_folder->u1);
2846 LE32_CPU(item->message_store->top_of_folder->id);
2847 DEBUG_EMAIL_HEXPRINT((char*)item->message_store->top_of_folder->entryid, 16);
2848 //INC_CHECK_X();
2849 break;
2850 case 0x8005: // Contact's Fullname
2851 DEBUG_EMAIL(("Contact Fullname - "));
2852 MALLOC_CONTACT(item);
2853 LIST_COPY(item->contact->fullname, (char*));
2854 DEBUG_EMAIL(("%s\n", item->contact->fullname));
2855 break;
2856 case 0x801A: // Full Home Address
2857 DEBUG_EMAIL(("Home Address - "));
2858 MALLOC_CONTACT(item);
2859 LIST_COPY(item->contact->home_address, (char*));
2860 DEBUG_EMAIL(("%s\n", item->contact->home_address));
2861 break;
2862 case 0x801B: // Full Business Address
2863 DEBUG_EMAIL(("Business Address - "));
2864 MALLOC_CONTACT(item);
2865 LIST_COPY(item->contact->business_address, (char*));
2866 DEBUG_EMAIL(("%s\n", item->contact->business_address));
2867 break;
2868 case 0x801C: // Full Other Address
2869 DEBUG_EMAIL(("Other Address - "));
2870 MALLOC_CONTACT(item);
2871 LIST_COPY(item->contact->other_address, (char*));
2872 DEBUG_EMAIL(("%s\n", item->contact->other_address));
2873 break;
2874 case 0x8082: // Email Address 1 Transport
2875 DEBUG_EMAIL(("Email Address 1 Transport - "));
2876 MALLOC_CONTACT(item);
2877 LIST_COPY(item->contact->address1_transport, (char*));
2878 DEBUG_EMAIL(("|%s|\n", item->contact->address1_transport));
2879 break;
2880 case 0x8083: // Email Address 1 Address
2881 DEBUG_EMAIL(("Email Address 1 Address - "));
2882 MALLOC_CONTACT(item);
2883 LIST_COPY(item->contact->address1, (char*));
2884 DEBUG_EMAIL(("|%s|\n", item->contact->address1));
2885 break;
2886 case 0x8084: // Email Address 1 Description
2887 DEBUG_EMAIL(("Email Address 1 Description - "));
2888 MALLOC_CONTACT(item);
2889 LIST_COPY(item->contact->address1_desc, (char*));
2890 DEBUG_EMAIL(("|%s|\n", item->contact->address1_desc));
2891 break;
2892 case 0x8085: // Email Address 1 Record
2893 DEBUG_EMAIL(("Email Address 1 Record - "));
2894 MALLOC_CONTACT(item);
2895 LIST_COPY(item->contact->address1a, (char*));
2896 DEBUG_EMAIL(("|%s|\n", item->contact->address1a));
2897 break;
2898 case 0x8092: // Email Address 2 Transport
2899 DEBUG_EMAIL(("Email Address 2 Transport - "));
2900 MALLOC_CONTACT(item);
2901 LIST_COPY(item->contact->address2_transport, (char*));
2902 DEBUG_EMAIL(("|%s|\n", item->contact->address2_transport));
2903 break;
2904 case 0x8093: // Email Address 2 Address
2905 DEBUG_EMAIL(("Email Address 2 Address - "));
2906 MALLOC_CONTACT(item);
2907 LIST_COPY(item->contact->address2, (char*));
2908 DEBUG_EMAIL(("|%s|\n", item->contact->address2));
2909 break;
2910 case 0x8094: // Email Address 2 Description
2911 DEBUG_EMAIL (("Email Address 2 Description - "));
2912 MALLOC_CONTACT(item);
2913 LIST_COPY(item->contact->address2_desc, (char*));
2914 DEBUG_EMAIL(("|%s|\n", item->contact->address2_desc));
2915 break;
2916 case 0x8095: // Email Address 2 Record
2917 DEBUG_EMAIL(("Email Address 2 Record - "));
2918 MALLOC_CONTACT(item);
2919 LIST_COPY(item->contact->address2a, (char*));
2920 DEBUG_EMAIL(("|%s|\n", item->contact->address2a));
2921 break;
2922 case 0x80A2: // Email Address 3 Transport
2923 DEBUG_EMAIL (("Email Address 3 Transport - "));
2924 MALLOC_CONTACT(item);
2925 LIST_COPY(item->contact->address3_transport, (char*));
2926 DEBUG_EMAIL(("|%s|\n", item->contact->address3_transport));
2927 break;
2928 case 0x80A3: // Email Address 3 Address
2929 DEBUG_EMAIL(("Email Address 3 Address - "));
2930 MALLOC_CONTACT(item);
2931 LIST_COPY(item->contact->address3, (char*));
2932 DEBUG_EMAIL(("|%s|\n", item->contact->address3));
2933 break;
2934 case 0x80A4: // Email Address 3 Description
2935 DEBUG_EMAIL(("Email Address 3 Description - "));
2936 MALLOC_CONTACT(item);
2937 LIST_COPY(item->contact->address3_desc, (char*));
2938 DEBUG_EMAIL(("|%s|\n", item->contact->address3_desc));
2939 break;
2940 case 0x80A5: // Email Address 3 Record
2941 DEBUG_EMAIL(("Email Address 3 Record - "));
2942 MALLOC_CONTACT(item);
2943 LIST_COPY(item->contact->address3a, (char*));
2944 DEBUG_EMAIL(("|%s|\n", item->contact->address3a));
2945 break;
2946 case 0x80D8: // Internet Free/Busy
2947 DEBUG_EMAIL(("Internet Free/Busy - "));
2948 MALLOC_CONTACT(item);
2949 LIST_COPY(item->contact->free_busy_address, (char*));
2950 DEBUG_EMAIL(("%s\n", item->contact->free_busy_address));
2951 break;
2952 case 0x8205: // Show on Free/Busy as
2953 // 0: Free
2954 // 1: Tentative
2955 // 2: Busy
2956 // 3: Out Of Office
2957 DEBUG_EMAIL(("Appointment shows as - "));
2958 MALLOC_APPOINTMENT(item);
2959 memcpy(&(item->appointment->showas), list->items[x]->data, sizeof(item->appointment->showas));
2960 LE32_CPU(item->appointment->showas);
2961 switch (item->appointment->showas) {
2962 case PST_FREEBUSY_FREE:
2963 DEBUG_EMAIL(("Free\n")); break;
2964 case PST_FREEBUSY_TENTATIVE:
2965 DEBUG_EMAIL(("Tentative\n")); break;
2966 case PST_FREEBUSY_BUSY:
2967 DEBUG_EMAIL(("Busy\n")); break;
2968 case PST_FREEBUSY_OUT_OF_OFFICE:
2969 DEBUG_EMAIL(("Out Of Office\n")); break;
2970 default:
2971 DEBUG_EMAIL(("Unknown Value: %d\n", item->appointment->showas)); break;
2972 }
2973 break;
2974 case 0x8208: // Location of an appointment
2975 DEBUG_EMAIL(("Appointment Location - "));
2976 MALLOC_APPOINTMENT(item);
2977 LIST_COPY(item->appointment->location, (char*));
2978 DEBUG_EMAIL(("%s\n", item->appointment->location));
2979 break;
2980 case 0x8214: // Label for an appointment
2981 DEBUG_EMAIL(("Label for appointment - "));
2982 MALLOC_APPOINTMENT(item);
2983 memcpy(&(item->appointment->label), list->items[x]->data, sizeof(item->appointment->label));
2984 LE32_CPU(item->appointment->label);
2985 switch (item->appointment->label) {
2986 case PST_APP_LABEL_NONE:
2987 DEBUG_EMAIL(("None\n")); break;
2988 case PST_APP_LABEL_IMPORTANT:
2989 DEBUG_EMAIL(("Important\n")); break;
2990 case PST_APP_LABEL_BUSINESS:
2991 DEBUG_EMAIL(("Business\n")); break;
2992 case PST_APP_LABEL_PERSONAL:
2993 DEBUG_EMAIL(("Personal\n")); break;
2994 case PST_APP_LABEL_VACATION:
2995 DEBUG_EMAIL(("Vacation\n")); break;
2996 case PST_APP_LABEL_MUST_ATTEND:
2997 DEBUG_EMAIL(("Must Attend\n")); break;
2998 case PST_APP_LABEL_TRAVEL_REQ:
2999 DEBUG_EMAIL(("Travel Required\n")); break;
3000 case PST_APP_LABEL_NEEDS_PREP:
3001 DEBUG_EMAIL(("Needs Preparation\n")); break;
3002 case PST_APP_LABEL_BIRTHDAY:
3003 DEBUG_EMAIL(("Birthday\n")); break;
3004 case PST_APP_LABEL_ANNIVERSARY:
3005 DEBUG_EMAIL(("Anniversary\n")); break;
3006 case PST_APP_LABEL_PHONE_CALL:
3007 DEBUG_EMAIL(("Phone Call\n")); break;
3008 }
3009 break;
3010 case 0x8234: // TimeZone as String
3011 DEBUG_EMAIL(("TimeZone of times - "));
3012 MALLOC_APPOINTMENT(item);
3013 LIST_COPY(item->appointment->timezonestring, (char*));
3014 DEBUG_EMAIL(("%s\n", item->appointment->timezonestring));
3015 break;
3016 case 0x8235: // Appointment start time
3017 DEBUG_EMAIL(("Appointment Start Time - "));
3018 MALLOC_APPOINTMENT(item);
3019 LIST_COPY(item->appointment->start, (FILETIME*));
3020 DEBUG_EMAIL(("%s\n", fileTimeToAscii((FILETIME*)item->appointment->start)));
3021 break;
3022 case 0x8236: // Appointment end time
3023 DEBUG_EMAIL(("Appointment End Time - "));
3024 MALLOC_APPOINTMENT(item);
3025 LIST_COPY(item->appointment->end, (FILETIME*));
3026 DEBUG_EMAIL(("%s\n", fileTimeToAscii((FILETIME*)item->appointment->start)));
3027 break;
3028 case 0x8516: // Journal time start
3029 DEBUG_EMAIL(("Duplicate Time Start - "));
3030 DEBUG_EMAIL(("%s\n", fileTimeToAscii((FILETIME*)list->items[x]->data)));
3031 break;
3032 case 0x8517: // Journal time end
3033 DEBUG_EMAIL(("Duplicate Time End - "));
3034 DEBUG_EMAIL(("%s\n", fileTimeToAscii((FILETIME*)list->items[x]->data)));
3035 break;
3036 case 0x8530: // Followup
3037 DEBUG_EMAIL(("Followup String - "));
3038 MALLOC_CONTACT(item);
3039 LIST_COPY(item->contact->followup, (char*));
3040 DEBUG_EMAIL(("%s\n", item->contact->followup));
3041 break;
3042 case 0x8534: // Mileage
3043 DEBUG_EMAIL(("Mileage - "));
3044 MALLOC_CONTACT(item);
3045 LIST_COPY(item->contact->mileage, (char*));
3046 DEBUG_EMAIL(("%s\n", item->contact->mileage));
3047 break;
3048 case 0x8535: // Billing Information
3049 DEBUG_EMAIL(("Billing Information - "));
3050 MALLOC_CONTACT(item);
3051 LIST_COPY(item->contact->billing_information, (char*));
3052 DEBUG_EMAIL(("%s\n", item->contact->billing_information));
3053 break;
3054 case 0x8554: // Outlook Version
3055 DEBUG_EMAIL(("Outlook Version - "));
3056 LIST_COPY(item->outlook_version, (char*));
3057 DEBUG_EMAIL(("%s\n", item->outlook_version));
3058 break;
3059 case 0x8560: // Appointment Reminder Time
3060 DEBUG_EMAIL(("Appointment Reminder Time - "));
3061 MALLOC_APPOINTMENT(item);
3062 LIST_COPY(item->appointment->reminder, (FILETIME*));
3063 DEBUG_EMAIL(("%s\n", fileTimeToAscii(item->appointment->reminder)));
3064 break;
3065 case 0x8700: // Journal Type
3066 DEBUG_EMAIL(("Journal Entry Type - "));
3067 MALLOC_JOURNAL(item);
3068 LIST_COPY(item->journal->type, (char*));
3069 DEBUG_EMAIL(("%s\n", item->journal->type));
3070 break;
3071 case 0x8706: // Journal Start date/time
3072 DEBUG_EMAIL(("Start Timestamp - "));
3073 MALLOC_JOURNAL(item);
3074 LIST_COPY(item->journal->start, (FILETIME*));
3075 DEBUG_EMAIL(("%s\n", fileTimeToAscii(item->journal->start)));
3076 break;
3077 case 0x8708: // Journal End date/time
3078 DEBUG_EMAIL(("End Timestamp - "));
3079 MALLOC_JOURNAL(item);
3080 LIST_COPY(item->journal->end, (FILETIME*));
3081 DEBUG_EMAIL(("%s\n", fileTimeToAscii(item->journal->end)));
3082 break;
3083 case 0x8712: // Title?
3084 DEBUG_EMAIL(("Journal Entry Type - "));
3085 MALLOC_JOURNAL(item);
3086 LIST_COPY(item->journal->type, (char*));
3087 DEBUG_EMAIL(("%s\n", item->journal->type));
3088 break;
3089 default:
3090 /* Reference Types
3091
3092 2 - 0x0002 - Signed 16bit value
3093 3 - 0x0003 - Signed 32bit value
3094 11 - 0x000B - Boolean (non-zero = true)
3095 13 - 0x000D - Embedded Object
3096 30 - 0x001E - Null terminated String
3097 31 - 0x001F - Unicode string
3098 64 - 0x0040 - Systime - Filetime structure
3099 72 - 0x0048 - OLE Guid
3100 258 - 0x0102 - Binary data
3101
3102 - 0x1003 - Array of 32bit values
3103 - 0x101E - Array of Strings
3104 - 0x1102 - Array of Binary data
3105 */
3106 // DEBUG_EMAIL(("Unknown id [%#x, size=%#x]\n", list->items[x]->id, list->items[x]->size));
3107 if (list->items[x]->type == 0x02) {
3108 DEBUG_EMAIL(("Unknown 16bit int = %hi\n", *(int16_t*)list->items[x]->data));
3109 } else if (list->items[x]->type == 0x03) {
3110 DEBUG_EMAIL(("Unknown 32bit int = %i\n", *(int32_t*)list->items[x]->data));
3111 } else if (list->items[x]->type == 0x0b) {
3112 DEBUG_EMAIL(("Unknown 16bit boolean = %s [%hi]\n",
3113 (*((int16_t*)list->items[x]->data)!=0?"True":"False"),
3114 *((int16_t*)list->items[x]->data)));
3115 } else if (list->items[x]->type == 0x1e) {
3116 DEBUG_EMAIL(("Unknown String Data = \"%s\" [%#x]\n",
3117 list->items[x]->data, list->items[x]->type));
3118 } else if (list->items[x]->type == 0x40) {
3119 DEBUG_EMAIL(("Unknown Date = \"%s\" [%#x]\n",
3120 fileTimeToAscii((FILETIME*)list->items[x]->data),
3121 list->items[x]->type));
3122 } else if (list->items[x]->type == 0x102) {
3123 DEBUG_EMAIL(("Unknown Binary Data [size = %#x]\n",
3124 list->items[x]->size));
3125 DEBUG_HEXDUMP(list->items[x]->data, list->items[x]->size);
3126 } else if (list->items[x]->type == 0x101E) {
3127 DEBUG_EMAIL(("Unknown Array of Strings [%#x]\n",
3128 list->items[x]->type));
3129 } else {
3130 DEBUG_EMAIL(("Unknown Not Printable [%#x]\n",
3131 list->items[x]->type));
3132 }
3133 if (list->items[x]->data != NULL) {
3134 free(list->items[x]->data);
3135 list->items[x]->data = NULL;
3136 }
3137 //INC_CHECK_X();
3138 }
3139 x++;
3140 }
3141 x = 0;
3142 list = list->next;
3143 next = 1;
3144 }
1481 DEBUG_RET(); 3145 DEBUG_RET();
1482 return -1; 3146 return 0;
1483 } 3147 }
1484 3148
1485 attach = item->current_attach; // a working variable
1486
1487 while (list != NULL) {
1488 x = 0;
1489 while (x < list->count_item) {
1490 // check here to see if the id is one that is mapped.
1491 DEBUG_EMAIL(("#%d - id: %#x type: %#x length: %#x\n", x, list->items[x]->id, list->items[x]->type,
1492 list->items[x]->size));
1493
1494 switch (list->items[x]->id) {
1495 case PST_ATTRIB_HEADER: // CUSTOM attribute for saying the Extra Headers
1496 DEBUG_EMAIL(("Extra Field - "));
1497 ef = (pst_item_extra_field*) xmalloc(sizeof(pst_item_extra_field));
1498 memset(ef, 0, sizeof(pst_item_extra_field));
1499 ef->field_name = (char*) xmalloc(strlen(list->items[x]->extra)+1);
1500 strcpy(ef->field_name, list->items[x]->extra);
1501 LIST_COPY(ef->value, (char*));
1502 ef->next = item->extra_fields;
1503 item->extra_fields = ef;
1504 DEBUG_EMAIL(("\"%s\" = \"%s\"\n", ef->field_name, ef->value));
1505 break;
1506 case 0x0002: // PR_ALTERNATE_RECIPIENT_ALLOWED
1507 // If set to true, the sender allows this email to be autoforwarded
1508 DEBUG_EMAIL(("AutoForward allowed - "));
1509 MALLOC_EMAIL(item);
1510 if (*((short int*)list->items[x]->data) != 0) {
1511 DEBUG_EMAIL(("True\n"));
1512 item->email->autoforward = 1;
1513 } else {
1514 DEBUG_EMAIL(("False\n"));
1515 item->email->autoforward = -1;
1516 }
1517 // INC_CHECK_X();
1518 break;
1519 case 0x0003: // Extended Attributes table
1520 DEBUG_EMAIL(("Extended Attributes Table - NOT PROCESSED\n"));
1521 break;
1522 case 0x0017: // PR_IMPORTANCE
1523 // How important the sender deems it to be
1524 // 0 - Low
1525 // 1 - Normal
1526 // 2 - High
1527
1528 DEBUG_EMAIL(("Importance Level - "));
1529 MALLOC_EMAIL(item);
1530 memcpy(&(item->email->importance), list->items[x]->data, sizeof(item->email->importance));
1531 LE32_CPU(item->email->importance);
1532 t = item->email->importance;
1533 DEBUG_EMAIL(("%s [%i]\n", (t==0?"Low":(t==1?"Normal":"High")), t));
1534 // INC_CHECK_X();
1535 break;
1536 case 0x001A: // PR_MESSAGE_CLASS Ascii type of messages - NOT FOLDERS
1537 // must be case insensitive
1538 DEBUG_EMAIL(("IPM.x - "));
1539 LIST_COPY(item->ascii_type, (char*));
1540 if (pst_strincmp("IPM.Note", item->ascii_type, 8) == 0)
1541 // the string begins with IPM.Note...
1542 item->type = PST_TYPE_NOTE;
1543 else if (pst_stricmp("IPM", item->ascii_type) == 0)
1544 // the whole string is just IPM
1545 item->type = PST_TYPE_NOTE;
1546 else if (pst_strincmp("IPM.Contact", item->ascii_type, 11) == 0)
1547 // the string begins with IPM.Contact...
1548 item->type = PST_TYPE_CONTACT;
1549 else if (pst_strincmp("REPORT.IPM.Note", item->ascii_type, 15) == 0)
1550 // the string begins with the above
1551 item->type = PST_TYPE_REPORT;
1552 else if (pst_strincmp("IPM.Activity", item->ascii_type, 12) == 0)
1553 item->type = PST_TYPE_JOURNAL;
1554 else if (pst_strincmp("IPM.Appointment", item->ascii_type, 15) == 0)
1555 item->type = PST_TYPE_APPOINTMENT;
1556 else
1557 item->type = PST_TYPE_OTHER;
1558
1559 DEBUG_EMAIL(("%s\n", item->ascii_type));
1560 // INC_CHECK_X(); //increment x here so that the next if statement has a chance of matching the next item
1561 break;
1562 case 0x0023: // PR_ORIGINATOR_DELIVERY_REPORT_REQUESTED
1563 // set if the sender wants a delivery report from all recipients
1564 DEBUG_EMAIL(("Global Delivery Report - "));
1565 MALLOC_EMAIL(item);
1566 if (*(int16_t*)list->items[x]->data != 0) {
1567 DEBUG_EMAIL(("True\n"));
1568 item->email->delivery_report = 1;
1569 } else {
1570 DEBUG_EMAIL(("False\n"));
1571 item->email->delivery_report = 0;
1572 }
1573 // INC_CHECK_X();
1574 break;
1575 case 0x0026: // PR_PRIORITY
1576 // Priority of a message
1577 // -1 NonUrgent
1578 // 0 Normal
1579 // 1 Urgent
1580 DEBUG_EMAIL(("Priority - "));
1581 MALLOC_EMAIL(item);
1582 memcpy(&(item->email->priority), list->items[x]->data, sizeof(item->email->priority));
1583 LE32_CPU(item->email->priority);
1584 t = item->email->priority;
1585 DEBUG_EMAIL(("%s [%i]\n", (t<0?"NonUrgent":(t==0?"Normal":"Urgent")), t));
1586 // INC_CHECK_X();
1587 break;
1588 case 0x0029:// PR_READ_RECEIPT_REQUESTED
1589 DEBUG_EMAIL(("Read Receipt - "));
1590 MALLOC_EMAIL(item);
1591 if (*(short int*)list->items[x]->data != 0) {
1592 DEBUG_EMAIL(("True\n"));
1593 item->email->read_receipt = 1;
1594 } else {
1595 DEBUG_EMAIL(("False\n"));
1596 item->email->read_receipt = 0;
1597 }
1598 // INC_CHECK_X();
1599 break;
1600 case 0x002B: // PR_RECIPIENT_REASSIGNMENT_PROHIBITED
1601 DEBUG_EMAIL(("Reassignment Prohibited (Private) - "));
1602 if (*(short int*)list->items[x]->data != 0) {
1603 DEBUG_EMAIL(("True\n"));
1604 item->private_member = 1;
1605 } else {
1606 DEBUG_EMAIL(("False\n"));
1607 item->private_member = 0;
1608 }
1609 break;
1610 case 0x002E: // PR_ORIGINAL_SENSITIVITY
1611 // the sensitivity of the message before being replied to or forwarded
1612 // 0 - None
1613 // 1 - Personal
1614 // 2 - Private
1615 // 3 - Company Confidential
1616 DEBUG_EMAIL(("Original Sensitivity - "));
1617 MALLOC_EMAIL(item);
1618 memcpy(&(item->email->orig_sensitivity), list->items[x]->data, sizeof(item->email->orig_sensitivity));
1619 LE32_CPU(item->email->orig_sensitivity);
1620 t = item->email->orig_sensitivity;
1621 DEBUG_EMAIL(("%s [%i]\n", (t==0?"None":(t==1?"Personal":
1622 (t==2?"Private":"Company Confidential"))), t));
1623 // INC_CHECK_X();
1624 break;
1625 case 0x0036: // PR_SENSITIVITY
1626 // sender's opinion of the sensitivity of an email
1627 // 0 - None
1628 // 1 - Personal
1629 // 2 - Private
1630 // 3 - Company Confidiential
1631 DEBUG_EMAIL(("Sensitivity - "));
1632 MALLOC_EMAIL(item);
1633 memcpy(&(item->email->sensitivity), list->items[x]->data, sizeof(item->email->sensitivity));
1634 LE32_CPU(item->email->sensitivity);
1635 t = item->email->sensitivity;
1636 DEBUG_EMAIL(("%s [%i]\n", (t==0?"None":(t==1?"Personal":
1637 (t==2?"Private":"Company Confidential"))), t));
1638 // INC_CHECK_X();
1639 break;
1640 case 0x0037: // PR_SUBJECT raw subject
1641 // if (list->items[x]->id == 0x0037) {
1642 DEBUG_EMAIL(("Raw Subject - "));
1643 MALLOC_EMAIL(item);
1644 item->email->subject = (pst_item_email_subject*) realloc(item->email->subject, sizeof(pst_item_email_subject));
1645 memset(item->email->subject, 0, sizeof(pst_item_email_subject));
1646 DEBUG_EMAIL((" [size = %i] ", list->items[x]->size));
1647 if (list->items[x]->size > 0) {
1648 if (isprint(list->items[x]->data[0])) {
1649 // then there are no control bytes at the front
1650 item->email->subject->off1 = 0;
1651 item->email->subject->off2 = 0;
1652 item->email->subject->subj = realloc(item->email->subject->subj, list->items[x]->size+1);
1653 memset(item->email->subject->subj, 0, list->items[x]->size+1);
1654 memcpy(item->email->subject->subj, list->items[x]->data, list->items[x]->size);
1655 } else {
1656 DEBUG_EMAIL(("Raw Subject has control codes\n"));
1657 // there might be some control bytes in the first and second bytes
1658 item->email->subject->off1 = list->items[x]->data[0];
1659 item->email->subject->off2 = list->items[x]->data[1];
1660 item->email->subject->subj = realloc(item->email->subject->subj, (list->items[x]->size-2)+1);
1661 memset(item->email->subject->subj, 0, list->items[x]->size-1);
1662 memcpy(item->email->subject->subj, &(list->items[x]->data[2]), list->items[x]->size-2);
1663 }
1664 DEBUG_EMAIL(("%s\n", item->email->subject->subj));
1665 } else {
1666 // obviously outlook has decided not to be straight with this one.
1667 item->email->subject->off1 = 0;
1668 item->email->subject->off2 = 0;
1669 item->email->subject = NULL;
1670 DEBUG_EMAIL(("NULL subject detected\n"));
1671 }
1672 break;
1673 // INC_CHECK_X();
1674 case 0x0039: // PR_CLIENT_SUBMIT_TIME Date Email Sent/Created
1675 DEBUG_EMAIL(("Date sent - "));
1676 MALLOC_EMAIL(item);
1677 LIST_COPY(item->email->sent_date, (FILETIME*));
1678 LE32_CPU(item->email->sent_date->dwLowDateTime);
1679 LE32_CPU(item->email->sent_date->dwHighDateTime);
1680 DEBUG_EMAIL(("%s", fileTimeToAscii(item->email->sent_date)));
1681 // INC_CHECK_X();
1682 break;
1683 case 0x003B: // PR_SENT_REPRESENTING_SEARCH_KEY Sender address 1
1684 DEBUG_EMAIL(("Sent on behalf of address 1 - "));
1685 MALLOC_EMAIL(item);
1686 LIST_COPY(item->email->outlook_sender, (char*));
1687 DEBUG_EMAIL(("%s\n", item->email->outlook_sender));
1688 // INC_CHECK_X();
1689 break;
1690 case 0x003F: // PR_RECEIVED_BY_ENTRYID Structure containing Recipient
1691 DEBUG_EMAIL(("Recipient Structure 1 -- NOT HANDLED\n"));
1692 // INC_CHECK_X();
1693 break;
1694 case 0x0040: // PR_RECEIVED_BY_NAME Name of Recipient Structure
1695 DEBUG_EMAIL(("Received By Name 1 -- NOT HANDLED\n"));
1696 //INC_CHECK_X();
1697 break;
1698 case 0x0041: // PR_SENT_REPRESENTING_ENTRYID Structure containing Sender
1699 DEBUG_EMAIL(("Sent on behalf of Structure 1 -- NOT HANDLED\n"));
1700 //INC_CHECK_X();
1701 break;
1702 case 0x0042: // PR_SENT_REPRESENTING_NAME Name of Sender Structure
1703 DEBUG_EMAIL(("Sent on behalf of Structure Name - "));
1704 MALLOC_EMAIL(item);
1705 LIST_COPY(item->email->outlook_sender_name, (char*));
1706 DEBUG_EMAIL(("%s\n", item->email->outlook_sender_name));
1707 //INC_CHECK_X();
1708 break;
1709 case 0x0043: // PR_RCVD_REPRESENTING_ENTRYID Recipient Structure 2
1710 DEBUG_EMAIL(("Received on behalf of Structure -- NOT HANDLED\n"));
1711 //INC_CHECK_X();
1712 break;
1713 case 0x0044: // PR_RCVD_REPRESENTING_NAME Name of Recipient Structure 2
1714 DEBUG_EMAIL(("Received on behalf of Structure Name -- NOT HANDLED\n"));
1715 //INC_CHECK_X();
1716 break;
1717 case 0x004F: // PR_REPLY_RECIPIENT_ENTRIES Reply-To Structure
1718 DEBUG_EMAIL(("Reply-To Structure -- NOT HANDLED\n"));
1719 //INC_CHECK_X();
1720 break;
1721 case 0x0050: // PR_REPLY_RECIPIENT_NAMES Name of Reply-To Structure
1722 DEBUG_EMAIL(("Name of Reply-To Structure -"));
1723 MALLOC_EMAIL(item);
1724 LIST_COPY(item->email->reply_to, (char*));
1725 DEBUG_EMAIL(("%s\n", item->email->reply_to));
1726 //INC_CHECK_X();
1727 break;
1728 case 0x0051: // PR_RECEIVED_BY_SEARCH_KEY Recipient Address 1
1729 DEBUG_EMAIL(("Recipient's Address 1 (Search Key) - "));
1730 MALLOC_EMAIL(item);
1731 LIST_COPY (item->email->outlook_recipient, (char*));
1732 DEBUG_EMAIL(("%s\n", item->email->outlook_recipient));
1733 //INC_CHECK_X();
1734 break;
1735 case 0x0052: // PR_RCVD_REPRESENTING_SEARCH_KEY Recipient Address 2
1736 DEBUG_EMAIL(("Received on behalf of Address (Search Key) - "));
1737 MALLOC_EMAIL(item);
1738 LIST_COPY(item->email->outlook_recipient2, (char*));
1739 DEBUG_EMAIL(("%s\n", item->email->outlook_recipient2));
1740 //INC_CHECK_X();
1741 break;
1742 case 0x0057: // PR_MESSAGE_TO_ME
1743 // this user is listed explicitly in the TO address
1744 DEBUG_EMAIL(("My address in TO field - "));
1745 MALLOC_EMAIL(item);
1746 if (*(int16_t*)list->items[x]->data != 0) {
1747 DEBUG_EMAIL(("True\n"));
1748 item->email->message_to_me = 1;
1749 } else {
1750 DEBUG_EMAIL(("False\n"));
1751 item->email->message_to_me = 0;
1752 }
1753 //INC_CHECK_X();
1754 break;
1755 case 0x0058: // PR_MESSAGE_CC_ME
1756 // this user is listed explicitly in the CC address
1757 DEBUG_EMAIL(("My address in CC field - "));
1758 MALLOC_EMAIL(item);
1759 if (*(int16_t*)list->items[x]->data != 0) {
1760 DEBUG_EMAIL(("True\n"));
1761 item->email->message_cc_me = 1;
1762 } else {
1763 DEBUG_EMAIL(("False\n"));
1764 item->email->message_cc_me = 0;
1765 }
1766 //INC_CHECK_X();
1767 break;
1768 case 0x0059: //PR_MESSAGE_RECIP_ME
1769 // this user appears in TO, CC or BCC address list
1770 DEBUG_EMAIL(("Message addressed to me - "));
1771 MALLOC_EMAIL(item);
1772 if (*(int16_t*)list->items[x]->data != 0) {
1773 DEBUG_EMAIL(("True\n"));
1774 item->email->message_recip_me = 1;
1775 } else {
1776 DEBUG_EMAIL(("False\n"));
1777 item->email->message_recip_me = 0;
1778 }
1779 //INC_CHECK_X();
1780 break;
1781 case 0x0063: // PR_RESPONSE_REQUESTED
1782 DEBUG_EMAIL(("Response requested - "));
1783 if (*(int16_t*)list->items[x]->data != 0) {
1784 DEBUG_EMAIL(("True\n"));
1785 item->response_requested = 1;
1786 } else {
1787 DEBUG_EMAIL(("False\n"));
1788 item->response_requested = 0;
1789 }
1790 break;
1791 case 0x0064: // PR_SENT_REPRESENTING_ADDRTYPE Access method for Sender Address
1792 DEBUG_EMAIL(("Sent on behalf of address type - "));
1793 MALLOC_EMAIL(item);
1794 LIST_COPY(item->email->sender_access, (char*));
1795 DEBUG_EMAIL(("%s\n", item->email->sender_access));
1796 //INC_CHECK_X();
1797 break;
1798 case 0x0065: // PR_SENT_REPRESENTING_EMAIL_ADDRESS Sender Address
1799 DEBUG_EMAIL(("Sent on behalf of Address - "));
1800 MALLOC_EMAIL(item);
1801 LIST_COPY(item->email->sender_address, (char*));
1802 DEBUG_EMAIL(("%s\n", item->email->sender_address));
1803 //INC_CHECK_X();
1804 break;
1805 case 0x0070: // PR_CONVERSATION_TOPIC Processed Subject
1806 DEBUG_EMAIL(("Processed Subject (Conversation Topic) - "));
1807 MALLOC_EMAIL(item);
1808 LIST_COPY(item->email->proc_subject, (char*));
1809 DEBUG_EMAIL(("%s\n", item->email->proc_subject));
1810 //INC_CHECK_X();
1811 break;
1812 case 0x0071: // PR_CONVERSATION_INDEX Date 2
1813 DEBUG_EMAIL(("Conversation Index - "));
1814 MALLOC_EMAIL(item);
1815 memcpy(&(item->email->conv_index), list->items[x]->data, sizeof(item->email->conv_index));
1816 DEBUG_EMAIL(("%i\n", item->email->conv_index));
1817 //INC_CHECK_X();
1818 break;
1819 case 0x0075: // PR_RECEIVED_BY_ADDRTYPE Recipient Access Method
1820 DEBUG_EMAIL(("Received by Address type - "));
1821 MALLOC_EMAIL(item);
1822 LIST_COPY(item->email->recip_access, (char*));
1823 DEBUG_EMAIL(("%s\n", item->email->recip_access));
1824 //INC_CHECK_X();
1825 break;
1826 case 0x0076: // PR_RECEIVED_BY_EMAIL_ADDRESS Recipient Address
1827 DEBUG_EMAIL(("Received by Address - "));
1828 MALLOC_EMAIL(item);
1829 LIST_COPY(item->email->recip_address, (char*));
1830 DEBUG_EMAIL(("%s\n", item->email->recip_address));
1831 //INC_CHECK_X();
1832 break;
1833 case 0x0077: // PR_RCVD_REPRESENTING_ADDRTYPE Recipient Access Method 2
1834 DEBUG_EMAIL(("Received on behalf of Address type - "));
1835 MALLOC_EMAIL(item);
1836 LIST_COPY(item->email->recip2_access, (char*));
1837 DEBUG_EMAIL(("%s\n", item->email->recip2_access));
1838 //INC_CHECK_X();
1839 break;
1840 case 0x0078: // PR_RCVD_REPRESENTING_EMAIL_ADDRESS Recipient Address 2
1841 DEBUG_EMAIL(("Received on behalf of Address -"));
1842 MALLOC_EMAIL(item);
1843 LIST_COPY(item->email->recip2_address, (char*));
1844 DEBUG_EMAIL(("%s\n", item->email->recip2_address));
1845 //INC_CHECK_X();
1846 break;
1847 case 0x007D: // PR_TRANSPORT_MESSAGE_HEADERS Internet Header
1848 DEBUG_EMAIL(("Internet Header - "));
1849 MALLOC_EMAIL(item);
1850 LIST_COPY(item->email->header, (char*));
1851 //DEBUG_EMAIL(("%s\n", item->email->header));
1852 DEBUG_EMAIL(("NOT PRINTED\n"));
1853 //INC_CHECK_X();
1854 break;
1855 case 0x0C17: // PR_REPLY_REQUESTED
1856 DEBUG_EMAIL(("Reply Requested - "));
1857 MALLOC_EMAIL(item);
1858 if (*(int16_t*)list->items[x]->data != 0) {
1859 DEBUG_EMAIL(("True\n"));
1860 item->email->reply_requested = 1;
1861 } else {
1862 DEBUG_EMAIL(("False\n"));
1863 item->email->reply_requested = 0;
1864 }
1865 break;
1866 case 0x0C19: // PR_SENDER_ENTRYID Sender Structure 2
1867 DEBUG_EMAIL(("Sender Structure 2 -- NOT HANDLED\n"));
1868 //INC_CHECK_X();
1869 break;
1870 case 0x0C1A: // PR_SENDER_NAME Name of Sender Structure 2
1871 DEBUG_EMAIL(("Name of Sender Structure 2 -- NOT HANDLED\n"));
1872 //INC_CHECK_X();
1873 break;
1874 case 0x0C1D: // PR_SENDER_SEARCH_KEY Name of Sender Address 2
1875 DEBUG_EMAIL(("Name of Sender Address 2 (Sender search key) - "));
1876 MALLOC_EMAIL(item);
1877 LIST_COPY(item->email->outlook_sender2, (char*));
1878 DEBUG_EMAIL(("%s\n", item->email->outlook_sender2));
1879 //INC_CHECK_X();
1880 break;
1881 case 0x0C1E: // PR_SENDER_ADDRTYPE Sender Address 2 access method
1882 DEBUG_EMAIL(("Sender Address type - "));
1883 MALLOC_EMAIL(item);
1884 LIST_COPY(item->email->sender2_access, (char*));
1885 DEBUG_EMAIL(("%s\n", item->email->sender2_access));
1886 //INC_CHECK_X();
1887 break;
1888 case 0x0C1F: // PR_SENDER_EMAIL_ADDRESS Sender Address 2
1889 DEBUG_EMAIL(("Sender Address - "));
1890 MALLOC_EMAIL(item);
1891 LIST_COPY(item->email->sender2_address, (char*));
1892 DEBUG_EMAIL(("%s\n", item->email->sender2_address));
1893 //INC_CHECK_X();
1894 break;
1895 case 0x0E01: // PR_DELETE_AFTER_SUBMIT
1896 // I am not too sure how this works
1897 DEBUG_EMAIL(("Delete after submit - "));
1898 MALLOC_EMAIL(item);
1899 if (*(int16_t*) list->items[x]->data != 0) {
1900 DEBUG_EMAIL(("True\n"));
1901 item->email->delete_after_submit = 1;
1902 } else {
1903 DEBUG_EMAIL(("False\n"));
1904 item->email->delete_after_submit = 0;
1905 }
1906 //INC_CHECK_X();
1907 break;
1908 case 0x0E03: // PR_DISPLAY_CC CC Addresses
1909 DEBUG_EMAIL(("Display CC Addresses - "));
1910 MALLOC_EMAIL(item);
1911 LIST_COPY(item->email->cc_address, (char*));
1912 DEBUG_EMAIL(("%s\n", item->email->cc_address));
1913 //INC_CHECK_X();
1914 break;
1915 case 0x0E04: // PR_DISPLAY_TO Address Sent-To
1916 DEBUG_EMAIL(("Display Sent-To Address - "));
1917 MALLOC_EMAIL(item);
1918 LIST_COPY(item->email->sentto_address, (char*));
1919 DEBUG_EMAIL(("%s\n", item->email->sentto_address));
1920 //INC_CHECK_X();
1921 break;
1922 case 0x0E06: // PR_MESSAGE_DELIVERY_TIME Date 3 - Email Arrival Date
1923 DEBUG_EMAIL(("Date 3 (Delivery Time) - "));
1924 MALLOC_EMAIL(item);
1925 LIST_COPY(item->email->arrival_date, (FILETIME*));
1926 DEBUG_EMAIL(("%s", fileTimeToAscii(item->email->arrival_date)));
1927 //INC_CHECK_X();
1928 break;
1929 case 0x0E07: // PR_MESSAGE_FLAGS Email Flag
1930 // 0x01 - Read
1931 // 0x02 - Unmodified
1932 // 0x04 - Submit
1933 // 0x08 - Unsent
1934 // 0x10 - Has Attachments
1935 // 0x20 - From Me
1936 // 0x40 - Associated
1937 // 0x80 - Resend
1938 // 0x100 - RN Pending
1939 // 0x200 - NRN Pending
1940 DEBUG_EMAIL(("Message Flags - "));
1941 MALLOC_EMAIL(item);
1942 memcpy(&(item->email->flag), list->items[x]->data, sizeof(item->email->flag));
1943 LE32_CPU(item->email->flag);
1944 DEBUG_EMAIL(("%i\n", item->email->flag));
1945 //INC_CHECK_X();
1946 break;
1947 case 0x0E08: // PR_MESSAGE_SIZE Total size of a message object
1948 DEBUG_EMAIL(("Message Size - "));
1949 memcpy(&(item->message_size), list->items[x]->data, sizeof(item->message_size));
1950 LE32_CPU(item->message_size);
1951 DEBUG_EMAIL(("%i [%#x]\n", item->message_size, item->message_size));
1952 //INC_CHECK_X();
1953 break;
1954 case 0x0E0A: // PR_SENTMAIL_ENTRYID
1955 // folder that this message is sent to after submission
1956 DEBUG_EMAIL(("Sentmail EntryID - "));
1957 MALLOC_EMAIL(item);
1958 LIST_COPY(item->email->sentmail_folder, (pst_entryid*));
1959 LE32_CPU(item->email->sentmail_folder->id);
1960 DEBUG_EMAIL(("[id = %#x]\n", item->email->sentmail_folder->id));
1961 //INC_CHECK_X();
1962 break;
1963 case 0x0E1F: // PR_RTF_IN_SYNC
1964 // True means that the rtf version is same as text body
1965 // False means rtf version is more up-to-date than text body
1966 // if this value doesn't exist, text body is more up-to-date than rtf and
1967 // cannot update to the rtf
1968 DEBUG_EMAIL(("Compressed RTF in Sync - "));
1969 MALLOC_EMAIL(item);
1970 if (*(int16_t*)list->items[x]->data != 0) {
1971 DEBUG_EMAIL(("True\n"));
1972 item->email->rtf_in_sync = 1;
1973 } else {
1974 DEBUG_EMAIL(("False\n"));
1975 item->email->rtf_in_sync = 0;
1976 }
1977 //INC_CHECK_X();
1978 break;
1979 case 0x0E20: // PR_ATTACH_SIZE binary Attachment data in record
1980 DEBUG_EMAIL(("Attachment Size - "));
1981 NULL_CHECK(attach);
1982 MOVE_NEXT(attach);
1983 memcpy(&(attach->size), list->items[x]->data,
1984 sizeof(attach->size));
1985 DEBUG_EMAIL(("%i\n", attach->size));
1986 //INC_CHECK_X();
1987 break;
1988 case 0x0FF9: // PR_RECORD_KEY Record Header 1
1989 DEBUG_EMAIL(("Record Key 1 - "));
1990 LIST_COPY(item->record_key, (char*));
1991 item->record_key_size = list->items[x]->size;
1992 DEBUG_EMAIL_HEXPRINT(item->record_key, item->record_key_size);
1993 DEBUG_EMAIL(("\n"));
1994 //INC_CHECK_X();
1995 break;
1996 case 0x1000: // PR_BODY Plain Text body
1997 DEBUG_EMAIL(("Plain Text body - "));
1998 MALLOC_EMAIL(item);
1999 LIST_COPY(item->email->body, (char*));
2000 //DEBUG_EMAIL("%s\n", item->email->body);
2001 DEBUG_EMAIL(("NOT PRINTED\n"));
2002 //INC_CHECK_X();
2003 break;
2004 case 0x1006: // PR_RTF_SYNC_BODY_CRC
2005 DEBUG_EMAIL(("RTF Sync Body CRC - "));
2006 MALLOC_EMAIL(item);
2007 memcpy(&(item->email->rtf_body_crc), list->items[x]->data,
2008 sizeof(item->email->rtf_body_crc));
2009 LE32_CPU(item->email->rtf_body_crc);
2010 DEBUG_EMAIL(("%#x\n", item->email->rtf_body_crc));
2011 //INC_CHECK_X();
2012 break;
2013 case 0x1007: // PR_RTF_SYNC_BODY_COUNT
2014 // a count of the *significant* charcters in the rtf body. Doesn't count
2015 // whitespace and other ignorable characters
2016 DEBUG_EMAIL(("RTF Sync Body character count - "));
2017 MALLOC_EMAIL(item);
2018 memcpy(&(item->email->rtf_body_char_count), list->items[x]->data,
2019 sizeof(item->email->rtf_body_char_count));
2020 LE32_CPU(item->email->rtf_body_char_count);
2021 DEBUG_EMAIL(("%i [%#x]\n", item->email->rtf_body_char_count,
2022 item->email->rtf_body_char_count));
2023 //INC_CHECK_X();
2024 break;
2025 case 0x1008: // PR_RTF_SYNC_BODY_TAG
2026 // the first couple of lines of RTF body so that after modification, then beginning can
2027 // once again be found
2028 DEBUG_EMAIL(("RTF Sync body tag - "));
2029 MALLOC_EMAIL(item);
2030 LIST_COPY(item->email->rtf_body_tag, (char*));
2031 DEBUG_EMAIL(("%s\n", item->email->rtf_body_tag));
2032 //INC_CHECK_X();
2033 break;
2034 case 0x1009: // PR_RTF_COMPRESSED
2035 // some compression algorithm has been applied to this. At present
2036 // it is unknown
2037 DEBUG_EMAIL(("RTF Compressed body - "));
2038 MALLOC_EMAIL(item);
2039 LIST_COPY(item->email->rtf_compressed, (char*));
2040 // DEBUG_EMAIL(("Pointer: %p\n", item->email->rtf_compressed));
2041 DEBUG_EMAIL(("NOT PRINTED\n"));
2042 //INC_CHECK_X();
2043 break;
2044 case 0x1010: // PR_RTF_SYNC_PREFIX_COUNT
2045 // a count of the ignored characters before the first significant character
2046 DEBUG_EMAIL(("RTF whitespace prefix count - "));
2047 MALLOC_EMAIL(item);
2048 memcpy(&(item->email->rtf_ws_prefix_count), list->items[x]->data,
2049 sizeof(item->email->rtf_ws_prefix_count));
2050 DEBUG_EMAIL(("%i\n", item->email->rtf_ws_prefix_count));
2051 //INC_CHECK_X();
2052 break;
2053 case 0x1011: // PR_RTF_SYNC_TRAILING_COUNT
2054 // a count of the ignored characters after the last significant character
2055 DEBUG_EMAIL(("RTF whitespace tailing count - "));
2056 MALLOC_EMAIL(item);
2057 memcpy(&(item->email->rtf_ws_trailing_count), list->items[x]->data,
2058 sizeof(item->email->rtf_ws_trailing_count));
2059 DEBUG_EMAIL(("%i\n", item->email->rtf_ws_trailing_count));
2060 //INC_CHECK_X();
2061 break;
2062 case 0x1013: // HTML body
2063 DEBUG_EMAIL(("HTML body - "));
2064 MALLOC_EMAIL(item);
2065 LIST_COPY(item->email->htmlbody, (char*));
2066 // DEBUG_EMAIL(("%s\n", item->email->htmlbody));
2067 DEBUG_EMAIL(("NOT PRINTED\n"));
2068 //INC_CHECK_X();
2069 break;
2070 case 0x1035: // Message ID
2071 DEBUG_EMAIL(("Message ID - "));
2072 MALLOC_EMAIL(item);
2073 LIST_COPY(item->email->messageid, (char*));
2074 DEBUG_EMAIL(("%s\n", item->email->messageid));
2075 //INC_CHECK_X();
2076 break;
2077 case 0x1042: // in-reply-to
2078 DEBUG_EMAIL(("In-Reply-To - "));
2079 MALLOC_EMAIL(item);
2080 LIST_COPY(item->email->in_reply_to, (char*));
2081 DEBUG_EMAIL(("%s\n", item->email->in_reply_to));
2082 //INC_CHECK_X();
2083 break;
2084 case 0x1046: // Return Path
2085 DEBUG_EMAIL(("Return Path - "));
2086 MALLOC_EMAIL(item);
2087 LIST_COPY(item->email->return_path_address, (char*));
2088 DEBUG_EMAIL(("%s\n", item->email->return_path_address));
2089 //INC_CHECK_X();
2090 break;
2091 case 0x3001: // PR_DISPLAY_NAME File As
2092 DEBUG_EMAIL(("Display Name - "));
2093 LIST_COPY(item->file_as, (char*));
2094 DEBUG_EMAIL(("%s\n", item->file_as));
2095 //INC_CHECK_X();
2096 break;
2097 case 0x3002: // PR_ADDRTYPE
2098 DEBUG_EMAIL(("Address Type - "));
2099 MALLOC_CONTACT(item);
2100 LIST_COPY(item->contact->address1_transport, (char*));
2101 DEBUG_EMAIL(("%s\n", item->contact->address1_transport));
2102 //INC_CHECK_X();
2103 break;
2104 case 0x3003: // PR_EMAIL_ADDRESS
2105 // Contact's email address
2106 DEBUG_EMAIL(("Contact Address - "));
2107 MALLOC_CONTACT(item);
2108 LIST_COPY(item->contact->address1, (char*));
2109 DEBUG_EMAIL(("%s\n", item->contact->address1));
2110 //INC_CHECK_X();
2111 break;
2112 case 0x3004: // PR_COMMENT Comment for item - usually folders
2113 DEBUG_EMAIL(("Comment - "));
2114 LIST_COPY(item->comment, (char*));
2115 DEBUG_EMAIL(("%s\n", item->comment));
2116 //INC_CHECK_X();
2117 break;
2118 case 0x3007: // PR_CREATION_TIME Date 4 - Creation Date?
2119 DEBUG_EMAIL(("Date 4 (Item Creation Date) - "));
2120 LIST_COPY(item->create_date, (FILETIME*));
2121 DEBUG_EMAIL(("%s", fileTimeToAscii(item->create_date)));
2122 //INC_CHECK_X();
2123 break;
2124 case 0x3008: // PR_LAST_MODIFICATION_TIME Date 5 - Modify Date
2125 DEBUG_EMAIL(("Date 5 (Modify Date) - "));
2126 LIST_COPY(item->modify_date, (FILETIME*));
2127 DEBUG_EMAIL(("%s", fileTimeToAscii(item->modify_date)));
2128 //INC_CHECK_X();
2129 break;
2130 case 0x300B: // PR_SEARCH_KEY Record Header 2
2131 DEBUG_EMAIL(("Record Search 2 -- NOT HANDLED\n"));
2132 //INC_CHECK_X();
2133 break;
2134 case 0x35DF: // PR_VALID_FOLDER_MASK
2135 // States which folders are valid for this message store
2136 // FOLDER_IPM_SUBTREE_VALID 0x1
2137 // FOLDER_IPM_INBOX_VALID 0x2
2138 // FOLDER_IPM_OUTBOX_VALID 0x4
2139 // FOLDER_IPM_WASTEBOX_VALID 0x8
2140 // FOLDER_IPM_SENTMAIL_VALID 0x10
2141 // FOLDER_VIEWS_VALID 0x20
2142 // FOLDER_COMMON_VIEWS_VALID 0x40
2143 // FOLDER_FINDER_VALID 0x80
2144 DEBUG_EMAIL(("Valid Folder Mask - "));
2145 MALLOC_MESSAGESTORE(item);
2146 memcpy(&(item->message_store->valid_mask), list->items[x]->data, sizeof(int));
2147 LE32_CPU(item->message_store->valid_mask);
2148 DEBUG_EMAIL(("%i\n", item->message_store->valid_mask));
2149 //INC_CHECK_X();
2150 break;
2151 case 0x35E0: // PR_IPM_SUBTREE_ENTRYID Top of Personal Folder Record
2152 DEBUG_EMAIL(("Top of Personal Folder Record - "));
2153 MALLOC_MESSAGESTORE(item);
2154 LIST_COPY(item->message_store->top_of_personal_folder, (pst_entryid*));
2155 LE32_CPU(item->message_store->top_of_personal_folder->id);
2156 DEBUG_EMAIL(("[id = %#x]\n", item->message_store->top_of_personal_folder->id));
2157 //INC_CHECK_X();
2158 break;
2159 case 0x35E3: // PR_IPM_WASTEBASKET_ENTRYID Deleted Items Folder Record
2160 DEBUG_EMAIL(("Deleted Items Folder record - "));
2161 MALLOC_MESSAGESTORE(item);
2162 LIST_COPY(item->message_store->deleted_items_folder, (pst_entryid*));
2163 LE32_CPU(item->message_store->deleted_items_folder->id);
2164 DEBUG_EMAIL(("[id = %#x]\n", item->message_store->deleted_items_folder->id));
2165 //INC_CHECK_X();
2166 break;
2167 case 0x35E7: // PR_FINDER_ENTRYID Search Root Record
2168 DEBUG_EMAIL(("Search Root record - "));
2169 MALLOC_MESSAGESTORE(item);
2170 LIST_COPY(item->message_store->search_root_folder, (pst_entryid*));
2171 LE32_CPU(item->message_store->search_root_folder->id);
2172 DEBUG_EMAIL(("[id = %#x]\n", item->message_store->search_root_folder->id));
2173 //INC_CHECK_X();
2174 break;
2175 case 0x3602: // PR_CONTENT_COUNT Number of emails stored in a folder
2176 DEBUG_EMAIL(("Folder Email Count - "));
2177 MALLOC_FOLDER(item);
2178 memcpy(&(item->folder->email_count), list->items[x]->data, sizeof(item->folder->email_count));
2179 LE32_CPU(item->folder->email_count);
2180 DEBUG_EMAIL(("%i\n", item->folder->email_count));
2181 //INC_CHECK_X();
2182 break;
2183 case 0x3603: // PR_CONTENT_UNREAD Number of unread emails
2184 DEBUG_EMAIL(("Unread Email Count - "));
2185 MALLOC_FOLDER(item);
2186 memcpy(&(item->folder->unseen_email_count), list->items[x]->data, sizeof(item->folder->unseen_email_count));
2187 LE32_CPU(item->folder->unseen_email_count);
2188 DEBUG_EMAIL(("%i\n", item->folder->unseen_email_count));
2189 //INC_CHECK_X();
2190 break;
2191 case 0x360A: // PR_SUBFOLDERS Has children
2192 DEBUG_EMAIL(("Has Subfolders - "));
2193 MALLOC_FOLDER(item);
2194 if (*((int32_t*)list->items[x]->data) != 0) {
2195 DEBUG_EMAIL(("True\n"));
2196 item->folder->subfolder = 1;
2197 } else {
2198 DEBUG_EMAIL(("False\n"));
2199 item->folder->subfolder = 0;
2200 }
2201 //INC_CHECK_X();
2202 break;
2203 case 0x3613: // PR_CONTAINER_CLASS IPF.x
2204 DEBUG_EMAIL(("IPF.x - "));
2205 LIST_COPY(item->ascii_type, (char*));
2206 if (strncmp("IPF.Note", item->ascii_type, 8) == 0)
2207 item->type = PST_TYPE_NOTE;
2208 else if (strncmp("IPF.Contact", item->ascii_type, 11) == 0)
2209 item->type = PST_TYPE_CONTACT;
2210 else if (strncmp("IPF.Journal", item->ascii_type, 11) == 0)
2211 item->type = PST_TYPE_JOURNAL;
2212 else if (strncmp("IPF.Appointment", item->ascii_type, 15) == 0)
2213 item->type = PST_TYPE_APPOINTMENT;
2214 else if (strncmp("IPF.StickyNote", item->ascii_type, 14) == 0)
2215 item->type = PST_TYPE_STICKYNOTE;
2216 else if (strncmp("IPF.Task", item->ascii_type, 8) == 0)
2217 item->type = PST_TYPE_TASK;
2218 else
2219 item->type = PST_TYPE_OTHER;
2220
2221 DEBUG_EMAIL(("%s [%i]\n", item->ascii_type, item->type));
2222 //INC_CHECK_X();
2223 break;
2224 case 0x3617: // PR_ASSOC_CONTENT_COUNT
2225 // associated content are items that are attached to this folder
2226 // but are hidden from users
2227 DEBUG_EMAIL(("Associate Content count - "));
2228 MALLOC_FOLDER(item);
2229 memcpy(&(item->folder->assoc_count), list->items[x]->data, sizeof(item->folder->assoc_count));
2230 LE32_CPU(item->folder->assoc_count);
2231 DEBUG_EMAIL(("%i [%#x]\n", item->folder->assoc_count, item->folder->assoc_count));
2232 //INC_CHECK_X();
2233 break;
2234 case 0x3701: // PR_ATTACH_DATA_OBJ binary data of attachment
2235 DEBUG_EMAIL(("Binary Data [Size %i] - ",
2236 list->items[x]->size));
2237 NULL_CHECK(attach);
2238 MOVE_NEXT(attach);
2239 if (list->items[x]->data == NULL) { //special case
2240 attach->id2_val = list->items[x]->type;
2241 DEBUG_EMAIL(("Seen a Reference. The data hasn't been loaded yet. [%#x][%#x]\n",
2242 attach->id2_val, list->items[x]->type));
2243 } else {
2244 LIST_COPY(attach->data, (char*));
2245 attach->size = list->items[x]->size;
2246 DEBUG_EMAIL(("NOT PRINTED\n"));
2247 }
2248 //INC_CHECK_X();
2249 break;
2250 case 0x3704: // PR_ATTACH_FILENAME Attachment filename (8.3)
2251 DEBUG_EMAIL(("Attachment Filename - "));
2252 NULL_CHECK(attach);
2253 MOVE_NEXT(attach);
2254 LIST_COPY(attach->filename1, (char*));
2255 DEBUG_EMAIL(("%s\n", attach->filename1));
2256 //INC_CHECK_X();
2257 break;
2258 case 0x3705: // PR_ATTACH_METHOD
2259 // 0 - No Attachment
2260 // 1 - Attach by Value
2261 // 2 - Attach by reference
2262 // 3 - Attach by ref resolve
2263 // 4 - Attach by ref only
2264 // 5 - Embedded Message
2265 // 6 - OLE
2266 DEBUG_EMAIL(("Attachement method - "));
2267 NULL_CHECK(attach);
2268 MOVE_NEXT(attach);
2269 memcpy(&(attach->method), list->items[x]->data, sizeof(attach->method));
2270 LE32_CPU(attach->method);
2271 t = attach->method;
2272 DEBUG_EMAIL(("%s [%i]\n", (t==0?"No Attachment":
2273 (t==1?"Attach By Value":
2274 (t==2?"Attach By Reference":
2275 (t==3?"Attach by Ref. Resolve":
2276 (t==4?"Attach by Ref. Only":
2277 (t==5?"Embedded Message":"OLE")))))),t));
2278 //INC_CHECK_X();
2279 break;
2280 case 0x370B: // PR_RENDERING_POSITION
2281 // position in characters that the attachment appears in the plain text body
2282 DEBUG_EMAIL(("Attachment Position - "));
2283 NULL_CHECK(attach);
2284 MOVE_NEXT(attach);
2285 memcpy(&(attach->position), list->items[x]->data, sizeof(attach->position));
2286 LE32_CPU(attach->position);
2287 DEBUG_EMAIL(("%i [%#x]\n", attach->position));
2288 //INC_CHECK_X();
2289 break;
2290 case 0x3707: // PR_ATTACH_LONG_FILENAME Attachment filename (long?)
2291 DEBUG_EMAIL(("Attachment Filename long - "));
2292 NULL_CHECK(attach);
2293 MOVE_NEXT(attach);
2294 LIST_COPY(attach->filename2, (char*));
2295 DEBUG_EMAIL(("%s\n", attach->filename2));
2296 //INC_CHECK_X();
2297 break;
2298 case 0x370E: // PR_ATTACH_MIME_TAG Mime type of encoding
2299 DEBUG_EMAIL(("Attachment mime encoding - "));
2300 NULL_CHECK(attach);
2301 MOVE_NEXT(attach);
2302 LIST_COPY(attach->mimetype, (char*));
2303 DEBUG_EMAIL(("%s\n", attach->mimetype));
2304 //INC_CHECK_X();
2305 break;
2306 case 0x3710: // PR_ATTACH_MIME_SEQUENCE
2307 // sequence number for mime parts. Includes body
2308 DEBUG_EMAIL(("Attachment Mime Sequence - "));
2309 NULL_CHECK(attach);
2310 MOVE_NEXT(attach);
2311 memcpy(&(attach->sequence), list->items[x]->data, sizeof(attach->sequence));
2312 LE32_CPU(attach->sequence);
2313 DEBUG_EMAIL(("%i\n", attach->sequence));
2314 //INC_CHECK_X();
2315 break;
2316 case 0x3A00: // PR_ACCOUNT
2317 DEBUG_EMAIL(("Contact's Account name - "));
2318 MALLOC_CONTACT(item);
2319 LIST_COPY(item->contact->account_name, (char*));
2320 DEBUG_EMAIL(("%s\n", item->contact->account_name));
2321 break;
2322 case 0x3A01: // PR_ALTERNATE_RECIPIENT
2323 DEBUG_EMAIL(("Contact Alternate Recipient - NOT PROCESSED\n"));
2324 break;
2325 case 0x3A02: // PR_CALLBACK_TELEPHONE_NUMBER
2326 DEBUG_EMAIL(("Callback telephone number - "));
2327 MALLOC_CONTACT(item);
2328 LIST_COPY(item->contact->callback_phone, (char*));
2329 DEBUG_EMAIL(("%s\n", item->contact->callback_phone));
2330 break;
2331 case 0x3A03: // PR_CONVERSION_PROHIBITED
2332 DEBUG_EMAIL(("Message Conversion Prohibited - "));
2333 MALLOC_EMAIL(item);
2334 if (*(int16_t*)list->items[x]->data != 0) {
2335 DEBUG_EMAIL(("True\n"));
2336 item->email->conversion_prohib = 1;
2337 } else {
2338 DEBUG_EMAIL(("False\n"));
2339 item->email->conversion_prohib = 0;
2340 }
2341 break;
2342 case 0x3A05: // PR_GENERATION suffix
2343 DEBUG_EMAIL(("Contacts Suffix - "));
2344 MALLOC_CONTACT(item);
2345 LIST_COPY(item->contact->suffix, (char*));
2346 DEBUG_EMAIL(("%s\n", item->contact->suffix));
2347 break;
2348 case 0x3A06: // PR_GIVEN_NAME Contact's first name
2349 DEBUG_EMAIL(("Contacts First Name - "));
2350 MALLOC_CONTACT(item);
2351 LIST_COPY(item->contact->first_name, (char*));
2352 DEBUG_EMAIL(("%s\n", item->contact->first_name));
2353 //INC_CHECK_X();
2354 break;
2355 case 0x3A07: // PR_GOVERNMENT_ID_NUMBER
2356 DEBUG_EMAIL(("Contacts Government ID Number - "));
2357 MALLOC_CONTACT(item);
2358 LIST_COPY(item->contact->gov_id, (char*));
2359 DEBUG_EMAIL(("%s\n", item->contact->gov_id));
2360 break;
2361 case 0x3A08: // PR_BUSINESS_TELEPHONE_NUMBER
2362 DEBUG_EMAIL(("Business Telephone Number - "));
2363 MALLOC_CONTACT(item);
2364 LIST_COPY(item->contact->business_phone, (char*));
2365 DEBUG_EMAIL(("%s\n", item->contact->business_phone));
2366 break;
2367 case 0x3A09: // PR_HOME_TELEPHONE_NUMBER
2368 DEBUG_EMAIL(("Home Telephone Number - "));
2369 MALLOC_CONTACT(item);
2370 LIST_COPY(item->contact->home_phone, (char*));
2371 DEBUG_EMAIL(("%s\n", item->contact->home_phone));
2372 break;
2373 case 0x3A0A: // PR_INITIALS Contact's Initials
2374 DEBUG_EMAIL(("Contacts Initials - "));
2375 MALLOC_CONTACT(item);
2376 LIST_COPY(item->contact->initials, (char*));
2377 DEBUG_EMAIL(("%s\n", item->contact->initials));
2378 //INC_CHECK_X();
2379 break;
2380 case 0x3A0B: // PR_KEYWORD
2381 DEBUG_EMAIL(("Keyword - "));
2382 MALLOC_CONTACT(item);
2383 LIST_COPY(item->contact->keyword, (char*));
2384 DEBUG_EMAIL(("%s\n", item->contact->keyword));
2385 break;
2386 case 0x3A0C: // PR_LANGUAGE
2387 DEBUG_EMAIL(("Contact's Language - "));
2388 MALLOC_CONTACT(item);
2389 LIST_COPY(item->contact->language, (char*));
2390 DEBUG_EMAIL(("%s\n", item->contact->language));
2391 break;
2392 case 0x3A0D: // PR_LOCATION
2393 DEBUG_EMAIL(("Contact's Location - "));
2394 MALLOC_CONTACT(item);
2395 LIST_COPY(item->contact->location, (char*));
2396 DEBUG_EMAIL(("%s\n", item->contact->location));
2397 break;
2398 case 0x3A0E: // PR_MAIL_PERMISSION - Can the recipient receive and send email
2399 DEBUG_EMAIL(("Mail Permission - "));
2400 MALLOC_CONTACT(item);
2401 if (*(int16_t*)list->items[x]->data != 0) {
2402 DEBUG_EMAIL(("True\n"));
2403 item->contact->mail_permission = 1;
2404 } else {
2405 DEBUG_EMAIL(("False\n"));
2406 item->contact->mail_permission = 0;
2407 }
2408 break;
2409 case 0x3A0F: // PR_MHS_COMMON_NAME
2410 DEBUG_EMAIL(("MHS Common Name - "));
2411 MALLOC_EMAIL(item);
2412 LIST_COPY(item->email->common_name, (char*));
2413 DEBUG_EMAIL(("%s\n", item->email->common_name));
2414 break;
2415 case 0x3A10: // PR_ORGANIZATIONAL_ID_NUMBER
2416 DEBUG_EMAIL(("Organizational ID # - "));
2417 MALLOC_CONTACT(item);
2418 LIST_COPY(item->contact->org_id, (char*));
2419 DEBUG_EMAIL(("%s\n", item->contact->org_id));
2420 break;
2421 case 0x3A11: // PR_SURNAME Contact's Surname
2422 DEBUG_EMAIL(("Contacts Surname - "));
2423 MALLOC_CONTACT(item);
2424 LIST_COPY(item->contact->surname, (char*));
2425 DEBUG_EMAIL(("%s\n", item->contact->surname));
2426 //INC_CHECK_X();
2427 break;
2428 case 0x3A12: // PR_ORIGINAL_ENTRY_ID
2429 DEBUG_EMAIL(("Original Entry ID - NOT PROCESSED\n"));
2430 break;
2431 case 0x3A13: // PR_ORIGINAL_DISPLAY_NAME
2432 DEBUG_EMAIL(("Original Display Name - NOT PROCESSED\n"));
2433 break;
2434 case 0x3A14: // PR_ORIGINAL_SEARCH_KEY
2435 DEBUG_EMAIL(("Original Search Key - NOT PROCESSED\n"));
2436 break;
2437 case 0x3A15: // PR_POSTAL_ADDRESS
2438 DEBUG_EMAIL(("Default Postal Address - "));
2439 MALLOC_CONTACT(item);
2440 LIST_COPY(item->contact->def_postal_address, (char*));
2441 DEBUG_EMAIL(("%s\n", item->contact->def_postal_address));
2442 break;
2443 case 0x3A16: // PR_COMPANY_NAME
2444 DEBUG_EMAIL(("Company Name - "));
2445 MALLOC_CONTACT(item);
2446 LIST_COPY(item->contact->company_name, (char*));
2447 DEBUG_EMAIL(("%s\n", item->contact->company_name));
2448 break;
2449 case 0x3A17: // PR_TITLE - Job Title
2450 DEBUG_EMAIL(("Job Title - "));
2451 MALLOC_CONTACT(item);
2452 LIST_COPY(item->contact->job_title, (char*));
2453 DEBUG_EMAIL(("%s\n", item->contact->job_title));
2454 break;
2455 case 0x3A18: // PR_DEPARTMENT_NAME
2456 DEBUG_EMAIL(("Department Name - "));
2457 MALLOC_CONTACT(item);
2458 LIST_COPY(item->contact->department, (char*));
2459 DEBUG_EMAIL(("%s\n", item->contact->department));
2460 break;
2461 case 0x3A19: // PR_OFFICE_LOCATION
2462 DEBUG_EMAIL(("Office Location - "));
2463 MALLOC_CONTACT(item);
2464 LIST_COPY(item->contact->office_loc, (char*));
2465 DEBUG_EMAIL(("%s\n", item->contact->office_loc));
2466 break;
2467 case 0x3A1A: // PR_PRIMARY_TELEPHONE_NUMBER
2468 DEBUG_EMAIL(("Primary Telephone - "));
2469 MALLOC_CONTACT(item);
2470 LIST_COPY(item->contact->primary_phone, (char*));
2471 DEBUG_EMAIL(("%s\n", item->contact->primary_phone));
2472 break;
2473 case 0x3A1B: // PR_BUSINESS2_TELEPHONE_NUMBER
2474 DEBUG_EMAIL(("Business Phone Number 2 - "));
2475 MALLOC_CONTACT(item);
2476 LIST_COPY(item->contact->business_phone2, (char*));
2477 DEBUG_EMAIL(("%s\n", item->contact->business_phone2));
2478 break;
2479 case 0x3A1C: // PR_MOBILE_TELEPHONE_NUMBER
2480 DEBUG_EMAIL(("Mobile Phone Number - "));
2481 MALLOC_CONTACT(item);
2482 LIST_COPY(item->contact->mobile_phone, (char*));
2483 DEBUG_EMAIL(("%s\n", item->contact->mobile_phone));
2484 break;
2485 case 0x3A1D: // PR_RADIO_TELEPHONE_NUMBER
2486 DEBUG_EMAIL(("Radio Phone Number - "));
2487 MALLOC_CONTACT(item);
2488 LIST_COPY(item->contact->radio_phone, (char*));
2489 DEBUG_EMAIL(("%s\n", item->contact->radio_phone));
2490 break;
2491 case 0x3A1E: // PR_CAR_TELEPHONE_NUMBER
2492 DEBUG_EMAIL(("Car Phone Number - "));
2493 MALLOC_CONTACT(item);
2494 LIST_COPY(item->contact->car_phone, (char*));
2495 DEBUG_EMAIL(("%s\n", item->contact->car_phone));
2496 break;
2497 case 0x3A1F: // PR_OTHER_TELEPHONE_NUMBER
2498 DEBUG_EMAIL(("Other Phone Number - "));
2499 MALLOC_CONTACT(item);
2500 LIST_COPY(item->contact->other_phone, (char*));
2501 DEBUG_EMAIL(("%s\n", item->contact->other_phone));
2502 break;
2503 case 0x3A20: // PR_TRANSMITTABLE_DISPLAY_NAME
2504 DEBUG_EMAIL(("Transmittable Display Name - "));
2505 MALLOC_CONTACT(item);
2506 LIST_COPY(item->contact->transmittable_display_name, (char*));
2507 DEBUG_EMAIL(("%s\n", item->contact->transmittable_display_name));
2508 break;
2509 case 0x3A21: // PR_PAGER_TELEPHONE_NUMBER
2510 DEBUG_EMAIL(("Pager Phone Number - "));
2511 MALLOC_CONTACT(item);
2512 LIST_COPY(item->contact->pager_phone, (char*));
2513 DEBUG_EMAIL(("%s\n", item->contact->pager_phone));
2514 break;
2515 case 0x3A22: // PR_USER_CERTIFICATE
2516 DEBUG_EMAIL(("User Certificate - NOT PROCESSED"));
2517 break;
2518 case 0x3A23: // PR_PRIMARY_FAX_NUMBER
2519 DEBUG_EMAIL(("Primary Fax Number - "));
2520 MALLOC_CONTACT(item);
2521 LIST_COPY(item->contact->primary_fax, (char*));
2522 DEBUG_EMAIL(("%s\n", item->contact->primary_fax));
2523 break;
2524 case 0x3A24: // PR_BUSINESS_FAX_NUMBER
2525 DEBUG_EMAIL(("Business Fax Number - "));
2526 MALLOC_CONTACT(item);
2527 LIST_COPY(item->contact->business_fax, (char*));
2528 DEBUG_EMAIL(("%s\n", item->contact->business_fax));
2529 break;
2530 case 0x3A25: // PR_HOME_FAX_NUMBER
2531 DEBUG_EMAIL(("Home Fax Number - "));
2532 MALLOC_CONTACT(item);
2533 LIST_COPY(item->contact->home_fax, (char*));
2534 DEBUG_EMAIL(("%s\n", item->contact->home_fax));
2535 break;
2536 case 0x3A26: // PR_BUSINESS_ADDRESS_COUNTRY
2537 DEBUG_EMAIL(("Business Address Country - "));
2538 MALLOC_CONTACT(item);
2539 LIST_COPY(item->contact->business_country, (char*));
2540 DEBUG_EMAIL(("%s\n", item->contact->business_country));
2541 break;
2542 case 0x3A27: // PR_BUSINESS_ADDRESS_CITY
2543 DEBUG_EMAIL(("Business Address City - "));
2544 MALLOC_CONTACT(item);
2545 LIST_COPY(item->contact->business_city, (char*));
2546 DEBUG_EMAIL(("%s\n", item->contact->business_city));
2547 break;
2548 case 0x3A28: // PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE
2549 DEBUG_EMAIL(("Business Address State - "));
2550 MALLOC_CONTACT(item);
2551 LIST_COPY(item->contact->business_state, (char*));
2552 DEBUG_EMAIL(("%s\n", item->contact->business_state));
2553 break;
2554 case 0x3A29: // PR_BUSINESS_ADDRESS_STREET
2555 DEBUG_EMAIL(("Business Address Street - "));
2556 MALLOC_CONTACT(item);
2557 LIST_COPY(item->contact->business_street, (char*));
2558 DEBUG_EMAIL(("%s\n", item->contact->business_street));
2559 break;
2560 case 0x3A2A: // PR_BUSINESS_POSTAL_CODE
2561 DEBUG_EMAIL(("Business Postal Code - "));
2562 MALLOC_CONTACT(item);
2563 LIST_COPY(item->contact->business_postal_code, (char*));
2564 DEBUG_EMAIL(("%s\n", item->contact->business_postal_code));
2565 break;
2566 case 0x3A2B: // PR_BUSINESS_PO_BOX
2567 DEBUG_EMAIL(("Business PO Box - "));
2568 MALLOC_CONTACT(item);
2569 LIST_COPY(item->contact->business_po_box, (char*));
2570 DEBUG_EMAIL(("%s\n", item->contact->business_po_box));
2571 break;
2572 case 0x3A2C: // PR_TELEX_NUMBER
2573 DEBUG_EMAIL(("Telex Number - "));
2574 MALLOC_CONTACT(item);
2575 LIST_COPY(item->contact->telex, (char*));
2576 DEBUG_EMAIL(("%s\n", item->contact->telex));
2577 break;
2578 case 0x3A2D: // PR_ISDN_NUMBER
2579 DEBUG_EMAIL(("ISDN Number - "));
2580 MALLOC_CONTACT(item);
2581 LIST_COPY(item->contact->isdn_phone, (char*));
2582 DEBUG_EMAIL(("%s\n", item->contact->isdn_phone));
2583 break;
2584 case 0x3A2E: // PR_ASSISTANT_TELEPHONE_NUMBER
2585 DEBUG_EMAIL(("Assistant Phone Number - "));
2586 MALLOC_CONTACT(item);
2587 LIST_COPY(item->contact->assistant_phone, (char*));
2588 DEBUG_EMAIL(("%s\n", item->contact->assistant_phone));
2589 break;
2590 case 0x3A2F: // PR_HOME2_TELEPHONE_NUMBER
2591 DEBUG_EMAIL(("Home Phone 2 - "));
2592 MALLOC_CONTACT(item);
2593 LIST_COPY(item->contact->home_phone2, (char*));
2594 DEBUG_EMAIL(("%s\n", item->contact->home_phone2));
2595 break;
2596 case 0x3A30: // PR_ASSISTANT
2597 DEBUG_EMAIL(("Assistant's Name - "));
2598 MALLOC_CONTACT(item);
2599 LIST_COPY(item->contact->assistant_name, (char*));
2600 DEBUG_EMAIL(("%s\n", item->contact->assistant_name));
2601 break;
2602 case 0x3A40: // PR_SEND_RICH_INFO
2603 DEBUG_EMAIL(("Can receive Rich Text - "));
2604 MALLOC_CONTACT(item);
2605 if(*(int16_t*)list->items[x]->data != 0) {
2606 DEBUG_EMAIL(("True\n"));
2607 item->contact->rich_text = 1;
2608 } else {
2609 DEBUG_EMAIL(("False\n"));
2610 item->contact->rich_text = 0;
2611 }
2612 break;
2613 case 0x3A41: // PR_WEDDING_ANNIVERSARY
2614 DEBUG_EMAIL(("Wedding Anniversary - "));
2615 MALLOC_CONTACT(item);
2616 LIST_COPY(item->contact->wedding_anniversary, (FILETIME*));
2617 DEBUG_EMAIL(("%s\n", fileTimeToAscii(item->contact->wedding_anniversary)));
2618 break;
2619 case 0x3A42: // PR_BIRTHDAY
2620 DEBUG_EMAIL(("Birthday - "));
2621 MALLOC_CONTACT(item);
2622 LIST_COPY(item->contact->birthday, (FILETIME*));
2623 DEBUG_EMAIL(("%s\n", fileTimeToAscii(item->contact->birthday)));
2624 break;
2625 case 0x3A43: // PR_HOBBIES
2626 DEBUG_EMAIL(("Hobbies - "));
2627 MALLOC_CONTACT(item);
2628 LIST_COPY(item->contact->hobbies, (char*));
2629 DEBUG_EMAIL(("%s\n", item->contact->hobbies));
2630 break;
2631 case 0x3A44: // PR_MIDDLE_NAME
2632 DEBUG_EMAIL(("Middle Name - "));
2633 MALLOC_CONTACT(item);
2634 LIST_COPY(item->contact->middle_name, (char*));
2635 DEBUG_EMAIL(("%s\n", item->contact->middle_name));
2636 break;
2637 case 0x3A45: // PR_DISPLAY_NAME_PREFIX
2638 DEBUG_EMAIL(("Display Name Prefix (Title) - "));
2639 MALLOC_CONTACT(item);
2640 LIST_COPY(item->contact->display_name_prefix, (char*));
2641 DEBUG_EMAIL(("%s\n", item->contact->display_name_prefix));
2642 break;
2643 case 0x3A46: // PR_PROFESSION
2644 DEBUG_EMAIL(("Profession - "));
2645 MALLOC_CONTACT(item);
2646 LIST_COPY(item->contact->profession, (char*));
2647 DEBUG_EMAIL(("%s\n", item->contact->profession));
2648 break;
2649 case 0x3A47: // PR_PREFERRED_BY_NAME
2650 DEBUG_EMAIL(("Preferred By Name - "));
2651 MALLOC_CONTACT(item);
2652 LIST_COPY(item->contact->pref_name, (char*));
2653 DEBUG_EMAIL(("%s\n", item->contact->pref_name));
2654 break;
2655 case 0x3A48: // PR_SPOUSE_NAME
2656 DEBUG_EMAIL(("Spouse's Name - "));
2657 MALLOC_CONTACT(item);
2658 LIST_COPY(item->contact->spouse_name, (char*));
2659 DEBUG_EMAIL(("%s\n", item->contact->spouse_name));
2660 break;
2661 case 0x3A49: // PR_COMPUTER_NETWORK_NAME
2662 DEBUG_EMAIL(("Computer Network Name - "));
2663 MALLOC_CONTACT(item);
2664 LIST_COPY(item->contact->computer_name, (char*));
2665 DEBUG_EMAIL(("%s\n", item->contact->computer_name));
2666 break;
2667 case 0x3A4A: // PR_CUSTOMER_ID
2668 DEBUG_EMAIL(("Customer ID - "));
2669 MALLOC_CONTACT(item);
2670 LIST_COPY(item->contact->customer_id, (char*));
2671 DEBUG_EMAIL(("%s\n", item->contact->customer_id));
2672 break;
2673 case 0x3A4B: // PR_TTYTDD_PHONE_NUMBER
2674 DEBUG_EMAIL(("TTY/TDD Phone - "));
2675 MALLOC_CONTACT(item);
2676 LIST_COPY(item->contact->ttytdd_phone, (char*));
2677 DEBUG_EMAIL(("%s\n", item->contact->ttytdd_phone));
2678 break;
2679 case 0x3A4C: // PR_FTP_SITE
2680 DEBUG_EMAIL(("Ftp Site - "));
2681 MALLOC_CONTACT(item);
2682 LIST_COPY(item->contact->ftp_site, (char*));
2683 DEBUG_EMAIL(("%s\n", item->contact->ftp_site));
2684 break;
2685 case 0x3A4D: // PR_GENDER
2686 DEBUG_EMAIL(("Gender - "));
2687 MALLOC_CONTACT(item);
2688 memcpy(&item->contact->gender, list->items[x]->data, sizeof(int16_t));
2689 LE16_CPU(item->contact->gender);
2690 switch(item->contact->gender) {
2691 case 0:
2692 DEBUG_EMAIL(("Unspecified\n"));
2693 break;
2694 case 1:
2695 DEBUG_EMAIL(("Female\n"));
2696 break;
2697 case 2:
2698 DEBUG_EMAIL(("Male\n"));
2699 break;
2700 default:
2701 DEBUG_EMAIL(("Error processing\n"));
2702 }
2703 break;
2704 case 0x3A4E: // PR_MANAGER_NAME
2705 DEBUG_EMAIL(("Manager's Name - "));
2706 MALLOC_CONTACT(item);
2707 LIST_COPY(item->contact->manager_name, (char*));
2708 DEBUG_EMAIL(("%s\n", item->contact->manager_name));
2709 break;
2710 case 0x3A4F: // PR_NICKNAME
2711 DEBUG_EMAIL(("Nickname - "));
2712 MALLOC_CONTACT(item);
2713 LIST_COPY(item->contact->nickname, (char*));
2714 DEBUG_EMAIL(("%s\n", item->contact->nickname));
2715 break;
2716 case 0x3A50: // PR_PERSONAL_HOME_PAGE
2717 DEBUG_EMAIL(("Personal Home Page - "));
2718 MALLOC_CONTACT(item);
2719 LIST_COPY(item->contact->personal_homepage, (char*));
2720 DEBUG_EMAIL(("%s\n", item->contact->personal_homepage));
2721 break;
2722 case 0x3A51: // PR_BUSINESS_HOME_PAGE
2723 DEBUG_EMAIL(("Business Home Page - "));
2724 MALLOC_CONTACT(item);
2725 LIST_COPY(item->contact->business_homepage, (char*));
2726 DEBUG_EMAIL(("%s\n", item->contact->business_homepage));
2727 break;
2728 case 0x3A57: // PR_COMPANY_MAIN_PHONE_NUMBER
2729 DEBUG_EMAIL(("Company Main Phone - "));
2730 MALLOC_CONTACT(item);
2731 LIST_COPY(item->contact->company_main_phone, (char*));
2732 DEBUG_EMAIL(("%s\n", item->contact->company_main_phone));
2733 break;
2734 case 0x3A58: // PR_CHILDRENS_NAMES
2735 DEBUG_EMAIL(("Children's Names - NOT PROCESSED\n"));
2736 break;
2737 case 0x3A59: // PR_HOME_ADDRESS_CITY
2738 DEBUG_EMAIL(("Home Address City - "));
2739 MALLOC_CONTACT(item);
2740 LIST_COPY(item->contact->home_city, (char*));
2741 DEBUG_EMAIL(("%s\n", item->contact->home_city));
2742 break;
2743 case 0x3A5A: // PR_HOME_ADDRESS_COUNTRY
2744 DEBUG_EMAIL(("Home Address Country - "));
2745 MALLOC_CONTACT(item);
2746 LIST_COPY(item->contact->home_country, (char*));
2747 DEBUG_EMAIL(("%s\n", item->contact->home_country));
2748 break;
2749 case 0x3A5B: // PR_HOME_ADDRESS_POSTAL_CODE
2750 DEBUG_EMAIL(("Home Address Postal Code - "));
2751 MALLOC_CONTACT(item);
2752 LIST_COPY(item->contact->home_postal_code, (char*));
2753 DEBUG_EMAIL(("%s\n", item->contact->home_postal_code));
2754 break;
2755 case 0x3A5C: // PR_HOME_ADDRESS_STATE_OR_PROVINCE
2756 DEBUG_EMAIL(("Home Address State or Province - "));
2757 MALLOC_CONTACT(item);
2758 LIST_COPY(item->contact->home_state, (char*));
2759 DEBUG_EMAIL(("%s\n", item->contact->home_state));
2760 break;
2761 case 0x3A5D: // PR_HOME_ADDRESS_STREET
2762 DEBUG_EMAIL(("Home Address Street - "));
2763 MALLOC_CONTACT(item);
2764 LIST_COPY(item->contact->home_street, (char*));
2765 DEBUG_EMAIL(("%s\n", item->contact->home_street));
2766 break;
2767 case 0x3A5E: // PR_HOME_ADDRESS_POST_OFFICE_BOX
2768 DEBUG_EMAIL(("Home Address Post Office Box - "));
2769 MALLOC_CONTACT(item);
2770 LIST_COPY(item->contact->home_po_box, (char*));
2771 DEBUG_EMAIL(("%s\n", item->contact->home_po_box));
2772 break;
2773 case 0x3A5F: // PR_OTHER_ADDRESS_CITY
2774 DEBUG_EMAIL(("Other Address City - "));
2775 MALLOC_CONTACT(item);
2776 LIST_COPY(item->contact->other_city, (char*));
2777 DEBUG_EMAIL(("%s\n", item->contact->other_city));
2778 break;
2779 case 0x3A60: // PR_OTHER_ADDRESS_COUNTRY
2780 DEBUG_EMAIL(("Other Address Country - "));
2781 MALLOC_CONTACT(item);
2782 LIST_COPY(item->contact->other_country, (char*));
2783 DEBUG_EMAIL(("%s\n", item->contact->other_country));
2784 break;
2785 case 0x3A61: // PR_OTHER_ADDRESS_POSTAL_CODE
2786 DEBUG_EMAIL(("Other Address Postal Code - "));
2787 MALLOC_CONTACT(item);
2788 LIST_COPY(item->contact->other_postal_code, (char*));
2789 DEBUG_EMAIL(("%s\n", item->contact->other_postal_code));
2790 break;
2791 case 0x3A62: // PR_OTHER_ADDRESS_STATE_OR_PROVINCE
2792 DEBUG_EMAIL(("Other Address State - "));
2793 MALLOC_CONTACT(item);
2794 LIST_COPY(item->contact->other_state, (char*));
2795 DEBUG_EMAIL(("%s\n", item->contact->other_state));
2796 break;
2797 case 0x3A63: // PR_OTHER_ADDRESS_STREET
2798 DEBUG_EMAIL(("Other Address Street - "));
2799 MALLOC_CONTACT(item);
2800 LIST_COPY(item->contact->other_street, (char*));
2801 DEBUG_EMAIL(("%s\n", item->contact->other_street));
2802 break;
2803 case 0x3A64: // PR_OTHER_ADDRESS_POST_OFFICE_BOX
2804 DEBUG_EMAIL(("Other Address Post Office box - "));
2805 MALLOC_CONTACT(item);
2806 LIST_COPY(item->contact->other_po_box, (char*));
2807 DEBUG_EMAIL(("%s\n", item->contact->other_po_box));
2808 break;
2809 case 0x65E3: // Entry ID?
2810 DEBUG_EMAIL(("Entry ID - "));
2811 item->record_key = (char*) xmalloc(16+1);
2812 memcpy(item->record_key, &(list->items[x]->data[1]), 16); //skip first byte
2813 item->record_key[16]='\0';
2814 item->record_key_size=16;
2815 DEBUG_EMAIL_HEXPRINT((char*)item->record_key, 16);
2816 //INC_CHECK_X();
2817 break;
2818 case 0x67F2: // ID2 value of the attachments proper record
2819 DEBUG_EMAIL(("Attachment ID2 value - "));
2820 if (attach != NULL){
2821 MOVE_NEXT(attach);
2822 memcpy(&(attach->id2_val), list->items[x]->data, sizeof(attach->id2_val));
2823 LE32_CPU(attach->id2_val);
2824 DEBUG_EMAIL(("%#x\n", attach->id2_val));
2825 } else {
2826 DEBUG_EMAIL(("NOT AN ATTACHMENT: %#x\n", list->items[x]->id));
2827 }
2828 //INC_CHECK_X();
2829 break;
2830 case 0x67FF: // Extra Property Identifier (Password CheckSum)
2831 DEBUG_EMAIL(("Password checksum [0x67FF] - "));
2832 MALLOC_MESSAGESTORE(item);
2833 memcpy(&(item->message_store->pwd_chksum), list->items[x]->data,
2834 sizeof(item->message_store->pwd_chksum));
2835 DEBUG_EMAIL(("%#x\n", item->message_store->pwd_chksum));
2836 //INC_CHECK_X();
2837 break;
2838 case 0x6F02: // Secure HTML Body
2839 DEBUG_EMAIL(("Secure HTML Body - "));
2840 MALLOC_EMAIL(item);
2841 LIST_COPY(item->email->encrypted_htmlbody, (char*));
2842 item->email->encrypted_htmlbody_size = list->items[x]->size;
2843 DEBUG_EMAIL(("Not Printed\n"));
2844 //INC_CHECK_X();
2845 break;
2846 case 0x6F04: // Secure Text Body
2847 DEBUG_EMAIL(("Secure Text Body - "));
2848 MALLOC_EMAIL(item);
2849 LIST_COPY(item->email->encrypted_body, (char*));
2850 item->email->encrypted_body_size = list->items[x]->size;
2851 DEBUG_EMAIL(("Not Printed\n"));
2852 //INC_CHECK_X();
2853 break;
2854 case 0x7C07: // top of folders ENTRYID
2855 DEBUG_EMAIL(("Top of folders RecID [0x7c07] - "));
2856 MALLOC_MESSAGESTORE(item);
2857 item->message_store->top_of_folder = (pst_entryid*) xmalloc(sizeof(pst_entryid));
2858 memcpy(item->message_store->top_of_folder, list->items[x]->data, sizeof(pst_entryid));
2859 LE32_CPU(item->message_store->top_of_folder->u1);
2860 LE32_CPU(item->message_store->top_of_folder->id);
2861 DEBUG_EMAIL_HEXPRINT((char*)item->message_store->top_of_folder->entryid, 16);
2862 //INC_CHECK_X();
2863 break;
2864 case 0x8005: // Contact's Fullname
2865 DEBUG_EMAIL(("Contact Fullname - "));
2866 MALLOC_CONTACT(item);
2867 LIST_COPY(item->contact->fullname, (char*));
2868 DEBUG_EMAIL(("%s\n", item->contact->fullname));
2869 break;
2870 case 0x801A: // Full Home Address
2871 DEBUG_EMAIL(("Home Address - "));
2872 MALLOC_CONTACT(item);
2873 LIST_COPY(item->contact->home_address, (char*));
2874 DEBUG_EMAIL(("%s\n", item->contact->home_address));
2875 break;
2876 case 0x801B: // Full Business Address
2877 DEBUG_EMAIL(("Business Address - "));
2878 MALLOC_CONTACT(item);
2879 LIST_COPY(item->contact->business_address, (char*));
2880 DEBUG_EMAIL(("%s\n", item->contact->business_address));
2881 break;
2882 case 0x801C: // Full Other Address
2883 DEBUG_EMAIL(("Other Address - "));
2884 MALLOC_CONTACT(item);
2885 LIST_COPY(item->contact->other_address, (char*));
2886 DEBUG_EMAIL(("%s\n", item->contact->other_address));
2887 break;
2888 case 0x8082: // Email Address 1 Transport
2889 DEBUG_EMAIL(("Email Address 1 Transport - "));
2890 MALLOC_CONTACT(item);
2891 LIST_COPY(item->contact->address1_transport, (char*));
2892 DEBUG_EMAIL(("%s\n", item->contact->address1_transport));
2893 break;
2894 case 0x8083: // Email Address 1 Address
2895 DEBUG_EMAIL(("Email Address 1 Address - "));
2896 MALLOC_CONTACT(item);
2897 LIST_COPY(item->contact->address1, (char*));
2898 DEBUG_EMAIL(("%s\n", item->contact->address1));
2899 break;
2900 case 0x8084: // Email Address 1 Description
2901 DEBUG_EMAIL(("Email Address 1 Description - "));
2902 MALLOC_CONTACT(item);
2903 LIST_COPY(item->contact->address1_desc, (char*));
2904 DEBUG_EMAIL(("%s\n", item->contact->address1_desc));
2905 break;
2906 case 0x8085: // Email Address 1 Record
2907 DEBUG_EMAIL(("Email Address 1 Record - NOT PROCESSED\n"));
2908 break;
2909 case 0x8092: // Email Address 2 Transport
2910 DEBUG_EMAIL(("Email Address 2 Transport - "));
2911 MALLOC_CONTACT(item);
2912 LIST_COPY(item->contact->address2_transport, (char*));
2913 DEBUG_EMAIL(("%s\n", item->contact->address2_transport));
2914 break;
2915 case 0x8093: // Email Address 2 Address
2916 DEBUG_EMAIL(("Email Address 2 Address - "));
2917 MALLOC_CONTACT(item);
2918 LIST_COPY(item->contact->address2, (char*));
2919 DEBUG_EMAIL(("%s\n", item->contact->address2));
2920 break;
2921 case 0x8094: // Email Address 2 Description
2922 DEBUG_EMAIL (("Email Address 2 Description - "));
2923 MALLOC_CONTACT(item);
2924 LIST_COPY(item->contact->address2_desc, (char*));
2925 DEBUG_EMAIL(("%s\n", item->contact->address2_desc));
2926 break;
2927 case 0x8095: // Email Address 2 Record
2928 DEBUG_EMAIL(("Email Address 2 Record - NOT PROCESSED\n"));
2929 break;
2930 case 0x80A2: // Email Address 3 Transport
2931 DEBUG_EMAIL (("Email Address 3 Transport - "));
2932 MALLOC_CONTACT(item);
2933 LIST_COPY(item->contact->address3_transport, (char*));
2934 DEBUG_EMAIL(("%s\n", item->contact->address3_transport));
2935 break;
2936 case 0x80A3: // Email Address 3 Address
2937 DEBUG_EMAIL(("Email Address 3 Address - "));
2938 MALLOC_CONTACT(item);
2939 LIST_COPY(item->contact->address3, (char*));
2940 DEBUG_EMAIL(("%s\n", item->contact->address3));
2941 break;
2942 case 0x80A4: // Email Address 3 Description
2943 DEBUG_EMAIL(("Email Address 3 Description - "));
2944 MALLOC_CONTACT(item);
2945 LIST_COPY(item->contact->address3_desc, (char*));
2946 DEBUG_EMAIL(("%s\n", item->contact->address3_desc));
2947 break;
2948 case 0x80A5: // Email Address 3 Record
2949 DEBUG_EMAIL(("Email Address 3 Record - NOT PROCESSED\n"));
2950 break;
2951 case 0x80D8: // Internet Free/Busy
2952 DEBUG_EMAIL(("Internet Free/Busy - "));
2953 MALLOC_CONTACT(item);
2954 LIST_COPY(item->contact->free_busy_address, (char*));
2955 DEBUG_EMAIL(("%s\n", item->contact->free_busy_address));
2956 break;
2957 case 0x8205: // Show on Free/Busy as
2958 // 0: Free
2959 // 1: Tentative
2960 // 2: Busy
2961 // 3: Out Of Office
2962 DEBUG_EMAIL(("Appointment shows as - "));
2963 MALLOC_APPOINTMENT(item);
2964 memcpy(&(item->appointment->showas), list->items[x]->data, sizeof(item->appointment->showas));
2965 LE32_CPU(item->appointment->showas);
2966 switch (item->appointment->showas) {
2967 case PST_FREEBUSY_FREE:
2968 DEBUG_EMAIL(("Free\n")); break;
2969 case PST_FREEBUSY_TENTATIVE:
2970 DEBUG_EMAIL(("Tentative\n")); break;
2971 case PST_FREEBUSY_BUSY:
2972 DEBUG_EMAIL(("Busy\n")); break;
2973 case PST_FREEBUSY_OUT_OF_OFFICE:
2974 DEBUG_EMAIL(("Out Of Office\n")); break;
2975 default:
2976 DEBUG_EMAIL(("Unknown Value: %d\n", item->appointment->showas)); break;
2977 }
2978 break;
2979 case 0x8208: // Location of an appointment
2980 DEBUG_EMAIL(("Appointment Location - "));
2981 MALLOC_APPOINTMENT(item);
2982 LIST_COPY(item->appointment->location, (char*));
2983 DEBUG_EMAIL(("%s\n", item->appointment->location));
2984 break;
2985 case 0x8214: // Label for an appointment
2986 DEBUG_EMAIL(("Label for appointment - "));
2987 MALLOC_APPOINTMENT(item);
2988 memcpy(&(item->appointment->label), list->items[x]->data, sizeof(item->appointment->label));
2989 LE32_CPU(item->appointment->label);
2990 switch (item->appointment->label) {
2991 case PST_APP_LABEL_NONE:
2992 DEBUG_EMAIL(("None\n")); break;
2993 case PST_APP_LABEL_IMPORTANT:
2994 DEBUG_EMAIL(("Important\n")); break;
2995 case PST_APP_LABEL_BUSINESS:
2996 DEBUG_EMAIL(("Business\n")); break;
2997 case PST_APP_LABEL_PERSONAL:
2998 DEBUG_EMAIL(("Personal\n")); break;
2999 case PST_APP_LABEL_VACATION:
3000 DEBUG_EMAIL(("Vacation\n")); break;
3001 case PST_APP_LABEL_MUST_ATTEND:
3002 DEBUG_EMAIL(("Must Attend\n")); break;
3003 case PST_APP_LABEL_TRAVEL_REQ:
3004 DEBUG_EMAIL(("Travel Required\n")); break;
3005 case PST_APP_LABEL_NEEDS_PREP:
3006 DEBUG_EMAIL(("Needs Preparation\n")); break;
3007 case PST_APP_LABEL_BIRTHDAY:
3008 DEBUG_EMAIL(("Birthday\n")); break;
3009 case PST_APP_LABEL_ANNIVERSARY:
3010 DEBUG_EMAIL(("Anniversary\n")); break;
3011 case PST_APP_LABEL_PHONE_CALL:
3012 DEBUG_EMAIL(("Phone Call\n")); break;
3013 }
3014 break;
3015 case 0x8234: // TimeZone as String
3016 DEBUG_EMAIL(("TimeZone of times - "));
3017 MALLOC_APPOINTMENT(item);
3018 LIST_COPY(item->appointment->timezonestring, (char*));
3019 DEBUG_EMAIL(("%s\n", item->appointment->timezonestring));
3020 break;
3021 case 0x8235: // Appointment start time
3022 DEBUG_EMAIL(("Appointment Start Time - "));
3023 MALLOC_APPOINTMENT(item);
3024 LIST_COPY(item->appointment->start, (FILETIME*));
3025 DEBUG_EMAIL(("%s\n", fileTimeToAscii((FILETIME*)item->appointment->start)));
3026 break;
3027 case 0x8236: // Appointment end time
3028 DEBUG_EMAIL(("Appointment End Time - "));
3029 MALLOC_APPOINTMENT(item);
3030 LIST_COPY(item->appointment->end, (FILETIME*));
3031 DEBUG_EMAIL(("%s\n", fileTimeToAscii((FILETIME*)item->appointment->start)));
3032 break;
3033 case 0x8516: // Journal time start
3034 DEBUG_EMAIL(("Duplicate Time Start - "));
3035 DEBUG_EMAIL(("%s\n", fileTimeToAscii((FILETIME*)list->items[x]->data)));
3036 break;
3037 case 0x8517: // Journal time end
3038 DEBUG_EMAIL(("Duplicate Time End - "));
3039 DEBUG_EMAIL(("%s\n", fileTimeToAscii((FILETIME*)list->items[x]->data)));
3040 break;
3041 case 0x8530: // Followup
3042 DEBUG_EMAIL(("Followup String - "));
3043 MALLOC_CONTACT(item);
3044 LIST_COPY(item->contact->followup, (char*));
3045 DEBUG_EMAIL(("%s\n", item->contact->followup));
3046 break;
3047 case 0x8534: // Mileage
3048 DEBUG_EMAIL(("Mileage - "));
3049 MALLOC_CONTACT(item);
3050 LIST_COPY(item->contact->mileage, (char*));
3051 DEBUG_EMAIL(("%s\n", item->contact->mileage));
3052 break;
3053 case 0x8535: // Billing Information
3054 DEBUG_EMAIL(("Billing Information - "));
3055 MALLOC_CONTACT(item);
3056 LIST_COPY(item->contact->billing_information, (char*));
3057 DEBUG_EMAIL(("%s\n", item->contact->billing_information));
3058 break;
3059 case 0x8554: // Outlook Version
3060 DEBUG_EMAIL(("Outlook Version - "));
3061 LIST_COPY(item->outlook_version, (char*));
3062 DEBUG_EMAIL(("%s\n", item->outlook_version));
3063 break;
3064 case 0x8560: // Appointment Reminder Time
3065 DEBUG_EMAIL(("Appointment Reminder Time - "));
3066 MALLOC_APPOINTMENT(item);
3067 LIST_COPY(item->appointment->reminder, (FILETIME*));
3068 DEBUG_EMAIL(("%s\n", fileTimeToAscii(item->appointment->reminder)));
3069 break;
3070 case 0x8700: // Journal Type
3071 DEBUG_EMAIL(("Journal Entry Type - "));
3072 MALLOC_JOURNAL(item);
3073 LIST_COPY(item->journal->type, (char*));
3074 DEBUG_EMAIL(("%s\n", item->journal->type));
3075 break;
3076 case 0x8706: // Journal Start date/time
3077 DEBUG_EMAIL(("Start Timestamp - "));
3078 MALLOC_JOURNAL(item);
3079 LIST_COPY(item->journal->start, (FILETIME*));
3080 DEBUG_EMAIL(("%s\n", fileTimeToAscii(item->journal->start)));
3081 break;
3082 case 0x8708: // Journal End date/time
3083 DEBUG_EMAIL(("End Timestamp - "));
3084 MALLOC_JOURNAL(item);
3085 LIST_COPY(item->journal->end, (FILETIME*));
3086 DEBUG_EMAIL(("%s\n", fileTimeToAscii(item->journal->end)));
3087 break;
3088 case 0x8712: // Title?
3089 DEBUG_EMAIL(("Journal Entry Type - "));
3090 MALLOC_JOURNAL(item);
3091 LIST_COPY(item->journal->type, (char*));
3092 DEBUG_EMAIL(("%s\n", item->journal->type));
3093 break;
3094 default:
3095 /* Reference Types
3096
3097 2 - 0x0002 - Signed 16bit value
3098 3 - 0x0003 - Signed 32bit value
3099 11 - 0x000B - Boolean (non-zero = true)
3100 13 - 0x000D - Embedded Object
3101 30 - 0x001E - Null terminated String
3102 31 - 0x001F - Unicode string
3103 64 - 0x0040 - Systime - Filetime structure
3104 72 - 0x0048 - OLE Guid
3105 258 - 0x0102 - Binary data
3106
3107 - 0x1003 - Array of 32bit values
3108 - 0x101E - Array of Strings
3109 - 0x1102 - Array of Binary data
3110 */
3111 // DEBUG_EMAIL(("Unknown id [%#x, size=%#x]\n", list->items[x]->id, list->items[x]->size));
3112 if (list->items[x]->type == 0x02) {
3113 DEBUG_EMAIL(("Unknown 16bit int = %hi\n", *(int16_t*)list->items[x]->data));
3114 } else if (list->items[x]->type == 0x03) {
3115 DEBUG_EMAIL(("Unknown 32bit int = %i\n", *(int32_t*)list->items[x]->data));
3116 } else if (list->items[x]->type == 0x0b) {
3117 DEBUG_EMAIL(("Unknown 16bit boolean = %s [%hi]\n",
3118 (*((int16_t*)list->items[x]->data)!=0?"True":"False"),
3119 *((int16_t*)list->items[x]->data)));
3120 } else if (list->items[x]->type == 0x1e) {
3121 DEBUG_EMAIL(("Unknown String Data = \"%s\" [%#x]\n",
3122 list->items[x]->data, list->items[x]->type));
3123 } else if (list->items[x]->type == 0x40) {
3124 DEBUG_EMAIL(("Unknown Date = \"%s\" [%#x]\n",
3125 fileTimeToAscii((FILETIME*)list->items[x]->data),
3126 list->items[x]->type));
3127 } else if (list->items[x]->type == 0x102) {
3128 DEBUG_EMAIL(("Unknown Binary Data [size = %#x]\n",
3129 list->items[x]->size));
3130 DEBUG_HEXDUMP(list->items[x]->data, list->items[x]->size);
3131 } else if (list->items[x]->type == 0x101E) {
3132 DEBUG_EMAIL(("Unknown Array of Strings [%#x]\n",
3133 list->items[x]->type));
3134 } else {
3135 DEBUG_EMAIL(("Unknown Not Printable [%#x]\n",
3136 list->items[x]->type));
3137 }
3138 if (list->items[x]->data != NULL) {
3139 free(list->items[x]->data);
3140 list->items[x]->data = NULL;
3141 }
3142 //INC_CHECK_X();
3143 }
3144 x++;
3145 }
3146 x = 0;
3147 list = list->next;
3148 next = 1;
3149 }
3150 DEBUG_RET();
3151 return 0;
3152 }
3153 3149
3154 int32_t _pst_free_list(pst_num_array *list) { 3150 int32_t _pst_free_list(pst_num_array *list) {
3155 int32_t x = 0; 3151 int32_t x = 0;
3156 pst_num_array *l; 3152 pst_num_array *l;
3157 DEBUG_ENT("_pst_free_list"); 3153 DEBUG_ENT("_pst_free_list");
3158 while (list != NULL) { 3154 while (list != NULL) {
3159 while (x < list->count_item) { 3155 while (x < list->count_item) {
3160 if (list->items[x]->data != NULL) { 3156 if (list->items[x]->data != NULL) {
3161 free (list->items[x]->data); 3157 free (list->items[x]->data);
3162 } 3158 }
3163 if (list->items[x] != NULL) { 3159 if (list->items[x] != NULL) {
3164 free (list->items[x]); 3160 free (list->items[x]);
3165 } 3161 }
3166 x++; 3162 x++;
3167 } 3163 }
3168 if (list->items != NULL) { 3164 if (list->items != NULL) {
3169 free(list->items); 3165 free(list->items);
3170 } 3166 }
3171 l = list; 3167 l = list;
3172 list = list->next; 3168 list = list->next;
3173 free (l); 3169 free (l);
3174 x = 0; 3170 x = 0;
3175 } 3171 }
3176 DEBUG_RET(); 3172 DEBUG_RET();
3177 return 1; 3173 return 1;
3178 } 3174 }
3175
3179 3176
3180 int32_t _pst_free_id2(pst_index2_ll * head) { 3177 int32_t _pst_free_id2(pst_index2_ll * head) {
3181 pst_index2_ll *t; 3178 pst_index2_ll *t;
3182 DEBUG_ENT("_pst_free_id2"); 3179 DEBUG_ENT("_pst_free_id2");
3183 while (head != NULL) { 3180 while (head != NULL) {
3184 t = head->next; 3181 t = head->next;
3185 free (head); 3182 free (head);
3186 head = t; 3183 head = t;
3187 } 3184 }
3188 DEBUG_RET(); 3185 DEBUG_RET();
3189 return 1; 3186 return 1;
3190 } 3187 }
3188
3191 3189
3192 int32_t _pst_free_id (pst_index_ll *head) { 3190 int32_t _pst_free_id (pst_index_ll *head) {
3193 pst_index_ll *t; 3191 pst_index_ll *t;
3194 DEBUG_ENT("_pst_free_id"); 3192 DEBUG_ENT("_pst_free_id");
3195 while (head != NULL) { 3193 while (head != NULL) {
3196 t = head->next; 3194 t = head->next;
3197 free(head); 3195 free(head);
3198 head = t; 3196 head = t;
3199 } 3197 }
3200 DEBUG_RET(); 3198 DEBUG_RET();
3201 return 1; 3199 return 1;
3202 } 3200 }
3201
3203 3202
3204 int32_t _pst_free_desc (pst_desc_ll *head) { 3203 int32_t _pst_free_desc (pst_desc_ll *head) {
3205 pst_desc_ll *t; 3204 pst_desc_ll *t;
3206 DEBUG_ENT("_pst_free_desc"); 3205 DEBUG_ENT("_pst_free_desc");
3207 while (head != NULL) { 3206 while (head != NULL) {
3208 while (head->child != NULL) { 3207 while (head->child != NULL) {
3209 head = head->child; 3208 head = head->child;
3210 } 3209 }
3211 3210
3212 // point t to the next item 3211 // point t to the next item
3213 t = head->next; 3212 t = head->next;
3214 if (t == NULL && head->parent != NULL) { 3213 if (t == NULL && head->parent != NULL) {
3215 t = head->parent; 3214 t = head->parent;
3216 t->child = NULL; // set the child to NULL so we don't come back here again! 3215 t->child = NULL; // set the child to NULL so we don't come back here again!
3217 } 3216 }
3218 3217
3219 if (head != NULL) 3218 if (head != NULL)
3220 free(head); 3219 free(head);
3221 else { 3220 else {
3222 DIE(("head is NULL")); 3221 DIE(("head is NULL"));
3223 } 3222 }
3224 3223
3225 head = t; 3224 head = t;
3226 } 3225 }
3227 DEBUG_RET(); 3226 DEBUG_RET();
3228 return 1; 3227 return 1;
3229 } 3228 }
3229
3230 3230
3231 int32_t _pst_free_xattrib(pst_x_attrib_ll *x) { 3231 int32_t _pst_free_xattrib(pst_x_attrib_ll *x) {
3232 pst_x_attrib_ll *t; 3232 pst_x_attrib_ll *t;
3233 DEBUG_ENT("_pst_free_xattrib"); 3233 DEBUG_ENT("_pst_free_xattrib");
3234 while (x != NULL) { 3234 while (x != NULL) {
3241 return 1; 3241 return 1;
3242 } 3242 }
3243 3243
3244 3244
3245 pst_index2_ll * _pst_build_id2(pst_file *pf, pst_index_ll* list, pst_index2_ll* head_ptr) { 3245 pst_index2_ll * _pst_build_id2(pst_file *pf, pst_index_ll* list, pst_index2_ll* head_ptr) {
3246 pst_block_header block_head; 3246 pst_block_header block_head;
3247 pst_index2_ll *head = NULL, *tail = NULL; 3247 pst_index2_ll *head = NULL, *tail = NULL;
3248 int32_t x = 0, b_ptr = 0; 3248 int32_t x = 0, b_ptr = 0;
3249 char *buf = NULL; 3249 char *buf = NULL;
3250 pst_id2_assoc id2_rec; 3250 pst_id2_assoc id2_rec;
3251 pst_index_ll *i_ptr = NULL; 3251 pst_index_ll *i_ptr = NULL;
3252 pst_index2_ll *i2_ptr = NULL; 3252 pst_index2_ll *i2_ptr = NULL;
3253 DEBUG_ENT("_pst_build_id2"); 3253 DEBUG_ENT("_pst_build_id2");
3254 if (head_ptr != NULL) { 3254 if (head_ptr) {
3255 head = head_ptr; 3255 head = head_ptr;
3256 while (head_ptr != NULL) 3256 while (head_ptr) head_ptr = (tail = head_ptr)->next;
3257 head_ptr = (tail = head_ptr)->next; 3257 }
3258 } 3258 if (_pst_read_block_size(pf, list->offset, list->size, &buf, PST_NO_ENC, 0) < list->size) {
3259 if (_pst_read_block_size(pf, list->offset, list->size, &buf, PST_NO_ENC,0) < list->size) { 3259 //an error occured in block read
3260 //an error occured in block read 3260 WARN(("block read error occured. offset = %#x, size = %#x\n", list->offset, list->size));
3261 WARN(("block read error occured. offset = %#x, size = %#x\n", list->offset, list->size)); 3261 DEBUG_RET();
3262 return NULL;
3263 }
3264 DEBUG_HEXDUMPC(buf, list->size, 16);
3265
3266 memcpy(&block_head, buf, sizeof(block_head));
3267 LE16_CPU(block_head.type);
3268 LE16_CPU(block_head.count);
3269
3270 if (block_head.type != 0x0002) { // some sort of constant?
3271 WARN(("Unknown constant [%#x] at start of id2 values [offset %#x].\n", block_head.type, list->offset));
3272 DEBUG_RET();
3273 return NULL;
3274 }
3275
3276 DEBUG_INDEX(("ID %#x is likely to be a description record. Count is %i (offset %#x)\n",
3277 list->id, block_head.count, list->offset));
3278 x = 0;
3279 b_ptr = 0x04;
3280 while (x < block_head.count) {
3281 memcpy(&id2_rec, &(buf[b_ptr]), sizeof(id2_rec));
3282 LE32_CPU(id2_rec.id2);
3283 LE32_CPU(id2_rec.id);
3284 LE32_CPU(id2_rec.table2);
3285
3286 b_ptr += sizeof(id2_rec);
3287 DEBUG_INDEX(("\tid2 = %#x, id = %#x, table2 = %#x\n", id2_rec.id2, id2_rec.id, id2_rec.table2));
3288 if ((i_ptr = _pst_getID(pf, id2_rec.id)) == NULL) {
3289 DEBUG_WARN(("\t\t%#x - Not Found\n", id2_rec.id));
3290 } else {
3291 DEBUG_INDEX(("\t\t%#x - Offset %#x, u1 %#x, Size %i(%#x)\n", i_ptr->id, i_ptr->offset, i_ptr->u1, i_ptr->size, i_ptr->size));
3292 // add it to the linked list
3293 i2_ptr = (pst_index2_ll*) xmalloc(sizeof(pst_index2_ll));
3294 i2_ptr->id2 = id2_rec.id2;
3295 i2_ptr->id = i_ptr;
3296 i2_ptr->next = NULL;
3297 if (!head) head = i2_ptr;
3298 if (tail) tail->next = i2_ptr;
3299 tail = i2_ptr;
3300 if (id2_rec.table2 != 0) {
3301 if ((i_ptr = _pst_getID(pf, id2_rec.table2)) == NULL) {
3302 DEBUG_WARN(("\tTable2 [%#x] not found\n", id2_rec.table2));
3303 }
3304 else {
3305 DEBUG_INDEX(("\tGoing deeper for table2 [%#x]\n", id2_rec.table2));
3306 if ((i2_ptr = _pst_build_id2(pf, i_ptr, head)) != NULL) {
3307 // DEBUG_INDEX(("_pst_build_id2(): \t\tAdding new list onto end of current\n"));
3308 // if (head == NULL)
3309 // head = i2_ptr;
3310 // if (tail != NULL)
3311 // tail->next = i2_ptr;
3312 // while (i2_ptr->next != NULL)
3313 // i2_ptr = i2_ptr->next;
3314 // tail = i2_ptr;
3315 }
3316 // need to re-establish tail
3317 DEBUG_INDEX(("Returned from depth\n"));
3318 if (tail) {
3319 while (tail->next) tail = tail->next;
3320 }
3321 }
3322 }
3323 }
3324 x++;
3325 }
3326 if (buf) free (buf);
3262 DEBUG_RET(); 3327 DEBUG_RET();
3263 return NULL; 3328 return head;
3264 } 3329 }
3265 3330
3266 memcpy(&block_head, buf, sizeof(block_head));
3267 LE16_CPU(block_head.type);
3268 LE16_CPU(block_head.count);
3269
3270 if (block_head.type != 0x0002) { // some sort of constant?
3271 WARN(("Unknown constant [%#x] at start of id2 values [offset %#x].\n", block_head.type, list->offset));
3272 DEBUG_RET();
3273 return NULL;
3274 }
3275
3276 DEBUG_INDEX(("ID %#x is likely to be a description record. Count is %i (offset %#x)\n",
3277 list->id, block_head.count, list->offset));
3278 x = 0;
3279 b_ptr = 0x04;
3280 while (x < block_head.count) {
3281 memcpy(&id2_rec, &(buf[b_ptr]), sizeof(id2_rec));
3282 LE32_CPU(id2_rec.id2);
3283 LE32_CPU(id2_rec.id);
3284 LE32_CPU(id2_rec.table2);
3285
3286 b_ptr += sizeof(id2_rec);
3287 DEBUG_INDEX(("\tid2 = %#x, id = %#x, table2 = %#x\n", id2_rec.id2, id2_rec.id, id2_rec.table2));
3288 if ((i_ptr = _pst_getID(pf, id2_rec.id)) == NULL) {
3289 DEBUG_WARN(("\t\t%#x - Not Found\n", id2_rec.id));
3290 } else {
3291 DEBUG_INDEX(("\t\t%#x - Offset %#x, u1 %#x, Size %i(%#x)\n", i_ptr->id, i_ptr->offset, i_ptr->u1, i_ptr->size, i_ptr->size));
3292 // add it to the linked list
3293 //check it doesn't exist already first
3294 /* i2_ptr = head;
3295 while(i2_ptr != NULL) {
3296 if (i2_ptr->id2 == id2_rec.id2)
3297 break;
3298 i2_ptr = i2_ptr->next;
3299 }*/
3300
3301 // if (i2_ptr == NULL) {
3302 i2_ptr = (pst_index2_ll*) xmalloc(sizeof(pst_index2_ll));
3303 i2_ptr->id2 = id2_rec.id2;
3304 i2_ptr->id = i_ptr;
3305 i2_ptr->next = NULL;
3306 if (head == NULL)
3307 head = i2_ptr;
3308 if (tail != NULL)
3309 tail->next = i2_ptr;
3310 tail = i2_ptr;
3311 /* } else {
3312 // if it does already exist
3313 DEBUG_INDEX(("_pst_build_id2(): \t\t%#x already exists. Updating ID to %#x\n",
3314 id2_rec.id2, i_ptr->id));
3315 i2_ptr->id = i_ptr;
3316 }*/
3317 if (id2_rec.table2 != 0) {
3318 if ((i_ptr = _pst_getID(pf, id2_rec.table2)) == NULL) {
3319 DEBUG_WARN(("\tTable2 [%#x] not found\n", id2_rec.table2));
3320 } else {
3321 DEBUG_INDEX(("\tGoing deeper for table2 [%#x]\n", id2_rec.table2));
3322 if ((i2_ptr = _pst_build_id2(pf, i_ptr, head)) != NULL) {
3323 /*DEBUG_INDEX(("_pst_build_id2(): \t\tAdding new list onto end of current\n"));
3324 if (head == NULL)
3325 head = i2_ptr;
3326 if (tail != NULL)
3327 tail->next = i2_ptr;
3328 while (i2_ptr->next != NULL)
3329 i2_ptr = i2_ptr->next;
3330 tail = i2_ptr;*/
3331 }
3332 // need to re-establish tail
3333 DEBUG_INDEX(("Returned from depth\n"));
3334 if (tail != NULL) {
3335 while (tail->next != NULL)
3336 tail = tail->next;
3337 }
3338 }
3339 }
3340 }
3341 x++;
3342 }
3343 if (buf != NULL) {
3344 free (buf);
3345 }
3346 DEBUG_RET();
3347 return head;
3348 }
3349 3331
3350 // This version of free does NULL check first 3332 // This version of free does NULL check first
3351 #define SAFE_FREE(x) {if (x != NULL) free(x);} 3333 #define SAFE_FREE(x) {if (x != NULL) free(x);}
3352 3334
3353 void _pst_freeItem(pst_item *item) { 3335 void _pst_freeItem(pst_item *item) {
3405 } 3387 }
3406 if (item->contact) { 3388 if (item->contact) {
3407 SAFE_FREE(item->contact->access_method); 3389 SAFE_FREE(item->contact->access_method);
3408 SAFE_FREE(item->contact->account_name); 3390 SAFE_FREE(item->contact->account_name);
3409 SAFE_FREE(item->contact->address1); 3391 SAFE_FREE(item->contact->address1);
3392 SAFE_FREE(item->contact->address1a);
3410 SAFE_FREE(item->contact->address1_desc); 3393 SAFE_FREE(item->contact->address1_desc);
3411 SAFE_FREE(item->contact->address1_transport); 3394 SAFE_FREE(item->contact->address1_transport);
3412 SAFE_FREE(item->contact->address2); 3395 SAFE_FREE(item->contact->address2);
3396 SAFE_FREE(item->contact->address2a);
3413 SAFE_FREE(item->contact->address2_desc); 3397 SAFE_FREE(item->contact->address2_desc);
3414 SAFE_FREE(item->contact->address2_transport); 3398 SAFE_FREE(item->contact->address2_transport);
3415 SAFE_FREE(item->contact->address3); 3399 SAFE_FREE(item->contact->address3);
3400 SAFE_FREE(item->contact->address3a);
3416 SAFE_FREE(item->contact->address3_desc); 3401 SAFE_FREE(item->contact->address3_desc);
3417 SAFE_FREE(item->contact->address3_transport); 3402 SAFE_FREE(item->contact->address3_transport);
3418 SAFE_FREE(item->contact->assistant_name); 3403 SAFE_FREE(item->contact->assistant_name);
3419 SAFE_FREE(item->contact->assistant_phone); 3404 SAFE_FREE(item->contact->assistant_phone);
3420 SAFE_FREE(item->contact->billing_information); 3405 SAFE_FREE(item->contact->billing_information);
3533 free(item); 3518 free(item);
3534 } 3519 }
3535 DEBUG_RET(); 3520 DEBUG_RET();
3536 } 3521 }
3537 3522
3523
3538 int32_t _pst_getBlockOffset(char *buf, int32_t read_size, int32_t i_offset, int32_t offset, pst_block_offset *p) { 3524 int32_t _pst_getBlockOffset(char *buf, int32_t read_size, int32_t i_offset, int32_t offset, pst_block_offset *p) {
3539 int32_t of1 = offset>>4; 3525 int32_t of1 = offset>>4;
3540 DEBUG_ENT("_pst_getBlockOffset"); 3526 DEBUG_ENT("_pst_getBlockOffset");
3541 if ((p == NULL) || (buf == NULL) || (offset == 0) || (i_offset+2+of1+sizeof(*p) > read_size)) { 3527 if ((p == NULL) || (buf == NULL) || (i_offset == 0) || (i_offset+2+of1+sizeof(*p) > read_size)) {
3542 DEBUG_WARN(("p is NULL or buf is NULL or offset is 0 (%p, %p, %#x, %i, %i)\n", p, buf, offset, read_size, i_offset)); 3528 DEBUG_WARN(("p is NULL or buf is NULL or offset is 0 (%p, %p, %#x, %i, %i)\n", p, buf, offset, read_size, i_offset));
3543 DEBUG_RET(); 3529 DEBUG_RET();
3544 return -1; 3530 return -1;
3545 } 3531 }
3546 memcpy(&(p->from), &(buf[(i_offset+2)+of1]), sizeof(p->from)); 3532 memcpy(&(p->from), &(buf[(i_offset+2)+of1]), sizeof(p->from));
3547 memcpy(&(p->to), &(buf[(i_offset+2)+of1+sizeof(p->from)]), sizeof(p->to)); 3533 memcpy(&(p->to), &(buf[(i_offset+2)+of1+sizeof(p->from)]), sizeof(p->to));
3548 LE16_CPU(p->from); 3534 LE16_CPU(p->from);
3549 LE16_CPU(p->to); 3535 LE16_CPU(p->to);
3536 DEBUG_WARN(("get block offset finds from=%i(%#x), to=%i(%#x)", p->from, p->from, p->to, p->to));
3550 DEBUG_RET(); 3537 DEBUG_RET();
3551 return 0; 3538 return 0;
3552 } 3539 }
3553 3540
3541
3554 pst_index_ll * _pst_getID(pst_file* pf, u_int32_t id) { 3542 pst_index_ll * _pst_getID(pst_file* pf, u_int32_t id) {
3555 // static pst_index_ll *old_val = NULL; //this should make it quicker
3556 pst_index_ll *ptr = NULL; 3543 pst_index_ll *ptr = NULL;
3557 DEBUG_ENT("_pst_getID"); 3544 DEBUG_ENT("_pst_getID");
3558 if (id == 0) { 3545 if (id == 0) {
3559 DEBUG_RET(); 3546 DEBUG_RET();
3560 return NULL; 3547 return NULL;
3567 // it isn't based on sound principles either. 3554 // it isn't based on sound principles either.
3568 // update: seems that the last two sig bits are flags. u tell me! 3555 // update: seems that the last two sig bits are flags. u tell me!
3569 id &= 0xFFFFFFFE; // remove least sig. bit. seems that it might work if I do this 3556 id &= 0xFFFFFFFE; // remove least sig. bit. seems that it might work if I do this
3570 3557
3571 DEBUG_INDEX(("Trying to find %#x\n", id)); 3558 DEBUG_INDEX(("Trying to find %#x\n", id));
3572
3573 if (ptr == NULL) ptr = pf->i_head; 3559 if (ptr == NULL) ptr = pf->i_head;
3574 while (ptr->id != id) { 3560 while (ptr && (ptr->id != id)) {
3575 ptr = ptr->next; 3561 ptr = ptr->next;
3576 if (ptr == NULL) { 3562 if (ptr == NULL) {
3577 break; 3563 break;
3578 } 3564 }
3579 } 3565 }
3580 if (ptr == NULL) { 3566 if (ptr) {
3567 DEBUG_INDEX(("Found Value %#x\n", ptr->id));
3568 } else {
3581 DEBUG_INDEX(("ERROR: Value not found\n")); 3569 DEBUG_INDEX(("ERROR: Value not found\n"));
3582 } else {
3583 DEBUG_INDEX(("Found Value %#x\n", ptr->id));
3584 } 3570 }
3585 DEBUG_RET(); 3571 DEBUG_RET();
3586 return ptr; 3572 return ptr;
3587 } 3573 }
3574
3588 3575
3589 pst_index_ll * _pst_getID2(pst_index2_ll *ptr, u_int32_t id) { 3576 pst_index_ll * _pst_getID2(pst_index2_ll *ptr, u_int32_t id) {
3590 DEBUG_ENT("_pst_getID2"); 3577 DEBUG_ENT("_pst_getID2");
3591 DEBUG_INDEX(("Head = %p\n", ptr)); 3578 DEBUG_INDEX(("Head = %p\n", ptr));
3592 DEBUG_INDEX(("Trying to find %#x\n", id)); 3579 DEBUG_INDEX(("Trying to find %#x\n", id));
3593 while (ptr != NULL && ptr->id2 != id) { 3580 while (ptr && (ptr->id2 != id)) {
3594 ptr = ptr->next; 3581 ptr = ptr->next;
3595 } 3582 }
3596 if (ptr != NULL) { 3583 if (ptr) {
3597 if (ptr->id != NULL) { 3584 if (ptr->id) {
3598 DEBUG_INDEX(("Found value %#x\n", ptr->id->id)); 3585 DEBUG_INDEX(("Found value %#x\n", ptr->id->id));
3599 } else { 3586 } else {
3600 DEBUG_INDEX(("Found value, though it is NULL!\n")); 3587 DEBUG_INDEX(("Found value, though it is NULL!\n"));
3601 } 3588 }
3602 DEBUG_RET(); 3589 DEBUG_RET();
3605 DEBUG_INDEX(("ERROR Not Found\n")); 3592 DEBUG_INDEX(("ERROR Not Found\n"));
3606 DEBUG_RET(); 3593 DEBUG_RET();
3607 return NULL; 3594 return NULL;
3608 } 3595 }
3609 3596
3597
3610 pst_desc_ll * _pst_getDptr(pst_file *pf, u_int32_t id) { 3598 pst_desc_ll * _pst_getDptr(pst_file *pf, u_int32_t id) {
3611 pst_desc_ll *ptr = pf->d_head; 3599 pst_desc_ll *ptr = pf->d_head;
3612 DEBUG_ENT("_pst_getDptr"); 3600 DEBUG_ENT("_pst_getDptr");
3613 while(ptr != NULL && ptr->id != id) { 3601 while (ptr && (ptr->id != id)) {
3614 if (ptr->child != NULL) { 3602 if (ptr->child) {
3615 ptr = ptr->child; 3603 ptr = ptr->child;
3616 continue; 3604 continue;
3617 } 3605 }
3618 while (ptr->next == NULL && ptr->parent != NULL) { 3606 while (ptr->next == NULL && ptr->parent != NULL) {
3619 ptr = ptr->parent; 3607 ptr = ptr->parent;
3621 ptr = ptr->next; 3609 ptr = ptr->next;
3622 } 3610 }
3623 DEBUG_RET(); 3611 DEBUG_RET();
3624 return ptr; // will be NULL or record we are looking for 3612 return ptr; // will be NULL or record we are looking for
3625 } 3613 }
3614
3626 3615
3627 int32_t _pst_printDptr(pst_file *pf) { 3616 int32_t _pst_printDptr(pst_file *pf) {
3628 pst_desc_ll *ptr = pf->d_head; 3617 pst_desc_ll *ptr = pf->d_head;
3629 int32_t depth = 0; 3618 int32_t depth = 0;
3630 char spaces[100]; 3619 char spaces[100];
3648 } 3637 }
3649 DEBUG_RET(); 3638 DEBUG_RET();
3650 return 0; 3639 return 0;
3651 } 3640 }
3652 3641
3642
3653 int32_t _pst_printIDptr(pst_file* pf) { 3643 int32_t _pst_printIDptr(pst_file* pf) {
3654 pst_index_ll *ptr = pf->i_head; 3644 pst_index_ll *ptr = pf->i_head;
3655 DEBUG_ENT("_pst_printIDptr"); 3645 DEBUG_ENT("_pst_printIDptr");
3656 while (ptr != NULL) { 3646 while (ptr != NULL) {
3657 DEBUG_INDEX(("%#x offset=%#x size=%#x\n", ptr->id, ptr->offset, ptr->size)); 3647 DEBUG_INDEX(("%#x offset=%#x size=%#x\n", ptr->id, ptr->offset, ptr->size));
3659 } 3649 }
3660 DEBUG_RET(); 3650 DEBUG_RET();
3661 return 0; 3651 return 0;
3662 } 3652 }
3663 3653
3654
3664 int32_t _pst_printID2ptr(pst_index2_ll *ptr) { 3655 int32_t _pst_printID2ptr(pst_index2_ll *ptr) {
3665 DEBUG_ENT("_pst_printID2ptr"); 3656 DEBUG_ENT("_pst_printID2ptr");
3666 while (ptr != NULL) { 3657 while (ptr != NULL) {
3667 DEBUG_INDEX(("%#x id=%#x\n", ptr->id2, (ptr->id!=NULL?ptr->id->id:0))); 3658 DEBUG_INDEX(("%#x id=%#x\n", ptr->id2, (ptr->id!=NULL?ptr->id->id:0)));
3668 ptr = ptr->next; 3659 ptr = ptr->next;
3669 } 3660 }
3670 DEBUG_RET(); 3661 DEBUG_RET();
3671 return 0; 3662 return 0;
3672 } 3663 }
3664
3673 3665
3674 size_t _pst_read_block(FILE *fp, int32_t offset, void **buf) { 3666 size_t _pst_read_block(FILE *fp, int32_t offset, void **buf) {
3675 size_t size; 3667 size_t size;
3676 int32_t fpos; 3668 int32_t fpos;
3677 DEBUG_ENT("_pst_read_block"); 3669 DEBUG_ENT("_pst_read_block");
3690 fseek(fp, fpos, SEEK_SET); 3682 fseek(fp, fpos, SEEK_SET);
3691 DEBUG_RET(); 3683 DEBUG_RET();
3692 return size; 3684 return size;
3693 } 3685 }
3694 3686
3687
3695 // when the first byte of the block being read is 01, then we can assume 3688 // when the first byte of the block being read is 01, then we can assume
3696 // that it is a list of further ids to read and we will follow those ids 3689 // that it is a list of further ids to read and we will follow those ids
3697 // recursively calling this function until we have all the data 3690 // recursively calling this function until we have all the data
3698 // we could do decryption of the encrypted PST files here 3691 // we could do decryption of the encrypted PST files here
3699 size_t _pst_read_block_size(pst_file *pf, int32_t offset, size_t size, char ** buf, int32_t do_enc, 3692 size_t _pst_read_block_size(pst_file *pf, int32_t offset, size_t size, char ** buf, int32_t do_enc, unsigned char is_index) {
3700 unsigned char is_index) { 3693 u_int32_t fpos, x;
3701 u_int32_t fpos, x; 3694 int16_t count, y;
3702 int16_t count, y; 3695 char *buf2 = NULL, *buf3 = NULL;
3703 char *buf2 = NULL, *buf3 = NULL; 3696 unsigned char fdepth;
3704 unsigned char fdepth; 3697 pst_index_ll *ptr = NULL;
3705 pst_index_ll *ptr = NULL; 3698 size_t rsize, z;
3706 size_t rsize, z; 3699 DEBUG_ENT("_pst_read_block_size");
3707 DEBUG_ENT("_pst_read_block_size"); 3700 DEBUG_READ(("Reading block from %#x, %i bytes\n", offset, size));
3708 DEBUG_READ(("Reading block from %#x, %i bytes\n", offset, size)); 3701 fpos = ftell(pf->fp);
3709 fpos = ftell(pf->fp); 3702 fseek(pf->fp, offset, SEEK_SET);
3710 fseek(pf->fp, offset, SEEK_SET); 3703 if (*buf != NULL) {
3711 if (*buf != NULL) { 3704 DEBUG_READ(("Freeing old memory\n"));
3712 DEBUG_READ(("Freeing old memory\n")); 3705 free(*buf);
3713 free(*buf); 3706 }
3714 } 3707
3715 3708 *buf = (void*) xmalloc(size+1); //plus one so that we can NULL terminate it later
3716 *buf = (void*) xmalloc(size+1); //plus one so that we can NULL terminate it later 3709 rsize = fread(*buf, 1, size, pf->fp);
3717 rsize = fread(*buf, 1, size, pf->fp); 3710 if (rsize != size) {
3718 if (rsize != size) { 3711 DEBUG_WARN(("Didn't read all that I could. fread returned less [%i instead of %i]\n", rsize, size));
3719 DEBUG_WARN(("Didn't read all that I could. fread returned less [%i instead of %i]\n", rsize, size)); 3712 if (feof(pf->fp)) {
3720 if (feof(pf->fp)) { 3713 DEBUG_WARN(("We tried to read past the end of the file at [offset %#x, size %#x]\n", offset, size));
3721 DEBUG_WARN(("We tried to read past the end of the file at [offset %#x, size %#x]\n", offset, size)); 3714 } else if (ferror(pf->fp)) {
3722 } else if (ferror(pf->fp)) { 3715 DEBUG_WARN(("Error is set on file stream.\n"));
3723 DEBUG_WARN(("Error is set on file stream.\n")); 3716 } else {
3724 } else { 3717 DEBUG_WARN(("I can't tell why it failed\n"));
3725 DEBUG_WARN(("I can't tell why it failed\n")); 3718 }
3726 } 3719 size = rsize;
3727 size = rsize; 3720 }
3728 } 3721
3729 3722 // DEBUG_HEXDUMP(*buf, size);
3730 // DEBUG_HEXDUMP(*buf, size); 3723
3731 3724 /* if (is_index) {
3732 /* if (is_index) { 3725 DEBUG_READ(("_pst_read_block_size: ODD_BLOCK should be here\n"));
3733 DEBUG_READ(("_pst_read_block_size: ODD_BLOCK should be here\n")); 3726 DEBUG_READ(("\t: byte 0-1: %#x %#x\n", (*buf)[0], (*buf)[1]));
3734 DEBUG_READ(("\t: byte 0-1: %#x %#x\n", (*buf)[0], (*buf)[1])); 3727 }*/
3735 }*/ 3728
3736 3729 if ((*buf)[0] == 0x01 && (*buf)[1] != 0x00 && is_index) {
3737 if ((*buf)[0] == 0x01 && (*buf)[1] != 0x00 && is_index) { 3730 //don't do this recursion if we should be at a leaf node
3738 //don't do this recursion if we should be at a leaf node 3731 memcpy(&count, &((*buf)[2]), sizeof(int16_t));
3739 memcpy(&count, &((*buf)[2]), sizeof(int16_t)); 3732 LE16_CPU(count);
3740 LE16_CPU(count); 3733 memcpy(&fdepth, &((*buf)[1]), sizeof(fdepth));
3741 memcpy(&fdepth, &((*buf)[1]), sizeof(fdepth)); 3734 DEBUG_READ(("Seen indexes to blocks. Depth is %i\n", fdepth));
3742 DEBUG_READ(("Seen indexes to blocks. Depth is %i\n", fdepth)); 3735 // do fancy stuff! :)
3743 // do fancy stuff! :) 3736 DEBUG_READ(("There are %i ids\n", count));
3744 DEBUG_READ(("There are %i ids\n", count)); 3737 // if first 2 blocks are 01 01 then index to blocks
3745 // if first 2 blocks are 01 01 then index to blocks 3738 size = 0;
3746 size = 0; 3739 y = 0;
3747 y = 0; 3740 while (y < count) {
3748 while (y < count) { 3741 memcpy(&x, &(*buf)[0x08+(y*4)], sizeof(int32_t));
3749 memcpy(&x, &(*buf)[0x08+(y*4)], sizeof(int32_t)); 3742 LE32_CPU(x);
3750 LE32_CPU(x); 3743 if ((ptr = _pst_getID(pf, x)) == NULL) {
3751 if ((ptr = _pst_getID(pf, x)) == NULL) { 3744 WARN(("Error. Cannot find ID [%#x] during multi-block read\n", x));
3752 WARN(("Error. Cannot find ID [%#x] during multi-block read\n", x)); 3745 buf3 = (char*) realloc(buf3, size+1);
3753 buf3 = (char*) realloc(buf3, size+1); 3746 buf3[size] = '\0';
3754 buf3[size] = '\0'; 3747 *buf = buf3;
3755 *buf = buf3; 3748 fseek(pf->fp, fpos, SEEK_SET);
3749 DEBUG_RET();
3750 return size;
3751 }
3752 if ((z = _pst_read_block_size(pf, ptr->offset, ptr->size, &buf2, do_enc, fdepth-1)) < ptr->size) {
3753 buf3 = (char*) realloc(buf3, size+1);
3754 buf3[size] = '\0';
3755 *buf = buf3;
3756 fseek(pf->fp, fpos, SEEK_SET);
3757 DEBUG_RET();
3758 return size;
3759 }
3760 DEBUG_READ(("Melding newley retrieved block with bigger one. New size is %i\n", size+z));
3761 buf3 = (char*) realloc(buf3, size+z+1); //plus one so that we can null terminate it later
3762 DEBUG_READ(("Doing copy. Start pos is %i, length is %i\n", size, z));
3763 memcpy(&(buf3[size]), buf2, z);
3764 size += z;
3765 y++;
3766 }
3767 free(*buf);
3768 if (buf2 != NULL)
3769 free(buf2);
3770 if (buf3 == NULL) {
3771 // this can happen if count == 0. We should create an empty buffer so we don't
3772 // confuse any clients
3773 buf3 = (char*) xmalloc(1);
3774 }
3775 *buf = buf3;
3776 } else if (do_enc && pf->encryption)
3777 _pst_decrypt(*buf, size, pf->encryption);
3778
3779 (*buf)[size] = '\0'; //should be byte after last one read
3756 fseek(pf->fp, fpos, SEEK_SET); 3780 fseek(pf->fp, fpos, SEEK_SET);
3757 DEBUG_RET(); 3781 DEBUG_RET();
3758 return size; 3782 return size;
3759 } 3783 }
3760 if ((z = _pst_read_block_size(pf, ptr->offset, ptr->size, &buf2, do_enc, fdepth-1)) < ptr->size) { 3784
3761 buf3 = (char*) realloc(buf3, size+1); 3785
3762 buf3[size] = '\0'; 3786 int32_t _pst_decrypt(unsigned char *buf, size_t size, int32_t type) {
3763 *buf = buf3; 3787 size_t x = 0;
3764 fseek(pf->fp, fpos, SEEK_SET); 3788 unsigned char y;
3789 DEBUG_ENT("_pst_decrypt");
3790 if (buf == NULL) {
3791 DEBUG_RET();
3792 return -1;
3793 }
3794
3795 if (type == PST_COMP_ENCRYPT) {
3796 x = 0;
3797 while (x < size) {
3798 y = buf[x];
3799 DEBUG_DECRYPT(("Transposing %#hhx to %#hhx [%#x]\n", buf[x], comp_enc[y], y));
3800 buf[x] = comp_enc[y]; // transpose from encrypt array
3801 x++;
3802 }
3803 } else {
3804 WARN(("Unknown encryption: %i. Cannot decrypt\n", type));
3805 DEBUG_RET();
3806 return -1;
3807 }
3765 DEBUG_RET(); 3808 DEBUG_RET();
3766 return size; 3809 return 0;
3767 } 3810 }
3768 DEBUG_READ(("Melding newley retrieved block with bigger one. New size is %i\n", size+z)); 3811
3769 buf3 = (char*) realloc(buf3, size+z+1); //plus one so that we can null terminate it later 3812
3770 DEBUG_READ(("Doing copy. Start pos is %i, length is %i\n", size, z)); 3813 int32_t _pst_getAtPos(FILE *fp, int32_t pos, void* buf, u_int32_t size) {
3771 memcpy(&(buf3[size]), buf2, z); 3814 DEBUG_ENT("_pst_getAtPos");
3772 size += z; 3815 if (fseek(fp, pos, SEEK_SET) == -1) {
3773 y++; 3816 DEBUG_RET();
3774 } 3817 return 1;
3775 free(*buf); 3818 }
3776 if (buf2 != NULL) 3819
3777 free(buf2); 3820 if (fread(buf, 1, size, fp) < size) {
3778 if (buf3 == NULL) { 3821 DEBUG_RET();
3779 // this can happen if count == 0. We should create an empty buffer so we don't 3822 return 2;
3780 // confuse any clients 3823 }
3781 buf3 = (char*) xmalloc(1);
3782 }
3783 *buf = buf3;
3784 } else if (do_enc && pf->encryption)
3785 _pst_decrypt(*buf, size, pf->encryption);
3786
3787 (*buf)[size] = '\0'; //should be byte after last one read
3788 fseek(pf->fp, fpos, SEEK_SET);
3789 DEBUG_RET();
3790 return size;
3791 }
3792
3793 int32_t _pst_decrypt(unsigned char *buf, size_t size, int32_t type) {
3794 size_t x = 0;
3795 unsigned char y;
3796 DEBUG_ENT("_pst_decrypt");
3797 if (buf == NULL) {
3798 DEBUG_RET(); 3824 DEBUG_RET();
3799 return -1; 3825 return 0;
3800 } 3826 }
3801 3827
3802 if (type == PST_COMP_ENCRYPT) { 3828
3803 x = 0; 3829 int32_t _pst_get (FILE *fp, void *buf, u_int32_t size) {
3804 while (x < size) { 3830 DEBUG_ENT("_pst_get");
3805 y = buf[x]; 3831 if (fread(buf, 1, size, fp) < size) {
3806 DEBUG_DECRYPT(("Transposing %#hhx to %#hhx [%#x]\n", buf[x], comp_enc[y], y)); 3832 DEBUG_RET();
3807 buf[x] = comp_enc[y]; // transpose from encrypt array 3833 return 1;
3808 x++; 3834 }
3809 }
3810 } else {
3811 WARN(("Unknown encryption: %i. Cannot decrypt\n", type));
3812 DEBUG_RET(); 3835 DEBUG_RET();
3813 return -1; 3836 return 0;
3814 } 3837 }
3815 DEBUG_RET(); 3838
3816 return 0;
3817 }
3818
3819 int32_t _pst_getAtPos(FILE *fp, int32_t pos, void* buf, u_int32_t size) {
3820 DEBUG_ENT("_pst_getAtPos");
3821 if (fseek(fp, pos, SEEK_SET) == -1) {
3822 DEBUG_RET();
3823 return 1;
3824 }
3825
3826 if (fread(buf, 1, size, fp) < size) {
3827 DEBUG_RET();
3828 return 2;
3829 }
3830 DEBUG_RET();
3831 return 0;
3832 }
3833
3834 int32_t _pst_get (FILE *fp, void *buf, u_int32_t size) {
3835 DEBUG_ENT("_pst_get");
3836 if (fread(buf, 1, size, fp) < size) {
3837 DEBUG_RET();
3838 return 1;
3839 }
3840 DEBUG_RET();
3841 return 0;
3842 }
3843 3839
3844 size_t _pst_ff_getIDblock_dec(pst_file *pf, u_int32_t id, unsigned char **b) { 3840 size_t _pst_ff_getIDblock_dec(pst_file *pf, u_int32_t id, unsigned char **b) {
3845 size_t r; 3841 size_t r;
3846 DEBUG_ENT("_pst_ff_getIDblock_dec"); 3842 DEBUG_ENT("_pst_ff_getIDblock_dec");
3847 r = _pst_ff_getIDblock(pf, id, b); 3843 r = _pst_ff_getIDblock(pf, id, b);
3848 if (pf->encryption) _pst_decrypt(*b, r, pf->encryption); 3844 if (pf->encryption) _pst_decrypt(*b, r, pf->encryption);
3849 DEBUG_HEXDUMPC(*b, r, 16); 3845 DEBUG_HEXDUMPC(*b, r, 16);
3850 DEBUG_RET(); 3846 DEBUG_RET();
3851 return r; 3847 return r;
3852 } 3848 }
3849
3853 3850
3854 /** the get ID function for the default file format that I am working with 3851 /** the get ID function for the default file format that I am working with
3855 ie the one in the PST files */ 3852 ie the one in the PST files */
3856 size_t _pst_ff_getIDblock(pst_file *pf, u_int32_t id, unsigned char** b) { 3853 size_t _pst_ff_getIDblock(pst_file *pf, u_int32_t id, unsigned char** b) {
3857 pst_index_ll *rec; 3854 pst_index_ll *rec;
3883 } 3880 }
3884 DEBUG_RET(); 3881 DEBUG_RET();
3885 return rsize; 3882 return rsize;
3886 } 3883 }
3887 3884
3885
3888 #define PST_PTR_BLOCK_SIZE 0x120 3886 #define PST_PTR_BLOCK_SIZE 0x120
3889 size_t _pst_ff_getID2block(pst_file *pf, u_int32_t id2, pst_index2_ll *id2_head, unsigned char** buf) { 3887 size_t _pst_ff_getID2block(pst_file *pf, u_int32_t id2, pst_index2_ll *id2_head, unsigned char** buf) {
3890 pst_index_ll* ptr; 3888 pst_index_ll* ptr;
3891 // size_t ret; 3889 // size_t ret;
3892 struct holder h = {buf, NULL, 0}; 3890 struct holder h = {buf, NULL, 0};
3893 DEBUG_ENT("_pst_ff_getID2block"); 3891 DEBUG_ENT("_pst_ff_getID2block");
3894 ptr = _pst_getID2(id2_head, id2); 3892 ptr = _pst_getID2(id2_head, id2);
3895 3893
3896 if (ptr == NULL) { 3894 if (ptr == NULL) {
3897 DEBUG_INDEX(("Cannot find id2 value %#x\n", id2)); 3895 DEBUG_INDEX(("Cannot find id2 value %#x\n", id2));
3896 DEBUG_RET();
3897 return 0;
3898 }
3898 DEBUG_RET(); 3899 DEBUG_RET();
3899 return 0; 3900 return _pst_ff_getID2data(pf, ptr, &h);
3900 } 3901 }
3901 DEBUG_RET(); 3902
3902 return _pst_ff_getID2data(pf, ptr, &h);
3903 }
3904 3903
3905 size_t _pst_ff_getID2data(pst_file *pf, pst_index_ll *ptr, struct holder *h) { 3904 size_t _pst_ff_getID2data(pst_file *pf, pst_index_ll *ptr, struct holder *h) {
3906 // if the attachment begins with 01 01, <= 256 bytes, it is stored in the record 3905 // if the attachment begins with 01 01, <= 256 bytes, it is stored in the record
3907 int32_t ret; 3906 int32_t ret;
3908 unsigned char *b = NULL, *t; 3907 unsigned char *b = NULL, *t;
3909 DEBUG_ENT("_pst_ff_getID2data"); 3908 DEBUG_ENT("_pst_ff_getID2data");
3910 if (!(ptr->id & 0x02)) { 3909 if (!(ptr->id & 0x02)) {
3911 ret = _pst_ff_getIDblock_dec(pf, ptr->id, &b); 3910 ret = _pst_ff_getIDblock_dec(pf, ptr->id, &b);
3912 if (h->buf != NULL) { 3911 if (h->buf != NULL) {
3913 *(h->buf) = b; 3912 *(h->buf) = b;
3914 } else if (h->base64 == 1 && h->fp != NULL) { 3913 } else if (h->base64 == 1 && h->fp != NULL) {
3915 t = base64_encode(b, ret); 3914 t = base64_encode(b, ret);
3916 pst_fwrite(t, 1, strlen(t), h->fp); 3915 pst_fwrite(t, 1, strlen(t), h->fp);
3917 free(b); 3916 free(b);
3918 } else if (h->fp != NULL) { 3917 } else if (h->fp != NULL) {
3919 pst_fwrite(b, 1, ret, h->fp); 3918 pst_fwrite(b, 1, ret, h->fp);
3920 free(b); 3919 free(b);
3921 } 3920 }
3922 // if ((*buf)[0] == 0x1) { 3921 //if ((*buf)[0] == 0x1) {
3923 // DEBUG_WARN(("WARNING: buffer starts with 0x1, but I didn't expect it to!\n")); 3922 // DEBUG_WARN(("WARNING: buffer starts with 0x1, but I didn't expect it to!\n"));
3924 // } 3923 //}
3925 } else { 3924 } else {
3926 // here we will assume it is a block that points to others 3925 // here we will assume it is a block that points to others
3927 DEBUG_READ(("Assuming it is a multi-block record because of it's id\n")); 3926 DEBUG_READ(("Assuming it is a multi-block record because of it's id\n"));
3928 ret = _pst_ff_compile_ID(pf, ptr->id, h, 0); 3927 ret = _pst_ff_compile_ID(pf, ptr->id, h, 0);
3929 } 3928 }
3930 if (h->buf != NULL && *h->buf != NULL) 3929 if (h->buf != NULL && *h->buf != NULL)
3931 (*(h->buf))[ret]='\0'; 3930 (*(h->buf))[ret]='\0';
3932 DEBUG_RET(); 3931 DEBUG_RET();
3933 return ret; 3932 return ret;
3934 } 3933 }
3934
3935 3935
3936 size_t _pst_ff_compile_ID(pst_file *pf, u_int32_t id, struct holder *h, int32_t size) { 3936 size_t _pst_ff_compile_ID(pst_file *pf, u_int32_t id, struct holder *h, int32_t size) {
3937 size_t z, a; 3937 size_t z, a;
3938 u_int16_t count, y; 3938 u_int16_t count, y;
3939 u_int32_t x, b; 3939 u_int32_t x, b;
3940 unsigned char * buf3 = NULL, *buf2 = NULL, *t; 3940 unsigned char * buf3 = NULL, *buf2 = NULL, *t;
3941 unsigned char fdepth; 3941 unsigned char fdepth;
3942 3942
3943 DEBUG_ENT("_pst_ff_compile_ID"); 3943 DEBUG_ENT("_pst_ff_compile_ID");
3944 if ((a = _pst_ff_getIDblock(pf, id, &buf3))==0) 3944 if ((a = _pst_ff_getIDblock(pf, id, &buf3))==0)
3945 return 0; 3945 return 0;
3946 if ((buf3[0] != 0x1)) { // if bit 8 is set) { 3946 if ((buf3[0] != 0x1)) { // if bit 8 is set) {
3947 // if ((buf3)[0] != 0x1 && (buf3)[1] > 4) { 3947 // if ((buf3)[0] != 0x1 && (buf3)[1] > 4) {
3948 DEBUG_WARN(("WARNING: buffer doesn't start with 0x1, but I expected it to or doesn't have it's two-bit set!\n")); 3948 DEBUG_WARN(("WARNING: buffer doesn't start with 0x1, but I expected it to or doesn't have it's two-bit set!\n"));
3949 DEBUG_WARN(("Treating as normal buffer\n")); 3949 DEBUG_WARN(("Treating as normal buffer\n"));
3950 if (pf->encryption) 3950 if (pf->encryption)
3951 _pst_decrypt(buf3, a, pf->encryption); 3951 _pst_decrypt(buf3, a, pf->encryption);
3952 if (h->buf != NULL) 3952 if (h->buf != NULL)
3953 *(h->buf) = buf3; 3953 *(h->buf) = buf3;
3954 else if (h->base64 == 1 && h->fp != NULL) { 3954 else if (h->base64 == 1 && h->fp != NULL) {
3955 t = base64_encode(buf3, a); 3955 t = base64_encode(buf3, a);
3956 pst_fwrite(t, 1, strlen(t), h->fp); 3956 pst_fwrite(t, 1, strlen(t), h->fp);
3957 free(buf3); 3957 free(buf3);
3958 } else if (h->fp != NULL) { 3958 } else if (h->fp != NULL) {
3959 pst_fwrite(buf3, 1, a, h->fp); 3959 pst_fwrite(buf3, 1, a, h->fp);
3960 free(buf3); 3960 free(buf3);
3961 } 3961 }
3962 DEBUG_RET();
3963 return a;
3964 }
3965 memcpy (&count, &(buf3[2]), sizeof(int16_t));
3966 LE16_CPU(count);
3967 memcpy (&fdepth, &(buf3[1]), sizeof(char));
3968 DEBUG_READ(("Seen index to blocks. Depth is %i\n", fdepth));
3969 DEBUG_READ(("There are %i ids here\n", count));
3970
3971 y = 0;
3972 while (y < count) {
3973 memcpy(&x, &buf3[0x08+(y*4)], sizeof(int32_t));
3974 LE32_CPU(x);
3975 if (fdepth == 0x1) {
3976 if ((z = _pst_ff_getIDblock(pf, x, &buf2)) == 0) {
3977 DEBUG_WARN(("call to getIDblock returned zero %i\n", z));
3978 if (buf2 != NULL)
3979 free(buf2);
3980 free(buf3);
3981 return z;
3982 }
3983 if (pf->encryption) _pst_decrypt(buf2, z, pf->encryption);
3984 if (h->buf != NULL) {
3985 *(h->buf) = realloc(*(h->buf), size+z+1);
3986 DEBUG_READ(("appending read data of size %i onto main buffer from pos %i\n", z, size));
3987 memcpy(&((*(h->buf))[size]), buf2, z);
3988 }
3989 else if (h->base64 == 1 && h->fp != NULL) {
3990 // include any byte left over from the last one encoding
3991 buf2 = (char*)realloc(buf2, z+h->base64_extra);
3992 memmove(buf2+h->base64_extra, buf2, z);
3993 memcpy(buf2, h->base64_extra_chars, h->base64_extra);
3994 z+= h->base64_extra;
3995
3996 b = z % 3; // find out how many bytes will be left over after the encoding.
3997 // and save them
3998 memcpy(h->base64_extra_chars, &(buf2[z-b]), b);
3999 h->base64_extra = b;
4000 t = base64_encode(buf2, z-b);
4001 pst_fwrite(t, 1, strlen(t), h->fp);
4002 DEBUG_READ(("writing %i bytes to file as base64 [%i]. Currently %i\n",
4003 z, strlen(t), size));
4004 }
4005 else if (h->fp != NULL) {
4006 DEBUG_READ(("writing %i bytes to file. Currently %i\n", z, size));
4007 pst_fwrite(buf2, 1, z, h->fp);
4008 }
4009 size += z;
4010 y++;
4011 }
4012 else {
4013 if ((z = _pst_ff_compile_ID(pf, x, h, size)) == 0) {
4014 DEBUG_WARN(("recursive called returned zero %i\n", z));
4015 free(buf3);
4016 DEBUG_RET();
4017 return z;
4018 }
4019 size = z;
4020 y++;
4021 }
4022 }
4023 free(buf3);
4024 if (buf2 != NULL)
4025 free(buf2);
3962 DEBUG_RET(); 4026 DEBUG_RET();
3963 return a; 4027 return size;
3964 } 4028 }
3965 memcpy (&count, &(buf3[2]), sizeof(int16_t)); 4029
3966 LE16_CPU(count);
3967 memcpy (&fdepth, &(buf3[1]), sizeof(char));
3968 DEBUG_READ(("Seen index to blocks. Depth is %i\n", fdepth));
3969 DEBUG_READ(("There are %i ids here\n", count));
3970
3971 y = 0;
3972 while (y < count) {
3973 memcpy(&x, &buf3[0x08+(y*4)], sizeof(int32_t));
3974 LE32_CPU(x);
3975 if (fdepth == 0x1) {
3976 if ((z = _pst_ff_getIDblock(pf, x, &buf2)) == 0) {
3977 DEBUG_WARN(("call to getIDblock returned zero %i\n", z));
3978 if (buf2 != NULL)
3979 free(buf2);
3980 free(buf3);
3981 return z;
3982 }
3983 if (pf->encryption)
3984 _pst_decrypt(buf2, z, pf->encryption);
3985 if (h->buf != NULL) {
3986 *(h->buf) = realloc(*(h->buf), size+z+1);
3987 DEBUG_READ(("appending read data of size %i onto main buffer from pos %i\n", z, size));
3988 memcpy(&((*(h->buf))[size]), buf2, z);
3989 } else if (h->base64 == 1 && h->fp != NULL) {
3990 // include any byte left over from the last one encoding
3991 buf2 = (char*)realloc(buf2, z+h->base64_extra);
3992 memmove(buf2+h->base64_extra, buf2, z);
3993 memcpy(buf2, h->base64_extra_chars, h->base64_extra);
3994 z+= h->base64_extra;
3995
3996 b = z % 3; // find out how many bytes will be left over after the encoding.
3997 // and save them
3998 memcpy(h->base64_extra_chars, &(buf2[z-b]), b);
3999 h->base64_extra = b;
4000 t = base64_encode(buf2, z-b);
4001 pst_fwrite(t, 1, strlen(t), h->fp);
4002 DEBUG_READ(("writing %i bytes to file as base64 [%i]. Currently %i\n",
4003 z, strlen(t), size));
4004 } else if (h->fp != NULL) {
4005 DEBUG_READ(("writing %i bytes to file. Currently %i\n", z, size));
4006 pst_fwrite(buf2, 1, z, h->fp);
4007 }
4008 size += z;
4009 y++;
4010 } else {
4011 if ((z = _pst_ff_compile_ID(pf, x, h, size)) == 0) {
4012 DEBUG_WARN(("recursive called returned zero %i\n", z));
4013 free(buf3);
4014 DEBUG_RET();
4015 return z;
4016 }
4017 size = z;
4018 y++;
4019 }
4020 }
4021 free(buf3);
4022 if (buf2 != NULL)
4023 free(buf2);
4024 DEBUG_RET();
4025 return size;
4026 }
4027 4030
4028 #ifdef _MSC_VER 4031 #ifdef _MSC_VER
4029 char * fileTimeToAscii(const FILETIME* filetime) { 4032 char * fileTimeToAscii(const FILETIME* filetime) {
4030 time_t t; 4033 time_t t;
4031 DEBUG_ENT("fileTimeToAscii"); 4034 DEBUG_ENT("fileTimeToAscii");
4032 t = fileTimeToUnixTime(filetime, 0); 4035 t = fileTimeToUnixTime(filetime, 0);
4033 if (t == -1) 4036 if (t == -1)
4034 DEBUG_WARN(("ERROR time_t varible that was produced, is -1\n")); 4037 DEBUG_WARN(("ERROR time_t varible that was produced, is -1\n"));
4035 DEBUG_RET(); 4038 DEBUG_RET();
4036 return ctime(&t); 4039 return ctime(&t);
4037 } 4040 }
4041
4038 4042
4039 time_t fileTimeToUnixTime(const FILETIME* filetime, DWORD *x) { 4043 time_t fileTimeToUnixTime(const FILETIME* filetime, DWORD *x) {
4040 SYSTEMTIME s; 4044 SYSTEMTIME s;
4041 struct tm t; 4045 struct tm t;
4042 DEBUG_ENT("fileTimeToUnixTime"); 4046 DEBUG_ENT("fileTimeToUnixTime");
4043 memset (&t, 0, sizeof(struct tm)); 4047 memset (&t, 0, sizeof(struct tm));
4044 FileTimeToSystemTime(filetime, &s); 4048 FileTimeToSystemTime(filetime, &s);
4045 t.tm_year = s.wYear-1900; // this is what is required 4049 t.tm_year = s.wYear-1900; // this is what is required
4046 t.tm_mon = s.wMonth-1; // also required! It made me a bit confused 4050 t.tm_mon = s.wMonth-1; // also required! It made me a bit confused
4047 t.tm_mday = s.wDay; 4051 t.tm_mday = s.wDay;
4048 t.tm_hour = s.wHour; 4052 t.tm_hour = s.wHour;
4049 t.tm_min = s.wMinute; 4053 t.tm_min = s.wMinute;
4050 t.tm_sec = s.wSecond; 4054 t.tm_sec = s.wSecond;
4051 DEBUG_RET(); 4055 DEBUG_RET();
4052 return mktime(&t); 4056 return mktime(&t);
4053 } 4057 }
4058
4054 4059
4055 struct tm * fileTimeToStructTM (const FILETIME *filetime) { 4060 struct tm * fileTimeToStructTM (const FILETIME *filetime) {
4056 time_t t1; 4061 time_t t1;
4057 t1 = fileTimeToUnixTime(filetime, 0); 4062 t1 = fileTimeToUnixTime(filetime, 0);
4058 return gmtime(&t1); 4063 return gmtime(&t1);
4059 } 4064 }
4065
4060 4066
4061 #endif //_MSC_VER 4067 #endif //_MSC_VER
4062 4068
4063 int32_t pst_stricmp(char *a, char *b) { 4069 int32_t pst_stricmp(char *a, char *b) {
4064 // compare strings case-insensitive. 4070 // compare strings case-insensitive.
4065 // returns -1 if a < b, 0 if a==b, 1 if a > b 4071 // returns -1 if a < b, 0 if a==b, 1 if a > b
4066 while(*a != '\0' && *b != '\0' && toupper(*a)==toupper(*b)) { 4072 while(*a != '\0' && *b != '\0' && toupper(*a)==toupper(*b)) {
4067 a++; b++; 4073 a++; b++;
4068 } 4074 }
4069 if (toupper(*a) == toupper(*b)) 4075 if (toupper(*a) == toupper(*b))
4070 return 0; 4076 return 0;
4071 else if (toupper(*a) < toupper(*b)) 4077 else if (toupper(*a) < toupper(*b))
4072 return -1; 4078 return -1;
4073 else 4079 else
4074 return 1; 4080 return 1;
4075 } 4081 }
4082
4076 4083
4077 int32_t pst_strincmp(char *a, char *b, int32_t x) { 4084 int32_t pst_strincmp(char *a, char *b, int32_t x) {
4078 // compare upto x chars in string a and b case-insensitively 4085 // compare upto x chars in string a and b case-insensitively
4079 // returns -1 if a < b, 0 if a==b, 1 if a > b 4086 // returns -1 if a < b, 0 if a==b, 1 if a > b
4080 int32_t y = 0; 4087 int32_t y = 0;
4081 while (*a != '\0' && *b != '\0' && y < x && toupper(*a)==toupper(*b)) { 4088 while (*a != '\0' && *b != '\0' && y < x && toupper(*a)==toupper(*b)) {
4082 a++; b++; y++; 4089 a++; b++; y++;
4083 } 4090 }
4084 // if we have reached the end of either string, or a and b still match 4091 // if we have reached the end of either string, or a and b still match
4085 if (*a == '\0' || *b == '\0' || toupper(*a)==toupper(*b)) 4092 if (*a == '\0' || *b == '\0' || toupper(*a)==toupper(*b))
4086 return 0; 4093 return 0;
4087 else if (toupper(*a) < toupper(*b)) 4094 else if (toupper(*a) < toupper(*b))
4088 return -1; 4095 return -1;
4089 else 4096 else
4090 return 1; 4097 return 1;
4091 } 4098 }
4099
4092 4100
4093 size_t pst_fwrite(const void*ptr, size_t size, size_t nmemb, FILE*stream) { 4101 size_t pst_fwrite(const void*ptr, size_t size, size_t nmemb, FILE*stream) {
4094 size_t r; 4102 size_t r;
4095 DEBUG_ENT("pst_fwrite"); 4103 DEBUG_ENT("pst_fwrite");
4096 if (ptr != NULL) 4104 if (ptr != NULL)
4097 r = fwrite(ptr, size, nmemb, stream); 4105 r = fwrite(ptr, size, nmemb, stream);
4098 else { 4106 else {
4099 r = 0; 4107 r = 0;
4100 DEBUG_WARN(("An attempt to write a NULL Pointer was made\n")); 4108 DEBUG_WARN(("An attempt to write a NULL Pointer was made\n"));
4101 } 4109 }
4102 DEBUG_RET(); 4110 DEBUG_RET();
4103 return r; 4111 return r;
4104 } 4112 }
4113
4105 4114
4106 char * _pst_wide_to_single(char *wt, int32_t size) { 4115 char * _pst_wide_to_single(char *wt, int32_t size) {
4107 // returns the first byte of each wide char. the size is the number of bytes in source 4116 // returns the first byte of each wide char. the size is the number of bytes in source
4108 char *x, *y; 4117 char *x, *y;
4109 DEBUG_ENT("_pst_wide_to_single"); 4118 DEBUG_ENT("_pst_wide_to_single");
4110 x = xmalloc((size/2)+1); 4119 x = xmalloc((size/2)+1);
4111 y = x; 4120 y = x;
4112 while (size != 0 && *wt != '\0') { 4121 while (size != 0 && *wt != '\0') {
4113 *y = *wt; 4122 *y = *wt;
4114 wt+=2; 4123 wt+=2;
4115 size -= 2; 4124 size -= 2;
4116 y++; 4125 y++;
4117 } 4126 }
4118 *y = '\0'; 4127 *y = '\0';
4119 DEBUG_RET(); 4128 DEBUG_RET();
4120 return x; 4129 return x;
4121 } 4130 }
4122 4131