MimeInfo *tnef_parse_rtf(TNEFStruct *tnef, variableLength *tmp_var) { variableLength buf; MimeInfo *info = NULL; buf.data = DecompressRTF(tmp_var, &(buf.size)); if (buf.data) { info = tnef_dump_file("message.rtf", buf.data, buf.size); free(buf.data); return info; } else { return NULL; } }
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 processTnef(TNEFStruct *tnef) { variableLength *filename; variableLength *filedata; Attachment *p; int RealAttachment; int object; char * ifilename; int i, count; int foundCal=0; FILE *fptr; ifilename = (char *) g_malloc(sizeof(char) * 256); /* First see if this requires special processing. */ /* ie: it's a Contact Card, Task, or Meeting request (vCal/vCard) */ if (tnef->messageClass[0] != 0) { if (strcmp(tnef->messageClass, "IPM.Contact") == 0) { saveVCard(tnef); } if (strcmp(tnef->messageClass, "IPM.Task") == 0) { saveVTask(tnef); } if (strcmp(tnef->messageClass, "IPM.Appointment") == 0) { saveVCalendar(tnef); foundCal = 1; } } if ((filename = MAPIFindUserProp(&(tnef->MapiProperties), PROP_TAG(PT_STRING8,0x24))) != MAPI_UNDEFINED) { if (strcmp(filename->data, "IPM.Appointment") == 0) { /* If it's "indicated" twice, we don't want to save 2 calendar entries. */ if (foundCal == 0) { saveVCalendar(tnef); } } } if (strcmp(tnef->messageClass, "IPM.Microsoft Mail.Note") == 0) { if ((saveRTF == 1) && (tnef->subject.size > 0)) { /* Description */ if ((filename=MAPIFindProperty(&(tnef->MapiProperties), PROP_TAG(PT_BINARY, PR_RTF_COMPRESSED))) != MAPI_UNDEFINED) { variableLength *buf; buf = (variableLength *)g_malloc (sizeof(variableLength)); buf->data=""; buf->size=0; if ((buf->data = DecompressRTF(filename, &(buf->size))) != NULL) { if (filepath == NULL) { sprintf(ifilename, "%s.rtf", tnef->subject.data); } else { sprintf(ifilename, "%s/%s.rtf", filepath, tnef->subject.data); } for(i=0; i<strlen(ifilename); i++) if (ifilename[i] == ' ') ifilename[i] = '_'; if ((fptr = fopen(ifilename, "wb"))==NULL) { printf("ERROR: Error writing file to disk!"); } else { fwrite(buf->data, sizeof(BYTE), buf->size, fptr); fclose(fptr); } free(buf->data); buf->data=""; buf->size=0; } } } } /* Now process each attachment */ p = tnef->starting_attach.next; count = 0; while (p != NULL) { count++; /* Make sure it has a size. */ if (p->FileData.size > 0) { object = 1; /* See if the contents are stored as "attached data" */ /* Inside the MAPI blocks. */ if((filedata = MAPIFindProperty(&(p->MAPI), PROP_TAG(PT_OBJECT, PR_ATTACH_DATA_OBJ))) == MAPI_UNDEFINED) { if((filedata = MAPIFindProperty(&(p->MAPI), PROP_TAG(PT_BINARY, PR_ATTACH_DATA_OBJ))) == MAPI_UNDEFINED) { /* Nope, standard TNEF stuff. */ filedata = &(p->FileData); object = 0; } } /* See if this is an embedded TNEF stream. */ RealAttachment = 1; if (object == 1) { /* This is an "embedded object", so skip the */ /* 16-byte identifier first. */ TNEFStruct *emb_tnef; emb_tnef = (TNEFStruct *) g_malloc(sizeof(TNEFStruct)); DWORD signature; memcpy(&signature, filedata->data+16, sizeof(DWORD)); if (TNEFCheckForSignature(signature) == 0) { /* Has a TNEF signature, so process it. */ TNEFInitialize(emb_tnef); emb_tnef->Debug = tnef->Debug; if (TNEFParseMemory(filedata->data+16, filedata->size-16, emb_tnef) != -1) { processTnef(emb_tnef); RealAttachment = 0; } TNEFFree(emb_tnef); } } else { TNEFStruct *emb_tnef; emb_tnef = (TNEFStruct *) g_malloc(sizeof(TNEFStruct)); DWORD signature; memcpy(&signature, filedata->data, sizeof(DWORD)); if (TNEFCheckForSignature(signature) == 0) { /* Has a TNEF signature, so process it. */ TNEFInitialize(emb_tnef); emb_tnef->Debug = tnef->Debug; if (TNEFParseMemory(filedata->data, filedata->size, emb_tnef) != -1) { processTnef(emb_tnef); RealAttachment = 0; } TNEFFree(emb_tnef); } } if ((RealAttachment == 1) || (saveintermediate == 1)) { /* Ok, it's not an embedded stream, so now we */ /* process it. */ if ((filename = MAPIFindProperty(&(p->MAPI), PROP_TAG(30,0x3707))) == MAPI_UNDEFINED) { if ((filename = MAPIFindProperty(&(p->MAPI), PROP_TAG(30,0x3001))) == MAPI_UNDEFINED) { filename = &(p->Title); } } if (filename->size == 1) { filename = (variableLength*)malloc(sizeof(variableLength)); filename->size = 20; filename->data = (char*)malloc(20); sprintf(filename->data, "file_%03i.dat", count); } if (filepath == NULL) { sprintf(ifilename, "%s", filename->data); } else { sprintf(ifilename, "%s/%s", filepath, filename->data); } for(i=0; i<strlen(ifilename); i++) if (ifilename[i] == ' ') ifilename[i] = '_'; if ((fptr = fopen(ifilename, "wb"))==NULL) { printf("ERROR: Error writing file to disk!"); } else { if (object == 1) { fwrite(filedata->data + 16, sizeof(BYTE), filedata->size - 16, fptr); } else { fwrite(filedata->data, sizeof(BYTE), filedata->size, fptr); } fclose(fptr); } } } /* if size>0 */ p=p->next; } /* while p!= null */ g_free (ifilename); }