/* * (c) Copyright Ascensio System SIA 2010-2014 * * 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 Lubanas st. 125a-25, Riga, Latvia, * EU, LV-1021. * * 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 "../stdafx.h" #include "../PPTXFormat/PPTX.h" #include "BinWriters.h" namespace PPTX2EditorAdvanced { using namespace NSBinPptxRW; DWORD Convert(NSBinPptxRW::CBinaryFileWriter& oBinaryWriter, PPTX::Folder& oFolder, const CString& strSourceDirectory, const CString& strDstFile) { NSBinPptxRW::CCommonWriter* pCommon = &oBinaryWriter.m_oCommon; CAtlArray> _themes; CAtlArray> _slideMasters; CAtlArray> _slides; CAtlArray> _layouts; CAtlArray> _notes; CAtlArray> _notesMasters; smart_ptr presentation = oFolder.get(OOX::FileTypes::Presentation).smart_dynamic_cast(); int cx = presentation->sldSz->cx; int cy = presentation->sldSz->cy; size_t nCountMasters = presentation->sldMasterIdLst.GetCount(); for (size_t nMaster = 0; nMaster < nCountMasters; ++nMaster) { smart_ptr slideMaster = ((*presentation)[presentation->sldMasterIdLst[nMaster].rid.get()]).smart_dynamic_cast(); size_t pPointerSM = (size_t)(slideMaster.operator ->()); CAtlMap::CPair* pSearchSM = pCommon->slideMasters.Lookup(pPointerSM); if (NULL != pSearchSM) { continue; } oBinaryWriter.m_oCommon.m_oRels.Add(); CMasterSlideInfo& oMasterInfo = oBinaryWriter.m_oCommon.m_oRels[oBinaryWriter.m_oCommon.m_oRels.GetCount() - 1]; LONG lCountSM = (LONG)_slideMasters.GetCount(); pCommon->slideMasters.SetAt(pPointerSM, lCountSM); _slideMasters.Add(slideMaster); size_t pPointerTh = (size_t)(slideMaster->Theme.operator ->()); CAtlMap::CPair* pSearchTh = pCommon->themes.Lookup(pPointerTh); if (NULL == pSearchTh) { LONG lCountTh = (LONG)_themes.GetCount(); pCommon->themes.SetAt(pPointerTh, lCountTh); _themes.Add(slideMaster->Theme); oMasterInfo.m_lThemeIndex = lCountTh; } else { oMasterInfo.m_lThemeIndex = pSearchTh->m_value; } size_t nCountLayouts = slideMaster->sldLayoutIdLst.GetCount(); for (size_t iLayout = 0; iLayout < nCountLayouts; ++iLayout) { smart_ptr slideLayout = ((*slideMaster)[slideMaster->sldLayoutIdLst[iLayout].rid.get()]).smart_dynamic_cast(); size_t pPointerL = (size_t)(slideLayout.operator ->()); CAtlMap::CPair* pSearchL = pCommon->layouts.Lookup(pPointerL); if (NULL == pSearchL) { LONG lCountL = (LONG)_layouts.GetCount(); pCommon->layouts.SetAt(pPointerL, lCountL); _layouts.Add(slideLayout); oMasterInfo.m_arLayoutIndexes.Add(lCountL); oMasterInfo.m_arLayoutImagesBase64.Add(""); } else { oMasterInfo.m_arLayoutIndexes.Add(pSearchL->m_value); oMasterInfo.m_arLayoutImagesBase64.Add(""); } } } size_t nCountNoteMasters = presentation->notesMasterIdLst.GetCount(); for (size_t nNote = 0; nNote < nCountNoteMasters; ++nNote) { smart_ptr noteMaster = ((*presentation)[presentation->notesMasterIdLst[nNote].rid.get()]).smart_dynamic_cast(); size_t pPointerNM = (size_t)(noteMaster.operator ->()); CAtlMap::CPair* pSearchNM = pCommon->notesMasters.Lookup(pPointerNM); if (NULL != pSearchNM) { continue; } LONG lCountNM = (LONG)_notesMasters.GetCount(); pCommon->notesMasters.SetAt(pPointerNM, lCountNM); _notesMasters.Add(noteMaster); size_t pPointerTh = (size_t)(noteMaster->Theme.operator ->()); CAtlMap::CPair* pSearchTh = pCommon->themes.Lookup(pPointerTh); if (NULL == pSearchTh) { LONG lCountTh = (LONG)_themes.GetCount(); pCommon->themes.SetAt(pPointerTh, lCountTh); _themes.Add(noteMaster->Theme); } } size_t nCount = presentation->sldIdLst.GetCount(); for (size_t i = 0; i < nCount; ++i) { smart_ptr slide = ((*presentation)[presentation->sldIdLst[i].rid.get()]).smart_dynamic_cast(); size_t pPointerS = (size_t)(slide.operator ->()); CAtlMap::CPair* pSearchS = pCommon->slides.Lookup(pPointerS); if (NULL != pSearchS) { continue; } size_t pPointerL = (size_t)(slide->Layout.operator ->()); CAtlMap::CPair* pSearchL = pCommon->layouts.Lookup(pPointerL); if (NULL == pSearchL) { oBinaryWriter.m_oCommon.m_oSlide_Layout_Rels.Add(0); } else { oBinaryWriter.m_oCommon.m_oSlide_Layout_Rels.Add(pSearchL->m_value); } LONG lCountS = (LONG)_slides.GetCount(); pCommon->slides.SetAt(pPointerS, lCountS); _slides.Add(slide); size_t pPointerN = (size_t)(slide->Note.operator ->()); if (NULL != pPointerN) { CAtlMap::CPair* pSearchN = pCommon->notes.Lookup(pPointerN); if (NULL == pSearchN) { LONG lCountN = (LONG)_notes.GetCount(); pCommon->notes.SetAt(pPointerN, lCountN); _notes.Add(slide->Note); } } } oBinaryWriter.WriteReserved(5 * 30); oBinaryWriter.StartMainRecord(NSMainTables::Main); oBinaryWriter.WriteULONG(NSSerFormat::Signature); oBinaryWriter.WriteULONG(0); smart_ptr app = oFolder.get(OOX::FileTypes::App).smart_dynamic_cast(); if (app.is_init()) { oBinaryWriter.StartMainRecord(NSMainTables::App); app->toPPTY(&oBinaryWriter); } smart_ptr core = oFolder.get(OOX::FileTypes::Core).smart_dynamic_cast(); if (core.is_init()) { oBinaryWriter.StartMainRecord(NSMainTables::Core); core->toPPTY(&oBinaryWriter); } smart_ptr viewProps = presentation->get(OOX::FileTypes::ViewProps).smart_dynamic_cast(); if (viewProps.is_init()) { oBinaryWriter.StartMainRecord(NSMainTables::ViewProps); viewProps->toPPTY(&oBinaryWriter); } smart_ptr tablestyles = presentation->get(OOX::FileTypes::TableStyles).smart_dynamic_cast(); if (tablestyles.is_init()) { oBinaryWriter.StartMainRecord(NSMainTables::TableStyles); tablestyles->toPPTY(&oBinaryWriter); } oBinaryWriter.StartMainRecord(NSMainTables::Presentation); presentation->toPPTY(&oBinaryWriter); oBinaryWriter.StartMainRecord(NSMainTables::Themes); ULONG nCountThemes = (ULONG)_themes.GetCount(); oBinaryWriter.WriteULONG(nCountThemes); for (ULONG i = 0; i < nCountThemes; ++i) { _themes[i]->toPPTY(&oBinaryWriter); } oBinaryWriter.StartMainRecord(NSMainTables::SlideMasters); ULONG nCountSM = (ULONG)_slideMasters.GetCount(); oBinaryWriter.WriteULONG(nCountSM); for (ULONG i = 0; i < nCountSM; ++i) { _slideMasters[i]->toPPTY(&oBinaryWriter); } oBinaryWriter.StartMainRecord(NSMainTables::SlideLayouts); ULONG nCountL = (ULONG)_layouts.GetCount(); oBinaryWriter.WriteULONG(nCountL); for (ULONG i = 0; i < nCountL; ++i) { _layouts[i]->toPPTY(&oBinaryWriter); } oBinaryWriter.StartMainRecord(NSMainTables::Slides); ULONG nCountS = (ULONG)_slides.GetCount(); oBinaryWriter.WriteULONG(nCountS); for (ULONG i = 0; i < nCountS; ++i) { _slides[i]->toPPTY(&oBinaryWriter); } if (FALSE) { oBinaryWriter.StartMainRecord(NSMainTables::NotesSlides); ULONG nCountN = (ULONG)_notes.GetCount(); oBinaryWriter.WriteULONG(nCountN); for (ULONG i = 0; i < nCountN; ++i) { _notes[i]->toPPTY(&oBinaryWriter); } oBinaryWriter.StartMainRecord(NSMainTables::NotesMasters); ULONG nCountNM = (ULONG)_notesMasters.GetCount(); oBinaryWriter.WriteULONG(nCountNM); for (ULONG i = 0; i < nCountNM; ++i) { _notesMasters[i]->toPPTY(&oBinaryWriter); } } oBinaryWriter.StartMainRecord(NSMainTables::ImageMap); oBinaryWriter.StartRecord(NSMainTables::ImageMap); oBinaryWriter.WriteBYTE(NSBinPptxRW::g_nodeAttributeStart); CAtlMap* pIMaps = &oBinaryWriter.m_oCommon.m_oImageManager.m_mapImagesFile; POSITION pos1 = pIMaps->GetStartPosition(); LONG lIndexI = 0; while (NULL != pos1) { NSShapeImageGen::CImageInfo& oRec = pIMaps->GetNextValue(pos1); oBinaryWriter.WriteString1(lIndexI++, oRec.GetPath2()); } oBinaryWriter.WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd); oBinaryWriter.EndRecord(); oBinaryWriter.StartMainRecord(NSMainTables::FontMap); oBinaryWriter.StartRecord(NSMainTables::FontMap); oBinaryWriter.WriteBYTE(NSBinPptxRW::g_nodeAttributeStart); CAtlMap* pFMaps = &oBinaryWriter.m_oCommon.m_pNativePicker->m_mapPicks; POSITION pos2 = pFMaps->GetStartPosition(); LONG lIndexF = 0; while (NULL != pos2) { CString& oRec = pFMaps->GetNextValue(pos2); oBinaryWriter.WriteString1(lIndexF++, oRec); } oBinaryWriter.WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd); oBinaryWriter.EndRecord(); if (TRUE) { oBinaryWriter.StartMainRecord(NSMainTables::SlideRels); oBinaryWriter.StartRecord(NSMainTables::SlideRels); oBinaryWriter.WriteBYTE(NSBinPptxRW::g_nodeAttributeStart); size_t _s_rels = oBinaryWriter.m_oCommon.m_oSlide_Layout_Rels.GetCount(); for (size_t i = 0; i < _s_rels; ++i) { oBinaryWriter.WriteInt1(0, oBinaryWriter.m_oCommon.m_oSlide_Layout_Rels[i]); } oBinaryWriter.WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd); oBinaryWriter.EndRecord(); oBinaryWriter.StartMainRecord(NSMainTables::ThemeRels); oBinaryWriter.StartRecord(NSMainTables::ThemeRels); CAtlArray* th_rels = &oBinaryWriter.m_oCommon.m_oRels; oBinaryWriter.WriteULONG((ULONG)th_rels->GetCount()); for (size_t i = 0; i < th_rels->GetCount(); i++) { NSBinPptxRW::CMasterSlideInfo& oTh = th_rels->GetAt(i); oBinaryWriter.StartRecord(0); oBinaryWriter.WriteBYTE(NSBinPptxRW::g_nodeAttributeStart); oBinaryWriter.WriteInt1(0, oTh.m_lThemeIndex); oBinaryWriter.WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd); ULONG lay_count = (ULONG)oTh.m_arLayoutIndexes.GetCount(); oBinaryWriter.WriteULONG(lay_count); for (ULONG j = 0; j < lay_count; ++j) { oBinaryWriter.StartRecord(0); oBinaryWriter.WriteBYTE(NSBinPptxRW::g_nodeAttributeStart); oBinaryWriter.WriteInt1(0, oTh.m_arLayoutIndexes[j]); oBinaryWriter.WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd); oBinaryWriter.EndRecord(); } oBinaryWriter.EndRecord(); } oBinaryWriter.EndRecord(); } oBinaryWriter.WriteEmbeddedFonts(); oBinaryWriter.WriteMainPart(); BYTE* pbBinBuffer = oBinaryWriter.GetBuffer(); int nBinBufferLen = (int)oBinaryWriter.GetPosition(); int nBase64BufferLen = Base64::Base64EncodeGetRequiredLength(nBinBufferLen, Base64::B64_BASE64_FLAG_NOCRLF); BYTE* pbBase64Buffer = new BYTE[nBase64BufferLen]; if (TRUE == Base64::Base64Encode(pbBinBuffer, nBinBufferLen, (LPSTR)pbBase64Buffer, &nBase64BufferLen, Base64::B64_BASE64_FLAG_NOCRLF)) { CFile oFile; oFile.CreateFileW(strDstFile); CString strPrefix = _T(""); strPrefix.Format(_T("PPTY;v1;%d;"), nBinBufferLen); CStringA sW = (CStringA)strPrefix; oFile.WriteFile(sW.GetBuffer(), (DWORD)sW.GetLength()); oFile.WriteFile(pbBase64Buffer, nBase64BufferLen); oFile.CloseFile(); } RELEASEARRAYOBJECTS(pbBase64Buffer); return 0; } }