diff --git a/Common/3dParty/v8/v8.pri b/Common/3dParty/v8/v8.pri index a59f0b5693..c44cab0179 100644 --- a/Common/3dParty/v8/v8.pri +++ b/Common/3dParty/v8/v8.pri @@ -1,5 +1,14 @@ -CORE_V8_PATH_INCLUDE = $$PWD/v8 -CORE_V8_PATH_LIBS = $$CORE_V8_PATH_INCLUDE/out.gn/$$CORE_BUILDS_PLATFORM_PREFIX/obj +CONFIG += v8_version_87 + +v8_version_87 { + CORE_V8_PATH_INCLUDE = /Users/nctdevices/Desktop/GIT_DEVELOP_MAC/v8/v8 + CORE_V8_PATH_LIBS = $$CORE_V8_PATH_INCLUDE/out.gn/$$CORE_BUILDS_PLATFORM_PREFIX/obj + CONFIG += c++14 + DEFINES += V8_VERSION_87_PLUS +} else { + CORE_V8_PATH_INCLUDE = $$PWD/v8 + CORE_V8_PATH_LIBS = $$CORE_V8_PATH_INCLUDE/out.gn/$$CORE_BUILDS_PLATFORM_PREFIX/obj +} INCLUDEPATH += \ $$CORE_V8_PATH_INCLUDE \ @@ -30,11 +39,14 @@ core_linux { } core_mac { - LIBS += -L$$CORE_V8_PATH_LIBS -lv8_base -lv8_libplatform -lv8_libbase -lv8_snapshot -lv8_libsampler - #LIBS += -L$$CORE_V8_PATH_LIBS/third_party/icu -licui18n -licuuc - LIBS += $$CORE_V8_PATH_LIBS/third_party/icu/libicui18n.a - LIBS += $$CORE_V8_PATH_LIBS/third_party/icu/libicuuc.a + v8_version_87 { + LIBS += -L$$CORE_V8_PATH_LIBS -lv8_monolith + } else { + LIBS += -L$$CORE_V8_PATH_LIBS -lv8_base -lv8_libplatform -lv8_libbase -lv8_snapshot -lv8_libsampler + LIBS += $$CORE_V8_PATH_LIBS/third_party/icu/libicui18n.a + LIBS += $$CORE_V8_PATH_LIBS/third_party/icu/libicuuc.a + } QMAKE_CXXFLAGS += -Wall -Wno-inconsistent-missing-override QMAKE_CFLAGS += -Wall -Wno-inconsistent-missing-override diff --git a/DesktopEditor/doctrenderer/DoctRendererTestMacOS/DoctRendererTestMacOS.xcodeproj/project.pbxproj b/DesktopEditor/doctrenderer/DoctRendererTestMacOS/DoctRendererTestMacOS.xcodeproj/project.pbxproj deleted file mode 100644 index 71eab39a1d..0000000000 --- a/DesktopEditor/doctrenderer/DoctRendererTestMacOS/DoctRendererTestMacOS.xcodeproj/project.pbxproj +++ /dev/null @@ -1,254 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 7CC2239D1C0339220073FE7D /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7CC2239C1C0339220073FE7D /* main.mm */; }; - 7CC223A61C03432F0073FE7D /* libdoctrenderer.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7CC223A51C03432F0073FE7D /* libdoctrenderer.dylib */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 7CC223971C0339220073FE7D /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 7CC223991C0339220073FE7D /* DoctRendererTestMacOS */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = DoctRendererTestMacOS; sourceTree = BUILT_PRODUCTS_DIR; }; - 7CC2239C1C0339220073FE7D /* main.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; - 7CC223A51C03432F0073FE7D /* libdoctrenderer.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libdoctrenderer.dylib; path = ../../../SDK/lib/mac_64/libdoctrenderer.dylib; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 7CC223961C0339220073FE7D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7CC223A61C03432F0073FE7D /* libdoctrenderer.dylib in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 7CC223901C0339220073FE7D = { - isa = PBXGroup; - children = ( - 7CC223A51C03432F0073FE7D /* libdoctrenderer.dylib */, - 7CC2239B1C0339220073FE7D /* DoctRendererTestMacOS */, - 7CC2239A1C0339220073FE7D /* Products */, - ); - sourceTree = ""; - }; - 7CC2239A1C0339220073FE7D /* Products */ = { - isa = PBXGroup; - children = ( - 7CC223991C0339220073FE7D /* DoctRendererTestMacOS */, - ); - name = Products; - sourceTree = ""; - }; - 7CC2239B1C0339220073FE7D /* DoctRendererTestMacOS */ = { - isa = PBXGroup; - children = ( - 7CC2239C1C0339220073FE7D /* main.mm */, - ); - path = DoctRendererTestMacOS; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 7CC223981C0339220073FE7D /* DoctRendererTestMacOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 7CC223A01C0339220073FE7D /* Build configuration list for PBXNativeTarget "DoctRendererTestMacOS" */; - buildPhases = ( - 7CC223951C0339220073FE7D /* Sources */, - 7CC223961C0339220073FE7D /* Frameworks */, - 7CC223971C0339220073FE7D /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = DoctRendererTestMacOS; - productName = DoctRendererTestMacOS; - productReference = 7CC223991C0339220073FE7D /* DoctRendererTestMacOS */; - productType = "com.apple.product-type.tool"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 7CC223911C0339220073FE7D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0710; - ORGANIZATIONNAME = "Ascensio System"; - TargetAttributes = { - 7CC223981C0339220073FE7D = { - CreatedOnToolsVersion = 7.1.1; - }; - }; - }; - buildConfigurationList = 7CC223941C0339220073FE7D /* Build configuration list for PBXProject "DoctRendererTestMacOS" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 7CC223901C0339220073FE7D; - productRefGroup = 7CC2239A1C0339220073FE7D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 7CC223981C0339220073FE7D /* DoctRendererTestMacOS */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - 7CC223951C0339220073FE7D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7CC2239D1C0339220073FE7D /* main.mm in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 7CC2239E1C0339220073FE7D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; - CLANG_CXX_LIBRARY = "compiler-default"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../../../SDK/lib/mac_64"; - GCC_C_LANGUAGE_STANDARD = "compiler-default"; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - LD_RUNPATH_SEARCH_PATHS = "@executable_path"; - LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/../../../SDK/lib/mac_64"; - MACOSX_DEPLOYMENT_TARGET = 10.11; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - }; - name = Debug; - }; - 7CC2239F1C0339220073FE7D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; - CLANG_CXX_LIBRARY = "compiler-default"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../../../SDK/lib/mac_64"; - GCC_C_LANGUAGE_STANDARD = "compiler-default"; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - LD_RUNPATH_SEARCH_PATHS = "@executable_path"; - LIBRARY_SEARCH_PATHS = "$(PROJECT_DIR)/../../../SDK/lib/mac_64"; - MACOSX_DEPLOYMENT_TARGET = 10.11; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - }; - name = Release; - }; - 7CC223A11C0339220073FE7D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 7CC223A21C0339220073FE7D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 7CC223941C0339220073FE7D /* Build configuration list for PBXProject "DoctRendererTestMacOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 7CC2239E1C0339220073FE7D /* Debug */, - 7CC2239F1C0339220073FE7D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 7CC223A01C0339220073FE7D /* Build configuration list for PBXNativeTarget "DoctRendererTestMacOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 7CC223A11C0339220073FE7D /* Debug */, - 7CC223A21C0339220073FE7D /* Release */, - ); - defaultConfigurationIsVisible = 0; - }; -/* End XCConfigurationList section */ - }; - rootObject = 7CC223911C0339220073FE7D /* Project object */; -} diff --git a/DesktopEditor/doctrenderer/DoctRendererTestMacOS/DoctRendererTestMacOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DesktopEditor/doctrenderer/DoctRendererTestMacOS/DoctRendererTestMacOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index e88b393c31..0000000000 --- a/DesktopEditor/doctrenderer/DoctRendererTestMacOS/DoctRendererTestMacOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/DesktopEditor/doctrenderer/DoctRendererTestMacOS/DoctRendererTestMacOS/main.mm b/DesktopEditor/doctrenderer/DoctRendererTestMacOS/DoctRendererTestMacOS/main.mm deleted file mode 100644 index 6c05a77d38..0000000000 --- a/DesktopEditor/doctrenderer/DoctRendererTestMacOS/DoctRendererTestMacOS/main.mm +++ /dev/null @@ -1,36 +0,0 @@ -// -// main.m -// DoctRendererTestMacOS -// -// Created by Oleg Korshul on 23.11.15. -// Copyright © 2015 Ascensio System. All rights reserved. -// - -#import -#include "../../DoctRenderer.h" - -int main(int argc, const char * argv[]) { - @autoreleasepool { - - std::wstring strXml = L"\ - 0\ - 0\ - /Users/Oleg/Desktop/activex/TEST_FILES/build_doc\ - /Users/Oleg/Desktop/activex/TEST_FILES/build_doc/EditorWithChanges.bin\ - /Users/Oleg/Desktop/activex/TEST_FILES/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb/Fonts/native\ - /Users/Oleg/Desktop/activex/TEST_FILES/build_doc\\media\ - /Users/Oleg/Desktop/activex/TEST_FILES/themes\ - \ - /Users/Oleg/Desktop/activex/TEST_FILES/build_doc/changes/changes0.json\ - \ - "; - - NSDoctRenderer::CDoctrenderer oRenderer; - - std::wstring sError; - bool bError = oRenderer.Execute(strXml, sError); - - NSLog(bError ? @"OK" : @"ERROR"); - } - return 0; -} diff --git a/DesktopEditor/doctrenderer/app_builder/main.cpp b/DesktopEditor/doctrenderer/app_builder/main.cpp index d9ced92b29..bbca115d5d 100644 --- a/DesktopEditor/doctrenderer/app_builder/main.cpp +++ b/DesktopEditor/doctrenderer/app_builder/main.cpp @@ -62,8 +62,7 @@ int main(int argc, char *argv[]) #else std::string sParam(argv[i]); #endif - if (sParam == "-v" || - sParam == "-version") + if (sParam == "-v" || sParam == "-version") { std::cout << "v" VALUE(INTVER) << std::endl; NSDoctRenderer::CDocBuilder oBuilder; @@ -101,8 +100,6 @@ int main(int argc, char *argv[]) std::wstring sBuildFile = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)sBuildFileA.c_str(), (LONG)sBuildFileA.length()); #endif - NSDoctRenderer::CDocBuilder::Initialize(); - if (true) { NSDoctRenderer::CDocBuilder oBuilder; @@ -140,7 +137,5 @@ int main(int argc, char *argv[]) oBuilder.Run(sBuildFile.c_str()); } - NSDoctRenderer::CDocBuilder::Dispose(); - return 0; } diff --git a/DesktopEditor/doctrenderer/app_builder/test.test b/DesktopEditor/doctrenderer/app_builder/test.test new file mode 100644 index 0000000000..84dd9ceeb9 --- /dev/null +++ b/DesktopEditor/doctrenderer/app_builder/test.test @@ -0,0 +1,33 @@ +builder.CreateFile("docx"); +var oDocument = Api.GetDocument(); +var oParagraph, oRun; +oParagraph = oDocument.GetElement(0); +oParagraph = Api.CreateParagraph(); +oParagraph.AddText("Dear John Smith."); +oDocument.Push(oParagraph); +oParagraph = Api.CreateParagraph(); +oParagraph.AddText("ONLYOFFICE is glad to announce that starting today, you are appointed Commercial director to the company of your dream."); +oDocument.Push(oParagraph); +oParagraph = Api.CreateParagraph(); +oRun = Api.CreateRun(); +oRun.SetBold(true); +oRun.AddText("Please note: "); +oParagraph.AddElement(oRun); +oRun = Api.CreateRun(); +oRun.AddText("this text is used to demonstrate the possibilities of "); +oParagraph.AddElement(oRun); +oRun = Api.CreateRun(); +oRun.SetBold(true); +oRun.AddText("ONLYOFFICE Document Builder"); +oParagraph.AddElement(oRun); +oRun = Api.CreateRun(); +oRun.AddText(" and cannot be used as real appointment to the position in any real company."); +oParagraph.AddElement(oRun); +oDocument.Push(oParagraph); +oParagraph = Api.CreateParagraph(); +oParagraph.AddText("Best regards,"); +oParagraph.AddLineBreak(); +oParagraph.AddText("ONLYOFFICE Document Builder Team"); +oDocument.Push(oParagraph); +builder.SaveFile("docx", "SampleText.docx"); +builder.CloseFile(); diff --git a/DesktopEditor/doctrenderer/docbuilder.h b/DesktopEditor/doctrenderer/docbuilder.h index 1903fd7b3e..debbef0a7a 100644 --- a/DesktopEditor/doctrenderer/docbuilder.h +++ b/DesktopEditor/doctrenderer/docbuilder.h @@ -36,7 +36,6 @@ namespace NSDoctRenderer { - class CDocBuilderJS; /** * Class for getting results of called js commands @@ -231,11 +230,12 @@ namespace NSDoctRenderer * Unloading the ONLYOFFICE Document Builder from the application memory when it is no longer needed. */ static void Dispose(); + CDocBuilder_Private* GetPrivate() { return m_pInternal; } private: CDocBuilder_Private* m_pInternal; - friend class CDocBuilderJS; + friend class CBuilderDocumentEmbed; }; /** diff --git a/DesktopEditor/doctrenderer/docbuilder_p.cpp b/DesktopEditor/doctrenderer/docbuilder_p.cpp index d732f206bc..475ed0e085 100644 --- a/DesktopEditor/doctrenderer/docbuilder_p.cpp +++ b/DesktopEditor/doctrenderer/docbuilder_p.cpp @@ -31,21 +31,6 @@ */ #include "docbuilder_p.h" -namespace NSDoctRenderer -{ - CDocBuilderValue_Private::CDocBuilderValue_Private() - { - m_isolate = NULL; - } - CDocBuilderValue_Private::~CDocBuilderValue_Private() - { - } - void CDocBuilderValue_Private::Clear() - { - m_value.Clear(); - } -} - void CV8RealTimeWorker::_LOGGING_ERROR_(const std::wstring& strType, const std::wstring& strError) { std::string sT = NSFile::CUtf8Converter::GetUtf8StringFromUnicode(strType); @@ -54,36 +39,31 @@ void CV8RealTimeWorker::_LOGGING_ERROR_(const std::wstring& strType, const std:: std::cerr << sT << ": " << sE << std::endl; } +using namespace NSJSBase; + CV8RealTimeWorker::CV8RealTimeWorker(NSDoctRenderer::CDocBuilder* pBuilder) { m_nFileType = -1; - m_isolate = CV8Worker::getInitializer()->CreateNew(); + m_context = new CJSContext(); + m_context->Initialize(); - m_isolate_scope = new v8::Isolate::Scope(m_isolate); - m_isolate_locker = new v8::Locker(m_isolate); - m_handle_scope = new CScopeWrapper(m_isolate); + m_isolate_scope = m_context->CreateIsolateScope(); + m_handle_scope = m_context->CreateLocalScope(); - v8::Handle global = v8::ObjectTemplate::New(m_isolate); - global->Set(m_isolate, "CreateNativeEngine", v8::FunctionTemplate::New(m_isolate, CreateNativeObjectBuilder)); - global->Set(m_isolate, "CreateNativeMemoryStream", v8::FunctionTemplate::New(m_isolate, CreateNativeMemoryStream)); - m_context = v8::Context::New(m_isolate, NULL, global); + m_context->CreateGlobalForContext(); + CNativeControlEmbed::CreateObjectBuilderInContext("CreateNativeEngine", m_context); + CMemoryStreamEmbed::CreateObjectInContext ("CreateNativeMemoryStream", m_context); + m_context->CreateContext(); - v8::Context::Scope context_scope(m_context); - v8::TryCatch try_catch(m_isolate); + JSSmart context_scope = m_context->CreateContextScope(); + JSSmart try_catch = m_context->GetExceptions(); - m_context->Global()->Set(m_context, v8::String::NewFromUtf8(m_isolate, "builderJS"), _builder_CreateNative(m_isolate, pBuilder)); + builder_CreateNative("builderJS", m_context, pBuilder); } CV8RealTimeWorker::~CV8RealTimeWorker() { - RELEASEOBJECT(m_handle_scope); - m_context.Clear(); - - RELEASEOBJECT(m_isolate_locker); - RELEASEOBJECT(m_isolate_scope); - - m_isolate->Dispose(); - m_isolate = NULL; + m_context->Dispose(); } bool CV8RealTimeWorker::ExecuteCommand(const std::wstring& command, NSDoctRenderer::CDocBuilderValue* retValue) @@ -96,46 +76,20 @@ bool CV8RealTimeWorker::ExecuteCommand(const std::wstring& command, NSDoctRender std::string commandA = U_TO_UTF8(command); //commandA = "Api." + commandA; - v8::Context::Scope context_scope(m_context); - - v8::TryCatch try_catch(m_isolate); - - v8::Local source = v8::String::NewFromUtf8(m_isolate, commandA.c_str()); - v8::Local script = v8::Script::Compile(m_context, source).FromMaybe(v8::Local()); + JSSmart context_scope = m_context->CreateContextScope(); + JSSmart try_catch = m_context->GetExceptions(); LOGGER_SPEED_LAP("compile_command") - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"execute_compile_code", strCode); - _LOGGING_ERROR_(L"execute_compile", strException); - + JSSmart retNativeVal = m_context->runScript(commandA, try_catch); + if(try_catch->Check()) return false; - } - else + + if (retValue) { - v8::Local retNativeVal = script->Run(m_context).FromMaybe(v8::Local()); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"execute_run_code", strCode); - _LOGGING_ERROR_(L"execute_run", strException); - - return false; - } - - if (retValue) - { - NSDoctRenderer::CDocBuilderValue_Private* privateRet = (NSDoctRenderer::CDocBuilderValue_Private*)retValue->private_get_internal(); - privateRet->m_isolate = m_isolate; - privateRet->m_value = retNativeVal; - } + NSDoctRenderer::CDocBuilderValue_Private* privateRet = (NSDoctRenderer::CDocBuilderValue_Private*)retValue->private_get_internal(); + privateRet->m_context = m_context; + privateRet->m_value = retNativeVal; } LOGGER_SPEED_LAP("run_command") @@ -147,45 +101,15 @@ std::string CV8RealTimeWorker::GetGlobalVariable() { std::string commandA = "JSON.stringify(GlobalVariable);"; - v8::Context::Scope context_scope(m_context); - - v8::TryCatch try_catch(m_isolate); - - v8::Local source = v8::String::NewFromUtf8(m_isolate, commandA.c_str()); - v8::Local script = v8::Script::Compile(m_context, source).FromMaybe(v8::Local()); - - std::string sReturn = "{}"; - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"execute_compile_code", strCode); - _LOGGING_ERROR_(L"execute_compile", strException); + JSSmart context_scope = m_context->CreateContextScope(); + JSSmart try_catch = m_context->GetExceptions(); + JSSmart _value = m_context->runScript(commandA, try_catch); + if(try_catch->Check()) return ""; - } - else - { - v8::Local _value = script->Run(m_context).FromMaybe(v8::Local()); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"execute_run_code", strCode); - _LOGGING_ERROR_(L"execute_run", strException); - - return ""; - } - - if (_value->IsString()) - sReturn = CV8Convert::ToStringA(_value); - } - - return sReturn; + if(_value->isString()) + return _value->toStringA(); + return "{}"; } std::wstring CV8RealTimeWorker::GetJSVariable(std::wstring sParam) @@ -194,42 +118,14 @@ std::wstring CV8RealTimeWorker::GetJSVariable(std::wstring sParam) NSCommon::string_replaceA(sParamA, "\\\"", "\""); std::string commandA = "(function(){ return (" + sParamA + "); })()"; - v8::Context::Scope context_scope(m_context); - - v8::TryCatch try_catch(m_isolate); - - v8::Local source = v8::String::NewFromUtf8(m_isolate, commandA.c_str()); - v8::Local script = v8::Script::Compile(m_context, source).FromMaybe(v8::Local()); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"execute_compile_code", strCode); - _LOGGING_ERROR_(L"execute_compile", strException); + JSSmart context_scope = m_context->CreateContextScope(); + JSSmart try_catch = m_context->GetExceptions(); + JSSmart _value = m_context->runScript(commandA, try_catch); + if(try_catch->Check()) return L"jsValue(" + sParam + L")"; - } - else - { - v8::Local _value = script->Run(m_context).FromMaybe(v8::Local()); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"execute_run_code", strCode); - _LOGGING_ERROR_(L"execute_run", strException); - - return L"jsValue(" + sParam + L")"; - } - - if (_value->IsString()) - return CV8Convert::ToString(_value); - } - + if(_value->isString()) + return _value->toStringW(); return L"jsValue(" + sParam + L")"; } @@ -237,48 +133,15 @@ bool CV8RealTimeWorker::OpenFile(const std::wstring& sBasePath, const std::wstri { LOGGER_SPEED_START - v8::Context::Scope context_scope(m_context); + JSSmart context_scope = m_context->CreateContextScope(); + JSSmart try_catch = m_context->GetExceptions(); - v8::TryCatch try_catch(m_isolate); - - v8::Local source = v8::String::NewFromUtf8(m_isolate, sString.c_str()); - v8::Local script; - - CCacheDataScript oCachedScript(sCachePath); - if (sCachePath.empty()) - script = v8::Script::Compile(m_context, source).FromMaybe(v8::Local()); - else - { - script = oCachedScript.Compile(m_context, source); - } - - LOGGER_SPEED_LAP("compile") - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"sdk_compile_code", strCode); - _LOGGING_ERROR_(L"sdk_compile", strException); + LOGGER_SPEED_LAP("compile"); + m_context->runScript(sString, try_catch, sCachePath); + if(try_catch->Check()) return false; - } - else - { - script->Run(m_context); - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"sdk_run_code", strCode); - _LOGGING_ERROR_(L"sdk_run", strException); - - return false; - } - } LOGGER_SPEED_LAP("run") if (true) @@ -290,20 +153,9 @@ bool CV8RealTimeWorker::OpenFile(const std::wstring& sBasePath, const std::wstri NSCommon::string_replaceA(sArg, "\"", "\\\""); std::string sArgument = "var Argument = JSON.parse(\"" + sArg + "\");"; - v8::Local _sourceArg = v8::String::NewFromUtf8(m_isolate, sArgument.c_str()); - v8::Local _scriptArg = v8::Script::Compile(m_context, _sourceArg).FromMaybe(v8::Local()); - _scriptArg->Run(m_context); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"sdk_argument_code", strCode); - _LOGGING_ERROR_(L"sdk_argument", strException); - + m_context->runScript(sArgument, try_catch); + if (try_catch->Check()) return false; - } } if (true) @@ -316,56 +168,28 @@ bool CV8RealTimeWorker::OpenFile(const std::wstring& sBasePath, const std::wstri std::string sScriptVar = "var GlobalVariable = JSON.parse(\"" + sArg + "\");"; - v8::Local _sourceArg = v8::String::NewFromUtf8(m_isolate, sScriptVar.c_str()); - v8::Local _scriptArg = v8::Script::Compile(m_context, _sourceArg).FromMaybe(v8::Local()); - _scriptArg->Run(m_context); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"sdk_global_var_code", strCode); - _LOGGING_ERROR_(L"sdk_global_var", strException); - + m_context->runScript(sScriptVar, try_catch); + if (try_catch->Check()) return false; - } } - CNativeControl* pNative = NULL; + NSNativeControl::CNativeControl* pNative = NULL; bool bIsBreak = false; - v8::Local global_js = m_context->Global(); - v8::Handle args[1]; - args[0] = v8::Int32::New(m_isolate, 0); + JSSmart global_js = m_context->GetGlobal(); + JSSmart args[1]; + args[0] = CJSContext::createInt(0); // GET_NATIVE_ENGINE if (!bIsBreak) { - v8::Handle js_func_get_native = global_js->Get(v8::String::NewFromUtf8(m_isolate, "GetNativeEngine")); - v8::Local objNative; - if (js_func_get_native->IsFunction()) + JSSmart js_result2 = global_js->call_func("GetNativeEngine", 1, args); + if (try_catch->Check()) + bIsBreak = true; + else { - v8::Handle func_get_native = v8::Handle::Cast(js_func_get_native); - v8::Local js_result2 = func_get_native->Call(global_js, 1, args); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"run_code", strCode); - _LOGGING_ERROR_(L"run", strException); - - bIsBreak = true; - } - else - { - objNative = js_result2->ToObject(); - v8::Handle field = v8::Handle::Cast(objNative->GetInternalField(0)); - - pNative = static_cast(field->Value()); - } + JSSmart objNative = js_result2->toObject(); + pNative = (NSNativeControl::CNativeControl*)objNative->getNative()->getObject(); } } @@ -393,42 +217,18 @@ bool CV8RealTimeWorker::OpenFile(const std::wstring& sBasePath, const std::wstri // OPEN if (!bIsBreak) { - v8::Handle js_func_open = global_js->Get(v8::String::NewFromUtf8(m_isolate, "NativeOpenFileData")); - if (js_func_open->IsFunction()) - { - v8::Handle func_open = v8::Handle::Cast(js_func_open); + CChangesWorker oWorkerLoader; + int nVersion = oWorkerLoader.OpenNative(pNative->GetFilePath()); - CChangesWorker oWorkerLoader; - int nVersion = oWorkerLoader.OpenNative(pNative->GetFilePath()); + JSSmart args_open[3]; + args_open[0] = oWorkerLoader.GetDataFull()->toObject()->toValue(); + args_open[1] = CJSContext::createInt(nVersion); + std::wstring sXlsx = NSCommon::GetDirectoryName(pNative->GetFilePath()) + L"/Editor.xlsx"; + args_open[2] = NSFile::CFileBinary::Exists(sXlsx) ? CJSContext::createString(sXlsx) : CJSContext::createUndefined(); - v8::Handle args_open[3]; - args_open[0] = oWorkerLoader.GetDataFull(); - args_open[1] = v8::Integer::New(m_isolate, nVersion); - - std::wstring sXlsx = NSCommon::GetDirectoryName(pNative->GetFilePath()) + L"/Editor.xlsx"; - if (NSFile::CFileBinary::Exists(sXlsx)) - { - std::string sXlsxA = U_TO_UTF8(sXlsx); - args_open[2] = v8::String::NewFromUtf8(m_isolate, (char*)(sXlsxA.c_str())); - } - else - { - args_open[2] = v8::Undefined(m_isolate); - } - - func_open->Call(global_js, 3, args_open); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"open_code", strCode); - _LOGGING_ERROR_(L"open", strException); - - bIsBreak = true; - } - } + global_js->call_func("NativeOpenFileData", 3, args_open); + if (try_catch->Check()) + bIsBreak = true; } if (!bIsBreak) @@ -451,40 +251,23 @@ bool CV8RealTimeWorker::SaveFileWithChanges(int type, const std::wstring& _path) else if ((type & AVS_OFFICESTUDIO_FILE_CROSSPLATFORM) || (type & AVS_OFFICESTUDIO_FILE_IMAGE)) _formatDst = NSDoctRenderer::DoctRendererFormat::PDF; - v8::Context::Scope context_scope(m_context); - v8::TryCatch try_catch(m_isolate); + JSSmart context_scope = m_context->CreateContextScope(); + JSSmart try_catch = m_context->GetExceptions(); - CNativeControl* pNative = NULL; + NSNativeControl::CNativeControl* pNative = NULL; - v8::Local global_js = m_context->Global(); - v8::Handle args[1]; - args[0] = v8::Int32::New(m_isolate, 0); + JSSmart global_js = m_context->GetGlobal(); + JSSmart args[1]; + args[0] = CJSContext::createInt(0); // GET_NATIVE_ENGINE if (true) { - v8::Handle js_func_get_native = global_js->Get(v8::String::NewFromUtf8(m_isolate, "GetNativeEngine")); - v8::Local objNative; - if (js_func_get_native->IsFunction()) + JSSmart js_result2 = global_js->call_func("GetNativeEngine", 1, args); + if (!try_catch->Check()) { - v8::Handle func_get_native = v8::Handle::Cast(js_func_get_native); - v8::Local js_result2 = func_get_native->Call(global_js, 1, args); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"run_code", strCode); - _LOGGING_ERROR_(L"run", strException); - } - else - { - objNative = js_result2->ToObject(); - v8::Handle field = v8::Handle::Cast(objNative->GetInternalField(0)); - - pNative = static_cast(field->Value()); - } + JSSmart objNative = js_result2->toObject(); + pNative = (NSNativeControl::CNativeControl*)objNative->getNative()->getObject(); } } @@ -498,11 +281,8 @@ bool CV8RealTimeWorker::SaveFileWithChanges(int type, const std::wstring& _path) bool bIsError = Doct_renderer_SaveFile_ForBuilder(_formatDst, _path, pNative, - m_isolate, m_context, - global_js, args, - try_catch, strError); if (_formatDst == NSDoctRenderer::DoctRendererFormat::PDF) @@ -537,7 +317,7 @@ namespace NSDoctRenderer bool CDocBuilderValue::IsEmpty() { - return m_internal->m_value.IsEmpty(); + return m_internal->m_value->isEmpty(); } void CDocBuilderValue::Clear() { @@ -545,33 +325,29 @@ namespace NSDoctRenderer } bool CDocBuilderValue::IsNull() { - if (m_internal->m_value.IsEmpty()) - return false; - return m_internal->m_value->IsNull(); + return m_internal->m_value->isNull(); } bool CDocBuilderValue::IsUndefined() { - if (m_internal->m_value.IsEmpty()) - return false; - return m_internal->m_value->IsUndefined(); + return m_internal->m_value->isUndefined(); } int CDocBuilderValue::ToInt() { - if (m_internal->m_value.IsEmpty() || !m_internal->m_value->IsInt32()) + if (IsEmpty() || !m_internal->m_value->isNumber()) return 0; - return CV8Convert::ToInt(m_internal->m_value); + return m_internal->m_value->toInt32(); } double CDocBuilderValue::ToDouble() { - if (m_internal->m_value.IsEmpty() || !m_internal->m_value->IsNumber()) + if (IsEmpty() || !m_internal->m_value->isNumber()) return 0; - return CV8Convert::ToDouble(m_internal->m_value); + return m_internal->m_value->toDouble(); } wchar_t* CDocBuilderValue::ToString() { - if (m_internal->m_value.IsEmpty() || !m_internal->m_value->IsString()) + if (IsEmpty() || !m_internal->m_value->isString()) return NULL; - std::wstring sValue = CV8Convert::ToString(m_internal->m_value); + std::wstring sValue = m_internal->m_value->toStringW(); if (sValue.empty()) return NULL; size_t len = sValue.length(); @@ -587,14 +363,14 @@ namespace NSDoctRenderer CDocBuilderValue CDocBuilderValue::GetProperty(const wchar_t* name) { CDocBuilderValue ret; - if (m_internal->m_value.IsEmpty() || !m_internal->m_value->IsObject()) + if (IsEmpty() || !m_internal->m_value->isObject()) return ret; std::wstring sProp(name); std::string sPropA = U_TO_UTF8(sProp); - ret.m_internal->m_isolate = m_internal->m_isolate; - ret.m_internal->m_value = m_internal->m_value->ToObject()->Get(v8::String::NewFromUtf8(m_internal->m_isolate, sPropA.c_str())); + ret.m_internal->m_context = m_internal->m_context; + ret.m_internal->m_value = m_internal->m_value->toObject()->get(sPropA.c_str()); return ret; } @@ -885,7 +661,7 @@ namespace NSDoctRenderer } else { - //bIsNoError = this->m_pInternal->ExecuteCommand(NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)_data, (LONG)_len)); + bIsNoError = this->m_pInternal->ExecuteCommand(NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)_data, (LONG)_len)); sJsCommands += command; sJsCommands += "\n"; } @@ -933,12 +709,14 @@ namespace NSDoctRenderer void CDocBuilder::Initialize() { - CV8Worker::Initialize(); + CJSContext context; + context.Initialize(true); } void CDocBuilder::Dispose() { - CV8Worker::Dispose(); + CJSContext context; + context.Dispose(); } void CDocBuilder::WriteData(const wchar_t* path, const wchar_t* value, const bool& append) diff --git a/DesktopEditor/doctrenderer/docbuilder_p.h b/DesktopEditor/doctrenderer/docbuilder_p.h index aa2dbdc3f4..222bcc4858 100644 --- a/DesktopEditor/doctrenderer/docbuilder_p.h +++ b/DesktopEditor/doctrenderer/docbuilder_p.h @@ -35,18 +35,20 @@ #include "docbuilder.h" #include "doctrenderer.h" -#include "../xml/include/xmlutils.h" #include +#include +#include "../xml/include/xmlutils.h" #include "../common/File.h" #include "../common/Directory.h" #include "../../Common/OfficeFileFormats.h" #include "../../Common/OfficeFileFormatChecker.h" -#include "nativebuilder.h" -#include - +#include "js_internal/js_base.h" +#include "embed/NativeBuilderEmbed.h" +#include "embed/NativeControlEmbed.h" +#include "embed/MemoryStreamEmbed.h" #ifdef LINUX #include #include @@ -68,45 +70,25 @@ namespace NSDoctRenderer class CDocBuilderValue_Private { public: - v8::Isolate* m_isolate; - v8::Local m_value; + JSSmart m_context; + JSSmart m_value; public: - CDocBuilderValue_Private(); - ~CDocBuilderValue_Private(); - void Clear(); + CDocBuilderValue_Private() : m_context(NULL) {} + ~CDocBuilderValue_Private() {} + void Clear() { m_value.Release(); } }; } -template -class CScopeWrapper -{ -private: - T m_handler; - -private: - CScopeWrapper(const CScopeWrapper&) {} - void operator=(const CScopeWrapper&) {} - -public: - - CScopeWrapper(v8::Isolate* isolate) : m_handler(isolate) {} -}; - class CV8RealTimeWorker { public: - v8::Isolate* m_isolate; - - v8::Isolate::Scope* m_isolate_scope; - v8::Locker* m_isolate_locker; - - CScopeWrapper* m_handle_scope; - v8::Local m_context; + JSSmart m_isolate_scope; + JSSmart m_handle_scope; + JSSmart m_context; int m_nFileType; std::string m_sUtf8ArgumentJSON; - std::string m_sGlobalVariable; public: @@ -140,13 +122,7 @@ namespace NSDoctRenderer class CDocBuilderParams { public: - CDocBuilderParams() - { - m_bCheckFonts = false; - m_sWorkDir = L""; - m_bSaveWithDoctrendererMode = false; - m_sArgumentJSON = ""; - } + CDocBuilderParams() : m_bCheckFonts(false), m_sWorkDir(L""), m_bSaveWithDoctrendererMode(false), m_sArgumentJSON("") {} public: bool m_bCheckFonts; @@ -158,7 +134,7 @@ namespace NSDoctRenderer class CDocBuilder_Private { public: - CArray m_arrFiles; + std::vector m_arrFiles; std::vector m_arDoctSDK; std::vector m_arPpttSDK; @@ -193,28 +169,13 @@ namespace NSDoctRenderer NSDoctRenderer::CDocBuilder* m_pParent; public: - CDocBuilder_Private() - { - m_pParent = NULL; - m_pWorker = NULL; - - m_nFileType = -1; - - m_sTmpFolder = NSFile::CFileBinary::GetTempPath(); - + CDocBuilder_Private() : m_bIsNotUseConfigAllFontsDir(false), m_sTmpFolder(NSFile::CFileBinary::GetTempPath()), m_nFileType(-1), + m_pWorker(NULL), m_pAdditionalData(NULL), m_bIsInit(false), m_bIsCacheScript(true), m_bIsServerSafeVersion(false), + m_sGlobalVariable(""), m_bIsGlobalVariableUse(false), m_pParent(NULL) + { // под линуксом предыдущая функция создает файл!!! if (NSFile::CFileBinary::Exists(m_sTmpFolder)) NSFile::CFileBinary::Remove(m_sTmpFolder); - - m_pAdditionalData = NULL; - m_bIsInit = false; - m_bIsCacheScript = true; - - m_sGlobalVariable = ""; - m_bIsGlobalVariableUse = false; - - m_bIsNotUseConfigAllFontsDir = false; - m_bIsServerSafeVersion = false; } void Init() @@ -275,15 +236,15 @@ namespace NSDoctRenderer } else { - m_arrFiles.Add(m_strAllFonts); + m_arrFiles.push_back(m_strAllFonts); continue; } } if (NSFile::CFileBinary::Exists(strFilePath) && !NSFile::CFileBinary::Exists(sConfigDir + strFilePath)) - m_arrFiles.Add(strFilePath); + m_arrFiles.push_back(strFilePath); else - m_arrFiles.Add(sConfigDir + strFilePath); + m_arrFiles.push_back(sConfigDir + strFilePath); } } } @@ -356,7 +317,8 @@ namespace NSDoctRenderer oWorker.m_bIsNeedThumbnails = false; oWorker.m_sDirectory = sDirectory; NSFonts::IApplicationFonts* pFonts = oWorker.Check(); - pFonts->Release(); + if(pFonts) + pFonts->Release(); } void CheckFileDir() @@ -966,7 +928,6 @@ namespace NSDoctRenderer { std::vector* arSdkFiles = NULL; - std::wstring sResourceFile; switch (m_nFileType) { case 0: @@ -989,7 +950,7 @@ namespace NSDoctRenderer } std::string strScript = ""; - for (size_t i = 0; i < m_arrFiles.GetCount(); ++i) + for (size_t i = 0; i < m_arrFiles.size(); ++i) { strScript += ReadScriptFile(m_arrFiles[i]); strScript += "\n\n"; @@ -997,9 +958,9 @@ namespace NSDoctRenderer if (NULL != arSdkFiles) { - for (std::vector::iterator i = arSdkFiles->begin(); i != arSdkFiles->end(); i++) + for (const std::wstring& i : *arSdkFiles) { - strScript += ReadScriptFile(*i); + strScript += ReadScriptFile(i); strScript += "\n\n"; } } diff --git a/DesktopEditor/doctrenderer/doctrenderer.cpp b/DesktopEditor/doctrenderer/doctrenderer.cpp index 215a0d3bd5..0927326805 100644 --- a/DesktopEditor/doctrenderer/doctrenderer.cpp +++ b/DesktopEditor/doctrenderer/doctrenderer.cpp @@ -36,7 +36,8 @@ #undef BOOL #endif -#include "nativecontrol.h" +#include "embed/NativeControlEmbed.h" +#include "embed/MemoryStreamEmbed.h" #include "../xml/include/xmlutils.h" @@ -87,7 +88,7 @@ namespace NSDoctRenderer std::wstring m_strSrcFilePath; std::wstring m_strDstFilePath; - CArray m_arChanges; + std::vector m_arChanges; int m_nCountChangesItems; std::wstring m_strMailMergeDatabasePath; @@ -129,7 +130,7 @@ namespace NSDoctRenderer } ~CExecuteParams() { - m_arChanges.RemoveAll(); + m_arChanges.clear(); } public: @@ -163,7 +164,7 @@ namespace NSDoctRenderer XmlUtils::CXmlNode _node; oNodes.GetAt(i, _node); - m_arChanges.Add(_node.GetText()); + m_arChanges.push_back(_node.GetText()); } } @@ -198,45 +199,6 @@ namespace NSDoctRenderer }; } -void CreateNativeObject(const v8::FunctionCallbackInfo& args) -{ - v8::Isolate* isolate = v8::Isolate::GetCurrent(); - - v8::Handle NativeObjectTemplate = CreateNativeControlTemplate(isolate); - CNativeControl* pNativeObject = new CNativeControl(); - - v8::Local obj = NativeObjectTemplate->NewInstance(); - obj->SetInternalField(0, v8::External::New(v8::Isolate::GetCurrent(), pNativeObject)); - - args.GetReturnValue().Set(obj); -} - -void CreateNativeObjectBuilder(const v8::FunctionCallbackInfo& args) -{ - v8::Isolate* isolate = v8::Isolate::GetCurrent(); - - v8::Handle NativeObjectTemplate = CreateNativeControlTemplateBuilder(isolate); - CNativeControl* pNativeObject = new CNativeControl(); - - v8::Local obj = NativeObjectTemplate->NewInstance(); - obj->SetInternalField(0, v8::External::New(v8::Isolate::GetCurrent(), pNativeObject)); - - args.GetReturnValue().Set(obj); -} - -void CreateNativeMemoryStream(const v8::FunctionCallbackInfo& args) -{ - v8::Isolate* isolate = v8::Isolate::GetCurrent(); - - v8::Handle MemoryObjectTemplate = CreateMemoryStreamTemplate(isolate); - CMemoryStream* pMemoryObject = new CMemoryStream(); - - v8::Local obj = MemoryObjectTemplate->NewInstance(); - obj->SetInternalField(0, v8::External::New(v8::Isolate::GetCurrent(), pMemoryObject)); - - args.GetReturnValue().Set(obj); -} - namespace NSDoctRenderer { std::wstring string_replaceAll(std::wstring str, const std::wstring& from, const std::wstring& to) @@ -278,7 +240,7 @@ namespace NSDoctRenderer std::wstring m_strConfigDir; std::wstring m_strConfigPath; - CArray m_arrFiles; + std::vector m_arrFiles; std::vector m_arDoctSDK; std::vector m_arPpttSDK; @@ -303,7 +265,7 @@ namespace NSDoctRenderer } void LoadConfig(const std::wstring& sConfigDir, const std::wstring& sAllFontsPath = L"") { - m_arrFiles.RemoveAll(); + m_arrFiles.clear(); m_arDoctSDK.clear(); m_arPpttSDK.clear(); m_arXlstSDK.clear(); @@ -333,9 +295,9 @@ namespace NSDoctRenderer if (NSFile::CFileBinary::Exists(strFilePath) && !NSFile::CFileBinary::Exists(m_strConfigDir + strFilePath)) - m_arrFiles.Add(strFilePath); + m_arrFiles.push_back(strFilePath); else - m_arrFiles.Add(m_strConfigDir + strFilePath); + m_arrFiles.push_back(m_strConfigDir + strFilePath); } } } @@ -429,22 +391,22 @@ namespace NSDoctRenderer } static bool Doct_renderer_SaveFile(CExecuteParams* pParams, - CNativeControl* pNative, - v8::Isolate* isolate, - v8::Local context, - v8::Local& global_js, - v8::Handle* args, - v8::TryCatch& try_catch, - std::wstring& strError, - v8::Local& api_js_maybe_null, - bool bIsPdfBase64 = false) + NSNativeControl::CNativeControl* pNative, + JSSmart context, + JSSmart* args, + std::wstring& strError, + JSSmart& api_js_maybe_null, + bool bIsPdfBase64 = false) { - v8::Local js_objectApi = api_js_maybe_null; - if (js_objectApi.IsEmpty()) - js_objectApi = global_js->Get(v8::String::NewFromUtf8(isolate, "Api"))->ToObject(); + JSSmart try_catch = context->GetExceptions(); + JSSmart global_js = context->GetGlobal(); + + JSSmart js_objectApi = api_js_maybe_null; + if (!js_objectApi.IsInit() || js_objectApi->isUndefined()) + js_objectApi = global_js->get("Api")->toObject(); bool bIsBreak = false; - if (js_objectApi.IsEmpty() || !js_objectApi->IsObject()) + if (js_objectApi->isUndefined() || !js_objectApi->isObject()) { _LOGGING_ERROR_(L"save_code_api", L""); _LOGGING_ERROR_(L"save_api", L""); @@ -460,82 +422,57 @@ namespace NSDoctRenderer case DoctRendererFormat::PPTT: case DoctRendererFormat::XLST: { - v8::Handle js_func_get_file_s = js_objectApi->Get(v8::String::NewFromUtf8(isolate, "asc_nativeGetFileData")); - if (js_func_get_file_s->IsFunction()) + JSSmart js_result2 = js_objectApi->call_func("asc_nativeGetFileData", 1, args); + if(try_catch->Check()) { - v8::Handle func_get_file_s = v8::Handle::Cast(js_func_get_file_s); - v8::Local js_result2 = func_get_file_s->Call(js_objectApi, 1, args); + strError = L"code=\"save\""; + bIsBreak = true; + } + else + { + const BYTE* pData = js_result2->toTypedArray()->getData(); - if (try_catch.HasCaught()) + NSFile::CFileBinary oFile; + if (true == oFile.CreateFileW(pParams->m_strDstFilePath)) { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"save_code", strCode); - _LOGGING_ERROR_(L"save", strException); - - strError = L"code=\"save\""; - bIsBreak = true; - } - else - { - v8::Local pArray = v8::Local::Cast(js_result2); - BYTE* pData = (BYTE*)pArray->Buffer()->Externalize().Data(); - - NSFile::CFileBinary oFile; - if (true == oFile.CreateFileW(pParams->m_strDstFilePath)) + if (pNative->m_sHeader.find(";v10;") == std::string::npos) { - if (pNative->m_sHeader.find(";v10;") == std::string::npos) - { - oFile.WriteFile((BYTE*)pNative->m_sHeader.c_str(), (DWORD)pNative->m_sHeader.length()); + oFile.WriteFile((BYTE*)pNative->m_sHeader.c_str(), (DWORD)pNative->m_sHeader.length()); - char* pDst64 = NULL; - int nDstLen = 0; - NSFile::CBase64Converter::Encode(pData, pNative->m_nSaveBinaryLen, pDst64, nDstLen, NSBase64::B64_BASE64_FLAG_NOCRLF); + char* pDst64 = NULL; + int nDstLen = 0; + NSFile::CBase64Converter::Encode(const_cast(pData), pNative->m_nSaveBinaryLen, pDst64, nDstLen, NSBase64::B64_BASE64_FLAG_NOCRLF); - oFile.WriteFile((BYTE*)pDst64, (DWORD)nDstLen); + oFile.WriteFile((BYTE*)pDst64, (DWORD)nDstLen); - RELEASEARRAYOBJECTS(pDst64); - } - else - { - oFile.WriteFile(pData, (DWORD)pNative->m_nSaveBinaryLen); - } - oFile.CloseFile(); + RELEASEARRAYOBJECTS(pDst64); } + else + { + oFile.WriteFile(pData, (DWORD)pNative->m_nSaveBinaryLen); + } + oFile.CloseFile(); } } break; } case DoctRendererFormat::HTML: { - v8::Handle js_func_get_file_s = js_objectApi->Get(v8::String::NewFromUtf8(isolate, "asc_nativeGetHtml")); - if (js_func_get_file_s->IsFunction()) + JSSmart js_result2 = js_objectApi->call_func("asc_nativeGetHtml", 1, args); + if(try_catch->Check()) { - v8::Handle func_get_file_s = v8::Handle::Cast(js_func_get_file_s); - v8::Local js_result2 = func_get_file_s->Call(js_objectApi, 1, args); + strError = L"code=\"save\""; + bIsBreak = true; + } + else + { + std::string sHTML_Utf8 = js_result2->toStringA(); - if (try_catch.HasCaught()) + NSFile::CFileBinary oFile; + if (true == oFile.CreateFileW(pParams->m_strDstFilePath)) { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"save_code", strCode); - _LOGGING_ERROR_(L"save", strException); - - strError = L"code=\"save\""; - bIsBreak = true; - } - else - { - std::string sHTML_Utf8 = CV8Convert::ToStringA(js_result2); - - NSFile::CFileBinary oFile; - if (true == oFile.CreateFileW(pParams->m_strDstFilePath)) - { - oFile.WriteFile((BYTE*)sHTML_Utf8.c_str(), (DWORD)sHTML_Utf8.length()); - oFile.CloseFile(); - } + oFile.WriteFile((BYTE*)sHTML_Utf8.c_str(), (DWORD)sHTML_Utf8.length()); + oFile.CloseFile(); } } break; @@ -543,186 +480,120 @@ namespace NSDoctRenderer case DoctRendererFormat::PDF: case DoctRendererFormat::PPTX_THEME_THUMBNAIL: { - v8::Handle js_func_calculate = js_objectApi->Get(v8::String::NewFromUtf8(isolate, "asc_nativeCalculateFile")); - v8::Handle js_func_pages_count = js_objectApi->Get(v8::String::NewFromUtf8(isolate, "asc_nativePrintPagesCount")); - // CALCULATE - if (js_func_calculate->IsFunction()) + if (pParams->m_sJsonParams.empty()) + args[0] = CJSContext::createNull(); + else { - v8::Handle func_calculate = v8::Handle::Cast(js_func_calculate); + std::string sTmp = U_TO_UTF8((pParams->m_sJsonParams)); + args[0] = context->JSON_Parse(sTmp.c_str()); + } - if (pParams->m_sJsonParams.empty()) - args[0] = v8::Undefined(isolate); - else + JSSmart js_result2 = js_objectApi->call_func("asc_nativeCalculateFile", 1, args); + if(try_catch->Check()) + { + strError = L"code=\"calculate\""; + bIsBreak = true; + } + + // PAGESCOUNT + LONG lPagesCount = 0; + if (!bIsBreak) + { + JSSmart js_result1 = js_objectApi->call_func("asc_nativePrintPagesCount", 1, args); + if(try_catch->Check()) { - std::string sTmp = U_TO_UTF8((pParams->m_sJsonParams)); - - #ifndef V8_OS_XP - args[0] = v8::JSON::Parse(context, v8::String::NewFromUtf8(isolate, (char*)sTmp.c_str())).FromMaybe(v8::Local()); - #else - args[0] = v8::JSON::Parse(v8::String::NewFromUtf8(isolate, (char*)sTmp.c_str())); - #endif - } - - func_calculate->Call(js_objectApi, 1, args); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"calculate_code", strCode); - _LOGGING_ERROR_(L"calculate", strException); - strError = L"code=\"calculate\""; bIsBreak = true; } - } - - - LONG lPagesCount = 0; - - // PAGESCOUNT - if (!bIsBreak) - { - if (js_func_pages_count->IsFunction()) - { - v8::Handle func_pages_count = v8::Handle::Cast(js_func_pages_count); - v8::Local js_result1 = func_pages_count->Call(js_objectApi, 1, args); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"calculate_code", strCode); - _LOGGING_ERROR_(L"calculate", strException); - - strError = L"code=\"calculate\""; - bIsBreak = true; - } - else - { - lPagesCount = (LONG)CV8Convert::ToInt(js_result1); - } - } + else + lPagesCount = (LONG)js_result1->toInt32(); } // RENDER if (!bIsBreak && DoctRendererFormat::PDF == pParams->m_eDstFormat) { - v8::Handle js_func_get_file_s = js_objectApi->Get(v8::String::NewFromUtf8(isolate, "asc_nativeGetPDF")); - if (js_func_get_file_s->IsFunction()) + if (pParams->m_sJsonParams.empty()) + args[0] = CJSContext::createNull(); + else { - v8::Handle func_get_file_s = v8::Handle::Cast(js_func_get_file_s); + std::string sTmp = U_TO_UTF8((pParams->m_sJsonParams)); + args[0] = context->JSON_Parse(sTmp.c_str()); + } - if (pParams->m_sJsonParams.empty()) - args[0] = v8::Undefined(isolate); - else + JSSmart js_result2 = js_objectApi->call_func("asc_nativeGetPDF", 1, args); + if(try_catch->Check()) + { + strError = L"code=\"save\""; + bIsBreak = true; + } + else + { + const BYTE* pData = js_result2->toTypedArray()->getData(); + + NSFile::CFileBinary oFile; + if (true == oFile.CreateFileW(pParams->m_strDstFilePath)) { - std::string sTmp = U_TO_UTF8((pParams->m_sJsonParams)); - - #ifndef V8_OS_XP - args[0] = v8::JSON::Parse(context, v8::String::NewFromUtf8(isolate, (char*)sTmp.c_str())).FromMaybe(v8::Local()); - #else - args[0] = v8::JSON::Parse(v8::String::NewFromUtf8(isolate, (char*)sTmp.c_str())); - #endif - } - - v8::Local js_result2 = func_get_file_s->Call(js_objectApi, 1, args); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"save_code", strCode); - _LOGGING_ERROR_(L"save", strException); - - strError = L"code=\"save\""; - bIsBreak = true; - } - else - { - v8::Local pArray = v8::Local::Cast(js_result2); - BYTE* pData = (BYTE*)pArray->Buffer()->Externalize().Data(); - - NSFile::CFileBinary oFile; - if (true == oFile.CreateFileW(pParams->m_strDstFilePath)) + if (!bIsPdfBase64) { - if (!bIsPdfBase64) - { - oFile.WriteFile(pData, (DWORD)pNative->m_nSaveBinaryLen); - } - else - { - char* pDataDst = NULL; - int nDataDst = 0; - if (NSFile::CBase64Converter::Encode(pData, pNative->m_nSaveBinaryLen, pDataDst, nDataDst)) - { - oFile.WriteFile((BYTE*)pDataDst, (DWORD)nDataDst); - RELEASEARRAYOBJECTS(pDataDst); - } - - } - oFile.CloseFile(); + oFile.WriteFile(pData, (DWORD)pNative->m_nSaveBinaryLen); } + else + { + char* pDataDst = NULL; + int nDataDst = 0; + if (NSFile::CBase64Converter::Encode(const_cast(pData), pNative->m_nSaveBinaryLen, pDataDst, nDataDst)) + { + oFile.WriteFile((BYTE*)pDataDst, (DWORD)nDataDst); + RELEASEARRAYOBJECTS(pDataDst); + } + } + oFile.CloseFile(); } } } if (!bIsBreak && DoctRendererFormat::PPTX_THEME_THUMBNAIL == pParams->m_eDstFormat) { - v8::Handle js_func_get_file_thumbnail = js_objectApi->Get(v8::String::NewFromUtf8(isolate, "asc_nativeGetThemeThumbnail")); - if (js_func_get_file_thumbnail->IsFunction()) + JSSmart js_result2; + int nSizeArgs = (int)pParams->m_arThemesThumbnailsParams.size(); + if (0 == nSizeArgs) { - v8::Handle func_get_file_thumbnail = v8::Handle::Cast(js_func_get_file_thumbnail); - v8::Local js_result2; + js_result2 = js_objectApi->call_func("asc_nativeGetThemeThumbnail", 1, args); + } + else + { + JSSmart arrArgs = CJSContext::createArray(nSizeArgs); + int nCurArg = 0; + for (std::vector::iterator iter = pParams->m_arThemesThumbnailsParams.begin(); iter != pParams->m_arThemesThumbnailsParams.end(); iter++) + arrArgs->set(nCurArg++, CJSContext::createInt(*iter)); - int nSizeArgs = (int)pParams->m_arThemesThumbnailsParams.size(); - if (0 == nSizeArgs) + args[0] = arrArgs->toValue(); + js_result2 = js_objectApi->call_func("asc_nativeGetThemeThumbnail", 1, args); + } + + if(try_catch->Check()) + { + strError = L"code=\"save\""; + bIsBreak = true; + } + else + { + if (!js_result2->isNull()) { - js_result2 = func_get_file_thumbnail->Call(js_objectApi, 1, args); - } - else - { - v8::Local arrArgs = v8::Array::New(isolate, nSizeArgs); - int nCurArg = 0; - for (std::vector::iterator iter = pParams->m_arThemesThumbnailsParams.begin(); iter != pParams->m_arThemesThumbnailsParams.end(); iter++) - arrArgs->Set(nCurArg++, v8::Int32::New(isolate, *iter)); + JSSmart objNative = js_result2->toObject(); - args[0] = arrArgs; - js_result2 = func_get_file_thumbnail->Call(js_objectApi, 1, args); - } + const BYTE* pData = objNative->get("data")->toTypedArray()->getData(); + std::wstring sThemeName = objNative->get("name")->toStringW(); + int nDataLen = objNative->get("dataLen")->toInt32(); - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); + if (sThemeName.empty()) + sThemeName = L"Default"; - _LOGGING_ERROR_(L"save_code", strCode); - _LOGGING_ERROR_(L"save", strException); - - strError = L"code=\"save\""; - bIsBreak = true; - } - else - { - if (!js_result2->IsNull()) + NSFile::CFileBinary oFile; + if (true == oFile.CreateFileW(pParams->m_strDstFilePath + L"/" + sThemeName + L".theme")) { - v8::Local objNative = js_result2->ToObject(); - v8::Local pArray = v8::Local::Cast(objNative->Get(v8::String::NewFromUtf8(isolate, "data"))); - std::wstring sThemeName = CV8Convert::ToString(objNative->Get(v8::String::NewFromUtf8(isolate, "name"))); - int nDataLen = CV8Convert::ToInt(objNative->Get(v8::String::NewFromUtf8(isolate, "dataLen"))); - if (sThemeName.empty()) - sThemeName = L"Default"; - - BYTE* pData = (BYTE*)pArray->Buffer()->Externalize().Data(); - NSFile::CFileBinary oFile; - if (true == oFile.CreateFileW(pParams->m_strDstFilePath + L"/" + sThemeName + L".theme")) - { - oFile.WriteFile(pData, (DWORD)nDataLen); - oFile.CloseFile(); - } + oFile.WriteFile(pData, (DWORD)nDataLen); + oFile.CloseFile(); } } } @@ -735,112 +606,59 @@ namespace NSDoctRenderer return bIsBreak; } - bool ExecuteScript(const std::string& strScript, const std::wstring& sCachePath, std::wstring& strError, std::wstring& strReturnParams) { LOGGER_SPEED_START bool bIsBreak = false; - v8::Isolate* isolate = CV8Worker::getInitializer()->CreateNew(); + JSSmart context = new CJSContext(); + context->Initialize(); + if (true) { - v8::Isolate::Scope isolate_cope(isolate); - v8::Locker isolate_locker(isolate); + JSSmart isolate_scope = context->CreateIsolateScope(); + JSSmart handle_scope = context->CreateLocalScope(); - v8::HandleScope handle_scope(isolate); + context->CreateGlobalForContext(); + CNativeControlEmbed::CreateObjectBuilderInContext("CreateNativeEngine", context); + CMemoryStreamEmbed::CreateObjectInContext ("CreateNativeMemoryStream", context); + context->CreateContext(); - v8::Handle global = v8::ObjectTemplate::New(isolate); - global->Set(isolate, "CreateNativeEngine", v8::FunctionTemplate::New(isolate, CreateNativeObject)); - global->Set(isolate, "CreateNativeMemoryStream", v8::FunctionTemplate::New(isolate, CreateNativeMemoryStream)); - - v8::Local context = v8::Context::New(isolate, NULL, global); - - v8::Context::Scope context_scope(context); - v8::TryCatch try_catch(isolate); - v8::Local source = v8::String::NewFromUtf8(isolate, strScript.c_str()); - v8::Local script; - - LOGGER_SPEED_LAP("pre_compile") - - CCacheDataScript oCachedScript(sCachePath); - if (sCachePath.empty()) - script = v8::Script::Compile(context, source).FromMaybe(v8::Local()); - else - { - script = oCachedScript.Compile(context, source); - } + JSSmart context_scope = context->CreateContextScope(); + JSSmart try_catch = context->GetExceptions(); LOGGER_SPEED_LAP("compile") - // COMPILE - if (try_catch.HasCaught()) + JSSmart res = context->runScript(strScript, try_catch, sCachePath); + if(try_catch->Check()) { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"compile_code", strCode); - _LOGGING_ERROR_(L"compile", strException); - - strError = L"code=\"compile\""; + strError = L"code=\"run\""; bIsBreak = true; } - // RUN - if (!bIsBreak) - { - v8::Local result = script->Run(context).FromMaybe(v8::Local()); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"run_code", strCode); - _LOGGING_ERROR_(L"run", strException); - - strError = L"code=\"run\""; - bIsBreak = true; - } - } - LOGGER_SPEED_LAP("run") //--------------------------------------------------------------- - v8::Local global_js = context->Global(); - v8::Handle args[1]; - args[0] = v8::Int32::New(isolate, 0); + JSSmart global_js = context->GetGlobal(); + JSSmart args[1]; + args[0] = CJSContext::createInt(0); - CNativeControl* pNative = NULL; + NSNativeControl::CNativeControl* pNative = NULL; // GET_NATIVE_ENGINE if (!bIsBreak) { - v8::Handle js_func_get_native = global_js->Get(v8::String::NewFromUtf8(isolate, "GetNativeEngine")); - v8::Local objNative; - if (js_func_get_native->IsFunction()) + JSSmart js_result2 = global_js->call_func("GetNativeEngine", 1, args); + if (try_catch->Check()) { - v8::Handle func_get_native = v8::Handle::Cast(js_func_get_native); - v8::Local js_result2 = func_get_native->Call(global_js, 1, args); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"run_code", strCode); - _LOGGING_ERROR_(L"run", strException); - - strError = L"code=\"run\""; - bIsBreak = true; - } - else - { - objNative = js_result2->ToObject(); - v8::Handle field = v8::Handle::Cast(objNative->GetInternalField(0)); - - pNative = static_cast(field->Value()); - pNative->m_sConsoleLogFile = m_sConsoleLogFile; - } + strError = L"code=\"run\""; + bIsBreak = true; + } + else + { + JSSmart objNative = js_result2->toObject(); + pNative = (NSNativeControl::CNativeControl*)objNative->getNative()->getObject(); + pNative->m_sConsoleLogFile = m_sConsoleLogFile; } } @@ -859,67 +677,36 @@ namespace NSDoctRenderer } // Api object - v8::Local js_objectApi; + JSSmart js_objectApi; // OPEN if (!bIsBreak) { - v8::Handle js_func_open = global_js->Get(v8::String::NewFromUtf8(isolate, "NativeOpenFileData")); - if (js_func_open->IsFunction()) + CChangesWorker oWorkerLoader; + int nVersion = oWorkerLoader.OpenNative(pNative->GetFilePath()); + + JSSmart args_open[4]; + args_open[0] = oWorkerLoader.GetDataFull()->toObject()->toValue(); + args_open[1] = CJSContext::createInt(nVersion); + std::wstring sXlsx = NSCommon::GetDirectoryName(pNative->GetFilePath()) + L"/Editor.xlsx"; + args_open[2] = NSFile::CFileBinary::Exists(sXlsx) ? CJSContext::createString(sXlsx) : CJSContext::createUndefined(); + JSSmart globalParams = CJSContext::createObject(); + if (0 < m_oParams.m_nLcid) + globalParams->set("locale", CJSContext::createInt(m_oParams.m_nLcid)); + args_open[3] = globalParams->toValue(); + + global_js->call_func("NativeOpenFileData", 4, args_open); + if (try_catch->Check()) { - v8::Handle func_open = v8::Handle::Cast(js_func_open); + strError = L"code=\"open\""; + bIsBreak = true; + } - CChangesWorker oWorkerLoader; - int nVersion = oWorkerLoader.OpenNative(pNative->GetFilePath()); - - v8::Handle args_open[4]; - args_open[0] = oWorkerLoader.GetDataFull(); - args_open[1] = v8::Integer::New(isolate, nVersion); - - std::wstring sXlsx = NSCommon::GetDirectoryName(pNative->GetFilePath()) + L"/Editor.xlsx"; - if (NSFile::CFileBinary::Exists(sXlsx)) - { - std::string sXlsxA = U_TO_UTF8(sXlsx); - args_open[2] = v8::String::NewFromUtf8(isolate, (char*)(sXlsxA.c_str())); - } - else - { - args_open[2] = v8::Undefined(isolate); - } - - v8::Local globalParams = v8::Object::New(isolate); - if (0 < m_oParams.m_nLcid) - { - globalParams->Set(v8::String::NewFromUtf8(isolate, "locale", v8::String::kNormalString, -1), v8::Int32::New(isolate, m_oParams.m_nLcid)); - } - args_open[3] = globalParams; - - func_open->Call(global_js, 4, args_open); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"open_code", strCode); - _LOGGING_ERROR_(L"open", strException); - - strError = L"code=\"open\""; - bIsBreak = true; - } - - js_objectApi = global_js->Get(v8::String::NewFromUtf8(isolate, "Api"))->ToObject(); - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"api_code", strCode); - _LOGGING_ERROR_(L"api", strException); - - strError = L"code=\"open\""; - bIsBreak = true; - } + js_objectApi = global_js->get("Api")->toObject(); + if (try_catch->Check()) + { + strError = L"code=\"open\""; + bIsBreak = true; } } @@ -928,8 +715,7 @@ namespace NSDoctRenderer // CHANGES if (!bIsBreak) { - v8::Handle js_func_apply_changes = js_objectApi->Get(v8::String::NewFromUtf8(isolate, "asc_nativeApplyChanges2")); - if (m_oParams.m_arChanges.GetCount() != 0) + if (m_oParams.m_arChanges.size() != 0) { int nCurrentIndex = 0; CChangesWorker oWorker; @@ -944,31 +730,19 @@ namespace NSDoctRenderer while (!bIsBreak) { nCurrentIndex = oWorker.Open(m_oParams.m_arChanges, nCurrentIndex); - bool bIsFull = (nCurrentIndex == m_oParams.m_arChanges.GetCount()) ? true : false; + bool bIsFull = (nCurrentIndex == m_oParams.m_arChanges.size()) ? true : false; - if (js_func_apply_changes->IsFunction()) + JSSmart args_changes[2]; + args_changes[0] = oWorker.GetData()->toObject()->toValue(); + args_changes[1] = CJSContext::createBool(bIsFull); + js_objectApi->call_func("asc_nativeApplyChanges2", 2, args_changes); + if (try_catch->Check()) { - v8::Handle func_apply_changes = v8::Handle::Cast(js_func_apply_changes); - v8::Handle args_changes[2]; - args_changes[0] = oWorker.GetData(); - args_changes[1] = v8::Boolean::New(isolate, bIsFull); - - func_apply_changes->Call(js_objectApi, 2, args_changes); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"change_code", strCode); - _LOGGING_ERROR_(L"change", strException); - - char buffer[50]; - sprintf(buffer, "index=\"%d\"", pNative->m_nCurrentChangesNumber - 1); - std::string s(buffer); - strError = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)s.c_str(), (LONG)s.length()); - bIsBreak = true; - } + char buffer[50]; + sprintf(buffer, "index=\"%d\"", pNative->m_nCurrentChangesNumber - 1); + std::string s(buffer); + strError = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)s.c_str(), (LONG)s.length()); + bIsBreak = true; } if (bIsFull) @@ -1030,46 +804,14 @@ namespace NSDoctRenderer } pBaseData[dwSizeBase] = 0; - v8::Handle js_func_mm_start = js_objectApi->Get(v8::String::NewFromUtf8(isolate, "asc_StartMailMergeByList")); + JSSmart args_changes[1]; + args_changes[0] = context->JSON_Parse((char*)(pBaseData + nStart)); - if (js_func_mm_start->IsFunction()) + js_objectApi->call_func("asc_StartMailMergeByList", 1, args_changes); + if (try_catch->Check()) { - v8::Handle func_mm_start = v8::Handle::Cast(js_func_mm_start); - v8::Handle args_changes[1]; - - #ifndef V8_OS_XP - args_changes[0] = v8::JSON::Parse(context, v8::String::NewFromUtf8(isolate, (char*)(pBaseData + nStart))).FromMaybe(v8::Local()); - #else - args_changes[0] = v8::JSON::Parse(v8::String::NewFromUtf8(isolate, (char*)(pBaseData + nStart))); - #endif - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"change_code", strCode); - _LOGGING_ERROR_(L"change", strException); - - strError = L"mailmerge=\"databaseopenjs\""; - bIsBreak = true; - } - - //args_changes[0] = v8::String::NewFromUtf8(isolate, (char*)(pBaseData + nStart)); - - func_mm_start->Call(js_objectApi, 1, args_changes); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"change_code", strCode); - _LOGGING_ERROR_(L"change", strException); - - strError = L"mailmerge=\"databaseopenjs\""; - bIsBreak = true; - } + strError = L"mailmerge=\"databaseopenjs\""; + bIsBreak = true; } } } @@ -1087,27 +829,14 @@ namespace NSDoctRenderer strReturnParams += L""; for (int nIndexMM = m_oParams.m_nMailMergeIndexStart; nIndexMM <= m_oParams.m_nMailMergeIndexEnd && !bIsBreak; ++nIndexMM) { - v8::Handle js_func_mm_preview = js_objectApi->Get(v8::String::NewFromUtf8(isolate, "asc_PreviewMailMergeResult")); + JSSmart args_changes[1]; + args_changes[0] = CJSContext::createInt(nIndexMM); - if (js_func_mm_preview->IsFunction()) + js_objectApi->call_func("asc_PreviewMailMergeResult", 1, args_changes); + if (try_catch->Check()) { - v8::Handle func_mm_preview = v8::Handle::Cast(js_func_mm_preview); - v8::Handle args_changes[1]; - args_changes[0] = v8::Integer::New(v8::Isolate::GetCurrent(), nIndexMM); - - func_mm_preview->Call(js_objectApi, 1, args_changes); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"change_code", strCode); - _LOGGING_ERROR_(L"change", strException); - - strError = L"mailmerge=\"preview" + std::to_wstring(nIndexMM) + L"\""; - bIsBreak = true; - } + strError = L"mailmerge=\"preview" + std::to_wstring(nIndexMM) + L"\""; + bIsBreak = true; } std::wstring sSaveFile = L""; @@ -1117,44 +846,29 @@ namespace NSDoctRenderer std::wstring sSaveOld = m_oParams.m_strDstFilePath; m_oParams.m_strDstFilePath += (L"/file" + std::to_wstring(nIndexMM)); sSaveFile = m_oParams.m_strDstFilePath; - - bIsBreak = Doct_renderer_SaveFile(&m_oParams, pNative, isolate, context, global_js, - args, try_catch, strError, js_objectApi); + bIsBreak = Doct_renderer_SaveFile(&m_oParams, pNative, context, args, strError, js_objectApi); m_oParams.m_strDstFilePath = sSaveOld; } if (!bIsBreak) { - v8::Handle js_func_mm_field = js_objectApi->Get(v8::String::NewFromUtf8(isolate, "asc_GetMailMergeFiledValue")); + JSSmart args_changes[2]; + args_changes[0] = CJSContext::createInt(nIndexMM); + args_changes[1] = CJSContext::createString(sFieldUtf8); - if (js_func_mm_field->IsFunction()) + JSSmart js_result2 = js_objectApi->call_func("asc_GetMailMergeFiledValue", 2, args_changes); + if (try_catch->Check()) { - v8::Handle func_mm_field = v8::Handle::Cast(js_func_mm_field); - v8::Handle args_changes[2]; - args_changes[0] = v8::Integer::New(v8::Isolate::GetCurrent(), nIndexMM); - args_changes[1] = v8::String::NewFromUtf8(isolate, (char*)sFieldUtf8.c_str()); - - v8::Local js_result2 = func_mm_field->Call(js_objectApi, 2, args_changes); - - if (try_catch.HasCaught()) - { - std::wstring strCode = CV8Convert::GetSourceLine(try_catch.Message()); - std::wstring strException = CV8Convert::GetMessage(try_catch.Message()); - - _LOGGING_ERROR_(L"change_code", strCode); - _LOGGING_ERROR_(L"change", strException); - - strError = L"mailmerge=\"field" + std::to_wstring(nIndexMM) + L"\""; - bIsBreak = true; - } - - std::wstring sField = CV8Convert::ToString(js_result2); - NSDoctRenderer::replace_for_xml(sField); - NSDoctRenderer::replace_for_xml(sSaveFile); - - strReturnParams += L""; + strError = L"mailmerge=\"field" + std::to_wstring(nIndexMM) + L"\""; + bIsBreak = true; } + + std::wstring sField = js_result2->toStringW(); + NSDoctRenderer::replace_for_xml(sField); + NSDoctRenderer::replace_for_xml(sSaveFile); + + strReturnParams += L""; } } strReturnParams += L""; @@ -1165,16 +879,13 @@ namespace NSDoctRenderer // SAVE if (!bIsBreak && !bIsMailMerge) { - bIsBreak = Doct_renderer_SaveFile(&m_oParams, pNative, isolate, context, global_js, args, try_catch, strError, js_objectApi); + bIsBreak = Doct_renderer_SaveFile(&m_oParams, pNative, context, args, strError, js_objectApi); } LOGGER_SPEED_LAP("save") } - isolate->Dispose(); - - // теперь вызываем это в x2t - //CV8Worker::Dispose(); + context->Dispose(); return bIsBreak ? false : true; } @@ -1310,7 +1021,7 @@ namespace NSDoctRenderer m_pInternal->m_strFilePath = strFileName; std::string strScript = ""; - for (size_t i = 0; i < m_pInternal->m_arrFiles.GetCount(); ++i) + for (size_t i = 0; i < m_pInternal->m_arrFiles.size(); ++i) { #if 0 if (m_arrFiles[i].find(L"AllFonts.js") != std::wstring::npos) @@ -1361,19 +1072,16 @@ namespace NSDoctRenderer } bool Doct_renderer_SaveFile_ForBuilder(int nFormat, const std::wstring& strDstFile, - CNativeControl* pNative, - v8::Isolate* isolate, - v8::Local context, - v8::Local& global_js, - v8::Handle* args, - v8::TryCatch& try_catch, - std::wstring& strError) + NSNativeControl::CNativeControl* pNative, + JSSmart context, + JSSmart* args, + std::wstring& strError) { NSDoctRenderer::CExecuteParams oParams; oParams.m_eDstFormat = (NSDoctRenderer::DoctRendererFormat::FormatFile)nFormat; oParams.m_strDstFilePath = strDstFile; - v8::Local js_objectApi; // empty + JSSmart js_objectApi; // empty return NSDoctRenderer::CDoctRenderer_Private::Doct_renderer_SaveFile(&oParams, - pNative, isolate, context, global_js, args, try_catch, strError, js_objectApi, false); + pNative, context, args, strError, js_objectApi, false); } diff --git a/DesktopEditor/doctrenderer/doctrenderer.pro b/DesktopEditor/doctrenderer/doctrenderer.pro index 45d91d2f49..06046b64df 100644 --- a/DesktopEditor/doctrenderer/doctrenderer.pro +++ b/DesktopEditor/doctrenderer/doctrenderer.pro @@ -20,14 +20,6 @@ ADD_DEPENDENCY(graphics, kernel, UnicodeConverter) #CONFIG += build_xp -!build_xp { - include(../../Common/3dParty/v8/v8.pri) -} else { - DEFINES += V8_OS_XP - DESTDIR=$$DESTDIR/xp - include(../../Common/3dParty/v8/v8_xp/v8.pri) -} - core_ios { CONFIG += doct_renderer_empty } @@ -43,12 +35,10 @@ HEADERS += \ docbuilder.h SOURCES += \ - memorystream.cpp \ nativecontrol.cpp \ doctrenderer.cpp \ docbuilder.cpp \ - docbuilder_p.cpp \ - nativebuilder.cpp + docbuilder_p.cpp SOURCES += \ ../../Common/OfficeFileFormatChecker2.cpp \ @@ -59,10 +49,40 @@ SOURCES += \ HEADERS += \ docbuilder_p.h \ memorystream.h \ - nativecontrol.h \ - nativebuilder.h + nativecontrol.h + +HEADERS += \ + embed/MemoryStreamEmbed.h \ + embed/NativeControlEmbed.h \ + embed/NativeBuilderEmbed.h \ + js_internal/js_base.h \ + js_internal/v8/v8_base.h + +SOURCES += \ + embed/MemoryStreamEmbed.cpp \ + embed/NativeControlEmbed.cpp \ + embed/NativeBuilderEmbed.cpp \ + embed/v8/v8_MemoryStream.cpp \ + embed/v8/v8_NativeControl.cpp \ + embed/v8/v8_NativeBuilder.cpp } +!use_javascript_core { + SOURCES += js_internal/v8/v8_base.cpp + + !build_xp { + include(../../Common/3dParty/v8/v8.pri) + } else { + DEFINES += V8_OS_XP + DESTDIR=$$DESTDIR/xp + include(../../Common/3dParty/v8/v8_xp/v8.pri) + } +} else { + OBJECTIVE_SOURCES += js_internal/jsc/jsc_base.mm + LIBS += -framework JavaScriptCore +} + + # downloader DEFINES += BUIDLER_OPEN_DOWNLOAD_ENABLED DEFINES += BUIDLER_OPEN_BASE64_ENABLED diff --git a/DesktopEditor/doctrenderer/doctrenderer_empty.cpp b/DesktopEditor/doctrenderer/doctrenderer_empty.cpp index 2ac8ce9e1e..06627155a7 100644 --- a/DesktopEditor/doctrenderer/doctrenderer_empty.cpp +++ b/DesktopEditor/doctrenderer/doctrenderer_empty.cpp @@ -82,9 +82,6 @@ namespace NSDoctRenderer bool CDocBuilder::IsSaveWithDoctrendererMode() { return false; } char* CDocBuilder::GetVersion() { return "0.0"; } - - void CDocBuilder::Initialize() {} - void CDocBuilder::Dispose() {} } namespace NSDoctRenderer diff --git a/DesktopEditor/doctrenderer/embed/MemoryStreamEmbed.cpp b/DesktopEditor/doctrenderer/embed/MemoryStreamEmbed.cpp new file mode 100644 index 0000000000..fe8a8d3b1c --- /dev/null +++ b/DesktopEditor/doctrenderer/embed/MemoryStreamEmbed.cpp @@ -0,0 +1,66 @@ +#include "MemoryStreamEmbed.h" + +JSSmart CMemoryStreamEmbed::Copy(JSSmart stream, JSSmart pos, JSSmart len) +{ + JSSmart _obj = stream->toObject(); + NSMemoryStream::CMemoryStream* pStream = (NSMemoryStream::CMemoryStream*)(_obj->getNative()); + m_pInternal->Copy(pStream, pos->toInt32(), len->toInt32()); + return NULL; +} + +JSSmart CMemoryStreamEmbed::ClearNoAttack() +{ + m_pInternal->ClearNoAttack(); + return NULL; +} + +JSSmart CMemoryStreamEmbed::WriteByte(JSSmart value) +{ + m_pInternal->WriteBYTE((BYTE)value->toInt32()); + return NULL; +} + +JSSmart CMemoryStreamEmbed::WriteBool(JSSmart value) +{ + m_pInternal->WriteBYTE(value->toBool() ? 1 : 0); + return NULL; +} + +JSSmart CMemoryStreamEmbed::WriteLong(JSSmart value) +{ + m_pInternal->WriteLONG((LONG)value->toInt32()); + return NULL; +} + +JSSmart CMemoryStreamEmbed::WriteDouble(JSSmart value) +{ + m_pInternal->WriteLONG((LONG)(value->toDouble() * 100000)); + return NULL; +} + +JSSmart CMemoryStreamEmbed::WriteDouble2(JSSmart value) +{ + m_pInternal->WriteDouble(value->toDouble()); + return NULL; +} + +JSSmart CMemoryStreamEmbed::WriteStringA(JSSmart value) +{ + std::string param = value->toStringA(); + m_pInternal->WriteStringA2(param.c_str(), (int)param.length()); + return NULL; +} + +JSSmart CMemoryStreamEmbed::WriteString(JSSmart value) +{ + std::wstring param = value->toStringW(); + m_pInternal->WriteString(param.c_str(), (int)param.length()); + return NULL; +} + +JSSmart CMemoryStreamEmbed::WriteString2(JSSmart value) +{ + std::wstring param = value->toStringW(); + m_pInternal->WriteString2(param.c_str(), (int)param.length()); + return NULL; +} diff --git a/DesktopEditor/doctrenderer/embed/MemoryStreamEmbed.h b/DesktopEditor/doctrenderer/embed/MemoryStreamEmbed.h new file mode 100644 index 0000000000..f7ae41856f --- /dev/null +++ b/DesktopEditor/doctrenderer/embed/MemoryStreamEmbed.h @@ -0,0 +1,35 @@ +#ifndef _BUILD_NATIVE_MEMORYSTREAM_EMBED_H_ +#define _BUILD_NATIVE_MEMORYSTREAM_EMBED_H_ + +#include "../memorystream.h" +#include "../js_internal/js_base.h" + +using namespace NSJSBase; +class CMemoryStreamEmbed : public CJSEmbedObject +{ +public: + NSMemoryStream::CMemoryStream* m_pInternal; + +public: + CMemoryStreamEmbed() : m_pInternal(new NSMemoryStream::CMemoryStream()) {} + ~CMemoryStreamEmbed() { RELEASEOBJECT(m_pInternal); } + + virtual void* getObject() override { return (void*)m_pInternal; } + +public: + JSSmart Copy(JSSmart stream, JSSmart pos, JSSmart len); + JSSmart ClearNoAttack(); + + JSSmart WriteByte(JSSmart value); + JSSmart WriteBool(JSSmart value); + JSSmart WriteLong(JSSmart value); + JSSmart WriteDouble(JSSmart value); + JSSmart WriteDouble2(JSSmart value); + JSSmart WriteStringA(JSSmart value); + JSSmart WriteString(JSSmart value); + JSSmart WriteString2(JSSmart value); + + static void CreateObjectInContext(const std::string& name, JSSmart context); +}; + +#endif // _BUILD_NATIVE_MEMORYSTREAM_EMBED_H_ diff --git a/DesktopEditor/doctrenderer/embed/NativeBuilderEmbed.cpp b/DesktopEditor/doctrenderer/embed/NativeBuilderEmbed.cpp new file mode 100644 index 0000000000..31e6c19081 --- /dev/null +++ b/DesktopEditor/doctrenderer/embed/NativeBuilderEmbed.cpp @@ -0,0 +1,75 @@ +#include "NativeBuilderEmbed.h" + +#include "../../common/Directory.h" +#include "../../fontengine/application_generate_fonts_common.h" + +JSSmart CBuilderEmbed::builder_OpenFile(JSSmart sPath, JSSmart sParams) +{ + std::wstring Path = sPath->toStringW(); + std::wstring Params = sParams->toStringW(); + int ret = m_pBuilder->OpenFile(Path.c_str(), Params.c_str()); + return CJSContext::createInt(ret); +} +JSSmart CBuilderEmbed::builder_CreateFile(JSSmart type) +{ + bool ret = m_pBuilder->CreateFile(type->toInt32()); + return CJSContext::createBool(ret); +} +JSSmart CBuilderEmbed::builder_SetTmpFolder(JSSmart path) +{ + std::wstring sPath = path->toStringW(); + m_pBuilder->SetTmpFolder(sPath.c_str()); + return NULL; +} +JSSmart CBuilderEmbed::builder_SaveFile(JSSmart t, JSSmart path, JSSmart params) +{ + int type = t->toInt32(); + std::wstring sPath = path->toStringW(); + std::wstring sParams = params->toStringW(); + int ret = m_pBuilder->SaveFile(type, sPath.c_str(), sParams.empty() ? NULL : sParams.c_str()); + return CJSContext::createInt(ret); +} +JSSmart CBuilderEmbed::builder_CloseFile() +{ + m_pBuilder->CloseFile(); + return NULL; +} + + +JSSmart CBuilderDocumentEmbed::builder_doc_IsValid() +{ + return CJSContext::createBool(m_bIsValid); +} +JSSmart CBuilderDocumentEmbed::builder_doc_GetBinary() +{ + BYTE* pData = NULL; + DWORD dwSize = 0; + NSFile::CFileBinary::ReadAllBytes(m_sFolder + L"/Editor.bin", &pData, dwSize); + + return 0 == dwSize ? NULL : CJSContext::createUint8Array(pData, (int)dwSize); +} +JSSmart CBuilderDocumentEmbed::builder_doc_GetFolder() +{ + return CJSContext::createString(m_sFolder); +} +JSSmart CBuilderDocumentEmbed::builder_doc_CloseFile() +{ + CloseFile(); + return NULL; +} +JSSmart CBuilderDocumentEmbed::builder_doc_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; + NSCommon::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(); +} diff --git a/DesktopEditor/doctrenderer/nativebuilder.h b/DesktopEditor/doctrenderer/embed/NativeBuilderEmbed.h similarity index 53% rename from DesktopEditor/doctrenderer/nativebuilder.h rename to DesktopEditor/doctrenderer/embed/NativeBuilderEmbed.h index 2773dae7fe..f38bf39263 100644 --- a/DesktopEditor/doctrenderer/nativebuilder.h +++ b/DesktopEditor/doctrenderer/embed/NativeBuilderEmbed.h @@ -32,31 +32,30 @@ #ifndef NATIVECONTROLBUILDER #define NATIVECONTROLBUILDER -#include "nativecontrol.h" -#include "docbuilder.h" +#include "../docbuilder.h" +#include "../js_internal/js_base.h" -namespace NSDoctRenderer -{ - class CDocBuilderJS - { - public: - CDocBuilderJS() {} - virtual ~CDocBuilderJS() {} - public: - CDocBuilder_Private* GetPrivate(NSDoctRenderer::CDocBuilder* pBuilder) { return pBuilder->m_pInternal; } - }; -} - -class CBuilderEmbed : public NSDoctRenderer::CDocBuilderJS +using namespace NSJSBase; +class CBuilderEmbed : public CJSEmbedObject { public: NSDoctRenderer::CDocBuilder* m_pBuilder; - CBuilderEmbed() { m_pBuilder = NULL; } - ~CBuilderEmbed() {} + CBuilderEmbed() : m_pBuilder(NULL) {} + ~CBuilderEmbed() { if(m_pBuilder) RELEASEOBJECT(m_pBuilder); } + + virtual void* getObject() { return (void*)m_pBuilder; } + +public: + JSSmart builder_OpenFile(JSSmart sPath, JSSmart sParams); + JSSmart builder_CreateFile(JSSmart type); + JSSmart builder_SetTmpFolder(JSSmart path); + JSSmart builder_SaveFile(JSSmart t, JSSmart path, JSSmart params); + JSSmart builder_CloseFile(); + JSSmart builder_OpenTmpFile(JSSmart path, JSSmart params); }; -class CBuilderDocumentEmbed : public NSDoctRenderer::CDocBuilderJS +class CBuilderDocumentEmbed : public CJSEmbedObject { public: NSDoctRenderer::CDocBuilder* m_pBuilder; @@ -64,32 +63,25 @@ public: std::wstring m_sFolder; public: - CBuilderDocumentEmbed() - { - m_pBuilder = NULL; - m_bIsValid = false; - } + CBuilderDocumentEmbed() : m_pBuilder(NULL), m_bIsValid(false) {} + ~CBuilderDocumentEmbed() { if(m_pBuilder) RELEASEOBJECT(m_pBuilder); } + + virtual void* getObject() { return (void*)m_pBuilder; } + NSDoctRenderer::CDocBuilder_Private* GetPrivate(NSDoctRenderer::CDocBuilder* pBuilder) { return pBuilder->GetPrivate(); } public: void OpenFile(const std::wstring& sFile, const std::wstring& sParams); void CloseFile(); + +public: + JSSmart builder_doc_IsValid(); + JSSmart builder_doc_GetBinary(); + JSSmart builder_doc_GetFolder(); + JSSmart builder_doc_CloseFile(); + JSSmart builder_doc_GetImageMap(); }; -void _builder_OpenFile(const v8::FunctionCallbackInfo& args); -void _builder_CreateFile(const v8::FunctionCallbackInfo& args); -void _builder_SetTmpFolder(const v8::FunctionCallbackInfo& args); -void _builder_SaveFile(const v8::FunctionCallbackInfo& args); -void _builder_CloseFile(const v8::FunctionCallbackInfo& args); - -void _builder_OpenTmpFile(const v8::FunctionCallbackInfo& args); - -void _builder_doc_IsValid(const v8::FunctionCallbackInfo& args); -void _builder_doc_GetBinary(const v8::FunctionCallbackInfo& args); -void _builder_doc_GetFolder(const v8::FunctionCallbackInfo& args); -void _builder_doc_CloseFile(const v8::FunctionCallbackInfo& args); -void _builder_doc_GetImageMap(const v8::FunctionCallbackInfo& args); - -v8::Local _builder_CreateNativeTmpDoc(v8::Isolate* isolate, NSDoctRenderer::CDocBuilder* pBuilder, const std::wstring& sFile, const std::wstring& sParams); -v8::Local _builder_CreateNative(v8::Isolate* isolate, NSDoctRenderer::CDocBuilder* builder); +void builder_CreateNative(const std::string& name, JSSmart context, NSDoctRenderer::CDocBuilder* builder); +void builder_CreateNativeTmpDoc(const std::string& name, JSSmart context, NSDoctRenderer::CDocBuilder* builder, const std::wstring& sFile, const std::wstring& sParams); #endif // NATIVECONTROLBUILDER diff --git a/DesktopEditor/doctrenderer/embed/NativeControlEmbed.cpp b/DesktopEditor/doctrenderer/embed/NativeControlEmbed.cpp new file mode 100644 index 0000000000..e6d9691515 --- /dev/null +++ b/DesktopEditor/doctrenderer/embed/NativeControlEmbed.cpp @@ -0,0 +1,251 @@ +#include "NativeControlEmbed.h" + +JSSmart CNativeControlEmbed::SetFilePath(JSSmart path) +{ + m_pInternal->SetFilePath(path->toStringW()); + return NULL; +} + +JSSmart CNativeControlEmbed::GetFilePath() +{ + return CJSContext::createString(m_pInternal->GetFilePath()); +} + +JSSmart CNativeControlEmbed::SetFileId(JSSmart fileId) +{ + m_pInternal->SetFileId(fileId->toStringW()); + return NULL; +} + +JSSmart CNativeControlEmbed::GetFileId() +{ + return CJSContext::createString(m_pInternal->GetFileId()); +} + +JSSmart CNativeControlEmbed::GetFileBinary(JSSmart file) +{ + BYTE* pData = NULL; + DWORD len = 0; + m_pInternal->getFileData(file->toStringW(), pData, len); + // TODO: copy (use gc) + return CJSContext::createUint8Array(pData, (int)len); +} + +JSSmart CNativeControlEmbed::GetFontBinary(JSSmart file) +{ + BYTE* pData = NULL; + DWORD len = 0; + std::wstring strDir = m_pInternal->m_strFontsDirectory; + + #if 0 + if (!strDir.empty()) + { + strDir += L"/"; + strDir += file->toStringW(); + } + #endif + + // TODO: + // по идее файлы могут совпадать по имени, но лежать в разных директориях. + // и поэтому в AllFonts.js надо бы писать пути полные. + // пока оставим по-старому + std::wstring sFind = file->toStringW(); + bool bIsFullFilePath = (std::wstring::npos != sFind.find('\\') || std::wstring::npos != sFind.find('/')); + if (bIsFullFilePath) + { + bIsFullFilePath = NSFile::CFileBinary::Exists(sFind); + } + + if (!bIsFullFilePath) + { + std::map::iterator pair = m_pInternal->m_map_fonts.find(sFind); + if (pair != m_pInternal->m_map_fonts.end()) + strDir = pair->second; + else + strDir = m_pInternal->m_sDefaultFont; + } + else + { + strDir = sFind; + } + + m_pInternal->getFileData(strDir, pData, len); + // TODO: copy (use gc) + return CJSContext::createUint8Array(pData, (int)len); +} + +JSSmart CNativeControlEmbed::GetFontsDirectory() +{ + return CJSContext::createString(m_pInternal->m_strFontsDirectory); +} + +JSSmart CNativeControlEmbed::GetFileString(JSSmart file) +{ + BYTE* pData = NULL; + DWORD len = 0; + m_pInternal->getFileData(file->toStringW(), pData, len); + + if (pData != NULL && len > 0) + { + JSSmart _ret = CJSContext::createUint8Array((BYTE* )pData, (int)len); + return _ret; + } + + return CJSContext::createNull(); +} + +JSSmart CNativeControlEmbed::GetEditorType() +{ + return CJSContext::createString(m_pInternal->m_strEditorType); +} + +JSSmart CNativeControlEmbed::CheckNextChange() +{ + m_pInternal->m_nCurrentChangesNumber++; + if (-1 != m_pInternal->m_nMaxChangesNumber) + { + if (m_pInternal->m_nCurrentChangesNumber >= m_pInternal->m_nMaxChangesNumber) + { + return CJSContext::createBool(false); + } + } + return CJSContext::createBool(true); +} + +JSSmart CNativeControlEmbed::GetCountChanges() +{ + int nCount = 0; + if (m_pInternal->m_pChanges != NULL) + { + nCount = (int)m_pInternal->m_pChanges->size(); + } + + return CJSContext::createInt(nCount); +} + +JSSmart CNativeControlEmbed::GetChangesFile(JSSmart index) +{ + int nIndex = index->toInt32(); + std::wstring strFile = L""; + if (m_pInternal->m_pChanges != NULL) + strFile = (*m_pInternal->m_pChanges)[nIndex]; + return CJSContext::createString(strFile); +} + +JSSmart CNativeControlEmbed::Save_AllocNative(JSSmart nLen) +{ + int Len = nLen->toInt32(); + m_pInternal->Save_Alloc(Len); + return CJSContext::createUint8Array(m_pInternal->m_pSaveBinary, m_pInternal->m_nSaveLen); +} + +JSSmart CNativeControlEmbed::Save_ReAllocNative(JSSmart pos, JSSmart len) +{ + int _pos = pos->toInt32(); + int _len = len->toInt32(); + m_pInternal->Save_ReAlloc(_pos, _len); + return CJSContext::createUint8Array(m_pInternal->m_pSaveBinary, m_pInternal->m_nSaveLen); +} + +JSSmart CNativeControlEmbed::Save_End(JSSmart pos, JSSmart len) +{ + std::string sHeader = pos->toStringA(); + int _len = len->toInt32(); + m_pInternal->Save_End(sHeader, _len); + return NULL; +} + +JSSmart CNativeControlEmbed::AddImageInChanges(JSSmart img) +{ + std::wstring sImage = img->toStringW(); + if (sImage.empty()) + return NULL; + + std::map::const_iterator iter = m_pInternal->m_mapImagesInChanges.find(sImage); + if (iter == m_pInternal->m_mapImagesInChanges.end()) + m_pInternal->m_mapImagesInChanges.insert(std::pair(sImage, true)); + return NULL; +} + +JSSmart CNativeControlEmbed::ConsoleLog(JSSmart message) +{ + m_pInternal->ConsoleLog(message->toStringA()); + return NULL; +} + +JSSmart CNativeControlEmbed::SaveChanges(JSSmart sParam, JSSmart nDeleteIndex, JSSmart nCount) +{ + m_pInternal->DumpChanges(sParam->toStringA(), nDeleteIndex->toInt32(), nCount->toInt32()); + return NULL; +} + +JSSmart CNativeControlEmbed::zipOpenFile(JSSmart name) +{ + bool bIsOpen = m_pInternal->m_oZipWorker.Open(name->toStringW()); + if (!bIsOpen) + return CJSContext::createNull(); + + JSSmart obj = CJSContext::createObject(); + for (std::vector::iterator i = m_pInternal->m_oZipWorker.m_arFiles.begin(); i != m_pInternal->m_oZipWorker.m_arFiles.end(); i++) + { + std::string sFile = NSFile::CUtf8Converter::GetUtf8StringFromUnicode(*i); + obj->set(sFile.c_str(), CJSContext::createString(sFile)); + } + + return obj->toValue(); +} + +JSSmart CNativeControlEmbed::zipOpenFileBase64(JSSmart name) +{ + bool bIsOpen = m_pInternal->m_oZipWorker.OpenBase64(name->toStringA()); + if (!bIsOpen) + return CJSContext::createNull(); + + JSSmart obj = CJSContext::createObject(); + for (std::vector::iterator i = m_pInternal->m_oZipWorker.m_arFiles.begin(); i != m_pInternal->m_oZipWorker.m_arFiles.end(); i++) + { + std::string sFile = NSFile::CUtf8Converter::GetUtf8StringFromUnicode(*i); + obj->set(sFile.c_str(), CJSContext::createString(sFile)); + } + + return obj->toValue(); +} + +JSSmart CNativeControlEmbed::zipGetFileAsString(JSSmart name) +{ + BYTE* pData = NULL; + DWORD len = 0; + m_pInternal->m_oZipWorker.GetFileData(name->toStringW(), pData, len); + return CJSContext::createString((char*)pData, len); +} + +JSSmart CNativeControlEmbed::zipGetFileAsBinary(JSSmart name) +{ + BYTE* pData = NULL; + DWORD len = 0; + m_pInternal->m_oZipWorker.GetFileData(name->toStringW(), pData, len); + return CJSContext::createUint8Array(pData, (int)len); +} + +JSSmart CNativeControlEmbed::zipCloseFile() +{ + m_pInternal->m_oZipWorker.Close(); + return NULL; +} + +JSSmart CNativeControlEmbed::GetImageUrl(JSSmart sUrl) +{ + std::wstring Url = sUrl->toStringW(); + + if (!m_pInternal->m_pWorker) + m_pInternal->m_pWorker = new CImagesWorker(m_pInternal->m_strImagesDirectory); + + std::wstring sRet = m_pInternal->m_pWorker->GetImage(Url); + + return CJSContext::createString(sRet); +} + +JSSmart CNativeControlEmbed::GetImagesPath() +{ + return CJSContext::createString(m_pInternal->m_strImagesDirectory); +} diff --git a/DesktopEditor/doctrenderer/embed/NativeControlEmbed.h b/DesktopEditor/doctrenderer/embed/NativeControlEmbed.h new file mode 100644 index 0000000000..8c0cd99a61 --- /dev/null +++ b/DesktopEditor/doctrenderer/embed/NativeControlEmbed.h @@ -0,0 +1,51 @@ +#ifndef _BUILD_NATIVE_NATIVECONTROL_EMBED_H_ +#define _BUILD_NATIVE_NATIVECONTROL_EMBED_H_ + +#include "../nativecontrol.h" +#include "../js_internal/js_base.h" + +using namespace NSJSBase; +class CNativeControlEmbed : public CJSEmbedObject +{ +public: + NSNativeControl::CNativeControl* m_pInternal; + CZipWorker m_oZipWorker; +public: + CNativeControlEmbed() : m_pInternal(new NSNativeControl::CNativeControl()) {} + ~CNativeControlEmbed() { RELEASEOBJECT(m_pInternal); } + + virtual void* getObject() override { return (void*)m_pInternal; } + +public: + + JSSmart SetFilePath(JSSmart path); + JSSmart GetFilePath(); + JSSmart SetFileId(JSSmart fileId); + JSSmart GetFileId(); + JSSmart GetFileBinary(JSSmart file); + JSSmart GetFontBinary(JSSmart file); + JSSmart GetFontsDirectory(); + JSSmart GetFileString(JSSmart file); + JSSmart GetEditorType(); + JSSmart CheckNextChange(); + JSSmart GetCountChanges(); + JSSmart GetChangesFile(JSSmart index); + JSSmart Save_AllocNative(JSSmart nLen); + JSSmart Save_ReAllocNative(JSSmart pos, JSSmart len); + JSSmart Save_End(JSSmart pos, JSSmart len); + JSSmart AddImageInChanges(JSSmart img); + JSSmart ConsoleLog(JSSmart message); + JSSmart SaveChanges(JSSmart sParam, JSSmart nDeleteIndex, JSSmart nCount); + JSSmart zipOpenFile(JSSmart name); + JSSmart zipOpenFileBase64(JSSmart name); + JSSmart zipGetFileAsString(JSSmart name); + JSSmart zipGetFileAsBinary(JSSmart name); + JSSmart zipCloseFile(); + JSSmart GetImageUrl(JSSmart sUrl); + JSSmart GetImagesPath(); + + static void CreateObjectInContext(const std::string& name, JSSmart context); + static void CreateObjectBuilderInContext(const std::string& name, JSSmart context); +}; + +#endif // _BUILD_NATIVE_NATIVECONTROL_EMBED_H_ diff --git a/DesktopEditor/doctrenderer/embed/v8/v8_MemoryStream.cpp b/DesktopEditor/doctrenderer/embed/v8/v8_MemoryStream.cpp new file mode 100644 index 0000000000..3932cff241 --- /dev/null +++ b/DesktopEditor/doctrenderer/embed/v8/v8_MemoryStream.cpp @@ -0,0 +1,68 @@ +#include "../MemoryStreamEmbed.h" +#include "../../js_internal/v8/v8_base.h" + +namespace NSMemoryStream +{ + #define CURRENTWRAPPER CMemoryStreamEmbed + + FUNCTION_WRAPPER_V8_1(_ms_write_byte, WriteByte) + FUNCTION_WRAPPER_V8_1(_ms_write_bool, WriteBool) + FUNCTION_WRAPPER_V8_1(_ms_write_long, WriteLong) + FUNCTION_WRAPPER_V8_1(_ms_write_double, WriteDouble) + FUNCTION_WRAPPER_V8_1(_ms_write_double2, WriteDouble2) + FUNCTION_WRAPPER_V8_1(_ms_writestringA, WriteStringA) + FUNCTION_WRAPPER_V8_1(_ms_writestring1, WriteString) + FUNCTION_WRAPPER_V8_1(_ms_writestring2, WriteString2) + FUNCTION_WRAPPER_V8_3(_ms_copy, Copy) + FUNCTION_WRAPPER_V8(_ms_clearnoattack, ClearNoAttack) + + void _ms_pos(v8::Local name, const v8::PropertyCallbackInfo& args) + { + CMemoryStreamEmbed* _this = (CMemoryStreamEmbed*)unwrap_native(args.This()); + args.GetReturnValue().Set(v8::Integer::New(CV8Worker::GetCurrent(), _this->m_pInternal->GetSize())); + } + + v8::Handle CreateMemoryStreamTemplate(v8::Isolate* isolate) + { + v8::EscapableHandleScope handle_scope(isolate); + + v8::Local result = v8::ObjectTemplate::New(V8IsolateOneArg); + result->SetInternalFieldCount(1); + + // property + result->SetAccessor(CreateV8String(CV8Worker::GetCurrent(), "pos"), _ms_pos); + + NSV8Objects::Template_Set(result, "Copy", _ms_copy); + NSV8Objects::Template_Set(result, "ClearNoAttack", _ms_clearnoattack); + NSV8Objects::Template_Set(result, "WriteByte", _ms_write_byte); + NSV8Objects::Template_Set(result, "WriteBool", _ms_write_bool); + NSV8Objects::Template_Set(result, "WriteLong", _ms_write_long); + NSV8Objects::Template_Set(result, "WriteDouble", _ms_write_double); + NSV8Objects::Template_Set(result, "WriteDouble2", _ms_write_double2); + NSV8Objects::Template_Set(result, "WriteStringA", _ms_writestringA); + NSV8Objects::Template_Set(result, "WriteString", _ms_writestring1); + NSV8Objects::Template_Set(result, "WriteString2", _ms_writestring2); + + return handle_scope.Escape(result); + } + + void CreateNativeMemoryStream(const v8::FunctionCallbackInfo& args) + { + v8::Isolate* isolate = args.GetIsolate(); + v8::HandleScope scope(isolate); + + v8::Handle MemoryObjectTemplate = NSMemoryStream::CreateMemoryStreamTemplate(isolate); + CMemoryStreamEmbed* pMemoryObject = new CMemoryStreamEmbed(); + + v8::Local obj = MemoryObjectTemplate->NewInstance(isolate->GetCurrentContext()).ToLocalChecked(); + obj->SetInternalField(0, v8::External::New(CV8Worker::GetCurrent(), pMemoryObject)); + + args.GetReturnValue().Set(obj); + } + } + +void CMemoryStreamEmbed::CreateObjectInContext(const std::string& name, JSSmart context) +{ + v8::Isolate* current = CV8Worker::GetCurrent(); + context->m_internal->m_global->Set(current, name.c_str(), v8::FunctionTemplate::New(current, NSMemoryStream::CreateNativeMemoryStream)); +} diff --git a/DesktopEditor/doctrenderer/embed/v8/v8_NativeBuilder.cpp b/DesktopEditor/doctrenderer/embed/v8/v8_NativeBuilder.cpp new file mode 100644 index 0000000000..b4d26b347c --- /dev/null +++ b/DesktopEditor/doctrenderer/embed/v8/v8_NativeBuilder.cpp @@ -0,0 +1,151 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2019 + * + * 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-12 Ernesta Birznieka-Upisha + * 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 + * + */ +#include "../NativeBuilderEmbed.h" +#include "../../docbuilder_p.h" +#include "../../js_internal/v8/v8_base.h" + +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); + + NSCommon::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) + m_bIsValid = true; +} +void CBuilderDocumentEmbed::CloseFile() +{ + if (!m_sFolder.empty()) + NSDirectory::DeleteDirectory(m_sFolder); + m_bIsValid = false; + m_sFolder = L""; +} + +#define CURRENTWRAPPER CBuilderEmbed + +FUNCTION_WRAPPER_V8_2(_builder_OpenFile, builder_OpenFile) +FUNCTION_WRAPPER_V8_1(_builder_CreateFile, builder_CreateFile) +FUNCTION_WRAPPER_V8_1(_builder_SetTmpFolder, builder_SetTmpFolder) +FUNCTION_WRAPPER_V8_3(_builder_SaveFile, builder_SaveFile) +FUNCTION_WRAPPER_V8 (_builder_CloseFile, builder_CloseFile) +FUNCTION_WRAPPER_V8_2(_builder_OpenTmpFile, builder_OpenTmpFile) + +#undef CURRENTWRAPPER +#define CURRENTWRAPPER CBuilderDocumentEmbed + +FUNCTION_WRAPPER_V8(_builder_doc_IsValid, builder_doc_IsValid) +FUNCTION_WRAPPER_V8(_builder_doc_GetBinary, builder_doc_GetBinary) +FUNCTION_WRAPPER_V8(_builder_doc_GetFolder, builder_doc_GetFolder) +FUNCTION_WRAPPER_V8(_builder_doc_CloseFile, builder_doc_CloseFile) +FUNCTION_WRAPPER_V8(_builder_doc_GetImageMap, builder_doc_GetImageMap) + +v8::Local _builder_CreateNativeTmpDoc(v8::Isolate* isolate, NSDoctRenderer::CDocBuilder* pBuilder, const std::wstring& sFile, const std::wstring& sParams) +{ + v8::Local _template = v8::ObjectTemplate::New(isolate); + _template->SetInternalFieldCount(1); // отводим в нем место для хранения CNativeControl + + NSV8Objects::Template_Set(_template, "IsValid", _builder_doc_IsValid); + NSV8Objects::Template_Set(_template, "GetBinary", _builder_doc_GetBinary); + NSV8Objects::Template_Set(_template, "GetFolder", _builder_doc_GetFolder); + NSV8Objects::Template_Set(_template, "Close", _builder_doc_CloseFile); + NSV8Objects::Template_Set(_template, "GetImageMap", _builder_doc_GetImageMap); + + CBuilderDocumentEmbed* _embed = new CBuilderDocumentEmbed(); + _embed->m_pBuilder = pBuilder; + _embed->OpenFile(sFile, sParams); + + v8::Local obj = _template->NewInstance(V8ContextOneArg).ToLocalChecked(); + obj->SetInternalField(0, v8::External::New(isolate, _embed)); + + return obj; +} +v8::Local _builder_CreateNative(v8::Isolate* isolate, NSDoctRenderer::CDocBuilder* builder) +{ + v8::Local _template = v8::ObjectTemplate::New(isolate); + _template->SetInternalFieldCount(1); + + NSV8Objects::Template_Set(_template, "OpenFile", _builder_OpenFile); + NSV8Objects::Template_Set(_template, "CreateFile", _builder_CreateFile); + NSV8Objects::Template_Set(_template, "SetTmpFolder", _builder_SetTmpFolder); + NSV8Objects::Template_Set(_template, "SaveFile", _builder_SaveFile); + NSV8Objects::Template_Set(_template, "CloseFile", _builder_CloseFile); + NSV8Objects::Template_Set(_template, "OpenTmpFile", _builder_OpenTmpFile); + + CBuilderEmbed* _embed = new CBuilderEmbed(); + _embed->m_pBuilder = builder; + + v8::Local obj = _template->NewInstance(V8ContextOneArg).ToLocalChecked(); + obj->SetInternalField(0, v8::External::New(isolate, _embed)); + + return obj; +} + +void builder_CreateNativeTmpDoc(const std::string& name, JSSmart context, NSDoctRenderer::CDocBuilder* builder, const std::wstring& sFile, const std::wstring& sParams) +{ + v8::Isolate* current = CV8Worker::GetCurrent(); + context->m_internal->m_context->Global()->Set(context->m_internal->m_context, CreateV8String(current, name.c_str()), _builder_CreateNativeTmpDoc(current, builder, sFile, sParams)); +} +void builder_CreateNative (const std::string& name, JSSmart context, NSDoctRenderer::CDocBuilder* builder) +{ + v8::Isolate* current = CV8Worker::GetCurrent(); + context->m_internal->m_context->Global()->Set(context->m_internal->m_context, CreateV8String(current, name.c_str()), _builder_CreateNative(current, builder)); +} + +JSSmart CBuilderEmbed::builder_OpenTmpFile(JSSmart path, JSSmart params) +{ + std::wstring sPath = path->toStringW(); + std::wstring sParams = params->toStringW(); + v8::Local obj = _builder_CreateNativeTmpDoc(CV8Worker::GetCurrent(), m_pBuilder, sPath, sParams); + CJSValueV8* res = new CJSValueV8(); + res->value = obj; + return res; +} diff --git a/DesktopEditor/doctrenderer/embed/v8/v8_NativeControl.cpp b/DesktopEditor/doctrenderer/embed/v8/v8_NativeControl.cpp new file mode 100644 index 0000000000..f8f5d5f940 --- /dev/null +++ b/DesktopEditor/doctrenderer/embed/v8/v8_NativeControl.cpp @@ -0,0 +1,146 @@ +#include "../NativeControlEmbed.h" +#include "../../js_internal/v8/v8_base.h" + +namespace NSNativeControl +{ + #define CURRENTWRAPPER CNativeControlEmbed + + FUNCTION_WRAPPER_V8(_GetFilePath, GetFilePath) + FUNCTION_WRAPPER_V8_1(_SetFilePath, SetFilePath) + FUNCTION_WRAPPER_V8(_GetFileId, GetFileId) + FUNCTION_WRAPPER_V8_1(_SetFileId, SetFileId) + FUNCTION_WRAPPER_V8_1(_GetFileArrayBuffer, GetFileBinary) + FUNCTION_WRAPPER_V8_1(_GetFontArrayBuffer, GetFontBinary) + FUNCTION_WRAPPER_V8(_GetFontsDirectory, GetFontsDirectory) + FUNCTION_WRAPPER_V8_1(_GetFileString, GetFileString) + FUNCTION_WRAPPER_V8(_GetEditorType, GetEditorType) + FUNCTION_WRAPPER_V8(_CheckNextChange, CheckNextChange) + FUNCTION_WRAPPER_V8(_GetChangesCount, GetCountChanges) + FUNCTION_WRAPPER_V8_1(_GetChangesFile, GetChangesFile) + FUNCTION_WRAPPER_V8_1(_Save_AllocNative, Save_AllocNative) + FUNCTION_WRAPPER_V8_2(_Save_ReAllocNative, Save_ReAllocNative) + FUNCTION_WRAPPER_V8_2(_Save_End, Save_End) + FUNCTION_WRAPPER_V8_1(_AddImageInChanges, AddImageInChanges) + FUNCTION_WRAPPER_V8_1(_ConsoleLog, ConsoleLog) + FUNCTION_WRAPPER_V8_3(_SaveChanges, SaveChanges) + FUNCTION_WRAPPER_V8_1(_zipOpenFile, zipOpenFile) + FUNCTION_WRAPPER_V8_1(_zipOpenFileBase64, zipOpenFileBase64) + FUNCTION_WRAPPER_V8_1(_zipGetFileAsString, zipGetFileAsString) + FUNCTION_WRAPPER_V8_1(_zipGetFileAsBinary, zipGetFileAsBinary) + FUNCTION_WRAPPER_V8(_zipCloseFile, zipCloseFile) + FUNCTION_WRAPPER_V8_1(_GetImageUrl, GetImageUrl) + FUNCTION_WRAPPER_V8(_GetImagesPath, GetImagesPath) + + v8::Handle CreateNativeControlTemplate(v8::Isolate* isolate) + { + v8::EscapableHandleScope handle_scope(isolate); + + v8::Local result = v8::ObjectTemplate::New(V8IsolateOneArg); + result->SetInternalFieldCount(1); + + NSV8Objects::Template_Set(result, "SetFilePath", _SetFilePath); + NSV8Objects::Template_Set(result, "GetFilePath", _GetFilePath); + NSV8Objects::Template_Set(result, "SetFileId", _SetFileId); + NSV8Objects::Template_Set(result, "GetFileId", _GetFileId); + NSV8Objects::Template_Set(result, "GetFileBinary", _GetFileArrayBuffer); + NSV8Objects::Template_Set(result, "GetFontBinary", _GetFontArrayBuffer); + NSV8Objects::Template_Set(result, "GetFontsDirectory", _GetFontsDirectory); + NSV8Objects::Template_Set(result, "GetFileString", _GetFileString); + NSV8Objects::Template_Set(result, "GetEditorType", _GetEditorType); + NSV8Objects::Template_Set(result, "CheckNextChange", _CheckNextChange); + NSV8Objects::Template_Set(result, "GetCountChanges", _GetChangesCount); + NSV8Objects::Template_Set(result, "GetChangesFile", _GetChangesFile); + NSV8Objects::Template_Set(result, "Save_AllocNative", _Save_AllocNative); + NSV8Objects::Template_Set(result, "Save_ReAllocNative", _Save_ReAllocNative); + NSV8Objects::Template_Set(result, "Save_End", _Save_End); + NSV8Objects::Template_Set(result, "AddImageInChanges", _AddImageInChanges); + NSV8Objects::Template_Set(result, "ConsoleLog", _ConsoleLog); + NSV8Objects::Template_Set(result, "SaveChanges", _SaveChanges); + NSV8Objects::Template_Set(result, "ZipOpen", _zipOpenFile); + NSV8Objects::Template_Set(result, "ZipOpenBase64", _zipOpenFileBase64); + NSV8Objects::Template_Set(result, "ZipFileAsString", _zipGetFileAsString); + NSV8Objects::Template_Set(result, "ZipFileAsBinary", _zipGetFileAsBinary); + NSV8Objects::Template_Set(result, "ZipClose", _zipCloseFile); + NSV8Objects::Template_Set(result, "getImageUrl", _GetImageUrl); + NSV8Objects::Template_Set(result, "getImagesDirectory", _GetImagesPath); + + return handle_scope.Escape(result); + } + + // Без SaveChanges + v8::Handle CreateNativeControlTemplateBuilder(v8::Isolate* isolate) + { + v8::EscapableHandleScope handle_scope(isolate); + + v8::Local result = v8::ObjectTemplate::New(V8IsolateOneArg); + result->SetInternalFieldCount(1); + + NSV8Objects::Template_Set(result, "SetFilePath", _SetFilePath); + NSV8Objects::Template_Set(result, "GetFilePath", _GetFilePath); + NSV8Objects::Template_Set(result, "SetFileId", _SetFileId); + NSV8Objects::Template_Set(result, "GetFileId", _GetFileId); + NSV8Objects::Template_Set(result, "GetFileBinary", _GetFileArrayBuffer); + NSV8Objects::Template_Set(result, "GetFontBinary", _GetFontArrayBuffer); + NSV8Objects::Template_Set(result, "GetFontsDirectory", _GetFontsDirectory); + NSV8Objects::Template_Set(result, "GetFileString", _GetFileString); + NSV8Objects::Template_Set(result, "GetEditorType", _GetEditorType); + NSV8Objects::Template_Set(result, "CheckNextChange", _CheckNextChange); + NSV8Objects::Template_Set(result, "GetCountChanges", _GetChangesCount); + NSV8Objects::Template_Set(result, "GetChangesFile", _GetChangesFile); + NSV8Objects::Template_Set(result, "Save_AllocNative", _Save_AllocNative); + NSV8Objects::Template_Set(result, "Save_ReAllocNative", _Save_ReAllocNative); + NSV8Objects::Template_Set(result, "Save_End", _Save_End); + NSV8Objects::Template_Set(result, "AddImageInChanges", _AddImageInChanges); + NSV8Objects::Template_Set(result, "ConsoleLog", _ConsoleLog); + NSV8Objects::Template_Set(result, "ZipOpen", _zipOpenFile); + NSV8Objects::Template_Set(result, "ZipOpenBase64", _zipOpenFileBase64); + NSV8Objects::Template_Set(result, "ZipFileAsString", _zipGetFileAsString); + NSV8Objects::Template_Set(result, "ZipFileAsBinary", _zipGetFileAsBinary); + NSV8Objects::Template_Set(result, "ZipClose", _zipCloseFile); + NSV8Objects::Template_Set(result, "getImageUrl", _GetImageUrl); + NSV8Objects::Template_Set(result, "getImagesDirectory", _GetImagesPath); + + return handle_scope.Escape(result); + } + + void CreateNativeObject(const v8::FunctionCallbackInfo& args) + { + v8::Isolate* isolate = args.GetIsolate(); + v8::HandleScope scope(isolate); + + v8::Handle NativeObjectTemplate = CreateNativeControlTemplate(isolate); + CNativeControlEmbed* pNativeObject = new CNativeControlEmbed(); + + v8::Local obj = NativeObjectTemplate->NewInstance(isolate->GetCurrentContext()).ToLocalChecked(); + obj->SetInternalField(0, v8::External::New(CV8Worker::GetCurrent(), pNativeObject)); + + args.GetReturnValue().Set(obj); + } + + // Без SaveChanges + void CreateNativeObjectBuilder(const v8::FunctionCallbackInfo& args) + { + v8::Isolate* isolate = args.GetIsolate(); + v8::HandleScope scope(isolate); + + v8::Handle NativeObjectTemplate = CreateNativeControlTemplateBuilder(isolate); + CNativeControlEmbed* pNativeObject = new CNativeControlEmbed(); + + v8::Local obj = NativeObjectTemplate->NewInstance(isolate->GetCurrentContext()).ToLocalChecked(); + obj->SetInternalField(0, v8::External::New(CV8Worker::GetCurrent(), pNativeObject)); + + args.GetReturnValue().Set(obj); + } +} + +void CNativeControlEmbed::CreateObjectInContext(const std::string& name, JSSmart context) +{ + v8::Isolate* current = CV8Worker::GetCurrent(); + context->m_internal->m_global->Set(current, name.c_str(), v8::FunctionTemplate::New(current, NSNativeControl::CreateNativeObject)); +} + +void CNativeControlEmbed::CreateObjectBuilderInContext(const std::string& name, JSSmart context) +{ + v8::Isolate* current = CV8Worker::GetCurrent(); + context->m_internal->m_global->Set(current, name.c_str(), v8::FunctionTemplate::New(current, NSNativeControl::CreateNativeObjectBuilder)); +} diff --git a/DesktopEditor/doctrenderer/js/NativeGraphics.js b/DesktopEditor/doctrenderer/js/NativeGraphics.js new file mode 100644 index 0000000000..25398e1ccf --- /dev/null +++ b/DesktopEditor/doctrenderer/js/NativeGraphics.js @@ -0,0 +1,521 @@ + +function CNativeGraphics() +{ + this.Native = CreateNativeGraphics(); + + this.m_oContext = null; + this.m_dWidthMM = 0; + this.m_dHeightMM = 0; + this.m_lWidthPix = 0; + this.m_lHeightPix = 0; + this.m_dDpiX = 96.0; + this.m_dDpiY = 96.0; + this.m_bIsBreak = false; + + //this.m_oPen = new AscCommon.CPen(); + this.m_bPenColorInit = false; + //this.m_oBrush = new AscCommon.CBrush(); + this.m_bBrushColorInit = false; + + this.m_oFontManager = null; + + //this.m_oCoordTransform = new AscCommon.CMatrixL(); + //this.m_oBaseTransform = new AscCommon.CMatrixL(); + //this.m_oTransform = new AscCommon.CMatrixL(); + //this.m_oFullTransform = new AscCommon.CMatrixL(); + //this.m_oInvertFullTransform = new AscCommon.CMatrixL(); + + this.ArrayPoints = null; + + this.m_oCurFont = + { + Name : "", + FontSize : 10, + Bold : false, + Italic : false + }; + + // RFonts + this.m_oTextPr = null; + //this.m_oGrFonts = new AscCommon.CGrRFonts(); + //this.m_oLastFont = new AscCommon.CFontSetup(); + + this.LastFontOriginInfo = { Name : "", Replace : null }; + + this.m_bIntegerGrid = true; + + //this.ClipManager = new AscCommon.CClipManager(); + //this.ClipManager.BaseObject = this; + + this.TextureFillTransformScaleX = 1; + this.TextureFillTransformScaleY = 1; + this.IsThumbnail = false; + + this.IsDemonstrationMode = false; + + //this.GrState = new AscCommon.CGrState(); + //this.GrState.Parent = this; + + this.TextClipRect = null; + this.IsClipContext = false; + + this.IsUseFonts2 = false; + this.m_oFontManager2 = null; + this.m_oLastFont2 = null; + + this.ClearMode = false; + this.IsRetina = false; + + this.dash_no_smart = null; + + this.RENDERER_PDF_FLAG = true; +} + +CNativeGraphics.prototype = +{ + init : function(context, width_px, height_px, width_mm, height_mm) + { + this.Native["init"](width_px, height_px, width_mm, height_mm); + }, + EndDraw : function() + { + // this.Native["EndDraw"](); + }, + put_GlobalAlpha : function(enable, alpha) + { + this.Native["put_GlobalAlpha"](enable, alpha); + }, + Start_GlobalAlpha : function() + { + // this.Native["Start_GlobalAlpha"](); + }, + End_GlobalAlpha : function() + { + this.Native["End_GlobalAlpha"](); + }, + // pen methods + p_color : function(r, g, b, a) + { + this.Native["p_color"](r, g, b, a); + }, + p_width : function(w) + { + this.Native["p_width"](w); + }, + p_dash : function(params) + { + this.Native["p_dash"](params ? params : []); + }, + // brush methods + b_color1 : function(r, g, b, a) + { + this.Native["b_color1"](r, g, b, a); + }, + b_color2 : function(r, g, b, a) + { + this.Native["b_color2"](r, g, b, a); + }, + transform : function(sx, shy, shx, sy, tx, ty) + { + this.Native["transform"](sx, shy, shx, sy, tx, ty); + }, + CalculateFullTransform : function(isInvertNeed) + { + this.Native["CalculateFullTransform"](isInvertNeed); + }, + // path commands + _s : function() + { + this.Native["_s"](); + }, + _e : function() + { + this.Native["_e"](); + }, + _z : function() + { + this.Native["_z"](); + }, + _m : function(x, y) + { + this.Native["_m"](x, y); + }, + _l : function(x, y) + { + this.Native["_l"](x, y); + }, + _c : function(x1, y1, x2, y2, x3, y3) + { + this.Native["_c"](x1, y1, x2, y2, x3, y3); + }, + _c2 : function(x1, y1, x2, y2) + { + this.Native["_c2"](x1, y1, x2, y2); + }, + ds : function() + { + this.Native["ds"](); + }, + df : function() + { + this.Native["df"](); + }, + // canvas state + save : function() + { + this.Native["save"](); + }, + restore : function() + { + this.Native["restore"](); + }, + clip : function() + { + this.Native["clip"](); + }, + reset : function() + { + this.Native["reset"](); + }, + transform3 : function(m, isNeedInvert) + { + this.Native["transform3"](m.sx, m.shy, m.shx, m.sy, m.tx, m.ty, isNeedInvert); + }, + FreeFont : function() + { + // this.Native["FreeFont"](); + }, + ClearLastFont : function() + { + // this.Native["ClearLastFont"](); + }, + // images + drawImage2 : function(img, x, y, w, h, alpha, srcRect) + { + this.Native["drawImage2"](img, x, y, w, h, alpha, srcRect); + }, + drawImage : function(img, x, y, w, h, alpha, srcRect, nativeImage) + { + this.Native["drawImage"](img, x, y, w, h, alpha, srcRect, nativeImage); + }, + // text + GetFont : function() + { + return this.Native["GetFont"](); + }, + font : function(font_id, font_size) + { + this.Native["font"](font_id, font_size); + }, + SetFont : function(font) + { + if (null == font) + return; + + var flag = 0; + if (font.Bold) flag |= 0x01; + if (font.Italic) flag |= 0x02; + if (font.Bold) flag |= 0x04; + if (font.Italic) flag |= 0x08; + + this.Native["SetFont"](font.FontFamily.Name, font.FontFamily.Index, font.FontSize, flag); + }, + SetTextPr : function(textPr, theme) + { + // this.Native["SetTextPr"](textPr, theme); + }, + SetFontSlot : function(slot, fontSizeKoef) + { + // this.Native["SetFontSlot"](slot, fontSizeKoef); + }, + GetTextPr : function() + { + // return this.Native["GetTextPr"](); + }, + FillText : function(x, y, text) + { + var _code = text.charCodeAt(0); + this.Native["FillText"](x, y, _code); + }, + t : function(text, x, y, isBounds) + { + this.Native["t"](x, y, text); + }, + FillText2 : function(x, y, text, cropX, cropW) + { + var _code = text.charCodeAt(0); + this.Native["FillText2"](x, y, _code, cropX, cropW); + }, + t2 : function(text, x, y, cropX, cropW) + { + this.Native["t2"](x, y, text, cropX, cropW); + }, + FillTextCode : function(x, y, lUnicode) + { + var _code = lUnicode.charCodeAt(0); + this.Native["FillTextCode"](x, y, _code); + }, + tg : function(text, x, y) + { + var _code = text.charCodeAt(0); + this.Native["tg"](_code, x, y); + }, + charspace : function(space) + { + // this.Native["charspace"](space); + }, + // private methods + private_FillGlyph : function(pGlyph, _bounds) + { + // this.Native["private_FillGlyph"](pGlyph, _bounds); + }, + private_FillGlyphC : function(pGlyph, cropX, cropW) + { + // this.Native["private_FillGlyphC"](pGlyph, cropX, cropW); + }, + private_FillGlyph2 : function(pGlyph) + { + // this.Native["private_FillGlyph2"](pGlyph); + }, + SetIntegerGrid : function(param) + { + this.Native["SetIntegerGrid"](param); + }, + GetIntegerGrid : function() + { + return this.Native["GetIntegerGrid"](); + }, + DrawStringASCII : function(name, size, bold, italic, text, x, y, bIsHeader) + { + this.SetFont({FontFamily : {Name : name, Index : -1}, FontSize : size, Italic : italic, Bold : bold}); + this.Native["DrawStringASCII"](text, x, y); + }, + DrawStringASCII2 : function(name, size, bold, italic, text, x, y, bIsHeader) + { + this.SetFont({FontFamily : {Name : name, Index : -1}, FontSize : size, Italic : italic, Bold : bold}); + this.Native["DrawStringASCII2"](text, x, y); + }, + DrawHeaderEdit : function(yPos, lock_type, sectionNum, bIsRepeat, type) + { + this.Native["DrawHeaderEdit"](yPos, lock_type, sectionNum, bIsRepeat, type); + }, + DrawFooterEdit : function(yPos, lock_type, sectionNum, bIsRepeat, type) + { + this.Native["DrawFooterEdit"](yPos, lock_type, sectionNum, bIsRepeat, type); + }, + DrawLockParagraph : function(lock_type, x, y1, y2) + { + this.Native["DrawLockParagraph"](x, y1, y2); + }, + DrawLockObjectRect : function(lock_type, x, y, w, h) + { + this.Native["DrawLockObjectRect"](x, y, w, h); + }, + DrawEmptyTableLine : function(x1, y1, x2, y2) + { + this.Native["DrawEmptyTableLine"](x1, y1, x2, y2); + }, + DrawSpellingLine : function(y0, x0, x1, w) + { + this.Native["DrawSpellingLine"](y0, x0, x1, w); + }, + // smart methods for horizontal / vertical lines + drawHorLine : function(align, y, x, r, penW) + { + this.Native["drawHorLine"](align, y, x, r, penW); + }, + drawHorLine2 : function(align, y, x, r, penW) + { + this.Native["drawHorLine2"](align, y, x, r, penW); + }, + drawVerLine : function(align, x, y, b, penW) + { + this.Native["drawVerLine"](align, x, y, b, penW); + }, + // мега крутые функции для таблиц + drawHorLineExt : function(align, y, x, r, penW, leftMW, rightMW) + { + this.Native["drawHorLineExt"](align, y, x, r, penW, leftMW, rightMW); + }, + rect : function(x, y, w, h) + { + this.Native["rect"](x, y, w, h); + }, + TableRect : function(x, y, w, h) + { + this.Native["TableRect"](x, y, w, h); + }, + // функции клиппирования + AddClipRect : function(x, y, w, h) + { + this.Native["AddClipRect"](x, y, w, h); + }, + RemoveClipRect : function() + { + this.Native["RemoveClipRect"](); + }, + SetClip : function(r) + { + this.Native["SetClip"](r.x, r.y, r.w, r.h); + }, + RemoveClip : function() + { + this.Native["RemoveClip"](); + }, + drawCollaborativeChanges : function(x, y, w, h, Color) + { + this.Native["drawCollaborativeChanges"](x, y, w, h, Color.r, Color.g, Color.b, 255); + }, + drawMailMergeField : function(x, y, w, h) + { + this.Native["drawMailMergeField"](x, y, w, h); + }, + drawSearchResult : function(x, y, w, h) + { + this.Native["drawSearchResult"](x, y, w, h); + }, + drawFlowAnchor : function(x, y) + { + this.Native["drawFlowAnchor"](x, y); + }, + SavePen : function() + { + this.Native["SavePen"](); + }, + RestorePen : function() + { + this.Native["RestorePen"](); + }, + SaveBrush : function() + { + this.Native["SaveBrush"](); + }, + RestoreBrush : function() + { + this.Native["RestoreBrush"](); + }, + SavePenBrush : function() + { + this.Native["SavePenBrush"](); + }, + RestorePenBrush : function() + { + this.Native["RestorePenBrush"](); + }, + SaveGrState : function() + { + this.Native["SaveGrState"](); + }, + RestoreGrState : function() + { + this.Native["RestoreGrState"](); + }, + StartClipPath : function() + { + this.Native["StartClipPath"](); + }, + EndClipPath : function() + { + this.Native["EndClipPath"](); + }, + StartCheckTableDraw : function() + { + return this.Native["StartCheckTableDraw"](); + }, + EndCheckTableDraw : function(bIsRestore) + { + if(bIsRestore) + this.RestoreGrState(); + }, + SetTextClipRect : function(_l, _t, _r, _b) + { + this.Native["SetTextClipRect"](_l, _t, _r, _b); + }, + AddSmartRect : function(x, y, w, h, pen_w) + { + this.Native["AddSmartRect"](x, y, w, h, pen_w); + }, + CheckUseFonts2 : function(_transform) + { + // this.Native["CheckUseFonts2"](_transform); + }, + UncheckUseFonts2 : function() + { + // this.Native["UncheckUseFonts2"](); + }, + Drawing_StartCheckBounds : function(x, y, w, h) + { + // this.Native["Drawing_StartCheckBounds"](x, y, w, h); + }, + Drawing_EndCheckBounds : function() + { + // this.Native["Drawing_EndCheckBounds"](); + }, + DrawPresentationComment : function(type, x, y, w, h) + { + // this.Native["DrawPresentationComment"](type, x, y, w, h); + }, + DrawPolygon : function(oPath, lineWidth, shift) + { + this.p_width(lineWidth); + this._s(); + + var Points = oPath.Points; + var nCount = Points.length; + // берем предпоследнюю точку, т.к. последняя совпадает с первой + var PrevX = Points[nCount - 2].X, PrevY = Points[nCount - 2].Y; + var _x = Points[nCount - 2].X, _y = Points[nCount - 2].Y; + var StartX, StartY; + + for (var nIndex = 0; nIndex < nCount; nIndex++) + { + if(PrevX > Points[nIndex].X) + { + _y = Points[nIndex].Y - shift; + } + else if(PrevX < Points[nIndex].X) + { + _y = Points[nIndex].Y + shift; + } + + if(PrevY < Points[nIndex].Y) + { + _x = Points[nIndex].X - shift; + } + else if(PrevY > Points[nIndex].Y) + { + _x = Points[nIndex].X + shift; + } + + PrevX = Points[nIndex].X; + PrevY = Points[nIndex].Y; + + if(nIndex > 0) + { + if (1 == nIndex) + { + StartX = _x; + StartY = _y; + this._m(_x, _y); + } + else + { + this._l(_x, _y); + } + } + } + + this._l(StartX, StartY); + this._z(); + this.ds(); + }, + DrawFootnoteRect : function(x, y, w, h) + { + this.Native["DrawFootnoteRect"](x, y, w, h); + }, + // new methods + toDataURL : function(type) + { + return this.Native["toDataURL"](type); + } +}; diff --git a/DesktopEditor/doctrenderer/js/test.js b/DesktopEditor/doctrenderer/js/test.js new file mode 100644 index 0000000000..c337dcf009 --- /dev/null +++ b/DesktopEditor/doctrenderer/js/test.js @@ -0,0 +1,108 @@ + +var MyGraphics = new CNativeGraphics(); + +// Задаём размеры холста и всё будет полупрозрачное +MyGraphics.init(null, 1000, 1000, 1000 * 25.4 / 96, 1000 * 25.4 / 96); +MyGraphics.put_GlobalAlpha(true, 0.5); + +// Рисуем желтый квадрат с красной пунктирной обводкой и толщиной 2 +MyGraphics.p_color(255, 0, 0, 255); +MyGraphics.p_width(2); +MyGraphics.p_dash([5, 5]); +MyGraphics.b_color1(255, 255, 0, 255); +MyGraphics._s(); +MyGraphics._m(10, 10); +MyGraphics._l(100, 10); +MyGraphics._l(100, 100); +MyGraphics._l(10, 100); +MyGraphics._z(); +MyGraphics.df(); +MyGraphics.ds(); + +// Поварачиваем плоскость рисования +MyGraphics.transform(1, 0.5, 0.1, 1, 0, 0); + +// Рисуем розовый квадрат с бардовой сплошной обводкой и толщиной 1 +MyGraphics.p_color(111, 0, 53, 255); +MyGraphics.p_width(1); +MyGraphics.p_dash(); +MyGraphics.b_color1(222, 155, 176, 255); +MyGraphics.rect(75, 50, 100, 100) +MyGraphics.df(); +MyGraphics.ds(); + +// Восстанавливаем плоскость рисования до нормальной и убираем полупрозрачность +MyGraphics.reset(); +MyGraphics.put_GlobalAlpha(true, 1); + +MyGraphics.SetFont({FontFamily : {Name : "Arial", Index : -1}, FontSize : 16, Italic : true, Bold : true}); +MyGraphics.FillText(10, 110, "A"); +MyGraphics.tg("A", 10, 130); +MyGraphics.t("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 10, 230, false); + +// Рисуем кривую с одной контрольной точкой +MyGraphics.b_color1(66, 255, 158, 255); +MyGraphics._s(); +MyGraphics._m(10, 10); +MyGraphics._c2(100, 50, 10, 100); +MyGraphics._z(); +MyGraphics.df(); +MyGraphics.ds(); + +// Отсекаем область рисования последним контруром и снова полупрозрачность +MyGraphics.clip(); +MyGraphics.put_GlobalAlpha(true, 0.5); + +// Рисуем кривую с двумя контрольными точками +MyGraphics.b_color1(121, 160, 255, 255); +MyGraphics._s(); +MyGraphics._m(100, 10); +MyGraphics._c(10, 10, 10, 100, 100, 100); +MyGraphics._z(); +MyGraphics.df(); +MyGraphics.ds(); + +// Восстанавливаем область рисования и поворачиваем плоскость рисования +MyGraphics.restore(); +MyGraphics.transform3({ sx : 1, shy : 0.5, shx : 0.1, sy : 1, tx : 0, ty : 0 }, false); + +// Рисуем изображение из файла +MyGraphics.drawImage2("image1.png", 95, 76, 60, 48, 0, null); + +MyGraphics.reset(); +MyGraphics.DrawStringASCII("Times New Roman", 16, false, false, "Test TEXT TEXT TEXT TEXT", 10, 210, false); +MyGraphics.DrawHeaderEdit(10); +MyGraphics.DrawFooterEdit(250); +MyGraphics.DrawLockParagraph(null, 10, 110, 200); +MyGraphics.DrawLockObjectRect(null, 20, 110, 90, 90); +MyGraphics.DrawEmptyTableLine(10, 110, 110, 210); +MyGraphics.DrawSpellingLine(120, 10, 100, 5); +MyGraphics.drawHorLine(1, 130, 10, 110, 10); +MyGraphics.drawVerLine(1, 30, 110, 200, 10); +MyGraphics.drawHorLineExt(1, 170, 20, 110, 5, 20, 0); + +MyGraphics.p_color(111, 0, 53, 255); +MyGraphics.p_width(3); +MyGraphics.b_color1(222, 155, 176, 255); +MyGraphics._s(); +MyGraphics.TableRect(110, 10, 90, 90); +MyGraphics._z(); + +// Рисует замыкание со второй до предпоследней точки +MyGraphics.DrawPolygon({Points : [{X : 10, Y : 10}, {X : 20, Y : 20}, {X : 20, Y : 30}, {X : 10, Y : 40}, {X : 0, Y : 30}]}, 3, 0); + +MyGraphics.DrawFootnoteRect(30, 30, 90, 90); + +MyGraphics.b_color1(255, 0, 0, 255); +MyGraphics._s(); +MyGraphics.AddClipRect(210, 10, 50, 50); +MyGraphics.ds(); +MyGraphics._z(); +MyGraphics.RemoveClipRect(); + +MyGraphics.SetClip({ x : 210, y : 70, w : 50, h : 50}); +MyGraphics.RemoveClip(); + +var imageBase64 = MyGraphics.toDataURL("png"); +MyGraphics.save(); +MyGraphics.GetFont(); diff --git a/DesktopEditor/doctrenderer/js_internal/js_base.h b/DesktopEditor/doctrenderer/js_internal/js_base.h new file mode 100644 index 0000000000..226b5ca9c0 --- /dev/null +++ b/DesktopEditor/doctrenderer/js_internal/js_base.h @@ -0,0 +1,213 @@ +#ifndef _CORE_EXT_JS_BASE_H_ +#define _CORE_EXT_JS_BASE_H_ + +#include "../../common/File.h" +#include "../../common/Array.h" +#include "../../../Common/DocxFormat/Source/Base/SmartPtr.h" + +#define JS_VALUE_EXIST(value) (value.is_init() && !value->isNull() && !value->isUndefined()) +#define JS_IS_VALUE_ARRAY(value) (value.is_init() && !value->isNull() && !value->isUndefined() && value->isArray()) + +template +using JSSmart = NSCommon::smart_ptr; + +namespace NSJSBase +{ + class CJSObject; + class CJSArray; + class CJSTypedArray; + class CJSFunction; + + class CJSValue + { + public: + CJSValue() {} + virtual ~CJSValue() {} + + virtual bool isUndefined() = 0; + virtual bool isNull() = 0; + virtual bool isBool() = 0; + virtual bool isNumber() = 0; + virtual bool isString() = 0; + virtual bool isArray() = 0; + virtual bool isTypedArray() = 0; + virtual bool isObject() = 0; + virtual bool isFunction() = 0; + virtual bool isEmpty() = 0; + + virtual void doUndefined() = 0; + virtual void doNull() = 0; + + virtual bool toBool() = 0; + virtual int toInt32() = 0; + virtual double toDouble() = 0; + virtual std::string toStringA() = 0; + virtual std::wstring toStringW() = 0; + + virtual CJSObject* toObject() = 0; + virtual CJSArray* toArray() = 0; + virtual CJSTypedArray* toTypedArray() = 0; + virtual CJSFunction* toFunction() = 0; + }; + + class CJSEmbedObject + { + public: + CJSEmbedObject() {} + virtual ~CJSEmbedObject() {} + + public: + virtual void* getObject() { return NULL; } + }; + + class CJSObject : public CJSValue + { + public: + CJSObject() {} + virtual ~CJSObject() {} + + virtual CJSValue* get(const char* name) = 0; + virtual void set(const char* name, CJSValue* value) = 0; + + virtual void set(const char* name, const int& value) = 0; + virtual void set(const char* name, const double& value) = 0; + + virtual CJSEmbedObject* getNative() = 0; + + virtual JSSmart call_func(const char* name, const int argc = 0, JSSmart argv[] = NULL) = 0; + virtual JSSmart toValue() = 0; + }; + + class CJSArray : public CJSValue + { + public: + CJSArray() {} + virtual ~CJSArray() {} + + virtual int getCount() = 0; + virtual JSSmart get(const int& index) = 0; + virtual void set(const int& index, CJSValue* value) = 0; + virtual void set(const int& index, const bool& value) = 0; + virtual void set(const int& index, const int& value) = 0; + virtual void set(const int& index, const double& value) = 0; + + virtual void add(CJSValue* value) = 0; + virtual void add_null() = 0; + virtual void add_undefined() = 0; + virtual void add_bool(const bool& value) = 0; + virtual void add_byte(const BYTE& value) = 0; + virtual void add_int(const int& value) = 0; + virtual void add_double(const double& value) = 0; + virtual void add_stringa(const std::string& value) = 0; + virtual void add_string(const std::wstring& value) = 0; + virtual JSSmart toValue() = 0; + }; + + class CJSTypedArray : public CJSValue + { + public: + CJSTypedArray(BYTE* data = NULL, int count = 0) {} + virtual ~CJSTypedArray() {} + + virtual int getCount() = 0; + virtual const BYTE* getData() = 0; + }; + + class CJSFunction : public CJSValue + { + public: + CJSFunction() {} + virtual ~CJSFunction() {} + + virtual CJSValue* Call(CJSValue* recv, int argc, JSSmart argv[]) = 0; + }; + + class CJSTryCatch + { + public: + CJSTryCatch() {} + virtual ~CJSTryCatch() {} + virtual bool Check() = 0; + }; + + class CJSIsolateScope + { + public: + CJSIsolateScope() + { + } + virtual ~CJSIsolateScope() + { + } + }; + + class CJSContextScope + { + public: + CJSContextScope() + { + } + virtual ~CJSContextScope() + { + } + }; + + class CJSLocalScope + { + public: + CJSLocalScope() + { + } + virtual ~CJSLocalScope() + { + } + }; + + class CJSContextPrivate; + class CJSContext + { + public: + CJSContextPrivate* m_internal; + + public: + CJSContext(); + ~CJSContext(); + + void Initialize(bool bIsGlobal = false); + void Dispose(); + + CJSTryCatch* GetExceptions(); + + void CreateContext(); + void CreateGlobalForContext(); + CJSObject* GetGlobal(); + + CJSIsolateScope* CreateIsolateScope(); + CJSContextScope* CreateContextScope(); + CJSLocalScope* CreateLocalScope(); + + JSSmart runScript(const std::string& script, JSSmart exception = NULL, const std::wstring& scriptPath = std::wstring(L"")); + CJSValue* JSON_Parse(const char* json_content); + + public: + static CJSValue* createUndefined(); + static CJSValue* createNull(); + static CJSValue* createBool(const bool& value); + static CJSValue* createInt(const int& value); + static CJSValue* createDouble(const double& value); + static CJSValue* createString(const char* value, const int& length = -1); + static CJSValue* createString(const std::string& value); + static CJSValue* createString(const std::wstring& value); + + static CJSObject* createObject(); + + static CJSArray* createArray(const int& count); + + static CJSTypedArray* createUint8Array(BYTE* data = NULL, int count = 0); + + public: + static CJSContext* GetCurrent(); + }; +} + +#endif // _CORE_EXT_JS_BASE_H_ diff --git a/DesktopEditor/doctrenderer/js_internal/jsc/jsc_base.h b/DesktopEditor/doctrenderer/js_internal/jsc/jsc_base.h new file mode 100644 index 0000000000..fb35dbd812 --- /dev/null +++ b/DesktopEditor/doctrenderer/js_internal/jsc/jsc_base.h @@ -0,0 +1,517 @@ +#ifndef _BUILD_NATIVE_CONTROL_JSC_BASE_H_ +#define _BUILD_NATIVE_CONTROL_JSC_BASE_H_ + +#include "../js_base.h" + +#import +#import +#include +#include + +#import "../../../../core/DesktopEditor/common/Mac/NSString+StringUtils.h" + +@protocol JSEmbedObjectProtocol +- (void*) getNative; +@end + +namespace NSJSBase +{ + class CJSContextPrivate + { + public: + JSContext* context; + + static JSContext* g_lockedContext; + + public: + CJSContextPrivate() + { + context = nil; + } + ~CJSContextPrivate() + { + context = nil; + } + }; +} + +static JSContext* _getCurrentContext() +{ + return NSJSBase::CJSContextPrivate::g_lockedContext; +} + +namespace NSJSBase +{ + template + class CJSValueJSCTemplate : public T + { + public: + JSValue* value; + JSContext* context; + + CJSValueJSCTemplate() + { + value = nil; + context = nil; + } + CJSValueJSCTemplate(JSValue* _value) + { + value = _value; + context = _getCurrentContext(); + + if (context == nil) { + context = _value.context; + } + } + + public: + + virtual ~CJSValueJSCTemplate() + { + value = nil; + context = nil; + } + + virtual bool isUndefined(); + virtual bool isNull(); + virtual bool isBool(); + virtual bool isNumber(); + virtual bool isString(); + virtual bool isArray(); + virtual bool isTypedArray(); + virtual bool isObject(); + virtual bool isFunction(); + + virtual void doUndefined(); + virtual void doNull(); + virtual bool toBool(); + virtual int toInt32(); + virtual double toDouble(); + virtual std::string toStringA(); + virtual std::wstring toStringW(); + + virtual CJSObject* toObject(); + virtual CJSArray* toArray(); + virtual CJSTypedArray* toTypedArray(); + virtual CJSFunction* toFunction(); + }; + + typedef CJSValueJSCTemplate CJSValueJSC; + + class CJSObjectJSC : public CJSValueJSCTemplate + { + public: + CJSObjectJSC() + { + } + CJSObjectJSC(JSValue* _value) : CJSValueJSCTemplate(_value) + { + } + + virtual ~CJSObjectJSC() + { + value = nil; + context = nil; + } + + virtual CJSValue* get(const char* name) + { + CJSValueJSC* _value = new CJSValueJSC(); + _value->value = [value valueForProperty:[[NSString alloc] initWithUTF8String:name]]; + _value->context = context; + return _value; + } + + virtual void set(const char* name, CJSValue* value_param) + { + CJSValueJSC* _value = static_cast(value_param); + [value setValue:_value->value forProperty:[[NSString alloc] initWithUTF8String:name]]; + } + + virtual void set(const char* name, const int& _value) + { + [value setValue:[JSValue valueWithInt32:_value inContext: context] forProperty:[[NSString alloc] initWithUTF8String:name]]; + } + + virtual void set(const char* name, const double& _value) + { + [value setValue:[JSValue valueWithDouble:_value inContext: context] forProperty:[[NSString alloc] initWithUTF8String:name]]; + } + + virtual CJSEmbedObject* getNative() + { + id _wrapper = [value toObject]; + if ([_wrapper conformsToProtocol:@protocol(JSEmbedObjectProtocol)]) + { + return (CJSEmbedObject*)([_wrapper getNative]); + } + return NULL; + } + + virtual JSSmart call_func(const char* name, const int argc = 0, JSSmart argv[] = NULL) + { + NSMutableArray* arr = nil; + + if (argc > 0) + { + arr = [[NSMutableArray alloc] init]; + for (int i = 0; i < argc; ++i) + { + CJSValueJSC* _val = (CJSValueJSC*)argv[i].operator ->(); + [arr addObject:_val->value]; + } + } + + CJSValueJSC* _return = new CJSValueJSC(); + _return->context = context; + _return->value = [value invokeMethod: [[NSString alloc] initWithUTF8String:name] + withArguments: arr]; + + return _return; + } + + virtual JSSmart toValue() + { + CJSValueJSC* _value = new CJSValueJSC(); + _value->value = value; + //_value->value = [JSValue valueWithJSValueRef:[value JSValueRef] inContext:context]; + _value->context = context; + return _value; + } + }; + + class CJSArrayJSC : public CJSValueJSCTemplate + { + public: + int m_count; + public: + CJSArrayJSC() + { + m_count = 0; + } + virtual ~CJSArrayJSC() + { + value = nil; + context = nil; + } + + virtual int getCount() + { + JSValue* _ret = [value valueForProperty:@"length"]; + if (nil != _ret && NO == [_ret isUndefined]) + return [_ret toInt32]; + return 0; + } + + virtual JSSmart get(const int& index) + { + CJSValueJSC* _value = new CJSValueJSC(); + _value->value = [value valueAtIndex:(NSUInteger)index]; + _value->context = context; + return _value; + } + + virtual void set(const int& index, CJSValue* value_param) + { + CJSValueJSC* _value = static_cast(value_param); + [value setValue:_value->value atIndex:index]; + } + + virtual void add(CJSValue* value_param) + { + set(getCount(), value_param); + } + + virtual void set(const int& index, const bool& _value) + { + [value setValue:[JSValue valueWithBool:_value inContext : context] atIndex:index]; + } + + virtual void set(const int& index, const int& _value) + { + [value setValue:[JSValue valueWithInt32:_value inContext : context] atIndex:index]; + } + + virtual void set(const int& index, const double& _value) + { + [value setValue:[JSValue valueWithDouble:_value inContext : context] atIndex:index]; + } + + virtual void add_null() + { + [value setValue:[JSValue valueWithNullInContext:context] atIndex:m_count++]; + } + + virtual void add_undefined() + { + [value setValue:nil atIndex:m_count++]; + } + + virtual void add_bool(const bool& _value) + { + [value setValue:[JSValue valueWithBool:_value inContext : context] atIndex:m_count++]; + } + + virtual void add_byte(const BYTE& _value) + { + [value setValue:[JSValue valueWithInt32:(int)_value inContext : context] atIndex:m_count++]; + } + + virtual void add_int(const int& _value) + { + [value setValue:[JSValue valueWithInt32:_value inContext : context] atIndex:m_count++]; + } + + virtual void add_double(const double& _value) + { + [value setValue:[JSValue valueWithDouble:_value inContext : context] atIndex:m_count++]; + } + + virtual void add_stringa(const std::string& _value) + { + [value setValue:[NSString stringWithAString:_value] atIndex:m_count++]; + } + + virtual void add_string(const std::wstring& _value) + { + [value setValue:[NSString stringWithWString:_value] atIndex:m_count++]; + } + + virtual JSSmart toValue() + { + CJSValueJSC* _value = new CJSValueJSC(); + _value->value = value; + _value->context = context; + return _value; + } + }; + + class CJSTypedArrayJSC : public CJSValueJSCTemplate + { + public: + CJSTypedArrayJSC(JSContext* _context, BYTE* data = NULL, int count = 0) + { + context = _context; + if (0 < count) + { + JSObjectRef object = JSObjectMakeTypedArrayWithBytesNoCopy(context.JSGlobalContextRef, + kJSTypedArrayTypeUint8Array, + (void*)data, (size_t)count, + data_destroy, nullptr, nullptr); + if (object) + { + value = [JSValue valueWithJSValueRef:object inContext:context]; + } + } + } + virtual ~CJSTypedArrayJSC() + { + value = nil; + context = nil; + } + + static void data_destroy(void* bytes, void* deallocatorContext) + { + free(bytes); + } + + virtual int getCount() + { + JSObjectRef obj = JSValueToObject(context.JSGlobalContextRef, value.JSValueRef, NULL); + return (int)JSObjectGetTypedArrayByteLength(context.JSGlobalContextRef, obj, NULL); + } + + virtual const BYTE* getData() + { + JSObjectRef obj = JSValueToObject(context.JSGlobalContextRef, value.JSValueRef, NULL); + return (BYTE*)JSObjectGetTypedArrayBytesPtr(context.JSGlobalContextRef, obj, NULL); + } + }; + + class CJSFunctionJSC : public CJSValueJSCTemplate + { + public: + CJSFunctionJSC() + { + } + virtual ~CJSFunctionJSC() + { + value = nil; + context = nil; + } + + virtual CJSValue* Call(CJSValue* recv, int argc, JSSmart argv[]) + { + NSMutableArray* arr = [[NSMutableArray alloc] init]; + for (int i = 0; i < argc; ++i) + { + CJSValueJSC* _val = (CJSValueJSC*)argv[i].operator ->(); + [arr addObject:_val->value]; + } + + CJSValueJSC* _return = new CJSValueJSC(); + _return->context = context; + _return->value = [value callWithArguments:arr]; + + return _return; + } + }; + + template + CJSObject* CJSValueJSCTemplate::toObject() + { + CJSObjectJSC* _value = new CJSObjectJSC(); + _value->value = value; + _value->context = context; + return _value; + } + + template + CJSArray* CJSValueJSCTemplate::toArray() + { + CJSArrayJSC* _value = new CJSArrayJSC(); + _value->value = value; + _value->context = context; + return _value; + } + + template + CJSTypedArray* CJSValueJSCTemplate::toTypedArray() + { + CJSTypedArrayJSC* _value = new CJSTypedArrayJSC(context); + _value->value = value; + _value->context = context; + return _value; + } + + template + CJSFunction* CJSValueJSCTemplate::toFunction() + { + CJSFunctionJSC* _value = new CJSFunctionJSC(); + _value->value = value; + _value->context = context; + return _value; + } +} + +namespace NSJSBase +{ + // TRY - CATCH + class CJSCTryCatch : public CJSTryCatch + { + public: + JSContext* context; + JSSmart smartContext; + + public: + CJSCTryCatch() : CJSTryCatch() + { + smartContext = CJSContext::GetCurrent(); + context = smartContext->m_internal->context; + } + virtual ~CJSCTryCatch() + { + context = nil; + } + + public: + virtual bool Check(); + }; +} + +inline JSSmart js_value(JSValue* _value) +{ + return new NSJSBase::CJSValueJSC(_value); +} +inline JSSmart js_object(JSValue* _value) +{ + return new NSJSBase::CJSObjectJSC(_value); +} +inline JSValue* js_return(JSSmart _value) +{ + if (!_value.is_init()) + return nil; + NSJSBase::CJSValueJSC* _tmp = (NSJSBase::CJSValueJSC*)(_value.operator ->()); + return _tmp->value; +} + +#define FUNCTION_WRAPPER_JS(NAME, NAME_EMBED) \ + -(JSValue*) NAME \ + { \ + return js_return(m_internal->NAME_EMBED()); \ + } + +#define FUNCTION_WRAPPER_JS_1(NAME, NAME_EMBED) \ + -(JSValue*) NAME:(JSValue*)p1 \ + { \ + return js_return(m_internal->NAME_EMBED(js_value(p1))); \ + } +#define FUNCTION_WRAPPER_JS_2(NAME, NAME_EMBED) \ + -(JSValue*) NAME:(JSValue*)p1 : (JSValue*)p2 \ + { \ + return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2))); \ + } +#define FUNCTION_WRAPPER_JS_3(NAME, NAME_EMBED) \ + -(JSValue*) NAME:(JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 \ + { \ + return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3))); \ + } +#define FUNCTION_WRAPPER_JS_4(NAME, NAME_EMBED) \ + -(JSValue*) NAME:(JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 : (JSValue*)p4 \ + { \ + return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3), js_value(p4))); \ + } +#define FUNCTION_WRAPPER_JS_5(NAME, NAME_EMBED) \ + -(JSValue*) NAME:(JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 : (JSValue*)p4 : (JSValue*)p5 \ + { \ + return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3), js_value(p4), js_value(p5))); \ + } +#define FUNCTION_WRAPPER_JS_6(NAME, NAME_EMBED) \ + -(JSValue*) NAME:(JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 : (JSValue*)p4 : (JSValue*)p5 : (JSValue*)p6 \ + { \ + return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3), js_value(p4), js_value(p5), js_value(p6))); \ + } +#define FUNCTION_WRAPPER_JS_7(NAME, NAME_EMBED) \ + -(JSValue*) NAME:(JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 : (JSValue*)p4 : (JSValue*)p5 : (JSValue*)p6 : (JSValue*)p7 \ + { \ + return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3), js_value(p4), js_value(p5), js_value(p6), js_value(p7))); \ + } + +#if __has_feature(objc_arc) +#define EMBED_OBJECT_WRAPPER_METHODS(CLASS) \ +-(id) init \ +{ \ + self = [super init]; \ + if (self) \ + m_internal = new CLASS(); \ + return self; \ +} \ +-(void) dealloc \ +{ \ + RELEASEOBJECT(m_internal); \ +} \ +- (void*) getNative \ +{ \ + return m_internal; \ +} +#else +#define EMBED_OBJECT_WRAPPER_METHODS(CLASS) \ +-(id) init \ +{ \ + self = [super init]; \ + if (self) \ + m_internal = new CLASS(); \ + return self; \ +} \ +-(void) dealloc \ +{ \ + RELEASEOBJECT(m_internal); \ + [super dealloc]; \ +} \ +- (void*) getNative \ +{ \ + return m_internal; \ +} +#endif + +#endif // _BUILD_NATIVE_CONTROL_JSC_BASE_H_ diff --git a/DesktopEditor/doctrenderer/js_internal/jsc/jsc_base.mm b/DesktopEditor/doctrenderer/js_internal/jsc/jsc_base.mm new file mode 100644 index 0000000000..1b986bff40 --- /dev/null +++ b/DesktopEditor/doctrenderer/js_internal/jsc/jsc_base.mm @@ -0,0 +1,281 @@ +#import "jsc_base.h" + +using namespace NSJSBase; + +JSContext* NSJSBase::CJSContextPrivate::g_lockedContext = nil; + +template +bool CJSValueJSCTemplate::isUndefined() +{ + return (value == nil) ? true : ([value isUndefined] == YES); +} +template +bool CJSValueJSCTemplate::isNull() +{ + return (value == nil) ? false : ([value isNull] == YES); +} +template +bool CJSValueJSCTemplate::isBool() +{ + return (value == nil) ? false : ([value isBoolean] == YES); +} +template +bool CJSValueJSCTemplate::isNumber() +{ + return (value == nil) ? false : ([value isNumber] == YES); +} +template +bool CJSValueJSCTemplate::isString() +{ + return (value == nil) ? false : ([value isString] == YES); +} +template +bool CJSValueJSCTemplate::isArray() +{ + return (value == nil) ? false : JSValueIsArray(context.JSGlobalContextRef, value.JSValueRef); +} +template +bool CJSValueJSCTemplate::isTypedArray() +{ + return (value == nil) ? false : (kJSTypedArrayTypeNone == JSValueGetTypedArrayType(context.JSGlobalContextRef, value.JSValueRef, NULL)); +} +template +bool CJSValueJSCTemplate::isObject() +{ + return (value == nil) ? false : ([value isObject] == YES); +} +template +bool CJSValueJSCTemplate::isFunction() +{ + return true; // TODO!!! +} +template +void CJSValueJSCTemplate::doUndefined() +{ + value = [JSValue valueWithUndefinedInContext:context]; +} +template +void CJSValueJSCTemplate::doNull() +{ + value = [JSValue valueWithNullInContext:context]; +} +template +bool CJSValueJSCTemplate::toBool() +{ + return ([value toBool] == YES) ? true : false; +} +template +int CJSValueJSCTemplate::toInt32() +{ + return [value toInt32]; +} +template +double CJSValueJSCTemplate::toDouble() +{ + return [value toDouble]; +} +template +std::string CJSValueJSCTemplate::toStringA() +{ + return [[value toString] stdstring]; +} +template +std::wstring CJSValueJSCTemplate::toStringW() +{ + return [[value toString] stdwstring]; +} + +namespace NSJSBase +{ + CJSContext::CJSContext() + { + m_internal = new CJSContextPrivate(); + } + CJSContext::~CJSContext() + { + m_internal->context = nil; + RELEASEOBJECT(m_internal); + } + + CJSTryCatch* CJSContext::GetExceptions() + { + return new CJSCTryCatch(); + } + + void CJSContext::Initialize(bool bIsGlobal) + { + m_internal->context = [[JSContext alloc] init]; + } + void CJSContext::Dispose() + { + m_internal->context = nil; + m_internal->g_lockedContext = nil; + NSJSBase::CJSContextPrivate::g_lockedContext = nil; + } + + void CJSContext::CreateContext() + { + // NONE + } + + void CJSContext::CreateGlobalForContext() + { + // NONE + } + + CJSObject* CJSContext::GetGlobal() + { + CJSObjectJSC* ret = new CJSObjectJSC(); + ret->context = m_internal->context; + ret->value = [m_internal->context globalObject]; + return ret; + } + + CJSIsolateScope* CJSContext::CreateIsolateScope() + { +#if 0 + // FOR DEBUG + [m_internal->context setExceptionHandler:^(JSContext *context, JSValue *value) { + NSLog(@"%@", value); + }]; +#endif + + m_internal->g_lockedContext = m_internal->context; + return new CJSIsolateScope(); + } + + CJSContextScope* CJSContext::CreateContextScope() + { + return new CJSContextScope(); + } + + CJSLocalScope* CJSContext::CreateLocalScope() + { + return new CJSLocalScope(); + } + + CJSValue* CJSContext::createUndefined() + { + CJSValueJSC* _value = new CJSValueJSC(); + _value->context = _getCurrentContext(); + _value->doUndefined(); + return _value; + } + + CJSValue* CJSContext::createNull() + { + CJSValueJSC* _value = new CJSValueJSC(); + _value->context = _getCurrentContext(); + _value->doNull(); + return _value; + } + + CJSValue* CJSContext::createBool(const bool& value) + { + CJSValueJSC* _value = new CJSValueJSC(); + _value->context = _getCurrentContext(); + _value->value = [JSValue valueWithBool:(value ? YES : NO) inContext:_value->context]; + return _value; + } + + CJSValue* CJSContext::createInt(const int& value) + { + CJSValueJSC* _value = new CJSValueJSC(); + _value->context = _getCurrentContext(); + _value->value = [JSValue valueWithInt32:((int32_t) value) inContext:_value->context]; + return _value; + } + + CJSValue* CJSContext::createDouble(const double& value) + { + CJSValueJSC* _value = new CJSValueJSC(); + _value->context = _getCurrentContext(); + _value->value = [JSValue valueWithDouble:value inContext:_value->context]; + return _value; + } + + CJSValue* CJSContext::createString(const char* value, const int& len) + { + CJSValueJSC* _value = new CJSValueJSC(); + _value->context = _getCurrentContext(); + _value->value = [NSString stringWithUtf8Buffer:value + length:(size_t)len]; + return _value; + } + + CJSValue* CJSContext::createString(const std::string& value) + { + CJSValueJSC* _value = new CJSValueJSC(); + _value->context = _getCurrentContext(); + _value->value = [NSString stringWithAString:value]; + return _value; + } + + CJSValue* CJSContext::createString(const std::wstring& value) + { + CJSValueJSC* _value = new CJSValueJSC(); + _value->context = _getCurrentContext(); + _value->value = [NSString stringWithWString:value]; + return _value; + } + + CJSObject* CJSContext::createObject() + { + CJSObjectJSC* _value = new CJSObjectJSC(); + _value->context = _getCurrentContext(); + _value->value = [JSValue valueWithNewObjectInContext:_value->context]; + return _value; + } + + CJSArray* CJSContext::createArray(const int& count) + { + CJSArrayJSC* _value = new CJSArrayJSC(); + _value->context = _getCurrentContext(); + _value->value = [JSValue valueWithNewArrayInContext:_value->context]; + return _value; + } + + CJSTypedArray* CJSContext::createUint8Array(BYTE* data, int count) + { + JSContext* _current = _getCurrentContext(); + CJSTypedArrayJSC* _value = new CJSTypedArrayJSC(_current, data, count); + return _value; + } + + JSSmart CJSContext::runScript(const std::string& script, JSSmart exception, const std::wstring& scriptPath) + { + CJSValueJSC* _value = new CJSValueJSC(); + _value->value = [m_internal->context evaluateScript:[NSString stringWithAString:script]]; + _value->context = m_internal->context; + return _value; + } + + CJSContext* CJSContext::GetCurrent() + { + CJSContext* ret = new CJSContext(); + ret->m_internal->context = _getCurrentContext(); + return ret; + } + + CJSValue* CJSContext::JSON_Parse(const char *sTmp) + { + // TODO: + return CJSContext::createUndefined(); + } +} + +namespace NSJSBase +{ + bool CJSCTryCatch::Check() + { + JSValue* exc = [context exception]; + if (exc == nil || [exc isNull] || [exc isUndefined]) + return false; + + NSString* pExсeption = [[context exception] toString]; +#if 1 + NSLog(@"%@", pExсeption); +#endif + return true; + } +} diff --git a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.cpp b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.cpp new file mode 100644 index 0000000000..17f4a76a07 --- /dev/null +++ b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.cpp @@ -0,0 +1,325 @@ +#include "v8_base.h" + +v8::Local CreateV8String(v8::Isolate* i, const char* str, const int& len) +{ + return v8::String::NewFromUtf8(i, str, kV8NormalString, len).ToLocalChecked(); +} +v8::Local CreateV8String(v8::Isolate* i, const std::string& str) +{ + return v8::String::NewFromUtf8(i, str.c_str(), kV8NormalString, (int)str.length()).ToLocalChecked(); +} + +CV8Initializer* CV8Worker::m_pInitializer = NULL; + +namespace NSJSBase +{ + + class CCacheDataScript + { + private: + BYTE* Data; + int Length; + + v8::ScriptCompiler::Source* Source; + v8::ScriptCompiler::CachedData* CachedData; + + std::wstring Path; + + public: + CCacheDataScript(const std::wstring& sPath) + { + Data = NULL; + Length = 0; + + if (!sPath.empty()) + { + BYTE* _data = NULL; + DWORD _data_length = 0; + if (NSFile::CFileBinary::ReadAllBytes(sPath, &_data, _data_length)) + { + Data = _data; + Length = (int)_data_length; + } + } + + Source = NULL; + CachedData = NULL; + Path = sPath; + } + ~CCacheDataScript() + { + //RELEASEOBJECT(Source); + //RELEASEOBJECT(CachedData); + RELEASEARRAYOBJECTS(Data); + } + + v8::Local Compile(const v8::Local& _context, const v8::Local& source) + { + v8::Local script; + if (NULL == Data) + { + Source = new v8::ScriptCompiler::Source(source); + script = v8::ScriptCompiler::Compile(_context, Source, kV8ProduceCodeCache).ToLocalChecked(); + + const v8::ScriptCompiler::CachedData* _cachedData = Source->GetCachedData(); + NSFile::CFileBinary oFileTest; + if (oFileTest.CreateFileW(Path)) + { + oFileTest.WriteFile(_cachedData->data, (DWORD)_cachedData->length); + oFileTest.CloseFile(); + } + } + else + { + CachedData = new v8::ScriptCompiler::CachedData(Data, Length); + Source = new v8::ScriptCompiler::Source(source, CachedData); + script = v8::ScriptCompiler::Compile(_context, Source, v8::ScriptCompiler::kConsumeCodeCache).ToLocalChecked(); + } + return script; + } + + bool IsInit() + { + return Data != NULL && Length > 0; + } + }; + + class CJSIsolateScopeV8 : public CJSIsolateScope + { + public: + v8::Isolate::Scope isolate_scope; + v8::Locker isolate_locker; + + public: + CJSIsolateScopeV8(v8::Isolate* isolate) : CJSIsolateScope(), + isolate_scope(isolate), + isolate_locker(isolate) + { + } + virtual ~CJSIsolateScopeV8() + { + } + }; + + class CJSContextScopeV8 : public CJSContextScope + { + public: + v8::Context::Scope m_scope; + + public: + CJSContextScopeV8(v8::Local context) : m_scope(context) + { + } + virtual ~CJSContextScopeV8() + { + } + }; + + class CJSLocalScopeV8 : public CJSLocalScope + { + public: + v8::HandleScope m_scope; + + public: + CJSLocalScopeV8() : m_scope(CV8Worker::GetCurrent()) + { + } + virtual ~CJSLocalScopeV8() + { + } + }; + + + CJSContext::CJSContext() + { + m_internal = new CJSContextPrivate(); + } + CJSContext::~CJSContext() + { + RELEASEOBJECT(m_internal); + } + + CJSTryCatch* CJSContext::GetExceptions() + { + return new CV8TryCatch(); + } + + void CJSContext::Initialize(bool bIsGlobal) + { + CV8Worker::Initialize(); + if (!bIsGlobal) + m_internal->m_isolate = CV8Worker::getInitializer()->CreateNew(); + } + void CJSContext::Dispose() + { + if (m_internal->m_isolate) + m_internal->m_isolate->Dispose(); + CV8Worker::Dispose(); + } + + void CJSContext::CreateContext() + { + m_internal->m_context = v8::Context::New(CV8Worker::GetCurrent(), NULL, m_internal->m_global); + } + + void CJSContext::CreateGlobalForContext() + { + m_internal->m_global = v8::ObjectTemplate::New(CV8Worker::GetCurrent()); + } + + CJSObject* CJSContext::GetGlobal() + { + CJSObjectV8* ret = new CJSObjectV8(); + ret->value = m_internal->m_context->Global(); + return ret; + } + + CJSIsolateScope* CJSContext::CreateIsolateScope() + { + return new CJSIsolateScopeV8(m_internal->m_isolate); + } + + CJSContextScope* CJSContext::CreateContextScope() + { + return new CJSContextScopeV8(m_internal->m_context); + } + + CJSLocalScope* CJSContext::CreateLocalScope() + { + return new CJSLocalScopeV8(); + } + + CJSValue* CJSContext::createUndefined() + { + CJSValueV8* _value = new CJSValueV8(); + _value->doUndefined(); + return _value; + } + + CJSValue* CJSContext::createNull() + { + CJSValueV8* _value = new CJSValueV8(); + _value->doNull(); + return _value; + } + + CJSValue* CJSContext::createBool(const bool& value) + { + CJSValueV8* _value = new CJSValueV8(); + _value->value = v8::Boolean::New(CV8Worker::GetCurrent(), value); + return _value; + } + + CJSValue* CJSContext::createInt(const int& value) + { + CJSValueV8* _value = new CJSValueV8(); + _value->value = v8::Integer::New(CV8Worker::GetCurrent(), value); + return _value; + } + + CJSValue* CJSContext::createDouble(const double& value) + { + CJSValueV8* _value = new CJSValueV8(); + _value->value = v8::Number::New(CV8Worker::GetCurrent(), value); + return _value; + } + + CJSValue* CJSContext::createString(const char* value, const int& length) + { + CJSValueV8* _value = new CJSValueV8(); + _value->value = CreateV8String(CV8Worker::GetCurrent(), value, length); + return _value; + } + + CJSValue* CJSContext::createString(const std::string& value) + { + CJSValueV8* _value = new CJSValueV8(); + _value->value = CreateV8String(CV8Worker::GetCurrent(), value.c_str(), (int)value.length()); + return _value; + } + + CJSValue* CJSContext::createString(const std::wstring& value) + { + std::string sReturn = NSFile::CUtf8Converter::GetUtf8StringFromUnicode(value); + return createString(sReturn); + } + + CJSObject* CJSContext::createObject() + { + CJSObjectV8* _value = new CJSObjectV8(); + _value->value = v8::Object::New(CV8Worker::GetCurrent()); + return _value; + } + + CJSArray* CJSContext::createArray(const int& count) + { + CJSArrayV8* _value = new CJSArrayV8(); + _value->value = v8::Array::New(CV8Worker::GetCurrent(), count); + _value->m_count = count; + return _value; + } + + CJSTypedArray* CJSContext::createUint8Array(BYTE* data, int count) + { + CJSTypedArrayV8* _value = new CJSTypedArrayV8(data, count); + return _value; + } + + JSSmart CJSContext::runScript(const std::string& script, JSSmart exception, const std::wstring& scriptPath) + { + v8::Local _source = CreateV8String(CV8Worker::GetCurrent(), script.c_str()); + + v8::Local _script; + if(!scriptPath.empty()) + { + std::wstring sCachePath = scriptPath.substr(0, scriptPath.find(L".")) + L".cache"; + CCacheDataScript oCachedScript(sCachePath); + // if (!oCachedScript.IsInit()) + // { + // _script = v8::Script::Compile(_source); + // } + // else + // { + _script = oCachedScript.Compile(m_internal->m_context, _source); + // } + } + else + { + _script = v8::Script::Compile(V8ContextFirstArg _source).ToLocalChecked(); + } + + CJSValueV8* _return = new CJSValueV8(); + + if (exception.is_init()) + { + if (!exception->Check()) + _return->value = _script->Run(V8ContextOneArg).ToLocalChecked(); + } + else + { + _return->value = _script->Run(V8ContextOneArg).ToLocalChecked(); + } + + return _return; + } + + CJSContext* CJSContext::GetCurrent() + { + CJSContext* ret = new CJSContext(); + ret->m_internal->m_isolate = CV8Worker::GetCurrent(); + ret->m_internal->m_context = ret->m_internal->m_isolate->GetCurrentContext(); + // global??? + return ret; + } + + CJSValue* CJSContext::JSON_Parse(const char *sTmp) + { + CJSValueV8* _value = new CJSValueV8(); + #ifndef V8_OS_XP + _value->value = v8::JSON::Parse(m_internal->m_context, CreateV8String(CV8Worker::GetCurrent(), sTmp)).ToLocalChecked(); + #else + _value->value = v8::JSON::Parse(CreateV8String(CV8Worker::GetCurrent(), sTmp)); + #endif + return _value; + } +} diff --git a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h new file mode 100644 index 0000000000..fbc74e477d --- /dev/null +++ b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h @@ -0,0 +1,839 @@ +#ifndef _BUILD_NATIVE_CONTROL_V8_BASE_H_ +#define _BUILD_NATIVE_CONTROL_V8_BASE_H_ + +#include "../js_base.h" + +#include "v8.h" +#include "libplatform/libplatform.h" + +#ifdef V8_VERSION_87_PLUS +#define kV8NormalString v8::NewStringType::kNormal +#define kV8ProduceCodeCache v8::ScriptCompiler::kConsumeCodeCache +#define V8ContextFirstArg CV8Worker::GetCurrentContext(), +#define V8ContextOneArg CV8Worker::GetCurrentContext() +#define V8IsolateFirstArg CV8Worker::GetCurrent(), +#define V8IsolateOneArg CV8Worker::GetCurrent() +#else +#define kV8NormalString v8::NewStringType::kNormal +#define kV8ProduceCodeCache v8::ScriptCompiler::kProduceCodeCache +#define V8ContextFirstArg CV8Worker::GetCurrentContext(), +#define V8ContextOneArg CV8Worker::GetCurrentContext() +#define V8IsolateFirstArg +#define V8IsolateOneArg CV8Worker::GetCurrent() +#endif + +v8::Local CreateV8String(v8::Isolate* i, const char* str, const int& len = -1); +v8::Local CreateV8String(v8::Isolate* i, const std::string& str); + +#ifdef __ANDROID__ + #include +#endif + +#ifdef V8_OS_XP +class MallocArrayBufferAllocator : public v8::ArrayBuffer::Allocator +{ +public: + virtual void* Allocate(size_t length) + { + void* ret = malloc(length); + memset(ret, 0, length); + return ret; + } + virtual void* AllocateUninitialized(size_t length) + { + return malloc(length); + } + virtual void Free(void* data, size_t length) + { + free(data); + } +}; +#endif + +class CV8Initializer +{ +private: +#ifdef V8_VERSION_87_PLUS + std::unique_ptr m_platform; +#else + v8::Platform* m_platform; +#endif + v8::ArrayBuffer::Allocator* m_pAllocator; + +public: + CV8Initializer() + { + std::wstring sPrW = NSFile::GetProcessPath(); + std::string sPrA = U_TO_UTF8(sPrW); + + m_pAllocator = NULL; + + #ifndef V8_OS_XP + v8::V8::InitializeICUDefaultLocation(sPrA.c_str()); + v8::V8::InitializeExternalStartupData(sPrA.c_str()); + #ifdef V8_VERSION_87_PLUS + m_platform = v8::platform::NewDefaultPlatform(); + v8::V8::InitializePlatform(m_platform.get()); + #else + m_platform = v8::platform::CreateDefaultPlatform(); + v8::V8::InitializePlatform(m_platform); + #endif + v8::V8::Initialize(); + #else + m_platform = v8::platform::CreateDefaultPlatform(); + v8::V8::InitializePlatform(m_platform); + v8::V8::Initialize(); + v8::V8::InitializeICU(); + #endif + } + ~CV8Initializer() + { + v8::V8::Dispose(); + v8::V8::ShutdownPlatform(); + #ifndef V8_VERSION_87_PLUS + delete m_platform; + #endif + if (m_pAllocator) + delete m_pAllocator; + } + + v8::ArrayBuffer::Allocator* getAllocator() + { + return m_pAllocator; + } + + v8::Isolate* CreateNew() + { + v8::Isolate::CreateParams create_params; + #ifndef V8_OS_XP + m_pAllocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator(); + #else + m_pAllocator = new MallocArrayBufferAllocator(); + #endif + create_params.array_buffer_allocator = m_pAllocator; + return v8::Isolate::New(create_params); + } +}; + +class CV8Worker +{ +private: + static CV8Initializer* m_pInitializer; + +public: + CV8Worker() {} + ~CV8Worker() {} + + static void Initialize() + { + if (NULL == m_pInitializer) + m_pInitializer = new CV8Initializer(); + } + + static void Dispose() + { + if (NULL != m_pInitializer) + delete m_pInitializer; + m_pInitializer = NULL; + } + + static CV8Initializer* getInitializer() + { + if (NULL == m_pInitializer) + { + m_pInitializer = new CV8Initializer(); + } + + return CV8Worker::m_pInitializer; + } + + static v8::Isolate* GetCurrent() + { + return v8::Isolate::GetCurrent(); + } + static v8::Local GetCurrentContext() + { + return v8::Isolate::GetCurrent()->GetCurrentContext(); + } +}; + +namespace NSJSBase +{ + + template + class CJSValueV8Template : public B + { + public: + v8::Local value; + + CJSValueV8Template() + { + } + + CJSValueV8Template(const v8::Local& _value) + { + value = _value; + } + + public: + + virtual ~CJSValueV8Template() + { + value.Clear(); + } + + virtual bool isUndefined() + { + return value.IsEmpty() ? false : value->IsUndefined(); + } + virtual bool isNull() + { + return value.IsEmpty() ? false : value->IsNull(); + } + virtual bool isBool() + { + return value.IsEmpty() ? false : value->IsBoolean(); + } + virtual bool isNumber() + { + return value.IsEmpty() ? false : value->IsNumber(); + } + virtual bool isString() + { + return value.IsEmpty() ? false : value->IsString(); + } + virtual bool isArray() + { + return value.IsEmpty() ? false : value->IsArray(); + } + virtual bool isTypedArray() + { + return value.IsEmpty() ? false : value->IsTypedArray(); + } + virtual bool isObject() + { + return value.IsEmpty() ? false : value->IsObject(); + } + virtual bool isFunction() + { + return value.IsEmpty() ? false : value->IsFunction(); + } + virtual bool isEmpty() + { + return value.IsEmpty(); + } + + virtual void doUndefined() + { + } + + virtual void doNull() + { + } + + virtual bool toBool() + { + return false; + } + + virtual int toInt32() + { + return 0; + } + + virtual double toDouble() + { + return 0; + } + + virtual std::string toStringA() + { + return ""; + } + + virtual std::wstring toStringW() + { + return L""; + } + + virtual CJSObject* toObject(); + virtual CJSArray* toArray(); + virtual CJSTypedArray* toTypedArray(); + virtual CJSFunction* toFunction(); + }; + + class CJSValueV8TemplatePrimitive : public CJSValueV8Template + { + public: + CJSValueV8TemplatePrimitive() + { + } + CJSValueV8TemplatePrimitive(const v8::Local& _value) : CJSValueV8Template(_value) + { + } + + virtual ~CJSValueV8TemplatePrimitive() + { + value.Clear(); + } + + virtual void doUndefined() + { + value = v8::Undefined(CV8Worker::GetCurrent()); + } + + virtual void doNull() + { + value = v8::Null(CV8Worker::GetCurrent()); + } + + virtual bool toBool() + { +#ifdef V8_VERSION_87_PLUS + return value.IsEmpty() ? false : value->BooleanValue(V8IsolateOneArg); +#else + return value.IsEmpty() ? false : value->BooleanValue(V8ContextOneArg).ToChecked(); +#endif + } + + virtual int toInt32() + { + return value.IsEmpty() ? 0 : value->Int32Value(V8ContextOneArg).ToChecked(); + } + + virtual double toDouble() + { + return value.IsEmpty() ? 0 : value->NumberValue(V8ContextOneArg).ToChecked(); + } + + virtual std::string toStringA() + { + if (value.IsEmpty()) + return ""; + + v8::String::Utf8Value data(V8IsolateFirstArg value); + if (NULL == *data) + return ""; + + return std::string((char*)(*data), data.length()); + } + + virtual std::wstring toStringW() + { + if (value.IsEmpty()) + return L""; + + v8::String::Utf8Value data(V8IsolateFirstArg value); + if (NULL == *data) + return L""; + + return NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)(*data), data.length()); + } + }; + + typedef CJSValueV8TemplatePrimitive CJSValueV8; + + class CJSObjectV8 : public CJSValueV8Template + { + public: + CJSObjectV8() + { + } + + virtual ~CJSObjectV8() + { + value.Clear(); + } + + virtual CJSValue* get(const char* name) + { + CJSValueV8* _value = new CJSValueV8(); + v8::Local _name = CreateV8String(CV8Worker::GetCurrent(), name); + _value->value = value->Get(V8ContextFirstArg _name).ToLocalChecked(); + return _value; + } + + virtual void set(const char* name, CJSValue* value_param) + { + CJSValueV8* _value = static_cast(value_param); + v8::Local _name = CreateV8String(CV8Worker::GetCurrent(), name); + value->Set(V8ContextFirstArg _name, _value->value); + } + + virtual void set(const char* name, const int& _value) + { + v8::Isolate* isolate = CV8Worker::GetCurrent(); + v8::Local _name = CreateV8String(CV8Worker::GetCurrent(), name); + value->Set(V8ContextFirstArg _name, v8::Integer::New(isolate, _value)); + } + + virtual void set(const char* name, const double& _value) + { + v8::Isolate* isolate = CV8Worker::GetCurrent(); + v8::Local _name = CreateV8String(CV8Worker::GetCurrent(), name); + value->Set(V8ContextFirstArg _name, v8::Number::New(isolate, _value)); + } + + virtual CJSEmbedObject* getNative() + { + v8::Handle field = v8::Handle::Cast(value->GetInternalField(0)); + return (CJSEmbedObject*)field->Value(); + } + + virtual JSSmart call_func(const char* name, const int argc = 0, JSSmart argv[] = NULL) + { + v8::Local _name = CreateV8String(CV8Worker::GetCurrent(), name); + v8::Handle _func = value->Get(V8ContextFirstArg _name).ToLocalChecked(); + + CJSValueV8* _return = new CJSValueV8(); + if (_func->IsFunction()) + { + v8::Handle _funcN = v8::Handle::Cast(_func); + + if (0 == argc) + { + _return->value = _funcN->Call(V8ContextFirstArg value, 0, NULL).ToLocalChecked(); + } + else + { + v8::Local* args = new v8::Local[argc]; + for (int i = 0; i < argc; ++i) + { + CJSValueV8* _value_arg = static_cast(argv[i].operator ->()); + args[i] = _value_arg->value; + } + _return->value = _funcN->Call(V8ContextFirstArg value, argc, args).ToLocalChecked(); + RELEASEARRAYOBJECTS(args); + } + } + + JSSmart _ret = _return; + return _ret; + } + + virtual JSSmart toValue() + { + CJSValueV8* _value = new CJSValueV8(); + _value->value = value; + return _value; + } + }; + + class CJSArrayV8 : public CJSValueV8Template + { + public: + int m_count; + public: + CJSArrayV8() + { + m_count = 0; + } + virtual ~CJSArrayV8() + { + value.Clear(); + } + + virtual int getCount() + { + return value->Length(); + } + + virtual JSSmart get(const int& index) + { + CJSValueV8* _value = new CJSValueV8(); + _value->value = value->Get(V8ContextFirstArg index).ToLocalChecked(); + return _value; + } + + virtual void set(const int& index, CJSValue* value_param) + { + CJSValueV8* _value = static_cast(value_param); + value->Set(V8ContextFirstArg index, _value->value); + } + + virtual void add(CJSValue* value_param) + { + CJSValueV8* _value = static_cast(value_param); + value->Set(V8ContextFirstArg getCount(), _value->value); + } + + virtual void set(const int& index, const bool& _value) + { + value->Set(V8ContextFirstArg index, v8::Boolean::New(CV8Worker::GetCurrent(), _value)); + } + + virtual void set(const int& index, const int& _value) + { + value->Set(V8ContextFirstArg index, v8::Integer::New(CV8Worker::GetCurrent(), _value)); + } + + virtual void set(const int& index, const double& _value) + { + value->Set(V8ContextFirstArg index, v8::Number::New(CV8Worker::GetCurrent(), _value)); + } + + virtual void add_null() + { + value->Set(V8ContextFirstArg m_count++, v8::Null(CV8Worker::GetCurrent())); + } + + virtual void add_undefined() + { + value->Set(V8ContextFirstArg m_count++, v8::Undefined(CV8Worker::GetCurrent())); + } + + virtual void add_bool(const bool& _value) + { + value->Set(V8ContextFirstArg m_count++, v8::Boolean::New(CV8Worker::GetCurrent(), _value)); + } + + virtual void add_byte(const BYTE& _value) + { + value->Set(V8ContextFirstArg m_count++, v8::Integer::New(CV8Worker::GetCurrent(), (int)_value)); + } + + virtual void add_int(const int& _value) + { + value->Set(V8ContextFirstArg m_count++, v8::Integer::New(CV8Worker::GetCurrent(), _value)); + } + + virtual void add_double(const double& _value) + { + value->Set(V8ContextFirstArg m_count++, v8::Number::New(CV8Worker::GetCurrent(), _value)); + } + + virtual void add_stringa(const std::string& _value) + { + value->Set(V8ContextFirstArg m_count++, CreateV8String(CV8Worker::GetCurrent(), _value)); + } + + virtual void add_string(const std::wstring& _value) + { + std::string sReturn = NSFile::CUtf8Converter::GetUtf8StringFromUnicode(_value); + add_stringa(sReturn); + } + + virtual JSSmart toValue() + { + CJSValueV8* _value = new CJSValueV8(); + _value->value = value; + return _value; + } + }; + + class CJSTypedArrayV8 : public CJSValueV8Template + { + public: + CJSTypedArrayV8(BYTE* data = NULL, int count = 0) + { + if (0 < count) + { + v8::Local _buffer = v8::ArrayBuffer::New(CV8Worker::GetCurrent(), (void*)data, (size_t)count); + value = v8::Uint8Array::New(_buffer, 0, (size_t)count); + } + } + virtual ~CJSTypedArrayV8() + { + value.Clear(); + } + + virtual int getCount() + { + return (int)value->ByteLength(); + } + + virtual const BYTE* getData() + { + return (BYTE*)value->Buffer()->Externalize().Data(); + } + }; + + class CJSFunctionV8 : public CJSValueV8Template + { + public: + CJSFunctionV8() + { + } + virtual ~CJSFunctionV8() + { + value.Clear(); + } + + virtual CJSValue* Call(CJSValue* recv, int argc, JSSmart argv[]) + { + CJSValueV8* _value = static_cast(recv); + CJSValueV8* _return = new CJSValueV8(); + if (0 == argc) + { + _return->value = value->Call(V8ContextFirstArg _value->value, 0, NULL).ToLocalChecked(); + } + else + { + v8::Local* args = new v8::Local[argc]; + for (int i = 0; i < argc; ++i) + { + CJSValueV8* _value_arg = static_cast(argv[i].operator ->()); + args[i] = _value_arg->value; + } + _return->value = value->Call(V8ContextFirstArg _value->value, argc, args).ToLocalChecked(); + RELEASEARRAYOBJECTS(args); + } + return _return; + } + }; + + template + CJSObject* CJSValueV8Template::toObject() + { + CJSObjectV8* _value = new CJSObjectV8(); + _value->value = value->ToObject(V8ContextOneArg).ToLocalChecked(); + return _value; + } + + template + CJSArray* CJSValueV8Template::toArray() + { + CJSArrayV8* _value = new CJSArrayV8(); + _value->value = v8::Local::Cast(value); + return _value; + } + + template + CJSTypedArray* CJSValueV8Template::toTypedArray() + { + CJSTypedArrayV8* _value = new CJSTypedArrayV8(); + _value->value = v8::Local::Cast(value); + return _value; + } + + template + CJSFunction* CJSValueV8Template::toFunction() + { + CJSFunctionV8* _value = new CJSFunctionV8(); + _value->value = v8::Local::Cast(value); + return _value; + } +} + +namespace NSJSBase +{ + // TRY - CATCH + class CV8TryCatch : public CJSTryCatch + { + private: + v8::TryCatch try_catch; + + public: + CV8TryCatch() : CJSTryCatch(), try_catch(V8IsolateOneArg) + { + } + virtual ~CV8TryCatch() + { + } + + public: + virtual bool Check() + { + if (try_catch.HasCaught()) + { + int nLineNumber = try_catch.Message()->GetLineNumber(V8ContextOneArg).ToChecked(); + + JSSmart _line = new CJSValueV8(); + _line->value = try_catch.Message()->GetSourceLine(V8ContextOneArg).ToLocalChecked(); + + JSSmart _exception = new CJSValueV8(); + _exception->value = try_catch.Message()->Get(); + + std::string strCode = _line->toStringA(); + std::string strException = _exception->toStringA(); + +#if 0 && !defined(__ANDROID__) + FILE* f = fopen("D:\\errors.txt", "a+"); + fprintf(f, "error: "); + fprintf(f, strCode.c_str()); + fprintf(f, "\n"); + fprintf(f, strException.c_str()); + fprintf(f, "\n"); + fclose(f); +#endif + +#ifdef __ANDROID__ + LOGE("NSJSBase::CV8TryCatch::Check() - error:"); + LOGE(std::to_string(nLineNumber).c_str()); + LOGE(strCode.c_str()); + LOGE(strException.c_str()); +#endif + return true; + } + return false; + } + }; +} + +namespace NSJSBase +{ + class CJSContextPrivate + { + public: + CV8Worker m_oWorker; + v8::Isolate* m_isolate; + + v8::Local m_global; + v8::Local m_context; + + public: + CJSContextPrivate() : m_oWorker(), m_isolate(NULL) + { + } + }; +} + +namespace NSV8Objects +{ + static void Template_Set(v8::Local& obj, const char* name, v8::FunctionCallback callback) + { + v8::Isolate* current = CV8Worker::GetCurrent(); + obj->Set(CreateV8String(current, name), v8::FunctionTemplate::New(current, callback)); + } +} + +inline NSJSBase::CJSEmbedObject* unwrap_native(const v8::Local& value) +{ + v8::Handle field = v8::Handle::Cast(value->GetInternalField(0)); + return (NSJSBase::CJSEmbedObject*)field->Value(); +} +inline NSJSBase::CJSEmbedObject* unwrap_native2(const v8::Local& value) +{ + v8::Local _obj = value->ToObject(V8ContextOneArg).ToLocalChecked(); + v8::Handle field = v8::Handle::Cast(_obj->GetInternalField(0)); + return (NSJSBase::CJSEmbedObject*)field->Value(); +} + +inline JSSmart js_value(const v8::Local& value) +{ + return new NSJSBase::CJSValueV8(value); +} +inline JSSmart js_object(const v8::Local& value) +{ + NSJSBase::CJSObjectV8* _ret = new NSJSBase::CJSObjectV8(); + _ret->value = value; + return _ret; +} +inline void js_return(const v8::FunctionCallbackInfo& args, JSSmart& value) +{ + if (value.is_init()) + { + NSJSBase::CJSValueV8* _value = (NSJSBase::CJSValueV8*)(value.operator ->()); + args.GetReturnValue().Set(_value->value); + } +} +inline void js_return(const v8::PropertyCallbackInfo& info, JSSmart& value) +{ + if (value.is_init()) + { + NSJSBase::CJSValueV8* _value = (NSJSBase::CJSValueV8*)(value.operator ->()); + info.GetReturnValue().Set(_value->value); + } +} + +#define PROPERTY_GET(NAME, NAME_EMBED) \ + void NAME(v8::Local _name, const v8::PropertyCallbackInfo& info) \ + { \ + CURRENTWRAPPER* _this = (CURRENTWRAPPER*)unwrap_native(info.Holder()); \ + JSSmart ret = _this->NAME_EMBED(); \ + js_return(info, ret); \ + } + +#define FUNCTION_WRAPPER_V8(NAME, NAME_EMBED) \ + void NAME(const v8::FunctionCallbackInfo& args) \ + { \ + CURRENTWRAPPER* _this = (CURRENTWRAPPER*)unwrap_native(args.This()); \ + JSSmart ret = _this->NAME_EMBED(); \ + js_return(args, ret); \ + } + +#define FUNCTION_WRAPPER_V8_1(NAME, NAME_EMBED) \ + void NAME(const v8::FunctionCallbackInfo& args) \ + { \ + CURRENTWRAPPER* _this = (CURRENTWRAPPER*)unwrap_native(args.This()); \ + JSSmart ret = _this->NAME_EMBED(js_value(args[0])); \ + js_return(args, ret); \ + } +#define FUNCTION_WRAPPER_V8_2(NAME, NAME_EMBED) \ + void NAME(const v8::FunctionCallbackInfo& args) \ + { \ + CURRENTWRAPPER* _this = (CURRENTWRAPPER*)unwrap_native(args.This()); \ + JSSmart ret = _this->NAME_EMBED(js_value(args[0]), js_value(args[1])); \ + js_return(args, ret); \ + } +#define FUNCTION_WRAPPER_V8_3(NAME, NAME_EMBED) \ + void NAME(const v8::FunctionCallbackInfo& args) \ + { \ + CURRENTWRAPPER* _this = (CURRENTWRAPPER*)unwrap_native(args.This()); \ + JSSmart ret = _this->NAME_EMBED(js_value(args[0]), js_value(args[1]), js_value(args[2])); \ + js_return(args, ret); \ + } +#define FUNCTION_WRAPPER_V8_4(NAME, NAME_EMBED) \ + void NAME(const v8::FunctionCallbackInfo& args) \ + { \ + CURRENTWRAPPER* _this = (CURRENTWRAPPER*)unwrap_native(args.This()); \ + JSSmart ret = _this->NAME_EMBED(js_value(args[0]), js_value(args[1]), js_value(args[2]), js_value(args[3])); \ + js_return(args, ret); \ + } +#define FUNCTION_WRAPPER_V8_5(NAME, NAME_EMBED) \ + void NAME(const v8::FunctionCallbackInfo& args) \ + { \ + CURRENTWRAPPER* _this = (CURRENTWRAPPER*)unwrap_native(args.This()); \ + JSSmart ret = _this->NAME_EMBED(js_value(args[0]), js_value(args[1]), js_value(args[2]), js_value(args[3]), js_value(args[4])); \ + js_return(args, ret); \ + } +#define FUNCTION_WRAPPER_V8_6(NAME, NAME_EMBED) \ + void NAME(const v8::FunctionCallbackInfo& args) \ + { \ + CURRENTWRAPPER* _this = (CURRENTWRAPPER*)unwrap_native(args.This()); \ + JSSmart ret = _this->NAME_EMBED(js_value(args[0]), js_value(args[1]), js_value(args[2]), js_value(args[3]), js_value(args[4]), js_value(args[5])); \ + js_return(args, ret); \ + } +#define FUNCTION_WRAPPER_V8_7(NAME, NAME_EMBED) \ +void NAME(const v8::FunctionCallbackInfo& args) \ + { \ + CURRENTWRAPPER* _this = (CURRENTWRAPPER*)unwrap_native(args.This()); \ + JSSmart ret = _this->NAME_EMBED(js_value(args[0]), js_value(args[1]), js_value(args[2]), js_value(args[3]), js_value(args[4]), \ + js_value(args[5]), js_value(args[6])); \ + js_return(args, ret); \ + } +#define FUNCTION_WRAPPER_V8_8(NAME, NAME_EMBED) \ +void NAME(const v8::FunctionCallbackInfo& args) \ + { \ + CURRENTWRAPPER* _this = (CURRENTWRAPPER*)unwrap_native(args.This()); \ + JSSmart ret = _this->NAME_EMBED(js_value(args[0]), js_value(args[1]), js_value(args[2]), js_value(args[3]), js_value(args[4]), \ + js_value(args[5]), js_value(args[6]), js_value(args[7])); \ + js_return(args, ret); \ + } +#define FUNCTION_WRAPPER_V8_9(NAME, NAME_EMBED) \ +void NAME(const v8::FunctionCallbackInfo& args) \ + { \ + CURRENTWRAPPER* _this = (CURRENTWRAPPER*)unwrap_native(args.This()); \ + JSSmart ret = _this->NAME_EMBED(js_value(args[0]), js_value(args[1]), js_value(args[2]), js_value(args[3]), js_value(args[4]), \ + js_value(args[5]), js_value(args[6]), js_value(args[7]), js_value(args[8])); \ + js_return(args, ret); \ + } +#define FUNCTION_WRAPPER_V8_10(NAME, NAME_EMBED) \ + void NAME(const v8::FunctionCallbackInfo& args) \ + { \ + CURRENTWRAPPER* _this = (CURRENTWRAPPER*)unwrap_native(args.This()); \ + JSSmart ret = _this->NAME_EMBED(js_value(args[0]), js_value(args[1]), js_value(args[2]), js_value(args[3]), js_value(args[4]), js_value(args[5]), \ + js_value(args[6]), js_value(args[7]), js_value(args[8]), js_value(args[9])); \ + js_return(args, ret); \ + } +#define FUNCTION_WRAPPER_V8_13(NAME, NAME_EMBED) \ + void NAME(const v8::FunctionCallbackInfo& args) \ + { \ + CURRENTWRAPPER* _this = (CURRENTWRAPPER*)unwrap_native(args.This()); \ + JSSmart ret = _this->NAME_EMBED(js_value(args[0]), js_value(args[1]), js_value(args[2]), js_value(args[3]), js_value(args[4]), js_value(args[5]), \ + js_value(args[6]), js_value(args[7]), js_value(args[8]), js_value(args[9]), js_value(args[10]), js_value(args[11]), \ + js_value(args[12])); \ + js_return(args, ret); \ + } + +#endif // _BUILD_NATIVE_CONTROL_V8_BASE_H_ diff --git a/DesktopEditor/doctrenderer/memorystream.cpp b/DesktopEditor/doctrenderer/memorystream.cpp deleted file mode 100644 index 3cedfa4d15..0000000000 --- a/DesktopEditor/doctrenderer/memorystream.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2019 - * - * 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-12 Ernesta Birznieka-Upisha - * 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 - * - */ -#include "memorystream.h" - -// wrap_methods ------------- -CMemoryStream* unwrap_memorystream(v8::Handle obj) -{ - v8::Handle field = v8::Handle::Cast(obj->GetInternalField(0)); - return static_cast(field->Value()); -} - -void _ms_write_byte(const v8::FunctionCallbackInfo& args) -{ - CMemoryStream* pNative = unwrap_memorystream(args.This()); - - BYTE arg = (BYTE)CV8Convert::ToInt(args[0]); - pNative->WriteBYTE(arg); - - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); -} -void _ms_write_bool(const v8::FunctionCallbackInfo& args) -{ - CMemoryStream* pNative = unwrap_memorystream(args.This()); - - BYTE arg = (BYTE)CV8Convert::ToBool(args[0]); - pNative->WriteBYTE(arg ? 1 : 0); - - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); -} -void _ms_write_long(const v8::FunctionCallbackInfo& args) -{ - CMemoryStream* pNative = unwrap_memorystream(args.This()); - - LONG arg = (LONG)CV8Convert::ToInt(args[0]); - pNative->WriteLONG(arg); - - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); -} -void _ms_write_double(const v8::FunctionCallbackInfo& args) -{ - CMemoryStream* pNative = unwrap_memorystream(args.This()); - - double arg = CV8Convert::ToDouble(args[0]); - pNative->WriteLONG((LONG)(arg * 100000)); - - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); -} - -void _ms_writestring1(const v8::FunctionCallbackInfo& args) -{ - CMemoryStream* pNative = unwrap_memorystream(args.This()); - v8::String::Value data(ISOLATE_IF_7 args[0]); - pNative->WriteString((wchar_t*)*data, data.length()); - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); -} -void _ms_writestring2(const v8::FunctionCallbackInfo& args) -{ - CMemoryStream* pNative = unwrap_memorystream(args.This()); - v8::String::Value data(ISOLATE_IF_7 args[0]); - pNative->WriteString2((wchar_t*)*data, data.length()); - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); -} - -void _ms_copy(const v8::FunctionCallbackInfo& args) -{ - CMemoryStream* pNative = unwrap_memorystream(args.This()); - - CMemoryStream* pNative2 = unwrap_memorystream(args[0]->ToObject()); - size_t pos = (size_t)CV8Convert::ToUint(args[1]); - size_t len = (size_t)CV8Convert::ToUint(args[2]); - - pNative->Copy(pNative2, pos, len); - - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); -} - -void _ms_clearnoattack(const v8::FunctionCallbackInfo& args) -{ - CMemoryStream* pNative = unwrap_memorystream(args.This()); - pNative->ClearNoAttack(); - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); -} - -void _ms_pos(v8::Local name, const v8::PropertyCallbackInfo& info) -{ - CMemoryStream* pNative = unwrap_memorystream(info.Holder()); - info.GetReturnValue().Set(v8::Integer::New(v8::Isolate::GetCurrent(), pNative->GetSize())); -} - -v8::Handle CreateMemoryStreamTemplate(v8::Isolate* isolate) -{ - //v8::HandleScope handle_scope(isolate); - - v8::Local result = v8::ObjectTemplate::New(isolate); - result->SetInternalFieldCount(1); // отводим в нем место для хранения CNativeControl - - v8::Isolate* current = v8::Isolate::GetCurrent(); - - // property - result->SetAccessor(v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), "pos"), _ms_pos); // получить код ошибки - - // прописываем функции - методы объекта - result->Set(current, "Copy", v8::FunctionTemplate::New(current, _ms_copy)); - result->Set(current, "ClearNoAttack", v8::FunctionTemplate::New(current, _ms_clearnoattack)); - result->Set(current, "WriteByte", v8::FunctionTemplate::New(current, _ms_write_byte)); - result->Set(current, "WriteBool", v8::FunctionTemplate::New(current, _ms_write_bool)); - result->Set(current, "WriteLong", v8::FunctionTemplate::New(current, _ms_write_long)); - result->Set(current, "WriteDouble", v8::FunctionTemplate::New(current, _ms_write_double)); - result->Set(current, "WriteString", v8::FunctionTemplate::New(current, _ms_writestring1)); - result->Set(current, "WriteString2", v8::FunctionTemplate::New(current, _ms_writestring2)); - - // возвращаем временный хэндл хитрым образом, который переносит наш хэндл в предыдущий HandleScope и не дает ему - // уничтожиться при уничтожении "нашего" HandleScope - handle_scope - - //return handle_scope.Close(result); - return result; -} - diff --git a/DesktopEditor/doctrenderer/memorystream.h b/DesktopEditor/doctrenderer/memorystream.h index 233bc91010..1636a5bf67 100644 --- a/DesktopEditor/doctrenderer/memorystream.h +++ b/DesktopEditor/doctrenderer/memorystream.h @@ -36,60 +36,8 @@ #include "../common/Types.h" #include "../common/File.h" -#include "v8.h" -#include "libplatform/libplatform.h" - -#if V8_MAJOR_VERSION < 7 -#define ISOLATE_IF_7 -#else -#define ISOLATE_IF_7 v8::Isolate::GetCurrent(), -#endif - -class CV8Convert +namespace NSMemoryStream { -public: - static int ToInt(const v8::Local& v) - { - return v->ToInt32(v8::Isolate::GetCurrent()->GetCurrentContext()).FromMaybe(v8::Local())->Value(); - } - static unsigned int ToUint(const v8::Local& v) - { - return v->ToUint32(v8::Isolate::GetCurrent()->GetCurrentContext()).FromMaybe(v8::Local())->Value(); - } - static double ToDouble(const v8::Local& v) - { - return v->ToNumber(v8::Isolate::GetCurrent()->GetCurrentContext()).FromMaybe(v8::Local())->Value(); - } - static bool ToBool(const v8::Local& v) - { - return v->ToBoolean(v8::Isolate::GetCurrent()->GetCurrentContext()).FromMaybe(v8::Local())->Value(); - } - static std::wstring ToString(v8::Local v) - { - v8::String::Utf8Value data(ISOLATE_IF_7 v); - if (NULL == *data) - return L""; - - return NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)(*data), data.length()); - } - static std::string ToStringA(v8::Local v) - { - v8::String::Utf8Value data(ISOLATE_IF_7 v); - const char* p = (char*)*data; - if (NULL == p) - return ""; - return std::string(p); - } - static std::wstring GetSourceLine(const v8::Local& m) - { - return ToString(m->GetSourceLine(v8::Isolate::GetCurrent()->GetCurrentContext()).FromMaybe(v8::Local())); - } - static std::wstring GetMessage(const v8::Local& m) - { - return ToString(m->Get()); - } -}; - class CMemoryStream { private: @@ -216,7 +164,19 @@ public: m_pBufferMem += sizeof(USHORT); int nLen2 = nLen << 1; - memcpy(m_pBufferMem, pData, nLen2); + if (sizeof(wchar_t) == 2) + { + memcpy(m_pBufferMem, pData, nLen2); + } + else + { + int len = nLen >> 1; + USHORT* mass = new USHORT[len]; + for (int i = 0; i < len; ++i) + mass[i] = (USHORT)pData[i]; + memcpy(m_pBufferMem, mass, nLen2); + RELEASEARRAYOBJECTS(mass); + } m_pBufferMem += nLen2; } inline void WriteString2(const wchar_t* pData, int nLen) @@ -227,29 +187,22 @@ public: *((LONG*)(m_pBufferMem)) = (LONG)nLen2; m_pBufferMem += sizeof(LONG); - memcpy(m_pBufferMem, pData, nLen2); + if (sizeof(wchar_t) == 2) + { + memcpy(m_pBufferMem, pData, nLen2); + } + else + { + USHORT* mass = new USHORT[nLen]; + for (int i = 0; i < nLen; ++i) + mass[i] = (USHORT)pData[i]; + memcpy(m_pBufferMem, mass, nLen2); + RELEASEARRAYOBJECTS(mass); + } m_pBufferMem += nLen2; } }; - -// wrap_methods ------------- -CMemoryStream* unwrap_memorystream(v8::Handle obj); - -void _ms_write_byte(const v8::FunctionCallbackInfo& args); -void _ms_write_bool(const v8::FunctionCallbackInfo& args); -void _ms_write_long(const v8::FunctionCallbackInfo& args); -void _ms_write_double(const v8::FunctionCallbackInfo& args); - -void _ms_writestring1(const v8::FunctionCallbackInfo& args); -void _ms_writestring2(const v8::FunctionCallbackInfo& args); - -void _ms_copy(const v8::FunctionCallbackInfo& args); - -void _ms_clearnoattack(const v8::FunctionCallbackInfo& args); - -void _ms_pos(v8::Local name, const v8::PropertyCallbackInfo& info); - -v8::Handle CreateMemoryStreamTemplate(v8::Isolate* isolate); +} #endif // MEMORYSTREAM diff --git a/DesktopEditor/doctrenderer/nativebuilder.cpp b/DesktopEditor/doctrenderer/nativebuilder.cpp deleted file mode 100644 index 601c0e10d0..0000000000 --- a/DesktopEditor/doctrenderer/nativebuilder.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/* - * (c) Copyright Ascensio System SIA 2010-2019 - * - * 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-12 Ernesta Birznieka-Upisha - * 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 - * - */ -#include "nativebuilder.h" -#include "docbuilder_p.h" - -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); - - NSCommon::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) - m_bIsValid = true; -} -void CBuilderDocumentEmbed::CloseFile() -{ - if (!m_sFolder.empty()) - NSDirectory::DeleteDirectory(m_sFolder); - m_bIsValid = false; - m_sFolder = L""; -} - -CBuilderEmbed* unwrap_builder_embed(v8::Handle obj) -{ - v8::Handle field = v8::Handle::Cast(obj->GetInternalField(0)); - return static_cast(field->Value()); -} -CBuilderDocumentEmbed* unwrap_builder_doc_embed(v8::Handle obj) -{ - v8::Handle field = v8::Handle::Cast(obj->GetInternalField(0)); - return static_cast(field->Value()); -} - -void _builder_OpenFile(const v8::FunctionCallbackInfo& args) -{ - CBuilderEmbed* builder = unwrap_builder_embed(args.This()); - std::wstring sPath = CV8Convert::ToString(args[0]); - std::wstring sParams = (args.Length() > 1) ? CV8Convert::ToString(args[1]) : L""; - int ret = builder->m_pBuilder->OpenFile(sPath.c_str(), sParams.c_str()); - args.GetReturnValue().Set(v8::Int32::New(v8::Isolate::GetCurrent(), ret)); -} -void _builder_CreateFile(const v8::FunctionCallbackInfo& args) -{ - CBuilderEmbed* builder = unwrap_builder_embed(args.This()); - bool ret = builder->m_pBuilder->CreateFile(CV8Convert::ToInt(args[0])); - args.GetReturnValue().Set(v8::Boolean::New(v8::Isolate::GetCurrent(), ret)); -} -void _builder_SetTmpFolder(const v8::FunctionCallbackInfo& args) -{ - CBuilderEmbed* builder = unwrap_builder_embed(args.This()); - std::wstring sPath = CV8Convert::ToString(args[0]); - builder->m_pBuilder->SetTmpFolder(sPath.c_str()); -} -void _builder_SaveFile(const v8::FunctionCallbackInfo& args) -{ - CBuilderEmbed* builder = unwrap_builder_embed(args.This()); - int type = CV8Convert::ToInt(args[0]); - std::wstring sPath = CV8Convert::ToString(args[1]); - std::wstring sParams = (args.Length() > 2) ? CV8Convert::ToString(args[2]) : L""; - int ret = builder->m_pBuilder->SaveFile(type, sPath.c_str(), sParams.empty() ? NULL : sParams.c_str()); - args.GetReturnValue().Set(v8::Int32::New(v8::Isolate::GetCurrent(), ret)); -} -void _builder_CloseFile(const v8::FunctionCallbackInfo& args) -{ - CBuilderEmbed* builder = unwrap_builder_embed(args.This()); - builder->m_pBuilder->CloseFile(); -} - -void _builder_OpenTmpFile(const v8::FunctionCallbackInfo& args) -{ - CBuilderEmbed* builder = unwrap_builder_embed(args.This()); - std::wstring sPath = CV8Convert::ToString(args[0]); - std::wstring sParams = (args.Length() > 1) ? CV8Convert::ToString(args[1]) : L""; - v8::Local obj = _builder_CreateNativeTmpDoc(v8::Isolate::GetCurrent(), builder->m_pBuilder, sPath, sParams); - args.GetReturnValue().Set(obj); -} - -///////////////////////////////////////////////////////////////////////////////// -void _builder_doc_IsValid(const v8::FunctionCallbackInfo& args) -{ - CBuilderDocumentEmbed* doc = unwrap_builder_doc_embed(args.This()); - args.GetReturnValue().Set(v8::Boolean::New(v8::Isolate::GetCurrent(), doc->m_bIsValid)); -} -void _builder_doc_GetBinary(const v8::FunctionCallbackInfo& args) -{ - CBuilderDocumentEmbed* doc = unwrap_builder_doc_embed(args.This()); - - BYTE* pData = NULL; - DWORD dwSize = 0; - NSFile::CFileBinary::ReadAllBytes(doc->m_sFolder + L"/Editor.bin", &pData, dwSize); - - if (0 == dwSize) - { - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); - } - else - { - v8::Local _buffer = v8::ArrayBuffer::New(v8::Isolate::GetCurrent(), (void*)pData, (size_t)dwSize); - v8::Local _array = v8::Uint8Array::New(_buffer, 0, (size_t)dwSize); - args.GetReturnValue().Set(_array); - } -} -void _builder_doc_GetFolder(const v8::FunctionCallbackInfo& args) -{ - CBuilderDocumentEmbed* doc = unwrap_builder_doc_embed(args.This()); - std::string sUtf8 = U_TO_UTF8((doc->m_sFolder)); - args.GetReturnValue().Set(v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sUtf8.c_str())); -} -void _builder_doc_CloseFile(const v8::FunctionCallbackInfo& args) -{ - CBuilderDocumentEmbed* doc = unwrap_builder_doc_embed(args.This()); - doc->CloseFile(); -} -void _builder_doc_GetImageMap(const v8::FunctionCallbackInfo& args) -{ - CBuilderDocumentEmbed* doc = unwrap_builder_doc_embed(args.This()); - std::vector files = NSDirectory::GetFiles(doc->m_sFolder + L"/media"); - - v8::Local obj = v8::Object::New(v8::Isolate::GetCurrent()); - for (std::vector::iterator i = files.begin(); i != files.end(); i++) - { - std::wstring sFile = *i; NSCommon::string_replace(sFile, L"\\", L"/"); - std::wstring sName = L"media/" + NSFile::GetFileName(sFile); - - std::string sFileA = U_TO_UTF8(sFile); - std::string sNameA = U_TO_UTF8(sName); - - v8::Local _k = v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sNameA.c_str(), v8::String::kNormalString, -1); - v8::Local _v = v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sFileA.c_str(), v8::String::kNormalString, -1); - - obj->Set(_k, _v); - } - - args.GetReturnValue().Set(obj); -} - -///////////////////////////////////////////////////////////////////////////////// -v8::Local _builder_CreateNativeTmpDoc(v8::Isolate* isolate, NSDoctRenderer::CDocBuilder* pBuilder, const std::wstring& sFile, const std::wstring& sParams) -{ - v8::Local _template = v8::ObjectTemplate::New(isolate); - _template->SetInternalFieldCount(1); // отводим в нем место для хранения CNativeControl - - _template->Set(isolate, "IsValid", v8::FunctionTemplate::New(isolate, _builder_doc_IsValid)); - _template->Set(isolate, "GetBinary", v8::FunctionTemplate::New(isolate, _builder_doc_GetBinary)); - _template->Set(isolate, "GetFolder", v8::FunctionTemplate::New(isolate, _builder_doc_GetFolder)); - _template->Set(isolate, "Close", v8::FunctionTemplate::New(isolate, _builder_doc_CloseFile)); - _template->Set(isolate, "GetImageMap", v8::FunctionTemplate::New(isolate, _builder_doc_GetImageMap)); - - CBuilderDocumentEmbed* _embed = new CBuilderDocumentEmbed(); - _embed->m_pBuilder = pBuilder; - _embed->OpenFile(sFile, sParams); - - v8::Local obj = _template->NewInstance(); - obj->SetInternalField(0, v8::External::New(isolate, _embed)); - - return obj; -} -v8::Local _builder_CreateNative(v8::Isolate* isolate, NSDoctRenderer::CDocBuilder* builder) -{ - v8::Local _template = v8::ObjectTemplate::New(isolate); - _template->SetInternalFieldCount(1); - - _template->Set(isolate, "OpenFile", v8::FunctionTemplate::New(isolate, _builder_OpenFile)); - _template->Set(isolate, "CreateFile", v8::FunctionTemplate::New(isolate, _builder_CreateFile)); - _template->Set(isolate, "SetTmpFolder", v8::FunctionTemplate::New(isolate, _builder_SetTmpFolder)); - _template->Set(isolate, "SaveFile", v8::FunctionTemplate::New(isolate, _builder_SaveFile)); - _template->Set(isolate, "CloseFile", v8::FunctionTemplate::New(isolate, _builder_CloseFile)); - _template->Set(isolate, "OpenTmpFile", v8::FunctionTemplate::New(isolate, _builder_OpenTmpFile)); - - CBuilderEmbed* _embed = new CBuilderEmbed(); - _embed->m_pBuilder = builder; - - v8::Local obj = _template->NewInstance(); - obj->SetInternalField(0, v8::External::New(isolate, _embed)); - - return obj; -} diff --git a/DesktopEditor/doctrenderer/nativecontrol.cpp b/DesktopEditor/doctrenderer/nativecontrol.cpp index 963f5bf3cf..b7f8755097 100644 --- a/DesktopEditor/doctrenderer/nativecontrol.cpp +++ b/DesktopEditor/doctrenderer/nativecontrol.cpp @@ -121,528 +121,3 @@ std::wstring CImagesWorker::GetImage(const std::wstring& sUrl) return sUrlFile; return L"error"; } - -// wrap_methods ------------- -CNativeControl* unwrap_nativeobject(v8::Handle obj) -{ - v8::Handle field = v8::Handle::Cast(obj->GetInternalField(0)); - return static_cast(field->Value()); -} - -void _GetFilePath(const v8::FunctionCallbackInfo& args) -{ - CNativeControl* pNative = unwrap_nativeobject(args.This()); - std::string sReturn = NSFile::CUtf8Converter::GetUtf8StringFromUnicode(pNative->GetFilePath()); - args.GetReturnValue().Set(v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sReturn.c_str())); -} -void _SetFilePath(const v8::FunctionCallbackInfo& args) -{ - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); - - if (args.Length() < 1) - return; - - CNativeControl* pNative = unwrap_nativeobject(args.This()); - pNative->SetFilePath(CV8Convert::ToString(args[0])); -} -void _GetImagesPath(const v8::FunctionCallbackInfo& args) -{ - CNativeControl* pNative = unwrap_nativeobject(args.This()); - std::string sReturn = NSFile::CUtf8Converter::GetUtf8StringFromUnicode(pNative->m_strImagesDirectory); - args.GetReturnValue().Set(v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sReturn.c_str())); -} - -void _GetFontsDirectory(const v8::FunctionCallbackInfo& args) -{ - CNativeControl* pNative = unwrap_nativeobject(args.This()); - std::string sReturn = NSFile::CUtf8Converter::GetUtf8StringFromUnicode(pNative->m_strFontsDirectory); - args.GetReturnValue().Set(v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sReturn.c_str())); -} - -void _GetEditorType(const v8::FunctionCallbackInfo& args) -{ - CNativeControl* pNative = unwrap_nativeobject(args.This()); - std::string sReturn = NSFile::CUtf8Converter::GetUtf8StringFromUnicode(pNative->m_strEditorType); - args.GetReturnValue().Set(v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sReturn.c_str())); -} - -void _GetChangesCount(const v8::FunctionCallbackInfo& args) -{ - CNativeControl* pNative = unwrap_nativeobject(args.This()); - - int nCount = 0; - if (pNative->m_pChanges != NULL) - nCount = (int)pNative->m_pChanges->GetCount(); - args.GetReturnValue().Set(v8::Integer::New(v8::Isolate::GetCurrent(), nCount)); -} -void _GetChangesFile(const v8::FunctionCallbackInfo& args) -{ - CNativeControl* pNative = unwrap_nativeobject(args.This()); - - if (args.Length() < 1) - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); - - int nIndex = CV8Convert::ToInt(args[0]); - - std::string strFile = ""; - if (pNative->m_pChanges != NULL) - strFile = NSFile::CUtf8Converter::GetUtf8StringFromUnicode(pNative->m_pChanges->operator []((int)nIndex)); - - args.GetReturnValue().Set(v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), strFile.c_str())); -} - -void _GetFileId(const v8::FunctionCallbackInfo& args) -{ - CNativeControl* pNative = unwrap_nativeobject(args.This()); - std::string sReturn = NSFile::CUtf8Converter::GetUtf8StringFromUnicode(pNative->GetFileId()); - args.GetReturnValue().Set(v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sReturn.c_str())); -} -void _SetFileId(const v8::FunctionCallbackInfo& args) -{ - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); - - if (args.Length() < 1) - return; - - CNativeControl* pNative = unwrap_nativeobject(args.This()); - pNative->SetFileId(CV8Convert::ToString(args[0])); -} - -void _CheckNextChange(const v8::FunctionCallbackInfo& args) -{ - CNativeControl* pNative = unwrap_nativeobject(args.This()); - - pNative->m_nCurrentChangesNumber++; - if (-1 != pNative->m_nMaxChangesNumber) - { - if (pNative->m_nCurrentChangesNumber >= pNative->m_nMaxChangesNumber) - { - args.GetReturnValue().Set(v8::Boolean::New(v8::Isolate::GetCurrent(), false)); - return; - } - } - args.GetReturnValue().Set(v8::Boolean::New(v8::Isolate::GetCurrent(), true)); -} - -void _GetFileArrayBuffer(const v8::FunctionCallbackInfo& args) -{ - if (args.Length() < 1) - { - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); - return; - } - - CNativeControl* pNative = unwrap_nativeobject(args.This()); - - BYTE* pData = NULL; - DWORD len = 0; - pNative->getFileData(CV8Convert::ToString(args[0]), pData, len); - - v8::Local _buffer = v8::ArrayBuffer::New(v8::Isolate::GetCurrent(), (void*)pData, (size_t)len); - v8::Local _array = v8::Uint8Array::New(_buffer, 0, (size_t)len); - - args.GetReturnValue().Set(_array); -} - -void _GetFontArrayBuffer(const v8::FunctionCallbackInfo& args) -{ - if (args.Length() < 1) - { - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); - return; - } - - CNativeControl* pNative = unwrap_nativeobject(args.This()); - - BYTE* pData = NULL; - DWORD len = 0; - std::wstring strDir = pNative->m_strFontsDirectory; - -#if 0 - if (strDir.length() != 0) - { - strDir += L"/"; - strDir += CV8Convert::ToString(args[0]); - } - else -#endif - - // TODO: - // по идее файлы могут совпадать по имени, но лежать в разных директориях. - // и поэтому в AllFonts.js надо бы писать пути полные. - // пока оставим по-старому - std::wstring sFind = CV8Convert::ToString(args[0]); - bool bIsFullFilePath = (std::wstring::npos != sFind.find('\\') || std::wstring::npos != sFind.find('/')); - if (bIsFullFilePath) - { - bIsFullFilePath = NSFile::CFileBinary::Exists(sFind); - } - - if (!bIsFullFilePath) - { - std::map::iterator pair = pNative->m_map_fonts.find(sFind); - if (pair != pNative->m_map_fonts.end()) - strDir = pair->second; - else - strDir = pNative->m_sDefaultFont; - } - else - { - strDir = sFind; - } - - pNative->getFileData(strDir, pData, len); - - v8::Local _buffer = v8::ArrayBuffer::New(v8::Isolate::GetCurrent(), (void*)pData, (size_t)len); - v8::Local _array = v8::Uint8Array::New(_buffer, 0, (size_t)len); - - args.GetReturnValue().Set(_array); -} - -void _GetFileString(const v8::FunctionCallbackInfo& args) -{ - if (args.Length() < 1) - { - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); - return; - } - - CNativeControl* pNative = unwrap_nativeobject(args.This()); - - BYTE* pData = NULL; - DWORD len = 0; - pNative->getFileData(CV8Convert::ToString(args[0]), pData, len); - - args.GetReturnValue().Set(v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), (char*)pData, v8::String::kNormalString, len)); -} - -void _Save_AllocNative(const v8::FunctionCallbackInfo& args) -{ - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); - if (args.Length() < 1) - return; - - CNativeControl* pNative = unwrap_nativeobject(args.This()); - int nLen = CV8Convert::ToInt(args[0]); - - pNative->Save_Alloc(nLen); - - v8::Local _buffer = v8::ArrayBuffer::New(v8::Isolate::GetCurrent(), (void*)pNative->m_pSaveBinary, (size_t)pNative->m_nSaveLen); - v8::Local _array = v8::Uint8Array::New(_buffer, 0, (size_t)pNative->m_nSaveLen); - args.GetReturnValue().Set(_array); -} - -void _Save_ReAllocNative(const v8::FunctionCallbackInfo& args) -{ - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); - if (args.Length() < 2) - return; - - CNativeControl* pNative = unwrap_nativeobject(args.This()); - int _pos = CV8Convert::ToInt(args[0]); - int _len = CV8Convert::ToInt(args[1]); - - pNative->Save_ReAlloc(_pos, _len); - - v8::Local _buffer = v8::ArrayBuffer::New(v8::Isolate::GetCurrent(), (void*)pNative->m_pSaveBinary, (size_t)pNative->m_nSaveLen); - v8::Local _array = v8::Uint8Array::New(_buffer, 0, (size_t)pNative->m_nSaveLen); - args.GetReturnValue().Set(_array); -} - -void _Save_End(const v8::FunctionCallbackInfo& args) -{ - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); - if (args.Length() < 2) - return; - - CNativeControl* pNative = unwrap_nativeobject(args.This()); - std::string sHeader = CV8Convert::ToStringA(args[0]); - int _len = CV8Convert::ToInt(args[1]); - - pNative->Save_End(sHeader, _len); -} - -void _ConsoleLog(const v8::FunctionCallbackInfo& args) -{ - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); - if (args.Length() < 1) - return; - - CNativeControl* pNative = unwrap_nativeobject(args.This()); - pNative->ConsoleLog(CV8Convert::ToStringA(args[0])); -} - -void _SaveChanges(const v8::FunctionCallbackInfo& args) -{ - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); - if (args.Length() < 3) - return; - - CNativeControl* pNative = unwrap_nativeobject(args.This()); - pNative->DumpChanges(CV8Convert::ToStringA(args[0]), CV8Convert::ToInt(args[1]), CV8Convert::ToInt(args[2])); -} - -/// ZIP ----- -void _zipOpenFile(const v8::FunctionCallbackInfo& args) -{ - if (args.Length() < 1) - { - args.GetReturnValue().Set(v8::Null(v8::Isolate::GetCurrent())); - return; - } - - CNativeControl* pNative = unwrap_nativeobject(args.This()); - bool bIsOpen = pNative->m_oZipWorker.Open(CV8Convert::ToString(args[0])); - if (!bIsOpen) - { - args.GetReturnValue().Set(v8::Null(v8::Isolate::GetCurrent())); - return; - } - - v8::Local obj = v8::Object::New(v8::Isolate::GetCurrent()); - for (std::vector::iterator i = pNative->m_oZipWorker.m_arFiles.begin(); i != pNative->m_oZipWorker.m_arFiles.end(); i++) - { - std::string sFile = NSFile::CUtf8Converter::GetUtf8StringFromUnicode(*i); - - v8::Local _k = v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sFile.c_str(), v8::String::kNormalString, -1); - v8::Local _v = v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sFile.c_str(), v8::String::kNormalString, -1); - - obj->Set(_k, _v); - } - - args.GetReturnValue().Set(obj); -} - -void _zipOpenFileBase64(const v8::FunctionCallbackInfo& args) -{ - if (args.Length() < 1) - { - args.GetReturnValue().Set(v8::Null(v8::Isolate::GetCurrent())); - return; - } - - CNativeControl* pNative = unwrap_nativeobject(args.This()); - bool bIsOpen = pNative->m_oZipWorker.OpenBase64(CV8Convert::ToStringA(args[0])); - if (!bIsOpen) - { - args.GetReturnValue().Set(v8::Null(v8::Isolate::GetCurrent())); - return; - } - - v8::Local obj = v8::Object::New(v8::Isolate::GetCurrent()); - for (std::vector::iterator i = pNative->m_oZipWorker.m_arFiles.begin(); i != pNative->m_oZipWorker.m_arFiles.end(); i++) - { - std::string sFile = NSFile::CUtf8Converter::GetUtf8StringFromUnicode(*i); - - v8::Local _k = v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sFile.c_str(), v8::String::kNormalString, -1); - v8::Local _v = v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), sFile.c_str(), v8::String::kNormalString, -1); - - obj->Set(_k, _v); - } - - args.GetReturnValue().Set(obj); -} - -void _zipGetFileAsString(const v8::FunctionCallbackInfo& args) -{ - if (args.Length() < 1) - { - args.GetReturnValue().Set(v8::Null(v8::Isolate::GetCurrent())); - return; - } - - CNativeControl* pNative = unwrap_nativeobject(args.This()); - - BYTE* pData = NULL; - DWORD len = 0; - pNative->m_oZipWorker.GetFileData(CV8Convert::ToString(args[0]), pData, len); - - args.GetReturnValue().Set(v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), (char*)pData, v8::String::kNormalString, len)); -} - -void _zipGetFileAsBinary(const v8::FunctionCallbackInfo& args) -{ - if (args.Length() < 1) - { - args.GetReturnValue().Set(v8::Null(v8::Isolate::GetCurrent())); - return; - } - - CNativeControl* pNative = unwrap_nativeobject(args.This()); - - BYTE* pData = NULL; - DWORD len = 0; - pNative->m_oZipWorker.GetFileData(CV8Convert::ToString(args[0]), pData, len); - - v8::Local _buffer = v8::ArrayBuffer::New(v8::Isolate::GetCurrent(), (void*)pData, (size_t)len); - v8::Local _array = v8::Uint8Array::New(_buffer, 0, (size_t)len); - - args.GetReturnValue().Set(_array); -} - -void _zipCloseFile(const v8::FunctionCallbackInfo& args) -{ - CNativeControl* pNative = unwrap_nativeobject(args.This()); - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); - pNative->m_oZipWorker.Close(); -} -/// --------- - -void _AddImageInChanges(const v8::FunctionCallbackInfo& args) -{ - args.GetReturnValue().Set(v8::Undefined(v8::Isolate::GetCurrent())); - if (args.Length() < 1) - return; - - CNativeControl* pNative = unwrap_nativeobject(args.This()); - - std::wstring sImage = CV8Convert::ToString(args[0]); - if (sImage.empty()) - return; - - std::map::const_iterator iter = pNative->m_mapImagesInChanges.find(sImage); - if (iter == pNative->m_mapImagesInChanges.end()) - pNative->m_mapImagesInChanges.insert(std::pair(sImage, true)); -} - -// GetImageUrl -void _GetImageUrl(const v8::FunctionCallbackInfo& args) -{ - CNativeControl* pNative = unwrap_nativeobject(args.This()); - std::wstring sUrl = CV8Convert::ToString(args[0]); - - if (!pNative->m_pWorker) - pNative->m_pWorker = new CImagesWorker(pNative->m_strImagesDirectory); - - std::wstring sRet = pNative->m_pWorker->GetImage(sUrl); - std::string sRetA = U_TO_UTF8(sRet); - - args.GetReturnValue().Set(v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), (char*)sRetA.c_str(), v8::String::kNormalString, (int)sRetA.length())); -} - -v8::Handle CreateNativeControlTemplate(v8::Isolate* isolate) -{ - //v8::HandleScope handle_scope(isolate); - - v8::Local result = v8::ObjectTemplate::New(isolate); - result->SetInternalFieldCount(1); // отводим в нем место для хранения CNativeControl - - v8::Isolate* current = v8::Isolate::GetCurrent(); - - // прописываем функции - методы объекта - result->Set(current, "SetFilePath", v8::FunctionTemplate::New(current, _SetFilePath)); - result->Set(current, "GetFilePath", v8::FunctionTemplate::New(current, _GetFilePath)); - result->Set(current, "SetFileId", v8::FunctionTemplate::New(current, _SetFileId)); - result->Set(current, "GetFileId", v8::FunctionTemplate::New(current, _GetFileId)); - result->Set(current, "GetFileBinary", v8::FunctionTemplate::New(current, _GetFileArrayBuffer)); - result->Set(current, "GetFontBinary", v8::FunctionTemplate::New(current, _GetFontArrayBuffer)); - result->Set(current, "GetFontsDirectory", v8::FunctionTemplate::New(current, _GetFontsDirectory)); - result->Set(current, "GetFileString", v8::FunctionTemplate::New(current, _GetFileString)); - - result->Set(current, "GetEditorType", v8::FunctionTemplate::New(current, _GetEditorType)); - result->Set(current, "CheckNextChange", v8::FunctionTemplate::New(current, _CheckNextChange)); - - result->Set(current, "GetCountChanges", v8::FunctionTemplate::New(current, _GetChangesCount)); - result->Set(current, "GetChangesFile", v8::FunctionTemplate::New(current, _GetChangesFile)); - - result->Set(current, "Save_AllocNative", v8::FunctionTemplate::New(current, _Save_AllocNative)); - result->Set(current, "Save_ReAllocNative", v8::FunctionTemplate::New(current, _Save_ReAllocNative)); - result->Set(current, "Save_End", v8::FunctionTemplate::New(current, _Save_End)); - - result->Set(current, "AddImageInChanges", v8::FunctionTemplate::New(current, _AddImageInChanges)); - - result->Set(current, "ConsoleLog", v8::FunctionTemplate::New(current, _ConsoleLog)); - - result->Set(current, "ZipOpen", v8::FunctionTemplate::New(current, _zipOpenFile)); - result->Set(current, "ZipOpenBase64", v8::FunctionTemplate::New(current, _zipOpenFileBase64)); - result->Set(current, "ZipFileAsString", v8::FunctionTemplate::New(current, _zipGetFileAsString)); - result->Set(current, "ZipFileAsBinary", v8::FunctionTemplate::New(current, _zipGetFileAsBinary)); - result->Set(current, "ZipClose", v8::FunctionTemplate::New(current, _zipCloseFile)); - - result->Set(current, "getImageUrl", v8::FunctionTemplate::New(current, _GetImageUrl)); - result->Set(current, "getImagesDirectory", v8::FunctionTemplate::New(current, _GetImagesPath)); - - // возвращаем временный хэндл хитрым образом, который переносит наш хэндл в предыдущий HandleScope и не дает ему - // уничтожиться при уничтожении "нашего" HandleScope - handle_scope - - //return handle_scope.Close(result); - return result; -} - -v8::Handle CreateNativeControlTemplateBuilder(v8::Isolate* isolate) -{ - //v8::HandleScope handle_scope(isolate); - - v8::Local result = v8::ObjectTemplate::New(isolate); - result->SetInternalFieldCount(1); // отводим в нем место для хранения CNativeControl - - v8::Isolate* current = v8::Isolate::GetCurrent(); - - // прописываем функции - методы объекта - result->Set(current, "SetFilePath", v8::FunctionTemplate::New(current, _SetFilePath)); - result->Set(current, "GetFilePath", v8::FunctionTemplate::New(current, _GetFilePath)); - result->Set(current, "SetFileId", v8::FunctionTemplate::New(current, _SetFileId)); - result->Set(current, "GetFileId", v8::FunctionTemplate::New(current, _GetFileId)); - result->Set(current, "GetFileBinary", v8::FunctionTemplate::New(current, _GetFileArrayBuffer)); - result->Set(current, "GetFontBinary", v8::FunctionTemplate::New(current, _GetFontArrayBuffer)); - result->Set(current, "GetFontsDirectory", v8::FunctionTemplate::New(current, _GetFontsDirectory)); - result->Set(current, "GetFileString", v8::FunctionTemplate::New(current, _GetFileString)); - - result->Set(current, "GetEditorType", v8::FunctionTemplate::New(current, _GetEditorType)); - result->Set(current, "CheckNextChange", v8::FunctionTemplate::New(current, _CheckNextChange)); - - result->Set(current, "GetCountChanges", v8::FunctionTemplate::New(current, _GetChangesCount)); - result->Set(current, "GetChangesFile", v8::FunctionTemplate::New(current, _GetChangesFile)); - - result->Set(current, "Save_AllocNative", v8::FunctionTemplate::New(current, _Save_AllocNative)); - result->Set(current, "Save_ReAllocNative", v8::FunctionTemplate::New(current, _Save_ReAllocNative)); - result->Set(current, "Save_End", v8::FunctionTemplate::New(current, _Save_End)); - - result->Set(current, "AddImageInChanges", v8::FunctionTemplate::New(current, _AddImageInChanges)); - - result->Set(current, "ConsoleLog", v8::FunctionTemplate::New(current, _ConsoleLog)); - - result->Set(current, "SaveChanges", v8::FunctionTemplate::New(current, _SaveChanges)); - - result->Set(current, "ZipOpen", v8::FunctionTemplate::New(current, _zipOpenFile)); - result->Set(current, "ZipOpenBase64", v8::FunctionTemplate::New(current, _zipOpenFileBase64)); - result->Set(current, "ZipFileAsString", v8::FunctionTemplate::New(current, _zipGetFileAsString)); - result->Set(current, "ZipFileAsBinary", v8::FunctionTemplate::New(current, _zipGetFileAsBinary)); - result->Set(current, "ZipClose", v8::FunctionTemplate::New(current, _zipCloseFile)); - - result->Set(current, "getImageUrl", v8::FunctionTemplate::New(current, _GetImageUrl)); - result->Set(current, "getImagesDirectory", v8::FunctionTemplate::New(current, _GetImagesPath)); - - // возвращаем временный хэндл хитрым образом, который переносит наш хэндл в предыдущий HandleScope и не дает ему - // уничтожиться при уничтожении "нашего" HandleScope - handle_scope - - //return handle_scope.Close(result); - return result; -} -// -------------------------- - -void CV8Worker::Initialize() -{ - if (NULL == m_pInitializer) - m_pInitializer = new CV8Initializer(); -} - -void CV8Worker::Dispose() -{ - if (NULL != m_pInitializer) - delete m_pInitializer; - m_pInitializer = NULL; -} - -CV8Initializer* CV8Worker::getInitializer() -{ - if (NULL == m_pInitializer) - { - m_pInitializer = new CV8Initializer(); - } - - return CV8Worker::m_pInitializer; -} - -CV8Initializer* CV8Worker::m_pInitializer = NULL; -// -------------------------- diff --git a/DesktopEditor/doctrenderer/nativecontrol.h b/DesktopEditor/doctrenderer/nativecontrol.h index b925cb244c..cb1510ecb8 100644 --- a/DesktopEditor/doctrenderer/nativecontrol.h +++ b/DesktopEditor/doctrenderer/nativecontrol.h @@ -41,7 +41,7 @@ #include "../common/Array.h" #include "../../OfficeUtils/src/OfficeUtils.h" -#include "memorystream.h" +#include "js_internal/js_base.h" #include "../fontengine/application_generate_fonts_common.h" #if defined(CreateDirectory) @@ -67,10 +67,7 @@ public: public: - CZipWorker() - { - m_sWorkerFolder = L""; - } + CZipWorker() : m_sWorkerFolder(L"") {} ~CZipWorker() { @@ -136,9 +133,9 @@ public: url_correct2(m_sTmpFolder); int nStart = (int)m_sTmpFolder.length(); - for (std::vector::iterator i = arFiles.begin(); i != arFiles.end(); i++) + for (const std::wstring& i : arFiles) { - std::wstring sTmp = *i; + std::wstring sTmp = i; url_correct2(sTmp); m_arFiles.push_back(sTmp.substr(nStart + 1)); @@ -193,6 +190,9 @@ public: std::wstring GetImage(const std::wstring& sUrl); }; +using namespace NSJSBase; +namespace NSNativeControl +{ class CNativeControl { private: @@ -200,7 +200,7 @@ private: std::wstring m_strFileId; public: - CArray* m_pChanges; + std::vector* m_pChanges; std::wstring m_strFontsDirectory; @@ -233,29 +233,19 @@ public: CImagesWorker* m_pWorker; public: - CMemoryStream* m_pStream; - - CNativeControl() - { - m_pStream = NULL; - m_pChanges = NULL; - - m_nCurrentChangesNumber = -1; - m_nMaxChangesNumber = -1; - - m_pSaveBinary = NULL; - m_nSaveLen = 0; - m_nSaveBinaryLen = 0; - - m_sConsoleLogFile = L""; - - m_nCurrentChangesBuilderIndex = 0; - - m_pWorker = NULL; - } + CNativeControl() : + m_pChanges(NULL), + m_nCurrentChangesNumber(-1), + m_nMaxChangesNumber(-1), + m_pSaveBinary(NULL), + m_nSaveLen(0), + m_nSaveBinaryLen(0), + m_sConsoleLogFile(L""), + m_nCurrentChangesBuilderIndex(0), + m_pWorker(NULL) + {} ~CNativeControl() { - RELEASEOBJECT(m_pStream); m_pChanges = NULL; RELEASEARRAYOBJECTS(m_pSaveBinary); @@ -412,9 +402,9 @@ public: std::vector* pFonts = pApplication->GetList()->GetFonts(); - for (std::vector::iterator i = pFonts->begin(); i < pFonts->end(); i++) + for (NSFonts::CFontInfo* i : *pFonts) { - NSFonts::CFontInfo* pCurrent = *i; + NSFonts::CFontInfo* pCurrent = i; size_t pos1 = pCurrent->m_wsFontPath.find_last_of(wchar_t('/')); size_t pos2 = pCurrent->m_wsFontPath.find_last_of(wchar_t('\\')); @@ -455,56 +445,7 @@ public: } } }; - -// wrap_methods ------------- -CNativeControl* unwrap_nativeobject(v8::Handle obj); - -void _GetFilePath(const v8::FunctionCallbackInfo& args); -void _SetFilePath(const v8::FunctionCallbackInfo& args); -void _GetImagesPath(const v8::FunctionCallbackInfo& args); - -void _GetFontsDirectory(const v8::FunctionCallbackInfo& args); -void _GetEditorType(const v8::FunctionCallbackInfo& args); - -void _GetChangesCount(const v8::FunctionCallbackInfo& args); -void _GetChangesFile(const v8::FunctionCallbackInfo& args); - -void _GetFileId(const v8::FunctionCallbackInfo& args); -void _SetFileId(const v8::FunctionCallbackInfo& args); - -void _CheckNextChange(const v8::FunctionCallbackInfo& args); - -void _GetFileArrayBuffer(const v8::FunctionCallbackInfo& args); - -void _GetFontArrayBuffer(const v8::FunctionCallbackInfo& args); - -void _GetFileString(const v8::FunctionCallbackInfo& args); - -void _Save_AllocNative(const v8::FunctionCallbackInfo& args); - -void _Save_ReAllocNative(const v8::FunctionCallbackInfo& args); - -void _Save_End(const v8::FunctionCallbackInfo& args); - -void _ConsoleLog(const v8::FunctionCallbackInfo& args); - -void _SaveChanges(const v8::FunctionCallbackInfo& args); - -void _GetImageUrl(const v8::FunctionCallbackInfo& args); - -/// ZIP ----- -void _zipOpenFile(const v8::FunctionCallbackInfo& args); -void _zipOpenFileBase64(const v8::FunctionCallbackInfo& args); -void _zipGetFileAsString(const v8::FunctionCallbackInfo& args); -void _zipGetFileAsBinary(const v8::FunctionCallbackInfo& args); -void _zipCloseFile(const v8::FunctionCallbackInfo& args); -/// --------- - -void _AddImageInChanges(const v8::FunctionCallbackInfo& args); - -v8::Handle CreateNativeControlTemplate(v8::Isolate* isolate); -v8::Handle CreateNativeControlTemplateBuilder(v8::Isolate* isolate); -// -------------------------- +} class CChangesWorker { @@ -514,7 +455,7 @@ private: int m_nLen; int m_nMaxUnionSize = 100 * 1024 * 1024; // 100Mb - v8::Local m_oArrayBuffer; + JSSmart m_oArrayBuffer; int m_nFileType; // 0 - docx; 1 - excel @@ -540,13 +481,13 @@ public: public: - void CheckFiles(CArray& oFiles) + void CheckFiles(std::vector& oFiles) { int nMax = 0; int nLen = 0; - int nCount = (int)oFiles.GetCount(); - for (int i = 0; i < nCount; ++i) + size_t nCount = oFiles.size(); + for (size_t i = 0; i < nCount; ++i) { NSFile::CFileBinary oFile; oFile.OpenFile(oFiles[i]); @@ -575,23 +516,23 @@ public: m_pData = new BYTE[m_nLen]; m_pDataCur = m_pData; - m_oArrayBuffer = v8::ArrayBuffer::New(v8::Isolate::GetCurrent(), (void*)m_pData, (size_t)m_nLen); + m_oArrayBuffer = CJSContext::createUint8Array(m_pData, m_nLen); } - inline int Open(CArray& oFiles, int nStart) + inline int Open(std::vector& oFiles, int nStart) { return Open_excel(oFiles, nStart); } - int Open_docx(CArray& oFiles, int nStart) + int Open_docx(std::vector& oFiles, int nStart) { m_pDataCur = m_pData; m_pDataCur += 4; int nCountData = 0; - int nCount = oFiles.GetCount(); + size_t nCount = oFiles.size(); int nLenCurrect = 0; - int i = nStart; + size_t i = nStart; for (; i < nCount; i++) { NSFile::CFileBinary oFile; @@ -638,15 +579,15 @@ public: return i; } - int Open_excel(CArray& oFiles, int nStart) + int Open_excel(std::vector& oFiles, int nStart) { m_pDataCur = m_pData; m_pDataCur += 4; int nCountData = 0; - int nCount = oFiles.GetCount(); + size_t nCount = oFiles.size(); int nLenCurrect = 0; - int i = nStart; + size_t i = nStart; for (; i < nCount; i++) { NSFile::CFileBinary oFile; @@ -685,19 +626,17 @@ public: return i; } - v8::Local GetData() + JSSmart GetData() { - size_t len = (size_t)(m_pDataCur - m_pData); - v8::Local _array = v8::Uint8Array::New(m_oArrayBuffer, 0, len); - return _array; + return m_oArrayBuffer; } public: - void OpenFull(CArray& oFiles) + void OpenFull(std::vector& oFiles) { // определяем размер - int nCount = (int)oFiles.GetCount(); - for (int i = 0; i < nCount; ++i) + size_t nCount = oFiles.size(); + for (size_t i = 0; i < nCount; ++i) { NSFile::CFileBinary oFile; oFile.OpenFile(oFiles[i]); @@ -751,11 +690,11 @@ public: *((int*)m_pData) = nCountData; } - void OpenFull_excel(CArray& oFiles) + void OpenFull_excel(std::vector& oFiles) { // определяем размер - int nCount = (int)oFiles.GetCount(); - for (int i = 0; i < nCount; ++i) + size_t nCount = oFiles.size(); + for (size_t i = 0; i < nCount; ++i) { NSFile::CFileBinary oFile; oFile.OpenFile(oFiles[i]); @@ -769,7 +708,7 @@ public: m_pDataCur += 4; int nCountData = 0; - for (int i = 0; i < nCount; i++) + for (size_t i = 0; i < nCount; i++) { NSFile::CFileBinary oFile; oFile.OpenFile(oFiles[i]); @@ -801,12 +740,11 @@ public: *((int*)m_pData) = nCountData; } - v8::Local GetDataFull() + JSSmart GetDataFull() { size_t len = (size_t)(m_pDataCur - m_pData); - v8::Local _buffer = v8::ArrayBuffer::New(v8::Isolate::GetCurrent(), (void*)m_pData, len); - v8::Local _array = v8::Uint8Array::New(_buffer, 0, len); - return _array; + JSSmart _buffer = CJSContext::createUint8Array(m_pData, len); + return _buffer; } int OpenNative(std::wstring strFile) @@ -1041,10 +979,6 @@ private: ////////////////////////////////////////////////////////////////////////////// -void CreateNativeObject(const v8::FunctionCallbackInfo& args); -void CreateNativeObjectBuilder(const v8::FunctionCallbackInfo& args); -void CreateNativeMemoryStream(const v8::FunctionCallbackInfo& args); - #if 0 class CLoggerSpeed { @@ -1178,172 +1112,10 @@ public: }; #endif -#ifdef V8_OS_XP - -class ExternalMallocArrayBufferAllocator : public v8::ArrayBuffer::Allocator -{ -public: - virtual void* Allocate(size_t length) - { - void* ret = malloc(length); - memset(ret, 0, length); - return ret; - } - virtual void* AllocateUninitialized(size_t length) - { - return malloc(length); - } - virtual void Free(void* data, size_t length) - { - free(data); - } -}; - -#endif - -////////////////////////////////////////////////////////////////////////////// -class CV8Initializer -{ -private: - v8::Platform* m_platform; - v8::ArrayBuffer::Allocator* m_pAllocator; - -public: - CV8Initializer() - { - std::wstring sPrW = NSFile::GetProcessPath(); - std::string sPrA = U_TO_UTF8(sPrW); - - m_pAllocator = NULL; - -#ifndef V8_OS_XP - v8::V8::InitializeICUDefaultLocation(sPrA.c_str()); - v8::V8::InitializeExternalStartupData(sPrA.c_str()); - m_platform = v8::platform::CreateDefaultPlatform(); - v8::V8::InitializePlatform(m_platform); - v8::V8::Initialize(); -#else - m_platform = v8::platform::CreateDefaultPlatform(); - v8::V8::InitializePlatform(m_platform); - - v8::V8::Initialize(); - v8::V8::InitializeICU(); -#endif - } - ~CV8Initializer() - { - v8::V8::Dispose(); - v8::V8::ShutdownPlatform(); - delete m_platform; - if (m_pAllocator) - delete m_pAllocator; - } - - v8::ArrayBuffer::Allocator* getAllocator() - { - return m_pAllocator; - } - - v8::Isolate* CreateNew() - { - v8::Isolate::CreateParams create_params; -#ifndef V8_OS_XP - m_pAllocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator(); -#else - m_pAllocator = new ExternalMallocArrayBufferAllocator(); -#endif - create_params.array_buffer_allocator = m_pAllocator; - return v8::Isolate::New(create_params); - } -}; - -class CV8Worker -{ -private: - static CV8Initializer* m_pInitializer; - -public: - CV8Worker() {} - ~CV8Worker() {} - - static void Initialize(); - static void Dispose(); - - static CV8Initializer* getInitializer(); -}; - bool Doct_renderer_SaveFile_ForBuilder(int nFormat, const std::wstring& strDstFile, - CNativeControl* pNative, - v8::Isolate* isolate, - v8::Local context, - v8::Local& global_js, - v8::Handle* args, - v8::TryCatch& try_catch, + NSNativeControl::CNativeControl* pNative, + JSSmart context, + JSSmart* args, std::wstring& strError); -class CCacheDataScript -{ -private: - BYTE* Data; - int Length; - - v8::ScriptCompiler::Source* Source; - v8::ScriptCompiler::CachedData* CachedData; - - std::wstring Path; - -public: - CCacheDataScript(const std::wstring& sPath) - { - Data = NULL; - Length = 0; - - if (!sPath.empty()) - { - BYTE* _data = NULL; - DWORD _data_length = 0; - if (NSFile::CFileBinary::ReadAllBytes(sPath, &_data, _data_length)) - { - Data = _data; - Length = (int)_data_length; - } - } - - Source = NULL; - CachedData = NULL; - Path = sPath; - } - ~CCacheDataScript() - { - //RELEASEOBJECT(Source); - //RELEASEOBJECT(CachedData); - RELEASEARRAYOBJECTS(Data); - } - - v8::Local Compile(const v8::Local& _context, const v8::Local& source) - { - v8::Local script; - if (NULL == Data) - { - Source = new v8::ScriptCompiler::Source(source); - script = v8::ScriptCompiler::Compile(_context, Source, v8::ScriptCompiler::kProduceCodeCache).ToLocalChecked(); - - const v8::ScriptCompiler::CachedData* _cachedData = Source->GetCachedData(); - NSFile::CFileBinary oFileTest; - if (oFileTest.CreateFileW(Path)) - { - oFileTest.WriteFile(_cachedData->data, (DWORD)_cachedData->length); - oFileTest.CloseFile(); - } - } - else - { - CachedData = new v8::ScriptCompiler::CachedData(Data, Length); - Source = new v8::ScriptCompiler::Source(source, CachedData); - script = v8::ScriptCompiler::Compile(_context, Source, v8::ScriptCompiler::kConsumeCodeCache).ToLocalChecked(); - } - return script; - } -}; - #endif // NATIVECONTROL