Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit ee7df6b

Browse files
committed
[[ BrowserWidget ]] Convert JS objects to LBC Arrays on Android
1 parent 0b01610 commit ee7df6b

File tree

3 files changed

+367
-72
lines changed

3 files changed

+367
-72
lines changed

libbrowser/src/libbrowser_android.cpp

Lines changed: 210 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ class MCBrowserJavaConverter
8484
m_jsonarray_class = nil;
8585
m_jsonarray_length_method = nil;
8686
m_jsonarray_get_method = nil;
87+
88+
m_jsonobject_class = nil;
89+
m_jsonobject_names_method = nil;
90+
m_jsonobject_get_method = nil;
8791
}
8892

8993
~MCBrowserJavaConverter()
@@ -130,6 +134,14 @@ class MCBrowserJavaConverter
130134
return m_env->IsInstanceOf(p_obj, m_jsonarray_class);
131135
}
132136

137+
bool IsJSONObject(jobject p_obj)
138+
{
139+
if (!InitJSONObject())
140+
return false;
141+
142+
return m_env->IsInstanceOf(p_obj, m_jsonobject_class);
143+
}
144+
133145
bool GetBooleanValue(jobject p_obj, bool &r_value)
134146
{
135147
if (!InitBoolean())
@@ -162,6 +174,80 @@ class MCBrowserJavaConverter
162174
return MCBrowserJavaStringToUtf8String(m_env, p_string, r_string);
163175
}
164176

177+
bool GetBrowserValue(jobject p_obj, MCBrowserValue &r_value)
178+
{
179+
bool t_success;
180+
t_success = true;
181+
182+
if (IsBoolean(p_obj))
183+
{
184+
bool t_val;
185+
t_success = GetBooleanValue(p_obj, t_val);
186+
187+
if (t_success)
188+
t_success = MCBrowserValueSetBoolean(r_value, t_val);
189+
}
190+
else if (IsInteger(p_obj))
191+
{
192+
int t_val;
193+
t_success = GetIntegerValue(p_obj, t_val);
194+
195+
if (t_success)
196+
t_success = MCBrowserValueSetInteger(r_value, t_val);
197+
}
198+
else if (IsDouble(p_obj))
199+
{
200+
double t_val;
201+
t_success = GetDoubleValue(p_obj, t_val);
202+
203+
if (t_success)
204+
t_success = MCBrowserValueSetDouble(r_value, t_val);
205+
}
206+
else if (IsString(p_obj))
207+
{
208+
char *t_val;
209+
t_val = nil;
210+
t_success = GetStringValue((jstring)p_obj, t_val);
211+
212+
if (t_success)
213+
t_success = MCBrowserValueSetUTF8String(r_value, t_val);
214+
215+
if (t_val != nil)
216+
MCCStringFree(t_val);
217+
}
218+
else if (IsJSONArray(p_obj))
219+
{
220+
MCBrowserListRef t_val;
221+
t_val = nil;
222+
t_success = GetJSONArrayValue(p_obj, t_val);
223+
224+
if (t_success)
225+
t_success = MCBrowserValueSetList(r_value, t_val);
226+
227+
if (t_val != nil)
228+
MCBrowserListRelease(t_val);
229+
}
230+
else if (IsJSONObject(p_obj))
231+
{
232+
MCBrowserDictionaryRef t_val;
233+
t_val = nil;
234+
t_success = GetJSONObjectValue(p_obj, t_val);
235+
236+
if (t_success)
237+
t_success = MCBrowserValueSetDictionary(r_value, t_val);
238+
239+
if (t_val != nil)
240+
MCBrowserDictionaryRelease(t_val);
241+
}
242+
else
243+
{
244+
MCLog("Convert: unhandled object class: %p", p_obj);
245+
MCBrowserValueClear(r_value);
246+
}
247+
248+
return t_success;
249+
}
250+
165251
bool GetJSONArrayLength(jobject p_array, uint32_t &r_length)
166252
{
167253
if (!InitJSONArray())
@@ -182,6 +268,9 @@ class MCBrowserJavaConverter
182268

183269
bool GetJSONArrayValue(jobject p_array, MCBrowserListRef &r_list)
184270
{
271+
if (!InitJSONArray())
272+
return false;
273+
185274
bool t_success;
186275
t_success = true;
187276

@@ -197,69 +286,24 @@ class MCBrowserJavaConverter
197286

198287
for (uint32_t i = 0; t_success && i < t_size; i++)
199288
{
289+
MCBrowserValue t_value;
290+
MCBrowserMemoryClear(&t_value, sizeof(MCBrowserValue));
291+
200292
jobject t_obj;
201293
t_obj = nil;
202294

203295
t_success = GetJSONArrayElement(p_array, i, t_obj);
204296

205-
bool t_identified;
206-
t_identified = false;
297+
if (t_success)
298+
t_success = GetBrowserValue(t_obj, t_value);
207299

208300
if (t_success)
209-
{
210-
if (IsBoolean(t_obj))
211-
{
212-
bool t_val;
213-
t_success = GetBooleanValue(t_obj, t_val);
214-
215-
if (t_success)
216-
t_success = MCBrowserListSetBoolean(t_list, i, t_val);
217-
}
218-
else if (IsInteger(t_obj))
219-
{
220-
int t_val;
221-
t_success = GetIntegerValue(t_obj, t_val);
222-
223-
if (t_success)
224-
t_success = MCBrowserListSetInteger(t_list, i, t_val);
225-
}
226-
else if (IsDouble(t_obj))
227-
{
228-
double t_val;
229-
t_success = GetDoubleValue(t_obj, t_val);
230-
231-
if (t_success)
232-
t_success = MCBrowserListSetDouble(t_list, i, t_val);
233-
}
234-
else if (IsString(t_obj))
235-
{
236-
char *t_val;
237-
t_val = nil;
238-
t_success = GetStringValue((jstring)t_obj, t_val);
239-
240-
if (t_success)
241-
t_success = MCBrowserListSetUTF8String(t_list, i, t_val);
242-
243-
if (t_val != nil)
244-
MCCStringFree(t_val);
245-
}
246-
else if (IsJSONArray(t_obj))
247-
{
248-
MCBrowserListRef t_val;
249-
t_val = nil;
250-
t_success = GetJSONArrayValue(t_obj, t_val);
251-
252-
if (t_success)
253-
t_success = MCBrowserListSetList(t_list, i, t_val);
254-
255-
if (t_val != nil)
256-
MCBrowserListRelease(t_val);
257-
}
258-
else
259-
{
260-
MCLog("Convert: unhandled object class: %p", t_obj);
261-
}
262-
}
301+
t_success = MCBrowserListSetValue(t_list, i, t_value);
302+
303+
if (t_obj != nil)
304+
m_env->DeleteLocalRef(t_obj);
305+
306+
MCBrowserValueClear(t_value);
263307
}
264308

265309
if (t_success)
@@ -270,6 +314,98 @@ class MCBrowserJavaConverter
270314
return t_success;
271315
}
272316

317+
bool GetJSONObjectNames(jobject p_object, jobject &r_names_array)
318+
{
319+
if (!InitJSONObject())
320+
return false;
321+
322+
r_names_array = m_env->CallObjectMethod(p_object, m_jsonobject_names_method);
323+
return true;
324+
}
325+
326+
bool GetJSONObjectElement(jobject p_object, jstring p_key, jobject &r_element)
327+
{
328+
if (!InitJSONObject())
329+
return false;
330+
331+
r_element = m_env->CallObjectMethod(p_object, m_jsonobject_get_method, p_key);
332+
return true;
333+
}
334+
335+
bool GetJSONObjectValue(jobject p_object, MCBrowserDictionaryRef &r_dict)
336+
{
337+
if (!InitJSONObject())
338+
return true;
339+
340+
bool t_success;
341+
t_success = true;
342+
343+
jobject t_names;
344+
t_names = nil;
345+
if (t_success)
346+
t_success = GetJSONObjectNames(p_object, t_names);
347+
348+
uint32_t t_size;
349+
if (t_success)
350+
t_success = GetJSONArrayLength(t_names, t_size);
351+
352+
MCBrowserDictionaryRef t_dict;
353+
t_dict = nil;
354+
355+
if (t_success)
356+
t_success = MCBrowserDictionaryCreate(t_dict, t_size);
357+
358+
for (uint32_t i = 0; t_success && i < t_size; i++)
359+
{
360+
MCBrowserValue t_value;
361+
MCBrowserMemoryClear(&t_value, sizeof(MCBrowserValue));
362+
363+
jstring t_key;
364+
t_key = nil;
365+
366+
if (t_success)
367+
t_success = GetJSONArrayElement(t_names, i, (jobject&)t_key);
368+
369+
char *t_key_string;
370+
t_key_string = nil;
371+
372+
if (t_success)
373+
t_success = GetStringValue(t_key, t_key_string);
374+
375+
jobject t_obj;
376+
t_obj = nil;
377+
if (t_success)
378+
t_success = GetJSONObjectElement(p_object, t_key, t_obj);
379+
380+
if (t_success)
381+
t_success = GetBrowserValue(t_obj, t_value);
382+
383+
if (t_success)
384+
t_success = MCBrowserDictionarySetValue(t_dict, t_key_string, t_value);
385+
386+
if (t_key_string != nil)
387+
MCCStringFree(t_key_string);
388+
389+
if (t_key != nil)
390+
m_env->DeleteLocalRef(t_key);
391+
392+
if (t_obj != nil)
393+
m_env->DeleteLocalRef(t_obj);
394+
395+
MCBrowserValueClear(t_value);
396+
}
397+
398+
if (t_names != nil)
399+
m_env->DeleteLocalRef(t_names);
400+
401+
if (t_success)
402+
r_dict = t_dict;
403+
else
404+
MCBrowserDictionaryRelease(t_dict);
405+
406+
return t_success;
407+
}
408+
273409
private:
274410
bool InitClass(const char *p_class, jclass &r_class)
275411
{
@@ -358,6 +494,20 @@ class MCBrowserJavaConverter
358494
return true;
359495
}
360496

497+
bool InitJSONObject()
498+
{
499+
if (m_jsonobject_class == nil && !InitClass("org/json/JSONObject", m_jsonobject_class))
500+
return false;
501+
502+
if (m_jsonobject_names_method == nil && !InitMethod(m_jsonobject_class, "names", "()Lorg/json/JSONArray;", m_jsonobject_names_method))
503+
return false;
504+
505+
if (m_jsonobject_get_method == nil && !InitMethod(m_jsonobject_class, "get", "(Ljava/lang/String;)Ljava/lang/Object;", m_jsonobject_get_method))
506+
return false;
507+
508+
return true;
509+
}
510+
361511
jclass m_boolean_class;
362512
jmethodID m_boolean_value_method;
363513

@@ -373,6 +523,10 @@ class MCBrowserJavaConverter
373523
jmethodID m_jsonarray_length_method;
374524
jmethodID m_jsonarray_get_method;
375525

526+
jclass m_jsonobject_class;
527+
jmethodID m_jsonobject_names_method;
528+
jmethodID m_jsonobject_get_method;
529+
376530
JNIEnv *m_env;
377531
};
378532

libbrowser/src/libbrowser_internal.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,43 @@ inline void MCBrowserMemoryDeleteArray(T*p_array)
147147

148148
////////////////////////////////////////////////////////////////////////////////
149149

150+
struct MCBrowserValue
151+
{
152+
MCBrowserValueType type;
153+
union
154+
{
155+
bool boolean;
156+
int32_t integer;
157+
double double_val;
158+
char *utf8_string;
159+
MCBrowserListRef array;
160+
MCBrowserDictionaryRef dictionary;
161+
};
162+
};
163+
164+
void MCBrowserValueClear(MCBrowserValue &p_value);
165+
bool MCBrowserValueCopy(const MCBrowserValue &p_src, MCBrowserValue &r_dst);
166+
167+
bool MCBrowserValueSetBoolean(MCBrowserValue &self, bool p_value);
168+
bool MCBrowserValueGetBoolean(MCBrowserValue &self, bool &r_value);
169+
bool MCBrowserValueSetInteger(MCBrowserValue &self, int32_t p_value);
170+
bool MCBrowserValueGetInteger(MCBrowserValue &self, int32_t &r_value);
171+
bool MCBrowserValueSetDouble(MCBrowserValue &self, double p_value);
172+
bool MCBrowserValueGetDouble(MCBrowserValue &self, double &r_value);
173+
bool MCBrowserValueSetUTF8String(MCBrowserValue &self, const char *p_value);
174+
bool MCBrowserValueGetUTF8String(MCBrowserValue &self, char *&r_value);
175+
bool MCBrowserValueSetList(MCBrowserValue &self, MCBrowserListRef p_value);
176+
bool MCBrowserValueGetList(MCBrowserValue &self, MCBrowserListRef &r_value);
177+
bool MCBrowserValueSetDictionary(MCBrowserValue &self, MCBrowserDictionaryRef p_value);
178+
bool MCBrowserValueGetDictionary(MCBrowserValue &self, MCBrowserDictionaryRef &r_value);
179+
180+
bool MCBrowserListSetValue(MCBrowserListRef p_list, uint32_t p_index, const MCBrowserValue &p_value);
181+
bool MCBrowserListGetValue(MCBrowserListRef p_list, uint32_t p_index, MCBrowserValue &r_value);
182+
bool MCBrowserListAppendValue(MCBrowserListRef p_list, const MCBrowserValue &p_value);
183+
184+
bool MCBrowserDictionarySetValue(MCBrowserDictionaryRef p_dict, const char *p_key, const MCBrowserValue &p_value);
185+
bool MCBrowserDictionaryGetValue(MCBrowserDictionaryRef p_dict, const char *p_key, MCBrowserValue &r_value);
186+
187+
////////////////////////////////////////////////////////////////////////////////
188+
150189
#endif //__LIBBROWSER_INTERNAL_H__

0 commit comments

Comments
 (0)