From 809effa5df22a28a035531b26c366ec6ca7c3221 Mon Sep 17 00:00:00 2001 From: ElenaSubbotina Date: Tue, 15 Apr 2025 10:46:03 +0300 Subject: [PATCH] fix bug #73705 --- OOXML/PPTXFormat/Logic/CxnSp.cpp | 93 ++++++++++++++++++++++- OOXML/PPTXFormat/Logic/CxnSp.h | 99 +------------------------ OOXML/PPTXFormat/Logic/GraphicFrame.cpp | 7 +- OOXML/PPTXFormat/Logic/Pic.cpp | 4 +- OOXML/PPTXFormat/Logic/Shape.cpp | 4 +- OOXML/XML/XmlSimple.cpp | 6 ++ OOXML/XML/XmlSimple.h | 6 +- 7 files changed, 110 insertions(+), 109 deletions(-) diff --git a/OOXML/PPTXFormat/Logic/CxnSp.cpp b/OOXML/PPTXFormat/Logic/CxnSp.cpp index 4d7f12f28f..788d0e3a62 100644 --- a/OOXML/PPTXFormat/Logic/CxnSp.cpp +++ b/OOXML/PPTXFormat/Logic/CxnSp.cpp @@ -122,7 +122,7 @@ namespace PPTX std::wstring CxnSp::toXML() const { XmlUtils::CAttribute oAttr; - oAttr.Write(L"macro", macro); + oAttr.Write2(L"macro", macro); XmlUtils::CNodeValue oValue; oValue.Write(nvCxnSpPr); @@ -201,5 +201,96 @@ namespace PPTX spPr.Fill.Merge(fill); return BGRA; } + + void CxnSp::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const + { + pWriter->StartRecord(SPTREE_TYPE_CXNSP); + + pWriter->WriteRecord1(0, nvCxnSpPr); + pWriter->WriteRecord1(1, spPr); + pWriter->WriteRecord2(2, style); + + if (macro.IsInit()) + { + pWriter->StartRecord(SPTREE_TYPE_MACRO); + pWriter->WriteString1(0, *macro); + pWriter->EndRecord(); + } + pWriter->EndRecord(); + } + void CxnSp::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) + { + LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4; + + while (pReader->GetPos() < _end_rec) + { + BYTE _at = pReader->GetUChar(); + switch (_at) + { + case 0: + { + nvCxnSpPr.fromPPTY(pReader); + }break; + case 1: + { + spPr.fromPPTY(pReader); + }break; + case 2: + { + style = new ShapeStyle(L"p"); + style->fromPPTY(pReader); + }break; + case SPTREE_TYPE_MACRO: + { + pReader->Skip(5); // type + size + macro = pReader->GetString2(); + }break; + default: + { + }break; + } + } + + pReader->Seek(_end_rec); + } + void CxnSp::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, _T("macro"), macro) + WritingElement_ReadAttributes_End(oReader) + } + void CxnSp::toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const + { + std::wstring namespace_ = m_namespace; + + if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DOCX || + pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DOCX_GLOSSARY) namespace_ = L"wps"; + else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_XLSX) namespace_ = L"xdr"; + else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_GRAPHICS) namespace_ = L"a"; + else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_CHART_DRAWING) namespace_ = L"cdr"; + else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DIAGRAM) namespace_ = L"dgm"; + else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DSP_DRAWING) namespace_ = L"dsp"; + + pWriter->StartNode(namespace_ + L":cxnSp"); + pWriter->WriteAttribute2(L"macro", macro); + pWriter->EndAttributes(); + + nvCxnSpPr.toXmlWriter(pWriter); + spPr.toXmlWriter(pWriter); + + if (style.is_init()) + { + if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DOCX || + pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DOCX_GLOSSARY) style->m_namespace = L"wps"; + else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_XLSX) style->m_namespace = L"xdr"; + else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_GRAPHICS) style->m_namespace = L"a"; + else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_CHART_DRAWING) style->m_namespace = L"cdr"; + else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DIAGRAM) style->m_namespace = L"dgm"; + else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DSP_DRAWING) style->m_namespace = L"dsp"; + + pWriter->Write(style); + } + pWriter->EndNode(namespace_ + L":cxnSp"); + } } // namespace Logic } // namespace PPTX \ No newline at end of file diff --git a/OOXML/PPTXFormat/Logic/CxnSp.h b/OOXML/PPTXFormat/Logic/CxnSp.h index 6eef04c22a..3d0165075c 100644 --- a/OOXML/PPTXFormat/Logic/CxnSp.h +++ b/OOXML/PPTXFormat/Logic/CxnSp.h @@ -67,102 +67,11 @@ namespace PPTX DWORD GetLine(Ln& line)const; DWORD GetFill(UniFill& fill)const; - //void FillLevelUp(); - //void Merge(CxnSp& cxnSp, bool bIsSlidePlaceholder = false); + virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + virtual void toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const; - //void SetLevelUpElement( CxnSp* p){m_pLevelUp = p;}; - - virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const - { - pWriter->StartRecord(SPTREE_TYPE_CXNSP); - - pWriter->WriteRecord1(0, nvCxnSpPr); - pWriter->WriteRecord1(1, spPr); - pWriter->WriteRecord2(2, style); - - if (macro.IsInit()) - { - pWriter->StartRecord(SPTREE_TYPE_MACRO); - pWriter->WriteString1(0, *macro); - pWriter->EndRecord(); - } - pWriter->EndRecord(); - } - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) - { - WritingElement_ReadAttributes_Start(oReader) - WritingElement_ReadAttributes_Read_if(oReader, _T("macro"),macro) - WritingElement_ReadAttributes_End(oReader) - } - virtual void toXmlWriter(NSBinPptxRW::CXmlWriter* pWriter) const - { - std::wstring namespace_ = m_namespace; - - if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DOCX || - pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DOCX_GLOSSARY) namespace_ = L"wps"; - else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_XLSX) namespace_ = L"xdr"; - else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_GRAPHICS) namespace_ = L"a"; - else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_CHART_DRAWING) namespace_ = L"cdr"; - else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DIAGRAM) namespace_ = L"dgm"; - else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DSP_DRAWING) namespace_ = L"dsp"; - - pWriter->StartNode(namespace_ + L":cxnSp"); - pWriter->WriteAttribute(L"macro", macro); - pWriter->EndAttributes(); - - nvCxnSpPr.toXmlWriter(pWriter); - spPr.toXmlWriter(pWriter); - - if (style.is_init()) - { - if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DOCX || - pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DOCX_GLOSSARY) style->m_namespace = L"wps"; - else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_XLSX) style->m_namespace = L"xdr"; - else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_GRAPHICS) style->m_namespace = L"a"; - else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_CHART_DRAWING) style->m_namespace = L"cdr"; - else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DIAGRAM) style->m_namespace = L"dgm"; - else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DSP_DRAWING) style->m_namespace = L"dsp"; - - pWriter->Write(style); - } - pWriter->EndNode(namespace_ + L":cxnSp"); - } - - virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) - { - LONG _end_rec = pReader->GetPos() + pReader->GetRecordSize() + 4; - - while (pReader->GetPos() < _end_rec) - { - BYTE _at = pReader->GetUChar(); - switch (_at) - { - case 0: - { - nvCxnSpPr.fromPPTY(pReader); - }break; - case 1: - { - spPr.fromPPTY(pReader); - }break; - case 2: - { - style = new ShapeStyle(L"p"); - style->fromPPTY(pReader); - }break; - case SPTREE_TYPE_MACRO: - { - pReader->Skip(5); // type + size - macro = pReader->GetString2(); - }break; - default: - { - }break; - } - } - - pReader->Seek(_end_rec); - } + virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); std::wstring m_namespace; diff --git a/OOXML/PPTXFormat/Logic/GraphicFrame.cpp b/OOXML/PPTXFormat/Logic/GraphicFrame.cpp index d10c74b6b1..96f50151ef 100644 --- a/OOXML/PPTXFormat/Logic/GraphicFrame.cpp +++ b/OOXML/PPTXFormat/Logic/GraphicFrame.cpp @@ -502,7 +502,7 @@ namespace PPTX else if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DSP_DRAWING) namespace_ = L"dsp"; pWriter->StartNode(namespace_ + L":graphicFrame"); - pWriter->WriteAttribute(L"macro", macro); + pWriter->WriteAttribute2(L"macro", macro); pWriter->EndAttributes(); toXmlWriter2(pWriter); @@ -795,10 +795,7 @@ namespace PPTX sXml += L"<" + m_namespace + L":graphicFrame"; - sXml += L" macro=\"" + (macro.IsInit() ? *macro : L"") + L"\">"; - - XmlUtils::CAttribute oAttr; - oAttr.Write(L"macro", macro); + sXml += L" macro=\"" + (macro.IsInit() ? XmlUtils::EncodeXmlString(*macro) : L"") + L"\">"; sXml += toXML2(); diff --git a/OOXML/PPTXFormat/Logic/Pic.cpp b/OOXML/PPTXFormat/Logic/Pic.cpp index 44a231160f..bff40e7383 100644 --- a/OOXML/PPTXFormat/Logic/Pic.cpp +++ b/OOXML/PPTXFormat/Logic/Pic.cpp @@ -786,7 +786,7 @@ namespace PPTX std::wstring Pic::toXML() const { XmlUtils::CAttribute oAttr; - oAttr.Write(L"macro", macro); + oAttr.Write2(L"macro", macro); XmlUtils::CNodeValue oValue; oValue.Write(nvPicPr); @@ -1010,7 +1010,7 @@ namespace PPTX pWriter->StartAttributes(); pWriter->WriteAttribute(_T("xmlns:pic"), (std::wstring)_T("http://schemas.openxmlformats.org/drawingml/2006/picture")); } - pWriter->WriteAttribute(L"macro", macro); + pWriter->WriteAttribute2(L"macro", macro); pWriter->EndAttributes(); nvPicPr.toXmlWriter(pWriter); diff --git a/OOXML/PPTXFormat/Logic/Shape.cpp b/OOXML/PPTXFormat/Logic/Shape.cpp index 4183389181..3b154e9489 100644 --- a/OOXML/PPTXFormat/Logic/Shape.cpp +++ b/OOXML/PPTXFormat/Logic/Shape.cpp @@ -218,7 +218,7 @@ namespace PPTX oAttr.Write(L"useBgFill", useBgFill); oAttr.Write(L"modelId", modelId); - oAttr.Write(L"macro", macro); + oAttr.Write2(L"macro", macro); oAttr.Write(L"fLocksText", fLocksText); XmlUtils::CNodeValue oValue; @@ -248,7 +248,7 @@ namespace PPTX pWriter->StartAttributes(); pWriter->WriteAttribute(L"useBgFill", useBgFill); - pWriter->WriteAttribute(L"macro", macro); + pWriter->WriteAttribute2(L"macro", macro); pWriter->WriteAttribute(L"modelId", modelId); pWriter->WriteAttribute(L"fLocksText", fLocksText); pWriter->EndAttributes(); diff --git a/OOXML/XML/XmlSimple.cpp b/OOXML/XML/XmlSimple.cpp index c438728105..73884201d6 100644 --- a/OOXML/XML/XmlSimple.cpp +++ b/OOXML/XML/XmlSimple.cpp @@ -93,6 +93,12 @@ namespace XmlUtils return; m_strValue += (L" ") + strName + L"=\"" + *value + L"\""; } + void CAttribute::Write2(const std::wstring& strName, const nullable_string& value) + { + if (!value.IsInit()) + return; + m_strValue += (L" ") + strName + L"=\"" + XmlUtils::EncodeXmlString(*value) + L"\""; + } void CAttribute::Write(const std::wstring& strName, const nullable_bool& value) { if (!value.IsInit()) diff --git a/OOXML/XML/XmlSimple.h b/OOXML/XML/XmlSimple.h index 3eea02b2f9..674ec9797a 100644 --- a/OOXML/XML/XmlSimple.h +++ b/OOXML/XML/XmlSimple.h @@ -76,8 +76,7 @@ namespace XmlUtils return; Write(strName, value->get()); } - - public: + void Write(const std::wstring& strName, const nullable_int& value); void Write(const std::wstring& strName, const nullable_uint& value); void Write(const std::wstring& strName, const nullable_sizet& value); @@ -85,8 +84,8 @@ namespace XmlUtils void Write(const std::wstring& strName, const nullable_string& value); void Write(const std::wstring& strName, const nullable_bool& value); void Write2(const std::wstring& strName, const nullable_bool& value); + void Write2(const std::wstring& strName, const nullable_string& value); - public: CAttribute(const CAttribute& oSrc); CAttribute& operator=(const CAttribute& oSrc); }; @@ -96,7 +95,6 @@ namespace XmlUtils public: std::wstring m_strValue; - public: CNodeValue(); template