/* * Build the lists with Document Property Information for WinWord 1/2 files */ void vGet2DopInfo(FILE *pFile, const UCHAR *aucHeader) { document_block_type tDocument; UCHAR *aucBuffer; ULONG ulBeginDocpInfo, ulTmp; size_t tDocpInfoLen; USHORT usTmp; ulBeginDocpInfo = ulGetLong(0x112, aucHeader); /* fcDop */ DBG_HEX(ulBeginDocpInfo); tDocpInfoLen = (size_t)usGetWord(0x116, aucHeader); /* cbDop */ DBG_DEC(tDocpInfoLen); if (tDocpInfoLen < 28) { DBG_MSG("No Document information"); return; } aucBuffer = xmalloc(tDocpInfoLen); if (!bReadBytes(aucBuffer, tDocpInfoLen, ulBeginDocpInfo, pFile)) { aucBuffer = xfree(aucBuffer); return; } usTmp = usGetWord(0x00, aucBuffer); tDocument.ucHdrFtrSpecification = (UCHAR)(usTmp >> 8); /* grpfIhdt */ tDocument.usDefaultTabWidth = usGetWord(0x0a, aucBuffer); /* dxaTab */ ulTmp = ulGetLong(0x14, aucBuffer); /* dttmCreated */ tDocument.tCreateDate = tConvertDTTM(ulTmp); ulTmp = ulGetLong(0x18, aucBuffer); /* dttmRevised */ tDocument.tRevisedDate = tConvertDTTM(ulTmp); vCreateDocumentInfoList(&tDocument); aucBuffer = xfree(aucBuffer); } /* end of vGet2DopInfo */
/* * Build the lists with Document Property Information for Word 8/9/10/11 files */ void vGet8DopInfo(FILE *pFile, const pps_type *pTable, const ULONG *aulBBD, size_t tBBDLen, const ULONG *aulSBD, size_t tSBDLen, const UCHAR *aucHeader) { document_block_type tDocument; UCHAR *aucBuffer; ULONG ulBeginDocpInfo, ulTmp; size_t tDocpInfoLen; USHORT usTmp; fail(pFile == NULL || pTable == NULL || aucHeader == NULL); fail(aulBBD == NULL || aulSBD == NULL); ulBeginDocpInfo = ulGetLong(0x192, aucHeader); /* fcDop */ NO_DBG_HEX(ulBeginSectInfo); tDocpInfoLen = (size_t)ulGetLong(0x196, aucHeader); /* lcbDop */ NO_DBG_DEC(tSectInfoLen); if (tDocpInfoLen < 28) { DBG_MSG("No Document information"); return; } aucBuffer = aucFillInfoBuffer(pFile, pTable, aulBBD, tBBDLen, aulSBD, tSBDLen, ulBeginDocpInfo, tDocpInfoLen); if (aucBuffer == NULL) { return; } usTmp = usGetWord(0x00, aucBuffer); tDocument.ucHdrFtrSpecification = (UCHAR)(usTmp >> 8); /* grpfIhdt */ tDocument.usDefaultTabWidth = usGetWord(0x0a, aucBuffer); /* dxaTab */ ulTmp = ulGetLong(0x14, aucBuffer); /* dttmCreated */ tDocument.tCreateDate = tConvertDTTM(ulTmp); ulTmp = ulGetLong(0x18, aucBuffer); /* dttmRevised */ tDocument.tRevisedDate = tConvertDTTM(ulTmp); vCreateDocumentInfoList(&tDocument); aucBuffer = xfree(aucBuffer); } /* end of vGet8DopInfo */
/* * vSet2SummaryInfo - set summary information from a WinWord 1/2 file */ void vSet2SummaryInfo(FILE *pFile, int iWordVersion, const UCHAR *aucHeader) { UCHAR *aucBuffer; ULONG ulBeginSumdInfo, ulBeginDocpInfo, ulTmp; size_t tSumdInfoLen, tDocpInfoLen, tLen, tCounter, tStart; TRACE_MSG("vSet2SummaryInfo"); fail(pFile == NULL || aucHeader == NULL); fail(iWordVersion != 1 && iWordVersion != 2); /* First check the header */ usLid = usGetWord(0x06, aucHeader); /* Language IDentification */ DBG_HEX(usLid); if (usLid < 999 && iWordVersion == 1) { switch (usLid) { case 1: usLid = 0x0409; break; /* American English */ case 2: usLid = 0x0c0c; break; /* Canadian French */ case 31: usLid = 0x0413; break; /* Dutch */ case 33: usLid = 0x040c; break; /* French */ case 34: usLid = 0x040a; break; /* Spanish */ case 36: usLid = 0x040e; break; /* Hungarian */ case 39: usLid = 0x0410; break; /* Italian */ case 44: usLid = 0x0809; break; /* British English */ case 45: usLid = 0x0406; break; /* Danish */ case 46: usLid = 0x041f; break; /* Swedish */ case 47: usLid = 0x0414; break; /* Norwegian */ case 48: usLid = 0x0415; break; /* Polish */ case 49: usLid = 0x0407; break; /* German */ case 351: usLid = 0x0816; break; /* Portuguese */ case 358: usLid = 0x040b; break; /* Finnish */ default: DBG_DEC(usLid); DBG_FIXME(); usLid = 0x0409; /* American English */ break; } } if (iWordVersion != 2) { /* Unknown where to find the associated strings */ return; } /* Second check the associated strings */ ulBeginSumdInfo = ulGetLong(0x118, aucHeader); /* fcSttbfAssoc */ DBG_HEX(ulBeginSumdInfo); tSumdInfoLen = (size_t)usGetWord(0x11c, aucHeader); /* cbSttbfAssoc */ DBG_DEC(tSumdInfoLen); if (tSumdInfoLen == 0) { /* There is no summary information */ return; } aucBuffer = xmalloc(tSumdInfoLen); if (!bReadBytes(aucBuffer, tSumdInfoLen, ulBeginSumdInfo, pFile)) { aucBuffer = xfree(aucBuffer); return; } NO_DBG_PRINT_BLOCK(aucBuffer, tSumdInfoLen); tLen = (size_t)ucGetByte(0, aucBuffer); DBG_DEC_C(tSumdInfoLen != tLen, tSumdInfoLen); DBG_DEC_C(tSumdInfoLen != tLen, tLen); tStart = 1; for (tCounter = 0; tCounter < 17; tCounter++) { if (tStart >= tSumdInfoLen) { break; } tLen = (size_t)ucGetByte(tStart, aucBuffer); if (tLen != 0) { NO_DBG_DEC(tCounter); NO_DBG_STRN(aucBuffer + tStart + 1, tLen); switch (tCounter) { case 3: szTitle = xmalloc(tLen + 1); strncpy(szTitle, (char *)aucBuffer + tStart + 1, tLen); szTitle[tLen] = '\0'; break; case 4: szSubject = xmalloc(tLen + 1); strncpy(szSubject, (char *)aucBuffer + tStart + 1, tLen); szSubject[tLen] = '\0'; break; case 7: szAuthor = xmalloc(tLen + 1); strncpy(szAuthor, (char *)aucBuffer + tStart + 1, tLen); szAuthor[tLen] = '\0'; break; default: break; } } tStart += tLen + 1; } aucBuffer = xfree(aucBuffer); /* Third check the document properties */ ulBeginDocpInfo = ulGetLong(0x112, aucHeader); /* fcDop */ DBG_HEX(ulBeginDocpInfo); tDocpInfoLen = (size_t)usGetWord(0x116, aucHeader); /* cbDop */ DBG_DEC(tDocpInfoLen); if (tDocpInfoLen < 12) { return; } aucBuffer = xmalloc(tDocpInfoLen); if (!bReadBytes(aucBuffer, tDocpInfoLen, ulBeginDocpInfo, pFile)) { aucBuffer = xfree(aucBuffer); return; } ulTmp = ulGetLong(0x14, aucBuffer); /* dttmCreated */ tCreateDtm = tConvertDTTM(ulTmp); ulTmp = ulGetLong(0x18, aucBuffer); /* dttmRevised */ tLastSaveDtm = tConvertDTTM(ulTmp); aucBuffer = xfree(aucBuffer); } /* end of vSet2SummaryInfo */