Skip to content

Commit 121d709

Browse files
authored
Merge pull request #179 from emilbayes/master
Better error handling for taken objects and names
2 parents ae8d3ff + a9feaf9 commit 121d709

File tree

4 files changed

+41
-10
lines changed

4 files changed

+41
-10
lines changed

lib/dbus.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,10 @@ DBus.registerService = function(busName, serviceName) {
8585
serviceMap[serviceHash] = service;
8686

8787
if (serviceName) {
88-
process.nextTick(function() {
89-
DBus._requestName(bus, _serviceName);
90-
});
88+
DBus._requestName(bus, _serviceName);
9189
}
9290

93-
return service;
91+
return service
9492
};
9593

9694
/* Deprecated */

src/dbus.cc

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,8 @@ namespace NodeDBus {
310310
}
311311

312312
NAN_METHOD(RequestName) {
313+
DBusError error;
314+
313315
if (!info[0]->IsObject()) {
314316
return Nan::ThrowTypeError("First argument must be an object (bus)");
315317
}
@@ -321,12 +323,19 @@ namespace NodeDBus {
321323
BusObject *bus = static_cast<BusObject *>(Nan::GetInternalFieldPointer(info[0]->ToObject(), 0));
322324
char *service_name = strdup(*String::Utf8Value(info[1]->ToString()));
323325

326+
dbus_error_init(&error);
327+
324328
// Request bus name
325-
dbus_bus_request_name(bus->connection, service_name, 0, NULL);
329+
dbus_bus_request_name(bus->connection, service_name, 0, &error);
326330
dbus_connection_flush(bus->connection);
327331

328-
dbus_free(service_name);
332+
if (dbus_error_is_set(&error)) {
333+
dbus_free(service_name);
329334

335+
return Nan::ThrowError(error.message);
336+
}
337+
338+
dbus_free(service_name);
330339
return;
331340
}
332341

src/object_handler.cc

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ namespace ObjectHandler {
9999
DBusObjectPathVTable vtable = CreateVTable();
100100

101101
NAN_METHOD(RegisterObjectPath) {
102+
DBusError error;
102103
if (!info[0]->IsObject()) {
103104
return Nan::ThrowTypeError("First parameter must be an object (bus)");
104105
}
@@ -111,14 +112,16 @@ namespace ObjectHandler {
111112

112113
// Register object path
113114
char *object_path = strdup(*Nan::Utf8String(info[1]));
114-
dbus_bool_t ret = dbus_connection_register_object_path(bus->connection,
115+
dbus_error_init(&error);
116+
dbus_bool_t ret = dbus_connection_try_register_object_path(bus->connection,
115117
object_path,
116118
&vtable,
117-
NULL);
119+
NULL,
120+
&error);
118121
dbus_connection_flush(bus->connection);
119122
dbus_free(object_path);
120-
if (!ret) {
121-
return Nan::ThrowError("Out of Memory");
123+
if (dbus_error_is_set(&error)) {
124+
return Nan::ThrowError(error.message);
122125
}
123126

124127
return;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
var tap = require('tap');
2+
var DBus = require('../');
3+
4+
tap.plan(1);
5+
6+
var service = DBus.registerService('session', 'test.dbus.TestService');
7+
var object = service.createObject('/test/dbus/TestService');
8+
var iface = object.createInterface('test.dbus.TestService.Interface1');
9+
iface.addSignal('Test', { types: [DBus.Define(String)] });
10+
iface.update()
11+
12+
setTimeout(function() {
13+
tap.throws(function() {
14+
var objectd = service.createObject('/test/dbus/TestService');
15+
var ifaced = objectd.createInterface('test.dbus.TestService.Interface1');
16+
ifaced.addSignal('Test', { types: [DBus.Define(String)] });
17+
ifaced.update();
18+
})
19+
20+
service.disconnect()
21+
}, 100);

0 commit comments

Comments
 (0)