OLD | NEW |
| (Empty) |
1 /* | |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | |
3 * Copyright (C) 2006-2016 Eyeo GmbH | |
4 * | |
5 * Adblock Plus is free software: you can redistribute it and/or modify | |
6 * it under the terms of the GNU General Public License version 3 as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * Adblock Plus is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License | |
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | |
16 */ | |
17 | |
18 #include <AdblockPlus.h> | |
19 #include "Utils.h" | |
20 #include "JniCallbacks.h" | |
21 | |
22 static void TransformAppInfo(JNIEnv* env, jobject jAppInfo, AdblockPlus::AppInfo
& appInfo) | |
23 { | |
24 jclass clazz = env->GetObjectClass(jAppInfo); | |
25 | |
26 appInfo.application = JniGetStringField(env, clazz, jAppInfo, "application"); | |
27 appInfo.applicationVersion = JniGetStringField(env, clazz, jAppInfo, "applicat
ionVersion"); | |
28 appInfo.locale = JniGetStringField(env, clazz, jAppInfo, "locale"); | |
29 appInfo.name = JniGetStringField(env, clazz, jAppInfo, "name"); | |
30 appInfo.version = JniGetStringField(env, clazz, jAppInfo, "version"); | |
31 | |
32 appInfo.developmentBuild = JniGetBooleanField(env, clazz, jAppInfo, "developme
ntBuild"); | |
33 } | |
34 | |
35 static jlong JNICALL JniCtor(JNIEnv* env, jclass clazz, jobject jAppInfo) | |
36 { | |
37 AdblockPlus::AppInfo appInfo; | |
38 | |
39 TransformAppInfo(env, jAppInfo, appInfo); | |
40 | |
41 try | |
42 { | |
43 return JniPtrToLong(new AdblockPlus::JsEnginePtr(AdblockPlus::JsEngine::New(
appInfo))); | |
44 } | |
45 CATCH_THROW_AND_RETURN(env, 0) | |
46 } | |
47 | |
48 static void JNICALL JniDtor(JNIEnv* env, jclass clazz, jlong ptr) | |
49 { | |
50 delete JniLongToTypePtr<AdblockPlus::JsEnginePtr>(ptr); | |
51 } | |
52 | |
53 static void JNICALL JniSetEventCallback(JNIEnv* env, jclass clazz, jlong ptr, js
tring jEventName, jlong jCallbackPtr) | |
54 { | |
55 AdblockPlus::JsEnginePtr& engine = *JniLongToTypePtr<AdblockPlus::JsEnginePtr>
(ptr); | |
56 | |
57 JniEventCallback* callback = JniLongToTypePtr<JniEventCallback>(jCallbackPtr); | |
58 std::string eventName = JniJavaToStdString(env, jEventName); | |
59 AdblockPlus::JsEngine::EventCallback eCallback = std::bind(&JniEventCallback::
Callback, callback, std::placeholders::_1); | |
60 | |
61 try | |
62 { | |
63 engine->SetEventCallback(eventName, eCallback); | |
64 } | |
65 CATCH_AND_THROW(env) | |
66 } | |
67 | |
68 static void JNICALL JniRemoveEventCallback(JNIEnv* env, jclass clazz, jlong ptr,
jstring jEventName) | |
69 { | |
70 AdblockPlus::JsEnginePtr& engine = *JniLongToTypePtr<AdblockPlus::JsEnginePtr>
(ptr); | |
71 | |
72 std::string eventName = JniJavaToStdString(env, jEventName); | |
73 | |
74 try | |
75 { | |
76 engine->RemoveEventCallback(eventName); | |
77 } | |
78 CATCH_AND_THROW(env) | |
79 } | |
80 | |
81 static jobject JNICALL JniEvaluate(JNIEnv* env, jclass clazz, jlong ptr, jstring
jSource, jstring jFilename) | |
82 { | |
83 AdblockPlus::JsEnginePtr& engine = *JniLongToTypePtr<AdblockPlus::JsEnginePtr>
(ptr); | |
84 | |
85 std::string source = JniJavaToStdString(env, jSource); | |
86 std::string filename = JniJavaToStdString(env, jFilename); | |
87 | |
88 try | |
89 { | |
90 AdblockPlus::JsValuePtr jsValue = engine->Evaluate(source, filename); | |
91 return NewJniJsValue(env, jsValue); | |
92 } | |
93 CATCH_THROW_AND_RETURN(env, 0) | |
94 } | |
95 | |
96 static void JNICALL JniTriggerEvent(JNIEnv* env, jclass clazz, jlong ptr, jstrin
g jEventName, jarray jJsPtrs) | |
97 { | |
98 AdblockPlus::JsEnginePtr& engine = *JniLongToTypePtr<AdblockPlus::JsEnginePtr>
(ptr); | |
99 std::string eventName = JniJavaToStdString(env, jEventName); | |
100 AdblockPlus::JsValueList args; | |
101 | |
102 if (jJsPtrs) | |
103 { | |
104 jlong* ptrs = (jlong*)env->GetPrimitiveArrayCritical(jJsPtrs, 0); | |
105 | |
106 jsize length = env->GetArrayLength(jJsPtrs); | |
107 | |
108 for (jsize i = 0; i < length; i++) | |
109 { | |
110 args.push_back(JniGetJsValuePtr(ptrs[i])); | |
111 } | |
112 | |
113 env->ReleasePrimitiveArrayCritical(jJsPtrs, ptrs, JNI_ABORT); | |
114 } | |
115 | |
116 try | |
117 { | |
118 engine->TriggerEvent(eventName, args); | |
119 } | |
120 CATCH_AND_THROW(env) | |
121 } | |
122 | |
123 static void JNICALL JniSetDefaultFileSystem(JNIEnv* env, jclass clazz, jlong ptr
, jstring jBasePath) | |
124 { | |
125 AdblockPlus::JsEnginePtr& engine = *JniLongToTypePtr<AdblockPlus::JsEnginePtr>
(ptr); | |
126 | |
127 try | |
128 { | |
129 AdblockPlus::FileSystemPtr fileSystem(new AdblockPlus::DefaultFileSystem()); | |
130 | |
131 std::string basePath = JniJavaToStdString(env, jBasePath); | |
132 reinterpret_cast<AdblockPlus::DefaultFileSystem*>(fileSystem.get())->SetBase
Path(basePath); | |
133 | |
134 engine->SetFileSystem(fileSystem); | |
135 } | |
136 CATCH_AND_THROW(env) | |
137 } | |
138 | |
139 static void JNICALL JniSetDefaultWebRequest(JNIEnv* env, jclass clazz, jlong ptr
) | |
140 { | |
141 AdblockPlus::JsEnginePtr& engine = *JniLongToTypePtr<AdblockPlus::JsEnginePtr>
(ptr); | |
142 | |
143 try | |
144 { | |
145 AdblockPlus::WebRequestPtr webRequest(new AdblockPlus::DefaultWebRequest()); | |
146 | |
147 engine->SetWebRequest(webRequest); | |
148 } | |
149 CATCH_AND_THROW(env) | |
150 } | |
151 | |
152 static void JNICALL JniSetDefaultLogSystem(JNIEnv* env, jclass clazz, jlong ptr) | |
153 { | |
154 AdblockPlus::JsEnginePtr& engine = *JniLongToTypePtr<AdblockPlus::JsEnginePtr>
(ptr); | |
155 | |
156 try | |
157 { | |
158 AdblockPlus::LogSystemPtr logSystem(new AdblockPlus::DefaultLogSystem()); | |
159 | |
160 engine->SetLogSystem(logSystem); | |
161 } | |
162 CATCH_AND_THROW(env) | |
163 } | |
164 | |
165 static void JNICALL JniSetLogSystem(JNIEnv* env, jclass clazz, jlong ptr, jlong
logSystemPtr) | |
166 { | |
167 AdblockPlus::JsEnginePtr& engine = *JniLongToTypePtr<AdblockPlus::JsEnginePtr>
(ptr); | |
168 | |
169 try | |
170 { | |
171 AdblockPlus::LogSystemPtr logSystem(JniLongToTypePtr<JniLogSystemCallback>(l
ogSystemPtr)); | |
172 | |
173 engine->SetLogSystem(logSystem); | |
174 } | |
175 CATCH_AND_THROW(env) | |
176 } | |
177 | |
178 static void JNICALL JniSetWebRequest(JNIEnv* env, jclass clazz, jlong ptr, jlong
webRequestPtr) | |
179 { | |
180 AdblockPlus::JsEnginePtr& engine = *JniLongToTypePtr<AdblockPlus::JsEnginePtr>
(ptr); | |
181 | |
182 try | |
183 { | |
184 AdblockPlus::WebRequestPtr& webRequest = *JniLongToTypePtr<AdblockPlus::WebR
equestPtr>(webRequestPtr); | |
185 | |
186 engine->SetWebRequest(webRequest); | |
187 } | |
188 CATCH_AND_THROW(env) | |
189 } | |
190 | |
191 static jobject JNICALL JniNewLongValue(JNIEnv* env, jclass clazz, jlong ptr, jlo
ng value) | |
192 { | |
193 AdblockPlus::JsEnginePtr& engine = *JniLongToTypePtr<AdblockPlus::JsEnginePtr>
(ptr); | |
194 | |
195 try | |
196 { | |
197 AdblockPlus::JsValuePtr jsValue = engine->NewValue(static_cast<int64_t>(valu
e)); | |
198 return NewJniJsValue(env, jsValue); | |
199 } | |
200 CATCH_THROW_AND_RETURN(env, 0) | |
201 } | |
202 | |
203 static jobject JNICALL JniNewBooleanValue(JNIEnv* env, jclass clazz, jlong ptr,
jboolean value) | |
204 { | |
205 AdblockPlus::JsEnginePtr& engine = *JniLongToTypePtr<AdblockPlus::JsEnginePtr>
(ptr); | |
206 | |
207 try | |
208 { | |
209 AdblockPlus::JsValuePtr jsValue = engine->NewValue(value == JNI_TRUE ? true
: false); | |
210 return NewJniJsValue(env, jsValue); | |
211 } | |
212 CATCH_THROW_AND_RETURN(env, 0) | |
213 } | |
214 | |
215 static jobject JNICALL JniNewStringValue(JNIEnv* env, jclass clazz, jlong ptr, j
string value) | |
216 { | |
217 AdblockPlus::JsEnginePtr& engine = *JniLongToTypePtr<AdblockPlus::JsEnginePtr>
(ptr); | |
218 | |
219 try | |
220 { | |
221 std::string strValue = JniJavaToStdString(env, value); | |
222 AdblockPlus::JsValuePtr jsValue = engine->NewValue(strValue); | |
223 return NewJniJsValue(env, jsValue); | |
224 } | |
225 CATCH_THROW_AND_RETURN(env, 0) | |
226 } | |
227 | |
228 // TODO: List of functions that lack JNI bindings | |
229 //JsValuePtr NewObject(); | |
230 //JsValuePtr NewCallback(v8::InvocationCallback callback); | |
231 //static JsEnginePtr FromArguments(const v8::Arguments& arguments); | |
232 //JsValueList ConvertArguments(const v8::Arguments& arguments); | |
233 | |
234 static JNINativeMethod methods[] = | |
235 { | |
236 { (char*)"ctor", (char*)"(" TYP("AppInfo") ")J", (void*)JniCtor }, | |
237 { (char*)"dtor", (char*)"(J)V", (void*)JniDtor }, | |
238 | |
239 { (char*)"setEventCallback", (char*)"(JLjava/lang/String;J)V", (void*)JniSetEv
entCallback }, | |
240 { (char*)"removeEventCallback", (char*)"(JLjava/lang/String;)V", (void*)JniRem
oveEventCallback }, | |
241 { (char*)"triggerEvent", (char*)"(JLjava/lang/String;[J)V", (void*)JniTriggerE
vent }, | |
242 | |
243 { (char*)"evaluate", (char*)"(JLjava/lang/String;Ljava/lang/String;)" TYP("JsV
alue"), (void*)JniEvaluate }, | |
244 | |
245 { (char*)"setDefaultFileSystem", (char*)"(JLjava/lang/String;)V", (void*)JniSe
tDefaultFileSystem }, | |
246 { (char*)"setLogSystem", (char*)"(JJ)V", (void*)JniSetLogSystem }, | |
247 { (char*)"setDefaultLogSystem", (char*)"(J)V", (void*)JniSetDefaultLogSystem }
, | |
248 { (char*)"setWebRequest", (char*)"(JJ)V", (void*)JniSetWebRequest }, | |
249 { (char*)"setDefaultWebRequest", (char*)"(J)V", (void*)JniSetDefaultWebRequest
}, | |
250 | |
251 { (char*)"newValue", (char*)"(JJ)" TYP("JsValue"), (void*)JniNewLongValue }, | |
252 { (char*)"newValue", (char*)"(JZ)" TYP("JsValue"), (void*)JniNewBooleanValue }
, | |
253 { (char*)"newValue", (char*)"(JLjava/lang/String;)" TYP("JsValue"), (void*)Jni
NewStringValue } | |
254 }; | |
255 | |
256 extern "C" JNIEXPORT void JNICALL Java_org_adblockplus_libadblockplus_JsEngine_r
egisterNatives(JNIEnv *env, jclass clazz) | |
257 { | |
258 env->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(methods[0])); | |
259 } | |
OLD | NEW |