/* * (c) Copyright Ascensio System SIA 2010-2023 * * This program is a free software product. You can redistribute it and/or * modify it under the terms of the GNU Affero General Public License (AGPL) * version 3 as published by the Free Software Foundation. In accordance with * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect * that Ascensio System SIA expressly excludes the warranty of non-infringement * of any third-party rights. * * This program is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish * street, Riga, Latvia, EU, LV-1050. * * The interactive user interfaces in modified source and object code versions * of the Program must display Appropriate Legal Notices, as required under * Section 5 of the GNU AGPL version 3. * * Pursuant to Section 7(b) of the License you must retain the original Product * logo when distributing the program. Pursuant to Section 7(e) we decline to * grant you any rights under trademark law for use of our trademarks. * * All the Product's GUI elements, including illustrations and icon sets, as * well as technical writing content are licensed under the terms of the * Creative Commons Attribution-ShareAlike 4.0 International. See the License * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode * */ #pragma once #include #include "../../../../DesktopEditor/common/StreamWriter.h" #include "../Common/BinReaderWriterDefines.h" #include "../Common/Common.h" #include "../Reader/ChartFromToBinary.h" #include "../../../XlsxFormat/Workbook/Workbook.h" #include "../../../XlsxFormat/Worksheets/Worksheet.h" #include "../../../XlsxFormat/Table/QueryTable.h" #include "../../../XlsxFormat/Pivot/PivotTable.h" #include "../../../XlsxFormat/Pivot/PivotCacheDefinition.h" #include "../../../XlsxFormat/Pivot/PivotCacheRecords.h" namespace OOX { namespace Spreadsheet { class CPersonList; class CPerson; class CThreadedComment; class CDxf; class CSortCondition; class CFilterColumn; } } namespace BinXlsxRW { class ImageObject { public: std::wstring sPath; int nIndex; std::map mapDrawings; ImageObject() { } ImageObject(std::wstring& _sPath, int _nIndex) { sPath = _sPath; nIndex = _nIndex; } }; class PivotCachesTemp { public: long nId; BYTE* pDefinitionData; long nDefinitionLength; OOX::Spreadsheet::CPivotCacheRecordsFile* pRecords; long nCacheId; OOX::Spreadsheet::CPivotTableFile* pTable; PivotCachesTemp() { nId = -1; pDefinitionData = NULL; nDefinitionLength = 0; pRecords = NULL; nCacheId = -1; pTable = NULL; } }; class Binary_CommonReader2 { protected: NSBinPptxRW::CBinaryFileReader& m_poBufferedStream; public: Binary_CommonReader2(NSBinPptxRW::CBinaryFileReader& poBufferedStream); int ReadColor(BYTE type, long length, void* poResult); }; class BinaryTableReader : public Binary_CommonReader { OOX::Spreadsheet::CWorksheet* m_pCurWorksheet; public: BinaryTableReader(NSBinPptxRW::CBinaryFileReader& oBufferedStream, OOX::Spreadsheet::CWorksheet* pCurWorksheet); int Read(long length, OOX::Spreadsheet::CTableParts* pTableParts); int ReadQueryTable(long length, OOX::Spreadsheet::CQueryTable* pQueryTable); int ReadTablePart(BYTE type, long length, void* poResult); int ReadTable(BYTE type, long length, void* poResult); int ReadAltTextTable(BYTE type, long length, void* poResult); int ReadAutoFilter(BYTE type, long length, void* poResult); int ReadFilterColumns(BYTE type, long length, void* poResult); int ReadFilterColumn(BYTE type, long length, void* poResult); int ReadFilterColumnExternal(OOX::Spreadsheet::CFilterColumn* pFilterColumn); int ReadFilterFilters(BYTE type, long length, void* poResult); int ReadFilterFilter(BYTE type, long length, void* poResult); int ReadDateGroupItem(BYTE type, long length, void* poResult); int ReadCustomFilters(BYTE type, long length, void* poResult); int ReadCustomFilter(BYTE type, long length, void* poResult); int ReadCustomFiltersItem(BYTE type, long length, void* poResult); int ReadDynamicFilter(BYTE type, long length, void* poResult); int ReadColorFilter(BYTE type, long length, void* poResult); int ReadTop10(BYTE type, long length, void* poResult); int ReadSortState(BYTE type, long length, void* poResult); int ReadSortConditions(BYTE type, long length, void* poResult); int ReadSortCondition(BYTE type, long length, void* poResult); int ReadSortConditionExternal(OOX::Spreadsheet::CSortCondition* pSortCondition); int ReadTableColumns(BYTE type, long length, void* poResult); int ReadTableColumn(BYTE type, long length, void* poResult); int ReadTableStyleInfo(BYTE type, long length, void* poResult); int ReadTableXmlColumnPr(BYTE type, long length, void* poResult); int ReadQueryTableContent(BYTE type, long length, void* poResult); int ReadQueryTableRefresh(BYTE type, long length, void* poResult); int ReadQueryTableFields(BYTE type, long length, void* poResult); int ReadQueryTableField(BYTE type, long length, void* poResult); int ReadQueryTableDeletedFields(BYTE type, long length, void* poResult); int ReadQueryTableDeletedField(BYTE type, long length, void* poResult); int ReadTableCache(long length, void* poResult); int ReadCacheParts(BYTE type,long length, void* poResult); int ReadCachePart(BYTE type, long length, void* poResult); }; class BinarySharedStringTableReader : public Binary_CommonReader { OOX::Spreadsheet::CSharedStrings& m_oSharedStrings; Binary_CommonReader2 m_oBcr; public: BinarySharedStringTableReader(NSBinPptxRW::CBinaryFileReader& oBufferedStream, OOX::Spreadsheet::CSharedStrings& oSharedStrings); int Read(); int ReadSharedStringTableContent(BYTE type, long length, void* poResult); int ReadSi(BYTE type, long length, void* poResult); int ReadRun(BYTE type, long length, void* poResult); int ReadRPr(BYTE type, long length, void* poResult); int ReadColor(BYTE type, long length, void* poResult); }; class BinaryStyleTableReader : public Binary_CommonReader { OOX::Spreadsheet::CStyles& m_oStyles; Binary_CommonReader2 m_oBcr; public: BinaryStyleTableReader(NSBinPptxRW::CBinaryFileReader& oBufferedStream, OOX::Spreadsheet::CStyles& oStyles); int Read(); int ReadStyleTableContent(BYTE type, long length, void* poResult); int ReadBorders(BYTE type, long length, void* poResult); int ReadBorder(BYTE type, long length, void* poResult); int ReadBorderProp(BYTE type, long length, void* poResult); int ReadColor(BYTE type, long length, void* poResult); int ReadFills(BYTE type, long length, void* poResult); int ReadFill(BYTE type, long length, void* poResult); int ReadPatternFill(BYTE type, long length, void* poResult); int ReadGradientFill(BYTE type, long length, void* poResult); int ReadGradientFillStop(BYTE type, long length, void* poResult); int ReadFonts(BYTE type, long length, void* poResult); int ReadFont(BYTE type, long length, void* poResult); int ReadNumFmts(BYTE type, long length, void* poResult); int ReadNumFmt(BYTE type, long length, void* poResult); int ReadCellStyleXfs(BYTE type, long length, void* poResult); int ReadCellXfs(BYTE type, long length, void* poResult); int ReadXfs(BYTE type, long length, void* poResult); int ReadAligment(BYTE type, long length, void* poResult); int ReadProtection(BYTE type, long length, void* poResult); int ReadDxfs(BYTE type, long length, void* poResult); int ReadDxf(BYTE type, long length, void* poResult); int ReadDxfExternal(OOX::Spreadsheet::CDxf* pDxf); int ReadCellStyles(BYTE type, long length, void* poResult); int ReadCellStyle(BYTE type, long length, void* poResult); int ReadTableStyles(BYTE type, long length, void* poResult); int ReadTableCustomStyles(BYTE type, long length, void* poResult); int ReadTableCustomStyle(BYTE type, long length, void* poResult); int ReadTableCustomStyleElements(BYTE type, long length, void* poResult); int ReadTableCustomStyleElement(BYTE type, long length, void* poResult); int ReadTimelineStyles(BYTE type, long length, void* poResult); int ReadTimelineStyle(BYTE type, long length, void* poResult); int ReadTimelineStyleElement(BYTE type, long length, void* poResult); }; class BinaryWorkbookTableReader : public Binary_CommonReader { OOX::Spreadsheet::CWorkbook & m_oWorkbook; boost::unordered_map> & m_mapPivotCacheDefinitions; const std::wstring & m_sDestinationDir; NSBinPptxRW::CDrawingConverter *m_pOfficeDrawingConverter = NULL; bool m_bMacroRead = false; public: BinaryWorkbookTableReader(NSBinPptxRW::CBinaryFileReader& oBufferedStream, OOX::Spreadsheet::CWorkbook& oWorkbook, boost::unordered_map>& mapPivotCacheDefinitions, const std::wstring& sDestinationDir, NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter); int Read(); int ReadWorkbookTableContent(BYTE type, long length, void* poResult); int ReadWorkbookPr(BYTE type, long length, void* poResult); int ReadProtection(BYTE type, long length, void* poResult); int ReadFileSharing(BYTE type, long length, void* poResult); int ReadBookViews(BYTE type, long length, void* poResult); int ReadWorkbookView(BYTE type, long length, void* poResult); int ReadExternalReferences(BYTE type, long length, void* poResult); int ReadExternalReference(BYTE type, long length, void* poResult); int ReadDefinedNames(BYTE type, long length, void* poResult); int ReadDefinedName(BYTE type, long length, void* poResult); int ReadCalcPr(BYTE type, long length, void* poResult); int ReadExternalBook(BYTE type, long length, void* poResult); int ReadExternalSheetNames(BYTE type, long length, void* poResult); int ReadExternalDefinedNames(BYTE type, long length, void* poResult); int ReadExternalDefinedName(BYTE type, long length, void* poResult); int ReadExternalSheetDataSet(BYTE type, long length, void* poResult); int ReadExternalSheetData(BYTE type, long length, void* poResult); int ReadExternalRow(BYTE type, long length, void* poResult); int ReadExternalCell(BYTE type, long length, void* poResult); int ReadExternalAlternateUrls(BYTE type, long length, void* poResult); int ReadOleLink(BYTE type, long length, void* poResult); int ReadOleItem(BYTE type, long length, void* poResult); int ReadDdeLink(BYTE type, long length, void* poResult); int ReadDdeItem(BYTE type, long length, void* poResult); int ReadDdeValues(BYTE type, long length, void* poResult); int ReadDdeValue(BYTE type, long length, void* poResult); int ReadPivotCaches(BYTE type, long length, void* poResult); int ReadPivotCache(BYTE type, long length, void* poResult); int ReadConnections(BYTE type, long length, void* poResult); int ReadConnection(BYTE type, long length, void* poResult); int ReadConnectionDbPr(BYTE type, long length, void* poResult); int ReadConnectionOlapPr(BYTE type, long length, void* poResult); int ReadConnectionTextPr(BYTE type, long length, void* poResult); int ReadConnectionWebPr(BYTE type, long length, void* poResult); int ReadConnectionRangePr(BYTE type, long length, void* poResult); int ReadConnectionTextFields(BYTE type, long length, void* poResult); int ReadConnectionTextField(BYTE type, long length, void* poResult); int ReadSlicerCaches(BYTE type, long length, void* poResult); int ReadTimelineCaches(BYTE type, long length, void* poResult); int ReadTimelineCache(BYTE type, long length, void* poResult); int ReadTimelineState(BYTE type, long length, void* poResult); int ReadTimelinePivotFilter(BYTE type, long length, void* poResult); int ReadTimelineCachePivotTables(BYTE type, long length, void* poResult); int ReadTimelineCachePivotTable(BYTE type, long length, void* poResult); int ReadTimelineRange(BYTE type, long length, void* poResult); int ReadMetadata(BYTE type, long length, void* poResult); int ReadMetadataTypes(BYTE type, long length, void* poResult); int ReadMetadataType(BYTE type, long length, void* poResult); int ReadMetadataStrings(BYTE type, long length, void* poResult); int ReadMdxMetadata(BYTE type, long length, void* poResult); int ReadMdx(BYTE type, long length, void* poResult); int ReadMetadataBlocks(BYTE type, long length, void* poResult); int ReadMetadataBlock(BYTE type, long length, void* poResult); int ReadMetadataRecord(BYTE type, long length, void* poResult); int ReadFutureMetadata(BYTE type, long length, void* poResult); int ReadFutureMetadataBlock(BYTE type, long length, void* poResult); int ReadMdxTuple(BYTE type, long length, void* poResult); int ReadMdxSet(BYTE type, long length, void* poResult); int ReadMdxKPI(BYTE type, long length, void* poResult); int ReadMdxMemeberProp(BYTE type, long length, void* poResult); int ReadMetadataStringIndex(BYTE type, long length, void* poResult); int ReadDynamicArrayProperties(BYTE type, long length, void* poResult); OOX::Spreadsheet::CXlsb* m_pXlsb = NULL; }; class BinaryCommentReader : public Binary_CommonReader { OOX::Spreadsheet::CWorksheet* m_pCurWorksheet; public: BinaryCommentReader(NSBinPptxRW::CBinaryFileReader& oBufferedStream, OOX::Spreadsheet::CWorksheet* pCurWorksheet); int Read(long length, void* poResult); int ReadExternal(long length, void* poResult); int ReadCommentDatasExternal(BYTE type, long length, void* poResult); int ReadComments(BYTE type, long length, void* poResult); int ReadComment(BYTE type, long length, void* poResult); int ReadCommentDatas(BYTE type, long length, void* poResult); int ReadCommentData(BYTE type, long length, void* poResult); int ReadCommentReplies(BYTE type, long length, void* poResult); int ReadThreadedComment(BYTE type, long length, void* poResult); int ReadThreadedCommentMention(BYTE type, long length, void* poResult); void parseCommentData(SerializeCommon::CommentData* pCommentData, OOX::Spreadsheet::CSi& oSi); static int addCommentRun(OOX::Spreadsheet::CSi& oSi, const std::wstring& text, bool isBold, int nLimit); static void addThreadedComment(OOX::Spreadsheet::CSi& oSi, OOX::Spreadsheet::CThreadedComment* pThreadedComment, nullable>& mapPersonList); static std::wstring getThreadedCommentAuthor(nullable>& mapPersonList, nullable& personId, const std::wstring& sDefault); }; class BinaryWorksheetsTableReader : public Binary_CommonReader { Binary_CommonReader2 m_oBcr2; NSFile::CStreamWriter* m_pCurStreamWriter; XLS::StreamCacheWriterPtr m_pCurStreamWriterBin; NSBinPptxRW::CDrawingConverter* m_pOfficeDrawingConverter; OOX::Spreadsheet::CXlsb* m_pXlsb; OOX::Spreadsheet::CWorkbook& m_oWorkbook; OOX::Spreadsheet::CSharedStrings* m_pSharedStrings; boost::unordered_map& m_mapMedia; NSCommon::smart_ptr m_pCurSheet; NSCommon::smart_ptr m_pCurWorksheet; NSCommon::smart_ptr m_pCurDrawing; NSCommon::smart_ptr m_pCurOleObjects; NSCommon::smart_ptr m_pCurVmlDrawing; unsigned int m_lObjectIdVML; const std::wstring& m_sDestinationDir; const std::wstring& m_sMediaDir; SaveParams& m_oSaveParams; int m_nNextObjectId; std::vector& m_arWorksheets; std::map& m_mapWorksheets; // for fast find boost::unordered_map>& m_mapPivotCacheDefinitions; public: BinaryWorksheetsTableReader(NSBinPptxRW::CBinaryFileReader& oBufferedStream, OOX::Spreadsheet::CWorkbook& oWorkbook, OOX::Spreadsheet::CSharedStrings* pSharedStrings, std::vector& arWorksheets, std::map& mapWorksheets, boost::unordered_map& mapMedia, const std::wstring& sDestinationDir, const std::wstring& sMediaDir, SaveParams& oSaveParams, NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter, boost::unordered_map>& mapPivotCacheDefinitions); int Read(); int Read2xlsb(OOX::Spreadsheet::CXlsb &xlsb); int ReadWorksheetsTableContent(BYTE type, long length, void* poResult); int ReadWorksheetsCache(BYTE type, long length, void* poResult); int ReadWorksheetSeekPositions(BYTE type, long length, void* poResult); int ReadWorksheet(boost::unordered_map>& mapPos, NSFile::CStreamWriter& oStreamWriter, void* poResult); int ReadWorksheet(boost::unordered_map>& mapPos, XLS::StreamCacheWriterPtr& oStreamWriter, void* poResult);//2xlsb int ReadSheetCache(boost::unordered_map>& mapPos, void* poResult); int ReadPivotTable(BYTE type, long length, void* poResult); int ReadWorksheetProp(BYTE type, long length, void* poResult); int ReadWorksheetCols(BYTE type, long length, void* poResult); int ReadWorksheetCol(BYTE type, long length, void* poResult); int ReadProtectedRanges(BYTE type, long length, void* poResult); int ReadProtectedRange(BYTE type, long length, void* poResult); int ReadSheetViews(BYTE type, long length, void* poResult); int ReadSheetView(BYTE type, long length, void* poResult); int ReadPane(BYTE type, long length, void* poResult); int ReadSelection(BYTE type, long length, void* poResult); int ReadSheetPr(BYTE type, long length, void* poResult); int ReadOutlinePr(BYTE type, long length, void* poResult); int ReadPageSetUpPr(BYTE type, long length, void* poResult); int ReadColor(BYTE type, long length, void* poResult); int ReadSheetFormatPr(BYTE type, long length, void* poResult); int ReadPageMargins(BYTE type, long length, void* poResult); int ReadPageSetup(BYTE type, long length, void* poResult); int ReadHeaderFooter(BYTE type, long length, void* poResult); int ReadProtection(BYTE type, long length, void* poResult); int ReadRowColBreaks(BYTE type, long length, void* poResult); int ReadBreak(BYTE type, long length, void* poResult); int ReadCellWatches(BYTE type, long length, void* poResult); int ReadCellWatch(BYTE type, long length, void* poResult); int ReadPrintOptions(BYTE type, long length, void* poResult); int ReadHyperlinks(BYTE type, long length, void* poResult); int ReadHyperlink(BYTE type, long length, void* poResult); int ReadMergeCells(BYTE type, long length, void* poResult); int ReadDrawings(BYTE type, long length, void* poResult); int ReadDrawing(BYTE type, long length, void* poResult); int ReadCellAnchor(BYTE type, long length, void* poResult); int ReadLegacyDrawingHF(BYTE type, long length, void* poResult); int ReadLegacyDrawingHFDrawings(BYTE type, long length, void* poResult); int ReadLegacyDrawingHFDrawing(BYTE type, long length, void* poResult); int ReadControls(BYTE type, long length, void* poResult); int ReadControl(BYTE type, long length, void* poResult); int ReadControlItems(BYTE type, long length, void* poResult); int ReadFromTo(BYTE type, long length, void* poResult); int ReadExt(BYTE type, long length, void* poResult); int ReadPos(BYTE type, long length, void* poResult); int ReadClientData(BYTE type, long length, void* poResult); int ReadSheetData(BYTE type, long length, void* poResult); int ReadRow(BYTE type, long length, void* poResult); int ReadCells(BYTE type, long length, void* poResult); int ReadCell(BYTE type, long length, void* poResult); int ReadFormula(BYTE type, long length, void* poResult); int ReadConditionalFormatting(BYTE type, long length, void* poResult); int ReadConditionalFormattingRule(BYTE type, long length, void* poResult); int ReadColorScale(BYTE type, long length, void* poResult); int ReadDataBar(BYTE type, long length, void* poResult); int ReadIconSet(BYTE type, long length, void* poResult); int ReadCFIcon(BYTE type, long length, void* poResult); int ReadCFVO(BYTE type, long length, void* poResult); int ReadSparklineGroups(BYTE type, long length, void* poResult); int ReadSparklineGroup(BYTE type, long length, void* poResult); int ReadSparklines(BYTE type, long length, void* poResult); int ReadSparkline(BYTE type, long length, void* poResult); int ReadDataValidations(BYTE type, long length, void* poResult); int ReadDataValidationsContent(BYTE type, long length, void* poResult); int ReadDataValidation(BYTE type, long length, void* poResult); int ReadSlicers(BYTE type, long length, void* poResult); int ReadUserProtectedRanges(BYTE type, long length, void* poResult); int ReadUserProtectedRange(BYTE type, long length, void* poResult); int ReadUserProtectedRangeDesc(BYTE type, long length, void* poResult); int ReadTimelinesList(BYTE type, long length, void* poResult); int ReadTimelines(BYTE type, long length, void* poResult); int ReadTimeline(BYTE type, long length, void* poResult); void WriteComments(); void AddLineBreak(OOX::Spreadsheet::CSi& oSi); void GetControlVmlShape(void* pControl); int ReadSheetDataToBin(BYTE type, long length, void* poResult); bool m_bWriteToXlsb = false; }; class BinaryOtherTableReader : public Binary_CommonReader { boost::unordered_map& m_mapMedia; const std::wstring& m_sFileInDir; long m_nCurId; std::wstring m_sCurSrc; long m_nCurIndex; SaveParams& m_oSaveParams; NSBinPptxRW::CDrawingConverter* m_pOfficeDrawingConverter; const std::wstring& m_sMediaDir; public: BinaryOtherTableReader(NSBinPptxRW::CBinaryFileReader& oBufferedStream, boost::unordered_map& mapMedia, const std::wstring& sFileInDir, SaveParams& oSaveParams, NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter, const std::wstring& sMediaDir); int Read(); int ReadOtherTableContent(BYTE type, long length, void* poResult); int ReadMediaContent(BYTE type, long length, void* poResult); int ReadMediaItem(BYTE type, long length, void* poResult); std::wstring ReadMediaItemSaveFileGetNewPath(const std::wstring& sTempPath); void ReadMediaItemSaveFileFILE(FILE* pFile); void ReadMediaItemSaveFilePath(const std::wstring& sTempPath); }; class BinaryPersonReader : public Binary_CommonReader { OOX::Spreadsheet::CWorkbook& m_oWorkbook; public: BinaryPersonReader(NSBinPptxRW::CBinaryFileReader& oBufferedStream, OOX::Spreadsheet::CWorkbook& oWorkbook); int Read(); int ReadPersonList(BYTE type, long length, void* poResult); int ReadPerson(BYTE type, long length, void* poResult); }; class BinaryCustomsReader : public Binary_CommonReader { OOX::Spreadsheet::CWorkbook* m_pWorkbook; public: BinaryCustomsReader(NSBinPptxRW::CBinaryFileReader& oBufferedStream, OOX::Spreadsheet::CWorkbook* pWorkbook); int Read(); int ReadCustom(BYTE type, long length, void* poResult); int ReadCustomContent(BYTE type, long length, void* poResult); }; class BinaryFileReader { public: BinaryFileReader(); int ReadFile(const std::wstring& sSrcFileName, std::wstring sDstPath, NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter, const std::wstring& sXMLOptions, bool &bMacro); int ReadMainTable(OOX::Spreadsheet::CXlsx& oXlsx, NSBinPptxRW::CBinaryFileReader& oBufferedStream, const std::wstring& sFileInDir, const std::wstring& sOutDir, SaveParams& oSaveParams, NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter); void initWorkbook(OOX::Spreadsheet::CWorkbook* pWorkbook); int Xml2Xlsx(const std::wstring& sSrcFileName, std::wstring sDstPath, NSBinPptxRW::CDrawingConverter* pOfficeDrawingConverter, const std::wstring& sXMLOptions, bool bMacro = false); }; }