void SaveVTask(TNEFStruct TNEF) { variableLength *vl; variableLength *filename; int index,i; char ifilename[256]; char *charptr, *charptr2; dtr thedate; FILE *fptr; DDWORD *ddword_ptr; DDWORD ddword_val; vl = MAPIFindProperty(&(TNEF.MapiProperties), PROP_TAG(PT_STRING8, PR_CONVERSATION_TOPIC)); if (vl == MAPI_UNDEFINED) { return; } index = strlen(vl->data); while (vl->data[index] == ' ') vl->data[index--] = 0; if (filepath == NULL) { sprintf(ifilename, "%s.vcf", vl->data); } else { sprintf(ifilename, "%s/%s.vcf", filepath, vl->data); } for(i=0; i<strlen(ifilename); i++) if (ifilename[i] == ' ') ifilename[i] = '_'; printf("%s\n", ifilename); if (savefiles == 0) return; if ((fptr = fopen(ifilename, "wb"))==NULL) { printf("Error writing file to disk!"); } else { fprintf(fptr, "BEGIN:VCALENDAR\n"); fprintf(fptr, PRODID); fprintf(fptr, "VERSION:2.0\n"); fprintf(fptr, "METHOD:PUBLISH\n"); filename = NULL; fprintf(fptr, "BEGIN:VTODO\n"); if (TNEF.messageID[0] != 0) { fprintf(fptr,"UID:%s\n", TNEF.messageID); } filename = MAPIFindUserProp(&(TNEF.MapiProperties), \ PROP_TAG(PT_STRING8, 0x8122)); if (filename != MAPI_UNDEFINED) { fprintf(fptr, "ORGANIZER:%s\n", filename->data); } if ((filename = MAPIFindProperty(&(TNEF.MapiProperties), PROP_TAG(PT_STRING8, PR_DISPLAY_TO))) != MAPI_UNDEFINED) { filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_STRING8, 0x811f)); } if ((filename != MAPI_UNDEFINED) && (filename->size > 1)) { charptr = filename->data-1; charptr2=strstr(charptr+1, ";"); while (charptr != NULL) { charptr++; charptr2 = strstr(charptr, ";"); if (charptr2 != NULL) { *charptr2 = 0; } while (*charptr == ' ') charptr++; fprintf(fptr, "ATTENDEE;CN=%s;ROLE=REQ-PARTICIPANT:%s\n", charptr, charptr); charptr = charptr2; } } if (TNEF.subject.size > 0) { fprintf(fptr,"SUMMARY:"); Cstylefprint(fptr,&(TNEF.subject)); fprintf(fptr,"\n"); } if (TNEF.body.size > 0) { fprintf(fptr,"DESCRIPTION:"); Cstylefprint(fptr,&(TNEF.body)); fprintf(fptr,"\n"); } filename = MAPIFindProperty(&(TNEF.MapiProperties), \ PROP_TAG(PT_SYSTIME, PR_CREATION_TIME)); if (filename != MAPI_UNDEFINED) { fprintf(fptr, "DTSTAMP:"); MAPISysTimetoDTR(filename->data, &thedate); fprintf(fptr,"%04i%02i%02iT%02i%02i%02iZ\n", thedate.wYear, thedate.wMonth, thedate.wDay, thedate.wHour, thedate.wMinute, thedate.wSecond); } filename = MAPIFindUserProp(&(TNEF.MapiProperties), \ PROP_TAG(PT_SYSTIME, 0x8517)); if (filename != MAPI_UNDEFINED) { fprintf(fptr, "DUE:"); MAPISysTimetoDTR(filename->data, &thedate); fprintf(fptr,"%04i%02i%02iT%02i%02i%02iZ\n", thedate.wYear, thedate.wMonth, thedate.wDay, thedate.wHour, thedate.wMinute, thedate.wSecond); } filename = MAPIFindProperty(&(TNEF.MapiProperties), \ PROP_TAG(PT_SYSTIME, PR_LAST_MODIFICATION_TIME)); if (filename != MAPI_UNDEFINED) { fprintf(fptr, "LAST-MODIFIED:"); MAPISysTimetoDTR(filename->data, &thedate); fprintf(fptr,"%04i%02i%02iT%02i%02i%02iZ\n", thedate.wYear, thedate.wMonth, thedate.wDay, thedate.wHour, thedate.wMinute, thedate.wSecond); } // Class filename = MAPIFindUserProp(&(TNEF.MapiProperties), \ PROP_TAG(PT_BOOLEAN, 0x8506)); if (filename != MAPI_UNDEFINED) { ddword_ptr = (DDWORD*)filename->data; ddword_val = SwapDDWord((BYTE*)ddword_ptr); fprintf(fptr, "CLASS:" ); if (*ddword_ptr == 1) { fprintf(fptr,"PRIVATE\n"); } else { fprintf(fptr,"PUBLIC\n"); } } fprintf(fptr, "END:VTODO\n"); fprintf(fptr, "END:VCALENDAR\n"); fclose(fptr); } }
void saveVCalendar(TNEFStruct *tnef) { char ifilename[256]; variableLength *filename; char *charptr, *charptr2; FILE *fptr; int index; DDWORD *ddword_ptr; DDWORD ddword_val; dtr thedate; if (filepath == NULL) { sprintf(ifilename, "calendar.vcf"); } else { sprintf(ifilename, "%s/calendar.vcf", filepath); } printf("%s\n", ifilename); if ((fptr = fopen(ifilename, "wb"))==NULL) { printf("Error writing file to disk!"); } else { fprintf(fptr, "BEGIN:VCALENDAR\n"); if (tnef->messageClass[0] != 0) { charptr2=tnef->messageClass; charptr=charptr2; while (*charptr != 0) { if (*charptr == '.') { charptr2 = charptr; } charptr++; } if (strcmp(charptr2, ".MtgCncl") == 0) { fprintf(fptr, "METHOD:CANCEL\n"); } else { fprintf(fptr, "METHOD:REQUEST\n"); } } else { fprintf(fptr, "METHOD:REQUEST\n"); } fprintf(fptr, "VERSION:2.0\n"); fprintf(fptr, "BEGIN:VEVENT\n"); /* UID After alot of comparisons, I'm reasonably sure this is totally wrong. But it's not really necessary. */ /* I think it only exists to connect future modification entries to this entry. so as long as it's incorrectly interpreted the same way every time, it should be ok :) */ filename = NULL; if ((filename=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_BINARY, 0x3))) == MAPI_UNDEFINED) { if ((filename=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_BINARY, 0x23))) == MAPI_UNDEFINED) { filename = NULL; } } if (filename!=NULL) { fprintf(fptr, "UID:"); for(index=0;index<filename->size;index++) { fprintf(fptr,"%02X", (unsigned char)filename->data[index]); } fprintf(fptr,"\n"); } /* Sequence */ filename = NULL; if ((filename=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_LONG, 0x8201))) != MAPI_UNDEFINED) { ddword_ptr = (DDWORD*)filename->data; fprintf(fptr, "SEQUENCE:%i\n", (int) *ddword_ptr); } if ((filename=MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_BINARY, PR_SENDER_SEARCH_KEY))) != MAPI_UNDEFINED) { charptr = filename->data; charptr2 = strstr(charptr, ":"); if (charptr2 == NULL) charptr2 = charptr; else charptr2++; fprintf(fptr, "ORGANIZER;CN=\"%s\":MAILTO:%s\n", charptr2, charptr2); } /* Required Attendees */ if ((filename = MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, 0x823b))) != MAPI_UNDEFINED) { /* We have a list of required participants, so write them out. */ if (filename->size > 1) { charptr = filename->data-1; charptr2=strstr(charptr+1, ";"); while (charptr != NULL) { charptr++; charptr2 = strstr(charptr, ";"); if (charptr2 != NULL) { *charptr2 = 0; } while (*charptr == ' ') charptr++; fprintf(fptr, "ATTENDEE;PARTSTAT=NEEDS-ACTION;"); fprintf(fptr, "ROLE=REQ-PARTICIPANT;RSVP=TRUE;"); fprintf(fptr, "CN=\"%s\":MAILTO:%s\n", charptr, charptr); charptr = charptr2; } } /* Optional attendees */ if ((filename = MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, 0x823c))) != MAPI_UNDEFINED) { /* The list of optional participants */ if (filename->size > 1) { charptr = filename->data-1; charptr2=strstr(charptr+1, ";"); while (charptr != NULL) { charptr++; charptr2 = strstr(charptr, ";"); if (charptr2 != NULL) { *charptr2 = 0; } while (*charptr == ' ') charptr++; fprintf(fptr, "ATTENDEE;PARTSTAT=NEEDS-ACTION;"); fprintf(fptr, "ROLE=OPT-PARTICIPANT;RSVP=TRUE;"); fprintf(fptr, "CN=\"%s\":MAILTO:%s\n", charptr, charptr); charptr = charptr2; } } } } else if ((filename = MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, 0x8238))) != MAPI_UNDEFINED) { if (filename->size > 1) { charptr = filename->data-1; charptr2=strstr(charptr+1, ";"); while (charptr != NULL) { charptr++; charptr2 = strstr(charptr, ";"); if (charptr2 != NULL) { *charptr2 = 0; } while (*charptr == ' ') charptr++; fprintf(fptr, "ATTENDEE;PARTSTAT=NEEDS-ACTION;"); fprintf(fptr, "ROLE=REQ-PARTICIPANT;RSVP=TRUE;"); fprintf(fptr, "CN=\"%s\":MAILTO:%s\n", charptr, charptr); charptr = charptr2; } } } /* Summary */ filename = NULL; if((filename=MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_CONVERSATION_TOPIC))) != MAPI_UNDEFINED) { fprintf(fptr, "SUMMARY:"); cstylefprint(fptr, filename); fprintf(fptr, "\n"); } /* Description */ if ((filename=MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_BINARY, PR_RTF_COMPRESSED))) != MAPI_UNDEFINED) { variableLength *buf; buf = (variableLength *)g_malloc (sizeof(variableLength)); if ((buf->data = DecompressRTF(filename, &(buf->size))) != NULL) { fprintf(fptr, "DESCRIPTION:"); printRtf(fptr, buf); free(buf->data); } } /* Location */ filename = NULL; if ((filename=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, 0x0002))) == MAPI_UNDEFINED) { if ((filename=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, 0x8208))) == MAPI_UNDEFINED) { filename = NULL; } } if (filename != NULL) { fprintf(fptr,"LOCATION: %s\n", filename->data); } /* Date Start */ filename = NULL; if ((filename=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_SYSTIME, 0x820d))) == MAPI_UNDEFINED) { if ((filename=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_SYSTIME, 0x8516))) == MAPI_UNDEFINED) { filename=NULL; } } if (filename != NULL) { fprintf(fptr, "DTSTART:"); MAPISysTimetoDTR(filename->data, &thedate); fprintf(fptr,"%04i%02i%02iT%02i%02i%02iZ\n", thedate.wYear, thedate.wMonth, thedate.wDay, thedate.wHour, thedate.wMinute, thedate.wSecond); } /* Date End */ filename = NULL; if ((filename=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_SYSTIME, 0x820e))) == MAPI_UNDEFINED) { if ((filename=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_SYSTIME, 0x8517))) == MAPI_UNDEFINED) { filename=NULL; } } if (filename != NULL) { fprintf(fptr, "DTEND:"); MAPISysTimetoDTR(filename->data, &thedate); fprintf(fptr,"%04i%02i%02iT%02i%02i%02iZ\n", thedate.wYear, thedate.wMonth, thedate.wDay, thedate.wHour, thedate.wMinute, thedate.wSecond); } /* Date Stamp */ filename = NULL; if ((filename=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_SYSTIME, 0x8202))) != MAPI_UNDEFINED) { fprintf(fptr, "CREATED:"); MAPISysTimetoDTR(filename->data, &thedate); fprintf(fptr,"%04i%02i%02iT%02i%02i%02iZ\n", thedate.wYear, thedate.wMonth, thedate.wDay, thedate.wHour, thedate.wMinute, thedate.wSecond); } /* Class */ filename = NULL; if ((filename=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_BOOLEAN, 0x8506))) != MAPI_UNDEFINED) { ddword_ptr = (DDWORD*)filename->data; ddword_val = SwapDDWord((BYTE*)ddword_ptr); fprintf(fptr, "CLASS:" ); if (*ddword_ptr == 1) { fprintf(fptr,"PRIVATE\n"); } else { fprintf(fptr,"PUBLIC\n"); } } /* Recurrence */ filename = NULL; if ((filename=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_BINARY, 0x8216))) != MAPI_UNDEFINED) { printRrule(fptr, filename->data, filename->size, tnef); } /* Wrap it up */ fprintf(fptr, "END:VEVENT\n"); fprintf(fptr, "END:VCALENDAR\n"); fclose(fptr); } }
void SaveVCalendar(TNEFStruct TNEF, int isMtgReq) { char ifilename[MAX_FILENAME_SIZE]; variableLength *filename; char *charptr, *charptr2; FILE *fptr; int index; DDWORD *ddword_ptr; dtr thedate; if(isMtgReq) { CreateUniqueFilename(ifilename, MAX_FILENAME_SIZE, "MtgReq", "ics", filepath); } else { CreateUniqueFilename(ifilename, MAX_FILENAME_SIZE, "calendar", "ics", filepath); } printf("%s\n", ifilename); if (savefiles == 0) return; if ((fptr = fopen(ifilename, "wb")) == NULL) { printf("Error writing file to disk!"); } else { fprintf(fptr, "BEGIN:VCALENDAR\n"); if (TNEF.messageClass[0] != 0) { charptr2 = TNEF.messageClass; charptr = charptr2; while (*charptr != 0) { if (*charptr == '.') { charptr2 = charptr; } charptr++; } if (strcmp((char*)charptr2, ".MtgCncl") == 0) { fprintf(fptr, "METHOD:CANCEL\n"); } else { fprintf(fptr, "METHOD:REQUEST\n"); } } else { fprintf(fptr, "METHOD:REQUEST\n"); } fprintf(fptr, PRODID); fprintf(fptr, "VERSION:2.0\n"); fprintf(fptr, "BEGIN:VEVENT\n"); // UID // After alot of comparisons, I'm reasonably sure this is totally // wrong. But it's not really necessary. // // I think it only exists to connect future modification entries to // this entry. so as long as it's incorrectly interpreted the same way // every time, it should be ok :) filename = NULL; if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_BINARY, 0x3))) == MAPI_UNDEFINED) { if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_BINARY, 0x23))) == MAPI_UNDEFINED) { filename = NULL; } } if (filename != NULL) { fprintf(fptr, "UID:"); for (index = 0; index < filename->size; index++) { fprintf(fptr, "%02X", (unsigned char)filename->data[index]); } fprintf(fptr, "\n"); } // Sequence filename = NULL; if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_LONG, 0x8201))) != MAPI_UNDEFINED) { ddword_ptr = (DDWORD *)filename->data; fprintf(fptr, "SEQUENCE:%i\n", (int) *ddword_ptr); } filename = NULL; if ((filename = MAPIFindProperty(&(TNEF.MapiProperties), PROP_TAG(PT_BINARY, PR_SENDER_SEARCH_KEY))) == MAPI_UNDEFINED) { if ((filename = MAPIFindProperty(&(TNEF.MapiProperties), PROP_TAG(PT_UNICODE, PR_SENT_REPRESENTING_EMAIL_ADDRESS))) == MAPI_UNDEFINED) { filename = NULL; } } if (filename != NULL) { charptr = (char*)filename->data; charptr2 = (char*)strstr((char*)charptr, ":"); if (charptr2 == NULL) charptr2 = charptr; else charptr2++; fprintf(fptr, "ORGANIZER;CN=\"%s\":MAILTO:%s\n", charptr2, charptr2); } // Required Attendees filename = NULL; if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_STRING8, 0x823b))) == MAPI_UNDEFINED) { if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_UNICODE, 0x823b))) == MAPI_UNDEFINED) { filename = NULL; } } if (filename != NULL) { // We have a list of required participants, so // write them out. if (strlen((char*)filename->data) > 1) { charptr = (char*)filename->data - 1; charptr2 = (char*)strstr((char*)(charptr + 1), ";"); while (charptr != NULL) { charptr++; charptr2 = (char *)strstr((char*)charptr, ";"); if (charptr2 != NULL) { *charptr2 = 0; } while (*charptr == ' ') charptr++; fprintf(fptr, "ATTENDEE;PARTSTAT=NEEDS-ACTION;"); fprintf(fptr, "ROLE=REQ-PARTICIPANT;RSVP=TRUE;"); fprintf(fptr, "CN=\"%s\":MAILTO:%s\n", charptr, charptr); charptr = charptr2; } } // Optional attendees filename = NULL; if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_STRING8, 0x823c))) == MAPI_UNDEFINED) { if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_UNICODE, 0x823c))) == MAPI_UNDEFINED) { filename = NULL; } } if (filename != NULL) { // The list of optional participants if (strlen((char*)filename->data) > 1) { charptr = (char*)filename->data - 1; charptr2 = (char *)strstr((char*)(charptr + 1), ";"); while (charptr != NULL) { charptr++; charptr2 = (char *)strstr((char*)charptr, ";"); if (charptr2 != NULL) { *charptr2 = 0; } while (*charptr == ' ') charptr++; fprintf(fptr, "ATTENDEE;PARTSTAT=NEEDS-ACTION;"); fprintf(fptr, "ROLE=OPT-PARTICIPANT;RSVP=TRUE;"); fprintf(fptr, "CN=\"%s\":MAILTO:%s\n", charptr, charptr); charptr = charptr2; } } } } else { filename = NULL; if ((filename=MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_STRING8, 0x8238))) == MAPI_UNDEFINED) { if ((filename=MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_UNICODE, 0x8238))) == MAPI_UNDEFINED) { filename = NULL; } } if (filename != NULL) { if (strlen((char*)filename->data) > 1) { charptr = (char*)filename->data - 1; charptr2 = (char *)strstr((char*)(charptr + 1), ";"); while (charptr != NULL) { charptr++; charptr2 = (char *)strstr((char*)charptr, ";"); if (charptr2 != NULL) { *charptr2 = 0; } while (*charptr == ' ') charptr++; fprintf(fptr, "ATTENDEE;PARTSTAT=NEEDS-ACTION;"); fprintf(fptr, "ROLE=REQ-PARTICIPANT;RSVP=TRUE;"); fprintf(fptr, "CN=\"%s\":MAILTO:%s\n", charptr, charptr); charptr = charptr2; } } } } // Summary filename = NULL; if ((filename = MAPIFindProperty(&(TNEF.MapiProperties), PROP_TAG(PT_STRING8, PR_CONVERSATION_TOPIC))) == MAPI_UNDEFINED) { if ((filename = MAPIFindProperty(&(TNEF.MapiProperties), PROP_TAG(PT_UNICODE, PR_CONVERSATION_TOPIC))) == MAPI_UNDEFINED) { filename = NULL; } } if (filename != NULL) { fprintf(fptr, "SUMMARY:"); Cstylefprint(fptr, filename); fprintf(fptr, "\n"); } // Description if ((filename = MAPIFindProperty(&(TNEF.MapiProperties), PROP_TAG(PT_BINARY, PR_RTF_COMPRESSED))) != MAPI_UNDEFINED) { variableLength buf; if ((buf.data = DecompressRTF(filename, &(buf.size))) != NULL) { fprintf(fptr, "DESCRIPTION:"); PrintRTF(fptr, &buf); free(buf.data); } } // Location filename = NULL; if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_STRING8, 0x0002))) == MAPI_UNDEFINED) { if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_STRING8, 0x8208))) == MAPI_UNDEFINED) { if ((filename=MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_UNICODE, 0x0002))) == MAPI_UNDEFINED) { if ((filename=MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_UNICODE, 0x8208))) == MAPI_UNDEFINED) { filename = NULL; } } } } if (filename != NULL) { fprintf(fptr, "LOCATION: %s\n", filename->data); } // Date Start filename = NULL; if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_SYSTIME, 0x820d))) == MAPI_UNDEFINED) { if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_SYSTIME, 0x8516))) == MAPI_UNDEFINED) { filename = NULL; } } if (filename != NULL) { fprintf(fptr, "DTSTART:"); MAPISysTimetoDTR(filename->data, &thedate); fprintf(fptr, "%04i%02i%02iT%02i%02i%02iZ\n", thedate.wYear, thedate.wMonth, thedate.wDay, thedate.wHour, thedate.wMinute, thedate.wSecond); } // Date End filename = NULL; if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_SYSTIME, 0x820e))) == MAPI_UNDEFINED) { if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_SYSTIME, 0x8517))) == MAPI_UNDEFINED) { filename = NULL; } } if (filename != NULL) { fprintf(fptr, "DTEND:"); MAPISysTimetoDTR(filename->data, &thedate); fprintf(fptr, "%04i%02i%02iT%02i%02i%02iZ\n", thedate.wYear, thedate.wMonth, thedate.wDay, thedate.wHour, thedate.wMinute, thedate.wSecond); } // Date Stamp filename = NULL; if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_SYSTIME, 0x8202))) == MAPI_UNDEFINED) { if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_SYSTIME, 0x001a))) == MAPI_UNDEFINED) { filename = NULL; } } if (filename != NULL){ fprintf(fptr, "DTSTAMP:"); MAPISysTimetoDTR(filename->data, &thedate); fprintf(fptr, "%04i%02i%02iT%02i%02i%02iZ\n", thedate.wYear, thedate.wMonth, thedate.wDay, thedate.wHour, thedate.wMinute, thedate.wSecond); } // Class filename = NULL; if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_BOOLEAN, 0x8506))) != MAPI_UNDEFINED) { ddword_ptr = (DDWORD *)filename->data; fprintf(fptr, "CLASS:"); if (*ddword_ptr == 1) { fprintf(fptr, "PRIVATE\n"); } else { fprintf(fptr, "PUBLIC\n"); } } // Recurrence filename = NULL; if ((filename = MAPIFindUserProp(&(TNEF.MapiProperties), PROP_TAG(PT_BINARY, 0x8216))) != MAPI_UNDEFINED) { PrintRrule(fptr, (char*)filename->data, filename->size, TNEF); } // Wrap it up fprintf(fptr, "END:VEVENT\n"); fprintf(fptr, "END:VCALENDAR\n"); fclose(fptr); } }
void saveVCard(TNEFStruct *tnef) { char ifilename[512]; FILE *fptr; variableLength *vl; variableLength *pobox, *street, *city, *state, *zip, *country; dtr thedate; int boolean, i; if ((vl = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_DISPLAY_NAME))) == MAPI_UNDEFINED) { if ((vl=MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_COMPANY_NAME))) == MAPI_UNDEFINED) { if (tnef->subject.size > 0) { if (filepath == NULL) { sprintf(ifilename, "%s.vcard", tnef->subject.data); } else { sprintf(ifilename, "%s/%s.vcard", filepath, tnef->subject.data); } } else { if (filepath == NULL) { sprintf(ifilename, "unknown.vcard"); } else { sprintf(ifilename, "%s/unknown.vcard", filepath); } } } else { if (filepath == NULL) { sprintf(ifilename, "%s.vcard", vl->data); } else { sprintf(ifilename, "%s/%s.vcard", filepath, vl->data); } } } else { if (filepath == NULL) { sprintf(ifilename, "%s.vcard", vl->data); } else { sprintf(ifilename, "%s/%s.vcard", filepath, vl->data); } } for(i=0; i<strlen(ifilename); i++) if (ifilename[i] == ' ') ifilename[i] = '_'; printf("%s\n", ifilename); if ((fptr = fopen(ifilename, "wb"))==NULL) { printf("Error writing file to disk!"); } else { fprintf(fptr, "BEGIN:VCARD\n"); fprintf(fptr, "VERSION:2.1\n"); if (vl != MAPI_UNDEFINED) { fprintf(fptr, "FN:%s\n", vl->data); } fprintProperty(tnef, fptr, PT_STRING8, PR_NICKNAME, "NICKNAME:%s\n"); fprintUserProp(tnef, fptr, PT_STRING8, 0x8554, "MAILER:Microsoft Outlook %s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_SPOUSE_NAME, "X-EVOLUTION-SPOUSE:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_MANAGER_NAME, "X-EVOLUTION-MANAGER:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_ASSISTANT, "X-EVOLUTION-ASSISTANT:%s\n"); /* Organizational */ if ((vl=MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_COMPANY_NAME))) != MAPI_UNDEFINED) { if (vl->size > 0) { if ((vl->size == 1) && (vl->data[0] == 0)) { } else { fprintf(fptr,"ORG:%s", vl->data); if ((vl=MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_DEPARTMENT_NAME))) != MAPI_UNDEFINED) { fprintf(fptr,";%s", vl->data); } fprintf(fptr, "\n"); } } } fprintProperty(tnef, fptr, PT_STRING8, PR_OFFICE_LOCATION, "X-EVOLUTION-OFFICE:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_TITLE, "TITLE:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_PROFESSION, "ROLE:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_BODY, "NOTE:%s\n"); if (tnef->body.size > 0) { fprintf(fptr, "NOTE;QUOTED-PRINTABLE:"); quotedfprint(fptr, &(tnef->body)); fprintf(fptr,"\n"); } /* Business Address */ boolean = 0; if ((pobox = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_POST_OFFICE_BOX))) != MAPI_UNDEFINED) { boolean = 1; } if ((street = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_STREET_ADDRESS))) != MAPI_UNDEFINED) { boolean = 1; } if ((city = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_LOCALITY))) != MAPI_UNDEFINED) { boolean = 1; } if ((state = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_STATE_OR_PROVINCE))) != MAPI_UNDEFINED) { boolean = 1; } if ((zip = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_POSTAL_CODE))) != MAPI_UNDEFINED) { boolean = 1; } if ((country = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_COUNTRY))) != MAPI_UNDEFINED) { boolean = 1; } if (boolean == 1) { fprintf(fptr, "ADR;QUOTED-PRINTABLE;WORK:"); if (pobox != MAPI_UNDEFINED) { quotedfprint(fptr, pobox); } fprintf(fptr, ";;"); if (street != MAPI_UNDEFINED) { quotedfprint(fptr, street); } fprintf(fptr, ";"); if (city != MAPI_UNDEFINED) { quotedfprint(fptr, city); } fprintf(fptr, ";"); if (state != MAPI_UNDEFINED) { quotedfprint(fptr, state); } fprintf(fptr, ";"); if (zip != MAPI_UNDEFINED) { quotedfprint(fptr, zip); } fprintf(fptr, ";"); if (country != MAPI_UNDEFINED) { quotedfprint(fptr, country); } fprintf(fptr,"\n"); if ((vl = MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, 0x801b))) != MAPI_UNDEFINED) { fprintf(fptr, "LABEL;QUOTED-PRINTABLE;WORK:"); quotedfprint(fptr, vl); fprintf(fptr,"\n"); } } /* Home Address */ boolean = 0; if ((pobox = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_HOME_ADDRESS_POST_OFFICE_BOX))) != MAPI_UNDEFINED) { boolean = 1; } if ((street = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_HOME_ADDRESS_STREET))) != MAPI_UNDEFINED) { boolean = 1; } if ((city = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_HOME_ADDRESS_CITY))) != MAPI_UNDEFINED) { boolean = 1; } if ((state = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_HOME_ADDRESS_STATE_OR_PROVINCE))) != MAPI_UNDEFINED) { boolean = 1; } if ((zip = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_HOME_ADDRESS_POSTAL_CODE))) != MAPI_UNDEFINED) { boolean = 1; } if ((country = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_HOME_ADDRESS_COUNTRY))) != MAPI_UNDEFINED) { boolean = 1; } if (boolean == 1) { fprintf(fptr, "ADR;QUOTED-PRINTABLE;HOME:"); if (pobox != MAPI_UNDEFINED) { quotedfprint(fptr, pobox); } fprintf(fptr, ";;"); if (street != MAPI_UNDEFINED) { quotedfprint(fptr, street); } fprintf(fptr, ";"); if (city != MAPI_UNDEFINED) { quotedfprint(fptr, city); } fprintf(fptr, ";"); if (state != MAPI_UNDEFINED) { quotedfprint(fptr, state); } fprintf(fptr, ";"); if (zip != MAPI_UNDEFINED) { quotedfprint(fptr, zip); } fprintf(fptr, ";"); if (country != MAPI_UNDEFINED) { quotedfprint(fptr, country); } fprintf(fptr,"\n"); if ((vl = MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, 0x801a))) != MAPI_UNDEFINED) { fprintf(fptr, "LABEL;QUOTED-PRINTABLE;WORK:"); quotedfprint(fptr, vl); fprintf(fptr,"\n"); } } /* Other Address */ boolean = 0; if ((pobox = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_OTHER_ADDRESS_POST_OFFICE_BOX))) != MAPI_UNDEFINED) { boolean = 1; } if ((street = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_OTHER_ADDRESS_STREET))) != MAPI_UNDEFINED) { boolean = 1; } if ((city = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_OTHER_ADDRESS_CITY))) != MAPI_UNDEFINED) { boolean = 1; } if ((state = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_OTHER_ADDRESS_STATE_OR_PROVINCE))) != MAPI_UNDEFINED) { boolean = 1; } if ((zip = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_OTHER_ADDRESS_POSTAL_CODE))) != MAPI_UNDEFINED) { boolean = 1; } if ((country = MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, PR_OTHER_ADDRESS_COUNTRY))) != MAPI_UNDEFINED) { boolean = 1; } if (boolean == 1) { fprintf(fptr, "ADR;QUOTED-PRINTABLE;OTHER:"); if (pobox != MAPI_UNDEFINED) { quotedfprint(fptr, pobox); } fprintf(fptr, ";;"); if (street != MAPI_UNDEFINED) { quotedfprint(fptr, street); } fprintf(fptr, ";"); if (city != MAPI_UNDEFINED) { quotedfprint(fptr, city); } fprintf(fptr, ";"); if (state != MAPI_UNDEFINED) { quotedfprint(fptr, state); } fprintf(fptr, ";"); if (zip != MAPI_UNDEFINED) { quotedfprint(fptr, zip); } fprintf(fptr, ";"); if (country != MAPI_UNDEFINED) { quotedfprint(fptr, country); } fprintf(fptr,"\n"); } fprintProperty(tnef, fptr, PT_STRING8, PR_CALLBACK_TELEPHONE_NUMBER, "TEL;X-EVOLUTION-CALLBACK:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_PRIMARY_TELEPHONE_NUMBER, "TEL;PREF:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_MOBILE_TELEPHONE_NUMBER, "TEL;CELL:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_RADIO_TELEPHONE_NUMBER, "TEL;X-EVOLUTION-RADIO:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_CAR_TELEPHONE_NUMBER, "TEL;CAR:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_OTHER_TELEPHONE_NUMBER, "TEL;VOICE:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_PAGER_TELEPHONE_NUMBER, "TEL;PAGER:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_TELEX_NUMBER, "TEL;X-EVOLUTION-TELEX:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_ISDN_NUMBER, "TEL;ISDN:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_HOME2_TELEPHONE_NUMBER, "TEL;HOME:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_TTYTDD_PHONE_NUMBER, "TEL;X-EVOLUTION-TTYTDD:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_HOME_TELEPHONE_NUMBER, "TEL;HOME;VOICE:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_ASSISTANT_TELEPHONE_NUMBER, "TEL;X-EVOLUTION-ASSISTANT:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_COMPANY_MAIN_PHONE_NUMBER, "TEL;WORK:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_BUSINESS_TELEPHONE_NUMBER, "TEL;WORK:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_BUSINESS2_TELEPHONE_NUMBER, "TEL;WORK;VOICE:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_PRIMARY_FAX_NUMBER, "TEL;PREF;FAX:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_BUSINESS_FAX_NUMBER, "TEL;WORK;FAX:%s\n"); fprintProperty(tnef, fptr, PT_STRING8, PR_HOME_FAX_NUMBER, "TEL;HOME;FAX:%s\n"); /* Email addresses */ if ((vl=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, 0x8083))) == MAPI_UNDEFINED) { vl=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, 0x8084)); } if (vl != MAPI_UNDEFINED) { if (vl->size > 0) fprintf(fptr, "EMAIL:%s\n", vl->data); } if ((vl=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, 0x8093))) == MAPI_UNDEFINED) { vl=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, 0x8094)); } if (vl != MAPI_UNDEFINED) { if (vl->size > 0) fprintf(fptr, "EMAIL:%s\n", vl->data); } if ((vl=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, 0x80a3))) == MAPI_UNDEFINED) { vl=MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_STRING8, 0x80a4)); } if (vl != MAPI_UNDEFINED) { if (vl->size > 0) fprintf(fptr, "EMAIL:%s\n", vl->data); } fprintProperty(tnef, fptr, PT_STRING8, PR_BUSINESS_HOME_PAGE, "URL:%s\n"); fprintUserProp(tnef, fptr, PT_STRING8, 0x80d8, "FBURL:%s\n"); /* Birthday */ if ((vl=MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_SYSTIME, PR_BIRTHDAY))) != MAPI_UNDEFINED) { fprintf(fptr, "BDAY:"); MAPISysTimetoDTR(vl->data, &thedate); fprintf(fptr, "%i-%02i-%02i\n", thedate.wYear, thedate.wMonth, thedate.wDay); } /* Anniversary */ if ((vl=MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_SYSTIME, PR_WEDDING_ANNIVERSARY))) != MAPI_UNDEFINED) { fprintf(fptr, "X-EVOLUTION-ANNIVERSARY:"); MAPISysTimetoDTR(vl->data, &thedate); fprintf(fptr, "%i-%02i-%02i\n", thedate.wYear, thedate.wMonth, thedate.wDay); } fprintf(fptr, "END:VCARD\n"); } }