/* * (c) Copyright Ascensio System SIA 2010-2016 * * 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 * */ //#include "./stdafx.h" #include "IFileContainer.h" #include "Rels/File.h" #ifndef NODOCX //#include "FileFactory.h" #endif #include "ContentTypes/File.h" #include "FileType.h" #include "External/External.h" #include "External/HyperLink.h" #include "Drawing/LegacyDiagramText.h" #include "Media/Image.h" #include "Media/OleObject.h" #include "FileTypes.h" #include #include namespace PPTX { UnknowTypeFile IFileContainer::unknow; void IFileContainer::read(const OOX::CPath& filename) { PPTX::Rels::File rels(filename); read(rels, filename.GetDirectory()); } void IFileContainer::read(const Rels::File& rels, const OOX::CPath& path) { #ifndef NODOCX /*BOOST_FOREACH(const PPTX::Rels::RelationShip& relation, *rels.Relations) { add(relation.rId(), PPTX::CreateFile(path, relation)); }*/ size_t nCount = rels.Relations.m_items.size(); for (size_t i = 0; i < nCount; ++i) { add(rels.Relations.m_items[i].rId(), PPTX::CreateFile(path, rels.Relations.m_items[i])); } #endif } void IFileContainer::write(const OOX::CPath& filename, const OOX::CPath& directory, ContentTypes::File& content) const { PPTX::Rels::File rels; OOX::CPath current = filename.GetDirectory(); write(rels, current, directory, content); rels.write(filename); } void IFileContainer::write(Rels::File& rels, const OOX::CPath& curdir, const OOX::CPath& directory, ContentTypes::File& content) const { std::map namepair; for (std::map>::const_iterator it = m_container.begin(); it != m_container.end(); ++it) { smart_ptr pFile = it->second; smart_ptr pExt = pFile.smart_dynamic_cast(); if (!pExt.IsInit()) { OOX::CPath defdir = pFile->DefaultDirectory(); OOX::CPath name = pFile->DefaultFileName(); std::map::const_iterator pNamePair = namepair.find( name.m_strFilename ); if ( pNamePair == namepair.end()) namepair [name.m_strFilename] = 1; else name = name + pNamePair->first; OOX::CSystemUtility::CreateDirectories(curdir / defdir); pFile->write(curdir / defdir / name, directory / defdir, content); rels.registration(it->first, pFile->type(), defdir / name); } else { //const HyperLink hyperlink = static_cast(*pair.second); //rels.registration(pair.first, hyperlink); rels.registration(it->first, pExt); } } } void IFileContainer::Commit(const OOX::CPath& path) { std::map namepair; for (std::map>::const_iterator it = m_container.begin(); it != m_container.end(); ++it) { smart_ptr pFile = it->second; smart_ptr pExt = pFile.smart_dynamic_cast(); if (!pExt.IsInit()) { OOX::CPath defdir = pFile->DefaultDirectory(); OOX::CPath name = pFile->DefaultFileName(); std::map::const_iterator pNamePair = namepair.find( name.m_strFilename ); if ( pNamePair == namepair.end()) namepair [name.m_strFilename] = 1; else name = name + pNamePair->first; OOX::CSystemUtility::CreateDirectories(path / defdir); smart_ptr fileBuilder = it->second.smart_dynamic_cast(); if (fileBuilder.is_init()) fileBuilder->Commit(path / defdir / name); } } } void IFileContainer::Finalize(const OOX::CPath& filename, const OOX::CPath& directory, ContentTypes::File& content) { PPTX::Rels::File rels; OOX::CPath current = filename.GetDirectory(); Finalize(rels, current, directory, content); rels.write(filename); } void IFileContainer::Finalize(Rels::File& rels, const OOX::CPath& curdir, const OOX::CPath& directory, ContentTypes::File& content) { std::map namepair; for (std::map>::const_iterator it = m_container.begin(); it != m_container.end(); ++it) { smart_ptr pFile = it->second; smart_ptr pExt = pFile.smart_dynamic_cast(); if (!pExt.IsInit()) { OOX::CPath defdir = pFile->DefaultDirectory(); OOX::CPath name = pFile->DefaultFileName(); std::map::const_iterator pNamePair = namepair.find( name.m_strFilename ); if ( pNamePair == namepair.end()) namepair [name.m_strFilename] = 1; else name = name + pNamePair->first; OOX::CSystemUtility::CreateDirectories(curdir / defdir); smart_ptr fileBuilder = pFile.smart_dynamic_cast(); if ( fileBuilder.is_init() ) { fileBuilder->Finalize(curdir / defdir / name, directory / defdir, content); } else { pFile->write(curdir / defdir / name, directory / defdir, content); } rels.registration(it->first, pFile->type(), defdir / name); } else { rels.registration(it->first, pExt); } } } void IFileContainer::extractPictures(const OOX::CPath& path) const { for (std::map>::const_iterator it = m_container.begin(); it != m_container.end(); ++it) { smart_ptr pFile = it->second; smart_ptr pImage = pFile.smart_dynamic_cast(); if ( pImage.is_init() ) { pImage->copy_to( path ); continue; } smart_ptr pExt = pFile.smart_dynamic_cast(); if ( pExt.is_init() ) { pExt->extractPictures( path ); continue; } } } smart_ptr IFileContainer::image(const RId& rId) const { std::map>::const_iterator pPair = m_container.find(rId.get()); if (pPair == m_container.end ()) return smart_ptr(); return pPair->second.smart_dynamic_cast(); } smart_ptr IFileContainer::hyperlink(const RId& rId) const { std::map>::const_iterator pPair = m_container.find(rId.get()); if (pPair == m_container.end ()) return smart_ptr(); return pPair->second.smart_dynamic_cast(); } smart_ptr IFileContainer::oleObject(const RId& rId) const { std::map>::const_iterator pPair = m_container.find(rId.get()); if (pPair == m_container.end ()) return smart_ptr(); return pPair->second.smart_dynamic_cast(); } smart_ptr IFileContainer::legacyDiagramText(const RId& rId) const { std::map>::const_iterator pPair = m_container.find(rId.get()); if (pPair == m_container.end ()) return smart_ptr(); return pPair->second.smart_dynamic_cast(); } const bool IFileContainer::exist(const FileType& type) const { for (std::map>::const_iterator it = m_container.begin(); it != m_container.end(); ++it) { if (type == it->second->type()) return true; } return false; } const bool IFileContainer::exist(const RId& rId) const { std::map>::const_iterator it = m_container.find(rId.get()); return (it != m_container.end()); } const bool IFileContainer::isExternal(const PPTX::RId& rId) const { std::map>::const_iterator it = m_container.find(rId.get()); if (it != m_container.end()) { CString type = it->second->type().RelationType(); CString name = it->second->type().DefaultFileName().m_strFilename; return (((type == PPTX::FileTypes::ExternalAudio) || (type == PPTX::FileTypes::ExternalImage) || (type == PPTX::FileTypes::ExternalVideo)) && (name == _T(""))); } return true; } smart_ptr IFileContainer::get(const FileType& type) { for (std::map>::const_iterator it = m_container.begin(); it != m_container.end(); ++it) { if (type == it->second->type()) return it->second; } return smart_ptr(new UnknowTypeFile( unknow )); } const RId IFileContainer::add(const smart_ptr& file) { const RId rId = maxRId().next(); add(rId, file); return rId; } void IFileContainer::add(const PPTX::RId rId, const smart_ptr& file) { //m_lMaxRid = max(m_lMaxRid, rId.get()); m_container [rId.get()] = file; } smart_ptr IFileContainer::find(const FileType& type) const { for (std::map>::const_iterator it = m_container.begin(); it != m_container.end(); ++it) { if (type == it->second->type()) return it->second; } return smart_ptr((PPTX::File*)new UnknowTypeFile()); } smart_ptr IFileContainer::find(const PPTX::RId& rId) const { std::map>::const_iterator it = m_container.find(rId.get()); if (it != m_container.end()) return it->second; smart_ptr pointer; return pointer; } smart_ptr IFileContainer::operator [](const PPTX::RId rId) { std::map>::const_iterator it = m_container.find(rId.get()); if (it != m_container.end()) return it->second; smart_ptr pointer; return pointer; } smart_ptr IFileContainer::operator [](const FileType& type) { return find(type); } const RId IFileContainer::maxRId() { ++m_lMaxRid; return RId(m_lMaxRid); } } // namespace PPTX