@@ -151,17 +151,15 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
151
151
return " " ;
152
152
}
153
153
154
- bool EncodeObject (Local<Value> value, DBusMessageIter *iter, const char *signature )
154
+ bool EncodeObject (Local<Value> value, DBusMessageIter *iter, DBusSignatureIter *siter )
155
155
{
156
156
// printf("EncodeObject %s\n",signature);
157
157
// printf("%p", value);
158
158
Nan::HandleScope scope;
159
- DBusSignatureIter siter;
160
159
int type;
161
160
162
161
// Get type of current value
163
- dbus_signature_iter_init (&siter, signature);
164
- type = dbus_signature_iter_get_current_type (&siter);
162
+ type = dbus_signature_iter_get_current_type (siter);
165
163
166
164
switch (type) {
167
165
case DBUS_TYPE_INVALID:
@@ -319,7 +317,7 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
319
317
char *array_sig = NULL ;
320
318
321
319
// Getting signature of array object
322
- dbus_signature_iter_recurse (& siter, &arraySiter);
320
+ dbus_signature_iter_recurse (siter, &arraySiter);
323
321
array_sig = dbus_signature_iter_get_signature (&arraySiter);
324
322
325
323
// Open array container to process elements in there
@@ -328,28 +326,23 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
328
326
printf (" Can't open container for Array type\n " );
329
327
return false ;
330
328
}
329
+ dbus_free (array_sig);
331
330
332
331
// It's a dictionary
333
- if (dbus_signature_iter_get_element_type (&siter) == DBUS_TYPE_DICT_ENTRY) {
334
-
335
- dbus_free (array_sig);
336
-
332
+ if (dbus_signature_iter_get_element_type (siter) == DBUS_TYPE_DICT_ENTRY) {
337
333
Local<Object> value_object = value->ToObject ();
338
- DBusSignatureIter dictSubSiter;
339
-
340
- // Getting sub-signature object
341
- dbus_signature_iter_recurse (&arraySiter, &dictSubSiter);
342
- char *keySig = dbus_signature_iter_get_signature (&dictSubSiter);
343
- dbus_signature_iter_next (&dictSubSiter);
344
- char *valSig = dbus_signature_iter_get_signature (&dictSubSiter);
345
334
346
335
// process each elements
347
336
Local<Array> prop_names = value_object->GetPropertyNames ();
348
337
unsigned int len = prop_names->Length ();
349
338
350
339
bool failed = false ;
351
340
for (unsigned int i = 0 ; i < len; ++i) {
341
+ DBusSignatureIter dictSubSiter;
352
342
DBusMessageIter dict_iter;
343
+
344
+ // Getting sub-signature object
345
+ dbus_signature_iter_recurse (&arraySiter, &dictSubSiter);
353
346
354
347
// Open dict entry container
355
348
if (!dbus_message_iter_open_container (&subIter, DBUS_TYPE_DICT_ENTRY, NULL , &dict_iter)) {
@@ -363,15 +356,16 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
363
356
Local<Value> prop_value = value_object->Get (prop_key);
364
357
365
358
// Append the key
366
- if (!EncodeObject (prop_key, &dict_iter, keySig )) {
359
+ if (!EncodeObject (prop_key, &dict_iter, &dictSubSiter )) {
367
360
dbus_message_iter_close_container (&subIter, &dict_iter);
368
361
printf (" Failed to encode element of dictionary\n " );
369
362
failed = true ;
370
363
break ;
371
364
}
372
365
373
366
// Append the value
374
- if (!EncodeObject (prop_value, &dict_iter, valSig)) {
367
+ dbus_signature_iter_next (&dictSubSiter);
368
+ if (!EncodeObject (prop_value, &dict_iter, &dictSubSiter)) {
375
369
dbus_message_iter_close_container (&subIter, &dict_iter);
376
370
printf (" Failed to encode element of dictionary\n " );
377
371
failed = true ;
@@ -381,8 +375,6 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
381
375
dbus_message_iter_close_container (&subIter, &dict_iter);
382
376
}
383
377
384
- dbus_free (keySig);
385
- dbus_free (valSig);
386
378
dbus_message_iter_close_container (iter, &subIter);
387
379
388
380
if (failed)
@@ -400,19 +392,19 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
400
392
Local<Array> arrayData = Local<Array>::Cast (value);
401
393
for (unsigned int i = 0 ; i < arrayData->Length (); ++i) {
402
394
Local<Value> arrayItem = arrayData->Get (i);
403
- if (!EncodeObject (arrayItem, &subIter, array_sig ))
395
+ if (!EncodeObject (arrayItem, &subIter, &arraySiter ))
404
396
break ;
405
397
}
406
398
407
399
dbus_message_iter_close_container (iter, &subIter);
408
- dbus_free (array_sig);
409
400
410
401
break ;
411
402
}
412
403
413
404
case DBUS_TYPE_VARIANT:
414
405
{
415
406
DBusMessageIter subIter;
407
+ DBusSignatureIter subSiter;
416
408
417
409
string str_sig = GetSignatureFromV8Type (value);
418
410
const char *var_sig = str_sig.c_str ();
@@ -422,7 +414,8 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
422
414
return false ;
423
415
}
424
416
425
- if (!EncodeObject (value, &subIter, var_sig)) {
417
+ dbus_signature_iter_init (&subSiter, var_sig);
418
+ if (!EncodeObject (value, &subIter, &subSiter)) {
426
419
dbus_message_iter_close_container (iter, &subIter);
427
420
return false ;
428
421
}
@@ -446,26 +439,21 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
446
439
Local<Object> value_object = value->ToObject ();
447
440
448
441
// Getting sub-signature object
449
- dbus_signature_iter_recurse (& siter, &structSiter);
442
+ dbus_signature_iter_recurse (siter, &structSiter);
450
443
451
444
// process each elements
452
445
Local<Array> prop_names = value_object->GetPropertyNames ();
453
446
unsigned int len = prop_names->Length ();
454
447
455
448
for (unsigned int i = 0 ; i < len; ++i) {
456
449
457
- char *sig = dbus_signature_iter_get_signature (&structSiter);
458
-
459
450
Local<Value> prop_key = prop_names->Get (i);
460
451
461
- if (!EncodeObject (value_object->Get (prop_key), &subIter, sig)) {
462
- dbus_free (sig);
452
+ if (!EncodeObject (value_object->Get (prop_key), &subIter, &structSiter)) {
463
453
printf (" Failed to encode element of dictionary\n " );
464
454
return false ;
465
455
}
466
456
467
- dbus_free (sig);
468
-
469
457
if (!dbus_signature_iter_next (&structSiter))
470
458
break ;
471
459
}
0 commit comments