Skip to content

Commit 56c2b73

Browse files
authored
Merge pull request #154 from bryanburgers/unregister
Unregister objects
2 parents 12d120c + 0a91ba8 commit 56c2b73

12 files changed

+160
-14
lines changed

lib/service.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,9 @@ Service.prototype.createObject = function(objectPath) {
3333

3434
return self.objects[objectPath];
3535
};
36+
37+
Service.prototype.removeObject = function(object) {
38+
var self = this;
39+
40+
self.bus.dbus._dbus.unregisterObjectPath(self.bus.connection, object.path);
41+
};

src/dbus.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ namespace NodeDBus {
314314
Nan::SetMethod(exports, "callMethod", CallMethod);
315315
Nan::SetMethod(exports, "requestName", RequestName);
316316
Nan::SetMethod(exports, "registerObjectPath", ObjectHandler::RegisterObjectPath);
317+
Nan::SetMethod(exports, "unregisterObjectPath", ObjectHandler::UnregisterObjectPath);
317318
Nan::SetMethod(exports, "sendMessageReply", ObjectHandler::SendMessageReply);
318319
Nan::SetMethod(exports, "sendErrorMessageReply", ObjectHandler::SendErrorMessageReply);
319320
Nan::SetMethod(exports, "setObjectHandler", ObjectHandler::SetObjectHandler);

src/object_handler.cc

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,30 @@ namespace ObjectHandler {
122122
return;
123123
}
124124

125+
NAN_METHOD(UnregisterObjectPath) {
126+
if (!info[0]->IsObject()) {
127+
return Nan::ThrowTypeError("First parameter must be an object (bus)");
128+
}
129+
130+
if (!info[1]->IsString()) {
131+
return Nan::ThrowTypeError("Second parameter must be a string (object path)");
132+
}
133+
134+
NodeDBus::BusObject *bus = static_cast<NodeDBus::BusObject *>(Nan::GetInternalFieldPointer(info[0]->ToObject(), 0));
135+
136+
// Register object path
137+
char *object_path = strdup(*Nan::Utf8String(info[1]));
138+
dbus_bool_t ret = dbus_connection_unregister_object_path(bus->connection,
139+
object_path);
140+
dbus_connection_flush(bus->connection);
141+
dbus_free(object_path);
142+
if (!ret) {
143+
return Nan::ThrowError("Out of Memory");
144+
}
145+
146+
return;
147+
}
148+
125149
NAN_METHOD(SendMessageReply) {
126150
if (!info[0]->IsObject()) {
127151
return Nan::ThrowTypeError("First parameter must be an object");

src/object_handler.h

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

1010
NAN_METHOD(RegisterObjectPath);
11+
NAN_METHOD(UnregisterObjectPath);
1112
NAN_METHOD(SendMessageReply);
1213
NAN_METHOD(SendErrorMessageReply);
1314
NAN_METHOD(SetObjectHandler);

test/client-call-add.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ var withService = require('./with-service');
22
var tap = require('tap');
33
var DBus = require('../');
44

5-
tap.plan(2);
6-
withService(function(err, done) {
5+
tap.plan(1);
6+
withService('service.js', function(err, done) {
77
if (err) throw err;
88

99
var dbus = new DBus();

test/client-call-noargs.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ var withService = require('./with-service');
22
var tap = require('tap');
33
var DBus = require('../');
44

5-
tap.plan(2);
6-
withService(function(err, done) {
5+
tap.plan(1);
6+
withService('service.js', function(err, done) {
77
if (err) throw err;
88

99
var dbus = new DBus();

test/client-call-timeout.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ var withService = require('./with-service');
22
var tap = require('tap');
33
var DBus = require('../');
44

5-
tap.plan(2);
6-
withService(function(err, done) {
5+
tap.plan(1);
6+
withService('service.js', function(err, done) {
77
if (err) throw err;
88

99
var dbus = new DBus();

test/client-property.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ var tap = require('tap');
33
var DBus = require('../');
44

55
tap.plan(5);
6-
withService(function(err, done) {
6+
withService('service.js', function(err, done) {
77
if (err) throw err;
88

99
var dbus = new DBus();

test/client-signal.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ var tap = require('tap');
33
var DBus = require('../');
44

55
tap.plan(1);
6-
withService(function(err, done) {
6+
withService('service.js', function(err, done) {
77
if (err) throw err;
88

99
var dbus = new DBus();
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
var withService = require('./with-service');
2+
var tap = require('tap');
3+
var DBus = require('../');
4+
5+
tap.plan(4);
6+
withService('service-dynamic.js', function(err, done) {
7+
if (err) throw err;
8+
9+
var dbus = new DBus();
10+
var bus = dbus.getBus('session');
11+
var process = done.process;
12+
13+
addObject(process, '1', function() {
14+
checkInterface(bus, '1', function(err, result) {
15+
tap.equal(result, true);
16+
checkInterface(bus, '2', function(err, result) {
17+
tap.equal(result, false);
18+
addObject(process, '2', function() {
19+
checkInterface(bus, '2', function(err, result) {
20+
tap.equal(result, true);
21+
removeObject(process, '2', function() {
22+
checkInterface(bus, '2', function(err, result) {
23+
tap.equal(result, false);
24+
done();
25+
});
26+
});
27+
});
28+
});
29+
});
30+
});
31+
});
32+
});
33+
34+
function addObject(process, value, callback) {
35+
process.once('message', function() {
36+
callback();
37+
});
38+
process.send({ type: 'add', value: value });
39+
}
40+
41+
function removeObject(process, value, callback) {
42+
process.once('message', function() {
43+
callback();
44+
});
45+
process.send({ type: 'remove', value: value });
46+
}
47+
48+
function checkInterface(bus, value, callback) {
49+
value = value.toString();
50+
bus.getInterface('test.dbus.DynamicTestService', '/test/dbus/DynamicTestService/subs/' + value, 'test.dbus.DynamicTestService.DynamicInterface1', function(err, iface) {
51+
if (!err) {
52+
// We might have the interface cached. Let's actually
53+
// try to get a property.
54+
iface.getProperty('Value', function(err, result) {
55+
if (!err) {
56+
return callback(null, true);
57+
}
58+
if (/UnknownMethod/.test(err.message)) {
59+
// This object doesn't exist. We're good.
60+
return callback(null, false);
61+
}
62+
return callback(err);
63+
});
64+
return;
65+
}
66+
if (/interface/.test(err.message)) {
67+
return callback(null, false);
68+
}
69+
callback(err);
70+
});
71+
}
72+

0 commit comments

Comments
 (0)