bool ImportWordDocument( LVStreamRef stream, ldomDocument * m_doc, LVDocViewCallback * progressCallback, CacheLoadingCallback * formatCallback ) { AntiwordStreamGuard file(stream); setOptions(); inside_p = false; inside_table = false; table_col_count = 0; inside_list = 0; // 0=none, 1=ul, 2=ol alignment = 0; inside_li = false; last_space_char = false; sLeftIndent = 0; /* Left indentation in twips */ sLeftIndent1 = 0; /* First line left indentation in twips */ sRightIndent = 0; /* Right indentation in twips */ usBeforeIndent = 0; /* Vertical indent before paragraph in twips */ usAfterIndent = 0; /* Vertical indent after paragraph in twips */ BOOL bResult = 0; diagram_type *pDiag; int iWordVersion; lUInt32 lFilesize = (lUInt32)stream->GetSize(); iWordVersion = iGuessVersionNumber(file, lFilesize); if (iWordVersion < 0 || iWordVersion == 3) { if (bIsRtfFile(file)) { CRLog::error("not a Word Document." " It is probably a Rich Text Format file"); } if (bIsWordPerfectFile(file)) { CRLog::error("not a Word Document." " It is probably a Word Perfect file"); } else { CRLog::error("not a Word Document"); } return FALSE; } /* Reset any reading done during file testing */ stream->SetPos(0); ldomDocumentWriter w(m_doc); writer = &w; doc = m_doc; image_index = 0; pDiag = pCreateDiagram("cr3", "filename.doc"); if (pDiag == NULL) { return false; } bResult = bWordDecryptor(file, lFilesize, pDiag); vDestroyDiagram(pDiag); doc = NULL; writer = NULL; #ifdef _DEBUG #define SAVE_COPY_OF_LOADED_DOCUMENT 1//def _DEBUG #endif if ( bResult!=0 ) { #ifdef SAVE_COPY_OF_LOADED_DOCUMENT //def _DEBUG LVStreamRef ostream = LVOpenFileStream( "/tmp/test_save_source.xml", LVOM_WRITE ); if ( !ostream.isNull() ) m_doc->saveToStream( ostream, "utf-16" ); #endif } return bResult!=0; }
/* * bProcessFile - process a single file * * returns: TRUE when the given file is a supported Word file, otherwise FALSE */ static BOOL bProcessFile(const char *szFilename) { FILE *pFile; diagram_type *pDiag; long lFilesize; int iWordVersion; BOOL bResult; fail(szFilename == NULL || szFilename[0] == '\0'); DBG_MSG(szFilename); if (szFilename[0] == '-' && szFilename[1] == '\0') { pFile = pStdin2TmpFile(&lFilesize); if (pFile == NULL) { werr(0, "I can't save the standard input to a file"); return FALSE; } } else { pFile = fopen(szFilename, "rb"); if (pFile == NULL) { werr(0, "I can't open '%s' for reading", szFilename); return FALSE; } lFilesize = lGetFilesize(szFilename); if (lFilesize < 0) { (void)fclose(pFile); werr(0, "I can't get the size of '%s'", szFilename); return FALSE; } } iWordVersion = iGuessVersionNumber(pFile, lFilesize); if (iWordVersion < 0 || iWordVersion == 3) { if (bIsRtfFile(pFile)) { werr(0, "%s is not a Word Document." " It is probably a Rich Text Format file", szFilename); } if (bIsWordPerfectFile(pFile)) { werr(0, "%s is not a Word Document." " It is probably a Word Perfect file", szFilename); } else { werr(0, "%s is not a Word Document.", szFilename); } (void)fclose(pFile); return FALSE; } /* Reset any reading done during file testing */ rewind(pFile); pDiag = pCreateDiagram(szTask, szFilename); if (pDiag == NULL) { (void)fclose(pFile); return FALSE; } bResult = bWordDecryptor(pFile, lFilesize, pDiag); vDestroyDiagram(pDiag); (void)fclose(pFile); return bResult; } /* end of bProcessFile */