@@ -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+
273409private:
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
0 commit comments