Skip to content

Commit e55a265

Browse files
authored
Merge pull request #161 from bryanburgers/handler-callback
Use node-style callbacks for methods and properties
2 parents 8409de5 + a293f79 commit e55a265

File tree

8 files changed

+102
-61
lines changed

8 files changed

+102
-61
lines changed

examples/service.js

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,16 @@ iface1.addMethod('MakeError', { out: DBus.Define(String) }, function(callback) {
2121
});
2222

2323
iface1.addMethod('Hello', { out: DBus.Define(String) }, function(callback) {
24-
callback('Hello There!');
24+
callback(null, 'Hello There!');
2525
});
2626

2727
iface1.addMethod('SendObject', { in: [ DBus.Define(Object) ], out: DBus.Define(Object) }, function(obj, callback) {
28-
callback(obj);
28+
callback(null, obj);
2929
});
3030

3131
iface1.addMethod('SendVarient', { in: [ DBus.Define('Auto') ], out: DBus.Define('Auto') }, function(obj, callback) {
3232
console.log(obj);
33-
callback(obj);
33+
callback(null, obj);
3434
});
3535

3636
iface1.addMethod('Ping', { out: DBus.Define(String) }, function(callback) {
@@ -46,14 +46,14 @@ iface1.addMethod('Equal', {
4646
}, function(a, b, callback) {
4747

4848
if (a == b)
49-
callback(true);
49+
callback(null, true);
5050
else
51-
callback(false);
51+
callback(null, false);
5252

5353
});
5454

5555
iface1.addMethod('GetNameList', { out: DBus.Define(Array, 'list') }, function(callback) {
56-
callback([
56+
callback(null, [
5757
'Fred',
5858
'Stacy',
5959
'Charles',
@@ -64,7 +64,7 @@ iface1.addMethod('GetNameList', { out: DBus.Define(Array, 'list') }, function(ca
6464
});
6565

6666
iface1.addMethod('GetContacts', { out: DBus.Define(Object, 'contacts') }, function(callback) {
67-
callback({
67+
callback(null, {
6868
Fred: {
6969
7070
url: 'http://fred-zone.blogspot.com/',
@@ -110,7 +110,7 @@ var author = 'Fred Chien';
110110
iface1.addProperty('Author', {
111111
type: DBus.Define(String),
112112
getter: function(callback) {
113-
callback(author);
113+
callback(null, author);
114114
},
115115
setter: function(value, complete) {
116116
author = value;
@@ -124,7 +124,7 @@ var url = 'http://stem.mandice.org';
124124
iface1.addProperty('URL', {
125125
type: DBus.Define(String),
126126
getter: function(callback) {
127-
callback(url);
127+
callback(null, url);
128128
}
129129
});
130130

@@ -133,7 +133,7 @@ var jsOS = 'Stem OS';
133133
iface1.addProperty('JavaScriptOS', {
134134
type: DBus.Define(String),
135135
getter: function(callback) {
136-
callback(jsOS);
136+
callback(null, jsOS);
137137
}
138138
});
139139

@@ -157,7 +157,7 @@ setInterval(function() {
157157
var iface2 = obj.createInterface('nodejs.dbus.ExampleService.Interface2');
158158

159159
iface2.addMethod('Hello', { out: DBus.Define(String) }, function(callback) {
160-
callback('Hello There!');
160+
callback(null, 'Hello There!');
161161
});
162162

163163
iface2.update();

lib/service_interface.js

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,19 @@ ServiceInterface.prototype.call = function(method, message, args) {
9090
}
9191

9292
// Preparing callback
93-
args = Array.prototype.slice.call(args).concat([ function(value) {
93+
args = Array.prototype.slice.call(args).concat([ function(err, value) {
9494
var type;
9595

9696
// Error handling
97-
if (value instanceof Error) {
98-
var name = value.dbusName || 'org.freedesktop.DBus.Error.Failed';
99-
self.object.service.bus.dbus._sendErrorMessageReply(message, name, value.message);
97+
if (err) {
98+
var errorName = 'org.freedesktop.DBus.Error.Failed';
99+
var errorMessage = err.toString();
100+
if (err instanceof Error) {
101+
errorMessage = err.message;
102+
errorName = err.dbusName || 'org.freedesktop.DBus.Error.Failed';
103+
}
104+
self.object.service.bus.dbus._sendErrorMessageReply(message, errorName, errorMessage);
105+
100106
return;
101107
}
102108

@@ -116,9 +122,9 @@ ServiceInterface.prototype.getProperty = function(propName, callback) {
116122
return false;
117123
}
118124

119-
prop.getter.apply(this, [ function(value) {
125+
prop.getter.apply(this, [ function(err, value) {
120126
if (callback)
121-
callback(value);
127+
callback(err, value);
122128
} ]);
123129

124130
return true;
@@ -133,9 +139,9 @@ ServiceInterface.prototype.setProperty = function(propName, value, callback) {
133139

134140
var args = [value];
135141

136-
args.push(function() {
142+
args.push(function(err) {
137143
// Completed
138-
callback();
144+
callback(err);
139145
});
140146

141147
prop.setter.apply(this, args);
@@ -152,15 +158,20 @@ ServiceInterface.prototype.getProperties = function(callback) {
152158

153159
// Getting property
154160
var prop = self.properties[propName];
155-
prop.getter(function(value) {
161+
prop.getter(function(err, value) {
162+
if (err) {
163+
// TODO: What do we do if a property throws an error?
164+
// For now, just skip the property?
165+
return next();
166+
}
156167
properties[propName] = value;
157168
next();
158169
});
159170

160171
return true;
161172
}, function() {
162173
if (callback)
163-
callback(properties);
174+
callback(null, properties);
164175
});
165176
};
166177

lib/service_object.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ var ServiceObject = module.exports = function(service, objectPath) {
1616
self.introspectableInterface = self.createInterface('org.freedesktop.DBus.Introspectable');
1717
self.introspectableInterface.addMethod('Introspect', { out: Utils.Define(String, 'data') }, function(callback) {
1818
self.updateIntrospection();
19-
callback(self.introspection);
19+
callback(null, self.introspection);
2020
});
2121
self.introspectableInterface.update();
2222

@@ -31,12 +31,12 @@ var ServiceObject = module.exports = function(service, objectPath) {
3131
}, function(interfaceName, propName, callback) {
3232
var iface = self['interfaces'][interfaceName];
3333
if (!iface) {
34-
callback('Doesn\'t support such property');
34+
callback(new Error('Doesn\'t support such property'));
3535
return;
3636
}
3737

3838
if (!iface.getProperty(propName, callback))
39-
callback('Doesn\'t support such property');
39+
callback(new Error('Doesn\'t support such property'));
4040
});
4141

4242
self.propertyInterface.addMethod('Set', {
@@ -48,12 +48,12 @@ var ServiceObject = module.exports = function(service, objectPath) {
4848
}, function(interfaceName, propName, value, callback) {
4949
var iface = self['interfaces'][interfaceName];
5050
if (!iface) {
51-
callback('Doesn\'t support such property');
51+
callback(new Error('Doesn\'t support such property'));
5252
return;
5353
}
5454

5555
if (!iface.setProperty(propName, value, callback))
56-
callback('Doesn\'t support such property');
56+
callback(new Error('Doesn\'t support such property'));
5757
});
5858

5959
self.propertyInterface.addMethod('GetAll', {
@@ -64,12 +64,12 @@ var ServiceObject = module.exports = function(service, objectPath) {
6464
}, function(interfaceName, callback) {
6565
var iface = self['interfaces'][interfaceName];
6666
if (!iface) {
67-
callback('Doesn\'t have any properties');
67+
callback(new Error('Doesn\'t have any properties'));
6868
return;
6969
}
7070

71-
iface.getProperties(function(props) {
72-
callback(props);
71+
iface.getProperties(function(err, props) {
72+
callback(err, props);
7373
});
7474
});
7575

test/client-call-error.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ withService('service.js', function(err, done) {
99
var dbus = new DBus();
1010
var bus = dbus.getBus('session');
1111

12-
bus.getInterface('test.dbus.TestService', '/test/dbus/TestService', 'test.dbus.TestService.Interface1', function(err, iface) {
12+
bus.getInterface('test.dbus.TestService', '/test/dbus/TestService', 'test.dbus.TestService.ErrorInterface', function(err, iface) {
1313
iface.ThrowsError({ timeout: 1000 }, function(err, result) {
1414
tap.notSame(err, null);
1515
tap.same(result, null);

test/client-call-object.test.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
var withService = require('./with-service');
2+
var tap = require('tap');
3+
var DBus = require('../');
4+
5+
tap.plan(3);
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.Object({ one: 'One', two: [1,2] }, { timeout: 1000 }, function(err, result) {
15+
tap.notSame(result, null);
16+
tap.equal(result.one, 'One');
17+
tap.same(result.two, [1, 2]);
18+
19+
done();
20+
bus.disconnect();
21+
});
22+
});
23+
});

test/client-property-error.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ withService('service.js', function(err, done) {
99
var dbus = new DBus();
1010
var bus = dbus.getBus('session');
1111

12-
bus.getInterface('test.dbus.TestService', '/test/dbus/TestService', 'test.dbus.TestService.Interface1', function(err, iface) {
12+
bus.getInterface('test.dbus.TestService', '/test/dbus/TestService', 'test.dbus.TestService.ErrorInterface', function(err, iface) {
1313
iface.getProperty('ErrorProperty', function(err, value) {
1414
tap.notSame(err, null);
1515
tap.same(value, null);

test/service-dynamic.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ process.on('message', function(msg) {
1616
subiface.addProperty('Value', {
1717
type: DBus.Define(String),
1818
getter: function(callback) {
19-
callback(value);
19+
callback(null, value);
2020
}
2121
});
2222
subiface.update();

test/service.js

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,42 +11,33 @@ var obj = service.createObject('/test/dbus/TestService');
1111
var iface1 = obj.createInterface('test.dbus.TestService.Interface1');
1212

1313
iface1.addMethod('NoArgs', { out: DBus.Define(String) }, function(callback) {
14-
callback('result!');
14+
callback(null, 'result!');
1515
});
1616

1717
iface1.addMethod('Add', { in: [DBus.Define(Number), DBus.Define(Number)], out: DBus.Define(Number) }, function(n1, n2, callback) {
18-
callback(n1 + n2);
18+
callback(null, n1 + n2);
1919
});
2020

21-
iface1.addMethod('LongProcess', { out: DBus.Define(Number) }, function(callback) {
22-
setTimeout(function() {
23-
callback(0);
24-
}, 5000).unref();
25-
});
26-
27-
iface1.addMethod('ThrowsError', { out: DBus.Define(Number) }, function(callback) {
28-
setTimeout(function() {
29-
callback(new Error('This is an error thrown from the service'));
30-
}, 100);
21+
iface1.addMethod('Object', { in: [DBus.Define(Object)], out: DBus.Define(Object) }, function(obj, callback) {
22+
callback(null, obj);
3123
});
3224

33-
iface1.addMethod('ThrowsCustomError', { out: DBus.Define(Number) }, function(callback) {
25+
iface1.addMethod('LongProcess', { out: DBus.Define(Number) }, function(callback) {
3426
setTimeout(function() {
35-
var error = new DBus.Error('test.dbus.TestService.Error', 'This is an error thrown from the service');
36-
callback(error);
37-
}, 100);
27+
callback(null, 0);
28+
}, 5000).unref();
3829
});
3930

4031
var author = 'Fred Chien';
4132
iface1.addProperty('Author', {
4233
type: DBus.Define(String),
4334
getter: function(callback) {
44-
callback(author);
35+
callback(null, author);
4536
},
46-
setter: function(value, complete) {
37+
setter: function(value, callback) {
4738
author = value;
4839

49-
complete();
40+
callback();
5041
}
5142
});
5243

@@ -55,15 +46,7 @@ var url = 'http://stem.mandice.org';
5546
iface1.addProperty('URL', {
5647
type: DBus.Define(String),
5748
getter: function(callback) {
58-
callback(url);
59-
}
60-
});
61-
62-
// Read-only property
63-
iface1.addProperty('ErrorProperty', {
64-
type: DBus.Define(String),
65-
getter: function(callback) {
66-
callback(new Error('This is an error thrown from the service'));
49+
callback(null, url);
6750
}
6851
});
6952

@@ -84,11 +67,35 @@ var interval = setInterval(function() {
8467
}, 1000);
8568
interval.unref();
8669

70+
var errors = obj.createInterface('test.dbus.TestService.ErrorInterface');
71+
72+
errors.addMethod('ThrowsError', { out: DBus.Define(Number) }, function(callback) {
73+
setTimeout(function() {
74+
callback(new Error('This is an error thrown from the service'));
75+
}, 100);
76+
});
77+
78+
errors.addMethod('ThrowsCustomError', { out: DBus.Define(Number) }, function(callback) {
79+
setTimeout(function() {
80+
var error = new DBus.Error('test.dbus.TestService.Error', 'This is an error thrown from the service');
81+
callback(error);
82+
}, 100);
83+
});
84+
85+
errors.addProperty('ErrorProperty', {
86+
type: DBus.Define(String),
87+
getter: function(callback) {
88+
callback(new Error('This is an error thrown from the service'));
89+
}
90+
});
91+
92+
errors.update();
93+
8794
// Create second interface
8895
var iface2 = obj.createInterface('test.dbus.TestService.Interface2');
8996

9097
iface2.addMethod('Hello', { out: DBus.Define(String) }, function(callback) {
91-
callback('Hello There!');
98+
callback(null, 'Hello There!');
9299
});
93100

94101
iface2.update();

0 commit comments

Comments
 (0)