/* * Copyright (C) Ascensio System SIA, 2009-2026 * * 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, together with the * additional terms provided in the LICENSE file. * * 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: https://www.gnu.org/licenses/agpl-3.0.html * * You can contact Ascensio System SIA by email at info@onlyoffice.com * or by postal mail at 20A-6 Ernesta Birznieka-Upisha Street, Riga, * LV-1050, Latvia, European Union. * * The interactive user interfaces in modified versions of the Program * are required to display Appropriate Legal Notices in accordance with * Section 5 of the GNU AGPL version 3. * * No trademark rights are granted under this License. * * All non-code elements of the Product, including illustrations, * icon sets, and technical writing content, are licensed under the * Creative Commons Attribution-ShareAlike 4.0 International License: * https://creativecommons.org/licenses/by-sa/4.0/legalcode * * This license applies only to such non-code elements and does not * modify or replace the licensing terms applicable to the Program's * source code, which remains licensed under the GNU Affero General * Public License v3. * * SPDX-License-Identifier: AGPL-3.0-only */ #include "NativeBuilderDocumentEmbed.h" #include "./../docbuilder_p.h" #include "../../common/Directory.h" #include "../server.h" JSSmart CBuilderDocumentEmbed::IsValid() { return CJSContext::createBool(m_bIsValid); } JSSmart CBuilderDocumentEmbed::GetBinary() { return CJSContext::createUint8Array(m_sFolder + L"/Editor.bin"); } JSSmart CBuilderDocumentEmbed::GetFolder() { return CJSContext::createString(m_sFolder); } JSSmart CBuilderDocumentEmbed::Close() { _CloseFile(); return NULL; } JSSmart CBuilderDocumentEmbed::GetImageMap() { std::vector files = NSDirectory::GetFiles(m_sFolder + L"/media"); JSSmart obj = CJSContext::createObject(); for (std::vector::iterator i = files.begin(); i != files.end(); i++) { std::wstring sFile = *i; NSStringUtils::string_replace(sFile, L"\\", L"/"); std::wstring sName = L"media/" + NSFile::GetFileName(sFile); obj->set(U_TO_UTF8(sName).c_str(), CJSContext::createString(sFile)); } return obj->toValue(); } void CBuilderDocumentEmbed::_OpenFile(const std::wstring& sFile, const std::wstring& sParams) { NSDoctRenderer::CDocBuilder_Private* pBuilder = GetPrivate(m_pBuilder); std::wstring sTmpDir = pBuilder->m_sTmpFolder; m_sFolder = NSFile::CFileBinary::CreateTempFileWithUniqueName(sTmpDir, L"DE_"); if (NSFile::CFileBinary::Exists(m_sFolder)) NSFile::CFileBinary::Remove(m_sFolder); NSStringUtils::string_replace(m_sFolder, L"\\", L"/"); std::wstring::size_type nPosPoint = m_sFolder.rfind('.'); if (nPosPoint != std::wstring::npos && nPosPoint > sTmpDir.length()) { m_sFolder = m_sFolder.substr(0, nPosPoint); } NSDirectory::CreateDirectory(m_sFolder); std::wstring sExtCopy = pBuilder->GetFileCopyExt(sFile); std::wstring sFileCopy = m_sFolder + L"/origin." + sExtCopy; pBuilder->MoveFileOpen(sFile, sFileCopy); int nConvertResult = pBuilder->ConvertToInternalFormat(m_sFolder, sFileCopy, sParams); if (0 == nConvertResult) { if (CServerInstance::getInstance().IsEnable()) CServerInstance::getInstance().AddTmpFile(m_sFolder); m_bIsValid = true; } } void CBuilderDocumentEmbed::_CloseFile() { if (!m_sFolder.empty()) { NSDirectory::DeleteDirectory(m_sFolder); if (m_bIsValid && CServerInstance::getInstance().IsEnable()) CServerInstance::getInstance().RemoveTmpFile(m_sFolder); } m_bIsValid = false; m_sFolder = L""; }