Skip to content

Commit c607e48

Browse files
committed
performing initialization of signature iterators outside EncodeObject, to simplify recursion a bit
1 parent 8839028 commit c607e48

File tree

5 files changed

+38
-36
lines changed

5 files changed

+38
-36
lines changed

src/dbus.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,11 @@ namespace NodeDBus {
214214
dbus_signature_iter_init(&siter, sig);
215215
for (unsigned int i = 0; i < argument_arr->Length(); ++i) {
216216
char *arg_sig = dbus_signature_iter_get_signature(&siter);
217+
DBusSignatureIter subSiter;
217218
Local<Value> arg = argument_arr->Get(i);
218219

219-
if (!Encoder::EncodeObject(arg, &iter, arg_sig)) {
220+
dbus_signature_iter_init(&subSiter, arg_sig);
221+
if (!Encoder::EncodeObject(arg, &iter, &subSiter)) {
220222
dbus_free(arg_sig);
221223
break;
222224
}

src/encoder.cc

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -151,17 +151,15 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
151151
return "";
152152
}
153153

154-
bool EncodeObject(Local<Value> value, DBusMessageIter *iter, const char *signature)
154+
bool EncodeObject(Local<Value> value, DBusMessageIter *iter, DBusSignatureIter *siter)
155155
{
156156
// printf("EncodeObject %s\n",signature);
157157
// printf("%p", value);
158158
Nan::HandleScope scope;
159-
DBusSignatureIter siter;
160159
int type;
161160

162161
// 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);
165163

166164
switch(type) {
167165
case DBUS_TYPE_INVALID:
@@ -319,7 +317,7 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
319317
char *array_sig = NULL;
320318

321319
// Getting signature of array object
322-
dbus_signature_iter_recurse(&siter, &arraySiter);
320+
dbus_signature_iter_recurse(siter, &arraySiter);
323321
array_sig = dbus_signature_iter_get_signature(&arraySiter);
324322

325323
// Open array container to process elements in there
@@ -328,28 +326,23 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
328326
printf("Can't open container for Array type\n");
329327
return false;
330328
}
329+
dbus_free(array_sig);
331330

332331
// 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) {
337333
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);
345334

346335
// process each elements
347336
Local<Array> prop_names = value_object->GetPropertyNames();
348337
unsigned int len = prop_names->Length();
349338

350339
bool failed = false;
351340
for (unsigned int i = 0; i < len; ++i) {
341+
DBusSignatureIter dictSubSiter;
352342
DBusMessageIter dict_iter;
343+
344+
// Getting sub-signature object
345+
dbus_signature_iter_recurse(&arraySiter, &dictSubSiter);
353346

354347
// Open dict entry container
355348
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);
363356
Local<Value> prop_value = value_object->Get(prop_key);
364357

365358
// Append the key
366-
if (!EncodeObject(prop_key, &dict_iter, keySig)) {
359+
if (!EncodeObject(prop_key, &dict_iter, &dictSubSiter)) {
367360
dbus_message_iter_close_container(&subIter, &dict_iter);
368361
printf("Failed to encode element of dictionary\n");
369362
failed = true;
370363
break;
371364
}
372365

373366
// 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)) {
375369
dbus_message_iter_close_container(&subIter, &dict_iter);
376370
printf("Failed to encode element of dictionary\n");
377371
failed = true;
@@ -381,8 +375,6 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
381375
dbus_message_iter_close_container(&subIter, &dict_iter);
382376
}
383377

384-
dbus_free(keySig);
385-
dbus_free(valSig);
386378
dbus_message_iter_close_container(iter, &subIter);
387379

388380
if (failed)
@@ -400,19 +392,19 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
400392
Local<Array> arrayData = Local<Array>::Cast(value);
401393
for (unsigned int i = 0; i < arrayData->Length(); ++i) {
402394
Local<Value> arrayItem = arrayData->Get(i);
403-
if (!EncodeObject(arrayItem, &subIter, array_sig))
395+
if (!EncodeObject(arrayItem, &subIter, &arraySiter))
404396
break;
405397
}
406398

407399
dbus_message_iter_close_container(iter, &subIter);
408-
dbus_free(array_sig);
409400

410401
break;
411402
}
412403

413404
case DBUS_TYPE_VARIANT:
414405
{
415406
DBusMessageIter subIter;
407+
DBusSignatureIter subSiter;
416408

417409
string str_sig = GetSignatureFromV8Type(value);
418410
const char *var_sig = str_sig.c_str();
@@ -422,7 +414,8 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
422414
return false;
423415
}
424416

425-
if (!EncodeObject(value, &subIter, var_sig)) {
417+
dbus_signature_iter_init(&subSiter, var_sig);
418+
if (!EncodeObject(value, &subIter, &subSiter)) {
426419
dbus_message_iter_close_container(iter, &subIter);
427420
return false;
428421
}
@@ -446,26 +439,21 @@ typedef bool (*CheckTypeCallback) (Local<Value>& value, const char* sig);
446439
Local<Object> value_object = value->ToObject();
447440

448441
// Getting sub-signature object
449-
dbus_signature_iter_recurse(&siter, &structSiter);
442+
dbus_signature_iter_recurse(siter, &structSiter);
450443

451444
// process each elements
452445
Local<Array> prop_names = value_object->GetPropertyNames();
453446
unsigned int len = prop_names->Length();
454447

455448
for (unsigned int i = 0; i < len; ++i) {
456449

457-
char *sig = dbus_signature_iter_get_signature(&structSiter);
458-
459450
Local<Value> prop_key = prop_names->Get(i);
460451

461-
if (!EncodeObject(value_object->Get(prop_key), &subIter, sig)) {
462-
dbus_free(sig);
452+
if (!EncodeObject(value_object->Get(prop_key), &subIter, &structSiter)) {
463453
printf("Failed to encode element of dictionary\n");
464454
return false;
465455
}
466456

467-
dbus_free(sig);
468-
469457
if (!dbus_signature_iter_next(&structSiter))
470458
break;
471459
}

src/encoder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace Encoder {
88
using namespace std;
99

1010
string GetSignatureFromV8Type(Local<Value>& value);
11-
bool EncodeObject(Local<Value> value, DBusMessageIter *iter, const char *signature);
11+
bool EncodeObject(Local<Value> value, DBusMessageIter *iter, DBusSignatureIter *siter);
1212
}
1313

1414
#endif

src/object_handler.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,15 @@ namespace ObjectHandler {
7777
{
7878
Nan::HandleScope scope;
7979
DBusMessageIter iter;
80+
DBusSignatureIter siter;
8081
DBusMessage *reply;
8182
dbus_uint32_t serial = 0;
8283

8384
reply = dbus_message_new_method_return(message);
8485

8586
dbus_message_iter_init_append(reply, &iter);
86-
if (!Encoder::EncodeObject(reply_value, &iter, signature)) {
87+
dbus_signature_iter_init(&siter, signature);
88+
if (!Encoder::EncodeObject(reply_value, &iter, &siter)) {
8789
printf("Failed to encode reply value\n");
8890
}
8991

src/signal.cc

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ namespace Signal {
4141
}
4242

4343
NAN_METHOD(EmitSignal) {
44+
DBusError error;
45+
4446
if (!info[0]->IsObject()) {
4547
return Nan::ThrowTypeError("First parameter must be an object");
4648
}
@@ -80,6 +82,9 @@ namespace Signal {
8082
char *signal = strdup(*String::Utf8Value(info[3]->ToString()));
8183
message = dbus_message_new_signal(path, interface, signal);
8284

85+
// Initializing error handler
86+
dbus_error_init(&error);
87+
8388
// Preparing message
8489
dbus_message_iter_init_append(message, &iter);
8590

@@ -88,10 +93,15 @@ namespace Signal {
8893
Local<Array> signatures = Local<Array>::Cast(info[5]);
8994
for (unsigned int i = 0; i < arguments->Length(); ++i) {
9095
Local<Value> arg = arguments->Get(i);
91-
96+
DBusSignatureIter siter;
97+
9298
char *sig = strdup(*String::Utf8Value(signatures->Get(i)->ToString()));
93-
94-
if (!Encoder::EncodeObject(arg, &iter, sig)) {
99+
if (!dbus_signature_validate(sig, &error)) {
100+
return Nan::ThrowError(error.message);
101+
}
102+
103+
dbus_signature_iter_init(&siter, sig);
104+
if (!Encoder::EncodeObject(arg, &iter, &siter)) {
95105
dbus_free(sig);
96106
printf("Failed to encode arguments of signal\n");
97107
break;

0 commit comments

Comments
 (0)