diff --git a/DesktopEditor/doctrenderer/doctrenderer.pro b/DesktopEditor/doctrenderer/doctrenderer.pro index 6d3dc285af..604f1278ed 100644 --- a/DesktopEditor/doctrenderer/doctrenderer.pro +++ b/DesktopEditor/doctrenderer/doctrenderer.pro @@ -79,7 +79,6 @@ include($$PWD/js_internal/js_base.pri) embed/v8/v8_NativeControl.cpp \ embed/v8/v8_NativeBuilder.cpp \ embed/v8/v8_Graphics.cpp \ - embed/v8/v8_Zip.cpp \ embed/v8/v8_Pointer.cpp \ embed/v8/v8_TextMeasurer.cpp } else { @@ -89,12 +88,12 @@ include($$PWD/js_internal/js_base.pri) embed/jsc/jsc_MemoryStream.mm \ embed/jsc/jsc_NativeControl.mm \ embed/jsc/jsc_NativeBuilder.mm \ - embed/jsc/jsc_Zip.mm \ embed/jsc/jsc_Pointer.mm \ embed/jsc/jsc_TextMeasurer.mm } ADD_FILES_FOR_EMBEDDED_CLASS_HEADER(embed/HashEmbed.h) +ADD_FILES_FOR_EMBEDDED_CLASS_HEADER(embed/ZipEmbed.h) include(../graphics/pro/textshaper.pri) include(../../Common/3dParty/openssl/openssl.pri) diff --git a/DesktopEditor/doctrenderer/embed/Default.cpp b/DesktopEditor/doctrenderer/embed/Default.cpp index 1e18280251..60f67c7192 100644 --- a/DesktopEditor/doctrenderer/embed/Default.cpp +++ b/DesktopEditor/doctrenderer/embed/Default.cpp @@ -1,6 +1,6 @@ #include "Default.h" -//#include "./ZipEmbed.h" +#include "./ZipEmbed.h" //#include "./TextMeasurerEmbed.h" //#include "./MemoryStreamEmbed.h" #include "./HashEmbed.h" @@ -9,7 +9,7 @@ namespace NSJSBase { void CreateDefaults(JSSmart& context) { -// CZipEmbed::CreateObjectInContext("CreateNativeZip", context); + context->Embed(); // CTextMeasurerEmbed::CreateObjectInContext("CreateNativeTextMeasurer", context); // CMemoryStreamEmbed::CreateObjectInContext("CreateNativeMemoryStream", context); context->Embed(); diff --git a/DesktopEditor/doctrenderer/embed/ZipEmbed.h b/DesktopEditor/doctrenderer/embed/ZipEmbed.h index 60464be032..f5e10fcdca 100644 --- a/DesktopEditor/doctrenderer/embed/ZipEmbed.h +++ b/DesktopEditor/doctrenderer/embed/ZipEmbed.h @@ -37,7 +37,7 @@ public: JSSmart encodeImage(JSSmart typedArray, JSSmart format); JSSmart getImageType(JSSmart typedArray); - static void CreateObjectInContext(const std::string& name, JSSmart context); + DECLARE_EMBED_METHODS }; #endif // _BUILD_NATIVE_ZIP_EMBED_H_ diff --git a/DesktopEditor/doctrenderer/embed/jsc/jsc_Zip.mm b/DesktopEditor/doctrenderer/embed/jsc/jsc_Zip.mm deleted file mode 100644 index 5c44c56420..0000000000 --- a/DesktopEditor/doctrenderer/embed/jsc/jsc_Zip.mm +++ /dev/null @@ -1,53 +0,0 @@ -#include "../ZipEmbed.h" -#include "../../js_internal/jsc/jsc_base.h" - -@protocol IJSCZip --(JSValue*) open : (JSValue*)file; --(JSValue*) create; --(JSValue*) save; --(JSValue*) getFile : (JSValue*)path; --(JSValue*) addFile : (JSValue*)path : (JSValue*)data; --(JSValue*) removeFile : (JSValue*)path; --(JSValue*) close; --(JSValue*) getPaths; - --(JSValue*) decodeImage : (JSValue*)typedArray : (JSValue*)isRgba; --(JSValue*) encodeImageData : (JSValue*)typedArray : (JSValue*)w : (JSValue*)h : (JSValue*)stride : (JSValue*)format : (JSValue*)isRgba; --(JSValue*) encodeImage : (JSValue*)typedArray : (JSValue*)format; --(JSValue*) getImageType : (JSValue*)typedArray; - -@end - -@interface CJSCZip : NSObject -{ -@public - CZipEmbed* m_internal; -} -@end - -@implementation CJSCZip - -EMBED_OBJECT_WRAPPER_METHODS(CZipEmbed) - -FUNCTION_WRAPPER_JS_1(open, open) -FUNCTION_WRAPPER_JS(create, create) -FUNCTION_WRAPPER_JS(save, save) -FUNCTION_WRAPPER_JS_1(getFile, getFile) -FUNCTION_WRAPPER_JS_2(addFile, addFile) -FUNCTION_WRAPPER_JS_1(removeFile, removeFile) -FUNCTION_WRAPPER_JS(close, close) -FUNCTION_WRAPPER_JS(getPaths, getPaths) - -FUNCTION_WRAPPER_JS_2(decodeImage, decodeImage) -FUNCTION_WRAPPER_JS_6(encodeImageData, encodeImageData) -FUNCTION_WRAPPER_JS_2(encodeImage, encodeImage) -FUNCTION_WRAPPER_JS_1(getImageType, getImageType) - -@end - -void CZipEmbed::CreateObjectInContext(const std::string &name, JSSmart context) -{ - context->m_internal->context[[NSString stringWithAString:name]] = ^(){ - return [[CJSCZip alloc] init]; - }; -} diff --git a/DesktopEditor/doctrenderer/embed/jsc/jsc_ZipEmbed.mm b/DesktopEditor/doctrenderer/embed/jsc/jsc_ZipEmbed.mm new file mode 100644 index 0000000000..49f854cf0f --- /dev/null +++ b/DesktopEditor/doctrenderer/embed/jsc/jsc_ZipEmbed.mm @@ -0,0 +1,58 @@ +// THIS FILE WAS GENERATED AUTOMATICALLY. DO NOT CHANGE IT! +// IF YOU NEED TO UPDATE THIS CODE, JUST RERUN PYTHON SCRIPT WITH "--internal" OPTION. + +#include "../ZipEmbed.h" +#include "../../js_internal/jsc/jsc_base.h" + +@protocol IJSCZipEmbed +-(JSValue*) open : (JSValue*)typedArray_or_Folder; +-(JSValue*) create; +-(JSValue*) save; +-(JSValue*) getFile : (JSValue*)filePath; +-(JSValue*) addFile : (JSValue*)filePath : (JSValue*)typedArray; +-(JSValue*) removeFile : (JSValue*)filePath; +-(JSValue*) close; +-(JSValue*) getPaths; +-(JSValue*) decodeImage : (JSValue*)typedArray : (JSValue*)isRgba; +-(JSValue*) encodeImageData : (JSValue*)typedArray : (JSValue*)w : (JSValue*)h : (JSValue*)stride : (JSValue*)format : (JSValue*)isRgba; +-(JSValue*) encodeImage : (JSValue*)typedArray : (JSValue*)format; +-(JSValue*) getImageType : (JSValue*)typedArray; +@end + +@interface CJSCZipEmbed : NSObject +{ +@public + CZipEmbed* m_internal; +} +@end + +@implementation CJSCZipEmbed +EMBED_OBJECT_WRAPPER_METHODS(CZipEmbed); + +FUNCTION_WRAPPER_JS_1(open, open) +FUNCTION_WRAPPER_JS_0(create, create) +FUNCTION_WRAPPER_JS_0(save, save) +FUNCTION_WRAPPER_JS_1(getFile, getFile) +FUNCTION_WRAPPER_JS_2(addFile, addFile) +FUNCTION_WRAPPER_JS_1(removeFile, removeFile) +FUNCTION_WRAPPER_JS_0(close, close) +FUNCTION_WRAPPER_JS_0(getPaths, getPaths) +FUNCTION_WRAPPER_JS_2(decodeImage, decodeImage) +FUNCTION_WRAPPER_JS_6(encodeImageData, encodeImageData) +FUNCTION_WRAPPER_JS_2(encodeImage, encodeImage) +FUNCTION_WRAPPER_JS_1(getImageType, getImageType) +@end + +void* CZipEmbed::GetDataForEmbedObject(void* data) +{ + CZipEmbed* pNativeObj = reinterpret_cast(data); + CJSCZipEmbed* pEmbedObj = [[CJSCZipEmbed alloc] init:pNativeObj]; + return (void*)CFBridgingRetain(pEmbedObj); +} + +std::string CZipEmbed::getName() { return "CZipEmbed"; } + +CJSEmbedObject* CZipEmbed::getCreator() +{ + return new CZipEmbed(); +} diff --git a/DesktopEditor/doctrenderer/embed/v8/v8_Zip.cpp b/DesktopEditor/doctrenderer/embed/v8/v8_Zip.cpp deleted file mode 100644 index 4355e070ae..0000000000 --- a/DesktopEditor/doctrenderer/embed/v8/v8_Zip.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "../ZipEmbed.h" -#include "../../js_internal/v8/v8_base.h" - -namespace NSZip -{ -#define CURRENTWRAPPER CZipEmbed - - FUNCTION_WRAPPER_V8_1(_open, open) - FUNCTION_WRAPPER_V8 (_create, create) - FUNCTION_WRAPPER_V8 (_save, save) - FUNCTION_WRAPPER_V8_1(_getFile, getFile) - FUNCTION_WRAPPER_V8_2(_addFile, addFile) - FUNCTION_WRAPPER_V8_1(_removeFile, removeFile) - FUNCTION_WRAPPER_V8 (_close, close) - FUNCTION_WRAPPER_V8 (_getPaths, getPaths) - - FUNCTION_WRAPPER_V8_2(_decodeImage, decodeImage) - FUNCTION_WRAPPER_V8_6(_encodeImageData, encodeImageData) - FUNCTION_WRAPPER_V8_2(_encodeImage, encodeImage) - FUNCTION_WRAPPER_V8_1(_getImageType, getImageType) - - v8::Handle CreateZipTemplate(v8::Isolate* isolate) - { - v8::EscapableHandleScope handle_scope(isolate); - - v8::Local result = v8::ObjectTemplate::New(isolate); - result->SetInternalFieldCount(1); - - // методы - NSV8Objects::Template_Set(result, "open", _open); - NSV8Objects::Template_Set(result, "create", _create); - NSV8Objects::Template_Set(result, "save", _save); - NSV8Objects::Template_Set(result, "getFile", _getFile); - NSV8Objects::Template_Set(result, "addFile", _addFile); - NSV8Objects::Template_Set(result, "removeFile", _removeFile); - NSV8Objects::Template_Set(result, "close", _close); - NSV8Objects::Template_Set(result, "getPaths", _getPaths); - - NSV8Objects::Template_Set(result, "decodeImage", _decodeImage); - NSV8Objects::Template_Set(result, "encodeImageData", _encodeImageData); - NSV8Objects::Template_Set(result, "encodeImage", _encodeImage); - NSV8Objects::Template_Set(result, "getImageType", _getImageType); - - return handle_scope.Escape(result); - } - - void CreateNativeZip(const v8::FunctionCallbackInfo& args) - { - CreateNativeInternalField(new CZipEmbed(), NSZip::CreateZipTemplate, args); - } -} - -void CZipEmbed::CreateObjectInContext(const std::string& name, JSSmart context) -{ - InsertToGlobal(name, context, NSZip::CreateNativeZip); -} diff --git a/DesktopEditor/doctrenderer/embed/v8/v8_ZipEmbed.cpp b/DesktopEditor/doctrenderer/embed/v8/v8_ZipEmbed.cpp new file mode 100644 index 0000000000..18052a2626 --- /dev/null +++ b/DesktopEditor/doctrenderer/embed/v8/v8_ZipEmbed.cpp @@ -0,0 +1,67 @@ +// THIS FILE WAS GENERATED AUTOMATICALLY. DO NOT CHANGE IT! +// IF YOU NEED TO UPDATE THIS CODE, JUST RERUN PYTHON SCRIPT WITH "--internal" OPTION. + +#include "../ZipEmbed.h" +#include "../../js_internal/v8/v8_base.h" + +namespace NSZipEmbed +{ +#define CURRENTWRAPPER CZipEmbed + + FUNCTION_WRAPPER_V8_1(_open, open) + FUNCTION_WRAPPER_V8_0(_create, create) + FUNCTION_WRAPPER_V8_0(_save, save) + FUNCTION_WRAPPER_V8_1(_getFile, getFile) + FUNCTION_WRAPPER_V8_2(_addFile, addFile) + FUNCTION_WRAPPER_V8_1(_removeFile, removeFile) + FUNCTION_WRAPPER_V8_0(_close, close) + FUNCTION_WRAPPER_V8_0(_getPaths, getPaths) + FUNCTION_WRAPPER_V8_2(_decodeImage, decodeImage) + FUNCTION_WRAPPER_V8_6(_encodeImageData, encodeImageData) + FUNCTION_WRAPPER_V8_2(_encodeImage, encodeImage) + FUNCTION_WRAPPER_V8_1(_getImageType, getImageType) + v8::Handle CreateTemplate(v8::Isolate* isolate) + { + v8::EscapableHandleScope handle_scope(isolate); + v8::Local result = v8::ObjectTemplate::New(isolate); + result->SetInternalFieldCount(1); + + NSV8Objects::Template_Set(result, "open", _open); + NSV8Objects::Template_Set(result, "create", _create); + NSV8Objects::Template_Set(result, "save", _save); + NSV8Objects::Template_Set(result, "getFile", _getFile); + NSV8Objects::Template_Set(result, "addFile", _addFile); + NSV8Objects::Template_Set(result, "removeFile", _removeFile); + NSV8Objects::Template_Set(result, "close", _close); + NSV8Objects::Template_Set(result, "getPaths", _getPaths); + NSV8Objects::Template_Set(result, "decodeImage", _decodeImage); + NSV8Objects::Template_Set(result, "encodeImageData", _encodeImageData); + NSV8Objects::Template_Set(result, "encodeImage", _encodeImage); + NSV8Objects::Template_Set(result, "getImageType", _getImageType); + + return handle_scope.Escape(result); + } +} + +void* CZipEmbed::GetDataForEmbedObject(void* data) +{ + v8::Isolate* isolate = reinterpret_cast(data); + v8::Local* internalTemplate = new v8::Local(NSZipEmbed::CreateTemplate(isolate)); + return reinterpret_cast(internalTemplate); +} + +std::vector CZipEmbed::getMethodNames() +{ + return std::vector(); +} + +void CZipEmbed::initFunctions() +{ +} + +std::string CZipEmbed::getName() { return "CZipEmbed"; } + +CJSEmbedObject* CZipEmbed::getCreator() +{ + return new CZipEmbed(); +} diff --git a/DesktopEditor/doctrenderer/js_internal/js_base.h b/DesktopEditor/doctrenderer/js_internal/js_base.h index 17b63a3233..ca9420179f 100644 --- a/DesktopEditor/doctrenderer/js_internal/js_base.h +++ b/DesktopEditor/doctrenderer/js_internal/js_base.h @@ -240,7 +240,7 @@ namespace NSJSBase CJSValue* JSON_Parse(const char* json_content); void MoveToThread(ASC_THREAD_ID* id = NULL); - static void AddEmbedCreator(const std::string& name, EmbedObjectCreator creator, const IsolateAdditionalDataType& type = iadtUndefined); + void AddEmbedCreator(const std::string& name, EmbedObjectCreator creator, const IsolateAdditionalDataType& type = iadtUndefined); public: static CJSValue* createUndefined(); diff --git a/DesktopEditor/doctrenderer/js_internal/js_base_p.h b/DesktopEditor/doctrenderer/js_internal/js_base_p.h index 98630890b2..3250a33f05 100644 --- a/DesktopEditor/doctrenderer/js_internal/js_base_p.h +++ b/DesktopEditor/doctrenderer/js_internal/js_base_p.h @@ -3,6 +3,7 @@ #include "./js_base.h" #include +#include class CEmbedObjectRegistrator { @@ -32,4 +33,16 @@ public: } }; +class CEmbedObjectRegistratorPool +{ +private: + std::unordered_map m_registrators; + +public: + CEmbedObjectRegistrator& getRegistrator(void* ptr) + { + return m_registrators[ptr]; + } +}; + #endif // _CORE_EXT_JS_BASE_P_H_ diff --git a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.cpp b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.cpp index 5108cf710c..8f0687b84f 100644 --- a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.cpp +++ b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.cpp @@ -179,6 +179,7 @@ namespace NSJSBase if (bIsInitialize) Initialize(); } + CJSContext::~CJSContext() { if (m_internal->m_contextPersistent.IsEmpty()) @@ -200,8 +201,6 @@ namespace NSJSBase { v8::Isolate* isolate = CV8Worker::getInitializer().CreateNew(); m_internal->m_isolate = isolate; - v8::Isolate::Scope iscope(isolate); - v8::HandleScope scope(isolate); } } void CJSContext::Dispose() @@ -410,10 +409,9 @@ namespace NSJSBase JSSmart CJSContext::GetCurrent() { - CJSContext* ret = new CJSContext(); + CJSContext* ret = new CJSContext(false); ret->m_internal->m_isolate = CV8Worker::GetCurrent(); ret->m_internal->m_context = ret->m_internal->m_isolate->GetCurrentContext(); - // global??? return ret; } @@ -533,7 +531,7 @@ namespace NSJSBase if (NULL != *data) sName = std::string((char*)*data, data.length()); - CEmbedObjectRegistrator& oRegistrator = CJSContextPrivate::getEmbedRegistrator(); + CEmbedObjectRegistrator& oRegistrator = CJSContextPrivate::getEmbedRegistrator(isolate); std::map::iterator itFound = oRegistrator.m_infos.find(sName); if (itFound == oRegistrator.m_infos.end()) { @@ -575,8 +573,9 @@ namespace NSJSBase void CJSContext::AddEmbedCreator(const std::string& name, EmbedObjectCreator creator, const IsolateAdditionalDataType& type) - { - CEmbedObjectRegistrator& oRegistrator = CJSContextPrivate::getEmbedRegistrator(); + { + + CEmbedObjectRegistrator& oRegistrator = CJSContextPrivate::getEmbedRegistrator(m_internal->m_isolate); if (0 == oRegistrator.m_infos.size()) { JSSmart context = CJSContext::GetCurrent(); diff --git a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h index 1334f3e284..efb5847550 100644 --- a/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h +++ b/DesktopEditor/doctrenderer/js_internal/v8/v8_base.h @@ -810,7 +810,6 @@ namespace NSJSBase class CJSContextPrivate { public: - CV8Worker m_oWorker; v8::Isolate* m_isolate; std::stack m_scope; @@ -818,14 +817,14 @@ namespace NSJSBase v8::Local m_context; public: - CJSContextPrivate() : m_oWorker(), m_isolate(NULL) + CJSContextPrivate() : m_isolate(NULL) { } - static CEmbedObjectRegistrator& getEmbedRegistrator() + static CEmbedObjectRegistrator& getEmbedRegistrator(v8::Isolate* isolate) { - static CEmbedObjectRegistrator oRegistrator; - return oRegistrator; + static CEmbedObjectRegistratorPool registatorsPool; + return registatorsPool.getRegistrator(reinterpret_cast(isolate)); } }; } diff --git a/DesktopEditor/doctrenderer/test/internal/main.cpp b/DesktopEditor/doctrenderer/test/internal/main.cpp index 952755c022..3a2489cc40 100644 --- a/DesktopEditor/doctrenderer/test/internal/main.cpp +++ b/DesktopEditor/doctrenderer/test/internal/main.cpp @@ -102,7 +102,7 @@ int main(int argc, char *argv[]) #endif -#if 1 +#if 0 // External embed example JSSmart oContext1 = new CJSContext; @@ -110,7 +110,7 @@ int main(int argc, char *argv[]) // Create first context oContext1->CreateContext(); - // Call hash() on first context + // Embedding CJSContextScope scope(oContext1); oContext1->Embed(); @@ -128,11 +128,11 @@ int main(int argc, char *argv[]) #endif -#if 0 +#if 1 // CZipEmbed example - JSSmart oContext1 = new CJSContext; - JSSmart oContext2 = new CJSContext; + JSSmart oContext1 = new CJSContext(); + JSSmart oContext2 = new CJSContext(); // Create first context oContext1->CreateContext(); @@ -144,7 +144,7 @@ int main(int argc, char *argv[]) oContext1->Enter(); CreateDefaults(oContext1); JSSmart oRes1 = oContext1->runScript( - "var oZip = new CreateNativeZip;\n" + "var oZip = CreateEmbedObject('CZipEmbed');\n" "var files = oZip.open('" CURR_DIR "');\n" "oZip.close();"); oContext1->Exit(); @@ -154,7 +154,7 @@ int main(int argc, char *argv[]) CJSContextScope scope(oContext2); CreateDefaults(oContext2); JSSmart oRes2 = oContext2->runScript( - "var oZip = new CreateNativeZip;\n" + "var oZip = CreateEmbedObject('CZipEmbed');\n" "var files = oZip.open('" CURR_DIR "/../embed');\n" "oZip.close();"); }