diff --git a/ChromiumBasedEditors/lib/include/cefview.h b/ChromiumBasedEditors/lib/include/cefview.h index bb078e0d..820b2b70 100644 --- a/ChromiumBasedEditors/lib/include/cefview.h +++ b/ChromiumBasedEditors/lib/include/cefview.h @@ -138,6 +138,7 @@ public: void OpenLocalFile(const std::wstring& sFilePath, const int& nFileFormat); void CreateLocalFile(const int& nFileFormat, const std::wstring& sName = L""); + bool OpenCopyAsRecoverFile(const int& nIdSrc); bool OpenRecoverFile(const int& nId); bool OpenRecentFile(const int& nId); bool OpenReporter(const std::wstring& sFolder); diff --git a/ChromiumBasedEditors/lib/src/cefview.cpp b/ChromiumBasedEditors/lib/src/cefview.cpp index 58017b6f..513864ab 100644 --- a/ChromiumBasedEditors/lib/src/cefview.cpp +++ b/ChromiumBasedEditors/lib/src/cefview.cpp @@ -789,6 +789,11 @@ public: // создание/аплоад криптованных файлов в облаке CCloudCryptoUpload* m_pUploadFiles; + // путь к файлу для сравнения (только для локальных файлов) + // после открытия нужно прокинуть в редактор и удалить файл (если он временный (по урлу)) + std::wstring m_sComparingFile; + int m_nComparingFileType; // 0 - file, 1 - url + public: CCefView_Private() { @@ -850,6 +855,8 @@ public: m_nCloudVersion = CRYPTO_CLOUD_SUPPORT; m_pUploadFiles = NULL; + + m_nComparingFileType = -1; } void Destroy() @@ -1062,6 +1069,16 @@ public: void LocalFile_Start() { + if (!m_sComparingFile.empty()) + { + if (m_oConverterToEditor.m_oInfo.m_sRecoveryDir.empty()) + m_oLocalInfo.SetupOptions(m_oConverterToEditor.m_oInfo); + + m_oConverterToEditor.Stop(); + m_oConverterToEditor.Start(0); + return; + } + m_oLocalInfo.SetupOptions(m_oConverterToEditor.m_oInfo); // и теперь убираем, если новый @@ -3170,6 +3187,37 @@ _e.sendEvent(\"asc_onError\", -452, 0);\n\ m_pParent->m_pInternal->m_pUploadFiles->OnSend(); return true; } + else if ("on_compare_document" == message_name) + { + std::wstring sType = args->GetString(0).ToWString(); + std::wstring sFile_Url = args->GetString(1).ToWString(); + std::wstring sUrl = L"ascdesktop://compare/" + std::to_wstring(m_pParent->GetId()) + L"/" + sType + L"/" + sFile_Url; + + NSEditorApi::CAscCreateTab* pData = new NSEditorApi::CAscCreateTab(); + pData->put_Url(sUrl); + + CRecentParent oRecentParent; + oRecentParent.Url = sUrl; + oRecentParent.Parent = m_pParent->m_pInternal->GetBrowser()->GetMainFrame()->GetURL().ToWString(); + + m_pParent->GetAppManager()->m_pInternal->m_arRecentParents.push_back(oRecentParent); + + NSEditorApi::CAscCefMenuEvent* pEvent = m_pParent->CreateCefEvent(ASC_MENU_EVENT_TYPE_CEF_CREATETAB); + pEvent->m_pData = pData; + + pListener->OnEvent(pEvent); + return true; + } + else if ("on_document_content_ready" == message_name) + { + if (!m_pParent->m_pInternal->m_sComparingFile.empty()) + { + m_pParent->m_pInternal->m_oConverterToEditor.m_sComparingFile = m_pParent->m_pInternal->m_sComparingFile; + m_pParent->m_pInternal->LocalFile_Start(); + } + + return true; + } CAscApplicationManager_Private* pInternalMan = m_pParent->GetAppManager()->m_pInternal; if (pInternalMan->m_pAdditional && pInternalMan->m_pAdditional->OnProcessMessageReceived(browser, source_process, message, m_pParent)) @@ -4343,6 +4391,56 @@ void CCefView_Private::OnFileConvertToEditor(const int& nError) { if (m_bIsClosing || m_bIsDestroying) return; + + if (!m_oConverterToEditor.m_sComparingFile.empty()) + { + if (89 == nError || 90 == nError || 91 == nError) + { + CefRefPtr browser; + if (m_handler.get()) + browser = m_handler->GetBrowser(); + + if (browser) + { + CefRefPtr message = CefProcessMessage::Create("onlocaldocument_additionalparams"); + message->GetArgumentList()->SetInt(0, nError); + + if (90 == nError || 91 == nError) + { + ICertificate* pCert = ICertificate::CreateInstance(); + std::string sHash = pCert->GetHash(m_oConverterToEditor.m_sComparingFile, OOXML_HASH_ALG_SHA256); + delete pCert; + + message->GetArgumentList()->SetString(1, sHash); + + std::wstring sDocInfo = GetFileDocInfo(m_oConverterToEditor.m_sComparingFile); + if (!sDocInfo.empty()) + message->GetArgumentList()->SetString(2, sDocInfo); + } + + browser->SendProcessMessage(PID_RENDERER, message); + } + return; + } + else + { + CefRefPtr message = CefProcessMessage::Create("oncompare_loadend"); + message->GetArgumentList()->SetInt(0, nError); + message->GetArgumentList()->SetString(1, m_oLocalInfo.m_oInfo.m_sRecoveryDir + L"/compare"); + m_handler->GetBrowser()->SendProcessMessage(PID_RENDERER, message); + + m_oConverterToEditor.m_sComparingFile = L""; + + // если по урлу - то файл временный + if (m_nComparingFileType == 1) + NSFile::CFileBinary::Remove(m_sComparingFile); + + m_sComparingFile = L""; + m_nComparingFileType = -1; + } + return; + } + m_nLocalFileOpenError = nError; LocalFile_IncrementCounter(); } @@ -4538,6 +4636,22 @@ void CCefView::load(const std::wstring& urlInputSrc) m_pInternal->m_sOriginalUrl = urlInput; + // check compare + if (0 == urlInput.find(L"ascdesktop://compare/")) + { + std::wstring::size_type pos1 = urlInput.find('/', 21); + std::wstring::size_type pos2 = urlInput.find('/', pos1 + 1); + + std::wstring strId = urlInput.substr(21, pos1 - 21); + std::wstring strType = urlInput.substr(pos1 + 1, pos2 - pos1 - 1); + std::wstring strFile = urlInput.substr(pos2 + 1); + + m_pInternal->m_sComparingFile = strFile; + m_pInternal->m_nComparingFileType = (strType == L"file") ? 0 : 1; + ((CCefViewEditor*)this)->OpenCopyAsRecoverFile(std::stoi(strId)); + return; + } + // check openaslocal std::wstring::size_type pos1 = urlInput.find(L""); std::wstring::size_type pos2 = urlInput.find(L""); @@ -5831,6 +5945,60 @@ void CCefViewEditor::CreateLocalFile(const int& nFileFormat, const std::wstring& // start convert file this->load(sUrl + sParams); } +bool CCefViewEditor::OpenCopyAsRecoverFile(const int& nIdSrc) +{ + std::wstring sNewRecoveryDir = NSFile::CFileBinary::CreateTempFileWithUniqueName(GetAppManager()->m_oSettings.recover_path, L"DE_"); + if (NSFile::CFileBinary::Exists(sNewRecoveryDir)) + NSFile::CFileBinary::Remove(sNewRecoveryDir); + NSCommon::string_replace(sNewRecoveryDir, L"\\", L"/"); + std::wstring::size_type nPosPoint = sNewRecoveryDir.rfind('.'); + if (nPosPoint != std::wstring::npos && nPosPoint > GetAppManager()->m_oSettings.recover_path.length()) + sNewRecoveryDir = sNewRecoveryDir.substr(0, nPosPoint); + + CCefView* pViewSrc = m_pInternal->m_pManager->GetViewById(nIdSrc); + if (!pViewSrc) + return false; + + NSDirectory::CopyDirectory(pViewSrc->m_pInternal->m_oLocalInfo.m_oInfo.m_sRecoveryDir, sNewRecoveryDir); + + m_pInternal->m_oLocalInfo.m_oInfo.m_bIsSaved = false; + + std::wstring sUrl = GetAppManager()->m_oSettings.local_editors_path; + if (0 == sUrl.find('/')) + sUrl = L"file://" + sUrl; + else + sUrl = L"file:///" + sUrl; + + sUrl += L"?"; + + int nFileType = pViewSrc->m_pInternal->m_oLocalInfo.m_oInfo.m_nCurrentFileFormat; + m_pInternal->m_oLocalInfo.m_oInfo.m_nCurrentFileFormat = nFileType; + + std::wstring sParams = L""; + if (nFileType & AVS_OFFICESTUDIO_FILE_PRESENTATION) + sParams = L"placement=desktop&doctype=presentation"; + else if (nFileType & AVS_OFFICESTUDIO_FILE_SPREADSHEET) + sParams = L"placement=desktop&doctype=spreadsheet"; + else if (nFileType & AVS_OFFICESTUDIO_FILE_CROSSPLATFORM) + sParams = L"placement=desktop&mode=view"; + else + sParams = L"placement=desktop"; + + std::wstring sAdditionalParams = GetAppManager()->m_pInternal->m_sAdditionalUrlParams; + if (!sAdditionalParams.empty()) + sParams += (L"&" + sAdditionalParams); + + m_pInternal->m_oLocalInfo.m_oInfo.m_sFileSrc = NSFile::GetFileName(pViewSrc->m_pInternal->m_oLocalInfo.m_oInfo.m_sFileSrc); + NSCommon::string_replace(m_pInternal->m_oLocalInfo.m_oInfo.m_sFileSrc, L"\\", L"/"); + + m_pInternal->m_oLocalInfo.m_oInfo.m_sRecoveryDir = sNewRecoveryDir; + + m_pInternal->LocalFile_Start(); + + // start convert file + this->load(sUrl + sParams); + return true; +} bool CCefViewEditor::OpenRecoverFile(const int& nId) { if (!GetAppManager()->m_pInternal->GetEditorPermission()) diff --git a/ChromiumBasedEditors/lib/src/cefwrapper/client_renderer_wrapper.cpp b/ChromiumBasedEditors/lib/src/cefwrapper/client_renderer_wrapper.cpp index a31b4041..c9ae4795 100644 --- a/ChromiumBasedEditors/lib/src/cefwrapper/client_renderer_wrapper.cpp +++ b/ChromiumBasedEditors/lib/src/cefwrapper/client_renderer_wrapper.cpp @@ -2631,6 +2631,31 @@ if (window.onSystemMessage2) window.onSystemMessage2(e);\n\ NSFile::CFileBinary::Copy(m_sUserPlugins + L"/advanced_crypto_data.docx", sFile); return true; } + else if (name == "CompareDocumentUrl") + { + CefRefPtr browser = CefV8Context::GetCurrentContext()->GetBrowser(); + CefRefPtr message = CefProcessMessage::Create("on_compare_document"); + message->GetArgumentList()->SetString(0, "url"); + message->GetArgumentList()->SetString(1, arguments[0]->GetStringValue()); + browser->SendProcessMessage(PID_BROWSER, message); + return true; + } + else if (name == "CompareDocumentFile") + { + CefRefPtr browser = CefV8Context::GetCurrentContext()->GetBrowser(); + CefRefPtr message = CefProcessMessage::Create("on_compare_document"); + message->GetArgumentList()->SetString(0, "file"); + message->GetArgumentList()->SetString(1, arguments[0]->GetStringValue()); + browser->SendProcessMessage(PID_BROWSER, message); + return true; + } + else if (name == "onDocumentContentReady") + { + CefRefPtr browser = CefV8Context::GetCurrentContext()->GetBrowser(); + CefRefPtr message = CefProcessMessage::Create("on_document_content_ready"); + browser->SendProcessMessage(PID_BROWSER, message); + return true; + } // Function does not exist. return false; @@ -3004,7 +3029,7 @@ class ClientRenderDelegate : public client::ClientAppRenderer::Delegate { CefRefPtr handler = pWrapper; - #define EXTEND_METHODS_COUNT 127 + #define EXTEND_METHODS_COUNT 130 const char* methods[EXTEND_METHODS_COUNT] = { "Copy", "Paste", @@ -3025,6 +3050,7 @@ class ClientRenderDelegate : public client::ClientAppRenderer::Delegate { "Logout", "onDocumentModifiedChanged", + "onDocumentContentReady", "GetImageBase64", @@ -3176,6 +3202,9 @@ class ClientRenderDelegate : public client::ClientAppRenderer::Delegate { "_ImportAdvancedEncryptedData", "_ExportAdvancedEncryptedData", + "CompareDocumentUrl", + "CompareDocumentFile", + NULL }; @@ -3459,6 +3488,40 @@ window.AscDesktopEditor.InitJSContext();", curFrame->GetURL(), 0); } return true; } + else if (sMessageName == "oncompare_loadend") + { + CefRefPtr _frame = GetEditorFrame(browser); + if (!_frame) + _frame = browser->GetMainFrame(); + + int nError = message->GetArgumentList()->GetInt(0); + std::wstring sFolder = message->GetArgumentList()->GetString(1).ToWString(); + + int nFileDataLen = 0; + std::string sFileData = GetFileData(sFolder + L"/Editor.bin", nFileDataLen); + + // image_map + std::vector files = NSDirectory::GetFiles(sFolder + L"/media"); + std::string sImageMap = "{"; + for (std::vector::iterator i = files.begin(); i != files.end(); i++) + { + std::wstring sFile = *i; NSCommon::string_replace(sFile, L"\\", L"/"); + NSCommon::string_replace(sFile, L"\"", L"'"); + std::wstring sName = L"media/" + NSFile::GetFileName(sFile); + + sImageMap += "\""; + sImageMap += U_TO_UTF8(sName); + sImageMap += "\":\""; + sImageMap += U_TO_UTF8(sFile); + sImageMap += "\","; + } + + sImageMap[sImageMap.length() - 1] = '}'; + + std::string sCode = "window.onDocumentCompare && window.onDocumentCompare(\"" + U_TO_UTF8(sFolder) + "\", \"" + sFileData + "\", " + std::to_string(nFileDataLen) + ", " + sImageMap + ");"; + _frame->ExecuteJavaScript(sCode, _frame->GetURL(), 0); + return true; + } else if (sMessageName == "onlocaldocument_onsaveend") { CefRefPtr _frame = GetEditorFrame(browser); diff --git a/ChromiumBasedEditors/lib/src/fileconverter.h b/ChromiumBasedEditors/lib/src/fileconverter.h index 0c49afc1..6b2c71cd 100644 --- a/ChromiumBasedEditors/lib/src/fileconverter.h +++ b/ChromiumBasedEditors/lib/src/fileconverter.h @@ -475,6 +475,9 @@ public: COOXMLVerifier* m_pVerifier; NSFonts::IApplicationFonts* m_pFonts; + // конвертер запустился для сравнения + std::wstring m_sComparingFile; + public: CASCFileConverterToEditor() : NSThreads::CBaseThread() { @@ -504,6 +507,47 @@ public: virtual DWORD ThreadProc() { + if (!m_sComparingFile.empty()) + { + std::wstring sCompareDir = m_oInfo.m_sRecoveryDir + L"/compare"; + + if (NSDirectory::Exists(sCompareDir)) + NSDirectory::DeleteDirectory(sCompareDir); + NSDirectory::CreateDirectory(sCompareDir); + + std::wstring sInputFile = sCompareDir + L"/" + NSFile::GetFileName(m_sComparingFile); + NSFile::CFileBinary::Copy(m_sComparingFile, sInputFile); + + NSStringUtils::CStringBuilder oBuilder; + oBuilder.WriteString(L""); + oBuilder.WriteEncodeXmlString(sInputFile); + oBuilder.WriteString(L""); + oBuilder.WriteEncodeXmlString(sCompareDir); + oBuilder.WriteString(L"/Editor.bin8192"); + oBuilder.WriteString(L"./themestrue"); + oBuilder.WriteString(L""); + oBuilder.WriteEncodeXmlString(m_pManager->m_oSettings.fonts_cache_info_path); + oBuilder.WriteString(L""); + oBuilder.WriteEncodeXmlString(NSFile::GetProcessDirectory() + L"/"); + oBuilder.WriteString(L""); + if (!m_sAdditionalConvertation.empty()) + oBuilder.WriteString(m_sAdditionalConvertation); + m_sAdditionalConvertation = L""; + oBuilder.WriteString(L""); + + std::wstring sConverterExe = m_pManager->m_oSettings.file_converter_path + L"/x2t"; + std::wstring sParams = sCompareDir + L"/params.xml"; + + NSFile::CFileBinary::SaveToFile(sParams, oBuilder.GetData(), true); + int nReturnCode = NSX2T::Convert(sConverterExe, sParams, m_pManager, m_pManager->m_pInternal->m_bIsEnableConvertLogs); + NSFile::CFileBinary::Remove(sParams); + + m_pEvents->OnFileConvertToEditor(nReturnCode); + + m_bRunThread = FALSE; + return 0; + } + if (NSFile::CFileBinary::Exists(m_oInfo.m_sRecoveryDir + L"/Editor.bin")) { if (true) @@ -544,6 +588,7 @@ public: } std::wstring sLocalFilePath = m_oInfo.m_sFileSrc; + #ifdef WIN32 if (0 == sLocalFilePath.find(L"//")) {