Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
145 lines
4.4 KiB
JavaScript
Executable file
145 lines
4.4 KiB
JavaScript
Executable file
/* globals Plug, deviceManager */
|
|
'use strict';
|
|
|
|
(function(exports) {
|
|
var DEBUG = false;
|
|
function ServiceManager() {
|
|
|
|
}
|
|
|
|
ServiceManager.prototype = {
|
|
listElementId: 'elementList',
|
|
serviceName: 'ConnectionManager',
|
|
serviceType: 'upnp:urn:schemas-upnp-org:service:ConnectionManager:1',
|
|
serviceConstructor: Plug.UPnP_ContentDirectory,
|
|
savedServices: {},
|
|
|
|
init: function sm_init() {
|
|
this.debugEl = document.getElementById('debug');
|
|
this.listElement = document.getElementById(this.listElementId);
|
|
this.discover();
|
|
|
|
return this;
|
|
},
|
|
|
|
debugLog: function sm_debugLog(msg, level) {
|
|
if (!DEBUG && level == 'debug') {
|
|
return;
|
|
}
|
|
var logEl = document.createElement('div');
|
|
logEl.textContent = msg;
|
|
this.debugEl.appendChild(logEl);
|
|
},
|
|
|
|
appendMixinProperties: function sm_appendConfigDocument(serviceWrapper) {
|
|
var parser = new DOMParser();
|
|
serviceWrapper.configDocument =
|
|
parser.parseFromString(serviceWrapper.svc.config, 'text/xml');
|
|
serviceWrapper.friendlyName = serviceWrapper.configDocument.
|
|
getElementsByTagName('friendlyName')[0].textContent;
|
|
},
|
|
|
|
updateService: function sm_updateService(service) {
|
|
if (!this.savedServices[service.id]) {
|
|
var mediaServer =
|
|
new this.serviceConstructor(service, { debug: false });
|
|
this.appendMixinProperties(mediaServer);
|
|
this.savedServices[service.id] = mediaServer;
|
|
deviceManager.addService(mediaServer);
|
|
|
|
var serverItem = this.serverView(mediaServer);
|
|
this.listElement.appendChild(serverItem);
|
|
mediaServer.serverItem = serverItem;
|
|
}
|
|
},
|
|
|
|
removeService: function sm_removeService(service) {
|
|
for(var id in this.savedServices) {
|
|
if (service.id === id) {
|
|
var serverItem = this.savedServices[service.id].serverItem;
|
|
this.removeSiblingList(serverItem);
|
|
serverItem.parentElement.removeChild(serverItem);
|
|
delete this.savedServices[service.id];
|
|
}
|
|
}
|
|
},
|
|
|
|
serverView: function sm_serverView(serviceWrapper) {
|
|
// Add server node
|
|
var serverItem = document.createElement('li');
|
|
var serverName = serviceWrapper.friendlyName;
|
|
serverItem.className = 'server';
|
|
serverItem.textContent = serverName;
|
|
serverItem.dataset.serviceId = serviceWrapper.svc.id;
|
|
return serverItem;
|
|
},
|
|
|
|
onServices: function sm_onServices(services) {
|
|
services.addEventListener('servicefound', function servicefound(e) {
|
|
for (var i = 0; i < services.length; i++) {
|
|
if (services[i].online) {
|
|
this.updateService(services[i]);
|
|
}
|
|
}
|
|
}.bind(this));
|
|
services.addEventListener('servicelost', function servicelost(e) {
|
|
for (var i = 0; i < services.length; i++) {
|
|
if (!services[i].online) {
|
|
this.removeService(services[i]);
|
|
}
|
|
}
|
|
}.bind(this));
|
|
|
|
this.debugLog(services.length + ' service' +
|
|
(services.length !== 1 ? 's' : '') +
|
|
' found in the current network');
|
|
|
|
// Remove offline services
|
|
for (var savedServiceId in this.savedServices) {
|
|
var removed = true;
|
|
for (var i = 0; i < services.length; i++) {
|
|
if (services[i].id == savedServiceId) {
|
|
removed = false;
|
|
break;
|
|
}
|
|
}
|
|
if (removed) {
|
|
this.remove(savedServiceId);
|
|
}
|
|
}
|
|
|
|
// Update services individually
|
|
for (var j = 0; j < services.length; j++) {
|
|
this.updateService(services[j]);
|
|
}
|
|
},
|
|
|
|
get currentService() {
|
|
return deviceManager.getSelectedService(this.serviceName);
|
|
},
|
|
|
|
|
|
removeSiblingList: function sm_remove(elem) {
|
|
if (elem.nextElementSibling.classList.contains('sublist')) {
|
|
elem.parentElement.removeChild(elem.nextElementSibling);
|
|
}
|
|
},
|
|
|
|
discover: function sm_discover() {
|
|
if (navigator.getNetworkServices) {
|
|
this.debugLog('Searching for UPnP services in the current network...');
|
|
|
|
navigator.getNetworkServices(this.serviceType)
|
|
.then(this.onServices.bind(this), function(e) {
|
|
this.debugLog('An error occurred obtaining UPnP Services [CODE: ' +
|
|
e.code + ']');
|
|
});
|
|
} else {
|
|
this.debugLog(
|
|
'navigator.getNetworkServices API is not supported in this browser');
|
|
}
|
|
}
|
|
};
|
|
|
|
exports.ServiceManager = ServiceManager;
|
|
})(window);
|