diff --git a/.gitignore b/.gitignore index 866c303..d1dc153 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.idea # Logs logs *.log diff --git a/lib/Bluez.js b/lib/Bluez.js index ed71d41..ff46cc5 100644 --- a/lib/Bluez.js +++ b/lib/Bluez.js @@ -32,7 +32,6 @@ class Bluez extends EventEmitter { this.mediaplayer = {}; this.mediatransport = {}; this.mediacontrol = {}; - this._path = {}; } @@ -46,6 +45,51 @@ class Bluez extends EventEmitter { this.objectManager.GetManagedObjects((err, objs) => { Object.keys(objs).forEach((k) => this.onInterfacesAdded(k, objs[k])) }); + this.bus.on('signal', this.signalHandler.bind(this)); + } + + signalHandler(uniqueBusName, sender, objectPath, interfaceName, signalName, args) { + if (signalName === 'PropertiesChanged' && objectPath.includes('bluez')) { + if (Array.isArray(args) && args.length > 1) { + let [[key, value]] = Object.entries(args[1]); + let addr = objectPath.substr('/org/bluez/hci0/dev_'.length, 17).replace(/_/g, ':'); + switch (args[0]) { + case 'org.bluez.Device1': + this.emit('device_property', addr, key, value); + break; + case 'org.bluez.MediaPlayer1': + this.emit('player_property', addr, key, value); + break; + case 'org.bluez.MediaTransport1': + this.emit('transport_property', addr, key, value); + break; + case 'org.bluez.MediaControl1': + this.emit('control_property', addr, key, value); + break; + } + } + } + } + + close() { + Object.keys(this.adapter).forEach((key) => { + if (this.adapter[key].removeAllListeners) { + this.adapter[key].removeAllListeners(); + } + if (this.adapter[key].destroy) { + this.adapter[key].destroy(); + } + }); + this.objectManager.removeAllListeners('InterfacesAdded'); + this.objectManager.removeAllListeners('InterfacesRemoved'); + this.objectManager.removeAllListeners(); + this.profileManager.removeAllListeners(); + this.agentManager.removeAllListeners(); + if (this.userServiceObject) { + this.userService.removeObject(this.userServiceObject); + this.userServiceObject = undefined; + } + this.bus.removeAllListeners('signal'); } async getAdapter(dev) { @@ -401,4 +445,4 @@ class Bluez extends EventEmitter { } } -module.exports = Bluez; \ No newline at end of file +module.exports = Bluez; diff --git a/lib/Device.js b/lib/Device.js index 2cd793e..a81490d 100644 --- a/lib/Device.js +++ b/lib/Device.js @@ -1,34 +1,10 @@ -const EventEmitter = require('events').EventEmitter; - -class Device extends EventEmitter { +class Device { constructor(_interface, DbusObject) { - super(); this._interface = _interface; this.services = {}; this._DBusObject = DbusObject; } - initEvents() - { - this._DBusObject.on('signal', (uniqueBusName, sender, objectPath, interfaceName, signalName, args) => { - - if(objectPath == this._interface.objectPath) - { - if(Array.isArray(args)) - { - if(args.length > 1 && args[0] == 'org.bluez.Device1') - { - Object.entries(args[1]).forEach(entry => { - let key = entry[0]; - let value = entry[1]; - this.emit("PropertyChanged", this._interface.objectPath, key, value); - }); - } - } - } - }); - } - /* This is a generic method to connect any profiles the remote device supports that can be connected @@ -451,4 +427,4 @@ class Device extends EventEmitter { } } -module.exports = Device; \ No newline at end of file +module.exports = Device; diff --git a/lib/MediaControl.js b/lib/MediaControl.js index 4a63fc6..20dafbc 100644 --- a/lib/MediaControl.js +++ b/lib/MediaControl.js @@ -1,33 +1,9 @@ -const EventEmitter = require('events').EventEmitter; - -class MediaControl extends EventEmitter { +class MediaControl { constructor(_interface, DbusObject) { - super(); this._interface = _interface; this._DBusObject = DbusObject; } - initEvents() - { - this._DBusObject.on('signal', (uniqueBusName, sender, objectPath, interfaceName, signalName, args) => { - - if(objectPath == this._interface.objectPath) - { - if(Array.isArray(args)) - { - if(args.length > 1 && args[0] == 'org.bluez.MediaControl1') - { - Object.entries(args[1]).forEach(entry => { - let key = entry[0]; - let value = entry[1]; - this.emit("PropertyChanged", key, value); - }); - } - } - } - }); - } - /****** Properties ******/ getProperties() { return new Promise((resolve, reject)=>{ diff --git a/lib/MediaPlayer.js b/lib/MediaPlayer.js index d6bcd8c..7f829bf 100644 --- a/lib/MediaPlayer.js +++ b/lib/MediaPlayer.js @@ -1,33 +1,9 @@ -const EventEmitter = require('events').EventEmitter; - -class MediaPlayer extends EventEmitter { +class MediaPlayer { constructor(_interface, DbusObject) { - super(); this._interface = _interface; this._DBusObject = DbusObject; } - initEvents() - { - this._DBusObject.on('signal', (uniqueBusName, sender, objectPath, interfaceName, signalName, args) => { - - if(objectPath == this._interface.objectPath) - { - if(Array.isArray(args)) - { - if(args.length > 1 && args[0] == 'org.bluez.MediaPlayer1') - { - Object.entries(args[1]).forEach(entry => { - let key = entry[0]; - let value = entry[1]; - this.emit("PropertyChanged", key, value); - }); - } - } - } - }); - } - /****** Properties ******/ getProperties() { diff --git a/lib/MediaTransport.js b/lib/MediaTransport.js index 15d9e2a..f121e7a 100644 --- a/lib/MediaTransport.js +++ b/lib/MediaTransport.js @@ -1,33 +1,9 @@ -const EventEmitter = require('events').EventEmitter; - -class MediaTransport extends EventEmitter { +class MediaTransport { constructor(_interface, DbusObject) { - super(); this._interface = _interface; this._DBusObject = DbusObject; } - initEvents() - { - this._DBusObject.on('signal', (uniqueBusName, sender, objectPath, interfaceName, signalName, args) => { - - if(objectPath == this._interface.objectPath) - { - if(Array.isArray(args)) - { - if(args.length > 1 && args[0] == 'org.bluez.MediaTransport1') - { - Object.entries(args[1]).forEach(entry => { - let key = entry[0]; - let value = entry[1]; - this.emit("PropertyChanged", key, value); - }); - } - } - } - }); - } - /****** Properties ******/ getProperties() { return new Promise((resolve, reject)=>{ diff --git a/package-lock.json b/package-lock.json index b11bd84..bf0f12a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "bluez", - "version": "0.1.1", + "version": "0.2.2", "lockfileVersion": 1, "requires": true, "dependencies": {