Publish Vulpes Preview 15 sources for desktop, Android and Tundra

Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
This commit is contained in:
OverSu 2026-09-30 23:13:03 +02:00
commit b38dea0597
25901 changed files with 9982925 additions and 369 deletions

View file

@ -0,0 +1,145 @@
/* 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);