Skip to content

Commit 8839028

Browse files
committed
Adding support for encoding dictionaries with non-string keys
1 parent d817c10 commit 8839028

File tree

3 files changed

+37
-7
lines changed

3 files changed

+37
-7
lines changed

src/encoder.cc

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -339,8 +339,9 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
339339

340340
// Getting sub-signature object
341341
dbus_signature_iter_recurse(&arraySiter, &dictSubSiter);
342+
char *keySig = dbus_signature_iter_get_signature(&dictSubSiter);
342343
dbus_signature_iter_next(&dictSubSiter);
343-
char *sig = dbus_signature_iter_get_signature(&dictSubSiter);
344+
char *valSig = dbus_signature_iter_get_signature(&dictSubSiter);
344345

345346
// process each elements
346347
Local<Array> prop_names = value_object->GetPropertyNames();
@@ -362,13 +363,15 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
362363
Local<Value> prop_value = value_object->Get(prop_key);
363364

364365
// Append the key
365-
char *prop_key_str = strdup(*String::Utf8Value(prop_key->ToString()));
366-
// printf("key: %s\n", prop_key_str);
367-
dbus_message_iter_append_basic(&dict_iter, DBUS_TYPE_STRING, &prop_key_str);
368-
dbus_free(prop_key_str);
366+
if (!EncodeObject(prop_key, &dict_iter, keySig)) {
367+
dbus_message_iter_close_container(&subIter, &dict_iter);
368+
printf("Failed to encode element of dictionary\n");
369+
failed = true;
370+
break;
371+
}
369372

370373
// Append the value
371-
if (!EncodeObject(prop_value, &dict_iter, sig)) {
374+
if (!EncodeObject(prop_value, &dict_iter, valSig)) {
372375
dbus_message_iter_close_container(&subIter, &dict_iter);
373376
printf("Failed to encode element of dictionary\n");
374377
failed = true;
@@ -378,7 +381,8 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
378381
dbus_message_iter_close_container(&subIter, &dict_iter);
379382
}
380383

381-
dbus_free(sig);
384+
dbus_free(keySig);
385+
dbus_free(valSig);
382386
dbus_message_iter_close_container(iter, &subIter);
383387

384388
if (failed)

test/client-call-intdict.test.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
var withService = require('./with-service');
2+
var tap = require('tap');
3+
var DBus = require('../');
4+
5+
tap.plan(2);
6+
withService('service.js', function(err, done) {
7+
if (err) throw err;
8+
9+
var dbus = new DBus();
10+
var bus = dbus.getBus('session');
11+
12+
bus.getInterface('test.dbus.TestService', '/test/dbus/TestService', 'test.dbus.TestService.Interface1', function(err, iface) {
13+
// With options
14+
iface.IntDict({ 1: 'One', 42: 'Answer' }, { timeout: 1000 }, function(err, result) {
15+
tap.notSame(result, null);
16+
tap.same(result, [1, 42]);
17+
18+
done();
19+
bus.disconnect();
20+
});
21+
});
22+
});

test/service.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ iface1.addMethod('Object', { in: [DBus.Define(Object)], out: DBus.Define(Object)
2020
callback(null, obj);
2121
});
2222

23+
iface1.addMethod('IntDict', { in: [{ type: 'a{ys}' }], out: { type: 'ay' }}, function (dict, callback) {
24+
callback(null, Object.keys(dict).sort());
25+
})
26+
2327
iface1.addMethod('LongProcess', { out: DBus.Define(Number) }, function(callback) {
2428
setTimeout(function() {
2529
callback(null, 0);

0 commit comments

Comments
 (0)