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, 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); } }