From 13590d4c2e8266538c0002945a37d642450c870b Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Tue, 27 Aug 2024 13:04:20 +0300 Subject: [PATCH] Refactoring work with cache --- DesktopEditor/doctrenderer/config.h | 113 +++++---- DesktopEditor/doctrenderer/docbuilder_p.cpp | 46 +--- DesktopEditor/doctrenderer/docbuilder_p.h | 145 +---------- DesktopEditor/doctrenderer/doctrenderer.cpp | 235 +++++------------- DesktopEditor/doctrenderer/doctrenderer.pro | 1 + DesktopEditor/doctrenderer/editors.h | 182 ++++++++++++++ DesktopEditor/doctrenderer/embed/Default.h | 2 +- .../doctrenderer/embed/DrawingFileEmbed.cpp | 12 +- X2tConverter/src/cextracttools.cpp | 6 - X2tConverter/src/cextracttools.h | 8 - 10 files changed, 340 insertions(+), 410 deletions(-) create mode 100644 DesktopEditor/doctrenderer/editors.h diff --git a/DesktopEditor/doctrenderer/config.h b/DesktopEditor/doctrenderer/config.h index 6a7359d93b..fb96b1d403 100644 --- a/DesktopEditor/doctrenderer/config.h +++ b/DesktopEditor/doctrenderer/config.h @@ -40,24 +40,53 @@ namespace NSDoctRenderer { + class CAdditionalData + { + public: + CAdditionalData() {} + virtual ~CAdditionalData() {} + virtual std::string getParam(const std::wstring& name) { return ""; } + }; + + class CDocBuilderParams + { + public: + CDocBuilderParams() : + m_bCheckFonts(false), + m_sWorkDir(L""), + m_bSaveWithDoctrendererMode(false), + m_sArgumentJSON(""), + m_bIsSystemFonts(true) + { + } + + public: + bool m_bCheckFonts; + std::wstring m_sWorkDir; + bool m_bSaveWithDoctrendererMode; + std::string m_sArgumentJSON; + + bool m_bIsSystemFonts; + std::vector m_arFontDirs; + }; + class CDoctRendererConfig { public: - std::vector m_arrFiles; + std::wstring m_strSdkPath; - std::vector m_arDoctSDK; - std::vector m_arPpttSDK; - std::vector m_arXlstSDK; - std::vector m_arVsdtSDK; + std::vector m_arrFiles; std::wstring m_strAllFonts; bool m_bIsNotUseConfigAllFontsDir; + bool m_bIsUseCache; + std::wstring m_sConsoleLogFile; std::wstring m_sErrorsLogFile; public: - CDoctRendererConfig() : m_bIsNotUseConfigAllFontsDir(false) + CDoctRendererConfig() : m_bIsNotUseConfigAllFontsDir(false), m_bIsUseCache(true) { } @@ -92,10 +121,6 @@ namespace NSDoctRenderer void Parse(const std::wstring& sWorkDir) { m_arrFiles.clear(); - m_arDoctSDK.clear(); - m_arPpttSDK.clear(); - m_arXlstSDK.clear(); - m_arVsdtSDK.clear(); std::wstring sConfigDir = sWorkDir + L"/"; std::wstring sConfigPath = sConfigDir + L"DoctRenderer.config"; @@ -149,40 +174,16 @@ namespace NSDoctRenderer } } } - m_arrFiles.push_back(bIsAbsoluteFontsPath ? m_strAllFonts : private_GetFile(sConfigDir, m_strAllFonts)); + + if (!bIsAbsoluteFontsPath) + m_strAllFonts = private_GetFile(sConfigDir, m_strAllFonts); } - std::wstring sSdkPath = oNode.ReadNodeText(L"sdkjs"); - if (!sSdkPath.empty()) + m_strSdkPath = oNode.ReadNodeText(L"sdkjs"); + if (!m_strSdkPath.empty()) { - if (!NSDirectory::Exists(sSdkPath)) - sSdkPath = sConfigDir + sSdkPath; - - std::wstring sFontsPath = sSdkPath + L"/common/libfont/engine"; - if (!sFontsPath.empty()) - { -#ifdef SUPPORT_HARFBUZZ_SHAPER - sFontsPath += L"/fonts_native.js"; -#else - sFontsPath += L"/fonts_ie.js"; -#endif - } - - m_arDoctSDK.push_back(sSdkPath + L"/word/sdk-all-min.js"); - m_arDoctSDK.push_back(sFontsPath); - m_arDoctSDK.push_back(sSdkPath + L"/word/sdk-all.js"); - - m_arPpttSDK.push_back(sSdkPath + L"/slide/sdk-all-min.js"); - m_arPpttSDK.push_back(sFontsPath); - m_arPpttSDK.push_back(sSdkPath + L"/slide/sdk-all.js"); - - m_arXlstSDK.push_back(sSdkPath + L"/cell/sdk-all-min.js"); - m_arXlstSDK.push_back(sFontsPath); - m_arXlstSDK.push_back(sSdkPath + L"/cell/sdk-all.js"); - - m_arVsdtSDK.push_back(sSdkPath + L"/draw/sdk-all-min.js"); - m_arVsdtSDK.push_back(sFontsPath); - m_arVsdtSDK.push_back(sSdkPath + L"/draw/sdk-all.js"); + if (!NSDirectory::Exists(m_strSdkPath)) + m_strSdkPath = sConfigDir + m_strSdkPath; } m_sConsoleLogFile = oNode.ReadNodeText(L"LogFileConsoleLog"); @@ -193,7 +194,35 @@ namespace NSDoctRenderer if (!m_sErrorsLogFile.empty()) m_sErrorsLogFile = private_GetFile(sConfigDir, m_sErrorsLogFile); } + + char* GetVersion() + { + std::wstring sFile = m_strSdkPath + L"/word/sdk-all-min.js"; + + std::string sData; + if (!NSFile::CFileBinary::ReadAllTextUtf8A(sFile, sData)) + return NULL; + + std::string::size_type startPos = sData.find("Version:"); + if (std::string::npos == startPos) + return NULL; + + startPos += 8; + + std::string::size_type endPos = sData.find(')', startPos); + if (std::string::npos == endPos) + return NULL; + + size_t sSrcLen = endPos - startPos + 1; + if (sSrcLen == 0) + return NULL; + + char* sRet = new char[sSrcLen + 1]; + memcpy(sRet, sData.c_str() + startPos, sSrcLen); + sRet[sSrcLen] = '\0'; + return sRet; + } }; -} // namespace NSDoctRenderer +} #endif // DOC_BUILDER_CONFIG diff --git a/DesktopEditor/doctrenderer/docbuilder_p.cpp b/DesktopEditor/doctrenderer/docbuilder_p.cpp index 22702f8229..8ceb2c5216 100644 --- a/DesktopEditor/doctrenderer/docbuilder_p.cpp +++ b/DesktopEditor/doctrenderer/docbuilder_p.cpp @@ -239,7 +239,7 @@ bool CV8RealTimeWorker::InitVariables() return true; } -bool CV8RealTimeWorker::OpenFile(const std::wstring& sBasePath, const std::wstring& path, const std::string& sString, const std::wstring& sCachePath, CV8Params* pParams) +bool CV8RealTimeWorker::OpenFile(const std::wstring& sBasePath, const std::wstring& path, const NSDoctRenderer::DoctRendererEditorType& editorType, NSDoctRenderer::CDoctRendererConfig* config, CV8Params* pParams) { LOGGER_SPEED_START(); @@ -248,7 +248,7 @@ bool CV8RealTimeWorker::OpenFile(const std::wstring& sBasePath, const std::wstri LOGGER_SPEED_LAP("compile"); - m_context->runScript(sString, try_catch, sCachePath); + NSDoctRenderer::RunEditor(editorType, m_context, try_catch, config); if(try_catch->Check()) return false; @@ -1249,45 +1249,7 @@ namespace NSDoctRenderer char* CDocBuilder::GetVersion() { m_pInternal->Init(); - - if (0 == m_pInternal->m_arDoctSDK.size()) - return NULL; - - std::wstring sFile; - for (std::vector::iterator i = m_pInternal->m_arDoctSDK.begin(); i != m_pInternal->m_arDoctSDK.end(); i++) - { - if (std::wstring::npos != i->find(L"sdk-all-min.js")) - { - sFile = *i; - break; - } - } - - if (sFile.empty()) - return NULL; - - std::string sData; - if (!NSFile::CFileBinary::ReadAllTextUtf8A(sFile, sData)) - return NULL; - - std::string::size_type startPos = sData.find("Version:"); - if (std::string::npos == startPos) - return NULL; - - startPos += 8; - - std::string::size_type endPos = sData.find(')', startPos); - if (std::string::npos == endPos) - return NULL; - - size_t sSrcLen = endPos - startPos + 1; - if (sSrcLen == 0) - return NULL; - - char* sRet = new char[sSrcLen + 1]; - memcpy(sRet, sData.c_str() + startPos, sSrcLen); - sRet[sSrcLen] = '\0'; - return sRet; + return m_pInternal->GetVersion(); } bool CDocBuilder::Run(const wchar_t* path) @@ -1521,7 +1483,7 @@ namespace NSDoctRenderer else if (sParam == "--work-directory") m_pInternal->m_oParams.m_sWorkDir = std::wstring(value); else if (sParam == "--cache-scripts") - m_pInternal->m_bIsCacheScript = (std::wstring(value) == L"true"); + m_pInternal->m_bIsUseCache = (std::wstring(value) == L"true"); else if (sParam == "--save-use-only-names") { m_pInternal->m_bIsServerSafeVersion = true; diff --git a/DesktopEditor/doctrenderer/docbuilder_p.h b/DesktopEditor/doctrenderer/docbuilder_p.h index c0b3a5190a..958692dfb2 100644 --- a/DesktopEditor/doctrenderer/docbuilder_p.h +++ b/DesktopEditor/doctrenderer/docbuilder_p.h @@ -32,7 +32,7 @@ #ifndef DOC_BUILDER_PRIVATE #define DOC_BUILDER_PRIVATE -#include "./config.h" +#include "./editors.h" #include "docbuilder.h" #include "doctrenderer.h" @@ -427,36 +427,13 @@ public: std::string GetGlobalVariable(); std::wstring GetJSVariable(std::wstring sParam); - bool OpenFile(const std::wstring& sBasePath, const std::wstring& path, const std::string& sString, const std::wstring& sCachePath, CV8Params* pParams = NULL); + bool OpenFile(const std::wstring& sBasePath, const std::wstring& path, const NSDoctRenderer::DoctRendererEditorType& editorType, NSDoctRenderer::CDoctRendererConfig* config, CV8Params* pParams = NULL); bool SaveFileWithChanges(int type, const std::wstring& _path, const std::wstring& sJsonParams = L""); bool InitVariables(); }; namespace NSDoctRenderer { - class CAdditionalData - { - public: - CAdditionalData() {} - virtual ~CAdditionalData() {} - virtual std::string getParam(const std::wstring& name) { return ""; } - }; - - class CDocBuilderParams - { - public: - CDocBuilderParams() : m_bCheckFonts(false), m_sWorkDir(L""), m_bSaveWithDoctrendererMode(false), m_sArgumentJSON(""), m_bIsSystemFonts(true) {} - - public: - bool m_bCheckFonts; - std::wstring m_sWorkDir; - bool m_bSaveWithDoctrendererMode; - std::string m_sArgumentJSON; - - bool m_bIsSystemFonts; - std::vector m_arFontDirs; - }; - class CDocBuilder_Private : public CDoctRendererConfig { public: @@ -477,8 +454,6 @@ namespace NSDoctRenderer CDocBuilderParams m_oParams; bool m_bIsInit; - bool m_bIsCacheScript; - bool m_bIsServerSafeVersion; std::wstring m_sFolderForSaveOnlyUseNames; @@ -490,7 +465,7 @@ namespace NSDoctRenderer static std::wstring m_sExternalDirectory; public: CDocBuilder_Private() : CDoctRendererConfig(), m_sTmpFolder(NSFile::CFileBinary::GetTempPath()), m_nFileType(-1), - m_pWorker(NULL), m_pAdditionalData(NULL), m_bIsInit(false), m_bIsCacheScript(true), m_bIsServerSafeVersion(false), + m_pWorker(NULL), m_pAdditionalData(NULL), m_bIsInit(false), m_bIsServerSafeVersion(false), m_sGlobalVariable(""), m_bIsGlobalVariableUse(false), m_pParent(NULL), m_bJavascriptBeforeEditor(false) { } @@ -1273,15 +1248,12 @@ namespace NSDoctRenderer } m_bJavascriptBeforeEditor = false; - std::wstring sCachePath = L""; - if (m_bIsCacheScript) - sCachePath = GetScriptCache(); CV8Params oParams; oParams.IsServerSaveVersion = m_bIsServerSafeVersion; oParams.DocumentDirectory = m_sFileDir; - return m_pWorker->OpenFile(m_sX2tPath, m_sFileDir, GetScript(), sCachePath, &oParams); + return m_pWorker->OpenFile(m_sX2tPath, m_sFileDir, GetEditorType(), this, &oParams); } int SaveFile(const std::wstring& ext, const std::wstring& path, const wchar_t* params = NULL) @@ -1316,119 +1288,22 @@ namespace NSDoctRenderer return ctx; } - std::string GetScript() + NSDoctRenderer::DoctRendererEditorType GetEditorType() { - std::vector* arSdkFiles = NULL; - switch (m_nFileType) { case 0: - { - arSdkFiles = &m_arDoctSDK; - break; - } + return NSDoctRenderer::DoctRendererEditorType::WORD; case 1: - { - arSdkFiles = &m_arPpttSDK; - break; - } + return NSDoctRenderer::DoctRendererEditorType::SLIDE; case 2: - { - arSdkFiles = &m_arXlstSDK; - break; - } + return NSDoctRenderer::DoctRendererEditorType::CELL; case 7: - { - arSdkFiles = &m_arVsdtSDK; - break; - } + return NSDoctRenderer::DoctRendererEditorType::VISIO; default: - return ""; - } - - std::string strScript = ""; - for (size_t i = 0; i < m_arrFiles.size(); ++i) - { - strScript += ReadScriptFile(m_arrFiles[i]); - strScript += "\n\n"; - } - - if (NULL != arSdkFiles) - { - for (const std::wstring& i : *arSdkFiles) - { - strScript += ReadScriptFile(i); - strScript += "\n\n"; - } - } - - if (m_nFileType == 2) - strScript += "\n$.ready();"; - - return strScript; - } - - std::wstring GetScriptCache() - { - std::vector* arSdkFiles = NULL; - switch (m_nFileType) - { - case 0: - { - arSdkFiles = &m_arDoctSDK; break; } - case 1: - { - arSdkFiles = &m_arPpttSDK; - break; - } - case 2: - { - arSdkFiles = &m_arXlstSDK; - break; - } - case 7: - { - arSdkFiles = &m_arVsdtSDK; - break; - } - default: - return L""; - } - - if (0 < arSdkFiles->size()) - { - return NSFile::GetDirectoryName(*arSdkFiles->begin()) + L"/sdk-all.cache"; - } - return L""; - } - - std::string ReadScriptFile(const std::wstring& strFile) - { - NSFile::CFileBinary oFile; - - if (!oFile.OpenFile(strFile)) - return ""; - - int nSize = (int)oFile.GetFileSize(); - if (nSize < 3) - return ""; - - BYTE* pData = new BYTE[nSize]; - DWORD dwReadSize = 0; - oFile.ReadFile(pData, (DWORD)nSize, dwReadSize); - - int nOffset = 0; - if (pData[0] == 0xEF && pData[1] == 0xBB && pData[2] == 0xBF) - { - nOffset = 3; - } - - std::string sReturn((char*)(pData + nOffset), nSize - nOffset); - - RELEASEARRAYOBJECTS(pData); - return sReturn; + return NSDoctRenderer::DoctRendererEditorType::INVALID; } void WriteData(const wchar_t* path, const wchar_t* value, const bool& append) diff --git a/DesktopEditor/doctrenderer/doctrenderer.cpp b/DesktopEditor/doctrenderer/doctrenderer.cpp index 7fca40bcb7..fb7fd7f053 100644 --- a/DesktopEditor/doctrenderer/doctrenderer.cpp +++ b/DesktopEditor/doctrenderer/doctrenderer.cpp @@ -40,7 +40,7 @@ #include "embed/NativeControlEmbed.h" #include "embed/GraphicsEmbed.h" -#include "./config.h" +#include "./editors.h" #include namespace NSDoctRenderer @@ -99,9 +99,8 @@ namespace NSDoctRenderer std::wstring m_sJsonParams; int m_nLcid; - std::wstring m_sScriptsCacheDirectory; - std::vector m_arThemesThumbnailsParams; + public: CExecuteParams() : m_arChanges() { @@ -123,7 +122,6 @@ namespace NSDoctRenderer m_nMailMergeIndexEnd = -1; m_nLcid = -1; - m_sScriptsCacheDirectory = L""; } ~CExecuteParams() { @@ -152,13 +150,13 @@ namespace NSDoctRenderer { m_nCountChangesItems = oNodeChanges.ReadAttributeInt(L"TopItem", -1); - std::vector oNodes; + std::vector oNodes; oNodeChanges.GetNodes(L"Change", oNodes); - size_t nCount = oNodes.size(); - for (size_t i = 0; i < nCount; ++i) + size_t nCount = oNodes.size(); + for (size_t i = 0; i < nCount; ++i) { - XmlUtils::CXmlNode & _node = oNodes[i]; + XmlUtils::CXmlNode& _node = oNodes[i]; m_arChanges.push_back(_node.GetText()); } } @@ -175,8 +173,6 @@ namespace NSDoctRenderer m_nLcid = oNode.ReadValueInt(L"Lcid", -1); m_sJsonParams = oNode.ReadValueString(L"JsonParams"); - m_sScriptsCacheDirectory = oNode.ReadValueString(L"ScriptsCacheDirectory", L""); - m_arThemesThumbnailsParams.clear(); std::wstring sThemesThumbnailsParams = oNode.ReadValueString(L"ThemesThumbnailsParams"); if (!sThemesThumbnailsParams.empty()) @@ -190,21 +186,21 @@ namespace NSDoctRenderer return true; } }; -} +} // namespace NSDoctRenderer namespace NSDoctRenderer { std::wstring string_replaceAll(std::wstring str, const std::wstring& from, const std::wstring& to) { size_t start_pos = 0; - while((start_pos = str.find(from, start_pos)) != std::wstring::npos) + while ((start_pos = str.find(from, start_pos)) != std::wstring::npos) { str.replace(start_pos, from.length(), to); start_pos += to.length(); } return str; } -} +} // namespace NSDoctRenderer namespace NSDoctRenderer { @@ -243,7 +239,6 @@ namespace NSDoctRenderer } ~CDoctRenderer_Private() { - } void LoadConfig(const std::wstring& sConfigDir, const std::wstring& sAllFontsPath = L"") { @@ -256,7 +251,6 @@ namespace NSDoctRenderer } public: - static void _LOGGING_ERROR_(const std::wstring& strType, const std::wstring& strError) { #if 0 @@ -280,16 +274,12 @@ namespace NSDoctRenderer std::cerr << sT << ": " << sE << std::endl; } - static bool Doct_renderer_SaveFile(CExecuteParams* pParams, - NSNativeControl::CNativeControl* pNative, - JSSmart context, - JSSmart* args, - std::wstring& strError, - JSSmart& api_js_maybe_null, - bool bIsPdfBase64 = false) + static bool Doct_renderer_SaveFile( + CExecuteParams* pParams, NSNativeControl::CNativeControl* pNative, JSSmart context, JSSmart* args, std::wstring& strError, JSSmart& api_js_maybe_null, + bool bIsPdfBase64 = false) { JSSmart try_catch = context->GetExceptions(); - JSSmart global_js = context->GetGlobal(); + JSSmart global_js = context->GetGlobal(); JSSmart js_objectApi = api_js_maybe_null; if (!js_objectApi.IsInit() || js_objectApi->isUndefined()) @@ -313,7 +303,7 @@ namespace NSDoctRenderer case DoctRendererFormat::XLST: { JSSmart js_result2 = js_objectApi->call_func("asc_nativeGetFileData", 1, args); - if(try_catch->Check()) + if (try_catch->Check()) { strError = L"code=\"save\""; bIsBreak = true; @@ -362,14 +352,14 @@ namespace NSDoctRenderer } JSSmart js_result1 = js_objectApi->call_func("asc_nativeCalculateFile", 1, args); - if(try_catch->Check()) + if (try_catch->Check()) { strError = L"code=\"calculate\""; bIsBreak = true; } JSSmart js_result2 = js_objectApi->call_func("asc_nativeGetHtml", 1, args); - if(try_catch->Check()) + if (try_catch->Check()) { strError = L"code=\"save\""; bIsBreak = true; @@ -401,7 +391,7 @@ namespace NSDoctRenderer } JSSmart js_result2 = js_objectApi->call_func("asc_nativeCalculateFile", 1, args); - if(try_catch->Check()) + if (try_catch->Check()) { strError = L"code=\"calculate\""; bIsBreak = true; @@ -412,7 +402,7 @@ namespace NSDoctRenderer if (!bIsBreak) { JSSmart js_result1 = js_objectApi->call_func("asc_nativePrintPagesCount", 1, args); - if(try_catch->Check()) + if (try_catch->Check()) { strError = L"code=\"calculate\""; bIsBreak = true; @@ -422,8 +412,7 @@ namespace NSDoctRenderer } // RENDER - if (!bIsBreak && - (DoctRendererFormat::PDF == pParams->m_eDstFormat || DoctRendererFormat::IMAGE == pParams->m_eDstFormat)) + if (!bIsBreak && (DoctRendererFormat::PDF == pParams->m_eDstFormat || DoctRendererFormat::IMAGE == pParams->m_eDstFormat)) { if (pParams->m_sJsonParams.empty()) { @@ -447,7 +436,7 @@ namespace NSDoctRenderer } JSSmart js_result2 = js_objectApi->call_func("asc_nativeGetPDF", 1, args); - if(try_catch->Check()) + if (try_catch->Check()) { strError = L"code=\"save\""; bIsBreak = true; @@ -500,7 +489,7 @@ namespace NSDoctRenderer js_result2 = js_objectApi->call_func("asc_nativeGetThemeThumbnail", 1, args); } - if(try_catch->Check()) + if (try_catch->Check()) { strError = L"code=\"save\""; bIsBreak = true; @@ -582,10 +571,8 @@ namespace NSDoctRenderer return bIsBreak; } - bool ExecuteScript(const std::string& strScript, const std::wstring& sCachePath, std::wstring& strError, std::wstring& strReturnParams) + bool ExecuteScript(NSDoctRenderer::DoctRendererEditorType& editorType, std::wstring& strError, std::wstring& strReturnParams) { - if (strScript.empty() && sCachePath.empty()) return true; - LOGGER_SPEED_START(); bool bIsBreak = false; @@ -598,7 +585,7 @@ namespace NSDoctRenderer CJSContext::Embed(); NSJSBase::CreateDefaults(); - JSSmart try_catch = context->GetExceptions(); + JSSmart try_catch = context->GetExceptions(); JSSmart global_js = context->GetGlobal(); global_js->set("window", global_js); @@ -611,8 +598,8 @@ namespace NSDoctRenderer LOGGER_SPEED_LAP("compile"); - JSSmart res = context->runScript(strScript, try_catch, sCachePath); - if(try_catch->Check()) + NSDoctRenderer::RunEditor(editorType, context, try_catch, this); + if (try_catch->Check()) { strError = L"code=\"run\""; bIsBreak = true; @@ -748,8 +735,7 @@ namespace NSDoctRenderer // images in changes if (NULL != pNative) { - for (std::map::const_iterator iter = pNative->m_mapImagesInChanges.begin(); - iter != pNative->m_mapImagesInChanges.end(); iter++) + for (std::map::const_iterator iter = pNative->m_mapImagesInChanges.begin(); iter != pNative->m_mapImagesInChanges.end(); iter++) { m_arImagesInChanges.push_back(iter->first); } @@ -760,9 +746,7 @@ namespace NSDoctRenderer LOGGER_SPEED_LAP("changes"); bool bIsMailMerge = false; - if (!m_oParams.m_strMailMergeDatabasePath.empty() && - m_oParams.m_nMailMergeIndexEnd >= m_oParams.m_nMailMergeIndexStart && - m_oParams.m_nMailMergeIndexEnd >= 0) + if (!m_oParams.m_strMailMergeDatabasePath.empty() && m_oParams.m_nMailMergeIndexEnd >= m_oParams.m_nMailMergeIndexStart && m_oParams.m_nMailMergeIndexEnd >= 0) { bIsMailMerge = true; } @@ -819,11 +803,10 @@ namespace NSDoctRenderer if (!bIsBreak) { - std::string sFieldUtf8 = NSFile::CUtf8Converter::GetUtf8StringFromUnicode2(m_oParams.m_strMailMergeField.c_str(), - (LONG)m_oParams.m_strMailMergeField.length()); + std::string sFieldUtf8 = NSFile::CUtf8Converter::GetUtf8StringFromUnicode2(m_oParams.m_strMailMergeField.c_str(), (LONG)m_oParams.m_strMailMergeField.length()); strReturnParams += L""; - for (int nIndexMM = m_oParams.m_nMailMergeIndexStart; nIndexMM <= m_oParams.m_nMailMergeIndexEnd && !bIsBreak; ++nIndexMM) + for (int nIndexMM = m_oParams.m_nMailMergeIndexStart; nIndexMM <= m_oParams.m_nMailMergeIndexEnd && !bIsBreak; ++nIndexMM) { JSSmart args_changes[1]; args_changes[0] = CJSContext::createInt(nIndexMM); @@ -935,7 +918,7 @@ namespace NSDoctRenderer m_pInternal->m_oParams.FromXml(strXml); m_pInternal->m_arImagesInChanges.clear(); - std::vector* arSdkFiles = NULL; + NSDoctRenderer::DoctRendererEditorType editorType = NSDoctRenderer::DoctRendererEditorType::INVALID; switch (m_pInternal->m_oParams.m_eSrcFormat) { case DoctRendererFormat::DOCT: @@ -948,7 +931,7 @@ namespace NSDoctRenderer case DoctRendererFormat::HTML: case DoctRendererFormat::WATERMARK: { - arSdkFiles = &m_pInternal->m_arDoctSDK; + editorType = NSDoctRenderer::DoctRendererEditorType::WORD; m_pInternal->m_strEditorType = L"document"; break; } @@ -966,7 +949,7 @@ namespace NSDoctRenderer case DoctRendererFormat::IMAGE: case DoctRendererFormat::PPTX_THEME_THUMBNAIL: { - arSdkFiles = &m_pInternal->m_arPpttSDK; + editorType = NSDoctRenderer::DoctRendererEditorType::SLIDE; m_pInternal->m_strEditorType = L"presentation"; break; } @@ -983,7 +966,7 @@ namespace NSDoctRenderer case DoctRendererFormat::PDF: case DoctRendererFormat::IMAGE: { - arSdkFiles = &m_pInternal->m_arXlstSDK; + editorType = NSDoctRenderer::DoctRendererEditorType::CELL; m_pInternal->m_strEditorType = L"spreadsheet"; break; } @@ -1000,7 +983,7 @@ namespace NSDoctRenderer case DoctRendererFormat::PDF: case DoctRendererFormat::IMAGE: { - arSdkFiles = &m_pInternal->m_arVsdtSDK; + editorType = NSDoctRenderer::DoctRendererEditorType::VISIO; m_pInternal->m_strEditorType = L"draw"; break; } @@ -1009,6 +992,21 @@ namespace NSDoctRenderer } break; } + case DoctRendererFormat::PDF: + { + switch (m_pInternal->m_oParams.m_eDstFormat) + { + case DoctRendererFormat::PDF: + { + editorType = NSDoctRenderer::DoctRendererEditorType::PDF; + m_pInternal->m_strEditorType = L"pdf"; + break; + } + default: + return false; + } + break; + } default: return false; @@ -1026,50 +1024,8 @@ namespace NSDoctRenderer m_pInternal->m_strFilePath = strFileName; - std::string strScript = ""; - for (size_t i = 0; i < m_pInternal->m_arrFiles.size(); ++i) - { - strScript += m_pInternal->ReadScriptFile(m_pInternal->m_arrFiles[i]); - strScript += "\n\n"; - } - - std::wstring sCachePath = L""; - if (arSdkFiles && (0 < arSdkFiles->size())) - { - if (m_pInternal->m_oParams.m_sScriptsCacheDirectory.empty()) - { - sCachePath = NSFile::GetDirectoryName(*arSdkFiles->begin()) + L"/sdk-all.cache"; - } - else if (m_pInternal->m_oParams.m_sScriptsCacheDirectory != L"empty") - { - sCachePath = m_pInternal->m_oParams.m_sScriptsCacheDirectory; - wchar_t lastSymbol = sCachePath.back(); - if (lastSymbol != '\\' && lastSymbol != '/') - sCachePath += L"/"; - - wchar_t editorFirst = m_pInternal->m_strEditorType.at(0); - if (editorFirst == 'd' && L"document" == m_pInternal->m_strEditorType) - sCachePath += L"word"; - else if (editorFirst == 'p') - sCachePath += L"slide"; - else if (editorFirst == 'd') - sCachePath += L"draw"; - else - sCachePath += L"cell"; - } - - for (std::vector::iterator i = arSdkFiles->begin(); i != arSdkFiles->end(); i++) - { - strScript += m_pInternal->ReadScriptFile(*i); - strScript += "\n\n"; - } - } - - if (m_pInternal->m_strEditorType == L"spreadsheet") - strScript += "\n$.ready();"; - std::wstring sReturnParams = L""; - bool bResult = m_pInternal->ExecuteScript(strScript, sCachePath, strError, sReturnParams); + bool bResult = m_pInternal->ExecuteScript(editorType, strError, sReturnParams); if (strError.length() != 0) { @@ -1093,76 +1049,15 @@ namespace NSDoctRenderer #ifndef JS_ENGINE_JAVASCRIPTCORE LoadConfig(NSFile::GetProcessDirectory(), sAllFontsPath); - std::wstring sCacheDirectory = sCacheDir; - if (sCacheDirectory.empty() && m_pInternal->m_arDoctSDK.size() > 0) + std::vector editors; + editors.push_back(NSDoctRenderer::DoctRendererEditorType::WORD); + editors.push_back(NSDoctRenderer::DoctRendererEditorType::SLIDE); + editors.push_back(NSDoctRenderer::DoctRendererEditorType::CELL); + editors.push_back(NSDoctRenderer::DoctRendererEditorType::VISIO); + editors.push_back(NSDoctRenderer::DoctRendererEditorType::PDF); + + for (std::vector::const_iterator i = editors.begin(); i != editors.end(); i++) { - sCacheDirectory = NSFile::GetDirectoryName(m_pInternal->m_arDoctSDK[0]); - sCacheDirectory = NSFile::GetDirectoryName(sCacheDirectory); - } - - if (sCacheDirectory.empty()) - return; - - std::string strScriptAll = ""; - for (size_t i = 0; i < m_pInternal->m_arrFiles.size(); ++i) - { - strScriptAll += m_pInternal->ReadScriptFile(m_pInternal->m_arrFiles[i]); - strScriptAll += "\n\n"; - } - - for (int i = 0; i < 4; ++i) - { - std::string strScript = strScriptAll; - std::wstring sCachePath = sCacheDirectory; - - std::vector* arSdkFiles = NULL; - - switch (i) - { - case 0: - { - arSdkFiles = &m_pInternal->m_arDoctSDK; - sCachePath += L"/word/sdk-all.cache"; - break; - } - case 1: - { - arSdkFiles = &m_pInternal->m_arPpttSDK; - sCachePath += L"/slide/sdk-all.cache"; - break; - } - case 2: - { - arSdkFiles = &m_pInternal->m_arXlstSDK; - sCachePath += L"/cell/sdk-all.cache"; - break; - } - case 3: - { - arSdkFiles = &m_pInternal->m_arVsdtSDK; - sCachePath += L"/draw/sdk-all.cache"; - if (0 < arSdkFiles->size() && !NSFile::CFileBinary::Exists(*arSdkFiles->begin())) - { - continue; - } - break; - } - default: - break; - } - - if (NSFile::CFileBinary::Exists(sCachePath)) - NSFile::CFileBinary::Remove(sCachePath); - - for (std::vector::iterator i = arSdkFiles->begin(); i != arSdkFiles->end(); i++) - { - strScript += m_pInternal->ReadScriptFile(*i); - strScript += "\n\n"; - } - - if (2 == i) - strScript += "\n$.ready();"; - JSSmart context = new CJSContext(); if (true) @@ -1178,20 +1073,17 @@ namespace NSDoctRenderer JSSmart try_catch = context->GetExceptions(); - context->runScript(strScript, try_catch, sCachePath); + NSDoctRenderer::RunEditor(*i, context, try_catch, m_pInternal); } context->Dispose(); } #endif } -} +} // namespace NSDoctRenderer -bool Doct_renderer_SaveFile_ForBuilder(int nFormat, const std::wstring& strDstFile, - NSNativeControl::CNativeControl* pNative, - JSSmart context, - JSSmart* args, - std::wstring& strError, const std::wstring& jsonParams) +bool Doct_renderer_SaveFile_ForBuilder( + int nFormat, const std::wstring& strDstFile, NSNativeControl::CNativeControl* pNative, JSSmart context, JSSmart* args, std::wstring& strError, const std::wstring& jsonParams) { NSDoctRenderer::CExecuteParams oParams; oParams.m_eDstFormat = (NSDoctRenderer::DoctRendererFormat::FormatFile)nFormat; @@ -1199,6 +1091,5 @@ bool Doct_renderer_SaveFile_ForBuilder(int nFormat, const std::wstring& strDstFi oParams.m_sJsonParams = jsonParams; JSSmart js_objectApi; // empty - return NSDoctRenderer::CDoctRenderer_Private::Doct_renderer_SaveFile(&oParams, - pNative, context, args, strError, js_objectApi, false); + return NSDoctRenderer::CDoctRenderer_Private::Doct_renderer_SaveFile(&oParams, pNative, context, args, strError, js_objectApi, false); } diff --git a/DesktopEditor/doctrenderer/doctrenderer.pro b/DesktopEditor/doctrenderer/doctrenderer.pro index 480bae7f9f..387f0a787e 100644 --- a/DesktopEditor/doctrenderer/doctrenderer.pro +++ b/DesktopEditor/doctrenderer/doctrenderer.pro @@ -27,6 +27,7 @@ core_android:DEFINES += DISABLE_MEMORY_LIMITATION HEADERS += \ config.h \ + editors.h \ doctrenderer.h \ docbuilder.h diff --git a/DesktopEditor/doctrenderer/editors.h b/DesktopEditor/doctrenderer/editors.h new file mode 100644 index 0000000000..49a35ce6e8 --- /dev/null +++ b/DesktopEditor/doctrenderer/editors.h @@ -0,0 +1,182 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * 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 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * 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 + * + */ +#ifndef DOC_BUILDER_EDITORS_CONFIG +#define DOC_BUILDER_EDITORS_CONFIG + +#include "./config.h" +#include "../js_internal/js_base.h" +#include "../common/StringBuilder.h" + +#ifdef CreateFile +#undef CreateFile +#endif + +namespace NSDoctRenderer +{ + enum class DoctRendererEditorType + { + WORD = 0, + CELL = 1, + SLIDE = 2, + VISIO = 3, + PDF = 4, + + INVALID = 255 + }; + + static void AppendScript(NSStringUtils::CStringBuilderA* builder, const std::wstring& path) + { + NSFile::CFileBinary oFile; + + if (!oFile.OpenFile(path)) + return; + + int size = (int)oFile.GetFileSize(); + if (size < 3) + return; + + BYTE* pData = new BYTE[size]; + DWORD dwReadSize = 0; + oFile.ReadFile(pData, (DWORD)size, dwReadSize); + oFile.CloseFile(); + + int nOffset = 0; + if (pData[0] == 0xEF && pData[1] == 0xBB && pData[2] == 0xBF) + nOffset = 3; + + builder->WriteString((char*)(pData + nOffset), size - nOffset); + builder->WriteString("\n\n"); + RELEASEARRAYOBJECTS(pData); + } + + static bool RunScript(JSSmart& context, JSSmart& try_catch, const std::wstring& path) + { + NSFile::CFileBinary oFile; + + if (!oFile.OpenFile(path)) + return ""; + + int size = (int)oFile.GetFileSize(); + if (size < 3) + return ""; + + BYTE* pData = new BYTE[size]; + DWORD dwReadSize = 0; + oFile.ReadFile(pData, (DWORD)size, dwReadSize); + oFile.CloseFile(); + + int nOffset = 0; + if (pData[0] == 0xEF && pData[1] == 0xBB && pData[2] == 0xBF) + nOffset = 3; + + context->runScript(std::string((char*)(pData + nOffset), size - nOffset), try_catch); + RELEASEARRAYOBJECTS(pData); + + return try_catch->Check(); + } + + static std::wstring GetAllScript(NSStringUtils::CStringBuilderA* builder, const DoctRendererEditorType& type, CDoctRendererConfig* config) + { + for (std::vector::const_iterator i = config->m_arrFiles.cbegin(); i != config->m_arrFiles.cend(); i++) + AppendScript(builder, *i); + + std::wstring sFontsPath = config->m_strSdkPath + L"/common/libfont/engine"; +#ifdef SUPPORT_HARFBUZZ_SHAPER + sFontsPath += L"/fonts_native.js"; +#else + sFontsPath += L"/fonts_ie.js"; +#endif + + switch (type) + { + case DoctRendererEditorType::WORD: + { + AppendScript(builder, config->m_strSdkPath + L"/word/sdk-all-min.js"); + AppendScript(builder, sFontsPath); + AppendScript(builder, config->m_strSdkPath + L"/word/sdk-all.js"); + return config->m_strSdkPath + L"/word/sdk-all.cache"; + } + case DoctRendererEditorType::SLIDE: + { + AppendScript(builder, config->m_strSdkPath + L"/slide/sdk-all-min.js"); + AppendScript(builder, sFontsPath); + AppendScript(builder, config->m_strSdkPath + L"/slide/sdk-all.js"); + return config->m_strSdkPath + L"/slide/sdk-all.cache"; + } + case DoctRendererEditorType::CELL: + { + AppendScript(builder, config->m_strSdkPath + L"/cell/sdk-all-min.js"); + AppendScript(builder, sFontsPath); + AppendScript(builder, config->m_strSdkPath + L"/cell/sdk-all.js"); + builder->WriteString("\n$.ready();", 11); + return config->m_strSdkPath + L"/cell/sdk-all.cache"; + } + case DoctRendererEditorType::VISIO: + { + if (!NSFile::CFileBinary::Exists(config->m_strSdkPath + L"/draw/sdk-all-min.js")) + return L""; + AppendScript(builder, config->m_strSdkPath + L"/draw/sdk-all-min.js"); + AppendScript(builder, sFontsPath); + AppendScript(builder, config->m_strSdkPath + L"/draw/sdk-all.js"); + return config->m_strSdkPath + L"/draw/sdk-all.cache"; + } + case DoctRendererEditorType::PDF: + { + AppendScript(builder, config->m_strSdkPath + L"/word/sdk-all-min.js"); + AppendScript(builder, sFontsPath); + AppendScript(builder, config->m_strSdkPath + L"/word/sdk-all.js"); + AppendScript(builder, config->m_strSdkPath + L"/pdf/src/engine/drawingfile_native.js"); + return config->m_strSdkPath + L"/pdf/sdk-all.cache"; + } + default: + break; + } + return L""; + } + + static bool RunEditor(const DoctRendererEditorType& type, JSSmart& context, JSSmart& try_catch, CDoctRendererConfig* config) + { + if (!RunScript(context, try_catch, config->m_strAllFonts)) + return false; + + NSStringUtils::CStringBuilderA builder; + builder.AddSize(10 * 1024 * 1024); + std::wstring sCachePath = GetAllScript(&builder, type, config); + + if (!sCachePath.empty()) + context->runScript(builder.GetData(), try_catch, config->m_bIsUseCache ? sCachePath : L""); + + return try_catch->Check(); + } +} + +#endif // DOC_BUILDER_EDITORS_CONFIG diff --git a/DesktopEditor/doctrenderer/embed/Default.h b/DesktopEditor/doctrenderer/embed/Default.h index 9131ec6a36..2716b5215b 100644 --- a/DesktopEditor/doctrenderer/embed/Default.h +++ b/DesktopEditor/doctrenderer/embed/Default.h @@ -1,7 +1,7 @@ #ifndef _BUILD_NATIVE_DEFAULT_EMBED_H_ #define _BUILD_NATIVE_DEFAULT_EMBED_H_ - #include "../js_internal/js_base.h" +#include "../js_internal/js_base.h" namespace NSJSBase { diff --git a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp index a881e8a670..12263c5eab 100644 --- a/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp +++ b/DesktopEditor/doctrenderer/embed/DrawingFileEmbed.cpp @@ -7,12 +7,12 @@ JSSmart MoveMemoryToJS(BYTE* pWasmData) int nLen = 0; memcpy(&nLen, pWasmData, sizeof(int)); - if (0 >= nLen) + if (4 >= nLen) return CJSContext::createNull(); - size_t nBufferSize = (size_t)nLen; + size_t nBufferSize = (size_t)(nLen - 4); BYTE* pMemory = NSJSBase::NSAllocator::Alloc(nBufferSize); - memcpy(pMemory, pWasmData, nBufferSize); + memcpy(pMemory, pWasmData + 4, nBufferSize); free(pWasmData); return NSJSBase::CJSContext::createUint8Array(pMemory, (int)nBufferSize, false); @@ -111,5 +111,9 @@ JSSmart CDrawingFileEmbed::ScanPage(JSSmart nPageIndex, JSSm JSSmart CDrawingFileEmbed::GetImageBase64(JSSmart rId) { std::string* pData = (std::string*)m_pFile->GetImageBase64(rId->toInt32()); - return pData ? CJSContext::createString(*pData) : CJSContext::createNull(); + if (!pData) + return CJSContext::createNull(); + JSSmart ret = CJSContext::createString(*pData); + *pData = ""; + return ret; } diff --git a/X2tConverter/src/cextracttools.cpp b/X2tConverter/src/cextracttools.cpp index 4a2f9f8ab9..dfd7c90dec 100644 --- a/X2tConverter/src/cextracttools.cpp +++ b/X2tConverter/src/cextracttools.cpp @@ -791,12 +791,6 @@ namespace NExtractTools oBuilder.WriteEncodeXmlString(sJsonParams); oBuilder.WriteString(L""); } - if (NULL != params.m_sScriptsCacheDirectory) - { - oBuilder.WriteString(L""); - oBuilder.WriteEncodeXmlString(*params.m_sScriptsCacheDirectory); - oBuilder.WriteString(L""); - } oBuilder.WriteString(L""); diff --git a/X2tConverter/src/cextracttools.h b/X2tConverter/src/cextracttools.h index 053ddb1b9f..ad14339145 100644 --- a/X2tConverter/src/cextracttools.h +++ b/X2tConverter/src/cextracttools.h @@ -512,7 +512,6 @@ namespace NExtractTools boost::unordered_map> m_mapInputLimits; bool* m_bIsPDFA; std::wstring* m_sConvertToOrigin; - std::wstring* m_sScriptsCacheDirectory; // output params mutable bool m_bOutputConvertCorrupted; mutable bool m_bMacro; @@ -547,7 +546,6 @@ namespace NExtractTools m_bIsNoBase64 = NULL; m_bIsPDFA = NULL; m_sConvertToOrigin = NULL; - m_sScriptsCacheDirectory = NULL; m_bOutputConvertCorrupted = false; m_bMacro = false; @@ -581,7 +579,6 @@ namespace NExtractTools RELEASEOBJECT(m_bIsNoBase64); RELEASEOBJECT(m_bIsPDFA); RELEASEOBJECT(m_sConvertToOrigin); - RELEASEOBJECT(m_sScriptsCacheDirectory); } bool FromXmlFile(const std::wstring& sFilename) @@ -770,11 +767,6 @@ namespace NExtractTools RELEASEOBJECT(m_sConvertToOrigin); m_sConvertToOrigin = new std::wstring(sValue); } - else if (_T("m_sScriptsCacheDirectory") == sName) - { - RELEASEOBJECT(m_sScriptsCacheDirectory); - m_sScriptsCacheDirectory = new std::wstring(sValue); - } } else if (_T("m_nCsvDelimiterChar") == sName) {