From 2bc4ccd343abd799c2bcb3562cb7591a21962e63 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Sat, 5 Aug 2023 09:40:43 +0300 Subject: [PATCH] for bug #37564 --- .../raster/ImageFileFormatChecker.cpp | 50 ++------- .../Presentation/BinaryFileReaderWriter.cpp | 102 +++++++++++------- .../Presentation/BinaryFileReaderWriter.h | 2 +- OOXML/Binary/Presentation/imagemanager.cpp | 9 ++ OOXML/DocxFormat/FileTypes.cpp | 5 + OOXML/DocxFormat/FileTypes.h | 2 + OOXML/DocxFormat/Media/Audio.h | 4 - OOXML/DocxFormat/Media/Image.cpp | 24 +++++ OOXML/DocxFormat/Media/Image.h | 14 +++ OOXML/DocxFormat/Media/Video.h | 5 - OOXML/PPTXFormat/Logic/ExtP.cpp | 72 ++++++++----- OOXML/PPTXFormat/Logic/ExtP.h | 20 ++-- OOXML/PPTXFormat/Logic/Fills/Blip.cpp | 100 +++++++++++++---- OOXML/PPTXFormat/Logic/Fills/Blip.h | 10 +- OOXML/PPTXFormat/Logic/Fills/BlipFill.cpp | 21 ++-- OOXML/PPTXFormat/Logic/Ln.h | 4 - OOXML/PPTXFormat/Logic/Pic.cpp | 85 ++++++++------- OdfFile/Writer/Converter/ConvertDrawing.cpp | 4 +- X2tConverter/src/ASCConverters.cpp | 4 +- 19 files changed, 321 insertions(+), 216 deletions(-) diff --git a/DesktopEditor/raster/ImageFileFormatChecker.cpp b/DesktopEditor/raster/ImageFileFormatChecker.cpp index 9b432cbbd5..6a7071e3b2 100644 --- a/DesktopEditor/raster/ImageFileFormatChecker.cpp +++ b/DesktopEditor/raster/ImageFileFormatChecker.cpp @@ -31,6 +31,7 @@ */ #include "ImageFileFormatChecker.h" #include "../common/File.h" +#include "../xml/include/xmlutils.h" #include "../cximage/CxImage/ximacfg.h" @@ -718,51 +719,16 @@ bool CImageFileFormatChecker::isRawFile(BYTE* pBuffer, DWORD dwBytes) } bool CImageFileFormatChecker::isSvgFile(std::wstring& fileName) { - NSFile::CFileBinary file; - if (!file.OpenFile(fileName)) + XmlUtils::CXmlLiteReader oReader; + if (!oReader.FromFile(fileName)) + return false; + if (!oReader.ReadNextNode()) return false; - DWORD nSize = (DWORD)file.GetFileSize(); - if (nSize > 100) - nSize = 100; - - BYTE* buffer = new BYTE[nSize]; - if (!buffer) - return false; - - DWORD sizeRead = 0; - if (!file.ReadFile(buffer, nSize, sizeRead)) - { - delete []buffer; - return false; - } - file.CloseFile(); - - if ('<' == buffer[0] && - 's' == buffer[1] && - 'v' == buffer[2] && - 'g' == buffer[3]) - { - delete [] buffer; + if (L"svg" == oReader.GetNameNoNS()) return true; - } - - if ('<' == buffer[0] && - '?' == buffer[1] && - 'x' == buffer[2] && - 'm' == buffer[3] && - 'l' == buffer[4]) - { - std::string test((char*)buffer, nSize); - if (std::string::npos != test.find(" sizeExt) { OOX::CPath oPath = strInput; @@ -267,7 +268,7 @@ namespace NSBinPptxRW strFileName.erase(strFileName.length() - sizeExt, sizeExt); - if(0 != (nDisplayType & 1)) + if (0 != (nDisplayType & 1)) { std::wstring strVector = strFolder + strFileName + _T(".wmf"); if (OOX::CSystemUtility::IsFileExist(strVector)) @@ -276,7 +277,7 @@ namespace NSBinPptxRW strExts = _T(".wmf"); } } - if(0 != (nDisplayType & 2)) + if (0 != (nDisplayType & 2)) { std::wstring strVector = strFolder + strFileName + L".emf"; if (OOX::CSystemUtility::IsFileExist(strVector)) @@ -286,7 +287,7 @@ namespace NSBinPptxRW strExts = L".emf"; } } - if(0 != (nDisplayType & 4)) + if (0 != (nDisplayType & 4)) { smart_ptr oleFile = additionalFile.smart_dynamic_cast(); if (oleFile.IsInit()) @@ -310,7 +311,7 @@ namespace NSBinPptxRW } } } - if(0 != (nDisplayType & 8)) + if (0 != (nDisplayType & 8)) { smart_ptr mediaFile = additionalFile.smart_dynamic_cast(); if (mediaFile.IsInit()) @@ -342,7 +343,21 @@ namespace NSBinPptxRW } } } - if (!strExts.empty()) + + if (strExts == L".svg") + { + additionalFile = new OOX::SvgBlip(NULL); + + smart_ptr mediaFile = additionalFile.smart_dynamic_cast(); + if (mediaFile.IsInit()) + { + mediaFile->set_filename(strImage, false); + typeAdditional = 3; + strAdditional = strImage; + } + } + + if (false == strExts.empty()) { m_pContentTypes->AddDefault(strExts.substr(1)); } @@ -358,6 +373,11 @@ namespace NSBinPptxRW if (!oImageManagerInfo.sFilepathAdditional.empty()) { smart_ptr mediaFile = additionalFile.smart_dynamic_cast(); + if (false == mediaFile.IsInit()) //??? + { + mediaFile = new OOX::Media(NULL); + additionalFile = mediaFile.smart_dynamic_cast(); + } if (mediaFile.IsInit()) { mediaFile->set_filename(oImageManagerInfo.sFilepathAdditional, false); @@ -375,7 +395,7 @@ namespace NSBinPptxRW bool bRes = false; //EncodingMode.unparsed https://github.com/tonyqus/npoi/blob/master/main/POIFS/FileSystem/Ole10Native.cs POLE::Storage oStorage(sFilePath.c_str()); - if(oStorage.open(true, true)) + if (oStorage.open(true, true)) { //CompObj Stream BYTE dataCompObj[] = {0x01,0x00,0xfe,0xff,0x03,0x0a,0x00,0x00,0xff,0xff,0xff,0xff,0x0c,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x0c,0x00,0x00,0x00,0x4f,0x4c,0x45,0x20,0x50,0x61,0x63,0x6b,0x61,0x67,0x65,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x50,0x61,0x63,0x6b,0x61,0x67,0x65,0x00,0xf4,0x39,0xb2,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; @@ -431,7 +451,7 @@ namespace NSBinPptxRW } return oImageManagerInfo; } - _imageManager2Info CImageManager2::GenerateImageExec(const std::wstring& strInput, const std::wstring& sExts, const std::wstring& strAdditionalImage, int nAdditionalType, const std::wstring& oleData) + _imageManager2Info CImageManager2::GenerateImageExec(const std::wstring& strInput, const std::wstring& sExts, const std::wstring& strAdditionalImage, int &nAdditionalType, const std::wstring& oleData) { OOX::CPath oPathOutput; _imageManager2Info oImageManagerInfo; @@ -439,25 +459,30 @@ namespace NSBinPptxRW std::wstring strExts = sExts; std::wstring strImage = L"image" + std::to_wstring(++m_lIndexNextImage); - if ((_T(".jpg") == strExts) || (_T(".jpeg") == strExts) || (_T(".png") == strExts) || (_T(".emf") == strExts) || (_T(".wmf") == strExts)) + CImageFileFormatChecker checker(strInput); + switch (checker.eFileType) + { + case _CXIMAGE_FORMAT_JPG: + case _CXIMAGE_FORMAT_PNG: + case _CXIMAGE_FORMAT_WMF: + case _CXIMAGE_FORMAT_EMF: { oPathOutput = m_strDstMedia + FILE_SEPARATOR_STR + strImage + strExts; if (oPathOutput.GetPath() != strInput && NSFile::CFileBinary::Exists(strInput)) { - NSFile::CFileBinary::Copy(strInput, oPathOutput.GetPath()); + NSFile::CFileBinary::Copy(strInput, oPathOutput.GetPath()); oImageManagerInfo.sFilepathImage = oPathOutput.GetPath(); } - } - else - { - // content types!!! + }break; + default: +// content types!!! ? strExts = _T(".png"); oPathOutput = m_strDstMedia + FILE_SEPARATOR_STR + strImage + strExts; - SaveImageAsPng(strInput, oPathOutput.GetPath()); + SaveImageAsPng(strInput, oPathOutput.GetPath()); oImageManagerInfo.sFilepathImage = oPathOutput.GetPath(); - } - + } + if ((!strAdditionalImage.empty() || !oleData.empty() ) && (nAdditionalType == 1)) { std::wstring strAdditionalExt = L".bin"; @@ -471,7 +496,7 @@ namespace NSBinPptxRW std::wstring strAdditionalImageOut = pathOutput.GetPath(); - if(!oleData.empty()) + if (!oleData.empty()) { WriteOleData(strAdditionalImageOut, oleData); oImageManagerInfo.sFilepathAdditional = strAdditionalImageOut; @@ -483,7 +508,7 @@ namespace NSBinPptxRW } } - else if (!strAdditionalImage.empty() && nAdditionalType == 2) + else if (!strAdditionalImage.empty() && (nAdditionalType == 2 || nAdditionalType == 3)) //nAdditionalType -> enum { std::wstring strAdditionalExt; @@ -508,14 +533,14 @@ namespace NSBinPptxRW void CImageManager2::SaveImageAsPng(const std::wstring& strFileSrc, const std::wstring& strFileDst) { CBgraFrame oBgraFrame; - if(oBgraFrame.OpenFile(strFileSrc)) + if (oBgraFrame.OpenFile(strFileSrc)) oBgraFrame.SaveFile(strFileDst, _CXIMAGE_FORMAT_PNG); } void CImageManager2::SaveImageAsJPG(const std::wstring& strFileSrc, const std::wstring& strFileDst) { CBgraFrame oBgraFrame; - if(oBgraFrame.OpenFile(strFileSrc)) + if (oBgraFrame.OpenFile(strFileSrc)) oBgraFrame.SaveFile(strFileDst, _CXIMAGE_FORMAT_JPG); } @@ -548,17 +573,17 @@ namespace NSBinPptxRW int nDisplayType = IsDisplayedImage(strUrl); - if(0 != nDisplayType) + if (0 != nDisplayType) { std::wstring strInputMetafile = strUrl.substr(0, strUrl.length() - strExts.length()); std::wstring sDownloadRes; - if(0 != (nDisplayType & 1)) + if (0 != (nDisplayType & 1)) { strImage = DownloadImageExec(strInputMetafile + _T(".wmf")); strExts = _T(".wmf"); } - else if(0 != (nDisplayType & 2)) + else if (0 != (nDisplayType & 2)) { strImage = DownloadImageExec(strInputMetafile + _T(".emf")); strExts = _T(".emf"); @@ -581,7 +606,8 @@ namespace NSBinPptxRW _imageManager2Info oImageManagerInfo; if (!strImage.empty()) { - oImageManagerInfo = GenerateImageExec(strImage, strExts, L"", 0, L""); + int nAdditionalType = 0; + oImageManagerInfo = GenerateImageExec(strImage, strExts, L"", nAdditionalType, L""); CDirectory::DeleteFile(strImage); } @@ -1319,7 +1345,7 @@ namespace NSBinPptxRW { BYTE nPart = nLen & 0x7F; nLen = nLen >> 7; - if(nLen == 0) + if (nLen == 0) { WriteBYTE(nPart); break; @@ -1623,7 +1649,7 @@ namespace NSBinPptxRW L"\"/>"); } - if(additionalFile.is()) + if (additionalFile.is()) { smart_ptr oleFile = additionalFile.smart_dynamic_cast(); @@ -1653,7 +1679,7 @@ namespace NSBinPptxRW } } } - else if(additionalFile.is()) + else if (additionalFile.is()) { smart_ptr mediaFile = additionalFile.smart_dynamic_cast(); @@ -1662,7 +1688,7 @@ namespace NSBinPptxRW oRelsGeneratorInfo.nMediaRId = m_lNextRelsID++; oRelsGeneratorInfo.sFilepathMedia = mediaFile->filename().GetPath(); - if (m_pManager->m_nDocumentType != XMLWRITER_DOC_TYPE_XLSX) + if (m_pManager->m_nDocumentType != XMLWRITER_DOC_TYPE_XLSX || additionalFile.is()) { std::wstring strRid = L"rId" + std::to_wstring(oRelsGeneratorInfo.nMediaRId); @@ -1677,8 +1703,8 @@ namespace NSBinPptxRW strMediaRelsPath += mediaFile->filename().GetFilename(); - m_pWriter->WriteString( L"WriteString(L"type().RelationType() + L"\" Target=\"" + strMediaRelsPath + L"\"" + (mediaFile->IsExternal() ? L" TargetMode=\"External\"" : L"") + L"/>"); } } @@ -2133,7 +2159,7 @@ namespace NSBinPptxRW _UINT16 CBinaryFileReader::XlsbReadRecordType() { _UINT16 nValue = GetUChar(); - if(0 != (nValue & 0x80)) + if (0 != (nValue & 0x80)) { BYTE nPart = GetUChar(); nValue = (nValue & 0x7F) | ((nPart & 0x7F) << 7); @@ -2151,7 +2177,7 @@ namespace NSBinPptxRW { BYTE nPart = GetUChar(); nValue |= (nPart & 0x7F) << (7 * i); - if(0 == (nPart & 0x80)) + if (0 == (nPart & 0x80)) { break; } diff --git a/OOXML/Binary/Presentation/BinaryFileReaderWriter.h b/OOXML/Binary/Presentation/BinaryFileReaderWriter.h index 148096e3c9..55830b35a6 100644 --- a/OOXML/Binary/Presentation/BinaryFileReaderWriter.h +++ b/OOXML/Binary/Presentation/BinaryFileReaderWriter.h @@ -222,7 +222,7 @@ namespace NSBinPptxRW _imageManager2Info GenerateImage(const std::wstring& strInput, NSCommon::smart_ptr & additionalFile, const std::wstring& oleData, std::wstring strBase64Image); _imageManager2Info GenerateMediaExec(const std::wstring& strInput); - _imageManager2Info GenerateImageExec(const std::wstring& strInput, const std::wstring& strExts, const std::wstring& strAdditionalImage, int nAdditionalType, const std::wstring& oleData); + _imageManager2Info GenerateImageExec(const std::wstring& strInput, const std::wstring& strExts, const std::wstring& strAdditionalImage, int & nAdditionalType, const std::wstring& oleData); void SaveImageAsPng(const std::wstring& strFileSrc, const std::wstring& strFileDst); void SaveImageAsJPG(const std::wstring& strFileSrc, const std::wstring& strFileDst); diff --git a/OOXML/Binary/Presentation/imagemanager.cpp b/OOXML/Binary/Presentation/imagemanager.cpp index 9b751ac55d..34fd0bae10 100644 --- a/OOXML/Binary/Presentation/imagemanager.cpp +++ b/OOXML/Binary/Presentation/imagemanager.cpp @@ -295,6 +295,15 @@ namespace NSShapeImageGen result = true; } + else if (checker.eFileType == _CXIMAGE_FORMAT_SVG) + { + oInfo.m_eType = itSVG; + + OOX::CPath pathSaveItem = m_strDstMedia + FILE_SEPARATOR_STR + oInfo.GetPath2(); + CDirectory::CopyFile(strFileSrc, pathSaveItem.GetPath()); + + result = true; + } else { CBgraFrame oBgraFrame; diff --git a/OOXML/DocxFormat/FileTypes.cpp b/OOXML/DocxFormat/FileTypes.cpp index 6634d4f86b..6edef1f661 100644 --- a/OOXML/DocxFormat/FileTypes.cpp +++ b/OOXML/DocxFormat/FileTypes.cpp @@ -181,6 +181,11 @@ namespace OOX L"", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/media", L"media", true); + const FileType SvgBlip (L"media", L"image", + L"", + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", L"image", true); + + const FileType DiagramData (L"diagrams", L"data.xml", L"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/diagramData", diff --git a/OOXML/DocxFormat/FileTypes.h b/OOXML/DocxFormat/FileTypes.h index 02bb139213..14f1999221 100644 --- a/OOXML/DocxFormat/FileTypes.h +++ b/OOXML/DocxFormat/FileTypes.h @@ -111,6 +111,8 @@ namespace OOX extern const FileType Media; + extern const FileType SvgBlip; + extern const FileType DiagramData; extern const FileType DiagramQuickStyle; diff --git a/OOXML/DocxFormat/Media/Audio.h b/OOXML/DocxFormat/Media/Audio.h index 4a01c3397a..50227342f9 100644 --- a/OOXML/DocxFormat/Media/Audio.h +++ b/OOXML/DocxFormat/Media/Audio.h @@ -30,8 +30,6 @@ * */ #pragma once -#ifndef OOX_AUDIO_INCLUDE_H_ -#define OOX_AUDIO_INCLUDE_H_ #include "Media.h" @@ -50,5 +48,3 @@ namespace OOX virtual const CPath DefaultFileName() const; }; } // namespace OOX - -#endif // OOX_AUDIO_INCLUDE_H_ diff --git a/OOXML/DocxFormat/Media/Image.cpp b/OOXML/DocxFormat/Media/Image.cpp index bcf4a79fea..d003eb1b77 100644 --- a/OOXML/DocxFormat/Media/Image.cpp +++ b/OOXML/DocxFormat/Media/Image.cpp @@ -56,4 +56,28 @@ namespace OOX { return m_filename.GetFilename(); } +//-------------------------------------------------------------------------------------- + SvgBlip::SvgBlip(OOX::Document* pMain, bool bDocument) : Image(pMain, bDocument) + { + } + SvgBlip::SvgBlip(OOX::Document* pMain, const CPath& filename, bool bExternal) : Image(pMain, filename, bExternal) + { + } + SvgBlip::~SvgBlip() + { + } + const FileType SvgBlip::type() const + { + return FileTypes::SvgBlip; + } + const CPath SvgBlip::DefaultDirectory() const + { + if (m_bDocument) return type().DefaultDirectory(); + else return L"../" + type().DefaultDirectory(); + } + const CPath SvgBlip::DefaultFileName() const + { + return m_filename.GetFilename(); + } + } // namespace OOX diff --git a/OOXML/DocxFormat/Media/Image.h b/OOXML/DocxFormat/Media/Image.h index c7fe3fc60a..bb443fbf14 100644 --- a/OOXML/DocxFormat/Media/Image.h +++ b/OOXML/DocxFormat/Media/Image.h @@ -47,4 +47,18 @@ namespace OOX virtual const CPath DefaultDirectory() const; virtual const CPath DefaultFileName() const; }; + + class SvgBlip : public Image + { + public: + SvgBlip(OOX::Document* pMain, bool bDocument = true); + SvgBlip(OOX::Document* pMain, const CPath& filename, bool bExternal = false); + virtual ~SvgBlip(); + + virtual const FileType type() const; + + virtual const CPath DefaultDirectory() const; + virtual const CPath DefaultFileName() const; + }; + } // namespace OOX diff --git a/OOXML/DocxFormat/Media/Video.h b/OOXML/DocxFormat/Media/Video.h index b5a9d935ac..4dbf42bd08 100644 --- a/OOXML/DocxFormat/Media/Video.h +++ b/OOXML/DocxFormat/Media/Video.h @@ -30,12 +30,9 @@ * */ #pragma once -#ifndef OOX_VIDEO_INCLUDE_H_ -#define OOX_VIDEO_INCLUDE_H_ #include "Media.h" - namespace OOX { class Video : public Media @@ -51,5 +48,3 @@ namespace OOX virtual const CPath DefaultFileName() const; }; } // namespace OOX - -#endif // OOX_VIDEO_INCLUDE_H_ diff --git a/OOXML/PPTXFormat/Logic/ExtP.cpp b/OOXML/PPTXFormat/Logic/ExtP.cpp index ea73551fe9..d8789de83d 100644 --- a/OOXML/PPTXFormat/Logic/ExtP.cpp +++ b/OOXML/PPTXFormat/Logic/ExtP.cpp @@ -53,7 +53,10 @@ namespace PPTX if (strName == L"media") { - ReadAttributes1(oReader); + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_ReadSingle(oReader, L"r:embed", link_media) + WritingElement_ReadAttributes_End(oReader) + if ( oReader.IsEmptyNode() ) continue; @@ -64,13 +67,24 @@ namespace PPTX if (strName1 == L"trim") { - ReadAttributes2(oReader); + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"st", st) + WritingElement_ReadAttributes_Read_else_if(oReader, L"end", end) + WritingElement_ReadAttributes_End(oReader) } } } + if (strName == L"svgBlip") + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_ReadSingle(oReader, L"r:embed", link_svg) + WritingElement_ReadAttributes_End(oReader) + } else if (strName == L"compatExt") { - ReadAttributes3(oReader); + WritingElement_ReadAttributes_Start(oReader); + WritingElement_ReadAttributes_ReadSingle(oReader, L"spid", spid) + WritingElement_ReadAttributes_End(oReader) } } } @@ -80,25 +94,6 @@ namespace PPTX WritingElement_ReadAttributes_ReadSingle ( oReader, L"uri", uri) WritingElement_ReadAttributes_End( oReader ) } - void Ext::ReadAttributes1(XmlUtils::CXmlLiteReader& oReader) - { - WritingElement_ReadAttributes_Start( oReader ) - WritingElement_ReadAttributes_ReadSingle( oReader, L"r:embed", link) - WritingElement_ReadAttributes_End( oReader ) - } - void Ext::ReadAttributes2(XmlUtils::CXmlLiteReader& oReader) - { - WritingElement_ReadAttributes_Start( oReader ) - WritingElement_ReadAttributes_Read_if ( oReader, L"st", st) - WritingElement_ReadAttributes_Read_else_if ( oReader, L"end", end) - WritingElement_ReadAttributes_End( oReader ) - } - void Ext::ReadAttributes3(XmlUtils::CXmlLiteReader& oReader) - { - WritingElement_ReadAttributes_Start( oReader ); - WritingElement_ReadAttributes_ReadSingle ( oReader, L"spid", spid) - WritingElement_ReadAttributes_End( oReader ) - } void Ext::fromXML(XmlUtils::CXmlNode& node) { std::vector oNodes; @@ -113,7 +108,7 @@ namespace PPTX if (L"media" == strName) { - link = oNode.GetAttribute(L"r:embed"); + link_media = oNode.GetAttribute(L"r:embed"); XmlUtils::CXmlNode trim = oNode.ReadNodeNoNS(L"trim"); if (trim.IsValid()) @@ -130,6 +125,10 @@ namespace PPTX { sectionLst = oNode; } + else if (L"svgBlip" == strName) + { + link_svg = oNode.GetAttribute(L"r:embed"); + } } } } @@ -147,7 +146,7 @@ namespace PPTX pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DOCX_GLOSSARY || pWriter->m_lDocType == XMLWRITER_DOC_TYPE_XLSX) namespace_ext= L"a"; - if (link.IsInit()) + if (link_media.IsInit()) { std::wstring namespace_link = L"p14"; if (pWriter->m_lDocType == XMLWRITER_DOC_TYPE_DOCX || @@ -165,11 +164,28 @@ namespace PPTX pWriter->WriteAttribute(L"xmlns:wp15", std::wstring(L"http://schemas.microsoft.com/office/word/2012/wordprocessingDrawing")); else pWriter->WriteAttribute(L"xmlns:p14", std::wstring(L"http://schemas.microsoft.com/office/powerpoint/2010/main")); - pWriter->WriteAttribute(L"r:embed", link->get()); + pWriter->WriteAttribute(L"r:embed", link_media->get()); pWriter->EndAttributes(); pWriter->EndNode(namespace_link + L":media"); pWriter->EndNode(namespace_ext + L":ext"); } + if (link_svg.IsInit()) + { + std::wstring namespace_link = L"asvg"; + + pWriter->StartNode(namespace_ext + L":ext"); + pWriter->StartAttributes(); + pWriter->WriteAttribute(L"uri", std::wstring(L"{96DAC541-7B7A-43D3-8B79-37D633B846F1}")); + pWriter->EndAttributes(); + + pWriter->StartNode(namespace_link + L":svgBlip"); + pWriter->StartAttributes(); + pWriter->WriteAttribute(L"xmlns:asvg", std::wstring(L"http://schemas.microsoft.com/office/drawing/2016/SVG/main")); + pWriter->WriteAttribute(L"r:embed", link_svg->get()); + pWriter->EndAttributes(); + pWriter->EndNode(namespace_link + L":svgBlip"); + pWriter->EndNode(namespace_ext + L":ext"); + } if (sectionLst.IsInit()) { pWriter->StartNode(namespace_ext + L":ext"); @@ -184,8 +200,10 @@ namespace PPTX void Ext::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const { pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart); - if (link.IsInit()) - link->toPPTY(0, pWriter); + if (link_media.IsInit()) + { + link_media->toPPTY(0, pWriter); + } pWriter->WriteDouble2(1, st); pWriter->WriteDouble2(2, end); pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd); diff --git a/OOXML/PPTXFormat/Logic/ExtP.h b/OOXML/PPTXFormat/Logic/ExtP.h index 066de4348d..0ccdbc3ec7 100644 --- a/OOXML/PPTXFormat/Logic/ExtP.h +++ b/OOXML/PPTXFormat/Logic/ExtP.h @@ -32,9 +32,6 @@ #pragma once -#ifndef PPTX_LOGIC_EXTP_PROPERTIES_INCLUDE_H_ -#define PPTX_LOGIC_EXTP_PROPERTIES_INCLUDE_H_ - #include "../Presentation/SectionLst.h" //-------------------------------------------------------------------------------------------------------------- @@ -106,9 +103,6 @@ namespace PPTX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - void ReadAttributes1(XmlUtils::CXmlLiteReader& oReader); - void ReadAttributes2(XmlUtils::CXmlLiteReader& oReader); - void ReadAttributes3(XmlUtils::CXmlLiteReader& oReader); virtual void fromXML(XmlUtils::CXmlNode& node); virtual std::wstring toXML() const; @@ -118,20 +112,18 @@ namespace PPTX //------------------------------------------------------- nullable_string uri; //media - nullable link; + nullable link_media; nullable_double st; nullable_double end; //compatExt nullable_string spid; - nullable sectionLst; -//dataModelExt -//table -//sparklineGroups + nullable sectionLst; +//image + nullable link_svg; + protected: virtual void FillParentPointersForChilds(); }; } -} - -#endif +} \ No newline at end of file diff --git a/OOXML/PPTXFormat/Logic/Fills/Blip.cpp b/OOXML/PPTXFormat/Logic/Fills/Blip.cpp index 59097ce510..8b5538a0e7 100644 --- a/OOXML/PPTXFormat/Logic/Fills/Blip.cpp +++ b/OOXML/PPTXFormat/Logic/Fills/Blip.cpp @@ -36,6 +36,7 @@ #include "./../../SlideMaster.h" #include "./../../SlideLayout.h" #include "./../../Theme.h" + #include "../../../../DesktopEditor/raster/ImageFileFormatChecker.h" namespace PPTX @@ -77,8 +78,8 @@ namespace PPTX { WritingElement_ReadAttributes_Start_No_NS( oReader ) WritingElement_ReadAttributes_Read_if ( oReader, L"embed", embed) - WritingElement_ReadAttributes_Read_else_if( oReader, L"link", link ) - WritingElement_ReadAttributes_Read_else_if( oReader, L"cstate", cstate ) + WritingElement_ReadAttributes_Read_else_if ( oReader, L"link", link ) + WritingElement_ReadAttributes_Read_else_if ( oReader, L"cstate", cstate ) WritingElement_ReadAttributes_End_No_NS( oReader ) } void Blip::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -94,11 +95,27 @@ namespace PPTX int nParentDepth = oReader.GetDepth(); while( oReader.ReadNextSiblingNode( nParentDepth ) ) { - std::wstring sName = oReader.GetName(); + std::wstring strName = XmlUtils::GetNameNoNS(oReader.GetName()); - UniEffect uni; - Effects.push_back(uni); - Effects.back().fromXML(oReader); + if (strName == L"extLst") + { + if (oReader.IsEmptyNode()) + continue; + + int nParentDepth1 = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nParentDepth1)) + { + Ext element; + ExtLst.push_back(element); + ExtLst.back().fromXML(oReader); + } + } + else + { + UniEffect uni; + Effects.push_back(uni); + Effects.back().fromXML(oReader); + } } FillParentPointersForChilds(); @@ -111,9 +128,26 @@ namespace PPTX XmlMacroReadAttributeBase(node, L"r:link", link); XmlMacroReadAttributeBase(node, L"cstate", cstate); - Effects.clear(); - XmlMacroLoadArray(node, L"*", Effects, UniEffect); + XmlUtils::CXmlNode list = node.ReadNodeNoNS(L"extLst"); + if (list.IsValid()) + { + std::vector oNodes; + if (list.GetNodes(L"*", oNodes)) + { + size_t nCount = oNodes.size(); + for (size_t i = 0; i < nCount; ++i) + { + XmlUtils::CXmlNode& oNode = oNodes[i]; + Ext element; + element.fromXML(oNode); + + ExtLst.push_back(element); + } + } + } + Effects.clear(); + XmlMacroLoadArray(node, L"*", Effects, UniEffect); FillParentPointersForChilds(); } std::wstring Blip::toXML() const @@ -134,13 +168,35 @@ namespace PPTX } void Blip::FillParentPointersForChilds() { - size_t count = Effects.size(); - for(size_t i = 0; i < count; ++i) + for (size_t i = 0; i < Effects.size(); ++i) + { Effects[i].SetParentPointer(this); + } + + for (size_t i = 0; i < ExtLst.size(); ++i) + { + ExtLst[i].SetParentPointer(this); + } + } std::wstring Blip::GetFullPicName(OOX::IFileContainer* pRels)const { - if(embed.IsInit()) + for (size_t i = 0; i < ExtLst.size(); ++i) + { + if (ExtLst[i].link_svg.IsInit()) + { + if (pRels != NULL) + { + smart_ptr p = pRels->Get(*ExtLst[i].link_svg); + if (p.is_init()) + return p->filename().m_strFilename; + } + + if (parentFileIs()) + return parentFileAs().GetImagePathNameFromRId(*ExtLst[i].link_svg); + } + } + if (embed.IsInit()) { if (pRels != NULL) { @@ -149,12 +205,12 @@ namespace PPTX return p->filename().m_strFilename; } - if(parentFileIs()) + if (parentFileIs()) return parentFileAs().GetImagePathNameFromRId(*embed); return L""; } - else if(link.IsInit()) + else if (link.IsInit()) { if (pRels != NULL) { @@ -163,7 +219,7 @@ namespace PPTX return p->filename().m_strFilename; } - if(parentFileIs()) + if (parentFileIs()) return parentFileAs().GetImagePathNameFromRId(*link); return L""; @@ -201,11 +257,11 @@ namespace PPTX pWriter->WriteAttribute(L"cstate", cstate); pWriter->EndAttributes(); - size_t nCount = Effects.size(); - for (size_t i = 0; i < nCount; ++i) + for (size_t i = 0; i < Effects.size(); ++i) { Effects[i].toXmlWriter(pWriter); } + pWriter->WriteArray(L"a:extLst", ExtLst); pWriter->EndNode(strName); } @@ -241,28 +297,28 @@ namespace PPTX std::wstring additionalPath; int additionalType = 0; - if(!oleFilepathBin.empty()) + if (!oleFilepathBin.empty()) { additionalPath = oleFilepathBin; additionalType = 1; } - else if(!oleRid.empty()) + else if (!oleRid.empty()) { additionalPath = this->GetFullOleName(OOX::RId(oleRid), pRels); additionalType = 1; } - else if(!mediaRid.empty()) + else if (!mediaRid.empty()) { additionalPath = this->GetFullOleName(OOX::RId(mediaRid), pRels); additionalType = 2; } - else if(!mediaFilepath.empty()) + else if (!mediaFilepath.empty()) { additionalPath = mediaFilepath; additionalType = 2; } NSShapeImageGen::CMediaInfo oId; - if(!dataFilepathImageA.empty()) + if (!dataFilepathImageA.empty()) { oId = pWriter->m_pCommon->m_pMediaManager->WriteImage(dataFilepathImageA, dX, dY, dW, dH, additionalPath, additionalType); } @@ -270,7 +326,7 @@ namespace PPTX { oId = pWriter->m_pCommon->m_pMediaManager->WriteImage(dataFilepathImage, dX, dY, dW, dH, additionalPath, additionalType); } - else if(!oleFilepathImage.empty()) + else if (!oleFilepathImage.empty()) { std::wstring imagePath = oleFilepathImage; oId = pWriter->m_pCommon->m_pMediaManager->WriteImage(imagePath, dX, dY, dW, dH, additionalPath, additionalType); diff --git a/OOXML/PPTXFormat/Logic/Fills/Blip.h b/OOXML/PPTXFormat/Logic/Fills/Blip.h index 0576f3191a..330d5a2404 100644 --- a/OOXML/PPTXFormat/Logic/Fills/Blip.h +++ b/OOXML/PPTXFormat/Logic/Fills/Blip.h @@ -31,9 +31,10 @@ */ #pragma once -#include "./../../WrapperWritingElement.h" -#include "./../../Limit/BlipCompression.h" -#include "./../UniEffect.h" +#include "../../WrapperWritingElement.h" +#include "../../Limit/BlipCompression.h" +#include "../UniEffect.h" +#include "../ExtP.h" #include "../../../DocxFormat/RId.h" namespace PPTX @@ -64,7 +65,8 @@ namespace PPTX virtual std::wstring GetFullPicName(OOX::IFileContainer* pRels = NULL) const; virtual std::wstring GetFullOleName(const OOX::RId& pRId, OOX::IFileContainer* pRels = NULL) const; - std::vector Effects; + std::vector Effects; + std::vector ExtLst; nullable_limit cstate; nullable embed; diff --git a/OOXML/PPTXFormat/Logic/Fills/BlipFill.cpp b/OOXML/PPTXFormat/Logic/Fills/BlipFill.cpp index 8646974627..a5b2f0eedb 100644 --- a/OOXML/PPTXFormat/Logic/Fills/BlipFill.cpp +++ b/OOXML/PPTXFormat/Logic/Fills/BlipFill.cpp @@ -275,16 +275,14 @@ namespace PPTX case 1: { // id. embed / link - pReader->Skip(4); - break; - } + pReader->Skip(4); + }break; case 10: case 11: { // id. embed / link - pReader->GetString2(); - break; - } + pReader->GetString2(); + }break; case 2: { if (!blip.is_init()) @@ -420,19 +418,17 @@ namespace PPTX } // ------------------- NSBinPptxRW::_relsGeneratorInfo oRelsGeneratorInfo = pReader->m_pRels->WriteImage(strImagePath, additionalFile, oleData, strOrigBase64); - - // ------------------- + // ------------------- if (!strTempFile.empty()) { CDirectory::DeleteFile(strTempFile); } - // ------------------- + // ------------------- if (oRelsGeneratorInfo.nImageRId > 0) { blip->embed = new OOX::RId(oRelsGeneratorInfo.nImageRId); blip->imageFilepath = oRelsGeneratorInfo.sFilepathImage; } - if(oRelsGeneratorInfo.nOleRId > 0) { blip->oleRid = OOX::RId(oRelsGeneratorInfo.nOleRId).get(); @@ -444,9 +440,8 @@ namespace PPTX blip->mediaRid = OOX::RId(oRelsGeneratorInfo.nMediaRId).get(); blip->mediaFilepath = oRelsGeneratorInfo.sFilepathMedia; } - pReader->Skip(1); // end attribute - break; - } + pReader->Skip(1); // end attribute + }break; default: { pReader->SkipRecord(); diff --git a/OOXML/PPTXFormat/Logic/Ln.h b/OOXML/PPTXFormat/Logic/Ln.h index c4c0d9fcc6..56100730ca 100644 --- a/OOXML/PPTXFormat/Logic/Ln.h +++ b/OOXML/PPTXFormat/Logic/Ln.h @@ -30,8 +30,6 @@ * */ #pragma once -#ifndef PPTX_LOGIC_LN_INCLUDE_H_ -#define PPTX_LOGIC_LN_INCLUDE_H_ #include "./../WrapperWritingElement.h" #include "./../Limit/PenAlign.h" @@ -96,5 +94,3 @@ namespace PPTX }; } // namespace Logic } // namespace PPTX - -#endif // PPTX_LOGIC_LN_INCLUDE_H_ diff --git a/OOXML/PPTXFormat/Logic/Pic.cpp b/OOXML/PPTXFormat/Logic/Pic.cpp index 87981b05c3..f1f29a3a98 100644 --- a/OOXML/PPTXFormat/Logic/Pic.cpp +++ b/OOXML/PPTXFormat/Logic/Pic.cpp @@ -223,7 +223,7 @@ namespace PPTX pWriter->StartAttributes(); pWriter->WriteAttribute(L"DrawAspect", m_oDrawAspect); - if(m_oId.IsInit()) + if (m_oId.IsInit()) { pWriter->WriteAttribute(L"r:id", m_oId->ToString()); } @@ -299,7 +299,7 @@ namespace PPTX } pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart); pWriter->WriteString2(0, m_sProgId); - if(!sData.empty()) + if (!sData.empty()) pWriter->WriteString1Data(1, sData.c_str(), sData.length()); pWriter->WriteInt2 (2, m_oDxaOrig); pWriter->WriteInt2 (3, m_oDyaOrig); @@ -713,10 +713,10 @@ namespace PPTX std::wstring sRes; //EncodingMode.unparsed https://github.com/tonyqus/npoi/blob/master/main/POIFS/FileSystem/Ole10Native.cs POLE::Storage oStorage(sFilePath.c_str()); - if(oStorage.open(false, false)) + if (oStorage.open(false, false)) { POLE::Stream oStream(&oStorage, L"Ole10Native"); - if(oStream.size() > 4) + if (oStream.size() > 4) { BYTE head[] = {0x00, 0x00, 0x00, 0x00}; oStream.read(head, 4); @@ -851,7 +851,7 @@ namespace PPTX } void Pic::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const { - if(oleObject.IsInit()) + if (oleObject.IsInit()) { pWriter->StartRecord(SPTREE_TYPE_OLE); @@ -880,7 +880,7 @@ namespace PPTX { OOX::WritingElement* pChildElemShape = pShape->m_arrItems[i]; - if(OOX::et_v_imagedata == pChildElemShape->getType()) + if (OOX::et_v_imagedata == pChildElemShape->getType()) { OOX::Vml::CImageData* pImageData = static_cast(pChildElemShape); @@ -991,11 +991,11 @@ namespace PPTX pWriter->m_lDocType != XMLWRITER_DOC_TYPE_DOCX && pWriter->m_lDocType != XMLWRITER_DOC_TYPE_DOCX_GLOSSARY) { - if(oleObject.IsInit() && oleObject->isValid()) + if (oleObject.IsInit() && oleObject->isValid()) { bOle = true; pWriter->WriteString(L""); - if(spPr.xfrm.IsInit()) + if (spPr.xfrm.IsInit()) { std::wstring oldName = spPr.xfrm->node_name; spPr.xfrm->node_name = _T("p:xfrm"); @@ -1006,16 +1006,16 @@ namespace PPTX pWriter->StartNode(_T("p:oleObj")); pWriter->WriteAttribute(L"name", (std::wstring)L"oleObj"); - if(oleObject->m_oId.IsInit()) + if (oleObject->m_oId.IsInit()) { pWriter->WriteAttribute2(L"r:id", oleObject->m_oId->get()); } - if(oleObject->m_oDxaOrig.IsInit()) + if (oleObject->m_oDxaOrig.IsInit()) { int nDxaOrig = oleObject->m_oDxaOrig.get(); pWriter->WriteAttribute(L"imgW", 635 * nDxaOrig); //twips to emu } - if(oleObject->m_oDyaOrig.IsInit()) + if (oleObject->m_oDyaOrig.IsInit()) { int nDyaOrig = oleObject->m_oDyaOrig.get(); pWriter->WriteAttribute(L"imgH", 635 * nDyaOrig); //twips to emu @@ -1058,7 +1058,7 @@ namespace PPTX pWriter->m_lDocType != XMLWRITER_DOC_TYPE_DOCX && pWriter->m_lDocType != XMLWRITER_DOC_TYPE_DOCX_GLOSSARY) { - if(bOle) + if (bOle) { pWriter->WriteString(L""); } @@ -1082,7 +1082,7 @@ namespace PPTX case 1: { blipFill.fromPPTY(pReader); - if(oleObject.IsInit() && blipFill.blip.IsInit()) + if (oleObject.IsInit() && blipFill.blip.IsInit()) { if (oleObject->m_OleObjectFile.IsInit() == false) oleObject->m_OleObjectFile = new OOX::OleObject(NULL, false, pReader->m_nDocumentType == XMLWRITER_DOC_TYPE_DOCX); @@ -1119,7 +1119,7 @@ namespace PPTX oleObject = new COLEObject(); oleObject->fromPPTY(pReader); - if(oleObject->m_sData.IsInit()) + if (oleObject->m_sData.IsInit()) blipFill.oleData = oleObject->m_sData.get(); blipFill.additionalFile = oleObject->m_OleObjectFile.smart_dynamic_cast(); @@ -1166,7 +1166,7 @@ namespace PPTX } } } - if(blipFill.blip.IsInit() && blipFill.additionalFile.IsInit()) + if (blipFill.blip.IsInit() && blipFill.additionalFile.IsInit()) { if (!blipFill.blip->oleRid.empty() && oleObject.IsInit()) { @@ -1180,7 +1180,7 @@ namespace PPTX oleObject->m_OleObjectFile->set_filename_cache (blipFill.blip->oleFilepathImage); } } - if (!blipFill.blip->mediaRid.empty()) + if (false == blipFill.blip->mediaRid.empty() && blipFill.additionalFile.IsInit()) { smart_ptr mediaFile = blipFill.additionalFile.smart_dynamic_cast(); bool bExternal = mediaFile->IsExternal(); @@ -1196,10 +1196,25 @@ namespace PPTX else { strMediaRelsPath += mediaFile->filename().GetFilename(); - PPTX::Logic::Ext ext; - ext.link = OOX::RId(blipFill.blip->mediaRid); - nvPicPr.nvPr.extLst.push_back(ext); + + if (blipFill.additionalFile->type() == OOX::FileTypes::Audio || + blipFill.additionalFile->type() == OOX::FileTypes::Video) + { + ext.link_media = OOX::RId(blipFill.blip->mediaRid); + nvPicPr.nvPr.extLst.push_back(ext); + + if (nvPicPr.cNvPr.hlinkClick.IsInit() == false) + nvPicPr.cNvPr.hlinkClick.Init(); + + nvPicPr.cNvPr.hlinkClick->id = L""; + nvPicPr.cNvPr.hlinkClick->action = L"ppaction://media"; + } + else if (blipFill.additionalFile->type() == OOX::FileTypes::SvgBlip) + { + ext.link_svg = OOX::RId(blipFill.blip->mediaRid); + blipFill.blip->ExtLst.push_back(ext); + } } unsigned int nRId = 0; @@ -1214,17 +1229,11 @@ namespace PPTX nvPicPr.nvPr.media.Media = new PPTX::Logic::MediaFile(L"videoFile"); nRId = pReader->m_pRels->WriteRels(L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/video", strMediaRelsPath, bExternal ? L"External" : L""); } - if (nvPicPr.nvPr.media.Media.IsInit() && nRId > 0) { PPTX::Logic::MediaFile& mediaFile = nvPicPr.nvPr.media.Media.as(); mediaFile.link = OOX::RId((size_t)nRId); } - if (nvPicPr.cNvPr.hlinkClick.IsInit() == false) - nvPicPr.cNvPr.hlinkClick.Init(); - - nvPicPr.cNvPr.hlinkClick->id = L""; - nvPicPr.cNvPr.hlinkClick->action = L"ppaction://media"; } } @@ -1240,11 +1249,11 @@ namespace PPTX { parentFileAs().Layout->GetLevelUp(this); } - else if(parentFileIs()) + else if (parentFileIs()) { parentFileAs().Master->GetLevelUp(this); } - else if(parentFileIs()) + else if (parentFileIs()) { parentFileAs().master_->GetLevelUp(this); } @@ -1292,7 +1301,7 @@ namespace PPTX pRect.right = pRect.left + spPr.xfrm->extX.get_value_or(0); pRect.bottom = pRect.top + spPr.xfrm->extY.get_value_or(0); } - if(parentIs()) + if (parentIs()) parentAs().NormalizeRect(pRect); } std::wstring Pic::GetFullPicName()const @@ -1330,7 +1339,7 @@ namespace PPTX if ( (mediaFile.IsInit() == false || mediaFile->filename().GetPath() == L"NULL") && !nvPicPr.nvPr.extLst.empty()) { //todooo - почему везде нулевой то? - сделать поиск по всем uri - file = pRels->Find(nvPicPr.nvPr.extLst[0].link.get()); + file = pRels->Find(nvPicPr.nvPr.extLst[0].link_media.get()); } } @@ -1393,7 +1402,7 @@ namespace PPTX { if (std::wstring (_T("NULL")) == parentFileAs().GetLinkFromRId(nvPicPr.nvPr.media.as().link.get()) ) // HAVE TRIM { - if(nvPicPr.nvPr.extLst.size()) + if (nvPicPr.nvPr.extLst.size()) { if (nvPicPr.nvPr.extLst[0].st.is_init()) trim = nvPicPr.nvPr.extLst[0].st.get(); @@ -1419,7 +1428,7 @@ namespace PPTX { if (std::wstring (_T("NULL")) == parentFileAs().GetLinkFromRId(nvPicPr.nvPr.media.as().link.get())) // HAVE TRIM { - if(nvPicPr.nvPr.extLst.size()) + if (nvPicPr.nvPr.extLst.size()) { if (nvPicPr.nvPr.extLst[0].end.is_init()) trim = nvPicPr.nvPr.extLst[0].end.get(); @@ -1443,7 +1452,7 @@ namespace PPTX if (XMLWRITER_DOC_TYPE_XLSX != pWriter->m_lDocType) { - if(bOle && oleObject->m_oDxaOrig.IsInit() && oleObject->m_oDyaOrig.IsInit()) + if (bOle && oleObject->m_oDxaOrig.IsInit() && oleObject->m_oDyaOrig.IsInit()) { sOleNodeName = L"w:object"; pWriter->StartNode(sOleNodeName); @@ -1480,7 +1489,7 @@ namespace PPTX NSBinPptxRW::CXmlWriter oStylesWriter; - if(pWriter->m_strStyleMain.empty()) + if (pWriter->m_strStyleMain.empty()) { oStylesWriter.WriteAttributeCSS (L"position", L"absolute"); if (in_group) @@ -1615,7 +1624,7 @@ namespace PPTX pWriter->WriteString(pWriter->m_strAttributesMain); pWriter->m_strAttributesMain.clear(); } - if(bOle) + if (bOle) { pWriter->WriteAttribute(L"filled", L"f"); } @@ -1705,17 +1714,17 @@ namespace PPTX } int imgW = node.GetAttributeInt(std::wstring(L"imgW"), 0); - if(imgW > 0) + if (imgW > 0) { oleObject->m_oDxaOrig = (int)Emu_To_Twips(imgW); } int imgH = node.GetAttributeInt(std::wstring(L"imgH"), 0); - if(imgH > 0) + if (imgH > 0) { oleObject->m_oDyaOrig = (int)Emu_To_Twips(imgH); } - if(oleObject->m_oId.IsInit()) + if (oleObject->m_oId.IsInit()) { if (blipFill.blip.IsInit() == false) { @@ -1730,7 +1739,7 @@ namespace PPTX void Pic::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start(oReader) - WritingElement_ReadAttributes_Read_if(oReader, _T("macro"), macro) + WritingElement_ReadAttributes_Read_if (oReader, _T("macro"), macro) WritingElement_ReadAttributes_End(oReader) } } // namespace Logic diff --git a/OdfFile/Writer/Converter/ConvertDrawing.cpp b/OdfFile/Writer/Converter/ConvertDrawing.cpp index 6f256deb67..48aa36cdf7 100644 --- a/OdfFile/Writer/Converter/ConvertDrawing.cpp +++ b/OdfFile/Writer/Converter/ConvertDrawing.cpp @@ -351,9 +351,9 @@ void OoxConverter::convert(PPTX::Logic::Pic *oox_picture) for (size_t i = 0; i < oox_picture->nvPicPr.nvPr.extLst.size(); i++) { PPTX::Logic::Ext & ext = oox_picture->nvPicPr.nvPr.extLst[i]; - if (pathMedia.empty() && ext.link.IsInit()) + if (pathMedia.empty() && ext.link_media.IsInit()) { - pathMedia = find_link_by_id(ext.link->get(), 3, bExternal); + pathMedia = find_link_by_id(ext.link_media->get(), 3, bExternal); //например файлики mp3 } if (ext.st.IsInit()) start = *ext.st; diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index 950dd51982..a5344c49a1 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -1232,12 +1232,12 @@ namespace NExtractTools _UINT32 pptx2pptt_bin (const std::wstring &sFrom, const std::wstring &sTo, const std::wstring &sTemp, InputParams& params) { // unzip pptx to temp folder - std::wstring sTempUnpackedPPTX = sTemp + FILE_SEPARATOR_STR + _T("pptx_unpacked")+ FILE_SEPARATOR_STR; // leading slash is very important! + std::wstring sTempUnpackedPPTX = sTemp + FILE_SEPARATOR_STR + _T("pptx_unpacked"); // leading slash is very important! - нихуя (unzip отвалился) NSDirectory::CreateDirectory(sTempUnpackedPPTX); // unzip pptx to folder - COfficeUtils oCOfficeUtils(NULL); + COfficeUtils oCOfficeUtils(NULL); if (S_OK != oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedPPTX, NULL, 0)) { //check crypt