Compare commits

..

125 Commits

Author SHA1 Message Date
ef7fb15efe Fix build android on macos 2023-04-29 01:49:50 +05:00
e32b53d662 Merge pull request #1171 from ONLYOFFICE/feature/pmutility
Feature/pmutility
2023-04-28 21:34:23 +05:00
0b683226e9 Fix linux/macos build 2023-04-28 19:33:15 +03:00
73924f3ae0 restore plugin feature 2023-04-28 18:33:22 +03:00
e8ecef51dd fix locale 2023-04-28 16:58:47 +03:00
5bf730e1d6 minors 2023-04-28 16:23:57 +03:00
091f3a3a8e fix search 2023-04-28 14:11:40 +03:00
ffa8467c9e default init, backup feature 2023-04-28 13:28:17 +03:00
398c69c01e odf chart refactoring 2023-04-28 12:39:29 +03:00
a48ed74102 Merge pull request #1170 from ONLYOFFICE/fix/bug62143
Fix bug #62143
2023-04-28 13:29:11 +05:00
45628154d9 Fix bug #62143 2023-04-28 11:23:02 +03:00
2921e476c3 remove all plugins feature 2023-04-28 09:47:00 +03:00
e97fd44489 plugin manager utility 2023-04-27 21:52:38 +03:00
1dba0723c7 Add settings for disable all warnings 2023-04-27 14:34:26 +03:00
217ec901ed Merge pull request #1169 from ONLYOFFICE/fix/bug62305
Fix bug 62305
2023-04-27 13:51:17 +05:00
68723a5e81 Fix bug 62305 2023-04-27 11:28:10 +03:00
53810c07ac Merge branch 'release/v7.4.0' of https://github.com/ONLYOFFICE/core into release/v7.4.0 2023-04-27 10:47:04 +03:00
14fcc4dfac fix bug #62269 2023-04-27 10:46:43 +03:00
b4b1cae18e Fix typo 2023-04-27 10:41:12 +03:00
ab74e3fce7 Add test for font picker 2023-04-26 23:57:40 +03:00
4f48287d28 Fix font select (use unicode names for symbols > 128) 2023-04-26 23:40:15 +03:00
3b20ac3825 fix bug #62155 2023-04-26 23:08:57 +03:00
3f782ab389 odf chart refactoring 2023-04-26 20:35:23 +03:00
c22d4c60c0 Merge pull request #1166 from ONLYOFFICE/fix/bug62304
Fix bug 62304
2023-04-26 20:55:12 +05:00
9349ddf604 Fix bug 62304 2023-04-26 18:50:15 +03:00
70c4f045ea Fix build 2023-04-26 20:34:11 +05:00
d955de5bdb Merge pull request #1165 from ONLYOFFICE/fix/metafile_bugs
Fix metafile bugs
2023-04-26 18:46:14 +05:00
0bd9cead65 Revert previous commits and just export CHash class. 2023-04-26 16:23:18 +03:00
c282e86832 Fix build hash wasm module 2023-04-26 16:16:10 +03:00
cd91baaabe Refactoring and move hash algs outside js embeds engine 2023-04-26 16:15:02 +03:00
727a7722bb Merge pull request #1164 from ONLYOFFICE/feature/hash
Feature/hash
2023-04-26 03:05:15 +05:00
0d47bdc47d Fix bug 61888 2023-04-26 00:43:09 +03:00
cd458b81ec fix bug #62274 2023-04-25 20:45:57 +03:00
4beb4c8d70 fix bug #62116 2023-04-25 16:44:19 +03:00
aa56efb495 Fix bug #62144 2023-04-25 13:50:31 +03:00
d2158ded6f Merge branch 'release/v7.4.0' into 'feature/hash' 2023-04-24 19:43:31 +04:00
34790c680a Hash in embed and WASM were reworked to prevent code duplication 2023-04-24 16:40:23 +04:00
4dfa989980 Test reworked. Added 76 tests. 2023-04-24 16:36:06 +04:00
99ba013151 Merge branch 'release/v7.4.0' of https://github.com/ONLYOFFICE/core into release/v7.4.0 2023-04-23 21:46:18 +03:00
857957e824 [builder] Fix error on first start (with fonts in user folder) 2023-04-22 22:00:40 +03:00
c0972a5b4a Disable any exports in js engine 2023-04-22 21:48:06 +05:00
c0f231fa92 Fix export/import classes 2023-04-22 21:12:47 +05:00
6ec0609de3 Remove empty doctrenderer mode 2023-04-22 20:41:27 +05:00
43aacc8dd9 Fix for build_tools 7.4.0 2023-04-22 10:56:32 +03:00
f75d977661 Moved docterenderer embed and js_internal test to doctrenderer/test/ 2023-04-21 19:42:15 +04:00
48d19d9aa0 Fix bug #61968
Add support for datetime field when saving to pdf
2023-04-21 17:51:38 +05:00
16448245b8 Refactoring gtests 2023-04-21 14:02:36 +03:00
c8a03fec41 Fix html save 2023-04-21 11:12:38 +03:00
db05f4d373 Fix compile with gcc >= 10 2023-04-21 02:57:52 +03:00
b6e741c4a5 Refactoring 2023-04-21 01:19:40 +03:00
ff75d14e29 Fixes for comments 2023-04-21 00:42:32 +03:00
ed0bcfc642 Implemented google tests for Hash (works on mac) 2023-04-20 23:27:46 +04:00
33e6c14a04 Add toXml method to Api of PdfFile 2023-04-20 20:31:38 +05:00
f7b3ab2411 reincarnation pdf ToXml 2023-04-20 20:31:37 +05:00
ea49ffe242 Merge branch 'release/v7.4.0' of https://github.com/ONLYOFFICE/core into release/v7.4.0 2023-04-20 17:32:14 +03:00
471f739a66 Fix typo 2023-04-20 17:25:54 +03:00
a710a7b77c Merge branch 'release/v7.4.0' of https://github.com/ONLYOFFICE/core into release/v7.4.0 2023-04-20 17:19:47 +03:00
13ff65c6e9 Refactoring builder .com example 2023-04-20 17:17:26 +03:00
5050726d47 Fix bug #61761
Fix issue with saving text appearance in pdf in case of multiline text
2023-04-20 18:50:25 +05:00
3296d32168 Merge branch 'release/v7.4.0' of https://github.com/ONLYOFFICE/core into release/v7.4.0 2023-04-20 15:04:27 +03:00
11b59048cd Fix bug #62176 2023-04-20 13:32:42 +03:00
6b0513cd81 Fix bug #62178 2023-04-20 13:21:27 +03:00
e335a237a5 Update htmlrenderer test (ONLINE_WORD_TO_PDF case) 2023-04-20 14:47:37 +05:00
af6802e035 Update htmlrenderer test 2023-04-20 14:20:29 +05:00
a3f7e83ccf Fixed memory leaks. Fixed tests for V8 2023-04-18 14:02:21 +03:00
09d87538e7 Embeded to V8. Also made some renamings 2023-04-18 13:21:31 +04:00
2f9726e455 fix bug #62117 2023-04-18 10:59:51 +03:00
5178cf0cb7 Embeded hash() and hash2() for JSC 2023-04-17 20:11:56 +04:00
0a517af106 Disable inspector for no main platforms 2023-04-15 08:36:27 +03:00
76fea998ea Fix build 2023-04-14 23:12:50 +03:00
721805535e . 2023-04-14 21:02:08 +03:00
1f5025b136 Begin to embeding hash functions 2023-04-14 21:21:44 +04:00
a61c267941 Merge pull request #1162 from ONLYOFFICE/hotfix/v7.3.3
Add define for reconnect timeout
2023-04-14 17:25:52 +03:00
6f4041b476 Fix build 2023-04-14 12:02:46 +05:00
97aad68726 Refactoring setup v8 version 2023-04-13 23:51:11 +03:00
e83a86ee56 Fix build 2023-04-13 23:33:15 +03:00
a6882895a5 Fix linux build 2023-04-13 22:25:41 +03:00
85ab308f80 Refactoring 2023-04-13 16:49:02 +03:00
c4bda0b403 Merge branch 'release/v7.4.0' of https://github.com/ONLYOFFICE/core into release/v7.4.0 2023-04-13 15:33:30 +03:00
0f492bce2b Refactoring 2023-04-13 15:32:38 +03:00
92f114a30f fix bug #61674 2023-04-13 13:08:53 +03:00
98f33c04be Merge pull request #1161 from ONLYOFFICE/fix/metafile_bugs
Fix metafile bugs
2023-04-13 12:43:16 +03:00
34c36cae01 Added initialization of variables in CSvgClip 2023-04-13 12:22:14 +03:00
a6a4d74304 Merge pull request #1159 from ONLYOFFICE/feature/v8-inspector
Feature/v8 inspector
2023-04-12 20:49:11 +03:00
58112c000c Enable v8 8.9 by default 2023-04-12 15:37:59 +03:00
76c00154af fix bug #62056 2023-04-12 14:19:54 +03:00
4fec85c60b fix bug #62045 2023-04-12 13:47:32 +03:00
19c56e1b4d Changes for use _ITERATOR_DEBUG_LEVEL in debug by default 2023-04-12 11:23:45 +03:00
71e3768ed9 fix bug #61996 2023-04-11 22:30:46 +03:00
fb0e7f8d3f Fix xp build 2023-04-10 20:28:52 +03:00
f59e5745af V8 inspector now works only when environment variable is set 2023-04-10 17:57:06 +04:00
6b9ae7e71e [xp] Disable inspector 2023-04-09 13:39:00 +03:00
2601448513 [windows] Use _ITERATOR_DEBUG_LEVEL=0 in debug build 2023-04-08 22:18:31 +03:00
263e50601a Merge branch 'release/v7.4.0' into feature/v8-inspector 2023-04-08 22:16:44 +03:00
c60d06733b For bug #61864 2023-04-06 18:54:14 +03:00
9d9edd2cfc For bug #61784 2023-04-05 17:44:32 +03:00
7bc69064f7 Fix bug #61941 2023-04-05 17:35:42 +03:00
2dd276c427 Changed the principle of converting an Emf record DrawDriverString to svg 2023-04-03 20:11:47 +03:00
9e62296b29 Fixed a bug with drawing DrawDriverString record in Emf+ 2023-03-31 18:37:44 +03:00
6c76366705 For bug#61864 2023-03-31 18:36:39 +03:00
0f59c2254d Fix compile 2023-03-21 10:20:07 +03:00
4910d69a40 Add define for reconnect timeout 2023-03-16 22:36:48 +05:00
ae92f47e54 Make it works for Windows
+ removed unnecessary `readFileContent()` from utils
+ moved `getPort()` from InspectorPool to WebsocketServer
2023-03-13 14:43:35 +04:00
b2a8407617 Inspector code wrapped in namespace NSJSBase
+ Added comment about based on repository
+ Removed unnecessary rows from `js_base.pri`
2023-03-07 11:33:29 +03:00
f41c850c0e Moved my_inspector to inspector
+ Prevented `call_func()` to break on first line
2023-03-07 10:40:07 +03:00
a977fe30f0 Added 'C' prefix to all class names 2023-03-03 18:17:01 +03:00
2c799de36a Now inspector works for older version of V8 too
- Replaced some arguments to `V8IsolateFirstArg`
- Fixed breakpoints issue on old V8 version
2023-03-03 18:11:22 +03:00
a736c35880 Code reformatted to satisfy codestyle 2023-03-03 13:51:52 +03:00
00e54401da Fixed old inspector code 2023-03-02 21:00:07 +03:00
486ff2087c Implemented inspector for CJSObject::call_func() method
Redesigned websocket server connection initialization
2023-03-02 20:59:40 +03:00
b0cbf8520a Make server automatically disconnect when runScript() ends
+ Moved bool flag from CJSContextPrivate to Inspector
+ Replaced members JSContext* in Inspector and CInspectorPool to
v8::Isolate* cause of `call_func()` support
2023-03-02 16:22:13 +03:00
ea181c8110 Now code of runScript() continues on connecting to CDT
Before that, just another `runScript()` was calles from loop
+ Fixed error "Adress already in use" that used to appear sometimes
2023-03-02 14:19:42 +03:00
2f4756138c Inspector Pool implemented
Now inspector works with different CJSContext-s and different
CJSContextScope-s. But sometimes shows "Address already in use" error.
2023-03-02 13:12:28 +03:00
32a046f4d2 Now value from runScript() returns correctly
+ writed some TODOs
+ formatted brakets
+ restyled class definitions
+ added some comments
2023-03-01 18:42:30 +03:00
163ab8da25 Fixed segfault on deleting WebsocketServer
+ removed unnecessary `Listener` classes
2023-03-01 16:45:29 +03:00
fad145455e Moved all inspector initializing stuff to runScript()
Also now programm continues when debugging session is ending!
2023-02-28 16:42:07 +03:00
a32ce7650f Used our runSript() method instead of one in utils.h 2023-02-28 15:43:15 +03:00
9ea4cd8ba5 Writed my_inspector with working functionality 2023-02-27 12:20:02 +03:00
7ba98fe047 initial 2023-02-21 15:55:23 +03:00
7550c08748 Removed unnecessary variable m_nEntered from CJSContextPrivate 2023-02-10 13:06:20 +03:00
fc0f496c5f Fixed crash on multiple Enters on same context 2023-02-08 17:01:58 +03:00
24acad0cd2 Method implementations moved to js_base.cpp. Exported CreateDefaults(). CJSLocalScope implemented. 2023-02-08 00:05:58 +03:00
bc33a5b2e3 Removed m_globalTemplate from CJSContextPrivate. Removed js_base.pri from test.pro 2023-02-06 18:36:43 +03:00
43514de87e CJSContext scopes rework. Global template added. 2023-02-06 14:51:28 +03:00
61d26acf71 Implemented methods Enter() and Exit() in class CJSContext 2023-02-03 17:42:10 +03:00
262 changed files with 10426 additions and 8064 deletions

2
Common/3dParty/googletest/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
googletest/
build/

View File

@ -0,0 +1,12 @@
CORE_GTEST_PATH=$$PWD/googletest/googletest
CONFIG += c++14
CORE_GTEST_PATH_INCLUDE = $$CORE_GTEST_PATH/include
INCLUDEPATH += $$CORE_GTEST_PATH
INCLUDEPATH += $$CORE_GTEST_PATH_INCLUDE
SOURCES += \
$$CORE_GTEST_PATH/src/gtest-all.cc \
$$CORE_GTEST_PATH/src/gtest_main.cc

View File

@ -1,38 +0,0 @@
OPENSSL_LIBS_DIRECTORY = $$PWD/../openssl/build/$$CORE_BUILDS_PLATFORM_PREFIX/lib
core_android {
OPENSSL_ABI_PATH = $$replace(CORE_BUILDS_PLATFORM_PREFIX, "android_", "")
contains(OPENSSL_ABI_PATH, "armv7" ) {
OPENSSL_ABI_PATH = $$replace(OPENSSL_ABI_PATH, "armv7", "armeabi-v7a")
}
contains(OPENSSL_ABI_PATH, "arm64_v8a" ) {
OPENSSL_ABI_PATH = $$replace(OPENSSL_ABI_PATH, "arm64_v8a", "arm64-v8a")
}
OPENSSL_LIBS_DIRECTORY = $$PWD/../openssl/build/android/$$OPENSSL_ABI_PATH/lib
}
core_ios {
OPENSSL_LIBS_DIRECTORY = $$PWD/../openssl/build/ios/openssl-universal/lib
bundle_xcframeworks {
xcframework_platform_ios_simulator {
OPENSSL_LIBS_DIRECTORY = $$PWD/../openssl/build/ios/openssl-xc/simulator/lib
} else {
OPENSSL_LIBS_DIRECTORY = $$PWD/../openssl/build/ios/openssl-xc/lib
}
}
}
core_windows {
LIBS += $$OPENSSL_LIBS_DIRECTORY/libssl.lib
LIBS += $$OPENSSL_LIBS_DIRECTORY/libcrypto.lib
} else {
LIBS += $$OPENSSL_LIBS_DIRECTORY/libssl.a
LIBS += $$OPENSSL_LIBS_DIRECTORY/libcrypto.a
}
INCLUDEPATH += $$OPENSSL_LIBS_DIRECTORY/../include

View File

@ -83,19 +83,19 @@ function configure_make() {
if [[ "${ARCH}" == "x86_64" ]]; then
./Configure android-x86_64 --prefix="${PREFIX_DIR}" enable-ssl3 enable-ssl3-method
./Configure android-x86_64 --prefix="${PREFIX_DIR}" enable-ssl3 enable-ssl3-method enable-md2
elif [[ "${ARCH}" == "x86" ]]; then
./Configure android-x86 --prefix="${PREFIX_DIR}" enable-ssl3 enable-ssl3-method
./Configure android-x86 --prefix="${PREFIX_DIR}" enable-ssl3 enable-ssl3-method enable-md2
elif [[ "${ARCH}" == "arm" ]]; then
./Configure android-arm --prefix="${PREFIX_DIR}" enable-ssl3 enable-ssl3-method
./Configure android-arm --prefix="${PREFIX_DIR}" enable-ssl3 enable-ssl3-method enable-md2
elif [[ "${ARCH}" == "arm64" ]]; then
./Configure android-arm64 --prefix="${PREFIX_DIR}" enable-ssl3 enable-ssl3-method
./Configure android-arm64 --prefix="${PREFIX_DIR}" enable-ssl3 enable-ssl3-method enable-md2
else
log_error "not support" && exit 1

View File

@ -100,32 +100,32 @@ function configure_make() {
if [[ "${ARCH_NAME}" == "x86_64" ]]; then
# openssl1.1.1d can be set normally, 1.1.0f does not take effect
./Configure darwin64-x86_64-cc no-shared --prefix="${PREFIX_DIR}"
./Configure darwin64-x86_64-cc no-shared --prefix="${PREFIX_DIR}" enable-md2
sed -i -e 's/-mtune=intel//g' "Makefile"
elif [[ "${ARCH_NAME}" == "armv7" ]]; then
# openssl1.1.1d can be set normally, 1.1.0f does not take effect
./Configure iphoneos-cross no-shared --prefix="${PREFIX_DIR}" enable-ssl3 enable-ssl3-method
./Configure iphoneos-cross no-shared --prefix="${PREFIX_DIR}" enable-ssl3 enable-ssl3-method enable-md2
sed -ie "s!-fno-common!-fno-common -fembed-bitcode !" "Makefile"
elif [[ "${ARCH_NAME}" == "arm64" ]]; then
# openssl1.1.1d can be set normally, 1.1.0f does not take effect
./Configure iphoneos-cross no-shared --prefix="${PREFIX_DIR}" enable-ssl3 enable-ssl3-method
./Configure iphoneos-cross no-shared --prefix="${PREFIX_DIR}" enable-ssl3 enable-ssl3-method enable-md2
sed -ie "s!-fno-common!-fno-common -fembed-bitcode !" "Makefile"
elif [[ "${ARCH_NAME}" == "i386" ]]; then
# openssl1.1.1d can be set normally, 1.1.0f does not take effect
./Configure darwin-i386-cc no-shared --prefix="${PREFIX_DIR}" enable-ssl3 enable-ssl3-method
./Configure darwin-i386-cc no-shared --prefix="${PREFIX_DIR}" enable-ssl3 enable-ssl3-method enable-md2
sed -ie "s!-fno-common!-fno-common -fembed-bitcode !" "Makefile"
sed -i -e 's/-mtune=intel//g' "Makefile"
elif [[ "${ARCH_NAME}" == "sim_arm64" ]]; then
# openssl1.1.1d can be set normally, 1.1.0f does not take effect
./Configure iphoneos-cross no-shared --prefix="${PREFIX_DIR}" enable-ssl3 enable-ssl3-method
./Configure iphoneos-cross no-shared --prefix="${PREFIX_DIR}" enable-ssl3 enable-ssl3-method enable-md2
sed -ie "s!-fno-common!-fno-common -fembed-bitcode !" "Makefile"
else

View File

@ -1,14 +1,48 @@
OPEN_SSL_PLATFORM=$$CORE_BUILDS_PLATFORM_PREFIX
build_xp:OPEN_SSL_PLATFORM=$$join(OPEN_SSL_PLATFORM, OPEN_SSL_PLATFORM, "", "_xp")
INCLUDEPATH += $$PWD/build/$$OPEN_SSL_PLATFORM/include
core_windows:LIBS += -L$$PWD/build/$$OPEN_SSL_PLATFORM/lib -llibcrypto -llibssl
!core_windows:LIBS += -L$$PWD/build/$$OPEN_SSL_PLATFORM/lib -lcrypto -lssl
open_ssl_common {
DEFINES += COMMON_OPENSSL_BUILDING
HEADERS += $$PWD/common/common_openssl.h
SOURCES += $$PWD/common/common_openssl.cpp
}
OPENSSL_LIBS_DIRECTORY = $$PWD/build/$$OPEN_SSL_PLATFORM/lib
core_android {
OPENSSL_ABI_PATH = $$replace(CORE_BUILDS_PLATFORM_PREFIX, "android_", "")
contains(OPENSSL_ABI_PATH, "armv7" ) {
OPENSSL_ABI_PATH = $$replace(OPENSSL_ABI_PATH, "armv7", "armeabi-v7a")
}
contains(OPENSSL_ABI_PATH, "arm64_v8a" ) {
OPENSSL_ABI_PATH = $$replace(OPENSSL_ABI_PATH, "arm64_v8a", "arm64-v8a")
}
OPENSSL_LIBS_DIRECTORY = $$PWD/build/android/$$OPENSSL_ABI_PATH/lib
}
core_ios {
OPENSSL_LIBS_DIRECTORY = $$PWD/ios/openssl-universal/lib
bundle_xcframeworks {
xcframework_platform_ios_simulator {
OPENSSL_LIBS_DIRECTORY = $$PWD/build/ios/openssl-xc/simulator/lib
} else {
OPENSSL_LIBS_DIRECTORY = $$PWD/build/ios/openssl-xc/lib
}
}
}
core_windows {
LIBS += $$OPENSSL_LIBS_DIRECTORY/libssl.lib
LIBS += $$OPENSSL_LIBS_DIRECTORY/libcrypto.lib
} else {
LIBS += $$OPENSSL_LIBS_DIRECTORY/libssl.a
LIBS += $$OPENSSL_LIBS_DIRECTORY/libcrypto.a
}
INCLUDEPATH += $$OPENSSL_LIBS_DIRECTORY/../include

View File

@ -48,7 +48,7 @@ restore_build_gn()
if [ ! -d "v8" ]
then
fetch v8
./depot_tools/fetch v8
cd v8
git checkout -b 6.0 branch-heads/6.0

View File

@ -10,6 +10,7 @@ for image in $(docker images --format "{{.ID}}"); do
done
docker rm v8docker
docker build . -t v8_docker --build-arg CACHEBUST=0 --no-cache=true
#add --progress=plain for full logs from build.sh
docker build . -t v8_docker --build-arg CACHEBUST=0 --no-cache=true --platform linux/amd64
docker run -d --name v8docker v8_docker:latest
docker cp v8docker:/home/docker/v8/build.zip .

View File

@ -1,4 +1,6 @@
CORE_V8_PATH_OVERRIDE=$$PWD
!v8_version_60:CONFIG += v8_version_89
v8_version_89 {
CONFIG += c++14
CONFIG += use_v8_monolith
@ -14,6 +16,15 @@ v8_version_89 {
CORE_V8_PATH_INCLUDE = $$CORE_V8_PATH_OVERRIDE/v8
CORE_V8_PATH_LIBS = $$CORE_V8_PATH_INCLUDE/out.gn/$$CORE_BUILDS_PLATFORM_PREFIX/obj
core_android {
CORE_V8_PATH_INCLUDE = $$CORE_V8_PATH_OVERRIDE/android/v8
isEqual(CORE_BUILDS_PLATFORM_PREFIX, android_arm64_v8a):CORE_V8_PATH_LIBS=$$CORE_V8_PATH_OVERRIDE/android/build/arm64-v8a
isEqual(CORE_BUILDS_PLATFORM_PREFIX, android_armv7): CORE_V8_PATH_LIBS=$$CORE_V8_PATH_OVERRIDE/android/build/armeabi-v7a
isEqual(CORE_BUILDS_PLATFORM_PREFIX, android_x86): CORE_V8_PATH_LIBS=$$CORE_V8_PATH_OVERRIDE/android/build/x86
isEqual(CORE_BUILDS_PLATFORM_PREFIX, android_x86_64): CORE_V8_PATH_LIBS=$$CORE_V8_PATH_OVERRIDE/android/build/x86_64
}
INCLUDEPATH += \
$$CORE_V8_PATH_INCLUDE \
$$CORE_V8_PATH_INCLUDE/include
@ -23,7 +34,6 @@ core_windows {
use_v8_monolith {
LIBS += -L$$CORE_V8_PATH_LIBS -lv8_monolith
core_debug:DEFINES += "_ITERATOR_DEBUG_LEVEL=0"
} else {
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
@ -64,3 +74,8 @@ core_mac {
QMAKE_CXXFLAGS += -Wall -Wno-inconsistent-missing-override
QMAKE_CFLAGS += -Wall -Wno-inconsistent-missing-override
}
core_android {
LIBS += -L$$CORE_V8_PATH_LIBS -lv8_base -lv8_libplatform -lv8_libbase -lv8_nosnapshot -lv8_libsampler
LIBS += -L$$CORE_V8_PATH_LIBS -licui18n -licuuc
}

View File

@ -49,6 +49,7 @@ namespace NSNetwork
virtual void send(const std::string& message) = 0;
virtual void close() = 0;
virtual void setUrl(const std::string& url) = 0;
virtual bool setReconnectInfo(const int& attemtCount, const int& delay, const int& delayMax) { return false; }
virtual ~IWebSocket() {}
};

View File

@ -64,5 +64,11 @@ namespace NSNetwork
{
delete m_internal;
}
bool CIOWebSocket::setReconnectInfo(const int& attemtCount, const int& delay, const int& delayMax)
{
m_internal->setReconnectInfo(attemtCount, delay, delayMax);
return true;
}
}
}

View File

@ -63,6 +63,7 @@ namespace NSNetwork
virtual void open(const std::map<std::string, std::string>& query) = 0;
virtual void send(const std::string& message) = 0;
virtual void close() = 0;
virtual void setReconnectInfo(const int& attemtCount, const int& delay, const int& delayMax) = 0;
};
class CIOWebSocket: public CWebWorkerBase
@ -78,6 +79,7 @@ namespace NSNetwork
virtual void open(const std::map<std::string, std::string>& query) override;
virtual void send(const std::string& message) override;
virtual void close() override;
virtual bool setReconnectInfo(const int& attemtCount, const int& delay, const int& delayMax);
friend class CIOWebSocket_private;
friend class CIOWebSocket_private_tls;

View File

@ -230,6 +230,13 @@ namespace NSNetwork
m_socket.reset();
}
virtual void setReconnectInfo(const int& attemtCount, const int& delay, const int& delayMax) override
{
m_socket->set_reconnect_attempts(attemtCount);
m_socket->set_reconnect_delay(delay);
m_socket->set_reconnect_delay_max(delayMax);
}
};
}
}

View File

@ -234,6 +234,13 @@ namespace NSNetwork
m_socket.reset();
}
virtual void setReconnectInfo(const int& attemtCount, const int& delay, const int& delayMax) override
{
m_socket->set_reconnect_attempts(attemtCount);
m_socket->set_reconnect_delay(delay);
m_socket->set_reconnect_delay_max(delayMax);
}
};
}
}

View File

@ -11,7 +11,7 @@ libsocketio:CONFIG += use_openssl
ixwebsocket:CONFIG += use_openssl
use_openssl {
include($$PWD/../../3dParty/ixwebsocket/openssl.pri)
include($$PWD/../../3dParty/openssl/openssl.pri)
}
libsocketio {
@ -59,7 +59,8 @@ libsocketio {
_WEBSOCKETPP_CPP11_CHRONO_ \
\
"SIO_TLS=1" \
"SIO_TLS_NO=0"
"SIO_TLS_NO=0" \
"PING_TIMEOUT_INTERVAL=20000"
include($$PWD/../../3dParty/boost/boost.pri)
@ -71,6 +72,13 @@ libsocketio {
$$PWD/src/socketio/socketio_internal_private_no_tls.h
SOURCES += $$PWD/src/socketio/socketio_internal.cpp
core_linux:LIBS += -lpthread
core_windows {
LIBS += -lcrypt32
LIBS += -lUser32
}
}
HEADERS += \

View File

@ -137,7 +137,8 @@ mac {
gcc {
COMPILER_VERSION = $$system($$QMAKE_CXX " -dumpversion")
COMPILER_MAJOR_VERSION = $$str_member($$COMPILER_VERSION)
COMPILER_MAJOR_VERSION_ARRAY = $$split(COMPILER_VERSION, ".")
COMPILER_MAJOR_VERSION = $$member(COMPILER_MAJOR_VERSION_ARRAY, 0)
lessThan(COMPILER_MAJOR_VERSION, 5): CONFIG += build_gcc_less_5
lessThan(COMPILER_MAJOR_VERSION, 6): CONFIG += build_gcc_less_6
}
@ -146,6 +147,9 @@ gcc {
core_windows {
DEFINES += WIN32 _WIN32
DEFINES += NOMINMAX
# use default _ITERATOR_DEBUG_LEVEL value
#core_debug:DEFINES += "_ITERATOR_DEBUG_LEVEL=0"
}
core_win_64 {
DEFINES += WIN64 _WIN64
@ -404,10 +408,6 @@ plugin {
}
}
core_disable_all_warnings {
CONFIG += warn_off
}
# BUILD_PATHS
# MUST BE DEFINED CORE_ROOT_DIR
!core_no_dst {
@ -542,3 +542,11 @@ defineTest(ADD_DEPENDENCY) {
ADD_INC_PATH = $$(ADDITIONAL_INCLUDE_PATH)
!isEmpty(ADD_INC_PATH):INCLUDEPATH += $$ADD_INC_PATH
!core_enable_all_warnings {
core_disable_all_warnings {
QMAKE_CXXFLAGS_WARN_OFF = -w
QMAKE_CFLAGS_WARN_OFF = -w
CONFIG += warn_off
}
}

View File

@ -18,14 +18,7 @@ DEFINES += GRAPHICS_USE_DYNAMIC_LIBRARY
ADD_DEPENDENCY(graphics, kernel, UnicodeConverter)
core_windows {
DEFINES += \
JAS_WIN_MSVC_BUILD \
WIN32
DEFINES -= UNICODE
DEFINES -= _DEBUG
message(windows)
LIBS += -lAdvapi32
LIBS += -lShell32

File diff suppressed because it is too large Load Diff

View File

@ -230,11 +230,11 @@ namespace NSStringExt
}
static inline void ToLower(std::string& wsString)
{
std::transform(wsString.begin(), wsString.end(), wsString.begin(), ::towlower);
std::transform(wsString.begin(), wsString.end(), wsString.begin(), ::tolower);
}
static inline void ToUpper(std::string& wsString)
{
std::transform(wsString.begin(), wsString.end(), wsString.begin(), ::towupper);
std::transform(wsString.begin(), wsString.end(), wsString.begin(), ::toupper);
}
static inline void ToLower(std::wstring& wsString)
{

View File

@ -149,17 +149,35 @@ int main(int argc, char *argv[])
if (true)
{
NSDoctRenderer::CDocBuilder::Initialize(L"/home/mihail/main/build_tools/out/linux_64/onlyoffice/documentbuilder");
NSDoctRenderer::CDocBuilder oBuilder;
// если отключена эта опция - то она отключится на parse_args
oBuilder.SetProperty("--check-fonts", L"");
oBuilder.SetProperty("--check-fonts", L"");
oBuilder.SetProperty("--cache-scripts", L"false");
oBuilder.SetTmpFolder(L"tmp");
//oBuilder.SetProperty("--use-doctrenderer-scheme", L"");
//oBuilder.SetProperty("--work-directory", L"builder");
//oBuilder.SetProperty("--use-doctrenderer-scheme", L"");
//oBuilder.SetProperty("--work-directory", L"builder");
parse_args(&oBuilder, argc - 1, argv);
oBuilder.Run(sBuildFile.c_str());
// oBuilder.WriteData(L"result.log", L"Alert!", false);
// формируем документ SampleTetxt2.docx - с одним вырезанным из SampleDocument.docx абзаца
oBuilder.Run(sBuildFile.c_str());
// включаем вторую схему сохранения
oBuilder.SetProperty("--use-doctrenderer-scheme", L"");
// перекрашиваем абзац в красный цвет
oBuilder.Run(L"/home/mihail/script2.docbuilder");
// oBuilder.OpenFile(L"SampleText2.docx", L"");
// oBuilder.ExecuteCommand(L"var oParagraph = Api.GetDocument().GetElement(1);\n"
// L"oParagraph.SetColor(255, 0, 0);\n"
// L"\n");
// // сохраняем
// oBuilder.SaveFile(OFFICESTUDIO_FILE_DOCUMENT_DOCX, L"SampleText2.docx");
// oBuilder.CloseFile();
}
NSDoctRenderer::CDocBuilder::Dispose();

View File

@ -33,6 +33,15 @@
#ifndef _BUILDER_COMMON_H
#define _BUILDER_COMMON_H
#include "./../common/base_export.h"
#ifdef DOCTRENDERER_NO_USE_DYNAMIC_LIBRARY
#define BUILDER_DECL
#else
#include "../common/base_export.h"
#ifdef DOCTRENDERER_USE_DYNAMIC_LIBRARY_BUILDING
#define BUILDER_DECL Q_DECL_EXPORT
#else
#define BUILDER_DECL Q_DECL_IMPORT
#endif
#endif
#endif // _BUILDER_COMMON_H
#endif // _BUILDER_COMMON_H

View File

@ -15,6 +15,7 @@
#define OFFICESTUDIO_FILE_DOCUMENT_TXT OFFICESTUDIO_FILE_DOCUMENT + 0x0005
#define OFFICESTUDIO_FILE_DOCUMENT_DOTX OFFICESTUDIO_FILE_DOCUMENT + 0x000c
#define OFFICESTUDIO_FILE_DOCUMENT_OTT OFFICESTUDIO_FILE_DOCUMENT + 0x000f
#define OFFICESTUDIO_FILE_DOCUMENT_HTML OFFICESTUDIO_FILE_DOCUMENT + 0x0012
#define OFFICESTUDIO_FILE_PRESENTATION 0x0080
#define OFFICESTUDIO_FILE_PRESENTATION_PPTX OFFICESTUDIO_FILE_PRESENTATION + 0x0001

View File

@ -114,6 +114,7 @@ namespace NSDoctRenderer
}
}
bool bIsAbsoluteFontsPath = false;
if (!m_bIsNotUseConfigAllFontsDir)
{
std::wstring sAllFontsPath = oNode.ReadNodeText(L"allfonts");
@ -129,7 +130,11 @@ namespace NSDoctRenderer
{
std::wstring sAppDir = NSSystemUtils::GetAppDataDir();
if (NSDirectory::CreateDirectory(sAppDir + L"/docbuilder"))
{
m_strAllFonts = sAppDir + L"/docbuilder/AllFonts.js";
// файл может не существовать пока - и тогда private_GetFile не учтет его
bIsAbsoluteFontsPath = true;
}
}
else
{
@ -138,7 +143,7 @@ namespace NSDoctRenderer
}
}
}
m_arrFiles.push_back(private_GetFile(sConfigDir, m_strAllFonts));
m_arrFiles.push_back(bIsAbsoluteFontsPath ? m_strAllFonts : private_GetFile(sConfigDir, m_strAllFonts));
}
std::wstring sSdkPath = oNode.ReadNodeText(L"sdkjs");

View File

@ -787,14 +787,7 @@ public:
if (NULL == m_pBuilder)
return S_FALSE;
int nType = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX;
CStringW sType = (CString)type;
if (L"pptx" == sType)
nType = AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX;
else if (L"xlsx" == sType)
nType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX;
bool bRet = m_pBuilder->CreateFile(nType);
bool bRet = m_pBuilder->CreateFile(type);
*result = bRet ? VARIANT_TRUE : VARIANT_FALSE;
return S_OK;
}
@ -811,41 +804,8 @@ public:
if (NULL == m_pBuilder)
return S_FALSE;
int nType = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX;
CStringW sType = (CString)type;
if (L"docx" == sType)
nType = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX;
else if (L"doc" == sType)
nType = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC;
else if (L"odt" == sType)
nType = AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT;
else if (L"rtf" == sType)
nType = AVS_OFFICESTUDIO_FILE_DOCUMENT_RTF;
else if (L"txt" == sType)
nType = AVS_OFFICESTUDIO_FILE_DOCUMENT_TXT;
else if (L"pptx" == sType)
nType = AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX;
else if (L"odp" == sType)
nType = AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP;
else if (L"xlsx" == sType)
nType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX;
else if (L"xls" == sType)
nType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLS;
else if (L"ods" == sType)
nType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS;
else if (L"csv" == sType)
nType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV;
else if (L"pdf" == sType)
nType = AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF;
else if (L"image" == sType)
nType = AVS_OFFICESTUDIO_FILE_IMAGE;
else if (L"jpg" == sType)
nType = AVS_OFFICESTUDIO_FILE_IMAGE;
else if (L"png" == sType)
nType = AVS_OFFICESTUDIO_FILE_IMAGE;
bool bRet = m_pBuilder->SaveFile(nType, path);
*result = bRet ? VARIANT_TRUE : VARIANT_FALSE;
int nRet = m_pBuilder->SaveFile(type, path);
*result = (nRet == 0) ? VARIANT_TRUE : VARIANT_FALSE;
return S_OK;
}
STDMETHOD(CloseFile)()

View File

@ -0,0 +1,255 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#pragma once
#ifndef __cplusplus
#error "C++ compiler required"
#endif
#include "rpc.h"
#include "rpcndr.h"
#ifdef CreateFile
#undef CreateFile
#endif
/* Forward Declarations */
typedef interface IONLYOFFICEDocBuilderValue IONLYOFFICEDocBuilderValue;
typedef interface IONLYOFFICEDocBuilderContextScope IONLYOFFICEDocBuilderContextScope;
typedef interface IONLYOFFICEDocBuilderContext IONLYOFFICEDocBuilderContext;
typedef interface IONLYOFFICEDocBuilder IONLYOFFICEDocBuilder;
typedef class CONLYOFFICEDocBuilderValue CONLYOFFICEDocBuilderValue;
typedef class CONLYOFFICEDocBuilderContextScope CONLYOFFICEDocBuilderContextScope;
typedef class CONLYOFFICEDocBuilderContext CONLYOFFICEDocBuilderContext;
typedef class CONLYOFFICEDocBuilder CONLYOFFICEDocBuilder;
MIDL_INTERFACE("2637FDFA-8473-4CB8-B90B-C23CB949D009")
IONLYOFFICEDocBuilderValue : public IDispatch
{
public:
virtual /* [id] */ HRESULT STDMETHODCALLTYPE CreateInstance(
/* [optional][in] */ VARIANT value) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE IsEmpty(
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE Clear( void) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE IsNull(
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE IsUndefined(
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE IsBool(
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE IsInt(
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE IsDouble(
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE IsString(
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE IsFunction(
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE IsObject(
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE IsArray(
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE IsTypedArray(
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE GetLength(
/* [retval][out] */ long *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE ToBool(
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE ToInt(
/* [retval][out] */ long *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE ToDouble(
/* [retval][out] */ double *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE ToString(
/* [retval][out] */ BSTR *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE GetProperty(
/* [in] */ BSTR name,
/* [retval][out] */ IONLYOFFICEDocBuilderValue **result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE Get(
/* [in] */ long index,
/* [retval][out] */ IONLYOFFICEDocBuilderValue **result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE SetProperty(
/* [in] */ BSTR name,
/* [in] */ IONLYOFFICEDocBuilderValue *value) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE Set(
/* [in] */ long index,
/* [in] */ IONLYOFFICEDocBuilderValue *value) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE Call(
/* [in] */ BSTR name,
/* [optional][in] */ VARIANT val1,
/* [optional][in] */ VARIANT val2,
/* [optional][in] */ VARIANT val3,
/* [optional][in] */ VARIANT val4,
/* [optional][in] */ VARIANT val5,
/* [optional][in] */ VARIANT val6,
/* [retval][out] */ IONLYOFFICEDocBuilderValue **result) = 0;
};
MIDL_INTERFACE("656ae95c-ae91-4dc0-88bf-0b770fc2d552")
IONLYOFFICEDocBuilderContextScope : public IDispatch
{
public:
virtual /* [id] */ HRESULT STDMETHODCALLTYPE Close( void) = 0;
};
MIDL_INTERFACE("0416975a-65c3-4015-85e4-55d9dafec5fc")
IONLYOFFICEDocBuilderContext : public IDispatch
{
public:
virtual /* [id] */ HRESULT STDMETHODCALLTYPE CreateUndefined(
/* [retval][out] */ IONLYOFFICEDocBuilderValue **result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE CreateNull(
/* [retval][out] */ IONLYOFFICEDocBuilderValue **result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE CreateObject(
/* [retval][out] */ IONLYOFFICEDocBuilderValue **result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE CreateArray(
/* [in] */ long length,
/* [retval][out] */ IONLYOFFICEDocBuilderValue **result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE CreateTypedArray(
/* [in] */ VARIANT buffer,
/* [in] */ long length,
/* [retval][out] */ IONLYOFFICEDocBuilderValue **result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE GetGlobal(
/* [retval][out] */ IONLYOFFICEDocBuilderValue **result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE CreateScope(
/* [retval][out] */ IONLYOFFICEDocBuilderContextScope **result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE IsError(
/* [retval][out] */ VARIANT_BOOL *result) = 0;
};
MIDL_INTERFACE("0C07B7E7-86A4-42E1-8E42-2FA961992E0F")
IONLYOFFICEDocBuilder : public IDispatch
{
public:
virtual /* [id] */ HRESULT STDMETHODCALLTYPE CreateInstance( void) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE OpenFile(
/* [in] */ BSTR path,
/* [in] */ BSTR params,
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE CreateFile(
/* [in] */ BSTR type,
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE SetTmpFolder(
/* [in] */ BSTR folder) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE SaveFile(
/* [in] */ BSTR type,
/* [in] */ BSTR path,
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE CloseFile( void) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE ExecuteCommand(
/* [in] */ BSTR command,
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE Run(
/* [in] */ BSTR path,
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE RunText(
/* [in] */ BSTR commands,
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE SetProperty(
/* [in] */ BSTR key,
/* [in] */ BSTR value) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE Execute(
/* [in] */ BSTR command,
/* [retval][out] */ IONLYOFFICEDocBuilderValue **result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE WriteData(
/* [in] */ BSTR path,
/* [in] */ BSTR value,
/* [in] */ VARIANT_BOOL append) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE IsSaveWithDoctrendererMode(
/* [retval][out] */ VARIANT_BOOL *result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE GetContext(
/* [retval][out] */ IONLYOFFICEDocBuilderContext **result) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE Initialize( void) = 0;
virtual /* [id] */ HRESULT STDMETHODCALLTYPE Dispose( void) = 0;
};
class DECLSPEC_UUID("85C41585-25D7-40F1-9CC6-FA17052650F4")
CONLYOFFICEDocBuilderValue;
class DECLSPEC_UUID("c54e2b15-ff5b-45a2-aa15-89a02605c30c")
CONLYOFFICEDocBuilderContextScope;
class DECLSPEC_UUID("299250bb-16c2-4ab4-8a49-a0c350d66bb5")
CONLYOFFICEDocBuilderContext;
class DECLSPEC_UUID("9BF69F3C-1506-41B9-B8EE-2839948C02E9")
CONLYOFFICEDocBuilder;

View File

@ -3,37 +3,25 @@
#include <atlcomcli.h>
#include <atlsafe.h>
#include "../../src/_docbuilder.h"
#include "../../src/_docbuilder_i.c"
#include "../../src/docbuilder_midl.h"
#ifdef _NATIVE_WCHAR_T_DEFINED
# ifdef _DEBUG
# pragma comment(lib, "comsuppwd.lib")
# else
#ifdef _UNICODE
# pragma comment(lib, "comsuppw.lib")
# endif
#else
# ifdef _DEBUG
# pragma comment(lib, "comsuppd.lib")
# else
# pragma comment(lib, "comsupp.lib")
# endif
#endif
#define RELEASEINTERFACE(pinterface)\
{\
if (pinterface!=NULL)\
{\
pinterface->Release();\
pinterface=NULL;\
}\
#define RELEASEINTERFACE(pinterface) \
{ \
if (NULL != pinterface) \
{ \
pinterface->Release(); \
pinterface = NULL; \
} \
}
int main(int argc, char *argv[])
{
wchar_t result_path[] = L"result.docx";
CoInitialize(NULL);
IONLYOFFICEDocBuilder* oBuilder = NULL;
@ -46,21 +34,18 @@ int main(int argc, char *argv[])
IONLYOFFICEDocBuilderValue* oParagraph = NULL;
IONLYOFFICEDocBuilderValue* oContent = NULL;
HRESULT hr;
hr = CoCreateInstance(__uuidof(CONLYOFFICEDocBuilder), NULL, CLSCTX_ALL,
__uuidof(IONLYOFFICEDocBuilder), (void**)&oBuilder);
HRESULT hr = CoCreateInstance(__uuidof(CONLYOFFICEDocBuilder), NULL, CLSCTX_ALL, __uuidof(IONLYOFFICEDocBuilder), (void**)&oBuilder);
if (FAILED(hr))
{
std::cout << "Failed!" << std::endl;
exit(1);
CoUninitialize(); \
return 1;
}
VARIANT_BOOL b;
oBuilder->Initialize();
oBuilder->CreateFileW(result_path, &b);
oBuilder->CreateFile(_bstr_t("docx"), &b);
oBuilder->GetContext(&oContext);
oContext->CreateScope(&oScope);
@ -69,18 +54,17 @@ int main(int argc, char *argv[])
oGlobal->GetProperty(_bstr_t("Api"), &oApi);
oContext->CreateArray(1, &oContent);
oApi->Call(_bstr_t(L"GetDocument"), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), &oDocument);
oApi->Call(_bstr_t(L"CreateParagraph"), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), &oParagraph);
oApi->Call(_bstr_t("GetDocument"), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), &oDocument);
oApi->Call(_bstr_t("CreateParagraph"), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), &oParagraph);
oContext->CreateArray(1, &oContent);
oParagraph->Call(_bstr_t(L"SetSpacingAfter"), ATL::CComVariant(1000), ATL::CComVariant(VARIANT_FALSE), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), NULL);
oParagraph->Call(_bstr_t(L"AddText"), ATL::CComVariant(L"Hello from COM!"), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), NULL);
oParagraph->Call(_bstr_t("SetSpacingAfter"), ATL::CComVariant(1000), ATL::CComVariant(VARIANT_FALSE), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), NULL);
oParagraph->Call(_bstr_t("AddText"), ATL::CComVariant("Hello from COM!"), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), NULL);
oContent->Set(0, oParagraph);
oDocument->Call(_bstr_t(L"InsertContent"), ATL::CComVariant(oContent), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), NULL);
oDocument->Call(_bstr_t("InsertContent"), ATL::CComVariant(oContent), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), ATL::CComVariant(), NULL);
oBuilder->SaveFile(_bstr_t(".docx"), result_path, &b);
oBuilder->SaveFile(_bstr_t("docx"), _bstr_t("result.docx"), &b);
RELEASEINTERFACE(oContent);

View File

@ -0,0 +1,119 @@
#include <iostream>
#include <comutil.h>
#include <atlcomcli.h>
#include <atlsafe.h>
#include <string>
#include "../../src/docbuilder_midl.h"
#ifdef _UNICODE
# pragma comment(lib, "comsuppw.lib")
#else
# pragma comment(lib, "comsupp.lib")
#endif
#define RELEASEINTERFACE(pinterface) \
{ \
if (NULL != pinterface) \
{ \
pinterface->Release(); \
pinterface = NULL; \
} \
}
#define EMPTY_PARAM ATL::CComVariant()
#define _B(x) _bstr_t(L##x)
int main(int argc, char *argv[])
{
// uncomment for debug js
//SetEnvironmentVariableA("V8_USE_INSPECTOR", "1");
CoInitialize(NULL);
IONLYOFFICEDocBuilder* pBuilder = NULL;
if (FAILED(CoCreateInstance(__uuidof(CONLYOFFICEDocBuilder), NULL, CLSCTX_ALL, __uuidof(IONLYOFFICEDocBuilder), (void**)&pBuilder)))
{
CoUninitialize();
return 1;
}
VARIANT_BOOL bRes;
pBuilder->Initialize();
pBuilder->OpenFile(_B("file.docx"), _B(""), &bRes);
//pBuilder->SaveFile(_B("html"), _B("D:/FILES/images.html"), &bRes);
IONLYOFFICEDocBuilderContext* pContext = NULL;
pBuilder->GetContext(&pContext);
IONLYOFFICEDocBuilderContextScope* pScope = NULL;
pContext->CreateScope(&pScope);
IONLYOFFICEDocBuilderValue* pGlobal = NULL;
pContext->GetGlobal(&pGlobal);
IONLYOFFICEDocBuilderValue* pApi = NULL;
pGlobal->GetProperty(_B("Api"), &pApi);
IONLYOFFICEDocBuilderValue* pDocument = NULL;
pApi->Call(_B("GetDocument"), EMPTY_PARAM, EMPTY_PARAM, EMPTY_PARAM, EMPTY_PARAM, EMPTY_PARAM, EMPTY_PARAM, &pDocument);
IONLYOFFICEDocBuilderValue* pRanges = NULL;
pDocument->Call(_B("Search"), ATL::CComVariant("year"), EMPTY_PARAM, EMPTY_PARAM, EMPTY_PARAM, EMPTY_PARAM, EMPTY_PARAM, &pRanges);
if (pRanges)
{
VARIANT_BOOL vbIsArray = VARIANT_FALSE;
pRanges->IsArray(&vbIsArray);
if (VARIANT_TRUE == vbIsArray)
{
long nCount = 0;
pRanges->GetLength(&nCount);
if (0 < nCount)
{
IONLYOFFICEDocBuilderValue* pSearchRange = NULL;
pRanges->Get(0, &pSearchRange);
IONLYOFFICEDocBuilderValue* pComment = NULL;
pSearchRange->Call(_B("AddComment"), ATL::CComVariant("Comment Text"), ATL::CComVariant("Author"),
EMPTY_PARAM, EMPTY_PARAM, EMPTY_PARAM, EMPTY_PARAM, &pComment);
IONLYOFFICEDocBuilderValue* pCommentID = NULL;
pComment->Call(_B("GetId"), EMPTY_PARAM, EMPTY_PARAM, EMPTY_PARAM, EMPTY_PARAM, EMPTY_PARAM, EMPTY_PARAM, &pCommentID);
// get comment id.
// work with comment:
// https://api.onlyoffice.com/docbuilder/textdocumentapi/apidocument/getcommentbyid
// https://api.onlyoffice.com/docbuilder/textdocumentapi/apicomment
BSTR bsCommentId = NULL;
pCommentID->ToString(&bsCommentId);
SysFreeString(bsCommentId);
RELEASEINTERFACE(pCommentID);
RELEASEINTERFACE(pComment);
RELEASEINTERFACE(pSearchRange);
}
}
}
RELEASEINTERFACE(pRanges);
RELEASEINTERFACE(pDocument);
RELEASEINTERFACE(pApi);
RELEASEINTERFACE(pGlobal);
RELEASEINTERFACE(pScope);
RELEASEINTERFACE(pContext);
pBuilder->SaveFile(_B("docx"), _B("file.docx"), &bRes);
pBuilder->CloseFile();
pBuilder->Dispose();
RELEASEINTERFACE(pBuilder);
CoUninitialize();
return 0;
}

View File

@ -59,6 +59,10 @@ namespace NSDoctRenderer
{
return m_pInternal->SaveFile(type, path, params);
}
int CDocBuilder::SaveFile(const wchar_t* extension, const wchar_t* path, const wchar_t* params)
{
return m_pInternal->SaveFile(extension, path, params);
}
bool CDocBuilder::ExecuteCommand(const wchar_t* command, CDocBuilderValue* retValue)
{
return m_pInternal->ExecuteCommand(command, retValue);

View File

@ -41,7 +41,7 @@ namespace NSDoctRenderer
* The string class with the wchar_t* property.
*/
class CString_Private;
class Q_DECL_EXPORT CString
class BUILDER_DECL CString
{
public:
CString();
@ -61,7 +61,7 @@ namespace NSDoctRenderer
* It represents a wrapper for a JS object.
*/
class CDocBuilderValue_Private;
class Q_DECL_EXPORT CDocBuilderValue
class BUILDER_DECL CDocBuilderValue
{
public:
CDocBuilderValue();
@ -238,7 +238,7 @@ namespace NSDoctRenderer
* All opened scopes will be closed automatically when the builder CloseFile method is called.
*/
class CDocBuilderContextScope_Private;
class Q_DECL_EXPORT CDocBuilderContextScope
class BUILDER_DECL CDocBuilderContextScope
{
public:
CDocBuilderContextScope();
@ -261,7 +261,7 @@ namespace NSDoctRenderer
* Class for getting JS context for working.
*/
class CDocBuilderContext_Private;
class Q_DECL_EXPORT CDocBuilderContext
class BUILDER_DECL CDocBuilderContext
{
public:
CDocBuilderContext();
@ -333,7 +333,7 @@ namespace NSDoctRenderer
* Base class used by ONLYOFFICE Document Builder for the document file (text document, spreadsheet, presentation, form document, PDF) to be generated.
*/
class CDocBuilder_Private;
class Q_DECL_EXPORT CDocBuilder
class BUILDER_DECL CDocBuilder
{
public:
CDocBuilder();
@ -355,6 +355,7 @@ namespace NSDoctRenderer
* @return True if the operation is successful
*/
bool CreateFile(const int& type);
bool CreateFile(const wchar_t* extension);
/**
* Sets the path to the folder where the program will temporarily save files needed for the program correct work.
* After the successful document file creation, all the files will be deleted from the folder. If no temporary folder is set, the system one will be used.
@ -380,6 +381,7 @@ namespace NSDoctRenderer
* @return Process x2t return code
*/
int SaveFile(const int& type, const wchar_t* path, const wchar_t* params = 0);
int SaveFile(const wchar_t* extension, const wchar_t* path, const wchar_t* params = 0);
/**
* Closes the file to stop working with it. You can use a single ONLYOFFICE Document Builder instance
* to work with all your files, but you need to close the previous file before you can

View File

@ -49,7 +49,8 @@ namespace docbuilder_net
RTF = MASK + 0x0004,
TXT = MASK + 0x0005,
DOTX = MASK + 0x000c,
OTT = MASK + 0x000f
OTT = MASK + 0x000f,
HTML = MASK + 0x0012
};
public enum class Spreadsheet : int

View File

@ -48,18 +48,13 @@ CV8RealTimeWorker::CV8RealTimeWorker(NSDoctRenderer::CDocBuilder* pBuilder)
m_nFileType = -1;
m_context = new CJSContext();
m_context->Initialize();
m_context->CreateContext();
CJSContextScope scope(m_context);
m_isolate_scope = m_context->CreateIsolateScope();
m_handle_scope = m_context->CreateLocalScope();
m_context->CreateGlobalForContext();
CNativeControlEmbed::CreateObjectBuilderInContext("CreateNativeEngine", m_context);
CGraphicsEmbed::CreateObjectInContext("CreateNativeGraphics", m_context);
NSJSBase::CreateDefaults(m_context);
m_context->CreateContext();
JSSmart<CJSContextScope> context_scope = m_context->CreateContextScope();
JSSmart<CJSTryCatch> try_catch = m_context->GetExceptions();
builder_CreateNative("builderJS", m_context, pBuilder);
@ -67,14 +62,12 @@ CV8RealTimeWorker::CV8RealTimeWorker(NSDoctRenderer::CDocBuilder* pBuilder)
CV8RealTimeWorker::~CV8RealTimeWorker()
{
m_oContextData.Clear();
m_handle_scope = NULL;
m_isolate_scope = NULL;
m_context->Dispose();
}
bool CV8RealTimeWorker::ExecuteCommand(const std::wstring& command, NSDoctRenderer::CDocBuilderValue* retValue)
{
LOGGER_SPEED_START
LOGGER_SPEED_START();
if (retValue)
retValue->Clear();
@ -82,10 +75,10 @@ bool CV8RealTimeWorker::ExecuteCommand(const std::wstring& command, NSDoctRender
std::string commandA = U_TO_UTF8(command);
//commandA = "Api." + commandA;
JSSmart<CJSContextScope> context_scope = m_context->CreateContextScope();
CJSContextScope scope(m_context);
JSSmart<CJSTryCatch> try_catch = m_context->GetExceptions();
LOGGER_SPEED_LAP("compile_command")
LOGGER_SPEED_LAP("compile_command");
JSSmart<CJSValue> retNativeVal = m_context->runScript(commandA, try_catch);
if(try_catch->Check())
@ -98,7 +91,7 @@ bool CV8RealTimeWorker::ExecuteCommand(const std::wstring& command, NSDoctRender
privateRet->m_value = retNativeVal;
}
LOGGER_SPEED_LAP("run_command")
LOGGER_SPEED_LAP("run_command");
return true;
}
@ -107,7 +100,7 @@ std::string CV8RealTimeWorker::GetGlobalVariable()
{
std::string commandA = "JSON.stringify(GlobalVariable);";
JSSmart<CJSContextScope> context_scope = m_context->CreateContextScope();
CJSContextScope scope(m_context);
JSSmart<CJSTryCatch> try_catch = m_context->GetExceptions();
JSSmart<CJSValue> _value = m_context->runScript(commandA, try_catch);
@ -124,7 +117,7 @@ std::wstring CV8RealTimeWorker::GetJSVariable(std::wstring sParam)
NSStringUtils::string_replaceA(sParamA, "\\\"", "\"");
std::string commandA = "(function(){ return (" + sParamA + "); })()";
JSSmart<CJSContextScope> context_scope = m_context->CreateContextScope();
CJSContextScope scope(m_context);
JSSmart<CJSTryCatch> try_catch = m_context->GetExceptions();
JSSmart<CJSValue> _value = m_context->runScript(commandA, try_catch);
@ -137,10 +130,10 @@ std::wstring CV8RealTimeWorker::GetJSVariable(std::wstring sParam)
bool CV8RealTimeWorker::OpenFile(const std::wstring& sBasePath, const std::wstring& path, const std::string& sString, const std::wstring& sCachePath, CV8Params* pParams)
{
LOGGER_SPEED_START
LOGGER_SPEED_START();
JSSmart<CJSContextScope> context_scope = m_context->CreateContextScope();
JSSmart<CJSTryCatch> try_catch = m_context->GetExceptions();
CJSContextScope scope(m_context);
JSSmart<CJSTryCatch> try_catch = m_context->GetExceptions();
LOGGER_SPEED_LAP("compile");
@ -148,7 +141,7 @@ bool CV8RealTimeWorker::OpenFile(const std::wstring& sBasePath, const std::wstri
if(try_catch->Check())
return false;
LOGGER_SPEED_LAP("run")
LOGGER_SPEED_LAP("run");
if (true)
{
@ -246,8 +239,10 @@ bool CV8RealTimeWorker::OpenFile(const std::wstring& sBasePath, const std::wstri
bIsBreak = !this->ExecuteCommand(L"Api.asc_nativeInitBuilder();");
if (!bIsBreak)
bIsBreak = !this->ExecuteCommand(L"Api.asc_SetSilentMode(true);");
if (!bIsBreak)
bIsBreak = !this->ExecuteCommand(L"Api.asc_showComments();");
LOGGER_SPEED_LAP("open")
LOGGER_SPEED_LAP("open");
return !bIsBreak;
}
@ -262,7 +257,7 @@ 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;
JSSmart<CJSContextScope> context_scope = m_context->CreateContextScope();
CJSContextScope scope(m_context);
JSSmart<CJSTryCatch> try_catch = m_context->GetExceptions();
NSNativeControl::CNativeControl* pNative = NULL;
@ -1051,7 +1046,7 @@ namespace NSDoctRenderer
{
CDocBuilderContextScope ret;
ret.m_internal->m_scope_wrap = new CDocBuilderContextScopeWrap();
ret.m_internal->m_scope_wrap->m_scope = m_internal->m_context->CreateContextScope();
ret.m_internal->m_scope_wrap->m_scope = new CJSContextScope(m_internal->m_context);
ret.m_internal->m_context_data = m_internal->m_context_data;
m_internal->m_context_data->AddScope(ret.m_internal->m_scope_wrap);
@ -1111,6 +1106,19 @@ namespace NSDoctRenderer
return m_pInternal->CreateFile(type);
}
bool CDocBuilder::CreateFile(const wchar_t* extension)
{
std::wstring sType = (NULL != extension) ? std::wstring(extension) : L"docx";
int type = AVS_OFFICESTUDIO_FILE_DOCUMENT;
if (L"pptx" == sType)
type = AVS_OFFICESTUDIO_FILE_PRESENTATION;
else if (L"xlsx" == sType)
type = AVS_OFFICESTUDIO_FILE_SPREADSHEET;
return CreateFile(type);
}
void CDocBuilder::SetTmpFolder(const wchar_t* folder)
{
if (m_pInternal->m_bIsServerSafeVersion)

View File

@ -58,6 +58,7 @@
#endif
#include "../fontengine/ApplicationFontsWorker.h"
#include "../../OfficeUtils/src/OfficeUtils.h"
#ifdef CreateFile
#undef CreateFile
@ -391,8 +392,6 @@ public:
class CV8RealTimeWorker
{
public:
JSSmart<CJSIsolateScope> m_isolate_scope;
JSSmart<CJSLocalScope> m_handle_scope;
JSSmart<CJSContext> m_context;
int m_nFileType;
@ -888,7 +887,7 @@ namespace NSDoctRenderer
{
Init();
LOGGER_SPEED_START
LOGGER_SPEED_START();
CheckFileDir();
NSDirectory::CreateDirectory(m_sFileDir + L"/changes");
@ -910,7 +909,7 @@ namespace NSDoctRenderer
int nReturnCode = ConvertToInternalFormat(m_sFileDir, sFileCopy, params);
LOGGER_SPEED_LAP("open_convert")
LOGGER_SPEED_LAP("open_convert");
if (0 == nReturnCode)
return 0;
@ -968,9 +967,9 @@ namespace NSDoctRenderer
return 1;
}
LOGGER_SPEED_START
LOGGER_SPEED_START();
std::wstring sConvertionParams = L"";
std::wstring sConvertionParams = L"";
if (NULL != params)
{
sConvertionParams = std::wstring(params);
@ -1161,13 +1160,34 @@ namespace NSDoctRenderer
}
#endif
// html correct (TODO: move to x2t)
if (0 == nReturnCode && type == AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML_IN_CONTAINER)
{
COfficeUtils oUtils;
if (S_OK == oUtils.IsArchive(_path))
{
std::wstring sTmpFile = sDstTmpDir + L"/tmp_html";
NSDirectory::CreateDirectory(sTmpFile);
if (S_OK == oUtils.ExtractToDirectory(_path, sTmpFile, NULL, 0))
{
std::vector<std::wstring> arFiles = NSDirectory::GetFiles(sTmpFile);
if (arFiles.size() == 1)
{
NSFile::CFileBinary::Remove(_path);
NSFile::CFileBinary::Move(arFiles[0], _path);
}
}
}
}
NSDirectory::DeleteDirectory(sDstTmpDir);
NSFile::CFileBinary::Remove(sTempFileForParams);
LOGGER_SPEED_LAP("save_convert")
LOGGER_SPEED_LAP("save_convert");
if (0 == nReturnCode)
return 0;
if (0 == nReturnCode)
return 0;
std::wstring sErrorLog = L"save file error (" + std::to_wstring(nReturnCode) + L")";
CV8RealTimeWorker::_LOGGING_ERROR_(L"error: ", sErrorLog);
@ -1204,6 +1224,45 @@ namespace NSDoctRenderer
return true;
}
int SaveFile(const std::wstring& ext, const std::wstring& path, const wchar_t* params = NULL)
{
int nType = -1;
if (L"docx" == ext)
nType = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX;
else if (L"doc" == ext)
nType = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC;
else if (L"odt" == ext)
nType = AVS_OFFICESTUDIO_FILE_DOCUMENT_ODT;
else if (L"rtf" == ext)
nType = AVS_OFFICESTUDIO_FILE_DOCUMENT_RTF;
else if (L"txt" == ext)
nType = AVS_OFFICESTUDIO_FILE_DOCUMENT_TXT;
else if (L"pptx" == ext)
nType = AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX;
else if (L"odp" == ext)
nType = AVS_OFFICESTUDIO_FILE_PRESENTATION_ODP;
else if (L"xlsx" == ext)
nType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSX;
else if (L"xls" == ext)
nType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLS;
else if (L"ods" == ext)
nType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS;
else if (L"csv" == ext)
nType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV;
else if (L"pdf" == ext)
nType = AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF;
else if (L"image" == ext)
nType = AVS_OFFICESTUDIO_FILE_IMAGE;
else if (L"jpg" == ext)
nType = AVS_OFFICESTUDIO_FILE_IMAGE;
else if (L"png" == ext)
nType = AVS_OFFICESTUDIO_FILE_IMAGE;
else if (L"html" == ext)
nType = AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML_IN_CONTAINER;
return SaveFile(nType, path, params);
}
bool ExecuteCommand(const std::wstring& command, CDocBuilderValue* retValue = NULL)
{
if (command.length() < 7 && !retValue) // minimum command (!!!)

View File

@ -535,39 +535,34 @@ namespace NSDoctRenderer
bool ExecuteScript(const std::string& strScript, const std::wstring& sCachePath, std::wstring& strError, std::wstring& strReturnParams)
{
LOGGER_SPEED_START
LOGGER_SPEED_START();
bool bIsBreak = false;
bool bIsBreak = false;
JSSmart<CJSContext> context = new CJSContext();
context->Initialize();
if (true)
{
JSSmart<CJSIsolateScope> isolate_scope = context->CreateIsolateScope();
JSSmart<CJSLocalScope> handle_scope = context->CreateLocalScope();
context->CreateGlobalForContext();
context->CreateContext();
CJSContextScope scope(context);
CNativeControlEmbed::CreateObjectBuilderInContext("CreateNativeEngine", context);
CGraphicsEmbed::CreateObjectInContext("CreateNativeGraphics", context);
NSJSBase::CreateDefaults(context);
context->CreateContext();
JSSmart<CJSContextScope> context_scope = context->CreateContextScope();
JSSmart<CJSTryCatch> try_catch = context->GetExceptions();
LOGGER_SPEED_LAP("compile")
LOGGER_SPEED_LAP("compile");
JSSmart<CJSValue> res = context->runScript(strScript, try_catch, sCachePath);
JSSmart<CJSValue> res = context->runScript(strScript, try_catch, sCachePath);
if(try_catch->Check())
{
strError = L"code=\"run\"";
bIsBreak = true;
}
LOGGER_SPEED_LAP("run")
LOGGER_SPEED_LAP("run");
//---------------------------------------------------------------
JSSmart<CJSObject> global_js = context->GetGlobal();
//---------------------------------------------------------------
JSSmart<CJSObject> global_js = context->GetGlobal();
JSSmart<CJSValue> args[1];
args[0] = CJSContext::createInt(0);
@ -653,10 +648,10 @@ namespace NSDoctRenderer
}
}
LOGGER_SPEED_LAP("open")
LOGGER_SPEED_LAP("open");
// CHANGES
if (!bIsBreak)
// CHANGES
if (!bIsBreak)
{
if (m_oParams.m_arChanges.size() != 0)
{
@ -704,9 +699,9 @@ namespace NSDoctRenderer
}
}
LOGGER_SPEED_LAP("changes")
LOGGER_SPEED_LAP("changes");
bool bIsMailMerge = false;
bool bIsMailMerge = false;
if (!m_oParams.m_strMailMergeDatabasePath.empty() &&
m_oParams.m_nMailMergeIndexEnd >= m_oParams.m_nMailMergeIndexStart &&
m_oParams.m_nMailMergeIndexEnd >= 0)
@ -825,7 +820,7 @@ namespace NSDoctRenderer
bIsBreak = Doct_renderer_SaveFile(&m_oParams, pNative, context, args, strError, js_objectApi);
}
LOGGER_SPEED_LAP("save")
LOGGER_SPEED_LAP("save");
}
context->Dispose();
@ -1077,20 +1072,15 @@ namespace NSDoctRenderer
strScript += "\n$.ready();";
JSSmart<CJSContext> context = new CJSContext();
context->Initialize();
if (true)
{
JSSmart<CJSIsolateScope> isolate_scope = context->CreateIsolateScope();
JSSmart<CJSLocalScope> handle_scope = context->CreateLocalScope();
context->CreateGlobalForContext();
context->CreateContext();
CJSContextScope scope(context);
CNativeControlEmbed::CreateObjectBuilderInContext("CreateNativeEngine", context);
CGraphicsEmbed::CreateObjectInContext("CreateNativeGraphics", context);
NSJSBase::CreateDefaults(context);
context->CreateContext();
JSSmart<CJSContextScope> context_scope = context->CreateContextScope();
JSSmart<CJSTryCatch> try_catch = context->GetExceptions();
context->runScript(strScript, try_catch, sCachePath);

View File

@ -34,7 +34,7 @@
#include <string>
#include <vector>
#include "../common/base_export.h"
#include "./common.h"
namespace NSDoctRenderer
{
@ -57,7 +57,7 @@ namespace NSDoctRenderer
namespace NSDoctRenderer
{
class CDoctRenderer_Private;
class Q_DECL_EXPORT CDoctrenderer
class BUILDER_DECL CDoctrenderer
{
public:
CDoctrenderer(const std::wstring& sAllFontsPath = L"");

View File

@ -12,21 +12,12 @@ CORE_ROOT_DIR = $$PWD/../..
PWD_ROOT_DIR = $$PWD
include(../../Common/base.pri)
DEFINES += DOCTRENDERER_USE_DYNAMIC_LIBRARY_BUILDING
ADD_DEPENDENCY(graphics, kernel, UnicodeConverter, kernel_network)
#CONFIG += build_xp
core_android:DEFINES += DISABLE_MEMORY_LIMITATION
core_ios {
CONFIG += doct_renderer_empty
}
core_android {
DEFINES += DISABLE_MEMORY_LIMITATION
CONFIG += doct_renderer_empty
}
doct_renderer_empty {
SOURCES += doctrenderer_empty.cpp
} else {
HEADERS += \
config.h \
doctrenderer.h \
@ -37,7 +28,8 @@ SOURCES += \
doctrenderer.cpp \
docbuilder.cpp \
docbuilder_p.cpp \
graphics.cpp
graphics.cpp \
hash.cpp
SOURCES += \
../../Common/OfficeFileFormatChecker2.cpp \
@ -47,7 +39,8 @@ SOURCES += \
HEADERS += \
docbuilder_p.h \
nativecontrol.h \
graphics.h
graphics.h \
hash.h
HEADERS += \
embed/PointerEmbed.h \
@ -57,6 +50,8 @@ HEADERS += \
embed/NativeControlEmbed.h \
embed/NativeBuilderEmbed.h \
embed/TextMeasurerEmbed.h \
embed/HashEmbed.h \
embed/Default.h \
js_internal/js_base.h
SOURCES += \
@ -66,13 +61,10 @@ SOURCES += \
embed/MemoryStreamEmbed.cpp \
embed/NativeControlEmbed.cpp \
embed/NativeBuilderEmbed.cpp \
embed/TextMeasurerEmbed.cpp
embed/TextMeasurerEmbed.cpp \
embed/HashEmbed.cpp \
embed/Default.cpp
core_mac {
!use_v8:CONFIG += use_javascript_core
}
#CONFIG += v8_use_inspector
include($$PWD/js_internal/js_base.pri)
!use_javascript_core {
@ -82,8 +74,9 @@ include($$PWD/js_internal/js_base.pri)
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
embed/v8/v8_Pointer.cpp \
embed/v8/v8_TextMeasurer.cpp \
embed/v8/v8_Hash.cpp
build_xp:DESTDIR=$$DESTDIR/xp
} else {
@ -94,14 +87,15 @@ include($$PWD/js_internal/js_base.pri)
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
embed/jsc/jsc_Pointer.mm \
embed/jsc/jsc_TextMeasurer.mm \
embed/jsc/jsc_Hash.mm
LIBS += -framework Foundation
}
}
include(../graphics/pro/textshaper.pri)
include(../../Common/3dParty/openssl/openssl.pri)
# downloader
DEFINES += BUIDLER_OPEN_DOWNLOAD_ENABLED

View File

@ -1,195 +0,0 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#include "doctrenderer.h"
#include "docbuilder.h"
#ifdef BOOL
#undef BOOL
#endif
#include <iostream>
namespace NSDoctRenderer
{
CString::CString() {}
CString::CString(const CString& src) {}
CString& CString::operator=(const CString& src) { return *this; }
wchar_t* CString::c_str() const { return NULL; }
CDocBuilderValue::CDocBuilderValue() {}
CDocBuilderValue::CDocBuilderValue(const CDocBuilderValue& src) {}
CDocBuilderValue& CDocBuilderValue::operator=(const CDocBuilderValue& src) { return *this; }
CDocBuilderValue::~CDocBuilderValue() {}
void* private_get_internal() { return NULL; }
bool CDocBuilderValue::IsEmpty() { return true; }
void CDocBuilderValue::Clear() {}
bool CDocBuilderValue::IsNull() { return false; }
bool CDocBuilderValue::IsUndefined() { return false; }
bool CDocBuilderValue::IsBool() { return false; }
bool CDocBuilderValue::IsInt() { return false; }
bool CDocBuilderValue::IsDouble() { return false; }
bool CDocBuilderValue::IsString() { return false; }
bool CDocBuilderValue::IsFunction() { return false; }
bool CDocBuilderValue::IsObject() { return false; }
bool CDocBuilderValue::IsArray() { return false; }
bool CDocBuilderValue::IsTypedArray() { return false; }
unsigned int CDocBuilderValue::GetLength() { return 0; }
bool CDocBuilderValue::ToBool() { return false; }
int CDocBuilderValue::ToInt() { return 0; }
double CDocBuilderValue::ToDouble() { return 0; }
CString CDocBuilderValue::ToString() { return CString(); }
CDocBuilderValue CDocBuilderValue::GetProperty(const wchar_t* name) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Get(const char* name) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Get(const wchar_t* name) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::operator[](const char* name) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::operator[](const wchar_t* name) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Get(const int& index) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::operator[](const int& index) { CDocBuilderValue ret; return ret; }
void CDocBuilderValue::SetProperty(const wchar_t* name, CDocBuilderValue value) {}
void CDocBuilderValue::Set(const wchar_t* name, CDocBuilderValue value) {}
void CDocBuilderValue::Set(const int& index, CDocBuilderValue value) {}
// primitives
CDocBuilderValue::CDocBuilderValue(const bool& value) {}
CDocBuilderValue::CDocBuilderValue(const int& value) {}
CDocBuilderValue::CDocBuilderValue(const unsigned int& value) {}
CDocBuilderValue::CDocBuilderValue(const double& value) {}
CDocBuilderValue::CDocBuilderValue(const char* value) {}
CDocBuilderValue::CDocBuilderValue(const wchar_t* value) {}
CDocBuilderValue CDocBuilderValue::CreateUndefined() { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::CreateNull() { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Call(const char* name) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Call(const char* name, CDocBuilderValue p1) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Call(const char* name, CDocBuilderValue p1, CDocBuilderValue p2) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Call(const char* name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Call(const char* name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Call(const char* name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4, CDocBuilderValue p5) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Call(const char* name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4, CDocBuilderValue p5, CDocBuilderValue p6) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Call(const wchar_t* name) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Call(const wchar_t* name, CDocBuilderValue p1) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Call(const wchar_t* name, CDocBuilderValue p1, CDocBuilderValue p2) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Call(const wchar_t* name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Call(const wchar_t* name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Call(const wchar_t* name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4, CDocBuilderValue p5) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderValue::Call(const wchar_t* name, CDocBuilderValue p1, CDocBuilderValue p2, CDocBuilderValue p3, CDocBuilderValue p4, CDocBuilderValue p5, CDocBuilderValue p6) { CDocBuilderValue ret; return ret; }
CDocBuilderContextScope::CDocBuilderContextScope() {}
CDocBuilderContextScope::CDocBuilderContextScope(const CDocBuilderContextScope& src) {}
CDocBuilderContextScope& CDocBuilderContextScope::operator=(const CDocBuilderContextScope& src) { return *this; }
CDocBuilderContextScope::~CDocBuilderContextScope() {}
void CDocBuilderContextScope::Close() {}
CDocBuilderContext::CDocBuilderContext() {}
CDocBuilderContext::CDocBuilderContext(const CDocBuilderContext& src) {}
CDocBuilderContext& CDocBuilderContext::operator=(const CDocBuilderContext& src) { return *this; }
CDocBuilderContext::~CDocBuilderContext() {}
CDocBuilderValue CDocBuilderContext::CreateUndefined() { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderContext::CreateNull() { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderContext::CreateObject() { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderContext::CreateArray(const int& length) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderContext::CreateTypedArray(unsigned char* buffer, const int& length, const bool& externalize) { CDocBuilderValue ret; return ret; }
CDocBuilderValue CDocBuilderContext::GetGlobal() { CDocBuilderValue ret; return ret; }
CDocBuilderContextScope CDocBuilderContext::CreateScope() { CDocBuilderContextScope ret; return ret; }
bool CDocBuilderContext::IsError() { return true; }
}
namespace NSDoctRenderer
{
CDocBuilder::CDocBuilder() {}
CDocBuilder::~CDocBuilder() {}
int CDocBuilder::OpenFile(const wchar_t* path, const wchar_t* params) { return 0; }
bool CDocBuilder::CreateFile(const int& type) { return false; }
void CDocBuilder::SetTmpFolder(const wchar_t* folder) {}
int CDocBuilder::SaveFile(const int& type, const wchar_t* path, const wchar_t* params) { return 0; }
void CDocBuilder::CloseFile() {}
bool CDocBuilder::ExecuteCommand(const wchar_t* command, CDocBuilderValue* retValue) { return false; }
bool CDocBuilder::Run(const wchar_t* path) { return false; }
bool CDocBuilder::RunTextW(const wchar_t* commands) { return false; }
bool CDocBuilder::RunTextA(const char* commands) { return false; }
void CDocBuilder::SetProperty(const char* param, const wchar_t* value) {}
void CDocBuilder::SetPropertyW(const wchar_t* param, const wchar_t* value) {}
void CDocBuilder::WriteData(const wchar_t* path, const wchar_t* value, const bool& append) {}
bool CDocBuilder::IsSaveWithDoctrendererMode() { return false; }
char* CDocBuilder::GetVersion() { return "0.0"; }
CDocBuilderContext CDocBuilder::GetContext()
{
return CDocBuilderContext();
}
void CDocBuilder::Initialize(const wchar_t* directory) {}
void CDocBuilder::Dispose() {}
}
namespace NSDoctRenderer
{
CDoctrenderer::CDoctrenderer(const std::wstring& sAllFontsPath) {}
CDoctrenderer::~CDoctrenderer() {}
void CDoctrenderer::LoadConfig(const std::wstring& sConfigDir, const std::wstring& sAllFontsPath)
{
}
bool CDoctrenderer::Execute(const std::wstring& strXml, std::wstring& strError)
{
return false;
}
std::vector<std::wstring> CDoctrenderer::GetImagesInChanges()
{
std::vector<std::wstring> stub;
return stub;
}
void CDoctrenderer::CreateCache(const std::wstring& sAllFontsPath, const std::wstring& sCacheDir)
{
}
}

View File

@ -0,0 +1,17 @@
#include "Default.h"
#include "./ZipEmbed.h"
#include "./TextMeasurerEmbed.h"
#include "./MemoryStreamEmbed.h"
#include "./HashEmbed.h"
namespace NSJSBase
{
void CreateDefaults(JSSmart<CJSContext>& context)
{
CZipEmbed::CreateObjectInContext("CreateNativeZip", context);
CTextMeasurerEmbed::CreateObjectInContext("CreateNativeTextMeasurer", context);
CMemoryStreamEmbed::CreateObjectInContext("CreateNativeMemoryStream", context);
CHashEmbed::CreateObjectInContext("CreateNativeHash", context);
}
}

View File

@ -1,18 +1,11 @@
#ifndef _BUILD_NATIVE_DEFAULT_EMBED_H_
#define _BUILD_NATIVE_DEFAULT_EMBED_H_
#include "./ZipEmbed.h"
#include "./TextMeasurerEmbed.h"
#include "./MemoryStreamEmbed.h"
#include "../js_internal/js_base.h"
namespace NSJSBase
{
static void CreateDefaults(JSSmart<CJSContext>& context)
{
CZipEmbed::CreateObjectInContext("CreateNativeZip", context);
CTextMeasurerEmbed::CreateObjectInContext("CreateNativeTextMeasurer", context);
CMemoryStreamEmbed::CreateObjectInContext("CreateNativeMemoryStream", context);
}
void JS_DECL CreateDefaults(JSSmart<CJSContext>& context);
}
#endif // _BUILD_NATIVE_DEFAULT_EMBED_H_

View File

@ -2,565 +2,565 @@
JSSmart<CJSValue> CGraphicsEmbed::init(JSSmart<CJSValue> Native, JSSmart<CJSValue> width_px, JSSmart<CJSValue> height_px, JSSmart<CJSValue> width_mm, JSSmart<CJSValue> height_mm)
{
m_pInternal->init((NSNativeControl::CNativeControl*)Native->toObjectSmart()->getNative()->getObject(), width_px->toDouble(), height_px->toDouble(), width_mm->toDouble(), height_mm->toDouble());
return NULL;
m_pInternal->init((NSNativeControl::CNativeControl*)Native->toObjectSmart()->getNative()->getObject(), width_px->toDouble(), height_px->toDouble(), width_mm->toDouble(), height_mm->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::Destroy()
{
m_pInternal->Destroy();
return NULL;
m_pInternal->Destroy();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::EndDraw()
{
m_pInternal->EndDraw();
return NULL;
m_pInternal->EndDraw();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::put_GlobalAlpha(JSSmart<CJSValue> enable, JSSmart<CJSValue> globalAlpha)
{
m_pInternal->put_GlobalAlpha(enable->toBool(), globalAlpha->toDouble());
return NULL;
m_pInternal->put_GlobalAlpha(enable->toBool(), globalAlpha->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::Start_GlobalAlpha()
{
m_pInternal->Start_GlobalAlpha();
return NULL;
m_pInternal->Start_GlobalAlpha();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::End_GlobalAlpha()
{
m_pInternal->End_GlobalAlpha();
return NULL;
m_pInternal->End_GlobalAlpha();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::p_color(JSSmart<CJSValue> r, JSSmart<CJSValue> g, JSSmart<CJSValue> b, JSSmart<CJSValue> a)
{
m_pInternal->p_color(r->toInt32(), g->toInt32(), b->toInt32(), a->toInt32());
return NULL;
m_pInternal->p_color(r->toInt32(), g->toInt32(), b->toInt32(), a->toInt32());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::p_width(JSSmart<CJSValue> w)
{
m_pInternal->p_width(w->toDouble());
return NULL;
m_pInternal->p_width(w->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::p_dash(JSSmart<CJSValue> params)
{
JSSmart<CJSArray> items = params->toArray();
size_t length = items->getCount();
double* dash = NULL;
if(length > 0)
dash = new double[length];
for(size_t i = 0; i < length; i++)
dash[i] = items->get(i)->toDouble();
m_pInternal->p_dash(length, dash);
RELEASEARRAYOBJECTS(dash);
return NULL;
JSSmart<CJSArray> items = params->toArray();
size_t length = items->getCount();
double* dash = NULL;
if(length > 0)
dash = new double[length];
for(size_t i = 0; i < length; i++)
dash[i] = items->get(i)->toDouble();
m_pInternal->p_dash(length, dash);
RELEASEARRAYOBJECTS(dash);
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::b_color1(JSSmart<CJSValue> r, JSSmart<CJSValue> g, JSSmart<CJSValue> b, JSSmart<CJSValue> a)
{
m_pInternal->b_color1(r->toInt32(), g->toInt32(), b->toInt32(), a->toInt32());
return NULL;
m_pInternal->b_color1(r->toInt32(), g->toInt32(), b->toInt32(), a->toInt32());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::b_color2(JSSmart<CJSValue> r, JSSmart<CJSValue> g, JSSmart<CJSValue> b, JSSmart<CJSValue> a)
{
m_pInternal->b_color2(r->toInt32(), g->toInt32(), b->toInt32(), a->toInt32());
return NULL;
m_pInternal->b_color2(r->toInt32(), g->toInt32(), b->toInt32(), a->toInt32());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::transform(JSSmart<CJSValue> sx, JSSmart<CJSValue> shy, JSSmart<CJSValue> shx, JSSmart<CJSValue> sy, JSSmart<CJSValue> tx, JSSmart<CJSValue> ty)
{
m_pInternal->transform(sx->toDouble(), shy->toDouble(), shx->toDouble(), sy->toDouble(), tx->toDouble(), ty->toDouble());
return NULL;
m_pInternal->transform(sx->toDouble(), shy->toDouble(), shx->toDouble(), sy->toDouble(), tx->toDouble(), ty->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::CalculateFullTransform(JSSmart<CJSValue> isInvertNeed)
{
m_pInternal->CalculateFullTransform();
return NULL;
m_pInternal->CalculateFullTransform();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::_s()
{
m_pInternal->_s();
return NULL;
m_pInternal->_s();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::_e()
{
m_pInternal->_e();
return NULL;
m_pInternal->_e();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::_z()
{
m_pInternal->_z();
return NULL;
m_pInternal->_z();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::_m (JSSmart<CJSValue> x, JSSmart<CJSValue> y)
{
m_pInternal->_m(x->toDouble(), y->toDouble());
return NULL;
m_pInternal->_m(x->toDouble(), y->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::_l (JSSmart<CJSValue> x, JSSmart<CJSValue> y)
{
m_pInternal->_l(x->toDouble(), y->toDouble());
return NULL;
m_pInternal->_l(x->toDouble(), y->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::_c (JSSmart<CJSValue> x1, JSSmart<CJSValue> y1, JSSmart<CJSValue> x2, JSSmart<CJSValue> y2, JSSmart<CJSValue> x3, JSSmart<CJSValue> y3)
{
m_pInternal->_c(x1->toDouble(), y1->toDouble(), x2->toDouble(), y2->toDouble(), x3->toDouble(), y3->toDouble());
return NULL;
m_pInternal->_c(x1->toDouble(), y1->toDouble(), x2->toDouble(), y2->toDouble(), x3->toDouble(), y3->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::_c2(JSSmart<CJSValue> x1, JSSmart<CJSValue> y1, JSSmart<CJSValue> x2, JSSmart<CJSValue> y2)
{
m_pInternal->_c2(x1->toDouble(), y1->toDouble(), x2->toDouble(), y2->toDouble());
return NULL;
m_pInternal->_c2(x1->toDouble(), y1->toDouble(), x2->toDouble(), y2->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::ds()
{
m_pInternal->ds();
return NULL;
m_pInternal->ds();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::df()
{
m_pInternal->df();
return NULL;
m_pInternal->df();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::save()
{
m_pInternal->save();
return NULL;
m_pInternal->save();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::restore()
{
m_pInternal->restore();
return NULL;
m_pInternal->restore();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::clip()
{
m_pInternal->clip();
return NULL;
m_pInternal->clip();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::reset()
{
m_pInternal->reset();
return NULL;
m_pInternal->reset();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::FreeFont()
{
m_pInternal->FreeFont();
return NULL;
m_pInternal->FreeFont();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::ClearLastFont()
{
m_pInternal->ClearLastFont();
return NULL;
m_pInternal->ClearLastFont();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::drawImage2(JSSmart<CJSValue> img, JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h, JSSmart<CJSValue> alpha, JSSmart<CJSValue> srcRect)
{
m_pInternal->drawImage(img->toStringW(), x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble(), alpha->toInt32());
return NULL;
m_pInternal->drawImage(img->toStringW(), x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble(), alpha->toInt32());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::drawImage (JSSmart<CJSValue> img, JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h, JSSmart<CJSValue> alpha, JSSmart<CJSValue> srcRect, JSSmart<CJSValue> nativeImage)
{
m_pInternal->drawImage(img->toStringW(), x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble(), alpha->toInt32());
return NULL;
m_pInternal->drawImage(img->toStringW(), x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble(), alpha->toInt32());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::GetFont()
{
return CJSContext::createString(m_pInternal->GetFont());
return CJSContext::createString(m_pInternal->GetFont());
}
JSSmart<CJSValue> CGraphicsEmbed::font(JSSmart<CJSValue> font_id, JSSmart<CJSValue> font_size)
{
m_pInternal->font();
return NULL;
m_pInternal->font();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::SetFont(JSSmart<CJSValue> path, JSSmart<CJSValue> face, JSSmart<CJSValue> size, JSSmart<CJSValue> style)
{
m_pInternal->SetFont(path->toStringW(), face->toInt32(), size->toDouble(), style->toInt32());
return NULL;
m_pInternal->SetFont(path->toStringW(), face->toInt32(), size->toDouble(), style->toInt32());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::GetTextPr()
{
m_pInternal->GetTextPr();
return NULL;
m_pInternal->GetTextPr();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::FillText(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> text)
{
m_pInternal->FillText(x->toDouble(), y->toDouble(), text->toInt32());
return NULL;
m_pInternal->FillText(x->toDouble(), y->toDouble(), text->toInt32());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::t(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> _arr)
{
m_pInternal->t(x->toDouble(), y->toDouble(), _arr->toStringW());
return NULL;
m_pInternal->t(x->toDouble(), y->toDouble(), _arr->toStringW());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::FillText2(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> text, JSSmart<CJSValue> cropX, JSSmart<CJSValue> cropW)
{
m_pInternal->FillText(x->toDouble(), y->toDouble(), text->toInt32());
return NULL;
m_pInternal->FillText(x->toDouble(), y->toDouble(), text->toInt32());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::t2(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> _arr, JSSmart<CJSValue> cropX, JSSmart<CJSValue> cropW)
{
m_pInternal->t(x->toDouble(), y->toDouble(), _arr->toStringW());
return NULL;
m_pInternal->t(x->toDouble(), y->toDouble(), _arr->toStringW());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::FillTextCode(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> lUnicode)
{
m_pInternal->FillText(x->toDouble(), y->toDouble(), lUnicode->toInt32());
return NULL;
m_pInternal->FillText(x->toDouble(), y->toDouble(), lUnicode->toInt32());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::tg(JSSmart<CJSValue> text, JSSmart<CJSValue> x, JSSmart<CJSValue> y)
{
m_pInternal->tg(text->toInt32(), x->toDouble(), y->toDouble());
return NULL;
m_pInternal->tg(text->toInt32(), x->toDouble(), y->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::charspace(JSSmart<CJSValue> space)
{
m_pInternal->charspace();
return NULL;
m_pInternal->charspace();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::private_FillGlyph (JSSmart<CJSValue> pGlyph, JSSmart<CJSValue> _bounds)
{
m_pInternal->private_FillGlyph();
return NULL;
m_pInternal->private_FillGlyph();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::private_FillGlyphC(JSSmart<CJSValue> pGlyph, JSSmart<CJSValue> cropX, JSSmart<CJSValue> cropW)
{
m_pInternal->private_FillGlyphC();
return NULL;
m_pInternal->private_FillGlyphC();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::private_FillGlyph2(JSSmart<CJSValue> pGlyph)
{
m_pInternal->private_FillGlyph2();
return NULL;
m_pInternal->private_FillGlyph2();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::SetIntegerGrid(JSSmart<CJSValue> param)
{
m_pInternal->SetIntegerGrid(param->toBool());
return NULL;
m_pInternal->SetIntegerGrid(param->toBool());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::GetIntegerGrid()
{
return CJSContext::createBool(m_pInternal->GetIntegerGrid());
return CJSContext::createBool(m_pInternal->GetIntegerGrid());
}
JSSmart<CJSValue> CGraphicsEmbed::DrawStringASCII (JSSmart<CJSValue> text, JSSmart<CJSValue> x, JSSmart<CJSValue> y)
{
m_pInternal->DrawStringASCII(text->toStringW(), x->toDouble(), y->toDouble());
return NULL;
m_pInternal->DrawStringASCII(text->toStringW(), x->toDouble(), y->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::DrawStringASCII2(JSSmart<CJSValue> text, JSSmart<CJSValue> x, JSSmart<CJSValue> y)
{
m_pInternal->DrawStringASCII(text->toStringW(), x->toDouble(), y->toDouble());
return NULL;
m_pInternal->DrawStringASCII(text->toStringW(), x->toDouble(), y->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::DrawHeaderEdit(JSSmart<CJSValue> yPos, JSSmart<CJSValue> lock_type, JSSmart<CJSValue> sectionNum, JSSmart<CJSValue> bIsRepeat, JSSmart<CJSValue> type)
{
m_pInternal->DrawHeaderEdit(yPos->toDouble());
return NULL;
m_pInternal->DrawHeaderEdit(yPos->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::DrawFooterEdit(JSSmart<CJSValue> yPos, JSSmart<CJSValue> lock_type, JSSmart<CJSValue> sectionNum, JSSmart<CJSValue> bIsRepeat, JSSmart<CJSValue> type)
{
m_pInternal->DrawFooterEdit(yPos->toDouble());
return NULL;
m_pInternal->DrawFooterEdit(yPos->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::DrawLockParagraph (JSSmart<CJSValue> x, JSSmart<CJSValue> y1, JSSmart<CJSValue> y2)
{
m_pInternal->DrawLockParagraph(x->toDouble(), y1->toDouble(), y2->toDouble());
return NULL;
m_pInternal->DrawLockParagraph(x->toDouble(), y1->toDouble(), y2->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::DrawLockObjectRect(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h)
{
m_pInternal->DrawLockObjectRect(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
m_pInternal->DrawLockObjectRect(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::DrawEmptyTableLine(JSSmart<CJSValue> x1, JSSmart<CJSValue> y1, JSSmart<CJSValue> x2, JSSmart<CJSValue> y2)
{
m_pInternal->DrawEmptyTableLine(x1->toDouble(), y1->toDouble(), x2->toDouble(), y2->toDouble());
return NULL;
m_pInternal->DrawEmptyTableLine(x1->toDouble(), y1->toDouble(), x2->toDouble(), y2->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::DrawSpellingLine (JSSmart<CJSValue> y0, JSSmart<CJSValue> x0, JSSmart<CJSValue> x1, JSSmart<CJSValue> w)
{
m_pInternal->DrawSpellingLine(y0->toDouble(), x0->toDouble(), x1->toDouble(), w->toDouble());
return NULL;
m_pInternal->DrawSpellingLine(y0->toDouble(), x0->toDouble(), x1->toDouble(), w->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::drawHorLine (JSSmart<CJSValue> align, JSSmart<CJSValue> y, JSSmart<CJSValue> x, JSSmart<CJSValue> r, JSSmart<CJSValue> penW)
{
m_pInternal->drawHorLine(align->toInt32(), y->toDouble(), x->toDouble(), r->toDouble(), penW->toDouble());
return NULL;
m_pInternal->drawHorLine(align->toInt32(), y->toDouble(), x->toDouble(), r->toDouble(), penW->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::drawHorLine2(JSSmart<CJSValue> align, JSSmart<CJSValue> y, JSSmart<CJSValue> x, JSSmart<CJSValue> r, JSSmart<CJSValue> penW)
{
m_pInternal->drawHorLine2(align->toInt32(), y->toDouble(), x->toDouble(), r->toDouble(), penW->toDouble());
return NULL;
m_pInternal->drawHorLine2(align->toInt32(), y->toDouble(), x->toDouble(), r->toDouble(), penW->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::drawVerLine (JSSmart<CJSValue> align, JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> b, JSSmart<CJSValue> penW)
{
m_pInternal->drawVerLine(align->toInt32(), x->toDouble(), y->toDouble(), b->toDouble(), penW->toDouble());
return NULL;
m_pInternal->drawVerLine(align->toInt32(), x->toDouble(), y->toDouble(), b->toDouble(), penW->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::drawHorLineExt(JSSmart<CJSValue> align, JSSmart<CJSValue> y, JSSmart<CJSValue> x, JSSmart<CJSValue> r, JSSmart<CJSValue> penW, JSSmart<CJSValue> leftMW, JSSmart<CJSValue> rightMW)
{
m_pInternal->drawHorLineExt(align->toInt32(), y->toDouble(), x->toDouble(), r->toDouble(), penW->toDouble(), leftMW->toDouble(), rightMW->toDouble());
return NULL;
m_pInternal->drawHorLineExt(align->toInt32(), y->toDouble(), x->toDouble(), r->toDouble(), penW->toDouble(), leftMW->toDouble(), rightMW->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::rect (JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h)
{
m_pInternal->rect(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
m_pInternal->rect(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::TableRect(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h)
{
m_pInternal->TableRect(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
m_pInternal->TableRect(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::AddClipRect(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h)
{
m_pInternal->AddClipRect(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
m_pInternal->AddClipRect(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::RemoveClipRect()
{
m_pInternal->RemoveClipRect();
return NULL;
m_pInternal->RemoveClipRect();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::SetClip(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h)
{
m_pInternal->SetClip(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
m_pInternal->SetClip(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::RemoveClip()
{
m_pInternal->restore();
return NULL;
m_pInternal->restore();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::drawMailMergeField(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h)
{
m_pInternal->drawMailMergeField(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
m_pInternal->drawMailMergeField(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::drawSearchResult (JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h)
{
m_pInternal->drawSearchResult(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
m_pInternal->drawSearchResult(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::drawFlowAnchor (JSSmart<CJSValue> x, JSSmart<CJSValue> y)
{
return NULL;
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::SavePen()
{
m_pInternal->SavePen();
return NULL;
m_pInternal->SavePen();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::RestorePen()
{
m_pInternal->RestorePen();
return NULL;
m_pInternal->RestorePen();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::SaveBrush()
{
m_pInternal->SaveBrush();
return NULL;
m_pInternal->SaveBrush();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::RestoreBrush()
{
m_pInternal->RestoreBrush();
return NULL;
m_pInternal->RestoreBrush();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::SavePenBrush()
{
m_pInternal->SavePenBrush();
return NULL;
m_pInternal->SavePenBrush();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::RestorePenBrush()
{
m_pInternal->RestorePenBrush();
return NULL;
m_pInternal->RestorePenBrush();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::SaveGrState()
{
m_pInternal->SaveGrState();
return NULL;
m_pInternal->SaveGrState();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::RestoreGrState()
{
m_pInternal->RestoreGrState();
return NULL;
m_pInternal->RestoreGrState();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::StartClipPath()
{
m_pInternal->StartClipPath();
return NULL;
m_pInternal->StartClipPath();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::EndClipPath()
{
m_pInternal->EndClipPath();
return NULL;
m_pInternal->EndClipPath();
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::StartCheckTableDraw()
{
return CJSContext::createBool(m_pInternal->StartCheckTableDraw());
return CJSContext::createBool(m_pInternal->StartCheckTableDraw());
}
JSSmart<CJSValue> CGraphicsEmbed::SetTextClipRect(JSSmart<CJSValue> _l, JSSmart<CJSValue> _t, JSSmart<CJSValue> _r, JSSmart<CJSValue> _b)
{
m_pInternal->SetTextClipRect(_l->toDouble(), _t->toDouble(), _r->toDouble(), _b->toDouble());
return NULL;
m_pInternal->SetTextClipRect(_l->toDouble(), _t->toDouble(), _r->toDouble(), _b->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::AddSmartRect (JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h, JSSmart<CJSValue> pen_w)
{
m_pInternal->rect(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
m_pInternal->rect(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::CheckUseFonts2 (JSSmart<CJSValue> _transform)
{
return NULL;
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::UncheckUseFonts2()
{
return NULL;
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::Drawing_StartCheckBounds(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h)
{
return NULL;
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::Drawing_EndCheckBounds()
{
return NULL;
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::DrawPresentationComment(JSSmart<CJSValue> type, JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h)
{
return NULL;
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::DrawPolygon(JSSmart<CJSValue> oPath, JSSmart<CJSValue> lineWidth, JSSmart<CJSValue> shift)
{
return NULL;
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::DrawFootnoteRect(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h)
{
m_pInternal->DrawFootnoteRect(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
m_pInternal->DrawFootnoteRect(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::toDataURL(JSSmart<CJSValue> type)
{
return CJSContext::createString(m_pInternal->toDataURL(type->toStringW()));
return CJSContext::createString(m_pInternal->toDataURL(type->toStringW()));
}
JSSmart<CJSValue> CGraphicsEmbed::GetPenColor()
{
JSSmart<CJSObject> e = CJSContext::createObject();
NSGraphics::CColor res = m_pInternal->GetPenColor();
e->set("R", res.r);
e->set("G", res.g);
e->set("B", res.b);
e->set("A", res.a);
return e->toValue();
JSSmart<CJSObject> e = CJSContext::createObject();
NSGraphics::CColor res = m_pInternal->GetPenColor();
e->set("R", res.r);
e->set("G", res.g);
e->set("B", res.b);
e->set("A", res.a);
return e->toValue();
}
JSSmart<CJSValue> CGraphicsEmbed::GetBrushColor()
{
JSSmart<CJSObject> e = CJSContext::createObject();
NSGraphics::CColor res = m_pInternal->GetBrushColor();
e->set("R", res.r);
e->set("G", res.g);
e->set("B", res.b);
e->set("A", res.a);
return e->toValue();
JSSmart<CJSObject> e = CJSContext::createObject();
NSGraphics::CColor res = m_pInternal->GetBrushColor();
e->set("R", res.r);
e->set("G", res.g);
e->set("B", res.b);
e->set("A", res.a);
return e->toValue();
}
JSSmart<CJSValue> CGraphicsEmbed::put_brushTexture(JSSmart<CJSValue> src, JSSmart<CJSValue> type)
{
m_pInternal->put_brushTexture(src->toStringW(), type->toInt32());
return NULL;
m_pInternal->put_brushTexture(src->toStringW(), type->toInt32());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::put_brushTextureMode(JSSmart<CJSValue> mode)
{
m_pInternal->put_brushTextureMode(mode->toInt32());
return NULL;
m_pInternal->put_brushTextureMode(mode->toInt32());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::put_BrushTextureAlpha(JSSmart<CJSValue> a)
{
m_pInternal->put_BrushTextureAlpha(a->toInt32());
return NULL;
m_pInternal->put_BrushTextureAlpha(a->toInt32());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::put_BrushGradient(JSSmart<CJSValue> colors, JSSmart<CJSValue> transparent, JSSmart<CJSValue> x0, JSSmart<CJSValue> y0, JSSmart<CJSValue> x1, JSSmart<CJSValue> y1, JSSmart<CJSValue> r0, JSSmart<CJSValue> r1)
{
JSSmart<CJSArray> items = colors->toArray();
size_t length = items->getCount() / 5;
LONG* color = NULL;
double* pos = NULL;
if (length > 0)
{
color = new LONG[length];
pos = new double[length];
}
LONG R, G, B, A;
for (size_t i = 0; i < 5 * length; i++)
{
JSSmart<CJSValue> item = items->get(i);
size_t nDel = i % 5;
switch (nDel)
{
case 0: pos[i / 5] = item->toDouble() / 100000.0; break;
case 1: R = item->toInt32(); break;
case 2: G = item->toInt32(); break;
case 3: B = item->toInt32(); break;
case 4:
A = item->toInt32();
if (!transparent->isNull())
A = transparent->toInt32();
color[i / 5] = R | (G << 8) | (B << 16) | (A << 24);
break;
}
}
JSSmart<CJSArray> items = colors->toArray();
size_t length = items->getCount() / 5;
LONG* color = NULL;
double* pos = NULL;
if (length > 0)
{
color = new LONG[length];
pos = new double[length];
}
LONG R, G, B, A;
for (size_t i = 0; i < 5 * length; i++)
{
JSSmart<CJSValue> item = items->get(i);
size_t nDel = i % 5;
switch (nDel)
{
case 0: pos[i / 5] = item->toDouble() / 100000.0; break;
case 1: R = item->toInt32(); break;
case 2: G = item->toInt32(); break;
case 3: B = item->toInt32(); break;
case 4:
A = item->toInt32();
if (!transparent->isNull())
A = transparent->toInt32();
color[i / 5] = R | (G << 8) | (B << 16) | (A << 24);
break;
}
}
double _x0 = x0->toDouble() / 100000.0;
double _y0 = y0->toDouble() / 100000.0;
double _x1 = x1->toDouble() / 100000.0;
double _y1 = y1->toDouble() / 100000.0;
double _r0 = r0->toDouble() / 100000.0;
double _r1 = r1->toDouble() / 100000.0;
double _x0 = x0->toDouble() / 100000.0;
double _y0 = y0->toDouble() / 100000.0;
double _x1 = x1->toDouble() / 100000.0;
double _y1 = y1->toDouble() / 100000.0;
double _r0 = r0->toDouble() / 100000.0;
double _r1 = r1->toDouble() / 100000.0;
m_pInternal->put_BrushGradient(color, pos, length, _x0, _y0, _x1, _y1, _r0, _r1);
m_pInternal->put_BrushGradient(color, pos, length, _x0, _y0, _x1, _y1, _r0, _r1);
RELEASEARRAYOBJECTS(color);
RELEASEARRAYOBJECTS(pos);
return NULL;
RELEASEARRAYOBJECTS(color);
RELEASEARRAYOBJECTS(pos);
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::TransformPointX(JSSmart<CJSValue> x, JSSmart<CJSValue> y)
{
return CJSContext::createDouble(m_pInternal->TransformPointX(x->toDouble(), y->toDouble()));
return CJSContext::createDouble(m_pInternal->TransformPointX(x->toDouble(), y->toDouble()));
}
JSSmart<CJSValue> CGraphicsEmbed::TransformPointY(JSSmart<CJSValue> x, JSSmart<CJSValue> y)
{
return CJSContext::createDouble(m_pInternal->TransformPointY(x->toDouble(), y->toDouble()));
return CJSContext::createDouble(m_pInternal->TransformPointY(x->toDouble(), y->toDouble()));
}
JSSmart<CJSValue> CGraphicsEmbed::put_LineJoin(JSSmart<CJSValue> join)
{
m_pInternal->put_LineJoin(join->toInt32());
return NULL;
m_pInternal->put_LineJoin(join->toInt32());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::get_LineJoin()
{
return CJSContext::createInt(m_pInternal->GetLineJoin());
return CJSContext::createInt(m_pInternal->GetLineJoin());
}
JSSmart<CJSValue> CGraphicsEmbed::put_TextureBounds(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h)
{
m_pInternal->put_TextureBounds(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
m_pInternal->put_TextureBounds(x->toDouble(), y->toDouble(), w->toDouble(), h->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::GetlineWidth()
{
return CJSContext::createDouble(m_pInternal->GetlineWidth());
return CJSContext::createDouble(m_pInternal->GetlineWidth());
}
JSSmart<CJSValue> CGraphicsEmbed::DrawPath(JSSmart<CJSValue> path)
{
m_pInternal->DrawPath(path->toInt32());
return NULL;
m_pInternal->DrawPath(path->toInt32());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::CoordTransformOffset(JSSmart<CJSValue> tx, JSSmart<CJSValue> ty)
{
m_pInternal->CoordTransformOffset(tx->toDouble(), ty->toDouble());
return NULL;
m_pInternal->CoordTransformOffset(tx->toDouble(), ty->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::GetTransform()
{
JSSmart<CJSObject> e = CJSContext::createObject();
NSGraphics::CTransform res = m_pInternal->GetTransform();
e->set("sx", res.sx);
e->set("shx", res.shx);
e->set("shy", res.shy);
e->set("sy", res.sy);
e->set("tx", res.tx);
e->set("ty", res.ty);
return e->toValue();
JSSmart<CJSObject> e = CJSContext::createObject();
NSGraphics::CTransform res = m_pInternal->GetTransform();
e->set("sx", res.sx);
e->set("shx", res.shx);
e->set("shy", res.shy);
e->set("sy", res.sy);
e->set("tx", res.tx);
e->set("ty", res.ty);
return e->toValue();
}

View File

@ -8,131 +8,131 @@ using namespace NSJSBase;
class CGraphicsEmbed : public CJSEmbedObject
{
public:
NSGraphics::CGraphics* m_pInternal;
NSGraphics::CGraphics* m_pInternal;
public:
CGraphicsEmbed() : m_pInternal(new NSGraphics::CGraphics()) {}
~CGraphicsEmbed() { RELEASEOBJECT(m_pInternal); }
CGraphicsEmbed() : m_pInternal(new NSGraphics::CGraphics()) {}
~CGraphicsEmbed() { RELEASEOBJECT(m_pInternal); }
virtual void* getObject() override { return (void*)m_pInternal; }
virtual void* getObject() override { return (void*)m_pInternal; }
public:
JSSmart<CJSValue> init(JSSmart<CJSValue> Native, JSSmart<CJSValue> width_px, JSSmart<CJSValue> height_px, JSSmart<CJSValue> width_mm, JSSmart<CJSValue> height_mm);
JSSmart<CJSValue> Destroy();
JSSmart<CJSValue> EndDraw();
JSSmart<CJSValue> put_GlobalAlpha(JSSmart<CJSValue> enable, JSSmart<CJSValue> globalAlpha);
JSSmart<CJSValue> Start_GlobalAlpha();
JSSmart<CJSValue> End_GlobalAlpha();
// pen methods
JSSmart<CJSValue> p_color(JSSmart<CJSValue> r, JSSmart<CJSValue> g, JSSmart<CJSValue> b, JSSmart<CJSValue> a);
JSSmart<CJSValue> p_width(JSSmart<CJSValue> w);
JSSmart<CJSValue> p_dash(JSSmart<CJSValue> params);
// brush methods
JSSmart<CJSValue> b_color1(JSSmart<CJSValue> r, JSSmart<CJSValue> g, JSSmart<CJSValue> b, JSSmart<CJSValue> a);
JSSmart<CJSValue> b_color2(JSSmart<CJSValue> r, JSSmart<CJSValue> g, JSSmart<CJSValue> b, JSSmart<CJSValue> a);
JSSmart<CJSValue> transform(JSSmart<CJSValue> sx, JSSmart<CJSValue> shy, JSSmart<CJSValue> shx, JSSmart<CJSValue> sy, JSSmart<CJSValue> tx, JSSmart<CJSValue> ty);
JSSmart<CJSValue> CalculateFullTransform(JSSmart<CJSValue> isInvertNeed);
// path commands
JSSmart<CJSValue> _s();
JSSmart<CJSValue> _e();
JSSmart<CJSValue> _z();
JSSmart<CJSValue> _m (JSSmart<CJSValue> x, JSSmart<CJSValue> y);
JSSmart<CJSValue> _l (JSSmart<CJSValue> x, JSSmart<CJSValue> y);
JSSmart<CJSValue> _c (JSSmart<CJSValue> x1, JSSmart<CJSValue> y1, JSSmart<CJSValue> x2, JSSmart<CJSValue> y2, JSSmart<CJSValue> x3, JSSmart<CJSValue> y3);
JSSmart<CJSValue> _c2(JSSmart<CJSValue> x1, JSSmart<CJSValue> y1, JSSmart<CJSValue> x2, JSSmart<CJSValue> y2);
JSSmart<CJSValue> ds();
JSSmart<CJSValue> df();
// canvas state
JSSmart<CJSValue> save();
JSSmart<CJSValue> restore();
JSSmart<CJSValue> clip();
JSSmart<CJSValue> reset();
JSSmart<CJSValue> FreeFont();
JSSmart<CJSValue> ClearLastFont();
// images
JSSmart<CJSValue> drawImage2(JSSmart<CJSValue> img, JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h, JSSmart<CJSValue> alpha, JSSmart<CJSValue> srcRect);
JSSmart<CJSValue> drawImage (JSSmart<CJSValue> img, JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h, JSSmart<CJSValue> alpha, JSSmart<CJSValue> srcRect, JSSmart<CJSValue> nativeImage);
// text
JSSmart<CJSValue> GetFont();
JSSmart<CJSValue> font(JSSmart<CJSValue> font_id, JSSmart<CJSValue> font_size);
JSSmart<CJSValue> SetFont(JSSmart<CJSValue> path, JSSmart<CJSValue> face, JSSmart<CJSValue> size, JSSmart<CJSValue> style);
JSSmart<CJSValue> GetTextPr();
JSSmart<CJSValue> FillText(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> text);
JSSmart<CJSValue> t(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> _arr);
JSSmart<CJSValue> FillText2(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> text, JSSmart<CJSValue> cropX, JSSmart<CJSValue> cropW);
JSSmart<CJSValue> t2(JSSmart<CJSValue> text, JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> cropX, JSSmart<CJSValue> cropW);
JSSmart<CJSValue> FillTextCode(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> lUnicode);
JSSmart<CJSValue> tg(JSSmart<CJSValue> text, JSSmart<CJSValue> x, JSSmart<CJSValue> y);
JSSmart<CJSValue> charspace(JSSmart<CJSValue> space);
// private methods
JSSmart<CJSValue> private_FillGlyph (JSSmart<CJSValue> pGlyph, JSSmart<CJSValue> _bounds);
JSSmart<CJSValue> private_FillGlyphC(JSSmart<CJSValue> pGlyph, JSSmart<CJSValue> cropX, JSSmart<CJSValue> cropW);
JSSmart<CJSValue> private_FillGlyph2(JSSmart<CJSValue> pGlyph);
JSSmart<CJSValue> SetIntegerGrid(JSSmart<CJSValue> param);
JSSmart<CJSValue> GetIntegerGrid();
JSSmart<CJSValue> DrawStringASCII (JSSmart<CJSValue> text, JSSmart<CJSValue> x, JSSmart<CJSValue> y);
JSSmart<CJSValue> DrawStringASCII2(JSSmart<CJSValue> text, JSSmart<CJSValue> x, JSSmart<CJSValue> y);
JSSmart<CJSValue> DrawHeaderEdit(JSSmart<CJSValue> yPos, JSSmart<CJSValue> lock_type, JSSmart<CJSValue> sectionNum, JSSmart<CJSValue> bIsRepeat, JSSmart<CJSValue> type);
JSSmart<CJSValue> DrawFooterEdit(JSSmart<CJSValue> yPos, JSSmart<CJSValue> lock_type, JSSmart<CJSValue> sectionNum, JSSmart<CJSValue> bIsRepeat, JSSmart<CJSValue> type);
JSSmart<CJSValue> DrawLockParagraph (JSSmart<CJSValue> x, JSSmart<CJSValue> y1, JSSmart<CJSValue> y2);
JSSmart<CJSValue> DrawLockObjectRect(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> DrawEmptyTableLine(JSSmart<CJSValue> x1, JSSmart<CJSValue> y1, JSSmart<CJSValue> x2, JSSmart<CJSValue> y2);
JSSmart<CJSValue> DrawSpellingLine (JSSmart<CJSValue> y0, JSSmart<CJSValue> x0, JSSmart<CJSValue> x1, JSSmart<CJSValue> w);
// smart methods for horizontal / vertical lines
JSSmart<CJSValue> drawHorLine (JSSmart<CJSValue> align, JSSmart<CJSValue> y, JSSmart<CJSValue> x, JSSmart<CJSValue> r, JSSmart<CJSValue> penW);
JSSmart<CJSValue> drawHorLine2(JSSmart<CJSValue> align, JSSmart<CJSValue> y, JSSmart<CJSValue> x, JSSmart<CJSValue> r, JSSmart<CJSValue> penW);
JSSmart<CJSValue> drawVerLine (JSSmart<CJSValue> align, JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> b, JSSmart<CJSValue> penW);
// мега крутые функции для таблиц
JSSmart<CJSValue> drawHorLineExt(JSSmart<CJSValue> align, JSSmart<CJSValue> y, JSSmart<CJSValue> x, JSSmart<CJSValue> r, JSSmart<CJSValue> penW, JSSmart<CJSValue> leftMW, JSSmart<CJSValue> rightMW);
JSSmart<CJSValue> rect (JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> TableRect(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
// функции клиппирования
JSSmart<CJSValue> AddClipRect(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> RemoveClipRect();
JSSmart<CJSValue> SetClip(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> RemoveClip();
JSSmart<CJSValue> drawMailMergeField(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> drawSearchResult (JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> drawFlowAnchor (JSSmart<CJSValue> x, JSSmart<CJSValue> y);
JSSmart<CJSValue> SavePen();
JSSmart<CJSValue> RestorePen();
JSSmart<CJSValue> SaveBrush();
JSSmart<CJSValue> RestoreBrush();
JSSmart<CJSValue> SavePenBrush();
JSSmart<CJSValue> RestorePenBrush();
JSSmart<CJSValue> SaveGrState();
JSSmart<CJSValue> RestoreGrState();
JSSmart<CJSValue> StartClipPath();
JSSmart<CJSValue> EndClipPath();
JSSmart<CJSValue> StartCheckTableDraw();
JSSmart<CJSValue> SetTextClipRect(JSSmart<CJSValue> _l, JSSmart<CJSValue> _t, JSSmart<CJSValue> _r, JSSmart<CJSValue> _b);
JSSmart<CJSValue> AddSmartRect (JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h, JSSmart<CJSValue> pen_w);
JSSmart<CJSValue> CheckUseFonts2 (JSSmart<CJSValue> _transform);
JSSmart<CJSValue> UncheckUseFonts2();
JSSmart<CJSValue> Drawing_StartCheckBounds(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> Drawing_EndCheckBounds();
JSSmart<CJSValue> DrawPresentationComment(JSSmart<CJSValue> type, JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> DrawPolygon(JSSmart<CJSValue> oPath, JSSmart<CJSValue> lineWidth, JSSmart<CJSValue> shift);
JSSmart<CJSValue> DrawFootnoteRect(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
// new methods
JSSmart<CJSValue> toDataURL(JSSmart<CJSValue> type);
JSSmart<CJSValue> GetPenColor();
JSSmart<CJSValue> GetBrushColor();
JSSmart<CJSValue> put_brushTexture(JSSmart<CJSValue> src, JSSmart<CJSValue> type);
JSSmart<CJSValue> put_brushTextureMode(JSSmart<CJSValue> mode);
JSSmart<CJSValue> put_BrushTextureAlpha(JSSmart<CJSValue> a);
JSSmart<CJSValue> put_BrushGradient(JSSmart<CJSValue> colors, JSSmart<CJSValue> n, JSSmart<CJSValue> x0, JSSmart<CJSValue> y0, JSSmart<CJSValue> x1, JSSmart<CJSValue> y1, JSSmart<CJSValue> r0, JSSmart<CJSValue> r1);
JSSmart<CJSValue> TransformPointX(JSSmart<CJSValue> x, JSSmart<CJSValue> y);
JSSmart<CJSValue> TransformPointY(JSSmart<CJSValue> x, JSSmart<CJSValue> y);
JSSmart<CJSValue> put_LineJoin(JSSmart<CJSValue> join);
JSSmart<CJSValue> get_LineJoin();
JSSmart<CJSValue> put_TextureBounds(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> GetlineWidth();
JSSmart<CJSValue> DrawPath(JSSmart<CJSValue> path);
JSSmart<CJSValue> CoordTransformOffset(JSSmart<CJSValue> tx, JSSmart<CJSValue> ty);
JSSmart<CJSValue> GetTransform();
JSSmart<CJSValue> init(JSSmart<CJSValue> Native, JSSmart<CJSValue> width_px, JSSmart<CJSValue> height_px, JSSmart<CJSValue> width_mm, JSSmart<CJSValue> height_mm);
JSSmart<CJSValue> Destroy();
JSSmart<CJSValue> EndDraw();
JSSmart<CJSValue> put_GlobalAlpha(JSSmart<CJSValue> enable, JSSmart<CJSValue> globalAlpha);
JSSmart<CJSValue> Start_GlobalAlpha();
JSSmart<CJSValue> End_GlobalAlpha();
// pen methods
JSSmart<CJSValue> p_color(JSSmart<CJSValue> r, JSSmart<CJSValue> g, JSSmart<CJSValue> b, JSSmart<CJSValue> a);
JSSmart<CJSValue> p_width(JSSmart<CJSValue> w);
JSSmart<CJSValue> p_dash(JSSmart<CJSValue> params);
// brush methods
JSSmart<CJSValue> b_color1(JSSmart<CJSValue> r, JSSmart<CJSValue> g, JSSmart<CJSValue> b, JSSmart<CJSValue> a);
JSSmart<CJSValue> b_color2(JSSmart<CJSValue> r, JSSmart<CJSValue> g, JSSmart<CJSValue> b, JSSmart<CJSValue> a);
JSSmart<CJSValue> transform(JSSmart<CJSValue> sx, JSSmart<CJSValue> shy, JSSmart<CJSValue> shx, JSSmart<CJSValue> sy, JSSmart<CJSValue> tx, JSSmart<CJSValue> ty);
JSSmart<CJSValue> CalculateFullTransform(JSSmart<CJSValue> isInvertNeed);
// path commands
JSSmart<CJSValue> _s();
JSSmart<CJSValue> _e();
JSSmart<CJSValue> _z();
JSSmart<CJSValue> _m (JSSmart<CJSValue> x, JSSmart<CJSValue> y);
JSSmart<CJSValue> _l (JSSmart<CJSValue> x, JSSmart<CJSValue> y);
JSSmart<CJSValue> _c (JSSmart<CJSValue> x1, JSSmart<CJSValue> y1, JSSmart<CJSValue> x2, JSSmart<CJSValue> y2, JSSmart<CJSValue> x3, JSSmart<CJSValue> y3);
JSSmart<CJSValue> _c2(JSSmart<CJSValue> x1, JSSmart<CJSValue> y1, JSSmart<CJSValue> x2, JSSmart<CJSValue> y2);
JSSmart<CJSValue> ds();
JSSmart<CJSValue> df();
// canvas state
JSSmart<CJSValue> save();
JSSmart<CJSValue> restore();
JSSmart<CJSValue> clip();
JSSmart<CJSValue> reset();
JSSmart<CJSValue> FreeFont();
JSSmart<CJSValue> ClearLastFont();
// images
JSSmart<CJSValue> drawImage2(JSSmart<CJSValue> img, JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h, JSSmart<CJSValue> alpha, JSSmart<CJSValue> srcRect);
JSSmart<CJSValue> drawImage (JSSmart<CJSValue> img, JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h, JSSmart<CJSValue> alpha, JSSmart<CJSValue> srcRect, JSSmart<CJSValue> nativeImage);
// text
JSSmart<CJSValue> GetFont();
JSSmart<CJSValue> font(JSSmart<CJSValue> font_id, JSSmart<CJSValue> font_size);
JSSmart<CJSValue> SetFont(JSSmart<CJSValue> path, JSSmart<CJSValue> face, JSSmart<CJSValue> size, JSSmart<CJSValue> style);
JSSmart<CJSValue> GetTextPr();
JSSmart<CJSValue> FillText(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> text);
JSSmart<CJSValue> t(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> _arr);
JSSmart<CJSValue> FillText2(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> text, JSSmart<CJSValue> cropX, JSSmart<CJSValue> cropW);
JSSmart<CJSValue> t2(JSSmart<CJSValue> text, JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> cropX, JSSmart<CJSValue> cropW);
JSSmart<CJSValue> FillTextCode(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> lUnicode);
JSSmart<CJSValue> tg(JSSmart<CJSValue> text, JSSmart<CJSValue> x, JSSmart<CJSValue> y);
JSSmart<CJSValue> charspace(JSSmart<CJSValue> space);
// private methods
JSSmart<CJSValue> private_FillGlyph (JSSmart<CJSValue> pGlyph, JSSmart<CJSValue> _bounds);
JSSmart<CJSValue> private_FillGlyphC(JSSmart<CJSValue> pGlyph, JSSmart<CJSValue> cropX, JSSmart<CJSValue> cropW);
JSSmart<CJSValue> private_FillGlyph2(JSSmart<CJSValue> pGlyph);
JSSmart<CJSValue> SetIntegerGrid(JSSmart<CJSValue> param);
JSSmart<CJSValue> GetIntegerGrid();
JSSmart<CJSValue> DrawStringASCII (JSSmart<CJSValue> text, JSSmart<CJSValue> x, JSSmart<CJSValue> y);
JSSmart<CJSValue> DrawStringASCII2(JSSmart<CJSValue> text, JSSmart<CJSValue> x, JSSmart<CJSValue> y);
JSSmart<CJSValue> DrawHeaderEdit(JSSmart<CJSValue> yPos, JSSmart<CJSValue> lock_type, JSSmart<CJSValue> sectionNum, JSSmart<CJSValue> bIsRepeat, JSSmart<CJSValue> type);
JSSmart<CJSValue> DrawFooterEdit(JSSmart<CJSValue> yPos, JSSmart<CJSValue> lock_type, JSSmart<CJSValue> sectionNum, JSSmart<CJSValue> bIsRepeat, JSSmart<CJSValue> type);
JSSmart<CJSValue> DrawLockParagraph (JSSmart<CJSValue> x, JSSmart<CJSValue> y1, JSSmart<CJSValue> y2);
JSSmart<CJSValue> DrawLockObjectRect(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> DrawEmptyTableLine(JSSmart<CJSValue> x1, JSSmart<CJSValue> y1, JSSmart<CJSValue> x2, JSSmart<CJSValue> y2);
JSSmart<CJSValue> DrawSpellingLine (JSSmart<CJSValue> y0, JSSmart<CJSValue> x0, JSSmart<CJSValue> x1, JSSmart<CJSValue> w);
// smart methods for horizontal / vertical lines
JSSmart<CJSValue> drawHorLine (JSSmart<CJSValue> align, JSSmart<CJSValue> y, JSSmart<CJSValue> x, JSSmart<CJSValue> r, JSSmart<CJSValue> penW);
JSSmart<CJSValue> drawHorLine2(JSSmart<CJSValue> align, JSSmart<CJSValue> y, JSSmart<CJSValue> x, JSSmart<CJSValue> r, JSSmart<CJSValue> penW);
JSSmart<CJSValue> drawVerLine (JSSmart<CJSValue> align, JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> b, JSSmart<CJSValue> penW);
// мега крутые функции для таблиц
JSSmart<CJSValue> drawHorLineExt(JSSmart<CJSValue> align, JSSmart<CJSValue> y, JSSmart<CJSValue> x, JSSmart<CJSValue> r, JSSmart<CJSValue> penW, JSSmart<CJSValue> leftMW, JSSmart<CJSValue> rightMW);
JSSmart<CJSValue> rect (JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> TableRect(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
// функции клиппирования
JSSmart<CJSValue> AddClipRect(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> RemoveClipRect();
JSSmart<CJSValue> SetClip(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> RemoveClip();
JSSmart<CJSValue> drawMailMergeField(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> drawSearchResult (JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> drawFlowAnchor (JSSmart<CJSValue> x, JSSmart<CJSValue> y);
JSSmart<CJSValue> SavePen();
JSSmart<CJSValue> RestorePen();
JSSmart<CJSValue> SaveBrush();
JSSmart<CJSValue> RestoreBrush();
JSSmart<CJSValue> SavePenBrush();
JSSmart<CJSValue> RestorePenBrush();
JSSmart<CJSValue> SaveGrState();
JSSmart<CJSValue> RestoreGrState();
JSSmart<CJSValue> StartClipPath();
JSSmart<CJSValue> EndClipPath();
JSSmart<CJSValue> StartCheckTableDraw();
JSSmart<CJSValue> SetTextClipRect(JSSmart<CJSValue> _l, JSSmart<CJSValue> _t, JSSmart<CJSValue> _r, JSSmart<CJSValue> _b);
JSSmart<CJSValue> AddSmartRect (JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h, JSSmart<CJSValue> pen_w);
JSSmart<CJSValue> CheckUseFonts2 (JSSmart<CJSValue> _transform);
JSSmart<CJSValue> UncheckUseFonts2();
JSSmart<CJSValue> Drawing_StartCheckBounds(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> Drawing_EndCheckBounds();
JSSmart<CJSValue> DrawPresentationComment(JSSmart<CJSValue> type, JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> DrawPolygon(JSSmart<CJSValue> oPath, JSSmart<CJSValue> lineWidth, JSSmart<CJSValue> shift);
JSSmart<CJSValue> DrawFootnoteRect(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
// new methods
JSSmart<CJSValue> toDataURL(JSSmart<CJSValue> type);
JSSmart<CJSValue> GetPenColor();
JSSmart<CJSValue> GetBrushColor();
JSSmart<CJSValue> put_brushTexture(JSSmart<CJSValue> src, JSSmart<CJSValue> type);
JSSmart<CJSValue> put_brushTextureMode(JSSmart<CJSValue> mode);
JSSmart<CJSValue> put_BrushTextureAlpha(JSSmart<CJSValue> a);
JSSmart<CJSValue> put_BrushGradient(JSSmart<CJSValue> colors, JSSmart<CJSValue> n, JSSmart<CJSValue> x0, JSSmart<CJSValue> y0, JSSmart<CJSValue> x1, JSSmart<CJSValue> y1, JSSmart<CJSValue> r0, JSSmart<CJSValue> r1);
JSSmart<CJSValue> TransformPointX(JSSmart<CJSValue> x, JSSmart<CJSValue> y);
JSSmart<CJSValue> TransformPointY(JSSmart<CJSValue> x, JSSmart<CJSValue> y);
JSSmart<CJSValue> put_LineJoin(JSSmart<CJSValue> join);
JSSmart<CJSValue> get_LineJoin();
JSSmart<CJSValue> put_TextureBounds(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> GetlineWidth();
JSSmart<CJSValue> DrawPath(JSSmart<CJSValue> path);
JSSmart<CJSValue> CoordTransformOffset(JSSmart<CJSValue> tx, JSSmart<CJSValue> ty);
JSSmart<CJSValue> GetTransform();
static void CreateObjectInContext(const std::string& name, JSSmart<CJSContext> context);
static void CreateObjectInContext(const std::string& name, JSSmart<CJSContext> context);
};
#endif // _BUILD_NATIVE_GRAPHICS_EMBED_H_

View File

@ -0,0 +1,20 @@
#include "HashEmbed.h"
JSSmart<CJSValue> CHashEmbed::hash(JSSmart<CJSValue> data, JSSmart<CJSValue> size, JSSmart<CJSValue> alg)
{
std::string _data = data->toStringA();
int _size = size->toInt32();
int _alg = alg->toInt32();
unsigned char* pData = m_pHash->hash(reinterpret_cast<const unsigned char*>(_data.c_str()), _size, _alg);
return CJSContext::createUint8Array(pData, CHash::getDigestLength(static_cast<CHash::HashAlgs>(_alg)), false);
}
JSSmart<CJSValue> CHashEmbed::hash2(JSSmart<CJSValue> password, JSSmart<CJSValue> salt, JSSmart<CJSValue> spinCount, JSSmart<CJSValue> alg)
{
std::string _password = password->toStringA();
std::string _salt = salt->toStringA();
int _spinCount = spinCount->toInt32();
int _alg = alg->toInt32();
unsigned char* pData = m_pHash->hash2(reinterpret_cast<const char*>(_password.c_str()), reinterpret_cast<const char*>(_salt.c_str()), _spinCount, _alg);
return CJSContext::createUint8Array(pData, CHash::getDigestLength(static_cast<CHash::HashAlgs>(_alg)), false);
}

View File

@ -0,0 +1,31 @@
#ifndef _BUILD_NATIVE_HASH_EMBED_H_
#define _BUILD_NATIVE_HASH_EMBED_H_
#include "../js_internal/js_base.h"
#include "../hash.h"
using namespace NSJSBase;
class CHashEmbed : public CJSEmbedObject
{
public:
CHash* m_pHash;
CHashEmbed() : m_pHash(new CHash(NSJSBase::NSAllocator::Alloc))
{
}
~CHashEmbed()
{
RELEASEOBJECT(m_pHash);
}
virtual void* getObject() override { return (void*)m_pHash; }
JSSmart<CJSValue> hash(JSSmart<CJSValue> data, JSSmart<CJSValue> size, JSSmart<CJSValue> alg);
JSSmart<CJSValue> hash2(JSSmart<CJSValue> password, JSSmart<CJSValue> salt, JSSmart<CJSValue> spinCount, JSSmart<CJSValue> alg);
public:
static void CreateObjectInContext(const std::string& name, JSSmart<CJSContext> context);
};
#endif // _BUILD_NATIVE_HASH_EMBED_H_

View File

@ -2,65 +2,65 @@
JSSmart<CJSValue> CMemoryStreamEmbed::Copy(JSSmart<CJSValue> stream, JSSmart<CJSValue> pos, JSSmart<CJSValue> len)
{
JSSmart<CJSObject> _obj = stream->toObject();
NSMemoryStream::CMemoryStream* pStream = (NSMemoryStream::CMemoryStream*)(_obj->getNative());
m_pInternal->Copy(pStream, pos->toInt32(), len->toInt32());
return NULL;
JSSmart<CJSObject> _obj = stream->toObject();
NSMemoryStream::CMemoryStream* pStream = (NSMemoryStream::CMemoryStream*)(_obj->getNative());
m_pInternal->Copy(pStream, pos->toInt32(), len->toInt32());
return NULL;
}
JSSmart<CJSValue> CMemoryStreamEmbed::ClearNoAttack()
{
m_pInternal->ClearNoAttack();
return NULL;
m_pInternal->ClearNoAttack();
return NULL;
}
JSSmart<CJSValue> CMemoryStreamEmbed::WriteByte(JSSmart<CJSValue> value)
{
m_pInternal->WriteBYTE((BYTE)value->toInt32());
return NULL;
m_pInternal->WriteBYTE((BYTE)value->toInt32());
return NULL;
}
JSSmart<CJSValue> CMemoryStreamEmbed::WriteBool(JSSmart<CJSValue> value)
{
m_pInternal->WriteBYTE(value->toBool() ? 1 : 0);
return NULL;
m_pInternal->WriteBYTE(value->toBool() ? 1 : 0);
return NULL;
}
JSSmart<CJSValue> CMemoryStreamEmbed::WriteLong(JSSmart<CJSValue> value)
{
m_pInternal->WriteLONG((LONG)value->toInt32());
return NULL;
m_pInternal->WriteLONG((LONG)value->toInt32());
return NULL;
}
JSSmart<CJSValue> CMemoryStreamEmbed::WriteDouble(JSSmart<CJSValue> value)
{
m_pInternal->WriteLONG((LONG)(value->toDouble() * 100000));
return NULL;
m_pInternal->WriteLONG((LONG)(value->toDouble() * 100000));
return NULL;
}
JSSmart<CJSValue> CMemoryStreamEmbed::WriteDouble2(JSSmart<CJSValue> value)
{
m_pInternal->WriteDouble(value->toDouble());
return NULL;
m_pInternal->WriteDouble(value->toDouble());
return NULL;
}
JSSmart<CJSValue> CMemoryStreamEmbed::WriteStringA(JSSmart<CJSValue> value)
{
std::string param = value->toStringA();
m_pInternal->WriteStringA2(param.c_str(), (int)param.length());
return NULL;
std::string param = value->toStringA();
m_pInternal->WriteStringA2(param.c_str(), (int)param.length());
return NULL;
}
JSSmart<CJSValue> CMemoryStreamEmbed::WriteString(JSSmart<CJSValue> value)
{
std::wstring param = value->toStringW();
m_pInternal->WriteString(param.c_str(), (int)param.length());
return NULL;
std::wstring param = value->toStringW();
m_pInternal->WriteString(param.c_str(), (int)param.length());
return NULL;
}
JSSmart<CJSValue> CMemoryStreamEmbed::WriteString2(JSSmart<CJSValue> value)
{
std::wstring param = value->toStringW();
m_pInternal->WriteString2(param.c_str(), (int)param.length());
return NULL;
std::wstring param = value->toStringW();
m_pInternal->WriteString2(param.c_str(), (int)param.length());
return NULL;
}

View File

@ -8,28 +8,28 @@ using namespace NSJSBase;
class CMemoryStreamEmbed : public CJSEmbedObject
{
public:
NSMemoryStream::CMemoryStream* m_pInternal;
NSMemoryStream::CMemoryStream* m_pInternal;
public:
CMemoryStreamEmbed() : m_pInternal(new NSMemoryStream::CMemoryStream()) {}
~CMemoryStreamEmbed() { RELEASEOBJECT(m_pInternal); }
CMemoryStreamEmbed() : m_pInternal(new NSMemoryStream::CMemoryStream()) {}
~CMemoryStreamEmbed() { RELEASEOBJECT(m_pInternal); }
virtual void* getObject() override { return (void*)m_pInternal; }
virtual void* getObject() override { return (void*)m_pInternal; }
public:
JSSmart<CJSValue> Copy(JSSmart<CJSValue> stream, JSSmart<CJSValue> pos, JSSmart<CJSValue> len);
JSSmart<CJSValue> ClearNoAttack();
JSSmart<CJSValue> Copy(JSSmart<CJSValue> stream, JSSmart<CJSValue> pos, JSSmart<CJSValue> len);
JSSmart<CJSValue> ClearNoAttack();
JSSmart<CJSValue> WriteByte(JSSmart<CJSValue> value);
JSSmart<CJSValue> WriteBool(JSSmart<CJSValue> value);
JSSmart<CJSValue> WriteLong(JSSmart<CJSValue> value);
JSSmart<CJSValue> WriteDouble(JSSmart<CJSValue> value);
JSSmart<CJSValue> WriteDouble2(JSSmart<CJSValue> value);
JSSmart<CJSValue> WriteStringA(JSSmart<CJSValue> value);
JSSmart<CJSValue> WriteString(JSSmart<CJSValue> value);
JSSmart<CJSValue> WriteString2(JSSmart<CJSValue> value);
JSSmart<CJSValue> WriteByte(JSSmart<CJSValue> value);
JSSmart<CJSValue> WriteBool(JSSmart<CJSValue> value);
JSSmart<CJSValue> WriteLong(JSSmart<CJSValue> value);
JSSmart<CJSValue> WriteDouble(JSSmart<CJSValue> value);
JSSmart<CJSValue> WriteDouble2(JSSmart<CJSValue> value);
JSSmart<CJSValue> WriteStringA(JSSmart<CJSValue> value);
JSSmart<CJSValue> WriteString(JSSmart<CJSValue> value);
JSSmart<CJSValue> WriteString2(JSSmart<CJSValue> value);
static void CreateObjectInContext(const std::string& name, JSSmart<CJSContext> context);
static void CreateObjectInContext(const std::string& name, JSSmart<CJSContext> context);
};
#endif // _BUILD_NATIVE_MEMORYSTREAM_EMBED_H_

View File

@ -5,115 +5,115 @@
JSSmart<CJSValue> CBuilderEmbed::builder_OpenFile(JSSmart<CJSValue> sPath, JSSmart<CJSValue> 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);
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<CJSValue> CBuilderEmbed::builder_CreateFile(JSSmart<CJSValue> type)
{
int nFormat = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX;
if (type->isString())
nFormat = NSDoctRenderer::GetFormatByTexExtention(type->toStringW());
else
nFormat = type->toInt32();
int nFormat = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX;
if (type->isString())
nFormat = NSDoctRenderer::GetFormatByTexExtention(type->toStringW());
else
nFormat = type->toInt32();
bool ret = m_pBuilder->CreateFile(nFormat);
return CJSContext::createBool(ret);
bool ret = m_pBuilder->CreateFile(nFormat);
return CJSContext::createBool(ret);
}
JSSmart<CJSValue> CBuilderEmbed::builder_SetTmpFolder(JSSmart<CJSValue> path)
{
std::wstring sPath = path->toStringW();
m_pBuilder->SetTmpFolder(sPath.c_str());
return NULL;
std::wstring sPath = path->toStringW();
m_pBuilder->SetTmpFolder(sPath.c_str());
return NULL;
}
JSSmart<CJSValue> CBuilderEmbed::builder_SaveFile(JSSmart<CJSValue> type, JSSmart<CJSValue> path, JSSmart<CJSValue> params)
{
int nFormat = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX;
if (type->isString())
nFormat = NSDoctRenderer::GetFormatByTexExtention(type->toStringW());
else
nFormat = type->toInt32();
int nFormat = AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX;
if (type->isString())
nFormat = NSDoctRenderer::GetFormatByTexExtention(type->toStringW());
else
nFormat = type->toInt32();
std::wstring sPath = path->toStringW();
std::wstring sParams = params->toStringW();
int ret = m_pBuilder->SaveFile(nFormat, sPath.c_str(), sParams.empty() ? NULL : sParams.c_str());
return CJSContext::createInt(ret);
std::wstring sPath = path->toStringW();
std::wstring sParams = params->toStringW();
int ret = m_pBuilder->SaveFile(nFormat, sPath.c_str(), sParams.empty() ? NULL : sParams.c_str());
return CJSContext::createInt(ret);
}
JSSmart<CJSValue> CBuilderEmbed::builder_CloseFile()
{
m_pBuilder->CloseFile();
return NULL;
m_pBuilder->CloseFile();
return NULL;
}
JSSmart<CJSValue> CBuilderDocumentEmbed::builder_doc_IsValid()
{
return CJSContext::createBool(m_bIsValid);
return CJSContext::createBool(m_bIsValid);
}
JSSmart<CJSValue> CBuilderDocumentEmbed::builder_doc_GetBinary()
{
return CJSContext::createUint8Array(m_sFolder + L"/Editor.bin");
return CJSContext::createUint8Array(m_sFolder + L"/Editor.bin");
}
JSSmart<CJSValue> CBuilderDocumentEmbed::builder_doc_GetFolder()
{
return CJSContext::createString(m_sFolder);
return CJSContext::createString(m_sFolder);
}
JSSmart<CJSValue> CBuilderDocumentEmbed::builder_doc_CloseFile()
{
CloseFile();
return NULL;
CloseFile();
return NULL;
}
JSSmart<CJSValue> CBuilderDocumentEmbed::builder_doc_GetImageMap()
{
std::vector<std::wstring> files = NSDirectory::GetFiles(m_sFolder + L"/media");
std::vector<std::wstring> files = NSDirectory::GetFiles(m_sFolder + L"/media");
JSSmart<CJSObject> obj = CJSContext::createObject();
for (std::vector<std::wstring>::iterator i = files.begin(); i != files.end(); i++)
{
std::wstring sFile = *i;
NSStringUtils::string_replace(sFile, L"\\", L"/");
std::wstring sName = L"media/" + NSFile::GetFileName(sFile);
JSSmart<CJSObject> obj = CJSContext::createObject();
for (std::vector<std::wstring>::iterator i = files.begin(); i != files.end(); i++)
{
std::wstring sFile = *i;
NSStringUtils::string_replace(sFile, L"\\", L"/");
std::wstring sName = L"media/" + NSFile::GetFileName(sFile);
obj->set(U_TO_UTF8(sName).c_str(), CJSContext::createString(sFile));
}
obj->set(U_TO_UTF8(sName).c_str(), CJSContext::createString(sFile));
}
return obj->toValue();
return obj->toValue();
}
void CBuilderDocumentEmbed::OpenFile(const std::wstring& sFile, const std::wstring& sParams)
{
NSDoctRenderer::CDocBuilder_Private* pBuilder = GetPrivate(m_pBuilder);
NSDoctRenderer::CDocBuilder_Private* pBuilder = GetPrivate(m_pBuilder);
std::wstring sTmpDir = pBuilder->m_sTmpFolder;
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);
m_sFolder = NSFile::CFileBinary::CreateTempFileWithUniqueName(sTmpDir, L"DE_");
if (NSFile::CFileBinary::Exists(m_sFolder))
NSFile::CFileBinary::Remove(m_sFolder);
NSStringUtils::string_replace(m_sFolder, L"\\", L"/");
NSStringUtils::string_replace(m_sFolder, L"\\", L"/");
std::wstring::size_type nPosPoint = m_sFolder.rfind('.');
if (nPosPoint != std::wstring::npos && nPosPoint > sTmpDir.length())
{
m_sFolder = m_sFolder.substr(0, nPosPoint);
}
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);
NSDirectory::CreateDirectory(m_sFolder);
std::wstring sExtCopy = pBuilder->GetFileCopyExt(sFile);
std::wstring sFileCopy = m_sFolder + L"/origin." + sExtCopy;
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);
pBuilder->MoveFileOpen(sFile, sFileCopy);
int nConvertResult = pBuilder->ConvertToInternalFormat(m_sFolder, sFileCopy, sParams);
if (0 == nConvertResult)
m_bIsValid = true;
if (0 == nConvertResult)
m_bIsValid = true;
}
void CBuilderDocumentEmbed::CloseFile()
{
if (!m_sFolder.empty())
NSDirectory::DeleteDirectory(m_sFolder);
m_bIsValid = false;
m_sFolder = L"";
if (!m_sFolder.empty())
NSDirectory::DeleteDirectory(m_sFolder);
m_bIsValid = false;
m_sFolder = L"";
}

View File

@ -39,46 +39,46 @@ using namespace NSJSBase;
class CBuilderEmbed : public CJSEmbedObject
{
public:
NSDoctRenderer::CDocBuilder* m_pBuilder;
NSDoctRenderer::CDocBuilder* m_pBuilder;
CBuilderEmbed() : m_pBuilder(NULL) {}
~CBuilderEmbed() { if(m_pBuilder) RELEASEOBJECT(m_pBuilder); }
CBuilderEmbed() : m_pBuilder(NULL) {}
~CBuilderEmbed() { if(m_pBuilder) RELEASEOBJECT(m_pBuilder); }
virtual void* getObject() { return (void*)m_pBuilder; }
virtual void* getObject() { return (void*)m_pBuilder; }
public:
JSSmart<CJSValue> builder_OpenFile(JSSmart<CJSValue> sPath, JSSmart<CJSValue> sParams);
JSSmart<CJSValue> builder_CreateFile(JSSmart<CJSValue> type);
JSSmart<CJSValue> builder_SetTmpFolder(JSSmart<CJSValue> path);
JSSmart<CJSValue> builder_SaveFile(JSSmart<CJSValue> type, JSSmart<CJSValue> path, JSSmart<CJSValue> params);
JSSmart<CJSValue> builder_CloseFile();
JSSmart<CJSValue> builder_OpenTmpFile(JSSmart<CJSValue> path, JSSmart<CJSValue> params);
JSSmart<CJSValue> builder_OpenFile(JSSmart<CJSValue> sPath, JSSmart<CJSValue> sParams);
JSSmart<CJSValue> builder_CreateFile(JSSmart<CJSValue> type);
JSSmart<CJSValue> builder_SetTmpFolder(JSSmart<CJSValue> path);
JSSmart<CJSValue> builder_SaveFile(JSSmart<CJSValue> type, JSSmart<CJSValue> path, JSSmart<CJSValue> params);
JSSmart<CJSValue> builder_CloseFile();
JSSmart<CJSValue> builder_OpenTmpFile(JSSmart<CJSValue> path, JSSmart<CJSValue> params);
};
class CBuilderDocumentEmbed : public CJSEmbedObject
{
public:
NSDoctRenderer::CDocBuilder* m_pBuilder;
bool m_bIsValid;
std::wstring m_sFolder;
NSDoctRenderer::CDocBuilder* m_pBuilder;
bool m_bIsValid;
std::wstring m_sFolder;
public:
CBuilderDocumentEmbed() : m_pBuilder(NULL), m_bIsValid(false) {}
~CBuilderDocumentEmbed() { if(m_pBuilder) RELEASEOBJECT(m_pBuilder); }
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(); }
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();
void OpenFile(const std::wstring& sFile, const std::wstring& sParams);
void CloseFile();
public:
JSSmart<CJSValue> builder_doc_IsValid();
JSSmart<CJSValue> builder_doc_GetBinary();
JSSmart<CJSValue> builder_doc_GetFolder();
JSSmart<CJSValue> builder_doc_CloseFile();
JSSmart<CJSValue> builder_doc_GetImageMap();
JSSmart<CJSValue> builder_doc_IsValid();
JSSmart<CJSValue> builder_doc_GetBinary();
JSSmart<CJSValue> builder_doc_GetFolder();
JSSmart<CJSValue> builder_doc_CloseFile();
JSSmart<CJSValue> builder_doc_GetImageMap();
};
void builder_CreateNative(const std::string& name, JSSmart<CJSContext> context, NSDoctRenderer::CDocBuilder* builder);

View File

@ -2,217 +2,217 @@
JSSmart<CJSValue> CNativeControlEmbed::SetFilePath(JSSmart<CJSValue> path)
{
m_pInternal->SetFilePath(path->toStringW());
return NULL;
m_pInternal->SetFilePath(path->toStringW());
return NULL;
}
JSSmart<CJSValue> CNativeControlEmbed::GetFilePath()
{
return CJSContext::createString(m_pInternal->GetFilePath());
return CJSContext::createString(m_pInternal->GetFilePath());
}
JSSmart<CJSValue> CNativeControlEmbed::SetFileId(JSSmart<CJSValue> fileId)
{
m_pInternal->SetFileId(fileId->toStringW());
return NULL;
m_pInternal->SetFileId(fileId->toStringW());
return NULL;
}
JSSmart<CJSValue> CNativeControlEmbed::GetFileId()
{
return CJSContext::createString(m_pInternal->GetFileId());
return CJSContext::createString(m_pInternal->GetFileId());
}
JSSmart<CJSValue> CNativeControlEmbed::GetFileBinary(JSSmart<CJSValue> file)
{
return CJSContext::createUint8Array(file->toStringW());
return CJSContext::createUint8Array(file->toStringW());
}
JSSmart<CJSValue> CNativeControlEmbed::GetFontBinary(JSSmart<CJSValue> file)
{
// TODO:
// по идее файлы могут совпадать по имени, но лежать в разных директориях.
// и поэтому в AllFonts.js надо бы писать пути полные.
// пока оставим поддержку старой версии тоже
std::wstring sFile = file->toStringW();
bool bIsFullFilePath = (std::wstring::npos != sFile.find('\\') || std::wstring::npos != sFile.find('/'));
if (bIsFullFilePath)
{
bIsFullFilePath = NSFile::CFileBinary::Exists(sFile);
}
// TODO:
// по идее файлы могут совпадать по имени, но лежать в разных директориях.
// и поэтому в AllFonts.js надо бы писать пути полные.
// пока оставим поддержку старой версии тоже
std::wstring sFile = file->toStringW();
bool bIsFullFilePath = (std::wstring::npos != sFile.find('\\') || std::wstring::npos != sFile.find('/'));
if (bIsFullFilePath)
{
bIsFullFilePath = NSFile::CFileBinary::Exists(sFile);
}
if (!bIsFullFilePath)
{
std::map<std::wstring, std::wstring>::iterator pair = m_pInternal->m_map_fonts.find(sFile);
if (pair != m_pInternal->m_map_fonts.end())
sFile = pair->second;
else
sFile = m_pInternal->m_sDefaultFont;
}
if (!bIsFullFilePath)
{
std::map<std::wstring, std::wstring>::iterator pair = m_pInternal->m_map_fonts.find(sFile);
if (pair != m_pInternal->m_map_fonts.end())
sFile = pair->second;
else
sFile = m_pInternal->m_sDefaultFont;
}
return CJSContext::createUint8Array(sFile);
return CJSContext::createUint8Array(sFile);
}
JSSmart<CJSValue> CNativeControlEmbed::GetFontsDirectory()
{
return CJSContext::createString(m_pInternal->m_strFontsDirectory);
return CJSContext::createString(m_pInternal->m_strFontsDirectory);
}
JSSmart<CJSValue> CNativeControlEmbed::GetFileString(JSSmart<CJSValue> file)
{
return CJSContext::createUint8Array(file->toStringW());
return CJSContext::createUint8Array(file->toStringW());
}
JSSmart<CJSValue> CNativeControlEmbed::GetEditorType()
{
return CJSContext::createString(m_pInternal->m_strEditorType);
return CJSContext::createString(m_pInternal->m_strEditorType);
}
JSSmart<CJSValue> 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);
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<CJSValue> CNativeControlEmbed::GetCountChanges()
{
int nCount = 0;
if (m_pInternal->m_pChanges != NULL)
{
nCount = (int)m_pInternal->m_pChanges->size();
}
int nCount = 0;
if (m_pInternal->m_pChanges != NULL)
{
nCount = (int)m_pInternal->m_pChanges->size();
}
return CJSContext::createInt(nCount);
return CJSContext::createInt(nCount);
}
JSSmart<CJSValue> CNativeControlEmbed::GetChangesFile(JSSmart<CJSValue> 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);
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<CJSValue> CNativeControlEmbed::Save_AllocNative(JSSmart<CJSValue> nLen)
{
int Len = nLen->toInt32();
m_pInternal->Save_Alloc(Len);
return CJSContext::createUint8Array(m_pInternal->m_pSaveBinary, m_pInternal->m_nSaveLen, true);
int Len = nLen->toInt32();
m_pInternal->Save_Alloc(Len);
return CJSContext::createUint8Array(m_pInternal->m_pSaveBinary, m_pInternal->m_nSaveLen, true);
}
JSSmart<CJSValue> CNativeControlEmbed::Save_ReAllocNative(JSSmart<CJSValue> pos, JSSmart<CJSValue> 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, true);
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, true);
}
JSSmart<CJSValue> CNativeControlEmbed::Save_End(JSSmart<CJSValue> pos, JSSmart<CJSValue> len)
{
std::string sHeader = pos->toStringA();
int _len = len->toInt32();
m_pInternal->Save_End(sHeader, _len);
return NULL;
std::string sHeader = pos->toStringA();
int _len = len->toInt32();
m_pInternal->Save_End(sHeader, _len);
return NULL;
}
JSSmart<CJSValue> CNativeControlEmbed::AddImageInChanges(JSSmart<CJSValue> img)
{
std::wstring sImage = img->toStringW();
if (sImage.empty())
return NULL;
std::wstring sImage = img->toStringW();
if (sImage.empty())
return NULL;
std::map<std::wstring, bool>::const_iterator iter = m_pInternal->m_mapImagesInChanges.find(sImage);
if (iter == m_pInternal->m_mapImagesInChanges.end())
m_pInternal->m_mapImagesInChanges.insert(std::pair<std::wstring, bool>(sImage, true));
return NULL;
std::map<std::wstring, bool>::const_iterator iter = m_pInternal->m_mapImagesInChanges.find(sImage);
if (iter == m_pInternal->m_mapImagesInChanges.end())
m_pInternal->m_mapImagesInChanges.insert(std::pair<std::wstring, bool>(sImage, true));
return NULL;
}
JSSmart<CJSValue> CNativeControlEmbed::ConsoleLog(JSSmart<CJSValue> message)
{
m_pInternal->ConsoleLog(message->toStringA());
return NULL;
m_pInternal->ConsoleLog(message->toStringA());
return NULL;
}
JSSmart<CJSValue> CNativeControlEmbed::SaveChanges(JSSmart<CJSValue> sParam, JSSmart<CJSValue> nDeleteIndex, JSSmart<CJSValue> nCount)
{
m_pInternal->DumpChanges(sParam->toStringA(), nDeleteIndex->toInt32(), nCount->toInt32());
return NULL;
m_pInternal->DumpChanges(sParam->toStringA(), nDeleteIndex->toInt32(), nCount->toInt32());
return NULL;
}
JSSmart<CJSValue> CNativeControlEmbed::zipOpenFile(JSSmart<CJSValue> name)
{
bool bIsOpen = m_pInternal->m_oZipWorker.Open(name->toStringW());
if (!bIsOpen)
return CJSContext::createNull();
bool bIsOpen = m_pInternal->m_oZipWorker.Open(name->toStringW());
if (!bIsOpen)
return CJSContext::createNull();
JSSmart<CJSObject> obj = CJSContext::createObject();
for (std::vector<std::wstring>::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));
}
JSSmart<CJSObject> obj = CJSContext::createObject();
for (std::vector<std::wstring>::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();
return obj->toValue();
}
JSSmart<CJSValue> CNativeControlEmbed::zipOpenFileBase64(JSSmart<CJSValue> name)
{
bool bIsOpen = m_pInternal->m_oZipWorker.OpenBase64(name->toStringA());
if (!bIsOpen)
return CJSContext::createNull();
bool bIsOpen = m_pInternal->m_oZipWorker.OpenBase64(name->toStringA());
if (!bIsOpen)
return CJSContext::createNull();
JSSmart<CJSObject> obj = CJSContext::createObject();
for (std::vector<std::wstring>::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));
}
JSSmart<CJSObject> obj = CJSContext::createObject();
for (std::vector<std::wstring>::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();
return obj->toValue();
}
JSSmart<CJSValue> CNativeControlEmbed::zipGetFileAsString(JSSmart<CJSValue> name)
{
BYTE* pData = NULL;
DWORD len = 0;
m_pInternal->m_oZipWorker.GetFileData(name->toStringW(), pData, len);
return CJSContext::createString((char*)pData, len);
BYTE* pData = NULL;
DWORD len = 0;
m_pInternal->m_oZipWorker.GetFileData(name->toStringW(), pData, len);
return CJSContext::createString((char*)pData, len);
}
JSSmart<CJSValue> CNativeControlEmbed::zipGetFileAsBinary(JSSmart<CJSValue> name)
{
return CJSContext::createUint8Array(m_pInternal->m_oZipWorker.m_sTmpFolder + L"/" + name->toStringW());
return CJSContext::createUint8Array(m_pInternal->m_oZipWorker.m_sTmpFolder + L"/" + name->toStringW());
}
JSSmart<CJSValue> CNativeControlEmbed::zipCloseFile()
{
m_pInternal->m_oZipWorker.Close();
return NULL;
m_pInternal->m_oZipWorker.Close();
return NULL;
}
JSSmart<CJSValue> CNativeControlEmbed::GetImageUrl(JSSmart<CJSValue> sUrl)
{
std::wstring Url = sUrl->toStringW();
std::wstring Url = sUrl->toStringW();
if (!m_pInternal->m_pWorker)
m_pInternal->m_pWorker = new CImagesWorker(m_pInternal->m_strImagesDirectory);
if (!m_pInternal->m_pWorker)
m_pInternal->m_pWorker = new CImagesWorker(m_pInternal->m_strImagesDirectory);
std::wstring sRet = m_pInternal->m_pWorker->GetImage(Url);
std::wstring sRet = m_pInternal->m_pWorker->GetImage(Url);
return CJSContext::createString(sRet);
return CJSContext::createString(sRet);
}
JSSmart<CJSValue> CNativeControlEmbed::GetImagesPath()
{
return CJSContext::createString(m_pInternal->m_strImagesDirectory);
return CJSContext::createString(m_pInternal->m_strImagesDirectory);
}
#include "./../../graphics/MetafileToRenderer.h"

View File

@ -8,45 +8,45 @@ using namespace NSJSBase;
class CNativeControlEmbed : public CJSEmbedObject
{
public:
NSNativeControl::CNativeControl* m_pInternal;
CZipWorker m_oZipWorker;
NSNativeControl::CNativeControl* m_pInternal;
CZipWorker m_oZipWorker;
public:
CNativeControlEmbed() : m_pInternal(new NSNativeControl::CNativeControl()) {}
~CNativeControlEmbed() { RELEASEOBJECT(m_pInternal); }
CNativeControlEmbed() : m_pInternal(new NSNativeControl::CNativeControl()) {}
~CNativeControlEmbed() { RELEASEOBJECT(m_pInternal); }
virtual void* getObject() override { return (void*)m_pInternal; }
virtual void* getObject() override { return (void*)m_pInternal; }
public:
JSSmart<CJSValue> SetFilePath(JSSmart<CJSValue> path);
JSSmart<CJSValue> GetFilePath();
JSSmart<CJSValue> SetFileId(JSSmart<CJSValue> fileId);
JSSmart<CJSValue> GetFileId();
JSSmart<CJSValue> GetFileBinary(JSSmart<CJSValue> file);
JSSmart<CJSValue> GetFontBinary(JSSmart<CJSValue> file);
JSSmart<CJSValue> GetFontsDirectory();
JSSmart<CJSValue> GetFileString(JSSmart<CJSValue> file);
JSSmart<CJSValue> GetEditorType();
JSSmart<CJSValue> CheckNextChange();
JSSmart<CJSValue> GetCountChanges();
JSSmart<CJSValue> GetChangesFile(JSSmart<CJSValue> index);
JSSmart<CJSValue> Save_AllocNative(JSSmart<CJSValue> nLen);
JSSmart<CJSValue> Save_ReAllocNative(JSSmart<CJSValue> pos, JSSmart<CJSValue> len);
JSSmart<CJSValue> Save_End(JSSmart<CJSValue> pos, JSSmart<CJSValue> len);
JSSmart<CJSValue> AddImageInChanges(JSSmart<CJSValue> img);
JSSmart<CJSValue> ConsoleLog(JSSmart<CJSValue> message);
JSSmart<CJSValue> SaveChanges(JSSmart<CJSValue> sParam, JSSmart<CJSValue> nDeleteIndex, JSSmart<CJSValue> nCount);
JSSmart<CJSValue> zipOpenFile(JSSmart<CJSValue> name);
JSSmart<CJSValue> zipOpenFileBase64(JSSmart<CJSValue> name);
JSSmart<CJSValue> zipGetFileAsString(JSSmart<CJSValue> name);
JSSmart<CJSValue> zipGetFileAsBinary(JSSmart<CJSValue> name);
JSSmart<CJSValue> zipCloseFile();
JSSmart<CJSValue> GetImageUrl(JSSmart<CJSValue> sUrl);
JSSmart<CJSValue> GetImagesPath();
JSSmart<CJSValue> SetFilePath(JSSmart<CJSValue> path);
JSSmart<CJSValue> GetFilePath();
JSSmart<CJSValue> SetFileId(JSSmart<CJSValue> fileId);
JSSmart<CJSValue> GetFileId();
JSSmart<CJSValue> GetFileBinary(JSSmart<CJSValue> file);
JSSmart<CJSValue> GetFontBinary(JSSmart<CJSValue> file);
JSSmart<CJSValue> GetFontsDirectory();
JSSmart<CJSValue> GetFileString(JSSmart<CJSValue> file);
JSSmart<CJSValue> GetEditorType();
JSSmart<CJSValue> CheckNextChange();
JSSmart<CJSValue> GetCountChanges();
JSSmart<CJSValue> GetChangesFile(JSSmart<CJSValue> index);
JSSmart<CJSValue> Save_AllocNative(JSSmart<CJSValue> nLen);
JSSmart<CJSValue> Save_ReAllocNative(JSSmart<CJSValue> pos, JSSmart<CJSValue> len);
JSSmart<CJSValue> Save_End(JSSmart<CJSValue> pos, JSSmart<CJSValue> len);
JSSmart<CJSValue> AddImageInChanges(JSSmart<CJSValue> img);
JSSmart<CJSValue> ConsoleLog(JSSmart<CJSValue> message);
JSSmart<CJSValue> SaveChanges(JSSmart<CJSValue> sParam, JSSmart<CJSValue> nDeleteIndex, JSSmart<CJSValue> nCount);
JSSmart<CJSValue> zipOpenFile(JSSmart<CJSValue> name);
JSSmart<CJSValue> zipOpenFileBase64(JSSmart<CJSValue> name);
JSSmart<CJSValue> zipGetFileAsString(JSSmart<CJSValue> name);
JSSmart<CJSValue> zipGetFileAsBinary(JSSmart<CJSValue> name);
JSSmart<CJSValue> zipCloseFile();
JSSmart<CJSValue> GetImageUrl(JSSmart<CJSValue> sUrl);
JSSmart<CJSValue> GetImagesPath();
JSSmart<CJSValue> GetImageOriginalSize(JSSmart<CJSValue> sUrl);
static void CreateObjectInContext(const std::string& name, JSSmart<CJSContext> context);
static void CreateObjectBuilderInContext(const std::string& name, JSSmart<CJSContext> context);
static void CreateObjectInContext(const std::string& name, JSSmart<CJSContext> context);
static void CreateObjectBuilderInContext(const std::string& name, JSSmart<CJSContext> context);
};
#endif // _BUILD_NATIVE_NATIVECONTROL_EMBED_H_

View File

@ -3,30 +3,30 @@
namespace NSPointerObjectDeleters
{
void EmptyDeleter(void* data)
{
// nothing
}
void FreeDeleter(void* data)
{
free(data);
}
void EmptyDeleter(void* data)
{
// nothing
}
void FreeDeleter(void* data)
{
free(data);
}
}
CPointerEmbedObject::CPointerEmbedObject(void* data, NSPointerObjectDeleters::PointerObjectDeleter deleter)
{
Data = data;
Deleter = deleter;
Data = data;
Deleter = deleter;
}
void CPointerEmbedObject::Free()
{
if (Data && Deleter)
Deleter(Data);
Data = nullptr;
if (Data && Deleter)
Deleter(Data);
Data = nullptr;
}
CPointerEmbedObject::~CPointerEmbedObject()
{
Free();
Free();
}

View File

@ -5,10 +5,10 @@
namespace NSPointerObjectDeleters
{
using PointerObjectDeleter = void (*)(void* data);
using PointerObjectDeleter = void (*)(void* data);
void EmptyDeleter(void* data);
void FreeDeleter(void* data);
void EmptyDeleter(void* data);
void FreeDeleter(void* data);
}
#define POINTER_DELETER(CLASS_NAME, NAME) void NAME(void* data) { CLASS_NAME* p = (CLASS_NAME*)data; delete data; }
@ -17,19 +17,19 @@ using namespace NSJSBase;
class CPointerEmbedObject : public CJSEmbedObject
{
public:
void* Data;
void* Data;
private:
NSPointerObjectDeleters::PointerObjectDeleter Deleter;
NSPointerObjectDeleters::PointerObjectDeleter Deleter;
public:
CPointerEmbedObject(void* data, NSPointerObjectDeleters::PointerObjectDeleter = nullptr);
void Free();
virtual ~CPointerEmbedObject();
CPointerEmbedObject(void* data, NSPointerObjectDeleters::PointerObjectDeleter = nullptr);
void Free();
virtual ~CPointerEmbedObject();
virtual void* getObject() { return Data; }
virtual void* getObject() { return Data; }
JSSmart<CJSValue> createObject();
JSSmart<CJSValue> createObject();
};
#endif // _BUILD_NATIVE_POINTER_EMBED_H_

View File

@ -12,182 +12,182 @@
class CExternalPointerJS : public NSShaper::CExternalPointer
{
public:
CExternalPointerJS() : NSShaper::CExternalPointer() {}
virtual ~CExternalPointerJS() {}
CExternalPointerJS() : NSShaper::CExternalPointer() {}
virtual ~CExternalPointerJS() {}
public:
virtual void Alloc(const unsigned int& len)
{
Len = len;
Data = NSAllocator::Alloc((size_t)Len);
}
virtual void Free()
{
if (Data)
NSAllocator::Free(Data, (size_t)Len);
}
virtual void Alloc(const unsigned int& len)
{
Len = len;
Data = NSAllocator::Alloc((size_t)Len);
}
virtual void Free()
{
if (Data)
NSAllocator::Free(Data, (size_t)Len);
}
};
JSSmart<CJSValue> CTextMeasurerEmbed::FT_Malloc(JSSmart<CJSValue> typed_array_or_len)
{
void* pData = NULL;
size_t len = 0;
void* pData = NULL;
size_t len = 0;
if (typed_array_or_len->isNumber())
{
len = (size_t)typed_array_or_len->toInt32();
if (0 != len)
pData = malloc((size_t)len);
}
else
{
JSSmart<CJSTypedArray> typedArray = typed_array_or_len->toTypedArray();
CJSDataBuffer pBuffer = typedArray->getData();
pData = malloc(pBuffer.Len);
memcpy(pData, pBuffer.Data, pBuffer.Len);
if (pBuffer.IsExternalize)
pBuffer.Free();
}
if (typed_array_or_len->isNumber())
{
len = (size_t)typed_array_or_len->toInt32();
if (0 != len)
pData = malloc((size_t)len);
}
else
{
JSSmart<CJSTypedArray> typedArray = typed_array_or_len->toTypedArray();
CJSDataBuffer pBuffer = typedArray->getData();
pData = malloc(pBuffer.Len);
memcpy(pData, pBuffer.Data, pBuffer.Len);
if (pBuffer.IsExternalize)
pBuffer.Free();
}
CPointerEmbedObject* pObject = new CPointerEmbedObject(pData, NSPointerObjectDeleters::FreeDeleter);
return pObject->createObject();
CPointerEmbedObject* pObject = new CPointerEmbedObject(pData, NSPointerObjectDeleters::FreeDeleter);
return pObject->createObject();
}
JSSmart<CJSValue> CTextMeasurerEmbed::FT_Free(JSSmart<CJSValue> pointer)
{
CPointerEmbedObject* pEmbed = (CPointerEmbedObject*)pointer->toObjectSmart()->getNative();
pEmbed->Free();
return CJSContext::createUndefined();
CPointerEmbedObject* pEmbed = (CPointerEmbedObject*)pointer->toObjectSmart()->getNative();
pEmbed->Free();
return CJSContext::createUndefined();
}
JSSmart<CJSValue> CTextMeasurerEmbed::FT_Init()
{
CPointerEmbedObject* pointer = new CPointerEmbedObject(NSShaper::FT_Library_Init(), [](void* data) { NSShaper::FT_Library_UnReference(data); });
return pointer->createObject();
CPointerEmbedObject* pointer = new CPointerEmbedObject(NSShaper::FT_Library_Init(), [](void* data) { NSShaper::FT_Library_UnReference(data); });
return pointer->createObject();
}
JSSmart<CJSValue> CTextMeasurerEmbed::FT_Set_TrueType_HintProp(JSSmart<CJSValue> library, JSSmart<CJSValue> tt_interpreter)
{
return CJSContext::createInt(NSShaper::FT_Set_TrueType_HintProp(RAW_POINTER(library), tt_interpreter->toUInt32()));
return CJSContext::createInt(NSShaper::FT_Set_TrueType_HintProp(RAW_POINTER(library), tt_interpreter->toUInt32()));
}
JSSmart<CJSValue> CTextMeasurerEmbed::FT_Open_Face(JSSmart<CJSValue> library, JSSmart<CJSValue> memory, JSSmart<CJSValue> size, JSSmart<CJSValue> face_index)
{
void* ftlibrary = RAW_POINTER(library);
void* face = NSShaper::FT_Open_Face(ftlibrary, (unsigned char*)RAW_POINTER(memory), size->toUInt32(), face_index->toInt32());
if (NULL != face)
NSShaper::FT_Library_Reference(ftlibrary);
CPointerEmbedObject* pointer = new CPointerEmbedObject(face, [](void* data) { NSShaper::FT_Done_Face_With_Library(data); });
return pointer->createObject();
void* ftlibrary = RAW_POINTER(library);
void* face = NSShaper::FT_Open_Face(ftlibrary, (unsigned char*)RAW_POINTER(memory), size->toUInt32(), face_index->toInt32());
if (NULL != face)
NSShaper::FT_Library_Reference(ftlibrary);
CPointerEmbedObject* pointer = new CPointerEmbedObject(face, [](void* data) { NSShaper::FT_Done_Face_With_Library(data); });
return pointer->createObject();
}
JSSmart<CJSValue> CTextMeasurerEmbed::FT_Open_Face2(JSSmart<CJSValue> library, JSSmart<CJSValue> array, JSSmart<CJSValue> face_index)
{
void* ftlibrary = RAW_POINTER(library);
JSSmart<CJSTypedArray> typedArray = array->toTypedArray();
CJSDataBuffer buffer = typedArray->getData();
void* face = NSShaper::FT_Open_Face(ftlibrary, (unsigned char*)buffer.Data, (unsigned int)buffer.Len, face_index->toInt32());
if (NULL != face)
NSShaper::FT_Library_Reference(ftlibrary);
CPointerEmbedObject* pointer = new CPointerEmbedObject(face, [](void* data) { NSShaper::FT_Done_Face_With_Library(data); });
return pointer->createObject();
void* ftlibrary = RAW_POINTER(library);
JSSmart<CJSTypedArray> typedArray = array->toTypedArray();
CJSDataBuffer buffer = typedArray->getData();
void* face = NSShaper::FT_Open_Face(ftlibrary, (unsigned char*)buffer.Data, (unsigned int)buffer.Len, face_index->toInt32());
if (NULL != face)
NSShaper::FT_Library_Reference(ftlibrary);
CPointerEmbedObject* pointer = new CPointerEmbedObject(face, [](void* data) { NSShaper::FT_Done_Face_With_Library(data); });
return pointer->createObject();
}
JSSmart<CJSValue> CTextMeasurerEmbed::FT_GetFaceInfo(JSSmart<CJSValue> face)
{
CExternalPointerJS result;
if (!NSShaper::FT_GetFaceInfo(RAW_POINTER(face), &result))
return CJSContext::createNull();
CExternalPointerJS result;
if (!NSShaper::FT_GetFaceInfo(RAW_POINTER(face), &result))
return CJSContext::createNull();
return CJSContext::createUint8Array(result.Data, result.Len, false);
return CJSContext::createUint8Array(result.Data, result.Len, false);
}
JSSmart<CJSValue> CTextMeasurerEmbed::FT_Load_Glyph(JSSmart<CJSValue> face, JSSmart<CJSValue> gid, JSSmart<CJSValue> mode)
{
return CJSContext::createInt(NSShaper::FT_Load_Glyph(RAW_POINTER(face), gid->toUInt32(), mode->toInt32()));
return CJSContext::createInt(NSShaper::FT_Load_Glyph(RAW_POINTER(face), gid->toUInt32(), mode->toInt32()));
}
JSSmart<CJSValue> CTextMeasurerEmbed::FT_Get_Glyph_Measure_Params(JSSmart<CJSValue> face, JSSmart<CJSValue> is_vector)
{
CExternalPointerJS result;
if (!NSShaper::FT_Get_Glyph_Measure_Params(RAW_POINTER(face), is_vector->toBool(), &result))
return CJSContext::createNull();
CExternalPointerJS result;
if (!NSShaper::FT_Get_Glyph_Measure_Params(RAW_POINTER(face), is_vector->toBool(), &result))
return CJSContext::createNull();
return CJSContext::createUint8Array(result.Data, result.Len, false);
return CJSContext::createUint8Array(result.Data, result.Len, false);
}
JSSmart<CJSValue> CTextMeasurerEmbed::FT_Get_Glyph_Render_Params(JSSmart<CJSValue> face, JSSmart<CJSValue> render_mode)
{
CExternalPointerJS result;
if (!NSShaper::FT_Get_Glyph_Render_Params(RAW_POINTER(face), render_mode->toInt32(), &result))
return CJSContext::createNull();
CExternalPointerJS result;
if (!NSShaper::FT_Get_Glyph_Render_Params(RAW_POINTER(face), render_mode->toInt32(), &result))
return CJSContext::createNull();
return CJSContext::createUint8Array(result.Data, result.Len, false);
return CJSContext::createUint8Array(result.Data, result.Len, false);
}
JSSmart<CJSValue> CTextMeasurerEmbed::FT_Get_Glyph_Render_Buffer(JSSmart<CJSValue> face, JSSmart<CJSValue> size)
{
void* Data = NSShaper::FT_Get_Glyph_Render_Buffer(RAW_POINTER(face));
return CJSContext::createUint8Array((unsigned char*)Data, size->toInt32(), true);
void* Data = NSShaper::FT_Get_Glyph_Render_Buffer(RAW_POINTER(face));
return CJSContext::createUint8Array((unsigned char*)Data, size->toInt32(), true);
}
JSSmart<CJSValue> CTextMeasurerEmbed::FT_Set_Transform(JSSmart<CJSValue> face, JSSmart<CJSValue> xx, JSSmart<CJSValue> yx, JSSmart<CJSValue> xy, JSSmart<CJSValue> yy)
{
NSShaper::FT_Set_Transform(RAW_POINTER(face), xx->toInt32(), yx->toInt32(), xy->toInt32(), yy->toInt32());
return CJSContext::createUndefined();
NSShaper::FT_Set_Transform(RAW_POINTER(face), xx->toInt32(), yx->toInt32(), xy->toInt32(), yy->toInt32());
return CJSContext::createUndefined();
}
JSSmart<CJSValue> CTextMeasurerEmbed::FT_Set_Char_Size(JSSmart<CJSValue> face, JSSmart<CJSValue> char_width, JSSmart<CJSValue> char_height, JSSmart<CJSValue> hres, JSSmart<CJSValue> vres)
{
return CJSContext::createInt(NSShaper::FT_Set_Char_Size(RAW_POINTER(face), char_width->toInt32(), char_height->toInt32(), hres->toUInt32(), vres->toUInt32()));
return CJSContext::createInt(NSShaper::FT_Set_Char_Size(RAW_POINTER(face), char_width->toInt32(), char_height->toInt32(), hres->toUInt32(), vres->toUInt32()));
}
JSSmart<CJSValue> CTextMeasurerEmbed::FT_SetCMapForCharCode(JSSmart<CJSValue> face, JSSmart<CJSValue> unicode)
{
return CJSContext::createUInt(NSShaper::FT_SetCMapForCharCode(RAW_POINTER(face), unicode->toUInt32()));
return CJSContext::createUInt(NSShaper::FT_SetCMapForCharCode(RAW_POINTER(face), unicode->toUInt32()));
}
JSSmart<CJSValue> CTextMeasurerEmbed::FT_GetKerningX(JSSmart<CJSValue> face, JSSmart<CJSValue> gid1, JSSmart<CJSValue> gid2)
{
return CJSContext::createInt(NSShaper::FT_GetKerningX(RAW_POINTER(face), gid1->toUInt32(), gid2->toUInt32()));
return CJSContext::createInt(NSShaper::FT_GetKerningX(RAW_POINTER(face), gid1->toUInt32(), gid2->toUInt32()));
}
JSSmart<CJSValue> CTextMeasurerEmbed::FT_GetFaceMaxAdvanceX(JSSmart<CJSValue> face)
{
return CJSContext::createInt(NSShaper::FT_GetFaceMaxAdvanceX(RAW_POINTER(face)));
return CJSContext::createInt(NSShaper::FT_GetFaceMaxAdvanceX(RAW_POINTER(face)));
}
#ifdef SUPPORT_HARFBUZZ_SHAPER
JSSmart<CJSValue> CTextMeasurerEmbed::HB_LanguageFromString(JSSmart<CJSValue> language_bcp_47)
{
void* Data = NSShaper::HB_LanguageFromString(language_bcp_47->toStringA());
CPointerEmbedObject* pObject = new CPointerEmbedObject(Data, NSPointerObjectDeleters::EmptyDeleter);
return pObject->createObject();
void* Data = NSShaper::HB_LanguageFromString(language_bcp_47->toStringA());
CPointerEmbedObject* pObject = new CPointerEmbedObject(Data, NSPointerObjectDeleters::EmptyDeleter);
return pObject->createObject();
}
JSSmart<CJSValue> CTextMeasurerEmbed::HB_ShapeText(JSSmart<CJSValue> face, JSSmart<CJSValue> font, JSSmart<CJSValue> text,
JSSmart<CJSValue> nFeatures, JSSmart<CJSValue> nScript, JSSmart<CJSValue> nDirection, JSSmart<CJSValue> nLanguage)
JSSmart<CJSValue> nFeatures, JSSmart<CJSValue> nScript, JSSmart<CJSValue> nDirection, JSSmart<CJSValue> nLanguage)
{
CPointerEmbedObject* pFont = POINTER_OBJECT(font);
CExternalPointerJS result;
CPointerEmbedObject* pFont = POINTER_OBJECT(font);
CExternalPointerJS result;
JSSmart<CJSTypedArray> typedArray = text->toTypedArray();
CJSDataBuffer buffer = typedArray->getData();
JSSmart<CJSTypedArray> typedArray = text->toTypedArray();
CJSDataBuffer buffer = typedArray->getData();
char* pText = (char*)buffer.Data;
char* pText = (char*)buffer.Data;
NSShaper::HB_ShapeText(RAW_POINTER(face), pFont->Data, pText,
nFeatures->toUInt32(), nScript->toUInt32(), nDirection->toUInt32(), RAW_POINTER(nLanguage),
&result, true);
NSShaper::HB_ShapeText(RAW_POINTER(face), pFont->Data, pText,
nFeatures->toUInt32(), nScript->toUInt32(), nDirection->toUInt32(), RAW_POINTER(nLanguage),
&result, true);
if (buffer.IsExternalize)
buffer.Free();
if (buffer.IsExternalize)
buffer.Free();
if (NULL == result.Data)
return CJSContext::createNull();
if (NULL == result.Data)
return CJSContext::createNull();
return CJSContext::createUint8Array(result.Data, result.Len, false);
return CJSContext::createUint8Array(result.Data, result.Len, false);
}
JSSmart<CJSValue> CTextMeasurerEmbed::HB_FontMalloc()
{
CPointerEmbedObject* pObject = new CPointerEmbedObject(NULL, [](void* data) { NSShaper::HB_FontFree(data); });
return pObject->createObject();
CPointerEmbedObject* pObject = new CPointerEmbedObject(NULL, [](void* data) { NSShaper::HB_FontFree(data); });
return pObject->createObject();
}
JSSmart<CJSValue> CTextMeasurerEmbed::HB_FontFree(JSSmart<CJSValue> font)
{
CPointerEmbedObject* pFont = POINTER_OBJECT(font);
pFont->Free();
return CJSContext::createUndefined();
CPointerEmbedObject* pFont = POINTER_OBJECT(font);
pFont->Free();
return CJSContext::createUndefined();
}
#endif

View File

@ -12,46 +12,46 @@ using namespace NSJSBase;
class CTextMeasurerEmbed : public CJSEmbedObject
{
public:
CTextMeasurerEmbed()
{
}
~CTextMeasurerEmbed()
{
}
CTextMeasurerEmbed()
{
}
~CTextMeasurerEmbed()
{
}
public:
JSSmart<CJSValue> FT_Malloc(JSSmart<CJSValue> typed_array_or_len);
JSSmart<CJSValue> FT_Free(JSSmart<CJSValue> pointer);
JSSmart<CJSValue> FT_Malloc(JSSmart<CJSValue> typed_array_or_len);
JSSmart<CJSValue> FT_Free(JSSmart<CJSValue> pointer);
JSSmart<CJSValue> FT_Init();
JSSmart<CJSValue> FT_Set_TrueType_HintProp(JSSmart<CJSValue> library, JSSmart<CJSValue> tt_interpreter);
JSSmart<CJSValue> FT_Init();
JSSmart<CJSValue> FT_Set_TrueType_HintProp(JSSmart<CJSValue> library, JSSmart<CJSValue> tt_interpreter);
JSSmart<CJSValue> FT_Open_Face(JSSmart<CJSValue> library, JSSmart<CJSValue> memory, JSSmart<CJSValue> size, JSSmart<CJSValue> face_index);
JSSmart<CJSValue> FT_Open_Face2(JSSmart<CJSValue> library, JSSmart<CJSValue> array, JSSmart<CJSValue> face_index);
JSSmart<CJSValue> FT_GetFaceInfo(JSSmart<CJSValue> face);
JSSmart<CJSValue> FT_Open_Face(JSSmart<CJSValue> library, JSSmart<CJSValue> memory, JSSmart<CJSValue> size, JSSmart<CJSValue> face_index);
JSSmart<CJSValue> FT_Open_Face2(JSSmart<CJSValue> library, JSSmart<CJSValue> array, JSSmart<CJSValue> face_index);
JSSmart<CJSValue> FT_GetFaceInfo(JSSmart<CJSValue> face);
JSSmart<CJSValue> FT_Load_Glyph(JSSmart<CJSValue> face, JSSmart<CJSValue> gid, JSSmart<CJSValue> mode);
JSSmart<CJSValue> FT_Get_Glyph_Measure_Params(JSSmart<CJSValue> face, JSSmart<CJSValue> is_vector);
JSSmart<CJSValue> FT_Get_Glyph_Render_Params(JSSmart<CJSValue> face, JSSmart<CJSValue> render_mode);
JSSmart<CJSValue> FT_Get_Glyph_Render_Buffer(JSSmart<CJSValue> face, JSSmart<CJSValue> size);
JSSmart<CJSValue> FT_Load_Glyph(JSSmart<CJSValue> face, JSSmart<CJSValue> gid, JSSmart<CJSValue> mode);
JSSmart<CJSValue> FT_Get_Glyph_Measure_Params(JSSmart<CJSValue> face, JSSmart<CJSValue> is_vector);
JSSmart<CJSValue> FT_Get_Glyph_Render_Params(JSSmart<CJSValue> face, JSSmart<CJSValue> render_mode);
JSSmart<CJSValue> FT_Get_Glyph_Render_Buffer(JSSmart<CJSValue> face, JSSmart<CJSValue> size);
JSSmart<CJSValue> FT_Set_Transform(JSSmart<CJSValue> face, JSSmart<CJSValue> xx, JSSmart<CJSValue> yx, JSSmart<CJSValue> xy, JSSmart<CJSValue> yy);
JSSmart<CJSValue> FT_Set_Char_Size(JSSmart<CJSValue> face, JSSmart<CJSValue> char_width, JSSmart<CJSValue> char_height, JSSmart<CJSValue> hres, JSSmart<CJSValue> vres);
JSSmart<CJSValue> FT_SetCMapForCharCode(JSSmart<CJSValue> face, JSSmart<CJSValue> unicode);
JSSmart<CJSValue> FT_GetKerningX(JSSmart<CJSValue> face, JSSmart<CJSValue> gid1, JSSmart<CJSValue> gid2);
JSSmart<CJSValue> FT_GetFaceMaxAdvanceX(JSSmart<CJSValue> face);
JSSmart<CJSValue> FT_Set_Transform(JSSmart<CJSValue> face, JSSmart<CJSValue> xx, JSSmart<CJSValue> yx, JSSmart<CJSValue> xy, JSSmart<CJSValue> yy);
JSSmart<CJSValue> FT_Set_Char_Size(JSSmart<CJSValue> face, JSSmart<CJSValue> char_width, JSSmart<CJSValue> char_height, JSSmart<CJSValue> hres, JSSmart<CJSValue> vres);
JSSmart<CJSValue> FT_SetCMapForCharCode(JSSmart<CJSValue> face, JSSmart<CJSValue> unicode);
JSSmart<CJSValue> FT_GetKerningX(JSSmart<CJSValue> face, JSSmart<CJSValue> gid1, JSSmart<CJSValue> gid2);
JSSmart<CJSValue> FT_GetFaceMaxAdvanceX(JSSmart<CJSValue> face);
#ifdef SUPPORT_HARFBUZZ_SHAPER
JSSmart<CJSValue> HB_LanguageFromString(JSSmart<CJSValue> language_bcp_47);
JSSmart<CJSValue> HB_LanguageFromString(JSSmart<CJSValue> language_bcp_47);
JSSmart<CJSValue> HB_ShapeText(JSSmart<CJSValue> face, JSSmart<CJSValue> font, JSSmart<CJSValue> text,
JSSmart<CJSValue> nFeatures, JSSmart<CJSValue> nScript, JSSmart<CJSValue> nDirection, JSSmart<CJSValue> nLanguage);
JSSmart<CJSValue> HB_ShapeText(JSSmart<CJSValue> face, JSSmart<CJSValue> font, JSSmart<CJSValue> text,
JSSmart<CJSValue> nFeatures, JSSmart<CJSValue> nScript, JSSmart<CJSValue> nDirection, JSSmart<CJSValue> nLanguage);
JSSmart<CJSValue> HB_FontMalloc();
JSSmart<CJSValue> HB_FontFree(JSSmart<CJSValue> font);
JSSmart<CJSValue> HB_FontMalloc();
JSSmart<CJSValue> HB_FontFree(JSSmart<CJSValue> font);
#endif
static void CreateObjectInContext(const std::string& name, JSSmart<CJSContext> context);
static void CreateObjectInContext(const std::string& name, JSSmart<CJSContext> context);
};
#endif // _BUILD_NATIVE_TEXT_MEASURER_EMBED_H_

View File

@ -0,0 +1,31 @@
#include "../HashEmbed.h"
#include "../../js_internal/jsc/jsc_base.h"
@protocol IJSCHash <JSExport>
-(JSValue*) hash : (JSValue*)data : (JSValue*)size : (JSValue*)alg;
-(JSValue*) hash2 : (JSValue*)password : (JSValue*)salt : (JSValue*)spinCount : (JSValue*)alg;
@end
@interface CJSCHash : NSObject<IJSCHash, JSEmbedObjectProtocol>
{
@public
CHashEmbed* m_internal;
}
@end
@implementation CJSCHash
EMBED_OBJECT_WRAPPER_METHODS(CHashEmbed)
FUNCTION_WRAPPER_JS_3(hash, hash)
FUNCTION_WRAPPER_JS_4(hash2, hash2)
@end
void CHashEmbed::CreateObjectInContext(const std::string &name, JSSmart<CJSContext> context)
{
context->m_internal->context[[NSString stringWithAString:name]] = ^(){
return [[CJSCHash alloc] init];
};
}

View File

@ -3,260 +3,248 @@
namespace NSGraphics
{
#define CURRENTWRAPPER CGraphicsEmbed
#define CURRENTWRAPPER CGraphicsEmbed
// FUNCTION
FUNCTION_WRAPPER_V8_5(_init, init)
FUNCTION_WRAPPER_V8 (_destroy, Destroy)
FUNCTION_WRAPPER_V8 (_EndDraw, EndDraw)
FUNCTION_WRAPPER_V8_2(_put_GlobalAlpha, put_GlobalAlpha)
FUNCTION_WRAPPER_V8 (_Start_GlobalAlpha, Start_GlobalAlpha)
FUNCTION_WRAPPER_V8 (_End_GlobalAlpha, End_GlobalAlpha)
// pen methods
FUNCTION_WRAPPER_V8_4(_p_color, p_color)
FUNCTION_WRAPPER_V8_1(_p_width, p_width)
FUNCTION_WRAPPER_V8_1(_p_dash, p_dash)
// brush methods
FUNCTION_WRAPPER_V8_4(_b_color1, b_color1)
FUNCTION_WRAPPER_V8_4(_b_color2, b_color2)
FUNCTION_WRAPPER_V8_6(_transform, transform)
FUNCTION_WRAPPER_V8_1(_CalculateFullTransform, CalculateFullTransform)
// path commands
FUNCTION_WRAPPER_V8 (__s, _s)
FUNCTION_WRAPPER_V8 (__e, _e)
FUNCTION_WRAPPER_V8 (__z, _z)
FUNCTION_WRAPPER_V8_2(__m, _m)
FUNCTION_WRAPPER_V8_2(__l, _l)
FUNCTION_WRAPPER_V8_6(__c, _c)
FUNCTION_WRAPPER_V8_4(__c2, _c2)
FUNCTION_WRAPPER_V8 (_ds, ds)
FUNCTION_WRAPPER_V8 (_df, df)
// canvas state
FUNCTION_WRAPPER_V8 (_save, save)
FUNCTION_WRAPPER_V8 (_restore, restore)
FUNCTION_WRAPPER_V8 (_clip, clip)
FUNCTION_WRAPPER_V8 (_reset, reset)
FUNCTION_WRAPPER_V8 (_FreeFont, FreeFont)
FUNCTION_WRAPPER_V8 (_ClearLastFont, ClearLastFont)
// images
FUNCTION_WRAPPER_V8_7(_drawImage2, drawImage2)
FUNCTION_WRAPPER_V8_8(_drawImage, drawImage)
// text
FUNCTION_WRAPPER_V8 (_GetFont, GetFont)
FUNCTION_WRAPPER_V8_2(_font, font)
FUNCTION_WRAPPER_V8_4(_SetFont, SetFont)
FUNCTION_WRAPPER_V8 (_GetTextPr, GetTextPr)
FUNCTION_WRAPPER_V8_3(_FillText, FillText)
FUNCTION_WRAPPER_V8_3(_t, t)
FUNCTION_WRAPPER_V8_5(_FillText2, FillText2)
FUNCTION_WRAPPER_V8_5(_t2, t2)
FUNCTION_WRAPPER_V8_3(_FillTextCode, FillTextCode)
FUNCTION_WRAPPER_V8_3(_tg, tg)
FUNCTION_WRAPPER_V8_1(_charspace, charspace)
// private methods
FUNCTION_WRAPPER_V8_2(_private_FillGlyph, private_FillGlyph)
FUNCTION_WRAPPER_V8_3(_private_FillGlyphC, private_FillGlyphC)
FUNCTION_WRAPPER_V8_1(_private_FillGlyph2, private_FillGlyph2)
FUNCTION_WRAPPER_V8_1(_SetIntegerGrid, SetIntegerGrid)
FUNCTION_WRAPPER_V8 (_GetIntegerGrid, GetIntegerGrid)
FUNCTION_WRAPPER_V8_3(_DrawStringASCII, DrawStringASCII)
FUNCTION_WRAPPER_V8_3(_DrawStringASCII2, DrawStringASCII2)
FUNCTION_WRAPPER_V8_5(_DrawHeaderEdit, DrawHeaderEdit)
FUNCTION_WRAPPER_V8_5(_DrawFooterEdit, DrawFooterEdit)
FUNCTION_WRAPPER_V8_3(_DrawLockParagraph, DrawLockParagraph)
FUNCTION_WRAPPER_V8_4(_DrawLockObjectRect, DrawLockObjectRect)
FUNCTION_WRAPPER_V8_4(_DrawEmptyTableLine, DrawEmptyTableLine)
FUNCTION_WRAPPER_V8_4(_DrawSpellingLine, DrawSpellingLine)
// smart methods for horizontal / vertical lines
FUNCTION_WRAPPER_V8_5(_drawHorLine, drawHorLine)
FUNCTION_WRAPPER_V8_5(_drawHorLine2, drawHorLine2)
FUNCTION_WRAPPER_V8_5(_drawVerLine, drawVerLine)
// мега крутые функции для таблиц
FUNCTION_WRAPPER_V8_7(_drawHorLineExt, drawHorLineExt)
FUNCTION_WRAPPER_V8_4(_rect, rect)
FUNCTION_WRAPPER_V8_4(_TableRect, TableRect)
// функции клиппирования
FUNCTION_WRAPPER_V8_4(_AddClipRect, AddClipRect)
FUNCTION_WRAPPER_V8 (_RemoveClipRect, RemoveClipRect)
FUNCTION_WRAPPER_V8_4(_SetClip, SetClip)
FUNCTION_WRAPPER_V8 (_RemoveClip, RemoveClip)
FUNCTION_WRAPPER_V8_4(_drawMailMergeField, drawMailMergeField)
FUNCTION_WRAPPER_V8_4(_drawSearchResult, drawSearchResult)
FUNCTION_WRAPPER_V8_2(_drawFlowAnchor, drawFlowAnchor)
FUNCTION_WRAPPER_V8 (_SavePen, SavePen)
FUNCTION_WRAPPER_V8 (_RestorePen, RestorePen)
FUNCTION_WRAPPER_V8 (_SaveBrush, SaveBrush)
FUNCTION_WRAPPER_V8 (_RestoreBrush, RestoreBrush)
FUNCTION_WRAPPER_V8 (_SavePenBrush, SavePenBrush)
FUNCTION_WRAPPER_V8 (_RestorePenBrush, RestorePenBrush)
FUNCTION_WRAPPER_V8 (_SaveGrState, SaveGrState)
FUNCTION_WRAPPER_V8 (_RestoreGrState, RestoreGrState)
FUNCTION_WRAPPER_V8 (_StartClipPath, StartClipPath)
FUNCTION_WRAPPER_V8 (_EndClipPath, EndClipPath)
FUNCTION_WRAPPER_V8 (_StartCheckTableDraw, StartCheckTableDraw)
FUNCTION_WRAPPER_V8_4(_SetTextClipRect, SetTextClipRect)
FUNCTION_WRAPPER_V8_5(_AddSmartRect, AddSmartRect)
FUNCTION_WRAPPER_V8_1(_CheckUseFonts2, CheckUseFonts2)
FUNCTION_WRAPPER_V8 (_UncheckUseFonts2, UncheckUseFonts2)
FUNCTION_WRAPPER_V8_4(_Drawing_StartCheckBounds, Drawing_StartCheckBounds)
FUNCTION_WRAPPER_V8 (_Drawing_EndCheckBounds, Drawing_EndCheckBounds)
FUNCTION_WRAPPER_V8_5(_DrawPresentationComment, DrawPresentationComment)
FUNCTION_WRAPPER_V8_3(_DrawPolygon, DrawPolygon)
FUNCTION_WRAPPER_V8_4(_DrawFootnoteRect, DrawFootnoteRect)
// new methods
FUNCTION_WRAPPER_V8_1(_toDataURL, toDataURL)
FUNCTION_WRAPPER_V8 (_GetPenColor, GetPenColor)
FUNCTION_WRAPPER_V8 (_GetBrushColor, GetBrushColor)
FUNCTION_WRAPPER_V8_2(_put_brushTexture, put_brushTexture)
FUNCTION_WRAPPER_V8_1(_put_brushTextureMode, put_brushTextureMode)
FUNCTION_WRAPPER_V8_1(_put_BrushTextureAlpha, put_BrushTextureAlpha)
FUNCTION_WRAPPER_V8_8(_put_BrushGradient, put_BrushGradient)
FUNCTION_WRAPPER_V8_2(_TransformPointX, TransformPointX)
FUNCTION_WRAPPER_V8_2(_TransformPointY, TransformPointY)
FUNCTION_WRAPPER_V8_1(_put_LineJoin, put_LineJoin)
FUNCTION_WRAPPER_V8 (_get_LineJoin, get_LineJoin)
FUNCTION_WRAPPER_V8_4(_put_TextureBounds, put_TextureBounds)
FUNCTION_WRAPPER_V8 (_GetlineWidth, GetlineWidth)
FUNCTION_WRAPPER_V8_1(_DrawPath, DrawPath)
FUNCTION_WRAPPER_V8_2(_CoordTransformOffset, CoordTransformOffset)
FUNCTION_WRAPPER_V8 (_GetTransform, GetTransform)
// FUNCTION
FUNCTION_WRAPPER_V8_5(_init, init)
FUNCTION_WRAPPER_V8 (_destroy, Destroy)
FUNCTION_WRAPPER_V8 (_EndDraw, EndDraw)
FUNCTION_WRAPPER_V8_2(_put_GlobalAlpha, put_GlobalAlpha)
FUNCTION_WRAPPER_V8 (_Start_GlobalAlpha, Start_GlobalAlpha)
FUNCTION_WRAPPER_V8 (_End_GlobalAlpha, End_GlobalAlpha)
// pen methods
FUNCTION_WRAPPER_V8_4(_p_color, p_color)
FUNCTION_WRAPPER_V8_1(_p_width, p_width)
FUNCTION_WRAPPER_V8_1(_p_dash, p_dash)
// brush methods
FUNCTION_WRAPPER_V8_4(_b_color1, b_color1)
FUNCTION_WRAPPER_V8_4(_b_color2, b_color2)
FUNCTION_WRAPPER_V8_6(_transform, transform)
FUNCTION_WRAPPER_V8_1(_CalculateFullTransform, CalculateFullTransform)
// path commands
FUNCTION_WRAPPER_V8 (__s, _s)
FUNCTION_WRAPPER_V8 (__e, _e)
FUNCTION_WRAPPER_V8 (__z, _z)
FUNCTION_WRAPPER_V8_2(__m, _m)
FUNCTION_WRAPPER_V8_2(__l, _l)
FUNCTION_WRAPPER_V8_6(__c, _c)
FUNCTION_WRAPPER_V8_4(__c2, _c2)
FUNCTION_WRAPPER_V8 (_ds, ds)
FUNCTION_WRAPPER_V8 (_df, df)
// canvas state
FUNCTION_WRAPPER_V8 (_save, save)
FUNCTION_WRAPPER_V8 (_restore, restore)
FUNCTION_WRAPPER_V8 (_clip, clip)
FUNCTION_WRAPPER_V8 (_reset, reset)
FUNCTION_WRAPPER_V8 (_FreeFont, FreeFont)
FUNCTION_WRAPPER_V8 (_ClearLastFont, ClearLastFont)
// images
FUNCTION_WRAPPER_V8_7(_drawImage2, drawImage2)
FUNCTION_WRAPPER_V8_8(_drawImage, drawImage)
// text
FUNCTION_WRAPPER_V8 (_GetFont, GetFont)
FUNCTION_WRAPPER_V8_2(_font, font)
FUNCTION_WRAPPER_V8_4(_SetFont, SetFont)
FUNCTION_WRAPPER_V8 (_GetTextPr, GetTextPr)
FUNCTION_WRAPPER_V8_3(_FillText, FillText)
FUNCTION_WRAPPER_V8_3(_t, t)
FUNCTION_WRAPPER_V8_5(_FillText2, FillText2)
FUNCTION_WRAPPER_V8_5(_t2, t2)
FUNCTION_WRAPPER_V8_3(_FillTextCode, FillTextCode)
FUNCTION_WRAPPER_V8_3(_tg, tg)
FUNCTION_WRAPPER_V8_1(_charspace, charspace)
// private methods
FUNCTION_WRAPPER_V8_2(_private_FillGlyph, private_FillGlyph)
FUNCTION_WRAPPER_V8_3(_private_FillGlyphC, private_FillGlyphC)
FUNCTION_WRAPPER_V8_1(_private_FillGlyph2, private_FillGlyph2)
FUNCTION_WRAPPER_V8_1(_SetIntegerGrid, SetIntegerGrid)
FUNCTION_WRAPPER_V8 (_GetIntegerGrid, GetIntegerGrid)
FUNCTION_WRAPPER_V8_3(_DrawStringASCII, DrawStringASCII)
FUNCTION_WRAPPER_V8_3(_DrawStringASCII2, DrawStringASCII2)
FUNCTION_WRAPPER_V8_5(_DrawHeaderEdit, DrawHeaderEdit)
FUNCTION_WRAPPER_V8_5(_DrawFooterEdit, DrawFooterEdit)
FUNCTION_WRAPPER_V8_3(_DrawLockParagraph, DrawLockParagraph)
FUNCTION_WRAPPER_V8_4(_DrawLockObjectRect, DrawLockObjectRect)
FUNCTION_WRAPPER_V8_4(_DrawEmptyTableLine, DrawEmptyTableLine)
FUNCTION_WRAPPER_V8_4(_DrawSpellingLine, DrawSpellingLine)
// smart methods for horizontal / vertical lines
FUNCTION_WRAPPER_V8_5(_drawHorLine, drawHorLine)
FUNCTION_WRAPPER_V8_5(_drawHorLine2, drawHorLine2)
FUNCTION_WRAPPER_V8_5(_drawVerLine, drawVerLine)
// мега крутые функции для таблиц
FUNCTION_WRAPPER_V8_7(_drawHorLineExt, drawHorLineExt)
FUNCTION_WRAPPER_V8_4(_rect, rect)
FUNCTION_WRAPPER_V8_4(_TableRect, TableRect)
// функции клиппирования
FUNCTION_WRAPPER_V8_4(_AddClipRect, AddClipRect)
FUNCTION_WRAPPER_V8 (_RemoveClipRect, RemoveClipRect)
FUNCTION_WRAPPER_V8_4(_SetClip, SetClip)
FUNCTION_WRAPPER_V8 (_RemoveClip, RemoveClip)
FUNCTION_WRAPPER_V8_4(_drawMailMergeField, drawMailMergeField)
FUNCTION_WRAPPER_V8_4(_drawSearchResult, drawSearchResult)
FUNCTION_WRAPPER_V8_2(_drawFlowAnchor, drawFlowAnchor)
FUNCTION_WRAPPER_V8 (_SavePen, SavePen)
FUNCTION_WRAPPER_V8 (_RestorePen, RestorePen)
FUNCTION_WRAPPER_V8 (_SaveBrush, SaveBrush)
FUNCTION_WRAPPER_V8 (_RestoreBrush, RestoreBrush)
FUNCTION_WRAPPER_V8 (_SavePenBrush, SavePenBrush)
FUNCTION_WRAPPER_V8 (_RestorePenBrush, RestorePenBrush)
FUNCTION_WRAPPER_V8 (_SaveGrState, SaveGrState)
FUNCTION_WRAPPER_V8 (_RestoreGrState, RestoreGrState)
FUNCTION_WRAPPER_V8 (_StartClipPath, StartClipPath)
FUNCTION_WRAPPER_V8 (_EndClipPath, EndClipPath)
FUNCTION_WRAPPER_V8 (_StartCheckTableDraw, StartCheckTableDraw)
FUNCTION_WRAPPER_V8_4(_SetTextClipRect, SetTextClipRect)
FUNCTION_WRAPPER_V8_5(_AddSmartRect, AddSmartRect)
FUNCTION_WRAPPER_V8_1(_CheckUseFonts2, CheckUseFonts2)
FUNCTION_WRAPPER_V8 (_UncheckUseFonts2, UncheckUseFonts2)
FUNCTION_WRAPPER_V8_4(_Drawing_StartCheckBounds, Drawing_StartCheckBounds)
FUNCTION_WRAPPER_V8 (_Drawing_EndCheckBounds, Drawing_EndCheckBounds)
FUNCTION_WRAPPER_V8_5(_DrawPresentationComment, DrawPresentationComment)
FUNCTION_WRAPPER_V8_3(_DrawPolygon, DrawPolygon)
FUNCTION_WRAPPER_V8_4(_DrawFootnoteRect, DrawFootnoteRect)
// new methods
FUNCTION_WRAPPER_V8_1(_toDataURL, toDataURL)
FUNCTION_WRAPPER_V8 (_GetPenColor, GetPenColor)
FUNCTION_WRAPPER_V8 (_GetBrushColor, GetBrushColor)
FUNCTION_WRAPPER_V8_2(_put_brushTexture, put_brushTexture)
FUNCTION_WRAPPER_V8_1(_put_brushTextureMode, put_brushTextureMode)
FUNCTION_WRAPPER_V8_1(_put_BrushTextureAlpha, put_BrushTextureAlpha)
FUNCTION_WRAPPER_V8_8(_put_BrushGradient, put_BrushGradient)
FUNCTION_WRAPPER_V8_2(_TransformPointX, TransformPointX)
FUNCTION_WRAPPER_V8_2(_TransformPointY, TransformPointY)
FUNCTION_WRAPPER_V8_1(_put_LineJoin, put_LineJoin)
FUNCTION_WRAPPER_V8 (_get_LineJoin, get_LineJoin)
FUNCTION_WRAPPER_V8_4(_put_TextureBounds, put_TextureBounds)
FUNCTION_WRAPPER_V8 (_GetlineWidth, GetlineWidth)
FUNCTION_WRAPPER_V8_1(_DrawPath, DrawPath)
FUNCTION_WRAPPER_V8_2(_CoordTransformOffset, CoordTransformOffset)
FUNCTION_WRAPPER_V8 (_GetTransform, GetTransform)
v8::Handle<v8::ObjectTemplate> CreateGraphicsTemplate(v8::Isolate* isolate)
{
v8::EscapableHandleScope handle_scope(isolate);
v8::Handle<v8::ObjectTemplate> CreateGraphicsTemplate(v8::Isolate* isolate)
{
v8::EscapableHandleScope handle_scope(isolate);
v8::Local<v8::ObjectTemplate> result = v8::ObjectTemplate::New(isolate);
result->SetInternalFieldCount(1);
v8::Local<v8::ObjectTemplate> result = v8::ObjectTemplate::New(isolate);
result->SetInternalFieldCount(1);
v8::Isolate* current = v8::Isolate::GetCurrent();
v8::Isolate* current = v8::Isolate::GetCurrent();
// методы
NSV8Objects::Template_Set(result, "create", _init);
NSV8Objects::Template_Set(result, "Destroy", _destroy);
NSV8Objects::Template_Set(result, "EndDraw", _EndDraw);
NSV8Objects::Template_Set(result, "put_GlobalAlpha", _put_GlobalAlpha);
NSV8Objects::Template_Set(result, "Start_GlobalAlpha", _Start_GlobalAlpha);
NSV8Objects::Template_Set(result, "End_GlobalAlpha", _End_GlobalAlpha);
NSV8Objects::Template_Set(result, "p_color", _p_color);
NSV8Objects::Template_Set(result, "p_width", _p_width);
NSV8Objects::Template_Set(result, "p_dash", _p_dash);
NSV8Objects::Template_Set(result, "b_color1", _b_color1);
NSV8Objects::Template_Set(result, "b_color2", _b_color2);
NSV8Objects::Template_Set(result, "transform", _transform);
NSV8Objects::Template_Set(result, "CalculateFullTransform", _CalculateFullTransform);
NSV8Objects::Template_Set(result, "_s", __s);
NSV8Objects::Template_Set(result, "_e", __e);
NSV8Objects::Template_Set(result, "_z", __z);
NSV8Objects::Template_Set(result, "_m", __m);
NSV8Objects::Template_Set(result, "_l", __l);
NSV8Objects::Template_Set(result, "_c", __c);
NSV8Objects::Template_Set(result, "_c2", __c2);
NSV8Objects::Template_Set(result, "ds", _ds);
NSV8Objects::Template_Set(result, "df", _df);
NSV8Objects::Template_Set(result, "save", _save);
NSV8Objects::Template_Set(result, "restore", _restore);
NSV8Objects::Template_Set(result, "clip", _clip);
NSV8Objects::Template_Set(result, "reset", _reset);
NSV8Objects::Template_Set(result, "FreeFont", _FreeFont);
NSV8Objects::Template_Set(result, "ClearLastFont", _ClearLastFont);
NSV8Objects::Template_Set(result, "drawImage2", _drawImage2);
NSV8Objects::Template_Set(result, "drawImage", _drawImage);
NSV8Objects::Template_Set(result, "GetFont", _GetFont);
NSV8Objects::Template_Set(result, "font", _font);
NSV8Objects::Template_Set(result, "SetFont", _SetFont);
NSV8Objects::Template_Set(result, "GetTextPr", _GetTextPr);
NSV8Objects::Template_Set(result, "FillText", _FillText);
NSV8Objects::Template_Set(result, "t", _t);
NSV8Objects::Template_Set(result, "FillText2", _FillText2);
NSV8Objects::Template_Set(result, "t2", _t2);
NSV8Objects::Template_Set(result, "FillTextCode", _FillTextCode);
NSV8Objects::Template_Set(result, "tg", _tg);
NSV8Objects::Template_Set(result, "charspace", _charspace);
NSV8Objects::Template_Set(result, "private_FillGlyph", _private_FillGlyph);
NSV8Objects::Template_Set(result, "private_FillGlyphC", _private_FillGlyphC);
NSV8Objects::Template_Set(result, "private_FillGlyph2", _private_FillGlyph2);
NSV8Objects::Template_Set(result, "SetIntegerGrid", _SetIntegerGrid);
NSV8Objects::Template_Set(result, "GetIntegerGrid", _GetIntegerGrid);
NSV8Objects::Template_Set(result, "DrawStringASCII", _DrawStringASCII);
NSV8Objects::Template_Set(result, "DrawStringASCII2", _DrawStringASCII2);
NSV8Objects::Template_Set(result, "DrawHeaderEdit", _DrawHeaderEdit);
NSV8Objects::Template_Set(result, "DrawFooterEdit", _DrawFooterEdit);
NSV8Objects::Template_Set(result, "DrawLockParagraph", _DrawLockParagraph);
NSV8Objects::Template_Set(result, "DrawLockObjectRect", _DrawLockObjectRect);
NSV8Objects::Template_Set(result, "DrawEmptyTableLine", _DrawEmptyTableLine);
NSV8Objects::Template_Set(result, "DrawSpellingLine", _DrawSpellingLine);
NSV8Objects::Template_Set(result, "drawHorLine", _drawHorLine);
NSV8Objects::Template_Set(result, "drawHorLine2", _drawHorLine2);
NSV8Objects::Template_Set(result, "drawVerLine", _drawVerLine);
NSV8Objects::Template_Set(result, "drawHorLineExt", _drawHorLineExt);
NSV8Objects::Template_Set(result, "rect", _rect);
NSV8Objects::Template_Set(result, "TableRect", _TableRect);
NSV8Objects::Template_Set(result, "AddClipRect", _AddClipRect);
NSV8Objects::Template_Set(result, "RemoveClipRect", _RemoveClipRect);
NSV8Objects::Template_Set(result, "SetClip", _SetClip);
NSV8Objects::Template_Set(result, "RemoveClip", _RemoveClip);
NSV8Objects::Template_Set(result, "drawMailMergeField", _drawMailMergeField);
NSV8Objects::Template_Set(result, "drawSearchResult", _drawSearchResult);
NSV8Objects::Template_Set(result, "drawFlowAnchor", _drawFlowAnchor);
NSV8Objects::Template_Set(result, "SavePen", _SavePen);
NSV8Objects::Template_Set(result, "RestorePen", _RestorePen);
NSV8Objects::Template_Set(result, "SaveBrush", _SaveBrush);
NSV8Objects::Template_Set(result, "RestoreBrush", _RestoreBrush);
NSV8Objects::Template_Set(result, "SavePenBrush", _SavePenBrush);
NSV8Objects::Template_Set(result, "RestorePenBrush", _RestorePenBrush);
NSV8Objects::Template_Set(result, "SaveGrState", _SaveGrState);
NSV8Objects::Template_Set(result, "RestoreGrState", _RestoreGrState);
NSV8Objects::Template_Set(result, "StartClipPath", _StartClipPath);
NSV8Objects::Template_Set(result, "EndClipPath", _EndClipPath);
NSV8Objects::Template_Set(result, "StartCheckTableDraw", _StartCheckTableDraw);
NSV8Objects::Template_Set(result, "SetTextClipRect", _SetTextClipRect);
NSV8Objects::Template_Set(result, "AddSmartRect", _AddSmartRect);
NSV8Objects::Template_Set(result, "CheckUseFonts2", _CheckUseFonts2);
NSV8Objects::Template_Set(result, "UncheckUseFonts2", _UncheckUseFonts2);
NSV8Objects::Template_Set(result, "Drawing_StartCheckBounds", _Drawing_StartCheckBounds);
NSV8Objects::Template_Set(result, "Drawing_EndCheckBounds", _Drawing_EndCheckBounds);
NSV8Objects::Template_Set(result, "DrawPresentationComment", _DrawPresentationComment);
NSV8Objects::Template_Set(result, "DrawPolygon", _DrawPolygon);
NSV8Objects::Template_Set(result, "DrawFootnoteRect", _DrawFootnoteRect);
NSV8Objects::Template_Set(result, "toDataURL", _toDataURL);
NSV8Objects::Template_Set(result, "GetPenColor", _GetPenColor);
NSV8Objects::Template_Set(result, "GetBrushColor", _GetBrushColor);
NSV8Objects::Template_Set(result, "put_brushTexture", _put_brushTexture);
NSV8Objects::Template_Set(result, "put_brushTextureMode", _put_brushTextureMode);
NSV8Objects::Template_Set(result, "put_BrushTextureAlpha", _put_BrushTextureAlpha);
NSV8Objects::Template_Set(result, "put_BrushGradient", _put_BrushGradient);
NSV8Objects::Template_Set(result, "TransformPointX", _TransformPointX);
NSV8Objects::Template_Set(result, "TransformPointY", _TransformPointY);
NSV8Objects::Template_Set(result, "put_LineJoin", _put_LineJoin);
NSV8Objects::Template_Set(result, "get_LineJoin", _get_LineJoin);
NSV8Objects::Template_Set(result, "put_TextureBounds", _put_TextureBounds);
NSV8Objects::Template_Set(result, "GetlineWidth", _GetlineWidth);
NSV8Objects::Template_Set(result, "DrawPath", _DrawPath);
NSV8Objects::Template_Set(result, "CoordTransformOffset", _CoordTransformOffset);
NSV8Objects::Template_Set(result, "GetTransform", _GetTransform);
// методы
NSV8Objects::Template_Set(result, "create", _init);
NSV8Objects::Template_Set(result, "Destroy", _destroy);
NSV8Objects::Template_Set(result, "EndDraw", _EndDraw);
NSV8Objects::Template_Set(result, "put_GlobalAlpha", _put_GlobalAlpha);
NSV8Objects::Template_Set(result, "Start_GlobalAlpha", _Start_GlobalAlpha);
NSV8Objects::Template_Set(result, "End_GlobalAlpha", _End_GlobalAlpha);
NSV8Objects::Template_Set(result, "p_color", _p_color);
NSV8Objects::Template_Set(result, "p_width", _p_width);
NSV8Objects::Template_Set(result, "p_dash", _p_dash);
NSV8Objects::Template_Set(result, "b_color1", _b_color1);
NSV8Objects::Template_Set(result, "b_color2", _b_color2);
NSV8Objects::Template_Set(result, "transform", _transform);
NSV8Objects::Template_Set(result, "CalculateFullTransform", _CalculateFullTransform);
NSV8Objects::Template_Set(result, "_s", __s);
NSV8Objects::Template_Set(result, "_e", __e);
NSV8Objects::Template_Set(result, "_z", __z);
NSV8Objects::Template_Set(result, "_m", __m);
NSV8Objects::Template_Set(result, "_l", __l);
NSV8Objects::Template_Set(result, "_c", __c);
NSV8Objects::Template_Set(result, "_c2", __c2);
NSV8Objects::Template_Set(result, "ds", _ds);
NSV8Objects::Template_Set(result, "df", _df);
NSV8Objects::Template_Set(result, "save", _save);
NSV8Objects::Template_Set(result, "restore", _restore);
NSV8Objects::Template_Set(result, "clip", _clip);
NSV8Objects::Template_Set(result, "reset", _reset);
NSV8Objects::Template_Set(result, "FreeFont", _FreeFont);
NSV8Objects::Template_Set(result, "ClearLastFont", _ClearLastFont);
NSV8Objects::Template_Set(result, "drawImage2", _drawImage2);
NSV8Objects::Template_Set(result, "drawImage", _drawImage);
NSV8Objects::Template_Set(result, "GetFont", _GetFont);
NSV8Objects::Template_Set(result, "font", _font);
NSV8Objects::Template_Set(result, "SetFont", _SetFont);
NSV8Objects::Template_Set(result, "GetTextPr", _GetTextPr);
NSV8Objects::Template_Set(result, "FillText", _FillText);
NSV8Objects::Template_Set(result, "t", _t);
NSV8Objects::Template_Set(result, "FillText2", _FillText2);
NSV8Objects::Template_Set(result, "t2", _t2);
NSV8Objects::Template_Set(result, "FillTextCode", _FillTextCode);
NSV8Objects::Template_Set(result, "tg", _tg);
NSV8Objects::Template_Set(result, "charspace", _charspace);
NSV8Objects::Template_Set(result, "private_FillGlyph", _private_FillGlyph);
NSV8Objects::Template_Set(result, "private_FillGlyphC", _private_FillGlyphC);
NSV8Objects::Template_Set(result, "private_FillGlyph2", _private_FillGlyph2);
NSV8Objects::Template_Set(result, "SetIntegerGrid", _SetIntegerGrid);
NSV8Objects::Template_Set(result, "GetIntegerGrid", _GetIntegerGrid);
NSV8Objects::Template_Set(result, "DrawStringASCII", _DrawStringASCII);
NSV8Objects::Template_Set(result, "DrawStringASCII2", _DrawStringASCII2);
NSV8Objects::Template_Set(result, "DrawHeaderEdit", _DrawHeaderEdit);
NSV8Objects::Template_Set(result, "DrawFooterEdit", _DrawFooterEdit);
NSV8Objects::Template_Set(result, "DrawLockParagraph", _DrawLockParagraph);
NSV8Objects::Template_Set(result, "DrawLockObjectRect", _DrawLockObjectRect);
NSV8Objects::Template_Set(result, "DrawEmptyTableLine", _DrawEmptyTableLine);
NSV8Objects::Template_Set(result, "DrawSpellingLine", _DrawSpellingLine);
NSV8Objects::Template_Set(result, "drawHorLine", _drawHorLine);
NSV8Objects::Template_Set(result, "drawHorLine2", _drawHorLine2);
NSV8Objects::Template_Set(result, "drawVerLine", _drawVerLine);
NSV8Objects::Template_Set(result, "drawHorLineExt", _drawHorLineExt);
NSV8Objects::Template_Set(result, "rect", _rect);
NSV8Objects::Template_Set(result, "TableRect", _TableRect);
NSV8Objects::Template_Set(result, "AddClipRect", _AddClipRect);
NSV8Objects::Template_Set(result, "RemoveClipRect", _RemoveClipRect);
NSV8Objects::Template_Set(result, "SetClip", _SetClip);
NSV8Objects::Template_Set(result, "RemoveClip", _RemoveClip);
NSV8Objects::Template_Set(result, "drawMailMergeField", _drawMailMergeField);
NSV8Objects::Template_Set(result, "drawSearchResult", _drawSearchResult);
NSV8Objects::Template_Set(result, "drawFlowAnchor", _drawFlowAnchor);
NSV8Objects::Template_Set(result, "SavePen", _SavePen);
NSV8Objects::Template_Set(result, "RestorePen", _RestorePen);
NSV8Objects::Template_Set(result, "SaveBrush", _SaveBrush);
NSV8Objects::Template_Set(result, "RestoreBrush", _RestoreBrush);
NSV8Objects::Template_Set(result, "SavePenBrush", _SavePenBrush);
NSV8Objects::Template_Set(result, "RestorePenBrush", _RestorePenBrush);
NSV8Objects::Template_Set(result, "SaveGrState", _SaveGrState);
NSV8Objects::Template_Set(result, "RestoreGrState", _RestoreGrState);
NSV8Objects::Template_Set(result, "StartClipPath", _StartClipPath);
NSV8Objects::Template_Set(result, "EndClipPath", _EndClipPath);
NSV8Objects::Template_Set(result, "StartCheckTableDraw", _StartCheckTableDraw);
NSV8Objects::Template_Set(result, "SetTextClipRect", _SetTextClipRect);
NSV8Objects::Template_Set(result, "AddSmartRect", _AddSmartRect);
NSV8Objects::Template_Set(result, "CheckUseFonts2", _CheckUseFonts2);
NSV8Objects::Template_Set(result, "UncheckUseFonts2", _UncheckUseFonts2);
NSV8Objects::Template_Set(result, "Drawing_StartCheckBounds", _Drawing_StartCheckBounds);
NSV8Objects::Template_Set(result, "Drawing_EndCheckBounds", _Drawing_EndCheckBounds);
NSV8Objects::Template_Set(result, "DrawPresentationComment", _DrawPresentationComment);
NSV8Objects::Template_Set(result, "DrawPolygon", _DrawPolygon);
NSV8Objects::Template_Set(result, "DrawFootnoteRect", _DrawFootnoteRect);
NSV8Objects::Template_Set(result, "toDataURL", _toDataURL);
NSV8Objects::Template_Set(result, "GetPenColor", _GetPenColor);
NSV8Objects::Template_Set(result, "GetBrushColor", _GetBrushColor);
NSV8Objects::Template_Set(result, "put_brushTexture", _put_brushTexture);
NSV8Objects::Template_Set(result, "put_brushTextureMode", _put_brushTextureMode);
NSV8Objects::Template_Set(result, "put_BrushTextureAlpha", _put_BrushTextureAlpha);
NSV8Objects::Template_Set(result, "put_BrushGradient", _put_BrushGradient);
NSV8Objects::Template_Set(result, "TransformPointX", _TransformPointX);
NSV8Objects::Template_Set(result, "TransformPointY", _TransformPointY);
NSV8Objects::Template_Set(result, "put_LineJoin", _put_LineJoin);
NSV8Objects::Template_Set(result, "get_LineJoin", _get_LineJoin);
NSV8Objects::Template_Set(result, "put_TextureBounds", _put_TextureBounds);
NSV8Objects::Template_Set(result, "GetlineWidth", _GetlineWidth);
NSV8Objects::Template_Set(result, "DrawPath", _DrawPath);
NSV8Objects::Template_Set(result, "CoordTransformOffset", _CoordTransformOffset);
NSV8Objects::Template_Set(result, "GetTransform", _GetTransform);
return handle_scope.Escape(result);
}
return handle_scope.Escape(result);
}
void CreateNativeGraphics(const v8::FunctionCallbackInfo<v8::Value>& args)
{
v8::Isolate* isolate = args.GetIsolate();
v8::HandleScope scope(isolate);
v8::Handle<v8::ObjectTemplate> GraphicsTemplate = NSGraphics::CreateGraphicsTemplate(isolate);
CGraphicsEmbed* pGraphics = new CGraphicsEmbed();
v8::Local<v8::Object> obj = GraphicsTemplate->NewInstance(isolate->GetCurrentContext()).ToLocalChecked();
obj->SetInternalField(0, v8::External::New(CV8Worker::GetCurrent(), pGraphics));
NSJSBase::CJSEmbedObjectPrivate::CreateWeaker(obj);
args.GetReturnValue().Set(obj);
}
void CreateNativeGraphics(const v8::FunctionCallbackInfo<v8::Value>& args)
{
CreateNativeInternalField(new CGraphicsEmbed(), NSGraphics::CreateGraphicsTemplate, args);
}
}
void CGraphicsEmbed::CreateObjectInContext(const std::string& name, JSSmart<CJSContext> context)
{
v8::Isolate* current = CV8Worker::GetCurrent();
context->m_internal->m_global->Set(current, name.c_str(), v8::FunctionTemplate::New(current, NSGraphics::CreateNativeGraphics));
InsertToGlobal(name, context, NSGraphics::CreateNativeGraphics);
}

View File

@ -0,0 +1,34 @@
#include "../HashEmbed.h"
#include "../../js_internal/v8/v8_base.h"
namespace NSHash
{
#define CURRENTWRAPPER CHashEmbed
FUNCTION_WRAPPER_V8_3(_hash, hash)
FUNCTION_WRAPPER_V8_4(_hash2, hash2)
v8::Handle<v8::ObjectTemplate> CreateHashTemplate(v8::Isolate* isolate)
{
v8::EscapableHandleScope handle_scope(isolate);
v8::Local<v8::ObjectTemplate> result = v8::ObjectTemplate::New(isolate);
result->SetInternalFieldCount(1);
// methods
NSV8Objects::Template_Set(result, "hash", _hash);
NSV8Objects::Template_Set(result, "hash2", _hash2);
return handle_scope.Escape(result);
}
void CreateNativeHash(const v8::FunctionCallbackInfo<v8::Value>& args)
{
CreateNativeInternalField(new CHashEmbed(), NSHash::CreateHashTemplate, args);
}
}
void CHashEmbed::CreateObjectInContext(const std::string& name, JSSmart<CJSContext> context)
{
InsertToGlobal(name, context, NSHash::CreateNativeHash);
}

View File

@ -3,68 +3,56 @@
namespace NSMemoryStream
{
#define CURRENTWRAPPER CMemoryStreamEmbed
#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)
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<v8::String> name, const v8::PropertyCallbackInfo<v8::Value>& args)
{
CMemoryStreamEmbed* _this = (CMemoryStreamEmbed*)unwrap_native(args.This());
args.GetReturnValue().Set(v8::Integer::New(CV8Worker::GetCurrent(), _this->m_pInternal->GetSize()));
}
void _ms_pos(v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Value>& args)
{
CMemoryStreamEmbed* _this = (CMemoryStreamEmbed*)unwrap_native(args.This());
args.GetReturnValue().Set(v8::Integer::New(CV8Worker::GetCurrent(), _this->m_pInternal->GetSize()));
}
v8::Handle<v8::ObjectTemplate> CreateMemoryStreamTemplate(v8::Isolate* isolate)
{
v8::EscapableHandleScope handle_scope(isolate);
v8::Handle<v8::ObjectTemplate> CreateMemoryStreamTemplate(v8::Isolate* isolate)
{
v8::EscapableHandleScope handle_scope(isolate);
v8::Local<v8::ObjectTemplate> result = v8::ObjectTemplate::New(V8IsolateOneArg);
result->SetInternalFieldCount(1);
v8::Local<v8::ObjectTemplate> result = v8::ObjectTemplate::New(V8IsolateOneArg);
result->SetInternalFieldCount(1);
// property
result->SetAccessor(CreateV8String(CV8Worker::GetCurrent(), "pos"), _ms_pos);
// 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);
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);
}
return handle_scope.Escape(result);
}
void CreateNativeMemoryStream(const v8::FunctionCallbackInfo<v8::Value>& args)
{
v8::Isolate* isolate = args.GetIsolate();
v8::HandleScope scope(isolate);
v8::Handle<v8::ObjectTemplate> MemoryObjectTemplate = NSMemoryStream::CreateMemoryStreamTemplate(isolate);
CMemoryStreamEmbed* pMemoryObject = new CMemoryStreamEmbed();
v8::Local<v8::Object> obj = MemoryObjectTemplate->NewInstance(isolate->GetCurrentContext()).ToLocalChecked();
obj->SetInternalField(0, v8::External::New(CV8Worker::GetCurrent(), pMemoryObject));
NSJSBase::CJSEmbedObjectPrivate::CreateWeaker(obj);
args.GetReturnValue().Set(obj);
}
}
void CreateNativeMemoryStream(const v8::FunctionCallbackInfo<v8::Value>& args)
{
CreateNativeInternalField(new CMemoryStreamEmbed(), NSMemoryStream::CreateMemoryStreamTemplate, args);
}
}
void CMemoryStreamEmbed::CreateObjectInContext(const std::string& name, JSSmart<CJSContext> context)
{
v8::Isolate* current = CV8Worker::GetCurrent();
context->m_internal->m_global->Set(current, name.c_str(), v8::FunctionTemplate::New(current, NSMemoryStream::CreateNativeMemoryStream));
InsertToGlobal(name, context, NSMemoryStream::CreateNativeMemoryStream);
}

View File

@ -53,62 +53,62 @@ FUNCTION_WRAPPER_V8(_builder_doc_GetImageMap, builder_doc_GetImageMap)
v8::Local<v8::Value> _builder_CreateNativeTmpDoc(v8::Isolate* isolate, NSDoctRenderer::CDocBuilder* pBuilder, const std::wstring& sFile, const std::wstring& sParams)
{
v8::Local<v8::ObjectTemplate> _template = v8::ObjectTemplate::New(isolate);
_template->SetInternalFieldCount(1); // отводим в нем место для хранения CNativeControl
v8::Local<v8::ObjectTemplate> _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);
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);
CBuilderDocumentEmbed* _embed = new CBuilderDocumentEmbed();
_embed->m_pBuilder = pBuilder;
_embed->OpenFile(sFile, sParams);
v8::Local<v8::Object> obj = _template->NewInstance(V8ContextOneArg).ToLocalChecked();
obj->SetInternalField(0, v8::External::New(isolate, _embed));
v8::Local<v8::Object> obj = _template->NewInstance(V8ContextOneArg).ToLocalChecked();
obj->SetInternalField(0, v8::External::New(isolate, _embed));
return obj;
return obj;
}
v8::Local<v8::Value> _builder_CreateNative(v8::Isolate* isolate, NSDoctRenderer::CDocBuilder* builder)
{
v8::Local<v8::ObjectTemplate> _template = v8::ObjectTemplate::New(isolate);
_template->SetInternalFieldCount(1);
v8::Local<v8::ObjectTemplate> _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);
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;
CBuilderEmbed* _embed = new CBuilderEmbed();
_embed->m_pBuilder = builder;
v8::Local<v8::Object> obj = _template->NewInstance(V8ContextOneArg).ToLocalChecked();
obj->SetInternalField(0, v8::External::New(isolate, _embed));
v8::Local<v8::Object> obj = _template->NewInstance(V8ContextOneArg).ToLocalChecked();
obj->SetInternalField(0, v8::External::New(isolate, _embed));
return obj;
return obj;
}
void builder_CreateNativeTmpDoc(const std::string& name, JSSmart<CJSContext> 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));
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<CJSContext> 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));
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<CJSValue> CBuilderEmbed::builder_OpenTmpFile(JSSmart<CJSValue> path, JSSmart<CJSValue> params)
{
std::wstring sPath = path->toStringW();
std::wstring sParams = params->toStringW();
v8::Local<v8::Value> obj = _builder_CreateNativeTmpDoc(CV8Worker::GetCurrent(), m_pBuilder, sPath, sParams);
CJSValueV8* res = new CJSValueV8();
res->value = obj;
return res;
std::wstring sPath = path->toStringW();
std::wstring sParams = params->toStringW();
v8::Local<v8::Value> obj = _builder_CreateNativeTmpDoc(CV8Worker::GetCurrent(), m_pBuilder, sPath, sParams);
CJSValueV8* res = new CJSValueV8();
res->value = obj;
return res;
}

View File

@ -108,54 +108,22 @@ namespace NSNativeControl
void CreateNativeObject(const v8::FunctionCallbackInfo<v8::Value>& args)
{
v8::Isolate* isolate = args.GetIsolate();
v8::HandleScope scope(isolate);
if (CIsolateAdditionalData::CheckSingletonType(isolate, CIsolateAdditionalData::iadtSingletonNative))
{
args.GetReturnValue().Set(v8::Undefined(isolate));
return;
}
v8::Handle<v8::ObjectTemplate> NativeObjectTemplate = CreateNativeControlTemplate(isolate);
CNativeControlEmbed* pNativeObject = new CNativeControlEmbed();
v8::Local<v8::Object> obj = NativeObjectTemplate->NewInstance(isolate->GetCurrentContext()).ToLocalChecked();
obj->SetInternalField(0, v8::External::New(CV8Worker::GetCurrent(), pNativeObject));
args.GetReturnValue().Set(obj);
CreateNativeInternalField(new CNativeControlEmbed(), CreateNativeControlTemplate, args, CIsolateAdditionalData::iadtSingletonNative);
}
// Без SaveChanges
void CreateNativeObjectBuilder(const v8::FunctionCallbackInfo<v8::Value>& args)
{
v8::Isolate* isolate = args.GetIsolate();
v8::HandleScope scope(isolate);
if (CIsolateAdditionalData::CheckSingletonType(isolate, CIsolateAdditionalData::iadtSingletonNative))
{
args.GetReturnValue().Set(v8::Undefined(isolate));
return;
}
v8::Handle<v8::ObjectTemplate> NativeObjectTemplate = CreateNativeControlTemplateBuilder(isolate);
CNativeControlEmbed* pNativeObject = new CNativeControlEmbed();
v8::Local<v8::Object> obj = NativeObjectTemplate->NewInstance(isolate->GetCurrentContext()).ToLocalChecked();
obj->SetInternalField(0, v8::External::New(CV8Worker::GetCurrent(), pNativeObject));
args.GetReturnValue().Set(obj);
CreateNativeInternalField(new CNativeControlEmbed(), CreateNativeControlTemplateBuilder, args, CIsolateAdditionalData::iadtSingletonNative);
}
}
void CNativeControlEmbed::CreateObjectInContext(const std::string& name, JSSmart<CJSContext> context)
{
v8::Isolate* current = CV8Worker::GetCurrent();
context->m_internal->m_global->Set(current, name.c_str(), v8::FunctionTemplate::New(current, NSNativeControl::CreateNativeObject));
InsertToGlobal(name, context, NSNativeControl::CreateNativeObject);
}
void CNativeControlEmbed::CreateObjectBuilderInContext(const std::string& name, JSSmart<CJSContext> context)
{
v8::Isolate* current = CV8Worker::GetCurrent();
context->m_internal->m_global->Set(current, name.c_str(), v8::FunctionTemplate::New(current, NSNativeControl::CreateNativeObjectBuilder));
InsertToGlobal(name, context, NSNativeControl::CreateNativeObjectBuilder);
}

View File

@ -3,30 +3,30 @@
v8::Handle<v8::ObjectTemplate> CreatePointerTemplate(v8::Isolate* isolate)
{
v8::EscapableHandleScope handle_scope(isolate);
v8::EscapableHandleScope handle_scope(isolate);
v8::Local<v8::ObjectTemplate> result = v8::ObjectTemplate::New(isolate);
result->SetInternalFieldCount(1);
v8::Local<v8::ObjectTemplate> result = v8::ObjectTemplate::New(isolate);
result->SetInternalFieldCount(1);
return handle_scope.Escape(result);
return handle_scope.Escape(result);
}
JSSmart<CJSValue> CPointerEmbedObject::createObject()
{
v8::Isolate* isolate = CV8Worker::GetCurrent();
//v8::HandleScope scope(isolate);
v8::Isolate* isolate = CV8Worker::GetCurrent();
//v8::HandleScope scope(isolate);
v8::Handle<v8::ObjectTemplate> pointerTemplate = v8::ObjectTemplate::New(isolate);
pointerTemplate->SetInternalFieldCount(1);
v8::Handle<v8::ObjectTemplate> pointerTemplate = v8::ObjectTemplate::New(isolate);
pointerTemplate->SetInternalFieldCount(1);
v8::Local<v8::Object> obj = pointerTemplate->NewInstance(isolate->GetCurrentContext()).ToLocalChecked();
obj->SetInternalField(0, v8::External::New(CV8Worker::GetCurrent(), this));
v8::Local<v8::Object> obj = pointerTemplate->NewInstance(isolate->GetCurrentContext()).ToLocalChecked();
obj->SetInternalField(0, v8::External::New(CV8Worker::GetCurrent(), this));
NSJSBase::CJSEmbedObjectPrivate::CreateWeaker(obj);
NSJSBase::CJSEmbedObjectPrivate::CreateWeaker(obj);
CJSValueV8* returnValue = new CJSValueV8();
returnValue->value = obj;
CJSValueV8* returnValue = new CJSValueV8();
returnValue->value = obj;
JSSmart<CJSValue> ret = returnValue;
return ret;
JSSmart<CJSValue> ret = returnValue;
return ret;
}

View File

@ -3,94 +3,82 @@
namespace NSMeasurer
{
#define CURRENTWRAPPER CTextMeasurerEmbed
#define CURRENTWRAPPER CTextMeasurerEmbed
FUNCTION_WRAPPER_V8_1(_FT_Malloc, FT_Malloc)
FUNCTION_WRAPPER_V8_1(_FT_Free, FT_Free)
FUNCTION_WRAPPER_V8_1(_FT_Malloc, FT_Malloc)
FUNCTION_WRAPPER_V8_1(_FT_Free, FT_Free)
FUNCTION_WRAPPER_V8 (_FT_Init, FT_Init)
FUNCTION_WRAPPER_V8_2(_FT_Set_TrueType_HintProp, FT_Set_TrueType_HintProp)
FUNCTION_WRAPPER_V8 (_FT_Init, FT_Init)
FUNCTION_WRAPPER_V8_2(_FT_Set_TrueType_HintProp, FT_Set_TrueType_HintProp)
FUNCTION_WRAPPER_V8_4(_FT_Open_Face, FT_Open_Face)
FUNCTION_WRAPPER_V8_3(_FT_Open_Face2, FT_Open_Face2)
FUNCTION_WRAPPER_V8_1(_FT_GetFaceInfo, FT_GetFaceInfo)
FUNCTION_WRAPPER_V8_4(_FT_Open_Face, FT_Open_Face)
FUNCTION_WRAPPER_V8_3(_FT_Open_Face2, FT_Open_Face2)
FUNCTION_WRAPPER_V8_1(_FT_GetFaceInfo, FT_GetFaceInfo)
FUNCTION_WRAPPER_V8_3(_FT_Load_Glyph, FT_Load_Glyph)
FUNCTION_WRAPPER_V8_2(_FT_Get_Glyph_Measure_Params, FT_Get_Glyph_Measure_Params)
FUNCTION_WRAPPER_V8_2(_FT_Get_Glyph_Render_Params, FT_Get_Glyph_Render_Params)
FUNCTION_WRAPPER_V8_2(_FT_Get_Glyph_Render_Buffer, FT_Get_Glyph_Render_Buffer)
FUNCTION_WRAPPER_V8_3(_FT_Load_Glyph, FT_Load_Glyph)
FUNCTION_WRAPPER_V8_2(_FT_Get_Glyph_Measure_Params, FT_Get_Glyph_Measure_Params)
FUNCTION_WRAPPER_V8_2(_FT_Get_Glyph_Render_Params, FT_Get_Glyph_Render_Params)
FUNCTION_WRAPPER_V8_2(_FT_Get_Glyph_Render_Buffer, FT_Get_Glyph_Render_Buffer)
FUNCTION_WRAPPER_V8_5(_FT_Set_Transform, FT_Set_Transform)
FUNCTION_WRAPPER_V8_5(_FT_Set_Char_Size, FT_Set_Char_Size)
FUNCTION_WRAPPER_V8_2(_FT_SetCMapForCharCode, FT_SetCMapForCharCode)
FUNCTION_WRAPPER_V8_3(_FT_GetKerningX, FT_GetKerningX)
FUNCTION_WRAPPER_V8_1(_FT_GetFaceMaxAdvanceX, FT_GetFaceMaxAdvanceX)
FUNCTION_WRAPPER_V8_5(_FT_Set_Transform, FT_Set_Transform)
FUNCTION_WRAPPER_V8_5(_FT_Set_Char_Size, FT_Set_Char_Size)
FUNCTION_WRAPPER_V8_2(_FT_SetCMapForCharCode, FT_SetCMapForCharCode)
FUNCTION_WRAPPER_V8_3(_FT_GetKerningX, FT_GetKerningX)
FUNCTION_WRAPPER_V8_1(_FT_GetFaceMaxAdvanceX, FT_GetFaceMaxAdvanceX)
#ifdef SUPPORT_HARFBUZZ_SHAPER
FUNCTION_WRAPPER_V8_1(_HB_LanguageFromString, HB_LanguageFromString)
FUNCTION_WRAPPER_V8_7(_HB_ShapeText, HB_ShapeText)
FUNCTION_WRAPPER_V8 (_HB_FontMalloc, HB_FontMalloc)
FUNCTION_WRAPPER_V8_1(_HB_FontFree, HB_FontFree)
FUNCTION_WRAPPER_V8_1(_HB_LanguageFromString, HB_LanguageFromString)
FUNCTION_WRAPPER_V8_7(_HB_ShapeText, HB_ShapeText)
FUNCTION_WRAPPER_V8 (_HB_FontMalloc, HB_FontMalloc)
FUNCTION_WRAPPER_V8_1(_HB_FontFree, HB_FontFree)
#endif
v8::Handle<v8::ObjectTemplate> CreateMeasurerTemplate(v8::Isolate* isolate)
{
v8::EscapableHandleScope handle_scope(isolate);
v8::Handle<v8::ObjectTemplate> CreateMeasurerTemplate(v8::Isolate* isolate)
{
v8::EscapableHandleScope handle_scope(isolate);
v8::Local<v8::ObjectTemplate> result = v8::ObjectTemplate::New(isolate);
result->SetInternalFieldCount(1);
v8::Local<v8::ObjectTemplate> result = v8::ObjectTemplate::New(isolate);
result->SetInternalFieldCount(1);
// методы
NSV8Objects::Template_Set(result, "FT_Malloc", _FT_Malloc);
NSV8Objects::Template_Set(result, "FT_Free", _FT_Free);
// методы
NSV8Objects::Template_Set(result, "FT_Malloc", _FT_Malloc);
NSV8Objects::Template_Set(result, "FT_Free", _FT_Free);
NSV8Objects::Template_Set(result, "FT_Init", _FT_Init);
NSV8Objects::Template_Set(result, "FT_Set_TrueType_HintProp", _FT_Set_TrueType_HintProp);
NSV8Objects::Template_Set(result, "FT_Init", _FT_Init);
NSV8Objects::Template_Set(result, "FT_Set_TrueType_HintProp", _FT_Set_TrueType_HintProp);
NSV8Objects::Template_Set(result, "FT_Open_Face", _FT_Open_Face);
NSV8Objects::Template_Set(result, "FT_Open_Face2", _FT_Open_Face2);
NSV8Objects::Template_Set(result, "FT_GetFaceInfo", _FT_GetFaceInfo);
NSV8Objects::Template_Set(result, "FT_Open_Face", _FT_Open_Face);
NSV8Objects::Template_Set(result, "FT_Open_Face2", _FT_Open_Face2);
NSV8Objects::Template_Set(result, "FT_GetFaceInfo", _FT_GetFaceInfo);
NSV8Objects::Template_Set(result, "FT_Load_Glyph", _FT_Load_Glyph);
NSV8Objects::Template_Set(result, "FT_Get_Glyph_Measure_Params",_FT_Get_Glyph_Measure_Params);
NSV8Objects::Template_Set(result, "FT_Get_Glyph_Render_Params", _FT_Get_Glyph_Render_Params);
NSV8Objects::Template_Set(result, "FT_Get_Glyph_Render_Buffer", _FT_Get_Glyph_Render_Buffer);
NSV8Objects::Template_Set(result, "FT_Load_Glyph", _FT_Load_Glyph);
NSV8Objects::Template_Set(result, "FT_Get_Glyph_Measure_Params",_FT_Get_Glyph_Measure_Params);
NSV8Objects::Template_Set(result, "FT_Get_Glyph_Render_Params", _FT_Get_Glyph_Render_Params);
NSV8Objects::Template_Set(result, "FT_Get_Glyph_Render_Buffer", _FT_Get_Glyph_Render_Buffer);
NSV8Objects::Template_Set(result, "FT_Set_Transform", _FT_Set_Transform);
NSV8Objects::Template_Set(result, "FT_Set_Char_Size", _FT_Set_Char_Size);
NSV8Objects::Template_Set(result, "FT_SetCMapForCharCode", _FT_SetCMapForCharCode);
NSV8Objects::Template_Set(result, "FT_GetKerningX", _FT_GetKerningX);
NSV8Objects::Template_Set(result, "FT_GetFaceMaxAdvanceX", _FT_GetFaceMaxAdvanceX);
NSV8Objects::Template_Set(result, "FT_Set_Transform", _FT_Set_Transform);
NSV8Objects::Template_Set(result, "FT_Set_Char_Size", _FT_Set_Char_Size);
NSV8Objects::Template_Set(result, "FT_SetCMapForCharCode", _FT_SetCMapForCharCode);
NSV8Objects::Template_Set(result, "FT_GetKerningX", _FT_GetKerningX);
NSV8Objects::Template_Set(result, "FT_GetFaceMaxAdvanceX", _FT_GetFaceMaxAdvanceX);
#ifdef SUPPORT_HARFBUZZ_SHAPER
NSV8Objects::Template_Set(result, "HB_LanguageFromString", _HB_LanguageFromString);
NSV8Objects::Template_Set(result, "HB_ShapeText", _HB_ShapeText);
NSV8Objects::Template_Set(result, "HB_FontMalloc", _HB_FontMalloc);
NSV8Objects::Template_Set(result, "HB_FontFree", _HB_FontFree);
NSV8Objects::Template_Set(result, "HB_LanguageFromString", _HB_LanguageFromString);
NSV8Objects::Template_Set(result, "HB_ShapeText", _HB_ShapeText);
NSV8Objects::Template_Set(result, "HB_FontMalloc", _HB_FontMalloc);
NSV8Objects::Template_Set(result, "HB_FontFree", _HB_FontFree);
#endif
return handle_scope.Escape(result);
}
return handle_scope.Escape(result);
}
void CreateNativeMeasurer(const v8::FunctionCallbackInfo<v8::Value>& args)
{
v8::Isolate* isolate = args.GetIsolate();
v8::HandleScope scope(isolate);
v8::Handle<v8::ObjectTemplate> MeasurerTemplate = CreateMeasurerTemplate(isolate);
CTextMeasurerEmbed* pMeasurer = new CTextMeasurerEmbed();
v8::Local<v8::Object> obj = MeasurerTemplate->NewInstance(isolate->GetCurrentContext()).ToLocalChecked();
obj->SetInternalField(0, v8::External::New(CV8Worker::GetCurrent(), pMeasurer));
NSJSBase::CJSEmbedObjectPrivate::CreateWeaker(obj);
args.GetReturnValue().Set(obj);
}
void CreateNativeMeasurer(const v8::FunctionCallbackInfo<v8::Value>& args)
{
CreateNativeInternalField(new CTextMeasurerEmbed(), CreateMeasurerTemplate, args);
}
}
void CTextMeasurerEmbed::CreateObjectInContext(const std::string& name, JSSmart<CJSContext> context)
{
v8::Isolate* current = CV8Worker::GetCurrent();
context->m_internal->m_global->Set(current, name.c_str(), v8::FunctionTemplate::New(current, NSMeasurer::CreateNativeMeasurer));
InsertToGlobal(name, context, NSMeasurer::CreateNativeMeasurer);
}

View File

@ -46,23 +46,11 @@ namespace NSZip
void CreateNativeZip(const v8::FunctionCallbackInfo<v8::Value>& args)
{
v8::Isolate* isolate = args.GetIsolate();
v8::HandleScope scope(isolate);
v8::Handle<v8::ObjectTemplate> ZipTemplate = NSZip::CreateZipTemplate(isolate);
CZipEmbed* pZip = new CZipEmbed();
v8::Local<v8::Object> obj = ZipTemplate->NewInstance(isolate->GetCurrentContext()).ToLocalChecked();
obj->SetInternalField(0, v8::External::New(CV8Worker::GetCurrent(), pZip));
NSJSBase::CJSEmbedObjectPrivate::CreateWeaker(obj);
args.GetReturnValue().Set(obj);
CreateNativeInternalField(new CZipEmbed(), NSZip::CreateZipTemplate, args);
}
}
void CZipEmbed::CreateObjectInContext(const std::string& name, JSSmart<CJSContext> context)
{
v8::Isolate* current = CV8Worker::GetCurrent();
context->m_internal->m_global->Set(current, name.c_str(), v8::FunctionTemplate::New(current, NSZip::CreateNativeZip));
InsertToGlobal(name, context, NSZip::CreateNativeZip);
}

View File

@ -0,0 +1,401 @@
#include "hash.h"
#ifndef OWN_BASE_64
#include "../common/Base64.h"
#endif
#include "openssl/sha.h"
#include "openssl/md2.h"
#include "openssl/md4.h"
#include "openssl/md5.h"
#include "openssl/whrlpool.h"
#include "openssl/ripemd.h"
#include <cstring>
#include <memory>
int CHash::getDigestLength(HashAlgs alg)
{
static const int aDigestLengths[] = { 16, 16, 16, 20, 20, 32, 48, 64, 64 };
return aDigestLengths[alg];
}
CHash::CHash(std::function<void*(size_t)> allocator) : m_fAllocator(allocator)
{
}
CHash::~CHash()
{
}
unsigned char* CHash::hash(const unsigned char* data, int size, int alg)
{
unsigned int nBufLen = 0;
unsigned char* pBufData = NULL;
size_t d = (size_t)size;
switch (alg)
{
case haMD2:
{
nBufLen = 16;
pBufData = (unsigned char*)m_fAllocator(nBufLen);
MD2(data, d, pBufData);
break;
}
case haMD4:
{
nBufLen = 16;
pBufData = (unsigned char*)m_fAllocator(nBufLen);
MD4(data, d, pBufData);
break;
}
case haMD5:
{
nBufLen = 16;
pBufData = (unsigned char*)m_fAllocator(nBufLen);
MD5(data, d, pBufData);
break;
}
case haRMD160:
{
nBufLen = 20;
pBufData = (unsigned char*)m_fAllocator(nBufLen);
RIPEMD160(data, d, pBufData);
break;
}
case haSHA1:
{
nBufLen = 20;
pBufData = (unsigned char*)m_fAllocator(nBufLen);
SHA1(data, d, pBufData);
break;
}
case haSHA256:
{
nBufLen = 32;
pBufData = (unsigned char*)m_fAllocator(nBufLen);
SHA256(data, d, pBufData);
break;
}
case haSHA384:
{
nBufLen = 48;
pBufData = (unsigned char*)m_fAllocator(nBufLen);
SHA384(data, d, pBufData);
break;
}
case haSHA512:
{
nBufLen = 64;
pBufData = (unsigned char*)m_fAllocator(nBufLen);
SHA512(data, d, pBufData);
break;
}
case haWHIRLPOOL:
{
nBufLen = 64;
pBufData = (unsigned char*)m_fAllocator(nBufLen);
WHIRLPOOL(data, d, pBufData);
break;
}
default:
break;
}
return pBufData;
}
namespace NSUtfs
{
#define WriteUtf16_byte(code, p) \
*p++ = code & 0xFF; \
*p++ = (code >> 8) & 0xFF;
#define WriteUtf16(code, p) \
if (code < 0x10000) \
{ \
WriteUtf16_byte(code, p) \
} \
else \
{ \
code -= 0x10000; \
WriteUtf16_byte((0xD800 | ((code >> 10) & 0x03FF)), p); \
WriteUtf16_byte((0xDC00 | (code & 0x03FF)), p); \
}
void Utf8_to_utf16le(const char* utf8, unsigned char*& utf16, size_t& utf16_len)
{
size_t utf8_count = std::strlen(utf8);
utf16 = (unsigned char*)malloc(utf8_count * 2);
unsigned char* utf16_cur = utf16;
size_t index = 0;
while (index < utf8_count)
{
unsigned char byteMain = utf8[index];
if (0x00 == (byteMain & 0x80))
{
// 1 byte
WriteUtf16(byteMain, utf16_cur);
++index;
}
else if (0x00 == (byteMain & 0x20))
{
// 2 byte
int val = 0;
if ((index + 1) < utf8_count)
{
val = (int)(((byteMain & 0x1F) << 6) |
(utf8[index + 1] & 0x3F));
}
WriteUtf16(val, utf16_cur);
index += 2;
}
else if (0x00 == (byteMain & 0x10))
{
// 3 byte
int val = 0;
if ((index + 2) < utf8_count)
{
val = (int)(((byteMain & 0x0F) << 12) |
((utf8[index + 1] & 0x3F) << 6) |
(utf8[index + 2] & 0x3F));
}
WriteUtf16(val, utf16_cur);
index += 3;
}
else if (0x00 == (byteMain & 0x0F))
{
// 4 byte
int val = 0;
if ((index + 3) < utf8_count)
{
val = (int)(((byteMain & 0x07) << 18) |
((utf8[index + 1] & 0x3F) << 12) |
((utf8[index + 2] & 0x3F) << 6) |
(utf8[index + 3] & 0x3F));
}
WriteUtf16(val, utf16_cur);
index += 4;
}
else if (0x00 == (byteMain & 0x08))
{
// 4 byte
int val = 0;
if ((index + 3) < utf8_count)
{
val = (int)(((byteMain & 0x07) << 18) |
((utf8[index + 1] & 0x3F) << 12) |
((utf8[index + 2] & 0x3F) << 6) |
(utf8[index + 3] & 0x3F));
}
WriteUtf16(val, utf16_cur);
index += 4;
}
else if (0x00 == (byteMain & 0x04))
{
// 5 byte
int val = 0;
if ((index + 4) < utf8_count)
{
val = (int)(((byteMain & 0x03) << 24) |
((utf8[index + 1] & 0x3F) << 18) |
((utf8[index + 2] & 0x3F) << 12) |
((utf8[index + 3] & 0x3F) << 6) |
(utf8[index + 4] & 0x3F));
}
WriteUtf16(val, utf16_cur);
index += 5;
}
else
{
// 6 byte
int val = 0;
if ((index + 5) < utf8_count)
{
val = (int)(((byteMain & 0x01) << 30) |
((utf8[index + 1] & 0x3F) << 24) |
((utf8[index + 2] & 0x3F) << 18) |
((utf8[index + 3] & 0x3F) << 12) |
((utf8[index + 4] & 0x3F) << 6) |
(utf8[index + 5] & 0x3F));
}
WriteUtf16(val, utf16_cur);
index += 5;
}
}
utf16_len = (int)(utf16_cur - utf16);
}
}
void hash_iteration(unsigned char*& input, int iter, unsigned char*& tmp, int alg, size_t alg_size)
{
input[alg_size] = 0xFF & (iter >> 0);
input[alg_size + 1] = 0xFF & (iter >> 8);
input[alg_size + 2] = 0xFF & (iter >> 16);
input[alg_size + 3] = 0xFF & (iter >> 24);
switch (alg)
{
case CHash::haMD2:
{
MD2(input, alg_size + 4, tmp);
break;
}
case CHash::haMD4:
{
MD4(input, alg_size + 4, tmp);
break;
}
case CHash::haMD5:
{
MD5(input, alg_size + 4, tmp);
break;
}
case CHash::haRMD160:
{
RIPEMD160(input, alg_size + 4, tmp);
break;
}
case CHash::haSHA1:
{
SHA1(input, alg_size + 4, tmp);
break;
}
case CHash::haSHA256:
{
SHA256(input, alg_size + 4, tmp);
break;
}
case CHash::haSHA384:
{
SHA384(input, alg_size + 4, tmp);
break;
}
case CHash::haSHA512:
{
SHA512(input, alg_size + 4, tmp);
break;
}
case CHash::haWHIRLPOOL:
{
WHIRLPOOL(input, alg_size + 4, tmp);
break;
}
default:
break;
}
unsigned char* mem = input;
input = tmp;
tmp = mem;
}
unsigned char* CHash::hash2(const char* password, const char* salt, int spinCount, int alg)
{
int inputSaltLen = std::strlen(salt);
unsigned char* passwordUtf16 = NULL;
size_t passwordUtf16Len = 0;
NSUtfs::Utf8_to_utf16le(password, passwordUtf16, passwordUtf16Len);
int inputDataLen = inputSaltLen + passwordUtf16Len;
unsigned char* inputData = (unsigned char*)malloc(inputDataLen);
NSBase64::Base64Decode(salt, inputSaltLen, inputData, &inputDataLen);
memcpy(inputData + inputDataLen, passwordUtf16, passwordUtf16Len);
inputDataLen += passwordUtf16Len;
free(passwordUtf16);
size_t alg_size = 0;
unsigned char* pBuffer1 = NULL;
switch (alg)
{
case haMD2:
{
alg_size = 16;
pBuffer1 = (unsigned char*)m_fAllocator(alg_size + 4);
MD2(inputData, inputDataLen, pBuffer1);
break;
}
case haMD4:
{
alg_size = 16;
pBuffer1 = (unsigned char*)m_fAllocator(alg_size + 4);
MD4(inputData, inputDataLen, pBuffer1);
break;
}
case haMD5:
{
alg_size = 16;
pBuffer1 = (unsigned char*)m_fAllocator(alg_size + 4);
MD5(inputData, inputDataLen, pBuffer1);
break;
}
case haRMD160:
{
alg_size = 20;
pBuffer1 = (unsigned char*)m_fAllocator(alg_size + 4);
RIPEMD160(inputData, inputDataLen, pBuffer1);
break;
}
case haSHA1:
{
alg_size = 20;
pBuffer1 = (unsigned char*)m_fAllocator(alg_size + 4);
SHA1(inputData, inputDataLen, pBuffer1);
break;
}
case haSHA256:
{
alg_size = 32;
pBuffer1 = (unsigned char*)m_fAllocator(alg_size + 4);
SHA256(inputData, inputDataLen, pBuffer1);
break;
}
case haSHA384:
{
alg_size = 48;
pBuffer1 = (unsigned char*)m_fAllocator(alg_size + 4);
SHA384(inputData, inputDataLen, pBuffer1);
break;
}
case haSHA512:
{
alg_size = 64;
pBuffer1 = (unsigned char*)m_fAllocator(alg_size + 4);
SHA512(inputData, inputDataLen, pBuffer1);
break;
}
case haWHIRLPOOL:
{
alg_size = 64;
pBuffer1 = (unsigned char*)m_fAllocator(alg_size + 4);
WHIRLPOOL(inputData, inputDataLen, pBuffer1);
break;
}
default:
break;
}
free(inputData);
if (0 == spinCount)
return pBuffer1;
unsigned char* pBuffer2 = (unsigned char*)malloc(alg_size + 4);
for (int i = 0; i < spinCount; ++i)
{
hash_iteration(pBuffer1, i, pBuffer2, alg, alg_size);
}
free(pBuffer2);
return pBuffer1;
}

View File

@ -0,0 +1,42 @@
#ifndef NSHASH_H
#define NSHASH_H
#include <functional>
#include "./common.h"
// hide algs into lib
namespace NSHash
{
void BUILDER_DECL hash_internal(const unsigned char* src, unsigned char* dst, size_t size, int alg);
}
class BUILDER_DECL CHash
{
public:
enum HashAlgs
{
haMD2 = 0,
haMD4 = 1,
haMD5 = 2,
haRMD160 = 3,
haSHA1 = 4,
haSHA256 = 5,
haSHA384 = 6,
haSHA512 = 7,
haWHIRLPOOL = 8
};
static int getDigestLength(HashAlgs alg);
public:
CHash(std::function<void*(size_t)> allocator);
~CHash();
unsigned char* hash(const unsigned char* data, int size, int alg);
unsigned char* hash2(const char* password, const char* salt, int spinCount, int alg);
private:
std::function<void*(size_t)> m_fAllocator;
};
#endif // NSHASH_H

View File

@ -0,0 +1,135 @@
#include "js_base.h"
namespace NSJSBase {
CJSValue::CJSValue()
{
}
CJSValue::~CJSValue()
{
}
JSSmart<CJSObject> CJSValue::toObjectSmart()
{
return toObject();
}
CJSEmbedObjectPrivateBase::CJSEmbedObjectPrivateBase()
{
}
CJSEmbedObjectPrivateBase::~CJSEmbedObjectPrivateBase()
{
}
CJSEmbedObject::CJSEmbedObject()
{
embed_native_internal = NULL;
}
CJSEmbedObject::~CJSEmbedObject()
{
RELEASEOBJECT(embed_native_internal);
}
void* CJSEmbedObject::getObject()
{
return NULL;
}
CJSObject::CJSObject()
{
}
CJSObject::~CJSObject()
{
}
CJSArray::CJSArray()
{
}
CJSArray::~CJSArray()
{
}
BYTE* CJSDataBuffer::Copy()
{
if (0 == Len)
return NULL;
BYTE* pMem = new BYTE[Len];
if (!pMem)
return NULL;
memcpy(pMem, Data, Len);
return pMem;
}
CJSDataBuffer::CJSDataBuffer()
{
Data = NULL;
Len = 0;
IsExternalize = false;
}
void CJSDataBuffer::Free()
{
if (Data)
{
NSAllocator::Free(Data, Len);
Data = NULL;
}
}
CJSTypedArray::CJSTypedArray(BYTE* data, int count)
{
}
CJSTypedArray::~CJSTypedArray()
{
}
CJSFunction::CJSFunction()
{
}
CJSFunction::~CJSFunction()
{
}
CJSTryCatch::CJSTryCatch()
{
}
CJSTryCatch::~CJSTryCatch()
{
}
CJSValue* CJSContext::createUint8Array(const std::wstring& sFilePath)
{
NSFile::CFileBinary oFileBinary;
if (oFileBinary.OpenFile(sFilePath))
{
long nFileSize = oFileBinary.GetFileSize();
BYTE* pData = NSAllocator::Alloc((size_t)nFileSize);
DWORD dwSizeRead;
if (oFileBinary.ReadFile(pData, (DWORD)nFileSize, dwSizeRead))
{
return CJSContext::createUint8Array(pData, (int)nFileSize, false);
}
NSAllocator::Free(pData, (size_t)nFileSize);
}
return CJSContext::createNull();
}
CJSContextScope::CJSContextScope(JSSmart<CJSContext> context) : m_context(context)
{
m_context->Enter();
}
CJSContextScope::~CJSContextScope()
{
m_context->Exit();
}
}

View File

@ -6,6 +6,20 @@
#include "../../../OOXML/Base/SmartPtr.h"
#include "../../graphics/BaseThread.h"
// disable export (ios/android problem (external embed objects))
#define JSBASE_NO_USE_DYNAMIC_LIBRARY
#ifdef JSBASE_NO_USE_DYNAMIC_LIBRARY
#define JS_DECL
#else
#include "../../common/base_export.h"
#ifdef JSBASE_USE_DYNAMIC_LIBRARY_BUILDING
#define JS_DECL Q_DECL_EXPORT
#else
#define JS_DECL Q_DECL_IMPORT
#endif
#endif
#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())
@ -14,285 +28,235 @@ using JSSmart = NSCommon::smart_ptr<T>;
namespace NSJSBase
{
class CJSObject;
class CJSArray;
class CJSTypedArray;
class CJSFunction;
class CJSObject;
class CJSArray;
class CJSTypedArray;
class CJSFunction;
class CJSValue
{
public:
CJSValue() {}
virtual ~CJSValue() {}
class JS_DECL 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 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 void doUndefined() = 0;
virtual void doNull() = 0;
virtual bool toBool() = 0;
virtual int toInt32() = 0;
virtual unsigned int toUInt32() = 0;
virtual double toDouble() = 0;
virtual std::string toStringA() = 0;
virtual std::wstring toStringW() = 0;
virtual bool toBool() = 0;
virtual int toInt32() = 0;
virtual unsigned int toUInt32() = 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;
virtual CJSObject* toObject() = 0;
virtual CJSArray* toArray() = 0;
virtual CJSTypedArray* toTypedArray() = 0;
virtual CJSFunction* toFunction() = 0;
virtual JSSmart<CJSObject> toObjectSmart() { return toObject(); }
};
virtual JSSmart<CJSObject> toObjectSmart();
};
class CJSEmbedObjectPrivateBase
{
public:
CJSEmbedObjectPrivateBase() {}
virtual ~CJSEmbedObjectPrivateBase() {}
};
class JS_DECL CJSEmbedObjectPrivateBase
{
public:
CJSEmbedObjectPrivateBase();
virtual ~CJSEmbedObjectPrivateBase();
};
class CJSEmbedObject
{
public:
CJSEmbedObject() { embed_native_internal = NULL; }
virtual ~CJSEmbedObject() { RELEASEOBJECT(embed_native_internal); }
class JS_DECL CJSEmbedObject
{
public:
CJSEmbedObject();
virtual ~CJSEmbedObject();
public:
virtual void* getObject() { return NULL; }
public:
virtual void* getObject();
protected:
CJSEmbedObjectPrivateBase* embed_native_internal;
protected:
CJSEmbedObjectPrivateBase* embed_native_internal;
friend class CJSEmbedObjectPrivateBase;
friend class CJSEmbedObjectPrivate;
};
friend class CJSEmbedObjectPrivateBase;
friend class CJSEmbedObjectPrivate;
};
class CJSObject : public CJSValue
{
public:
CJSObject() {}
virtual ~CJSObject() {}
class JS_DECL CJSObject : public CJSValue
{
public:
CJSObject();
virtual ~CJSObject();
virtual CJSValue* get(const char* name) = 0;
virtual void set(const char* name, CJSValue* value) = 0;
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 void set(const char* name, const int& value) = 0;
virtual void set(const char* name, const double& value) = 0;
virtual CJSEmbedObject* getNative() = 0;
virtual CJSEmbedObject* getNative() = 0;
virtual JSSmart<CJSValue> call_func(const char* name, const int argc = 0, JSSmart<CJSValue> argv[] = NULL) = 0;
virtual JSSmart<CJSValue> toValue() = 0;
};
virtual JSSmart<CJSValue> call_func(const char* name, const int argc = 0, JSSmart<CJSValue> argv[] = NULL) = 0;
virtual JSSmart<CJSValue> toValue() = 0;
};
class CJSArray : public CJSValue
{
public:
CJSArray() {}
virtual ~CJSArray() {}
class JS_DECL CJSArray : public CJSValue
{
public:
CJSArray();
virtual ~CJSArray();
virtual int getCount() = 0;
virtual JSSmart<CJSValue> 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 int getCount() = 0;
virtual JSSmart<CJSValue> 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<CJSValue> toValue() = 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<CJSValue> toValue() = 0;
};
namespace NSAllocator
{
unsigned char* Alloc(const size_t& size);
void Free(unsigned char* data, const size_t& size);
}
namespace NSAllocator
{
unsigned char* Alloc(const size_t& size);
void Free(unsigned char* data, const size_t& size);
}
class CJSDataBuffer
{
public:
BYTE* Data;
size_t Len;
class JS_DECL CJSDataBuffer
{
public:
BYTE* Data;
size_t Len;
bool IsExternalize;
bool IsExternalize;
public:
BYTE* Copy()
{
if (0 == Len)
return NULL;
BYTE* pMem = new BYTE[Len];
if (!pMem)
return NULL;
public:
BYTE* Copy();
CJSDataBuffer();
void Free();
};
memcpy(pMem, Data, Len);
return pMem;
}
CJSDataBuffer()
{
Data = NULL;
Len = 0;
IsExternalize = false;
}
void Free()
{
if (Data)
{
NSAllocator::Free(Data, Len);
Data = NULL;
}
}
};
class JS_DECL CJSTypedArray : public CJSValue
{
public:
CJSTypedArray(BYTE* data = NULL, int count = 0);
virtual ~CJSTypedArray();
class CJSTypedArray : public CJSValue
{
public:
CJSTypedArray(BYTE* data = NULL, int count = 0) {}
virtual ~CJSTypedArray() {}
virtual int getCount() = 0;
virtual CJSDataBuffer getData() = 0;
virtual JSSmart<CJSValue> toValue() = 0;
};
virtual int getCount() = 0;
virtual CJSDataBuffer getData() = 0;
virtual JSSmart<CJSValue> toValue() = 0;
};
class JS_DECL CJSFunction : public CJSValue
{
public:
CJSFunction();
virtual ~CJSFunction();
class CJSFunction : public CJSValue
{
public:
CJSFunction() {}
virtual ~CJSFunction() {}
virtual CJSValue* Call(CJSValue* recv, int argc, JSSmart<CJSValue> argv[]) = 0;
};
virtual CJSValue* Call(CJSValue* recv, int argc, JSSmart<CJSValue> argv[]) = 0;
};
class JS_DECL CJSTryCatch
{
public:
CJSTryCatch();
virtual ~CJSTryCatch();
virtual bool Check() = 0;
};
class CJSTryCatch
{
public:
CJSTryCatch() {}
virtual ~CJSTryCatch() {}
virtual bool Check() = 0;
};
class CJSContextPrivate;
class JS_DECL CJSContext
{
public:
CJSContextPrivate* m_internal;
class CJSIsolateScope
{
public:
CJSIsolateScope()
{
}
virtual ~CJSIsolateScope()
{
}
};
public:
CJSContext(const bool& bIsInitialize = true);
~CJSContext();
class CJSContextScope
{
public:
CJSContextScope()
{
}
virtual ~CJSContextScope()
{
}
};
void Initialize();
void Dispose();
class CJSLocalScope
{
public:
CJSLocalScope()
{
}
virtual ~CJSLocalScope()
{
}
};
CJSTryCatch* GetExceptions();
class CJSContextPrivate;
class CJSContext
{
public:
CJSContextPrivate* m_internal;
void CreateContext();
CJSObject* GetGlobal();
public:
CJSContext();
~CJSContext();
// Use this methods before working with needed context if you want to work with multiple contexts simultaneously (or use CJSContextScope)
void Enter();
void Exit();
void Initialize();
void Dispose();
JSSmart<CJSValue> runScript(const std::string& script, JSSmart<CJSTryCatch> exception = NULL, const std::wstring& scriptPath = std::wstring(L""));
CJSValue* JSON_Parse(const char* json_content);
void MoveToThread(ASC_THREAD_ID* id = NULL);
CJSTryCatch* GetExceptions();
public:
static CJSValue* createUndefined();
static CJSValue* createNull();
static CJSValue* createBool(const bool& value);
static CJSValue* createInt(const int& value);
static CJSValue* createUInt(const unsigned int& value);
static CJSValue* createDouble(const double& value);
static CJSValue* createString(const char* value, const int& length = -1);
static CJSValue* createString(const wchar_t* value, const int& length = -1);
static CJSValue* createString(const std::string& value);
static CJSValue* createString(const std::wstring& value);
void CreateContext();
void CreateGlobalForContext();
CJSObject* GetGlobal();
static CJSObject* createObject();
CJSIsolateScope* CreateIsolateScope();
CJSContextScope* CreateContextScope();
CJSLocalScope* CreateLocalScope();
static CJSArray* createArray(const int& count);
JSSmart<CJSValue> runScript(const std::string& script, JSSmart<CJSTryCatch> exception = NULL, const std::wstring& scriptPath = std::wstring(L""));
CJSValue* JSON_Parse(const char* json_content);
void MoveToThread(ASC_THREAD_ID* id = NULL);
static CJSTypedArray* createUint8Array(BYTE* data = NULL, int count = 0, const bool& isExternalize = true);
public:
static CJSValue* createUndefined();
static CJSValue* createNull();
static CJSValue* createBool(const bool& value);
static CJSValue* createInt(const int& value);
static CJSValue* createUInt(const unsigned int& value);
static CJSValue* createDouble(const double& value);
static CJSValue* createString(const char* value, const int& length = -1);
static CJSValue* createString(const wchar_t* value, const int& length = -1);
static CJSValue* createString(const std::string& value);
static CJSValue* createString(const std::wstring& value);
static CJSValue* createUint8Array(const std::wstring& sFilePath);
static CJSObject* createObject();
public:
static JSSmart<CJSContext> GetCurrent();
static CJSArray* createArray(const int& count);
public:
static void ExternalInitialize(const std::wstring& sDirectory);
static void ExternalDispose();
static bool IsSupportNativeTypedArrays();
};
static CJSTypedArray* createUint8Array(BYTE* data = NULL, int count = 0, const bool& isExternalize = true);
class CJSLocalScopePrivate;
class JS_DECL CJSLocalScope
{
public:
CJSLocalScopePrivate* m_internal;
static CJSValue* createUint8Array(const std::wstring& sFilePath)
{
NSFile::CFileBinary oFileBinary;
if (oFileBinary.OpenFile(sFilePath))
{
long nFileSize = oFileBinary.GetFileSize();
BYTE* pData = NSAllocator::Alloc((size_t)nFileSize);
DWORD dwSizeRead;
if (oFileBinary.ReadFile(pData, (DWORD)nFileSize, dwSizeRead))
{
return CJSContext::createUint8Array(pData, (int)nFileSize, false);
}
NSAllocator::Free(pData, (size_t)nFileSize);
}
return CJSContext::createNull();
}
public:
CJSLocalScope();
~CJSLocalScope();
};
public:
static CJSContext* GetCurrent();
class JS_DECL CJSContextScope
{
public:
JSSmart<CJSContext> m_context;
public:
static void ExternalInitialize(const std::wstring& sDirectory);
static void ExternalDispose();
static bool IsSupportNativeTypedArrays();
};
public:
CJSContextScope(JSSmart<CJSContext> context);
~CJSContextScope();
};
}
#endif // _CORE_EXT_JS_BASE_H_

View File

@ -8,6 +8,7 @@ core_ios {
INCLUDEPATH += $$PWD
HEADERS += $$PWD/js_base.h
SOURCES += $$PWD/js_base.cpp
HEADERS += $$PWD/js_logger.h
SOURCES += $$PWD/js_logger.cpp
@ -17,6 +18,15 @@ SOURCES += $$PWD/js_logger.cpp
HEADERS += $$PWD/v8/v8_base.h
SOURCES += $$PWD/v8/v8_base.cpp
core_mac:CONFIG += disable_v8_use_inspector
core_android:CONFIG += disable_v8_use_inspector
linux_arm64:CONFIG += disable_v8_use_inspector
build_xp::CONFIG += disable_v8_use_inspector
core_android:CONFIG += v8_version_60
!disable_v8_use_inspector:CONFIG += v8_use_inspector
!build_xp {
include($$PWD/../../../Common/3dParty/v8/v8.pri)
} else {
@ -25,30 +35,28 @@ SOURCES += $$PWD/js_logger.cpp
}
v8_use_inspector {
#define
core_windows:DEFINES += WIN32_LEAN_AND_MEAN
DEFINES += V8_INSPECTOR
#paths
V8_INSPECTOR_PATH = $$PWD/v8/inspector
#inspector files
HEADERS += \
$$V8_INSPECTOR_PATH/channel.h \
$$V8_INSPECTOR_PATH/client.h \
$$V8_INSPECTOR_PATH/inspector_impl.h \
$$V8_INSPECTOR_PATH/singleconnectionserver.h \
$$V8_INSPECTOR_PATH/singlethreadutils.h \
$$V8_INSPECTOR_PATH/inspector_pool.h \
$$V8_INSPECTOR_PATH/inspector_interface.h
SOURCES += \
$$V8_INSPECTOR_PATH/channel.cpp \
$$V8_INSPECTOR_PATH/client.cpp \
$$V8_INSPECTOR_PATH/inspector_impl.cpp \
$$V8_INSPECTOR_PATH/singleconnectionserver.cpp \
$$V8_INSPECTOR_PATH/singlethreadutils.cpp \
$$V8_INSPECTOR_PATH/inspector_pool.cpp \
$$V8_INSPECTOR_PATH/inspector_interface.cpp
$$V8_INSPECTOR_PATH/inspector.cpp \
$$V8_INSPECTOR_PATH/utils.cpp \
$$V8_INSPECTOR_PATH/v8_inspector_channel.cpp \
$$V8_INSPECTOR_PATH/v8_inspector_client.cpp \
$$V8_INSPECTOR_PATH/websocket_server.cpp
HEADERS += \
$$V8_INSPECTOR_PATH/inspector.h \
$$V8_INSPECTOR_PATH/inspector_pool.h \
$$V8_INSPECTOR_PATH/utils.h\
$$V8_INSPECTOR_PATH/v8_inspector_channel.h \
$$V8_INSPECTOR_PATH/v8_inspector_client.h \
$$V8_INSPECTOR_PATH/websocket_server.h
#to include inspector files
@ -60,6 +68,10 @@ SOURCES += $$PWD/js_logger.cpp
LIBS += -L$$CORE_V8_PATH_LIBS/src/inspector -linspector
}
core_linux {
LIBS += -lpthread
}
#boost
CONFIG += core_boost_date_time
include($$PWD/../../../Common/3dParty/boost/boost.pri)

View File

@ -5,31 +5,31 @@
namespace NSJSBase
{
std::string g_logger_file = NSSystemUtils::GetEnvVariableA(L"js_speed");
bool g_logger_enabled = g_logger_file.empty() ? false : true;
unsigned long g_logger_time = 0;
std::string g_logger_file = NSSystemUtils::GetEnvVariableA(L"js_speed");
bool g_logger_enabled = g_logger_file.empty() ? false : true;
unsigned long g_logger_time = 0;
void LOGGER_START_FUNC()
{
g_logger_time = NSTimers::GetTickCount();
}
void LOGGER_LAP_FUNC(const char* details)
{
if (!g_logger_enabled)
return;
unsigned long dwCur = (unsigned long)NSTimers::GetTickCount();
void LOGGER_START_FUNC()
{
g_logger_time = NSTimers::GetTickCount();
}
void LOGGER_LAP_FUNC(const char* details)
{
if (!g_logger_enabled)
return;
unsigned long dwCur = (unsigned long)NSTimers::GetTickCount();
if (g_logger_file.length() == 1)
{
printf(details);
printf(": %d\n", (int)(dwCur - g_logger_time));
}
else
{
FILE* f = fopen(g_logger_file.c_str(), "a+");
fprintf(f, "%s: %d\n", details, (int)(dwCur - g_logger_time));
fclose(f);
}
g_logger_time = dwCur;
}
if (g_logger_file.length() == 1)
{
printf(details);
printf(": %d\n", (int)(dwCur - g_logger_time));
}
else
{
FILE* f = fopen(g_logger_file.c_str(), "a+");
fprintf(f, "%s: %d\n", details, (int)(dwCur - g_logger_time));
fclose(f);
}
g_logger_time = dwCur;
}
}

View File

@ -5,8 +5,8 @@
namespace NSJSBase
{
void LOGGER_START_FUNC();
void LOGGER_LAP_FUNC(const char* details);
void LOGGER_START_FUNC();
void LOGGER_LAP_FUNC(const char* details);
}
#if 1

View File

@ -197,9 +197,11 @@ std::wstring CJSValueJSCTemplate<T>::toStringW()
namespace NSJSBase
{
CJSContext::CJSContext()
CJSContext::CJSContext(const bool& bIsInitialize)
{
m_internal = new CJSContextPrivate();
if (bIsInitialize)
Initialize();
}
CJSContext::~CJSContext()
{
@ -222,6 +224,9 @@ namespace NSJSBase
{
[m_internal->context evaluateScript:@"function jsc_toBase64(r){for(var o=[\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\",\"I\",\"J\",\"K\",\"L\",\"M\",\"N\",\"O\",\"P\",\"Q\",\"R\",\"S\",\"T\",\"U\",\"V\",\"W\",\"X\",\"Y\",\"Z\",\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\",\"h\",\"i\",\"j\",\"k\",\"l\",\"m\",\"n\",\"o\",\"p\",\"q\",\"r\",\"s\",\"t\",\"u\",\"v\",\"w\",\"x\",\"y\",\"z\",\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"+\",\"/\"],a=r.length,f=4*(a/3>>0),n=f/76>>0,t=19,v=0,e=[],i=\"\",s=0;s<=n;s++){s==n&&(t=f%76/4>>0);for(var u=0;u<t;u++){for(var c=0,h=0;h<3;h++)c|=r[0+v++],c<<=8;i=\"\";for(var A=0;A<4;A++){i+=o[c>>>26&255],c<<=6,c&=4294967295}e.push(i)}}if(n=a%3!=0?a%3+1:0){for(c=0,h=0;h<3;h++)h<a%3&&(c|=r[0+v++]),c<<=8;i=\"\";for(A=0;A<n;A++){i+=o[c>>>26&255],c<<=6}t=0!=n?4-n:0;for(u=0;u<t;u++)i+=\"=\";e.push(i)}return e.join(\"\")}function jsc_fromBase64(r,o){for(var a,f=r.length,n=0,t=new Array(void 0===o?f:o),v=t,e=0,i=0;e<f;){for(var s=0,u=0,c=0;c<4&&!(f<=e);c++){var h=65<=(a=r.charCodeAt(e++))&&a<=90?a-65:97<=a&&a<=122?a-71:48<=a&&a<=57?a+4:43==a?62:47==a?63:-1;-1!=h?(s<<=6,s|=h,u+=6):c--}for(s<<=24-u,i=u>>>3,c=0;c<i;c++)v[n++]=(16711680&s)>>>16,s<<=8}return t}\n"];
}
JSValue* global_js = [m_internal->context globalObject];
[global_js setValue:global_js forProperty:[[NSString alloc] initWithUTF8String:"window"]];
}
void CJSContext::Dispose()
{
@ -237,11 +242,6 @@ namespace NSJSBase
// NONE
}
void CJSContext::CreateGlobalForContext()
{
// NONE
}
CJSObject* CJSContext::GetGlobal()
{
CJSObjectJSC* ret = new CJSObjectJSC();
@ -249,31 +249,6 @@ namespace NSJSBase
return ret;
}
CJSIsolateScope* CJSContext::CreateIsolateScope()
{
#if 0
// FOR DEBUG
[m_internal->context setExceptionHandler:^(JSContext *context, JSValue *value) {
NSLog(@"%@", value);
}];
#endif
return new CJSIsolateScope();
}
CJSContextScope* CJSContext::CreateContextScope()
{
CJSContextScope* pScope = new CJSContextScope();
JSValue* global_js = [m_internal->context globalObject];
[global_js setValue:global_js forProperty:[[NSString alloc] initWithUTF8String:"window"]];
return pScope;
}
CJSLocalScope* CJSContext::CreateLocalScope()
{
return new CJSLocalScope();
}
CJSValue* CJSContext::createUndefined()
{
CJSValueJSC* _value = new CJSValueJSC();
@ -380,7 +355,7 @@ namespace NSJSBase
free(data);
}
CJSContext* CJSContext::GetCurrent()
JSSmart<CJSContext> CJSContext::GetCurrent()
{
CJSContext* ret = new CJSContext();
ret->m_internal->context = NSJSBase::CJSContextPrivate::GetCurrentContext();
@ -419,6 +394,32 @@ namespace NSJSBase
m_internal->m_arThreads.push_back((NULL == id) ? NSThreads::GetCurrentThreadId() : *id);
}
}
void CJSContext::Enter()
{
}
void CJSContext::Exit()
{
}
class CJSLocalScopePrivate
{
public:
CJSLocalScopePrivate()
{
}
~CJSLocalScopePrivate()
{
}
};
CJSLocalScope::CJSLocalScope() : m_internal(nullptr)
{
}
CJSLocalScope::~CJSLocalScope()
{
}
}
namespace NSJSBase

View File

@ -1,28 +0,0 @@
#include "channel.h"
NSJSBase::v8_debug::internal::CInspectorChannel::CInspectorChannel(sendDataCallback sendData)
: m_SendData(std::move(sendData))
{
//
}
void NSJSBase::v8_debug::internal::CInspectorChannel::sendResponse(int callId
, std::unique_ptr<v8_inspector::StringBuffer> message)
{
if (message) {
m_SendData(message->string());
}
}
void NSJSBase::v8_debug::internal::CInspectorChannel::sendNotification(
std::unique_ptr<v8_inspector::StringBuffer> message)
{
if (message) {
m_SendData(message->string());
}
}
void NSJSBase::v8_debug::internal::CInspectorChannel::flushProtocolNotifications()
{
//do nothing
}

View File

@ -1,35 +0,0 @@
#ifndef CHANNEL_H
#define CHANNEL_H
#include <v8-inspector.h>//v8_inspector stuff
#include <functional>//std::function
namespace NSJSBase {
namespace v8_debug {
namespace internal {
//class that sends messages to frontend
class CInspectorChannel : public v8_inspector::V8Inspector::Channel
{
public:
using sendDataCallback = std::function<void(const v8_inspector::StringView&)>;
private:
sendDataCallback m_SendData{};
public:
CInspectorChannel(sendDataCallback sendData);
//send message to frontend through socket
virtual void sendResponse(int callId,
std::unique_ptr<v8_inspector::StringBuffer> message) override;
virtual void sendNotification(std::unique_ptr<v8_inspector::StringBuffer> message) override;
//may do nothing
virtual void flushProtocolNotifications() override;
};
}//namespace internal
}//namespace v8_debug
}//namespace NSJSBase
#endif // CHANNEL_H

View File

@ -1,256 +0,0 @@
#include "client.h"
#include "channel.h"//client holds channel
#include "singlethreadutils.h"//converting strings
#include <libplatform/libplatform.h>//v8::Platform
#include "inspector_impl.h"//to interact with inspector
#include <iostream>//std::cout
namespace {
//use it in loop
class TrueSetter {
bool &m_bool;
public:
TrueSetter(bool &b) : m_bool(b) {m_bool = true;}
~TrueSetter() {m_bool = false;}
};
}
void NSJSBase::v8_debug::internal::CInspectorClient::setUpDebuggingSession(
const std::string &contextName
)
{
//client instance is this
//channel
m_pChannel = std::make_unique<CInspectorChannel>(
[this](const v8_inspector::StringView &message) {
m_pInspectingWrapper->sendData(message);
}
);
//inspector
m_pInspector = v8_inspector::V8Inspector::create(m_pIsolate, this);
//state for session
v8_inspector::StringView state{};
//session
m_pSession = m_pInspector->connect(m_iContextGroupId, m_pChannel.get(), state);
//register context in v8 inspector
m_pInspector->contextCreated({m_Context, m_iContextGroupId, strToView(contextName)});
}
void NSJSBase::v8_debug::internal::CInspectorClient::pumpPlatform()
{
while (v8::platform::PumpMessageLoop(m_pPlatform, m_pIsolate)) {
//just pump until pumped
}
}
void NSJSBase::v8_debug::internal::CInspectorClient::runMessageLoopOnPause(
int
) {
//no nested calls
if (m_bPause) {
return;
}
TrueSetter f(m_bPause);
while (m_bPause) {
//while not paused by cdt or cdt disconnected
if (
!m_pInspectingWrapper->waitForMessage()
) {
break;
}
//
pumpPlatform();
}
}
void NSJSBase::v8_debug::internal::CInspectorClient::quitMessageLoopOnPause() {
m_bPause = false;
}
void NSJSBase::v8_debug::internal::CInspectorClient::processFrontendMessage(
const std::string &message
)
{
//send message to V8 internals
dispatchProtocolMessage(message);
//check it for notable stuff
checkFrontendMessage(message);
}
void NSJSBase::v8_debug::internal::CInspectorClient::checkFrontendMessage(const std::string &message)
{
std::string method = getMethod(m_Context, message);
//если сервер не готов - смотрим сообщение о готовности
if (!m_bServerReady) {
if (serverReadyMessage == method) {
m_bServerReady = true;
m_pInspectingWrapper->onServerReady();
}
return;
}
//если пауза поставлена из v8, то ничего не смотрим
if (!m_bMySessionPause) {
return;
}
//3
//ждём первого сообщения о постановке/снятии брейкпойнта
//остальные придут на паузе
//если Runtime.getProperties пришёл до этого, снимаемся с паузы
if (m_bBreakpointAdded) {
if (isBreakpointAlterMethod(method)) {
m_bBreakpointAlterMethodCame = true;
if (m_bResumeOnBreakpointCame) {
return resumeDebuggingSession();
}
return;
}
}
//1
//если пришёл Debugger.setBreakpointsActive
if (activateBreakpointsMethod == method) {
//и active == true
if (isActiveTrue(message)) {
//ставим флаг, что ждём изменения брейкпойнтов
m_bBreakpointAdded = true;
}
return;
}
//функции вызываются чаще, первыми проверяем их
if (funcResumeMessageLate == method) {
//если ждём изменения брейкпойнтов, запоминаем, что Runtime.getProperties пришёл
if (m_bBreakpointAdded) {
m_bResumeOnBreakpointCame = true;
//если сообщение об изменении брейкпойнтов пришло до этого, снимаемся с паузы
if (m_bBreakpointAlterMethodCame) {
return resumeDebuggingSession();
}
return;
} else {
return resumeDebuggingSession();
}
}
//проверяем скрипт
if (scriptResumeMessage == method) {
return resumeDebuggingSession();
}
}
NSJSBase::v8_debug::internal::CInspectorClient::~CInspectorClient() {
//если не релизить, она дважды удаляется, и программа падает на выходе
m_pSession.release();
}
void NSJSBase::v8_debug::internal::CInspectorClient::maybeLogIncoming(
const std::string &message) const
{
if (!m_bLog) {
return;
}
//log incoming message
logCdtMessage(std::cout, message);
}
void NSJSBase::v8_debug::internal::CInspectorClient::pauseOnNextStatement()
{
m_bMySessionPause = true;
m_pSession->schedulePauseOnNextStatement(strToView("other"), {});
}
void NSJSBase::v8_debug::internal::CInspectorClient::resumeDebuggingSession()
{
//manual pause setting flag
m_bMySessionPause = false;
//breakpoint altering flags
m_bBreakpointAdded = false;
m_bBreakpointAlterMethodCame = false;
m_bResumeOnBreakpointCame = false;
m_pSession->resume();
}
bool NSJSBase::v8_debug::internal::CInspectorClient::isBreakpointAlterMethod(const std::string &method)
{
return method == setBreakpointMethod || method == removeBreakpointMethod;
}
bool NSJSBase::v8_debug::internal::CInspectorClient::isActiveTrue(const std::string &message)
{
v8::Local<v8::Value> params = getJsonProperty(m_Context, message, "params");
if (params.IsEmpty()) {
return false;
}
if (!params->IsObject()) {
return false;
}
v8::MaybeLocal<v8::Object> maybeObj = params->ToObject(m_Context);
if (maybeObj.IsEmpty()) {
return false;
}
v8::Local<v8::Object> obj = maybeObj.ToLocalChecked();
v8::Local<v8::Value> active = getJsonPropertyImpl(m_Context, obj, "active");
if (active.IsEmpty()) {
return false;
}
if (!active->IsBoolean()){
return false;
}
v8::MaybeLocal<v8::Boolean> maybeBool = active->ToBoolean(m_Context);
if (maybeBool.IsEmpty()) {
return false;
}
v8::Local<v8::Boolean> result = maybeBool.ToLocalChecked();
return result->IsTrue();
}
void NSJSBase::v8_debug::internal::CInspectorClient::dispatchProtocolMessage(
const std::string &message)
{
maybeLogIncoming(message);
m_pSession->dispatchProtocolMessage(strToView(message));
}
NSJSBase::v8_debug::internal::CInspectorClient::CInspectorClient(
//for v8 inspector
v8::Local<v8::Context> context,
//for cdt
const std::string &contextName
//somewhat
, int contextGroupId
//to pump platform on pause
, v8::Platform *platform
//to interact with inspector, which holds client
, CInspectorImpl *inspector
//
, bool log
)
//v8 stuff
: m_Context{context}
, m_pIsolate{m_Context->GetIsolate()}
, m_pPlatform{platform}
//callbacks
, m_pInspectingWrapper{inspector}
//logging
, m_bLog(log)
//somewhat
, m_iContextGroupId{contextGroupId}
{
setUpDebuggingSession(contextName);
}

View File

@ -1,126 +0,0 @@
#ifndef CLIENT_H
#define CLIENT_H
#include <v8-inspector.h>//v8_inspector stuff
#include "channel.h"//CChannel for debug session
namespace NSJSBase {
namespace v8_debug {
namespace internal {
//inspector holds client, but instead of using callbacks client directly accesses inspector
//it's safe due to inspector and client living in the same thread
//and inspector managing lifetime of client, but not vice versa
class CInspectorImpl;
//class that is intended to synchronously consume frontend messages on pause
//it also sets up the debugging session
class CInspectorClient : public v8_inspector::V8InspectorClient
{
//notable cdt messages
static constexpr char serverReadyMessage[32] {"Runtime.runIfWaitingForDebugger"};
static constexpr char scriptResumeMessage[25] {"Debugger.getScriptSource"};
static constexpr char funcResumeMessageEarly[35] {"Overlay.setPausedInDebuggerMessage"};
static constexpr char funcResumeMessageLate[22] {"Runtime.getProperties"};
static constexpr char activateBreakpointsMethod[30] {"Debugger.setBreakpointsActive"};
static constexpr char setBreakpointMethod[23] {"Debugger.setBreakpoint"};
static constexpr char removeBreakpointMethod[26] {"Debugger.removeBreakpoint"};
static constexpr char getPossibleBreakpointsMethod[32] {"Debugger.getPossibleBreakpoints"};
//v8 stuff
v8::Local<v8::Context> m_Context{};//to register context in inspector
v8::Isolate *m_pIsolate{nullptr};//to create inspector
v8::Platform *m_pPlatform{nullptr};//to pump platform on pause
//debug state
bool m_bServerReady{false};
bool m_bMySessionPause{false};
//debug session data
std::unique_ptr<v8_inspector::V8Inspector> m_pInspector{nullptr};
std::unique_ptr<v8_inspector::V8Inspector::Channel> m_pChannel{nullptr};
std::unique_ptr<v8_inspector::V8InspectorSession> m_pSession{nullptr};
//сообщения об изменении брейкпойнтов могут приходить в любом порядке
//поэтому вместо конечного автомата просто флаги
bool m_bBreakpointAdded{false};
bool m_bBreakpointAlterMethodCame{false};
bool m_bResumeOnBreakpointCame{false};
//message loop flag
bool m_bPause{false};
//to interact with superior class which holds all the stuff, including client
CInspectorImpl *m_pInspectingWrapper{nullptr};
//log
bool m_bLog{false};
//idk what is intended for
const int m_iContextGroupId;
//sets up a debugging session
void setUpDebuggingSession(const std::string &contextName);
//pumps platform on pause
void pumpPlatform();
//logs incoming message
void maybeLogIncoming(const std::string &message) const;
//client's duty to send protocol messages to v8 internals
void dispatchProtocolMessage(const std::string &message);
//check for pause flags
void checkFrontendMessage(const std::string &message);
//
void resumeDebuggingSession();
//
bool isBreakpointAlterMethod(const std::string &method);
bool isActiveTrue(const std::string &message);
public:
CInspectorClient() = delete;
CInspectorClient(const CInspectorClient&) = delete;
CInspectorClient(CInspectorClient&&) = delete;
CInspectorClient& operator=(const CInspectorClient&) = delete;
CInspectorClient& operator=(CInspectorClient&&) = delete;
CInspectorClient(
v8::Local<v8::Context> context,
//for cdt
const std::string &contextName
//somewhat
, int contextGroupId
//to pump it
, v8::Platform *platform
//to interact with inspector, which holds client
, CInspectorImpl *inspector
//
, bool log
);
//api for v8 internals
virtual void runMessageLoopOnPause(int contextGroupId) override;
virtual void quitMessageLoopOnPause() override;
//dispatch and check message
void processFrontendMessage(const std::string &message);
//api for inspector: schedule pause on next statement
void pauseOnNextStatement();
~CInspectorClient();
};
}//namespace internal
}//namespace v8_debug
}//namespace NSJSBase
#endif // CLIENT_H

View File

@ -0,0 +1,18 @@
function main() {
console.log('Hello, ChromeDevTools!');
console.log("I heard you're an amazing tool! I'm here to play with you!");
for (var i = 1; i <= 5; ++i) {
console.log(i + " * " + i + " = " + i * i);
}
var a = 7;
var b = 5;
var c = a * b;
console.log(a + " * " + b + " = " + c);
}
var sayHi = function (name) {
return "Hi, " + name;
};
main();
sayHi('Foo');

View File

@ -0,0 +1,76 @@
#include "inspector.h"
#include "../v8_base.h"
#include "utils.h"
namespace NSJSBase
{
CInspector::CInspector(v8::Isolate* pIsolate, int nContextGroupId)
: m_pIsolate(pIsolate)
{
m_pWebsocketServer.reset(
new CWebSocketServer(
std::bind(&CInspector::onMessage, this, std::placeholders::_1)
)
);
m_pIspectorClient.reset(
new CV8InspectorClientImpl(
CV8Worker::getInitializer().getPlatform(),
m_pIsolate,
nContextGroupId,
std::bind(&CInspector::sendMessage, this, std::placeholders::_1),
std::bind(&CInspector::waitForFrontendMessage, this)
)
);
m_pWebsocketServer->connect();
}
void CInspector::onMessage(std::string& sMessage)
{
v8::Local<v8::Object> oJsonObject = parseJson(m_pIsolate->GetCurrentContext(), sMessage);
if (!oJsonObject.IsEmpty())
{
std::string sMethod = getPropertyFromJson(m_pIsolate, oJsonObject, "method");
if (sMethod == "Runtime.runIfWaitingForDebugger")
{
m_pWebsocketServer->isServerReady_ = true;
}
#ifdef V8_VERSION_89_PLUS
#else
// In older version of V8 there is an eror "Either url or urlRegex must be specified." on trying to set a breakpoint in CDT.
// So we have to specify it explicitly before "lineNumber" param
else if (sMethod == "Debugger.setBreakpointByUrl" && sMessage.find("\"url") == sMessage.npos)
{
int pos = sMessage.find("\"lineNumber\"");
sMessage.insert(pos, "\"url\":\"\",");
}
#endif
}
v8_inspector::StringView oProtocolMessage = convertToStringView(sMessage);
m_pIspectorClient->dispatchProtocolMessage(oProtocolMessage);
}
void CInspector::sendMessage(const std::string& sMessage)
{
m_pWebsocketServer->sendMessage(sMessage);
}
void CInspector::startAgent(bool bIsBreakOnStart)
{
if (bIsBreakOnStart)
{
m_pIspectorClient->schedulePauseOnNextStatement(convertToStringView("debugging"));
}
}
bool CInspector::waitForFrontendMessage()
{
m_pWebsocketServer->waitForFrontendMessageOnPause();
return true;
}
}

View File

@ -0,0 +1,41 @@
#ifndef INSPECTOR_H
#define INSPECTOR_H
#include "websocket_server.h"
#include "v8_inspector_client.h"
#include <functional>
// To use inspector set V8_USE_INSPECTOR environment variable to any non-zero value
// Unset V8_USE_INSPECTOR or set it to '0' for disabling the inspector
// Inspector code structure based on "V8 Inspector simple examle" from this repository:
// https://github.com/ahmadov/v8_inspector_example
namespace NSJSBase
{
class CInspector
{
private:
// pointer to V8 isolate in which scripts/functions are executed
v8::Isolate* m_pIsolate;
std::unique_ptr<CWebSocketServer> m_pWebsocketServer;
std::unique_ptr<CV8InspectorClientImpl> m_pIspectorClient;
private:
void onMessage(std::string& sMessage);
void sendMessage(const std::string& sMessage);
bool waitForFrontendMessage();
public:
CInspector(v8::Isolate* pIsolate, int nContextGroupId);
void startAgent(bool bIsBreakOnStart = true);
};
}
#endif // INSPECTOR_H

View File

@ -0,0 +1,31 @@
QT -= core
QT -= gui
TARGET = test
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
CONFIG += core_static_link_libstd
CORE_ROOT_DIR = $$PWD/../../../../../../core
PWD_ROOT_DIR = $$PWD
include($$CORE_ROOT_DIR/Common/base.pri)
############### destination path ###############
DESTDIR = $$PWD/build
################################################
ADD_DEPENDENCY(kernel, UnicodeConverter, doctrenderer)
core_linux {
LIBS += -Wl,-unresolved-symbols=ignore-in-shared-libs
LIBS += -ldl
}
SOURCES += main.cpp
# cout logs
DEFINES += LOG_TO_COUT

View File

@ -1,119 +0,0 @@
#include "inspector_impl.h"
#include <iostream>//std::cout
#include "singlethreadutils.h"//string conversion
bool NSJSBase::v8_debug::internal::CInspectorImpl::initServer()
{
//set on message callback
auto messageCallback = [this](const std::string &message) {
if (!message.empty()) {
m_Client.processFrontendMessage(message);
}
};
m_Server.setOnMessageCallback(messageCallback);
//listen
return m_Server.listen();
}
bool NSJSBase::v8_debug::internal::CInspectorImpl::connectServer()
{
printChromeLaunchHint(std::cout, m_Server.port());
return m_Server.waitForConnection();
}
void NSJSBase::v8_debug::internal::CInspectorImpl::waitWhileServerReady()
{
m_Server.run();
}
void NSJSBase::v8_debug::internal::CInspectorImpl::maybeLogOutgoing(
const std::string &message) const
{
if (!m_bLog) {
return;
}
logOutgoingMessage(std::cout, message);
}
void NSJSBase::v8_debug::internal::CInspectorImpl::printChromeLaunchHint(
std::ostream &out
, uint16_t port)
{
out << "chrome "
<< "--remote-debugging-port=9222 "
<< "http://localhost:9222/devtools/inspector.html?ws=localhost:"
<< port
<< std::endl;
}
void NSJSBase::v8_debug::internal::CInspectorImpl::sendData(const v8_inspector::StringView &message)
{
//не отправляем пустые сообщения
if (message.length() == 0) {
return;
}
std::string str = internal::viewToStr(
m_pIsolate
, message);
//
maybeLogOutgoing(str);
//
this->m_Server.sendData(str);
}
bool NSJSBase::v8_debug::internal::CInspectorImpl::waitForMessage()
{
return m_Server.waitAndProcessMessage();
}
void NSJSBase::v8_debug::internal::CInspectorImpl::onServerReady()
{
//когда сервак готов, ставим его на паузу и идём дальше по плюсовому коду
m_Server.pause();
}
void NSJSBase::v8_debug::internal::CInspectorImpl::prepareServer()
{
//ждём, когда юзер законнектится
if (!connectServer()) {
return;
}
//прокидываем первые неинтересные сообщения
waitWhileServerReady();
}
void NSJSBase::v8_debug::internal::CInspectorImpl::beforeLaunch()
{
//перед запуском кода ставим паузу в его начале
m_Client.pauseOnNextStatement();
}
NSJSBase::v8_debug::internal::CInspectorImpl::CInspectorImpl(
//
v8::Local<v8::Context> context
//platform to pump
, v8::Platform *platform
//
, uint16_t port
, int contextGroupId
, const std::string &contextName
, bool log
)
: m_Server{port}
, m_pIsolate{context->GetIsolate()}
, m_bLog{log}
, m_Client{context, contextName, contextGroupId, platform, this, log}
{
//аттачим acceptor к эндпойнту прямо в конструкторе
if (!initServer()) {
std::cerr << "server can't listen to incoming connections" << std::endl;
return;
}
}
NSJSBase::v8_debug::internal::CInspectorImpl::~CInspectorImpl() {
if (m_Server.listening() && m_Server.connected()) {
m_Server.shutdown();
}
}

View File

@ -1,78 +0,0 @@
#ifndef INSPECTOR_IMPL_H
#define INSPECTOR_IMPL_H
//здесь лежат бустовые хедеры, он должен быть включён выше всех
#include "singleconnectionserver.h"//CSingleConnectionServer
#include "client.h"//inspector is what holds client
namespace NSJSBase {
namespace v8_debug {
namespace internal {
class CInspectorImpl
{
//server
CSingleConnectionServer m_Server;
//to convert v8 string view to string
v8::Isolate *m_pIsolate{nullptr};// для viewToStr
//logging protocol messages
bool m_bLog{false};
//сам клиент
CInspectorClient m_Client;
//сервер
bool initServer();
bool connectServer();
void waitWhileServerReady();
//logging and hints
void maybeLogOutgoing(const std::string &message) const;
void printChromeLaunchHint(std::ostream &out
, uint16_t port);
public:
//explicitly delete all the stuff
CInspectorImpl(const CInspectorImpl&) = delete;
CInspectorImpl(CInspectorImpl&&) = delete;
CInspectorImpl& operator=(const CInspectorImpl&) = delete;
CInspectorImpl& operator=(CInspectorImpl&&) = delete;
//only allowed ctor
CInspectorImpl(
//context for client
v8::Local<v8::Context> context
//platform to pump
, v8::Platform *platform
//port to connect to
, uint16_t port
//some stuff for cdt and v8 internals
, int contextGroupId
, const std::string &contextName
//
, bool log
);
//api for inspector client
void sendData(const v8_inspector::StringView &message);
bool waitForMessage();
void onServerReady();
//necessary to call before using inspector
void prepareServer();
//before debugged code
void beforeLaunch();
~CInspectorImpl();
};
}//namespace internal
}//namespace v8_debug
}//namespace NSJSBase
#endif // INSPECTOR_IMPL_H

View File

@ -1,12 +0,0 @@
#include "inspector_interface.h"
#include "inspector_pool.h"//to get inspectors
void NSJSBase::v8_debug::before(const v8::Local<v8::Context> &context
, v8::Platform *platform
, const std::string &contextName) {
internal::CInspectorPool::get().getInspector(context, platform, contextName).beforeLaunch();
}
void NSJSBase::v8_debug::disposeInspector(const v8::Local<v8::Context> &context) {
internal::CInspectorPool::get().disposeInspector(context);
}

View File

@ -1,18 +0,0 @@
#ifndef INSPECTOR_INTERFACE_H
#define INSPECTOR_INTERFACE_H
#include <v8.h>
//simplified to the limit interface
//also required to avoid cyclic dependency
namespace NSJSBase {
namespace v8_debug {
void before(const v8::Local<v8::Context> &context, v8::Platform *platform, const std::string &contextName);
void disposeInspector(const v8::Local<v8::Context> &context);
}//namespace v8_debug
}//namespace NSJSBase
#endif // INSPECTOR_INTERFACE_H

View File

@ -1,68 +1,55 @@
#include "inspector_pool.h"
NSJSBase::v8_debug::internal::CInspectorPool::CInspectorPool() = default;
#include "../v8_base.h"
NSJSBase::v8_debug::internal::CInspectorPool::~CInspectorPool() = default;
NSJSBase::v8_debug::internal::CInspectorImpl&
NSJSBase::v8_debug::internal::CInspectorPool::addInspector(v8::Local<v8::Context> context
, v8::Platform *platform
, const std::string &contextName)
namespace NSJSBase
{
std::pair<storage_t::iterator, bool> result = m_Inspectors.emplace(
std::piecewise_construct
, std::forward_as_tuple(context)
, std::forward_as_tuple(
context
, platform
, getPort()
, getContextGroupId()
, contextName
, m_bLog
)
);
CInspectorImpl &inspector = result.first->second;
inspector.prepareServer();
return inspector;
}
uint16_t NSJSBase::v8_debug::internal::CInspectorPool::getPort()
{
static std::atomic<uint16_t> initialPort{8080};
return initialPort++;
}
CInspector& CInspectorPool::addInspector(v8::Isolate* pIsolate)
{
std::pair<storage_t::iterator, bool> result = m_Inspectors.emplace(
std::piecewise_construct
, std::forward_as_tuple(pIsolate)
, std::forward_as_tuple(
pIsolate
, getContextGroupId()
)
);
CInspector& oInspector = result.first->second;
return oInspector;
}
int NSJSBase::v8_debug::internal::CInspectorPool::getContextGroupId()
{
static std::atomic<int> initialId{1};
return initialId++;
}
int CInspectorPool::getContextGroupId()
{
static int nInitialId{1};
return nInitialId++;
}
NSJSBase::v8_debug::internal::CInspectorImpl&
NSJSBase::v8_debug::internal::CInspectorPool::getInspector(v8::Local<v8::Context> context
, v8::Platform *platform
, const std::string &contextName)
{
std::lock_guard<std::mutex> lock{m_Mutex};
storage_t::iterator iter = m_Inspectors.find(context);
if (m_Inspectors.end() == iter) {
return addInspector(context, platform, contextName);
}
return iter->second;
}
CInspector&
CInspectorPool::getInspector(v8::Isolate* pIsolate)
{
storage_t::iterator iter = m_Inspectors.find(pIsolate);
if (iter == m_Inspectors.end())
{
return addInspector(pIsolate);
}
return iter->second;
}
void NSJSBase::v8_debug::internal::CInspectorPool::disposeInspector(v8::Local<v8::Context> context)
{
std::lock_guard<std::mutex> lock{m_Mutex};
storage_t::iterator iter = m_Inspectors.find(context);
if (m_Inspectors.end() != iter) {
m_Inspectors.erase(iter);
}
}
void CInspectorPool::disposeInspector(v8::Isolate* pIsolate)
{
storage_t::iterator iter = m_Inspectors.find(pIsolate);
if (m_Inspectors.end() != iter)
{
m_Inspectors.erase(iter);
}
}
CInspectorPool&
CInspectorPool::get()
{
static CInspectorPool oPool;
return oPool;
}
NSJSBase::v8_debug::internal::CInspectorPool&
NSJSBase::v8_debug::internal::CInspectorPool::get()
{
static CInspectorPool pool;
return pool;
}

View File

@ -1,64 +1,43 @@
#ifndef CINSPECTORPOOL_H
#define CINSPECTORPOOL_H
#ifndef INSPECTOR_POOL_H
#define INSPECTOR_POOL_H
#include "inspector_impl.h"//inspector itself
#include <map>//to hold inspectors
#include <mutex>//may be used in multithread environment
#include "inspector.h"
namespace NSJSBase {
namespace v8_debug {
namespace internal {
#include <unordered_map>
class CInspectorPool
namespace NSJSBase
{
struct ContextLess
{
inline bool operator()(const v8::Local<v8::Context> &lhs, const v8::Local<v8::Context> &rhs) const {
if (lhs == rhs) {
return false;
}
return std::less<v8::Context*>{}(*lhs, *rhs);
}
};
using storage_t = std::map<v8::Local<v8::Context>, CInspectorImpl, ContextLess>;
std::mutex m_Mutex{};
storage_t m_Inspectors{};
class CInspectorPool
{
using storage_t = std::unordered_map<v8::Isolate*, CInspector>;
static constexpr bool m_bLog{false};
storage_t m_Inspectors;
//добавить новый инспектор
CInspectorImpl& addInspector(v8::Local<v8::Context> context
, v8::Platform *platform
, const std::string &contextName);
// add new inspector
CInspector& addInspector(v8::Isolate* pIsolate);
//порт для сервака, id для v8
static uint16_t getPort();
static int getContextGroupId();
// group id for V8 internals
static int getContextGroupId();
//всё приватное, синглтон по классике
CInspectorPool();
~CInspectorPool();
// private due to singleton pattern
CInspectorPool() = default;
~CInspectorPool() = default;
public:
CInspectorPool(const CInspectorPool&) = delete;
CInspectorPool(CInspectorPool&&) = delete;
CInspectorPool& operator=(const CInspectorPool&) = delete;
CInspectorPool& operator=(CInspectorPool&&) = delete;
public:
CInspectorPool(const CInspectorPool&) = delete;
CInspectorPool(CInspectorPool&&) = delete;
CInspectorPool& operator=(const CInspectorPool&) = delete;
CInspectorPool& operator=(CInspectorPool&&) = delete;
//инстанс пула
static CInspectorPool& get();
// get instance
static CInspectorPool& get();
// get inspector by isolate
CInspector& getInspector(v8::Isolate* pIsolate);
// remove inspector from isolate
void disposeInspector(v8::Isolate* pIsolate);
};
//достать инспектор для контекста
CInspectorImpl& getInspector(v8::Local<v8::Context> context
, v8::Platform *platform
, const std::string &contextName);
//удалить инспектор для контекста
void disposeInspector(v8::Local<v8::Context> context);
};
}
}//namespace internal
}//namespace v8_debug
}//namespace NSJSBase
#endif // CINSPECTORPOOL_H
#endif // INSPECTOR_POOL_H

View File

@ -1,85 +1,109 @@
#include "../v8_base.h"
#include "inspector_impl.h"
int main(int argc, char *argv[])
{
//V8 INIT
JSSmart<NSJSBase::CJSContext> pJSContext = new NSJSBase::CJSContext();
pJSContext->Initialize();
{
JSSmart<NSJSBase::CJSIsolateScope> isolate_scope = pJSContext->CreateIsolateScope();
JSSmart<NSJSBase::CJSLocalScope> handle_scope = pJSContext->CreateLocalScope();
pJSContext->CreateGlobalForContext();
pJSContext->CreateContext();
JSSmart<NSJSBase::CJSContextScope> context_scope = pJSContext->CreateContextScope();
JSSmart<NSJSBase::CJSTryCatch> try_catch = pJSContext->GetExceptions();
JSSmart<NSJSBase::CJSObject> global_js = pJSContext->GetGlobal();
//zero
pJSContext->
runScript(
"var a = 1;\nvar b = 2;\nvar c = 3;\nvar d = 4;", try_catch
);
try_catch->Check();
std::cout << "after zero\n";
//one
pJSContext->
runScript(
"function function_1() \n { \n return 1 + 2;\n }", try_catch
);
try_catch->Check();
std::cout << "after one\n";
//two
pJSContext->
runScript(
"function function_2()\n {\n return 100 + function_1(); \n}", try_catch
);
try_catch->Check();
std::cout << "after two\n";
//three
JSSmart<NSJSBase::CJSValue> js_result =
global_js->call_func("function_1")
;
std::cout << "after three\n";
//four
JSSmart<NSJSBase::CJSValue> js_result2 = global_js->call_func("function_2");
std::cout << "after four\n";
std::cout << "function_1 = ";
//check
if (js_result.IsInit()){
if (js_result->isNumber()) {
std::cout << js_result->toInt32() << std::endl;
} else {
std::cout << "no result\n";
}
} else {
std::cout << "result not init\n";
}
std::cout << "function_2 = ";
//check
if (js_result.IsInit()){
if (js_result2->isNumber()) {
std::cout << js_result2->toInt32() << std::endl;
} else {
std::cout << "no result\n";
}
} else {
std::cout << "result not init\n";
}
}
pJSContext->Dispose();
NSJSBase::CJSContext::ExternalDispose();
return 0;
}
#include "../../js_base.h"
#include <iostream>
#include <fstream>
std::string readFileContent(const std::string& sFilename)
{
std::ifstream oFile(sFilename);
if (!oFile.is_open())
{
std:: cerr << "Could not open the file: " << sFilename << std::endl;
return "";
}
std::string sContent((std::istreambuf_iterator<char>(oFile)), std::istreambuf_iterator<char>());
return sContent;
}
using namespace NSJSBase;
int main()
{
JSSmart<CJSContext> pContext1 = new CJSContext();
pContext1->CreateContext();
JSSmart<CJSContext> pContext2 = new CJSContext();
pContext2->CreateContext();
{
CJSContextScope oScope(pContext1);
JSSmart<CJSValue> pRet = pContext1->runScript("var special = 42;\n"
"special;\n");
{
CJSContextScope oScope(pContext2);
JSSmart<CJSValue> pRet = pContext2->runScript(readFileContent("../example/code.js"));
std::cout << "RESULT: ";
if (pRet->isString())
{
std::cout << pRet->toStringA() << std::endl;
}
else
{
std::cout << "ERROR!" << std::endl;
}
}
std::cout << "RESULT: ";
if (pRet->isNumber())
{
std::cout << pRet->toInt32() << std::endl;
}
else
{
std::cout << "ERROR!" << std::endl;
}
}
{
CJSContextScope oScope(pContext1);
JSSmart<CJSValue> pRet = pContext1->runScript("function sayHi(name) {\n"
" var a = special;\n"
" var msg = 'Hi, ' + name;\n"
" return msg;\n"
"}\n"
"sayHi('Foo');\n");
pContext1->runScript("sayHi('Foo 2');\n");
std::cout << "RESULT: ";
if (pRet->isString())
{
std::cout << pRet->toStringA() << std::endl;
}
else
{
std::cout << "ERROR!" << std::endl;
}
}
{
CJSContextScope oScope(pContext1);
JSSmart<CJSObject> pGlobal = pContext1->GetGlobal();
JSSmart<CJSValue> argv[1];
argv[0] = pContext1->createString("Bar");
JSSmart<CJSValue> pRet = pGlobal->call_func("sayHi", 1, argv);
std::cout << "RESULT: ";
if (pRet->isString())
{
std::cout << pRet->toStringA() << std::endl;
}
else
{
std::cout << "ERROR!" << std::endl;
}
}
pContext1->Dispose();
std::cout << "AFTER CONTEXT1 DISPOSE" << std::endl;
pContext2->Dispose();
std::cout << "AFTER CONTEXT2 DISPOSE" << std::endl;
return 0;
}

View File

@ -1,62 +0,0 @@
Классы v8-инспектора - это CInspectorClient (client) и CInspectorChannel (channel).
Channel нужен для передачи сообщений на фронтенд и не представляет собой ничего интересного.
Базовые функции клиента заключаются в том, чтобы синхронно принимать сообщения с фронтенда,
когда JS стоит на паузе (runMessageLoopOnPause), а также сниматься с паузы (quitMessageLoopOnPause).
Вся логика создания v8 debug session реализована на клиенте в функции setUpDebuggingSession, потому что так удобнее.
Там создаётся channel, далее создаётся v8-inspector, для этого ему нужен isolate и client.
Далее создаётся V8InspectorSession. Контекст, в котором создан client, регистрируется на инспекторе.
Кроме всего этого, нужно отправлять входящие с сервера сообщения на v8 (V8InspectorSession::dispatchProtocolMessage).
Этим также занимается client, раз уж V8InspectorSession лежит в нём.
Класс CInspectorImpl - это обёртка вокруг клиента, в которой реализована дополнительная логика.
Во-первых, там лежит клиент, в котором лежит всё, что напрямую касается v8-инспектора.
Во-вторых, там лежит сервер, к которому подключается Chrome Developer Tools и через который происходит обмен сообщениями.
Сервер умеет отправлять сообщения, ждать одного сообщения, а также входить и выходить из message loop (последнее на практике почти не используется).
CInspectorPool - это синглтон, который хранит в себе CInspectorImpl - по одному на v8::Context.
inspector_interface.h - это просто обёртка вокруг CInspectorPool без лишних #include,
что позволяет гарантированно избегать циклических зависомостей в заголовках.
Также он умеет удалять их.
Singlethreadutils - это примитивы, необходимые для:
- парсинга файлов (пережиток тестовых запусков);
- логгирования сообщений;
- преобразований между разными строками: std::string, v8::String и v8_inspector::StringView
(это необходимо для взаимодействия между сервером, принимающим std::string, и v8, использующим свои строковые классы);
- парсинга жсонов - это нужно, чтобы доставать из сообщений с фронтенда пересылаемые методы.
Зачем нужно последнее, станет ясно чуть позже.
Работает это следующим образом.
В самом начале, когда инспектор создаётся, на нём должен быть вызван prepareServer,
который ждёт подключения Chrome Developer Tools (CDT) и после этого запускает message loop на сервере.
Клиент ждёт, когда с сервера придёт сообщение Runtime.runIfWaitingForDebugger. Это свидетельствует о готовности CDT.
После этого сервер выходит из message loop.
Перед запуском скрипта или функции вызывается CInspectorImpl::beforeLaunch,
который вызывает CInspectorClient::pauseOnNextStatement, который вызывает V8InspectorSession::schedulePauseOnNextStatement.
Эта функция ставит галочку, что на следующем стейтменте нужно остановиться, и сразу возвращается.
Пауза на первом стейтменте скрипта или функции нужна, чтобы они появились в CDT.
Кроме того, клиент на этом моменте ставит флаг, что паузу он вызвал сам - это нужно в дальнейшем.
Далее при запуске функции или скрипта он ставится на паузу, вызывается CInspectorClient::runMessageLoopOnPause,
и начинается синхронный обмен сообщениями.
Этот обмен нужно закончить, когда скрипт или функция появятся в CDT.
В случае со скриптом индикатором этого является метод Debugger.getScriptSource, приходящий с сервера.
В случае с функцией однозначного индикатора нет, используется метод Runtime.getProperties.
Также возможно использование метода Overlay.setPausedInDebuggerMessage - обычно он приходит раньше, чем Runtime.getProperties,
но этот вариант не протестирован.
Проверка сообщений с сервера на наличие этих методов производится после их отправки на v8.
В случае, если не стоит флаг о том, что пауза была вызвана с клиента, сообщения не проверяются вообще -
это значит, что пауза вызвана пользователем (чаще всего это breakpoint или step into/over/out после брейкпойнта)
и с неё не нужно сниматься автоматически.
В случае, если пауза была вызвана клиентом, он мониторит входящие сообщения на предмет вышеописанных методов
и вызывает V8InspectorSession::resume, если один из них приходит.
После этого на CDT отправляется сообщение Debugger.resume, и JS-код дальше исполняется внутри v8.
Если там есть где остановиться, v8 снова входит в runMessageLoopOnPause и отправляет на CDT Debugger.paused.
Поскольку это пользовательская пауза, клиент не снимается с неё автоматически,
а ждёт, пока пользователь снимется с неё через CDT.
Когда JS-код полностью исполнен, продолжается выполнение C++-кода.
Элементы v8-инспектора, которые лежат внутри клиента, нужно уничтожать до выхода из isolate scope и context scope.
Если их уничтожать на выходе из программы, то она падает.
Чтобы этого избежать, в CJSContext::dispose вызывается CInspectorPool::disposeContext, который находит CInspectorImpl,
созданный для уничтожаемого контекста, и удаляет его.
Каждый сервер, а следовательно, каждый CInspectorImpl, требует порт.
CInspectorImpl создаётся на каждый контекст (хотя было бы правильнее на isolate, но здесь это не принципиально,
потому что на isolate всегда только один контекст).
Следовательно, на каждый контекст выделяется порт.
Порты начинаются с 8080.

View File

@ -1,282 +0,0 @@
#include "singleconnectionserver.h"
#include <iostream>//reporting errors
namespace ip = boost::asio::ip;
namespace beast = boost::beast;
std::pair<std::string, beast::error_code>
NSJSBase::v8_debug::internal::CSingleConnectionServer::getData()
{
//set up buffer
beast::multi_buffer buffer;
//to check for err
beast::error_code errCode;
//read into buffer; blocks here
m_pWebsocketStream->read(buffer, errCode);
//check for error
if (errCode) {
if (//cdt disconnection
errCode == boost::asio::error::operation_aborted
) {
setDisconnected();
return {std::string(), errCode};
}
reportError(errCode, "while reading");
return {std::string(), errCode};
}
//set mode equal to incoming message mode
m_pWebsocketStream->text(
//returns true if socket got text message, false on binary
m_pWebsocketStream->got_text()
);
//return value read
return {boost::beast::buffers_to_string(buffer.data()), errCode};
}
beast::error_code NSJSBase::v8_debug::internal::CSingleConnectionServer::discardData()
{
beast::flat_buffer buffer;//no need in multi buffer
beast::error_code errCode;
m_pWebsocketStream->read(buffer, errCode);
return errCode;
}
void NSJSBase::v8_debug::internal::CSingleConnectionServer::reportError(
const beast::error_code &code
, const char *context) const
{
beast::error_code ec;
std::cerr
<< m_Endpoint.address().to_string(ec)
<< ':'
<< m_Endpoint.port()
<< ": "
<< context << ": error with code " << code << ": " << code.message() << std::endl;
}
void NSJSBase::v8_debug::internal::CSingleConnectionServer::setConnected()
{
m_bCdtConnected = true;
}
void NSJSBase::v8_debug::internal::CSingleConnectionServer::setDisconnected()
{
m_bCdtConnected = false;
}
bool NSJSBase::v8_debug::internal::CSingleConnectionServer::checkStream()
{
if (!m_pWebsocketStream) {
std::cerr << "no websocket stream when requested one" << std::endl;
setDisconnected();
return false;
}
return true;
}
NSJSBase::v8_debug::internal::CSingleConnectionServer::CSingleConnectionServer(uint16_t port
, std::string host)
//set up endpoint
: m_Endpoint(
ip::make_address(host)
, port
)
//constructs unopened acceptor
, m_ConnectionAcceptor(
m_io_context
)
{
//
}
void NSJSBase::v8_debug::internal::CSingleConnectionServer::setOnMessageCallback(
onMessageCallback callback)
{
m_fOnMessage = std::move(callback);
}
bool NSJSBase::v8_debug::internal::CSingleConnectionServer::waitForConnection()
{
//to check errors
boost::beast::error_code errCode;
//make socket on io context
tcp::socket socket{m_io_context};
//blocks until connected
m_ConnectionAcceptor.accept(socket, errCode);
//check for error
if (errCode) {
reportError(errCode, "while accepting connection");
return false;
}
//set up websocket stream and delete old one if any
m_pWebsocketStream.reset(new stream_t{
//move local object to stream
std::move(socket)
}
);
//accept client handshake
m_pWebsocketStream->accept(errCode);
//check error
if (errCode) {
reportError(errCode, "while accepting client handshake");
return false;
}
//connection established
setConnected();
return true;
}
bool NSJSBase::v8_debug::internal::CSingleConnectionServer::listen()
{
//
boost::beast::error_code errCode;
//open acceptor with endpoint's protocol
m_ConnectionAcceptor.open(m_Endpoint.protocol(), errCode);
//check for error
if (errCode) {
reportError(errCode, "while opening acceptor");
return false;
}
//bind acceptor to endpoint
m_ConnectionAcceptor.bind(m_Endpoint, errCode);
//check for error
if (errCode) {
reportError(errCode, "while binding acceptor to endpoint");
return false;
}
//listen
m_ConnectionAcceptor.listen(
1//max amount of pending connections
, errCode);
//check for error
if (errCode) {
reportError(errCode, "while attempting to listen");
return false;
}
m_bListening = true;
return true;
}
//blocks
void NSJSBase::v8_debug::internal::CSingleConnectionServer::run(onResumeCallback beforeRun)
{
//resume stuff
m_bPaused = false;
if (beforeRun) {
beforeRun();
}
while (!m_bPaused) {
if (!waitAndProcessMessage()) {
return;
}
}
}
void NSJSBase::v8_debug::internal::CSingleConnectionServer::sendData(const std::string &data)
{
//check stream
if (!checkStream()) {
return;
}
//no need to check for pause
//write data to buffer
beast::multi_buffer buffer;
beast::ostream(buffer) << data;
//text or binary mode as already set
boost::beast::error_code errCode;
m_pWebsocketStream->write(buffer.data(), errCode);
if (errCode) {
reportError(errCode, "while sending data");
return;
}
}
bool NSJSBase::v8_debug::internal::CSingleConnectionServer::waitAndProcessMessage()
{
//check stream
if (!checkStream()) {
return false;
}
std::pair<std::string, beast::error_code> result = getData();
if (!connected()) {
return false;
}
if (result.second) {
return false;
}
if (m_fOnMessage){
m_fOnMessage(result.first);
}
//it won't work with check for pause
return true;
}
bool NSJSBase::v8_debug::internal::CSingleConnectionServer::connected() const
{
return m_bCdtConnected;
}
bool NSJSBase::v8_debug::internal::CSingleConnectionServer::listening() const
{
return m_bListening;
}
bool NSJSBase::v8_debug::internal::CSingleConnectionServer::shutdown()
{
//check stream
if (!checkStream()) {
return false;
}
beast::error_code errCode;
//send close frame
m_pWebsocketStream->close(beast::websocket::close_code::normal, errCode);
if (errCode) {
reportError(errCode, "while closing");
return false;
}
//discard pending messages until receiving close frame
while (true) {
//read and get error_code
errCode = discardData();
//close frame is delivered as closed error
if (errCode == beast::websocket::error::closed) {
return true;
}
//any other errors
if (errCode) {
reportError(errCode, "while waiting for close responce at close");
return false;
}
}
}
void NSJSBase::v8_debug::internal::CSingleConnectionServer::pause()
{
m_bPaused = true;
}
uint16_t NSJSBase::v8_debug::internal::CSingleConnectionServer::port() const
{
return m_Endpoint.port();
}

View File

@ -1,85 +0,0 @@
#ifndef SINGLECONNECTIONSERVER_H
#define SINGLECONNECTIONSERVER_H
//boost stuff
#include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp>
#include <boost/asio/strand.hpp>
#include <functional>//std::function
#include <atomic>//std::atomic for thread-safe flags
namespace NSJSBase {
namespace v8_debug {
namespace internal {
class CSingleConnectionServer
{
public:
using onMessageCallback = std::function<void(const std::string &message)>;
using onResumeCallback = std::function<void()>;//not used, for any case
private:
//tcp is a class
using tcp = boost::asio::ip::tcp;
//
using stream_t = boost::beast::websocket::stream<
tcp::socket
>;
//boost stuff
//required for all io operations
boost::asio::io_context m_io_context{
1//use only one thread
};
//tcp endpoint
boost::asio::ip::tcp::endpoint m_Endpoint;
//connection acceptor
boost::asio::ip::tcp::acceptor m_ConnectionAcceptor;
//using pointer to be able to create stream on connection, not in ctor
std::unique_ptr<stream_t> m_pWebsocketStream{nullptr};
//message handler
onMessageCallback m_fOnMessage{};
//flags
std::atomic<bool> m_bCdtConnected{false};//используется для выхода из цикла после закрытия chrome dev tools
std::atomic<bool> m_bListening{false};//слушает ли сервак входящие соединения
std::atomic<bool> m_bPaused{false};//пауза
//private api
//read data(blocks)
std::pair<std::string, boost::beast::error_code> getData();
boost::beast::error_code discardData();
//report error
void reportError(const boost::beast::error_code &code, const char *context) const;
//
void setConnected();
void setDisconnected();
//
bool checkStream();
public:
CSingleConnectionServer(uint16_t port = 8080, std::string host = "127.0.0.1");
void setOnMessageCallback(onMessageCallback callback);
bool waitForConnection();
bool listen();
void run(onResumeCallback beforeRun = onResumeCallback{});
void sendData(const std::string &data);
bool waitAndProcessMessage();
bool connected() const;
bool listening() const;
bool shutdown();
void pause();
uint16_t port() const;
};
}//namespace internal
}//namespace v8_debug
}//namespace NSJSBase
#endif // SINGLECONNECTIONSERVER_H

View File

@ -1,205 +0,0 @@
#include "singlethreadutils.h"
#include <iostream>//logging
#include <fstream>//get file data
#include <sstream>//string stream in getContents
//#define V8_DEBUG_MULTITHREADED
#ifdef V8_DEBUG_MULTITHREADED
#define LOCK_AND_ENTER_ISOLATE(isolate_ptr) \
v8::Locker aasdufasidhfajskfjadhfk_lock_isolate_by_current_thread(isolate_ptr); \
v8::Isolate::Scope aasdufasidhfajskfjadhfk_enter_isolate_scope(isolate_ptr);
#define LOCK_AND_ENTER_ISOLATE_BY_CONTEXT(context) \
v8::Isolate *asdfdsfduf_isolate_ptr = context->GetIsolate(); \
LOCK_AND_ENTER_ISOLATE(asdfdsfduf_isolate_ptr)
#else
#define LOCK_AND_ENTER_ISOLATE(isolate_ptr)
#define LOCK_AND_ENTER_ISOLATE_BY_CONTEXT(context)
#endif
std::string NSJSBase::v8_debug::internal::getContents(std::istream &in)
{
std::ostringstream ss;
ss << in.rdbuf();
return ss.str();
}
std::string NSJSBase::v8_debug::internal::getFileData(const std::string &filename)
{
std::ifstream f(filename);
return getContents(f);
}
v8_inspector::StringView NSJSBase::v8_debug::internal::strToView(const std::string &str) {
const uint8_t *data = reinterpret_cast<const uint8_t*>(str.c_str());
std::size_t len = str.length();
return v8_inspector::StringView{data, len};
}
std::string NSJSBase::v8_debug::internal::viewToStr(v8::Isolate *isolate
, const v8_inspector::StringView &view)
{
LOCK_AND_ENTER_ISOLATE(isolate);
v8::Local<v8::String> v8str = viewTov8str(isolate, view);
v8::String::Utf8Value utf8(v8str);
return std::string(*utf8);
}
v8::Local<v8::Object> NSJSBase::v8_debug::internal::parseJsonImpl(v8::Local<v8::Context> context
, v8::Local<v8::String> v8str)
{
v8::Local<v8::Value> value = v8::JSON::Parse(context, v8str).ToLocalChecked();
v8::MaybeLocal<v8::Object> obj = value->ToObject(context);
if (obj.IsEmpty()) {
v8::Local<v8::Object>();
}
return
obj.ToLocalChecked()
;
}
v8::Local<v8::String> NSJSBase::v8_debug::internal::tov8str(v8::Isolate *isolate
, const std::string &str)
{
LOCK_AND_ENTER_ISOLATE(isolate);
return v8::String::NewFromUtf8(isolate
, str.c_str()
, v8::NewStringType::kNormal
, str.length())
.ToLocalChecked();
}
v8::Local<v8::Value> NSJSBase::v8_debug::internal::getJsonPropertyImpl(v8::Local<v8::Context> context
, v8::Local<v8::Object> jsonObject
, const std::string &property)
{
LOCK_AND_ENTER_ISOLATE_BY_CONTEXT(context);
v8::Local<v8::Value> name = v8::String::NewFromUtf8(
context->GetIsolate()
, property.c_str()
, v8::NewStringType::kNormal
, property.length())
.ToLocalChecked();
v8::MaybeLocal<v8::Value> maybeProperty = jsonObject->Get(context, name);
if (maybeProperty.IsEmpty()) {
return v8::Local<v8::Value>();
}
return maybeProperty.ToLocalChecked();
}
std::string NSJSBase::v8_debug::internal::getMethod(v8::Local<v8::Context> context
, const std::string &json)
{
return getMethodImpl(context, parseJson(context, json));
}
std::string NSJSBase::v8_debug::internal::getMethod(v8::Local<v8::Context> context
, const v8_inspector::StringView &view)
{
return getMethodImpl(context, parseJson(context, view));
}
std::string NSJSBase::v8_debug::internal::getMethodImpl(v8::Local<v8::Context> context
, v8::Local<v8::Object> jsonObj)
{
if (jsonObj.IsEmpty()) {
return std::string();
}
return asString(getJsonPropertyImpl(context, jsonObj, "method"));
}
v8::Local<v8::String> NSJSBase::v8_debug::internal::viewTov8str(v8::Isolate *isolate
, const v8_inspector::StringView &view)
{
LOCK_AND_ENTER_ISOLATE(isolate);
return
(
view.is8Bit()
?
v8::String::NewFromOneByte
(
isolate
, view.characters8()
, v8::NewStringType::kNormal
, view.length()
)
:
v8::String::NewFromTwoByte
(
isolate
, view.characters16()
, v8::NewStringType::kNormal
, view.length()
)
).ToLocalChecked();
}
v8::Local<v8::Object> NSJSBase::v8_debug::internal::parseJson(v8::Local<v8::Context> context
, const std::string &str)
{
LOCK_AND_ENTER_ISOLATE_BY_CONTEXT(context);
return parseJsonImpl(context, tov8str(context->GetIsolate(), str));
}
v8::Local<v8::Object> NSJSBase::v8_debug::internal::parseJson(v8::Local<v8::Context> context
, const v8_inspector::StringView &view)
{
LOCK_AND_ENTER_ISOLATE_BY_CONTEXT(context);
return parseJsonImpl(context, viewTov8str(context->GetIsolate(), view));
}
void NSJSBase::v8_debug::internal::logWithPrefix(std::ostream &out
, const std::string &prefix
, const std::string &message)
{
out << prefix;
static constexpr std::size_t bigLen = 10000;
if (message.size() > bigLen) {
out << "message of size " << message.size();
}
else {
out << message;
}
out << std::endl;
}
void NSJSBase::v8_debug::internal::logCdtMessage(std::ostream &out
, const std::string &message)
{
logWithPrefix(out, "CDT: ", message);
}
void NSJSBase::v8_debug::internal::logOutgoingMessage(std::ostream &out
, const std::string &message)
{
logWithPrefix(out, "responce: ", message);
}
v8::Local<v8::Value> NSJSBase::v8_debug::internal::getJsonProperty(
v8::Local<v8::Context> context
, const std::string &json
, const std::string &property)
{
v8::Local<v8::Object> jsonObject = parseJson(context, json);
if (jsonObject.IsEmpty()) {
return v8::Local<v8::Value>();
}
return getJsonPropertyImpl(context, jsonObject, property);
}
std::string NSJSBase::v8_debug::internal::asString(v8::Local<v8::Value> value)
{
v8::String::Utf8Value utf8(value);
return std::string(*utf8);
}

View File

@ -1,71 +0,0 @@
#ifndef SINGLETHREADUTILS_H
#define SINGLETHREADUTILS_H
#include <v8-inspector.h>//v8 stuff
#include <string>//std::string
namespace NSJSBase {
namespace v8_debug {
namespace internal {
//getting file data
std::string getContents(std::istream &in);
std::string getFileData(const std::string &filename);
//logging
void logWithPrefix(std::ostream &out, const std::string &prefix, const std::string &message);
void logCdtMessage(std::ostream &out, const std::string &message);
void logOutgoingMessage(std::ostream &out, const std::string &message);
//conversion between different strings
v8_inspector::StringView strToView(const std::string &str);
std::string viewToStr(v8::Isolate *isolate
, const v8_inspector::StringView &view);
v8::Local<v8::String> tov8str(v8::Isolate *isolate
, const std::string &str);
v8::Local<v8::String> viewTov8str(v8::Isolate *isolate
, const v8_inspector::StringView &view);
std::string asString(v8::Local<v8::Value> value);
//get value of property |property| from json object
v8::Local<v8::Value> getJsonProperty(v8::Local<v8::Context> context
, const std::string &json
, const std::string &property);
v8::Local<v8::Value> getJsonPropertyImpl(
v8::Local<v8::Context> context
, v8::Local<v8::Object> jsonObject
, const std::string &property
);
//extract field "method" from json string
std::string getMethodImpl(v8::Local<v8::Context> context
, v8::Local<v8::Object> jsonObj);
std::string getMethod(
v8::Local<v8::Context> context
, const std::string &json
);
std::string getMethod(
v8::Local<v8::Context> context
, const v8_inspector::StringView &view
);
//parse string and get json object
v8::Local<v8::Object> parseJsonImpl(v8::Local<v8::Context> context
, v8::Local<v8::String> v8str
);
v8::Local<v8::Object> parseJson(
v8::Local<v8::Context> context
, const std::string &str
);
v8::Local<v8::Object> parseJson(
v8::Local<v8::Context> context
, const v8_inspector::StringView &view
);
}//namespace internal
}//namespace v8_debug
}//namespace NSJSBase
#endif // SINGLETHREADUTILS_H

View File

@ -0,0 +1,44 @@
#include "utils.h"
#include "../v8_base.h"
namespace NSJSBase
{
std::string convertToString(v8::Isolate* pIsolate, const v8_inspector::StringView oStringView)
{
int length = static_cast<int>(oStringView.length());
v8::Local<v8::String> message =
(
oStringView.is8Bit()
? v8::String::NewFromOneByte(pIsolate, reinterpret_cast<const uint8_t*>(oStringView.characters8()), v8::NewStringType::kNormal, length).ToLocalChecked()
: v8::String::NewFromTwoByte(pIsolate, reinterpret_cast<const uint16_t*>(oStringView.characters16()), v8::NewStringType::kNormal, length).ToLocalChecked()
);
v8::String::Utf8Value result(V8IsolateFirstArg message);
return *result;
}
v8_inspector::StringView convertToStringView(const std::string& str)
{
const uint8_t* pStringView = reinterpret_cast<const uint8_t*>(str.c_str());
return { pStringView, str.length() };
}
v8::Local<v8::Object> parseJson(const v8::Local<v8::Context>& context, const std::string& sJson)
{
v8::MaybeLocal<v8::Value> jsonValue = v8::JSON::Parse(context, CreateV8String(context->GetIsolate(), sJson));
if (jsonValue.IsEmpty())
{
return v8::Local<v8::Object>();
}
return jsonValue.ToLocalChecked()->ToObject(context).ToLocalChecked();
}
std::string getPropertyFromJson(v8::Isolate* pIsolate, const v8::Local<v8::Object>& jsonObject, const std::string& sPropertyName)
{
v8::Local<v8::Value> property = jsonObject->Get(pIsolate->GetCurrentContext(), CreateV8String(pIsolate, sPropertyName)).ToLocalChecked();
v8::String::Utf8Value utf8Value(V8IsolateFirstArg property);
return *utf8Value;
}
}

View File

@ -0,0 +1,22 @@
#ifndef UTILS_H
#define UTILS_H
#include <v8.h>
#include <v8-inspector.h>
#include <string>
namespace NSJSBase
{
// convert v8_inspector::StringView to std::string
std::string convertToString(v8::Isolate* pIsolate, const v8_inspector::StringView oStringView);
// convert std::string to v8_inspector::StringView
v8_inspector::StringView convertToStringView(const std::string& str);
// get JSON object from JSON-string
v8::Local<v8::Object> parseJson(const v8::Local<v8::Context>& context, const std::string& sJson);
// get specified property value from JSON object
std::string getPropertyFromJson(v8::Isolate* pIsolate, const v8::Local<v8::Object>& jsonObject, const std::string& sPropertyName);
}
#endif // UTILS_H

View File

@ -1,20 +0,0 @@
CORE_BUILDS_PLATFORM_PREFIX = win_64
BUILD_MODE=debug
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
CORE_ROOT_DIR = $$PWD/../../../../../../core
PWD_ROOT_DIR = $$PWD
include($$CORE_ROOT_DIR/Common/base.pri)
ADD_DEPENDENCY(kernel, UnicodeConverter)
core_linux:include($$CORE_ROOT_DIR/Common/3dParty/icu/icu.pri)
CONFIG += v8_use_inspector
include($$CORE_ROOT_DIR/DesktopEditor/doctrenderer/js_internal/js_base.pri)
SOURCES += \
$$PWD/main.cpp

View File

@ -0,0 +1,31 @@
#include <functional>
#include "v8_inspector_channel.h"
#include "utils.h"
namespace NSJSBase
{
CV8InspectorChannelImpl::CV8InspectorChannelImpl(v8::Isolate* pIsolate, const std::function<void(std::string)>& fOnResponse)
: m_pIsolate(pIsolate)
, m_fOnResponce(fOnResponse)
{
}
void CV8InspectorChannelImpl::sendResponse(int nCallId, std::unique_ptr<v8_inspector::StringBuffer> pMessage)
{
const std::string response = convertToString(m_pIsolate, pMessage->string());
m_fOnResponce(response);
}
void CV8InspectorChannelImpl::sendNotification(std::unique_ptr<v8_inspector::StringBuffer> pMessage)
{
const std::string notification = convertToString(m_pIsolate, pMessage->string());
m_fOnResponce(notification);
}
void CV8InspectorChannelImpl::flushProtocolNotifications()
{
// does nothing
}
}

View File

@ -0,0 +1,29 @@
#ifndef V8_INSPECTOR_CHANNEL_IMPL_H
#define V8_INSPECTOR_CHANNEL_IMPL_H
#include <functional>
#include <v8.h>
#include <v8-inspector.h>
#include <string>
namespace NSJSBase
{
class CV8InspectorChannelImpl final: public v8_inspector::V8Inspector::Channel
{
private:
v8::Isolate* m_pIsolate;
std::function<void(std::string)> m_fOnResponce;
public:
CV8InspectorChannelImpl(v8::Isolate* pIsolate, const std::function<void(std::string)>& fOnResponse);
// overriden interface methods
void sendResponse(int nCallId, std::unique_ptr<v8_inspector::StringBuffer> pMessage) override;
void sendNotification(std::unique_ptr<v8_inspector::StringBuffer> pMessage) override;
void flushProtocolNotifications() override;
};
}
#endif // V8_INSPECTOR_CHANNEL_IMPL_H

View File

@ -0,0 +1,73 @@
#include "v8_inspector_client.h"
#include <libplatform/libplatform.h>
#include "utils.h"
namespace NSJSBase
{
CV8InspectorClientImpl::CV8InspectorClientImpl(
v8::Platform* pPlatform,
v8::Isolate* pIsolate,
int nContextGroupId,
const std::function<void(std::string)>& fOnResponse,
const std::function<bool(void)>& fOnWaitFrontendMessageOnPause)
: m_pPlatform(pPlatform)
, m_pIsolate(pIsolate)
, m_nContextGroupId(nContextGroupId)
, m_fOnWaitFrontendMessageOnPause(std::move(fOnWaitFrontendMessageOnPause))
{
v8::Local<v8::Context> context = m_pIsolate->GetCurrentContext();
// initialize all V8 inspector stuff
m_pChannel.reset(new CV8InspectorChannelImpl(m_pIsolate, fOnResponse));
m_pInspector = v8_inspector::V8Inspector::create(m_pIsolate, this);
m_pSession = m_pInspector->connect(m_nContextGroupId, m_pChannel.get(), v8_inspector::StringView());
context->SetAlignedPointerInEmbedderData(1, this);
v8_inspector::StringView oContextName = convertToStringView("inspector" + std::to_string(nContextGroupId));
m_pInspector->contextCreated(v8_inspector::V8ContextInfo(context, m_nContextGroupId, oContextName));
}
void CV8InspectorClientImpl::dispatchProtocolMessage(const v8_inspector::StringView& oMessage)
{
m_pSession->dispatchProtocolMessage(oMessage);
}
void CV8InspectorClientImpl::runMessageLoopOnPause(int nContextGroupId)
{
if (m_bRunNestedLoop)
{
return;
}
m_bTerminated = false;
m_bRunNestedLoop = true;
while (!m_bTerminated && m_fOnWaitFrontendMessageOnPause())
{
while (v8::platform::PumpMessageLoop(m_pPlatform, m_pIsolate)) {}
}
m_bTerminated = true;
m_bRunNestedLoop = false;
}
void CV8InspectorClientImpl::quitMessageLoopOnPause()
{
m_bTerminated = true;
}
v8::Local<v8::Context> CV8InspectorClientImpl::ensureDefaultContextInGroup(int nContextGroupId)
{
return m_pIsolate->GetCurrentContext();
}
void CV8InspectorClientImpl::schedulePauseOnNextStatement(const v8_inspector::StringView& oReason)
{
m_pSession->schedulePauseOnNextStatement(oReason, {});
}
void CV8InspectorClientImpl::waitFrontendMessageOnPause()
{
m_bTerminated = false;
}
}

View File

@ -0,0 +1,55 @@
#ifndef V8_INSPECTOR_CLIENT_IMPL_H
#define V8_INSPECTOR_CLIENT_IMPL_H
#include <v8.h>
#include <v8-inspector.h>
#include "v8_inspector_channel.h"
namespace NSJSBase
{
class CV8InspectorClientImpl final: public v8_inspector::V8InspectorClient
{
private:
v8::Platform* m_pPlatform;
// V8 Inspector stuff
std::unique_ptr<v8_inspector::V8Inspector> m_pInspector;
std::unique_ptr<v8_inspector::V8InspectorSession> m_pSession;
std::unique_ptr<CV8InspectorChannelImpl> m_pChannel;
// V8 isolate
v8::Isolate* m_pIsolate;
// context group id
const int m_nContextGroupId;
// callbacks
std::function<bool(void)> m_fOnWaitFrontendMessageOnPause;
// server message loop terminate flag
bool m_bTerminated = false;
// flag for preventing server from falling into two loops
bool m_bRunNestedLoop = false;
private:
v8::Local<v8::Context> ensureDefaultContextInGroup(int nContextGroupId) override;
public:
CV8InspectorClientImpl(
v8::Platform* pPlatform,
v8::Isolate* pIsolate,
int nContextGroupId,
const std::function<void(std::string)>& fOnResponse,
const std::function<bool(void)>& fOnWaitFrontendMessageOnPause);
// send message to V8 internals
void dispatchProtocolMessage(const v8_inspector::StringView& oMessage);
// overriden interface methods
void runMessageLoopOnPause(int nContextGroupId) override;
void quitMessageLoopOnPause() override;
// pause on next statement
void schedulePauseOnNextStatement(const v8_inspector::StringView& oReason);
// wait for message from frontend
void waitFrontendMessageOnPause();
};
}
#endif // V8_INSPECTOR_CLIENT_IMPL_H

View File

@ -0,0 +1,151 @@
#include "websocket_server.h"
#include <iostream>
namespace NSJSBase
{
static int getPort()
{
static int nInitialPort{8080};
return nInitialPort++;
}
CWebSocketServer::CWebSocketServer(std::function<void(std::string&)> fOnMessage)
: m_nPort(getPort())
, m_oEndpoint(net::ip::make_address("127.0.0.1"), m_nPort)
, m_oAcceptor(m_oIoContext)
, m_fOnMessage(std::move(fOnMessage))
{
init();
}
CWebSocketServer::~CWebSocketServer()
{
m_oWs->close(beast::websocket::close_code::normal);
m_oAcceptor.close();
}
void CWebSocketServer::init()
{
bool bIsInit = false;
while (!bIsInit)
{
try
{
m_oAcceptor.open(m_oEndpoint.protocol());
m_oAcceptor.set_option(tcp::acceptor::reuse_address(true));
// here may be thrown an exception if port already in use by other process
m_oAcceptor.bind(m_oEndpoint);
m_oAcceptor.listen(1);
// if no exception was thrown at this point the server is successfully initialized
bIsInit = true;
}
catch (const beast::system_error& se)
{
// if port already in use by other process try to bind to next port number
if (se.code() == boost::asio::error::access_denied)
{
boost::system::error_code ec;
m_oAcceptor.close(ec);
if (ec)
{
std::cerr << "Error on trying to get new port: " << ec.message() << std::endl;
break;
}
m_nPort = getPort();
m_oEndpoint.port(m_nPort);
}
else
{
std::cerr << "Error on init the server: " << se.code().message() << std::endl;
break;
}
}
catch (const std::exception& e)
{
std::cerr << "System error: " << e.what() << std::endl;
break;
}
}
}
void CWebSocketServer::connect()
{
try
{
printListeningMessage();
tcp::socket oSocket(m_oIoContext);
m_oAcceptor.accept(oSocket);
m_oWs.reset(new websocket::stream<tcp::socket>(std::move(oSocket)));
startListening();
}
catch (const std::exception& e)
{
std::cerr << "Error on connecting to server: " << e.what() << std::endl;
}
}
void CWebSocketServer::sendMessage(const std::string& sMessage)
{
try
{
boost::beast::multi_buffer oBuffer;
boost::beast::ostream(oBuffer) << sMessage;
m_oWs->text(m_oWs->got_text());
m_oWs->write(oBuffer.data());
}
catch (const beast::system_error& se)
{
if (se.code() != websocket::error::closed)
std::cerr << "Error on message send: " << se.code().message() << std::endl;
}
catch (const std::exception& e)
{
std::cerr << "System error: " << e.what() << std::endl;
}
}
void CWebSocketServer::startListening()
{
try
{
m_oWs->accept();
while (!isServerReady_)
{
waitFrontendMessage();
}
}
catch (const beast::system_error& se)
{
if (se.code() != websocket::error::closed)
std::cerr << "Error on listening: " << se.code().message() << std::endl;
}
catch (const std::exception& e)
{
std::cerr << "System error: " << e.what() << std::endl;
}
}
void CWebSocketServer::printListeningMessage()
{
std::cout << "WebSocket based Inspector Agent started" << std::endl;
std::cout << "Open the following link in your Chrome/Chromium browser: devtools://devtools/bundled/inspector.html?ws=127.0.0.1:" << m_nPort << std::endl;
}
void CWebSocketServer::waitForFrontendMessageOnPause()
{
waitFrontendMessage();
}
void CWebSocketServer::waitFrontendMessage()
{
beast::flat_buffer oBuffer;
m_oWs->read(oBuffer);
std::string message = boost::beast::buffers_to_string(oBuffer.data());
m_fOnMessage(message);
}
}

View File

@ -0,0 +1,51 @@
#ifndef WEBSOCKET_SERVER_H
#define WEBSOCKET_SERVER_H
#include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <functional>
namespace beast = boost::beast; // from <boost/beast.hpp>
namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
namespace net = boost::asio; // from <boost/asio.hpp>
using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
namespace NSJSBase
{
class CWebSocketServer
{
private:
int m_nPort;
// boost stuff
tcp::endpoint m_oEndpoint;
net::io_context m_oIoContext{1};
tcp::acceptor m_oAcceptor;
std::unique_ptr<websocket::stream<tcp::socket>> m_oWs;
// callbacks
std::function<void(std::string&)> m_fOnMessage;
private:
void init();
void startListening();
void printListeningMessage();
void waitFrontendMessage();
public:
// flag that is `true` when server finishes initial connection and script is ready to be executed in V8
bool isServerReady_ = false;
public:
CWebSocketServer(std::function<void(std::string&)> fOnMessage);
~CWebSocketServer();
void connect();
void sendMessage(const std::string& sMessage);
void waitForFrontendMessageOnPause();
};
}
#endif // WEBSOCKET_SERVER_H

View File

@ -150,58 +150,42 @@ namespace NSJSBase
}
};
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<v8::Context> context) : m_scope(context)
{
}
virtual ~CJSContextScopeV8()
{
}
};
class CJSLocalScopeV8 : public CJSLocalScope
class CJSLocalScopePrivate
{
public:
v8::HandleScope m_scope;
public:
CJSLocalScopeV8() : m_scope(CV8Worker::GetCurrent())
CJSLocalScopePrivate() : m_scope(CV8Worker::GetCurrent())
{
}
virtual ~CJSLocalScopeV8()
~CJSLocalScopePrivate()
{
}
};
CJSLocalScope::CJSLocalScope() : m_internal(new CJSLocalScopePrivate())
{
}
CJSContext::CJSContext()
CJSLocalScope::~CJSLocalScope()
{
delete m_internal;
}
CJSContext::CJSContext(const bool& bIsInitialize)
{
m_internal = new CJSContextPrivate();
if (bIsInitialize)
Initialize();
}
CJSContext::~CJSContext()
{
if (m_internal->m_contextPersistent.IsEmpty())
return;
if (m_internal->m_isolate)
Dispose();
RELEASEOBJECT(m_internal);
}
@ -212,13 +196,23 @@ namespace NSJSBase
void CJSContext::Initialize()
{
m_internal->m_isolate = CV8Worker::getInitializer().CreateNew();
if (m_internal->m_isolate == NULL)
{
v8::Isolate* isolate = CV8Worker::getInitializer().CreateNew();
m_internal->m_isolate = isolate;
v8::Isolate::Scope iscope(isolate);
v8::HandleScope scope(isolate);
}
}
void CJSContext::Dispose()
{
#ifdef V8_INSPECTOR
v8_debug::disposeInspector(m_internal->m_context);
if (CV8Worker::getInitializer().isInspectorUsed())
CInspectorPool::get().disposeInspector(m_internal->m_isolate);
#endif
m_internal->m_contextPersistent.Reset();
unsigned int nEmbedDataCount = m_internal->m_isolate->GetNumberOfDataSlots();
if (nEmbedDataCount > 0)
{
@ -236,12 +230,10 @@ namespace NSJSBase
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());
v8::Isolate* isolate = m_internal->m_isolate;
v8::Isolate::Scope iscope(isolate);
v8::HandleScope scope(isolate);
m_internal->m_contextPersistent.Reset(isolate, v8::Context::New(isolate));
}
CJSObject* CJSContext::GetGlobal()
@ -251,24 +243,33 @@ namespace NSJSBase
return ret;
}
CJSIsolateScope* CJSContext::CreateIsolateScope()
void CJSContext::Enter()
{
return new CJSIsolateScopeV8(m_internal->m_isolate);
v8::Isolate* isolate = m_internal->m_isolate;
#ifdef LOG_TO_COUT
std::cout << "Entering isolate \t" << m_internal->m_isolate << std::endl;
#endif
isolate->Enter();
m_internal->m_scope.push(new CJSLocalScope());
m_internal->m_context = v8::Local<v8::Context>::New(isolate, m_internal->m_contextPersistent);
if (!m_internal->m_context.IsEmpty())
m_internal->m_context->Enter();
}
CJSContextScope* CJSContext::CreateContextScope()
void CJSContext::Exit()
{
CJSContextScope* pScope = new CJSContextScopeV8(m_internal->m_context);
JSSmart<CJSObject> global = GetCurrent()->GetGlobal();
global->set("window", global.GetPointer());
return pScope;
}
CJSLocalScope* CJSContext::CreateLocalScope()
{
return new CJSLocalScopeV8();
#ifdef LOG_TO_COUT
std::cout << "Exiting isolate \t" << m_internal->m_isolate << std::endl;
#endif
if (!m_internal->m_context.IsEmpty())
m_internal->m_context->Exit();
delete m_internal->m_scope.top();
m_internal->m_scope.pop();
if (m_internal->m_scope.empty())
m_internal->m_context.Clear();
else
m_internal->m_context = m_internal->m_isolate->GetCurrentContext();
m_internal->m_isolate->Exit();
}
CJSValue* CJSContext::createUndefined()
@ -363,8 +364,10 @@ namespace NSJSBase
JSSmart<CJSValue> CJSContext::runScript(const std::string& script, JSSmart<CJSTryCatch> exception, const std::wstring& scriptPath)
{
#ifdef V8_INSPECTOR
v8_debug::before(m_internal->m_context, CV8Worker::getInitializer()->getPlatform(), "");
if (CV8Worker::getInitializer().isInspectorUsed())
CInspectorPool::get().getInspector(m_internal->m_isolate).startAgent();
#endif
LOGGER_START
v8::Local<v8::String> _source = CreateV8String(CV8Worker::GetCurrent(), script.c_str());
@ -402,10 +405,10 @@ namespace NSJSBase
LOGGER_LAP("run")
return _return;
return _return;
}
CJSContext* CJSContext::GetCurrent()
JSSmart<CJSContext> CJSContext::GetCurrent()
{
CJSContext* ret = new CJSContext();
ret->m_internal->m_isolate = CV8Worker::GetCurrent();

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More