@@ -151,12 +151,20 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
151
151
return " " ;
152
152
}
153
153
154
- bool EncodeObject (Local<Value> value, DBusMessageIter *iter, DBusSignatureIter *siter)
154
+ bool EncodeObject (Local<Value> value, DBusMessageIter *iter,
155
+ const DBusSignatureIter *siter,
156
+ const DBusSignatureIter *concreteSiter)
155
157
{
156
158
// printf("EncodeObject %s\n",signature);
157
159
// printf("%p", value);
158
160
Nan::HandleScope scope;
159
161
int type;
162
+
163
+ if (concreteSiter == NULL )
164
+ {
165
+ // this is safe because we never modify siter
166
+ concreteSiter = siter;
167
+ }
160
168
161
169
// Get type of current value
162
170
type = dbus_signature_iter_get_current_type (siter);
@@ -313,11 +321,12 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
313
321
}
314
322
315
323
DBusMessageIter subIter;
316
- DBusSignatureIter arraySiter;
324
+ DBusSignatureIter arraySiter, arrayConcreteSiter ;
317
325
char *array_sig = NULL ;
318
326
319
327
// Getting signature of array object
320
328
dbus_signature_iter_recurse (siter, &arraySiter);
329
+ dbus_signature_iter_recurse (concreteSiter, &arrayConcreteSiter);
321
330
array_sig = dbus_signature_iter_get_signature (&arraySiter);
322
331
323
332
// Open array container to process elements in there
@@ -338,11 +347,12 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
338
347
339
348
bool failed = false ;
340
349
for (unsigned int i = 0 ; i < len; ++i) {
341
- DBusSignatureIter dictSubSiter;
350
+ DBusSignatureIter dictSubSiter, dictSubConcreteSiter ;
342
351
DBusMessageIter dict_iter;
343
352
344
353
// Getting sub-signature object
345
354
dbus_signature_iter_recurse (&arraySiter, &dictSubSiter);
355
+ dbus_signature_iter_recurse (&arrayConcreteSiter, &dictSubConcreteSiter);
346
356
347
357
// Open dict entry container
348
358
if (!dbus_message_iter_open_container (&subIter, DBUS_TYPE_DICT_ENTRY, NULL , &dict_iter)) {
@@ -356,7 +366,7 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
356
366
Local<Value> prop_value = value_object->Get (prop_key);
357
367
358
368
// Append the key
359
- if (!EncodeObject (prop_key, &dict_iter, &dictSubSiter)) {
369
+ if (!EncodeObject (prop_key, &dict_iter, &dictSubSiter, &dictSubConcreteSiter )) {
360
370
dbus_message_iter_close_container (&subIter, &dict_iter);
361
371
printf (" Failed to encode element of dictionary\n " );
362
372
failed = true ;
@@ -365,7 +375,8 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
365
375
366
376
// Append the value
367
377
dbus_signature_iter_next (&dictSubSiter);
368
- if (!EncodeObject (prop_value, &dict_iter, &dictSubSiter)) {
378
+ dbus_signature_iter_next (&dictSubConcreteSiter);
379
+ if (!EncodeObject (prop_value, &dict_iter, &dictSubSiter, &dictSubConcreteSiter)) {
369
380
dbus_message_iter_close_container (&subIter, &dict_iter);
370
381
printf (" Failed to encode element of dictionary\n " );
371
382
failed = true ;
@@ -392,7 +403,7 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
392
403
Local<Array> arrayData = Local<Array>::Cast (value);
393
404
for (unsigned int i = 0 ; i < arrayData->Length (); ++i) {
394
405
Local<Value> arrayItem = arrayData->Get (i);
395
- if (!EncodeObject (arrayItem, &subIter, &arraySiter))
406
+ if (!EncodeObject (arrayItem, &subIter, &arraySiter, &arrayConcreteSiter ))
396
407
break ;
397
408
}
398
409
@@ -405,30 +416,41 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
405
416
{
406
417
DBusMessageIter subIter;
407
418
DBusSignatureIter subSiter;
408
-
409
- string str_sig = GetSignatureFromV8Type (value);
410
- const char *var_sig = str_sig.c_str ();
419
+
420
+ char *var_sig;
421
+ if (dbus_signature_iter_get_current_type (concreteSiter) == DBUS_TYPE_VARIANT)
422
+ {
423
+ string str_sig = GetSignatureFromV8Type (value);
424
+ var_sig = strdup (str_sig.c_str ());
425
+ }
426
+ else
427
+ {
428
+ var_sig = dbus_signature_iter_get_signature (concreteSiter);
429
+ }
411
430
412
431
if (!dbus_message_iter_open_container (iter, DBUS_TYPE_VARIANT, var_sig, &subIter)) {
432
+ dbus_free (var_sig);
413
433
printf (" Can't open container for VARIANT type\n " );
414
434
return false ;
415
435
}
416
436
417
437
dbus_signature_iter_init (&subSiter, var_sig);
418
- if (!EncodeObject (value, &subIter, &subSiter)) {
438
+ if (!EncodeObject (value, &subIter, &subSiter, &subSiter )) {
419
439
dbus_message_iter_close_container (iter, &subIter);
440
+ dbus_free (var_sig);
420
441
return false ;
421
442
}
422
443
423
444
dbus_message_iter_close_container (iter, &subIter);
445
+ dbus_free (var_sig);
424
446
425
447
break ;
426
448
}
427
449
case DBUS_TYPE_STRUCT:
428
450
{
429
451
// printf("struct\n");
430
452
DBusMessageIter subIter;
431
- DBusSignatureIter structSiter;
453
+ DBusSignatureIter structSiter, structConcreteSiter ;
432
454
433
455
// Open array container to process elements in there
434
456
if (!dbus_message_iter_open_container (iter, DBUS_TYPE_STRUCT, NULL , &subIter)) {
@@ -440,6 +462,7 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
440
462
441
463
// Getting sub-signature object
442
464
dbus_signature_iter_recurse (siter, &structSiter);
465
+ dbus_signature_iter_recurse (concreteSiter, &structConcreteSiter);
443
466
444
467
// process each elements
445
468
Local<Array> prop_names = value_object->GetPropertyNames ();
@@ -449,13 +472,16 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
449
472
450
473
Local<Value> prop_key = prop_names->Get (i);
451
474
452
- if (!EncodeObject (value_object->Get (prop_key), &subIter, &structSiter)) {
475
+ if (!EncodeObject (value_object->Get (prop_key), &subIter, &structSiter, &structConcreteSiter )) {
453
476
printf (" Failed to encode element of dictionary\n " );
454
477
return false ;
455
478
}
456
479
457
480
if (!dbus_signature_iter_next (&structSiter))
458
481
break ;
482
+
483
+ if (!dbus_signature_iter_next (&structConcreteSiter))
484
+ break ;
459
485
}
460
486
461
487
dbus_message_iter_close_container (iter, &subIter);
0 commit comments