From 16fec2e641bbe2ce9f078a7c0dfd7ac990df108b Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Thu, 25 Jan 2024 12:08:44 +0300 Subject: [PATCH] fix bug #66123 --- .../XlsFile/Converter/XlsConverter.cpp | 27 +++++++--- .../Converter/xlsx_drawing_context.cpp | 2 +- .../XlsFile/Converter/xlsx_drawing_context.h | 2 + .../XlsFile/Converter/xlsx_sheet_context.cpp | 39 +++++++++++---- .../ODRAW/OfficeArtContainer.h | 4 +- .../ODRAW/OfficeArtDgContainer.cpp | 19 ++++--- .../ODRAW/OfficeArtDgContainer.h | 2 +- .../ODRAW/SimpleOfficeArtContainers.cpp | 49 ++++++++++++------- .../ODRAW/SimpleOfficeArtContainers.h | 8 ++- .../XlsFile/Format/Logic/CommonSubstream.h | 2 +- .../XlsFile/Format/Logic/GlobalsSubstream.cpp | 14 ++++-- .../XlsFile/Format/Logic/GlobalsSubstream.h | 2 +- .../XlsFile/Format/Logic/XlsElementsType.h | 1 + 13 files changed, 117 insertions(+), 54 deletions(-) diff --git a/MsBinaryFile/XlsFile/Converter/XlsConverter.cpp b/MsBinaryFile/XlsFile/Converter/XlsConverter.cpp index b9d3916c0e..e2d63b00d9 100644 --- a/MsBinaryFile/XlsFile/Converter/XlsConverter.cpp +++ b/MsBinaryFile/XlsFile/Converter/XlsConverter.cpp @@ -761,7 +761,7 @@ void XlsConverter::convert(XLS::GlobalsSubstream* globals) for (size_t i = 0 ; i < globals->m_arHFPictureDrawing.size(); i++) { - convert((ODRAW::OfficeArtDgContainer*)globals->m_arHFPictureDrawing[i].get()); + convert((ODRAW::OfficeArtDggContainer*)globals->m_arHFPictureDrawing[i].get()); } globals->serialize_protection(xlsx_context->workbook_protection()); @@ -1428,14 +1428,21 @@ void XlsConverter::convert(ODRAW::OfficeArtSpgrContainer * spgr) for (size_t i = 0; i < spgr->child_records.size(); i++) { - int type_object = 2;//rect - - if (xlsx_context->get_drawing_context().start_drawing(type_object)) + ODRAW::OfficeArtSpContainer* SpContainer = dynamic_cast(spgr->child_records[i].get()); + if (SpContainer) { - xlsx_context->get_drawing_context().set_mode_HF(true); - convert(spgr->child_records[i].get()); + ODRAW::OfficeArtFSP* fsp = dynamic_cast(SpContainer->m_OfficeArtFSP.get()); + if ((fsp) && (fsp->fHaveSpt)) + { + int type_object = 2;//rect + if (xlsx_context->get_drawing_context().start_drawing(type_object)) + { + xlsx_context->get_drawing_context().set_mode_HF(true); + convert(spgr->child_records[i].get()); - xlsx_context->get_drawing_context().end_drawing(); + xlsx_context->get_drawing_context().end_drawing(); + } + } } } } @@ -1534,6 +1541,12 @@ void XlsConverter::convert(ODRAW::OfficeArtRecord * art) convert(dg->m_OfficeArtSpgrContainer.get()); }break; + case XLS::typeOfficeArtDggContainer: + { + ODRAW::OfficeArtDggContainer* dg = dynamic_cast(art); + + convert(dg->m_OfficeArtBStoreContainer.get()); + }break; default: break; } diff --git a/MsBinaryFile/XlsFile/Converter/xlsx_drawing_context.cpp b/MsBinaryFile/XlsFile/Converter/xlsx_drawing_context.cpp index 9805660516..98d5f9a8f6 100644 --- a/MsBinaryFile/XlsFile/Converter/xlsx_drawing_context.cpp +++ b/MsBinaryFile/XlsFile/Converter/xlsx_drawing_context.cpp @@ -2959,7 +2959,7 @@ void xlsx_drawing_context::set_picture_crop_right (double val) } void xlsx_drawing_context::set_picture_name(const std::wstring & str) { - //.... + current_drawing_states->back()->fill.name = str; } void xlsx_drawing_context::set_picture_grayscale(bool val) { diff --git a/MsBinaryFile/XlsFile/Converter/xlsx_drawing_context.h b/MsBinaryFile/XlsFile/Converter/xlsx_drawing_context.h index a7b8b63e81..d63512cd2c 100644 --- a/MsBinaryFile/XlsFile/Converter/xlsx_drawing_context.h +++ b/MsBinaryFile/XlsFile/Converter/xlsx_drawing_context.h @@ -289,6 +289,8 @@ public: _CP_OPT(bool) grayscale; _CP_OPT(int) biLevel; + std::wstring name; + std::vector> colorsPosition; }fill; diff --git a/MsBinaryFile/XlsFile/Converter/xlsx_sheet_context.cpp b/MsBinaryFile/XlsFile/Converter/xlsx_sheet_context.cpp index b461090d29..07b74b285d 100644 --- a/MsBinaryFile/XlsFile/Converter/xlsx_sheet_context.cpp +++ b/MsBinaryFile/XlsFile/Converter/xlsx_sheet_context.cpp @@ -47,6 +47,7 @@ table_state::table_state(xlsx_conversion_context & Context) : drawing_context_(C table_state_ptr & xlsx_sheet_context::state() { + if (tables_state_.empty()) return table_state_ptr(); return tables_state_.back(); } @@ -114,38 +115,56 @@ void xlsx_sheet_context::end_table() xlsx_drawing_context & xlsx_sheet_context::get_drawing_context() { - return state()->drawing_context_; + if (state()) + return state()->drawing_context_; + else + { + throw; + } } xlsx_comments_context & xlsx_sheet_context::get_comments_context() { - return state()->comments_context_; + if (state()) + return state()->comments_context_; + else + { + throw; + } } std::wstring xlsx_sheet_context::add_hyperlink(std::wstring const & ref, std::wstring const & target, std::wstring const & display, bool bExternal) { - return state()->hyperlinks_.add( ref, target, display, bExternal); + if (state()) + return state()->hyperlinks_.add( ref, target, display, bExternal); } void xlsx_sheet_context::dump_rels_hyperlinks(rels & Rels) { - state()->hyperlinks_.dump_rels(Rels); + if (state()) + state()->hyperlinks_.dump_rels(Rels); } void xlsx_sheet_context::serialize_hyperlinks(std::wostream & _Wostream) { - state()->hyperlinks_.serialize(_Wostream); + if (state()) + state()->hyperlinks_.serialize(_Wostream); } void xlsx_sheet_context::dump_rels_drawing(rels & Rels) { - xlsx_drawings_rels_ptr drawing_rels = state()->drawing_context_.get_sheet_rels(); - - drawing_rels->dump_rels(Rels); + if (state()) + { + xlsx_drawings_rels_ptr drawing_rels = state()->drawing_context_.get_sheet_rels(); + + drawing_rels->dump_rels(Rels); + } } void xlsx_sheet_context::serialize_ole_objects(std::wostream & strm) { - state()->drawing_context_.serialize_objects(strm); + if (state()) + state()->drawing_context_.serialize_objects(strm); } void xlsx_sheet_context::serialize_controls(std::wostream & strm) { - state()->drawing_context_.serialize_controls(strm); + if (state()) + state()->drawing_context_.serialize_controls(strm); } } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtContainer.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtContainer.h index c23debe0b8..107dbe65c3 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtContainer.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtContainer.h @@ -54,8 +54,8 @@ public: static OfficeArtRecordPtr loadAnyArtRecord(XLS::CFRecord& record); - OfficeArtClientAnchorType anchor_type_; - std::vector child_records; + OfficeArtClientAnchorType anchor_type_; + std::vector child_records; private: OfficeArtRecordPtr CreateOfficeArt(unsigned short type); diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtDgContainer.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtDgContainer.cpp index 56c357fc64..8e858ffb72 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtDgContainer.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtDgContainer.cpp @@ -86,9 +86,14 @@ void OfficeArtDgContainer::loadFields(XLS::CFRecord& record) for (size_t i = 0 ; i < child_records.size(); i++) { + //Log::warning("ArtRecord : " + STR::int2str(child_records[i]->rh_own.recType, 16)); + switch(child_records[i]->rh_own.recType) { - case ODRAW::OfficeArtRecord::DgContainer: + case ODRAW::OfficeArtRecord::DggContainer: + { + }break; + case ODRAW::OfficeArtRecord::DgContainer: { OfficeArtDgContainer * dg = dynamic_cast(child_records[i].get()); if (dg) @@ -107,22 +112,22 @@ void OfficeArtDgContainer::loadFields(XLS::CFRecord& record) } child_records.erase(child_records.begin() + i, child_records.begin() + i + 1); i--; }break; - case ODRAW::OfficeArtRecord::FDG: + case ODRAW::OfficeArtRecord::FDG: { m_OfficeArtFDG = child_records[i]; child_records.erase(child_records.begin() + i, child_records.begin() + i + 1); i--; }break; - case ODRAW::OfficeArtRecord::FRITContainer: + case ODRAW::OfficeArtRecord::FRITContainer: { m_OfficeArtFRITContainer = child_records[i]; child_records.erase(child_records.begin() + i, child_records.begin() + i + 1); i--; }break; - case ODRAW::OfficeArtRecord::SpgrContainer: + case ODRAW::OfficeArtRecord::SpgrContainer: { m_OfficeArtSpgrContainer = child_records[i]; child_records.erase(child_records.begin() + i, child_records.begin() + i + 1); i--; }break; - case ODRAW::OfficeArtRecord::SpContainer: + case ODRAW::OfficeArtRecord::SpContainer: { m_OfficeArtSpContainer.push_back(child_records[i]); child_records.erase(child_records.begin() + i,child_records.begin() + i + 1); i--; @@ -132,8 +137,8 @@ void OfficeArtDgContainer::loadFields(XLS::CFRecord& record) // m_OfficeArtSpgrContainerFileBlock = OfficeArtContainerPtr(art_container); // child_records.erase(child_records.begin() + i,child_records.begin() + i + 1); // }break; - default: - break; + default: + break; } } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtDgContainer.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtDgContainer.h index 9da95fb4b4..fbf3635716 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtDgContainer.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/OfficeArtDgContainer.h @@ -52,7 +52,7 @@ public: static const bool CheckIfContainerStartFound(XLS::CFRecord& record); static const bool CheckIfContainerSizeOK(XLS::CFRecord& record); - static const XLS::ElementType type = XLS::typeOfficeArtDgContainer; + static const XLS::ElementType type = XLS::typeOfficeArtDgContainer; void loadFields(XLS::CFRecord& record); diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/SimpleOfficeArtContainers.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/SimpleOfficeArtContainers.cpp index 9bd730ffcb..eb32e15540 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/SimpleOfficeArtContainers.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/SimpleOfficeArtContainers.cpp @@ -71,31 +71,42 @@ void OfficeArtSolverContainer::loadFields(XLS::CFRecord& record) void OfficeArtDggContainer::loadFields(XLS::CFRecord& record) { OfficeArtContainer::loadFields(record); - - for (size_t i = 0 ; i < child_records.size(); i++) + + for (size_t i = 0; i < child_records.size(); i++) { - switch(child_records[i]->rh_own.recType) + switch (child_records[i]->rh_own.recType) { + case ODRAW::OfficeArtRecord::DggContainer: + { + OfficeArtDggContainer* dggContainer = dynamic_cast(child_records[i].get()); + if (dggContainer) + { + if (!m_OfficeArtBStoreContainer) m_OfficeArtBStoreContainer = dggContainer->m_OfficeArtBStoreContainer; + if (!m_OfficeArtColorMRUContainer) m_OfficeArtColorMRUContainer = dggContainer->m_OfficeArtColorMRUContainer; + if (!m_OfficeArtSplitMenuColorContainer) m_OfficeArtSplitMenuColorContainer = dggContainer->m_OfficeArtSplitMenuColorContainer; + if (!m_OfficeArtFDGGBlock) m_OfficeArtFDGGBlock = dggContainer->m_OfficeArtFDGGBlock; + } + }break; case ODRAW::OfficeArtRecord::BStoreContainer: - { - m_OfficeArtBStoreContainer = child_records[i]; - child_records.erase(child_records.begin() + i,child_records.begin() + i + 1); i--; - }break; + { + m_OfficeArtBStoreContainer = child_records[i]; + child_records.erase(child_records.begin() + i, child_records.begin() + i + 1); i--; + }break; case ODRAW::OfficeArtRecord::ColorMRUContainer: - { - m_OfficeArtColorMRUContainer = child_records[i]; - child_records.erase(child_records.begin() + i,child_records.begin() + i + 1); i--; - }break; + { + m_OfficeArtColorMRUContainer = child_records[i]; + child_records.erase(child_records.begin() + i, child_records.begin() + i + 1); i--; + }break; case ODRAW::OfficeArtRecord::SplitMenuColorContainer: - { - m_OfficeArtSplitMenuColorContainer = child_records[i]; - child_records.erase(child_records.begin() + i,child_records.begin() + i + 1); i--; - }break; + { + m_OfficeArtSplitMenuColorContainer = child_records[i]; + child_records.erase(child_records.begin() + i, child_records.begin() + i + 1); i--; + }break; case ODRAW::OfficeArtRecord::FDGGBlock: - { - m_OfficeArtFDGGBlock = child_records[i]; - child_records.erase(child_records.begin() + i,child_records.begin() + i + 1); i--; - }break; + { + m_OfficeArtFDGGBlock = child_records[i]; + child_records.erase(child_records.begin() + i, child_records.begin() + i + 1); i--; + }break; //case ODRAW::OfficeArtRecord::SpgrContainerFileBlock: // { // m_OfficeArtSpgrContainerFileBlock = OfficeArtContainerPtr(art_container); diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/SimpleOfficeArtContainers.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/SimpleOfficeArtContainers.h index 59d043aabf..b750b652dd 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/SimpleOfficeArtContainers.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/ODRAW/SimpleOfficeArtContainers.h @@ -43,14 +43,18 @@ public: OfficeArtDggContainer(const OfficeArtClientAnchorType anchor_type) : OfficeArtContainer(0x0F, DggContainer, anchor_type) {} XLS::BiffStructurePtr clone() { return XLS::BiffStructurePtr(new OfficeArtDggContainer(*this)); } + static const XLS::ElementType type = XLS::typeOfficeArtDggContainer; + void loadFields(XLS::CFRecord& record); OfficeArtRecordPtr m_OfficeArtBStoreContainer; OfficeArtRecordPtr m_OfficeArtColorMRUContainer; OfficeArtRecordPtr m_OfficeArtSplitMenuColorContainer; OfficeArtRecordPtr m_OfficeArtFDGGBlock; + //+ OfficeArtFOPT + OfficeArtTertiaryFOPT }; +typedef boost::shared_ptr OfficeArtDggContainerPtr; class OfficeArtSpgrContainer : public OfficeArtContainer { @@ -61,9 +65,9 @@ public: void loadFields(XLS::CFRecord& record); - static const XLS::ElementType type = XLS::typeOfficeArtSpgrContainer; + static const XLS::ElementType type = XLS::typeOfficeArtSpgrContainer; - std::vector m_OfficeArtSpgrContainerFileBlock; + std::vector m_OfficeArtSpgrContainerFileBlock; }; class OfficeArtSolverContainer : public OfficeArtRecord diff --git a/MsBinaryFile/XlsFile/Format/Logic/CommonSubstream.h b/MsBinaryFile/XlsFile/Format/Logic/CommonSubstream.h index f2859c4e28..41028236e2 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/CommonSubstream.h +++ b/MsBinaryFile/XlsFile/Format/Logic/CommonSubstream.h @@ -48,7 +48,7 @@ public: GlobalWorkbookInfoPtr global_info_; size_t ws_index_; - std::vector m_arHFPictureDrawing; + std::vector m_arHFPictureDrawing; // тут OfficeArtDgContainer - описания шейпов ... BaseObjectPtr m_PAGESETUP; BaseObjectPtr m_PROTECTION; diff --git a/MsBinaryFile/XlsFile/Format/Logic/GlobalsSubstream.cpp b/MsBinaryFile/XlsFile/Format/Logic/GlobalsSubstream.cpp index 25ebf8b11e..44d1220837 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/GlobalsSubstream.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/GlobalsSubstream.cpp @@ -105,7 +105,7 @@ //#include "Biff_records/XCT.h" //#include "Biff_records/CRN.h" -#include "Biff_structures/ODRAW/OfficeArtDgContainer.h" +#include "Biff_structures/ODRAW/SimpleOfficeArtContainers.h" namespace XLS {; @@ -657,7 +657,7 @@ void GlobalsSubstream::LoadHFPicture() hf = dynamic_cast(m_arHFPicture[j].get()); record.appendRawData(hf->recordDrawingGroup); } - ODRAW::OfficeArtDgContainerPtr rgDrawing = ODRAW::OfficeArtDgContainerPtr(new ODRAW::OfficeArtDgContainer(ODRAW::OfficeArtRecord::CA_HF)); + ODRAW::OfficeArtDggContainerPtr rgDrawing = ODRAW::OfficeArtDggContainerPtr(new ODRAW::OfficeArtDggContainer(ODRAW::OfficeArtRecord::CA_HF)); rgDrawing->loadFields(record); m_arHFPictureDrawing.push_back(rgDrawing); current_size_hf = 0; @@ -674,7 +674,15 @@ void GlobalsSubstream::LoadHFPicture() HFPicture* hf = dynamic_cast(m_arHFPicture[j].get()); record.appendRawData(hf->recordDrawingGroup); } - ODRAW::OfficeArtDgContainerPtr rgDrawing = ODRAW::OfficeArtDgContainerPtr(new ODRAW::OfficeArtDgContainer(ODRAW::OfficeArtRecord::CA_HF)); + ODRAW::OfficeArtRecordHeader rh_test; + record >> rh_test; + record.RollRdPtrBack(8);//sizeof(OfficeArtRecordHeader) + + if ((rh_test.recType & 0xF000) != 0xF000) + { + return; + } + ODRAW::OfficeArtDggContainerPtr rgDrawing = ODRAW::OfficeArtDggContainerPtr(new ODRAW::OfficeArtDggContainer(ODRAW::OfficeArtRecord::CA_HF)); rgDrawing->loadFields(record); m_arHFPictureDrawing.push_back(rgDrawing); } diff --git a/MsBinaryFile/XlsFile/Format/Logic/GlobalsSubstream.h b/MsBinaryFile/XlsFile/Format/Logic/GlobalsSubstream.h index d9a96d3f96..5a464cceee 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/GlobalsSubstream.h +++ b/MsBinaryFile/XlsFile/Format/Logic/GlobalsSubstream.h @@ -88,7 +88,7 @@ public: //std::vector m_arPIVOTCACHEDEFINITION; -> GlobalWorkbookInfo std::vector m_arDConn; - std::vector m_arHFPictureDrawing; + std::vector m_arHFPictureDrawing; // тут OfficeArtDggContainer - картинки ... unsigned short code_page_; GlobalWorkbookInfoPtr global_info_; diff --git a/MsBinaryFile/XlsFile/Format/Logic/XlsElementsType.h b/MsBinaryFile/XlsFile/Format/Logic/XlsElementsType.h index 225b9a43c7..bf7624ebfc 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/XlsElementsType.h +++ b/MsBinaryFile/XlsFile/Format/Logic/XlsElementsType.h @@ -717,6 +717,7 @@ enum ElementType typeOfficeArtRecord = 3000, typeOfficeArtBStoreContainerFileBlock, typeOfficeArtDgContainer, + typeOfficeArtDggContainer, typeOfficeArtCOLORREF, typeOfficeArtFOPTE, typeOfficeArtFRIT,