Bug 1020564 - Change SSDP 'target' references to 'device' to cut down on confusing concepts r=wesj
This commit is contained in:
@@ -24,7 +24,7 @@ function discovery_observer(subject, topic, data) {
|
||||
run_next_test();
|
||||
};
|
||||
|
||||
var testTarget = {
|
||||
var testDevice = {
|
||||
target: "test:service",
|
||||
factory: function(service) { /* dummy */ },
|
||||
types: ["video/mp4"],
|
||||
@@ -33,14 +33,14 @@ var testTarget = {
|
||||
|
||||
add_test(function test_default() {
|
||||
do_register_cleanup(function cleanup() {
|
||||
SimpleServiceDiscovery.unregisterTarget(testTarget);
|
||||
SimpleServiceDiscovery.unregisterDevice(testDevice);
|
||||
Services.obs.removeObserver(discovery_observer, "ssdp-service-found");
|
||||
});
|
||||
|
||||
Services.obs.addObserver(discovery_observer, "ssdp-service-found", false);
|
||||
|
||||
// We need to register a target or processService will ignore us
|
||||
SimpleServiceDiscovery.registerTarget(testTarget);
|
||||
// We need to register a device or processService will ignore us
|
||||
SimpleServiceDiscovery.registerDevice(testDevice);
|
||||
|
||||
// Create a pretend service
|
||||
let service = {
|
||||
|
||||
@@ -7,9 +7,9 @@
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "PageActions",
|
||||
"resource://gre/modules/PageActions.jsm");
|
||||
|
||||
// Define service targets. We should consider moving these to their respective
|
||||
// Define service devices. We should consider moving these to their respective
|
||||
// JSM files, but we left them here to allow for better lazy JSM loading.
|
||||
var rokuTarget = {
|
||||
var rokuDevice = {
|
||||
target: "roku:ecp",
|
||||
factory: function(aService) {
|
||||
Cu.import("resource://gre/modules/RokuApp.jsm");
|
||||
@@ -19,7 +19,7 @@ var rokuTarget = {
|
||||
extensions: ["mp4"]
|
||||
};
|
||||
|
||||
var fireflyTarget = {
|
||||
var fireflyDevice = {
|
||||
target: "urn:dial-multiscreen-org:service:dial:1",
|
||||
filters: {
|
||||
server: null,
|
||||
@@ -33,7 +33,7 @@ var fireflyTarget = {
|
||||
extensions: ["mp4", "webm"]
|
||||
};
|
||||
|
||||
var mediaPlayerTarget = {
|
||||
var mediaPlayerDevice = {
|
||||
target: "media:router",
|
||||
factory: function(aService) {
|
||||
Cu.import("resource://gre/modules/MediaPlayerApp.jsm");
|
||||
@@ -54,9 +54,9 @@ var CastingApps = {
|
||||
}
|
||||
|
||||
// Register targets
|
||||
SimpleServiceDiscovery.registerTarget(rokuTarget);
|
||||
SimpleServiceDiscovery.registerTarget(fireflyTarget);
|
||||
SimpleServiceDiscovery.registerTarget(mediaPlayerTarget);
|
||||
SimpleServiceDiscovery.registerDevice(rokuDevice);
|
||||
SimpleServiceDiscovery.registerDevice(fireflyDevice);
|
||||
SimpleServiceDiscovery.registerDevice(mediaPlayerDevice);
|
||||
|
||||
// Search for devices continuously every 120 seconds
|
||||
SimpleServiceDiscovery.search(120 * 1000);
|
||||
|
||||
@@ -93,16 +93,16 @@ var Devices = {
|
||||
}
|
||||
},
|
||||
|
||||
_fixedTargetForType: function(type, ip) {
|
||||
let fixedTarget = {};
|
||||
_fixedDeviceForType: function(type, ip) {
|
||||
let fixedDevice = {};
|
||||
if (type == "roku") {
|
||||
fixedTarget.target = "roku:ecp";
|
||||
fixedTarget.location = "http://" + ip + ":8060";
|
||||
fixedDevice.target = "roku:ecp";
|
||||
fixedDevice.location = "http://" + ip + ":8060";
|
||||
} else if (type == "chromecast") {
|
||||
fixedTarget.target = "urn:dial-multiscreen-org:service:dial:1";
|
||||
fixedTarget.location = "http://" + ip + ":8008";
|
||||
fixedDevice.target = "urn:dial-multiscreen-org:service:dial:1";
|
||||
fixedDevice.location = "http://" + ip + ":8008";
|
||||
}
|
||||
return fixedTarget;
|
||||
return fixedDevice;
|
||||
},
|
||||
|
||||
connectManually: function(evt) {
|
||||
@@ -114,20 +114,20 @@ var Devices = {
|
||||
return;
|
||||
}
|
||||
|
||||
let fixedTargets = [];
|
||||
let fixedDevices = [];
|
||||
try {
|
||||
fixedTargets = JSON.parse(Services.prefs.getCharPref("browser.casting.fixedTargets"));
|
||||
fixedDevices = JSON.parse(Services.prefs.getCharPref("browser.casting.fixedDevices"));
|
||||
} catch (e) {}
|
||||
|
||||
let type = document.getElementById("type").value;
|
||||
let fixedTarget = this._fixedTargetForType(type, ip.value);
|
||||
let fixedDevice = this._fixedDeviceForType(type, ip.value);
|
||||
|
||||
// Early abort if we're already looking for this target.
|
||||
if (fixedTargets.indexOf(fixedTarget) > -1)
|
||||
if (fixedDevices.indexOf(fixedDevice) > -1)
|
||||
return;
|
||||
|
||||
fixedTargets.push(fixedTarget);
|
||||
Services.prefs.setCharPref("browser.casting.fixedTargets", JSON.stringify(fixedTargets));
|
||||
fixedDevices.push(fixedDevice);
|
||||
Services.prefs.setCharPref("browser.casting.fixedDevices", JSON.stringify(fixedDevices));
|
||||
|
||||
// The backend does not yet listen for pref changes, so we trigger a scan.
|
||||
this.updateDeviceList();
|
||||
|
||||
@@ -49,7 +49,7 @@ var SimpleServiceDiscovery = {
|
||||
get EVENT_SERVICE_FOUND() { return EVENT_SERVICE_FOUND; },
|
||||
get EVENT_SERVICE_LOST() { return EVENT_SERVICE_LOST; },
|
||||
|
||||
_targets: new Map(),
|
||||
_devices: new Map(),
|
||||
_services: new Map(),
|
||||
_searchSocket: null,
|
||||
_searchInterval: 0,
|
||||
@@ -67,7 +67,7 @@ var SimpleServiceDiscovery = {
|
||||
|
||||
// nsIUDPSocketListener implementation
|
||||
onPacketReceived: function(aSocket, aMessage) {
|
||||
// Listen for responses from specific targets. There could be more than one
|
||||
// Listen for responses from specific devices. There could be more than one
|
||||
// available.
|
||||
let response = aMessage.data.split("\n");
|
||||
let service = {};
|
||||
@@ -82,7 +82,7 @@ var SimpleServiceDiscovery = {
|
||||
}
|
||||
}.bind(this));
|
||||
|
||||
if (service.location && this._targets.has(service.target)) {
|
||||
if (service.location && this._devices.has(service.target)) {
|
||||
service.location = this._forceTrailingSlash(service.location);
|
||||
|
||||
// We add the server as an additional way to filter services
|
||||
@@ -141,9 +141,9 @@ var SimpleServiceDiscovery = {
|
||||
// next time we search.
|
||||
this._searchTimestamp = Date.now();
|
||||
|
||||
// Look for any fixed IP targets. Some routers might be configured to block
|
||||
// Look for any fixed IP devices. Some routers might be configured to block
|
||||
// UDP broadcasts, so this is a way to skip discovery.
|
||||
this._searchFixedTargets();
|
||||
this._searchFixedDevices();
|
||||
|
||||
// Perform a UDP broadcast to search for SSDP devices
|
||||
let socket = Cc["@mozilla.org/network/udp-socket;1"].createInstance(Ci.nsIUDPSocket);
|
||||
@@ -161,8 +161,8 @@ var SimpleServiceDiscovery = {
|
||||
this._searchTimeout.initWithCallback(this._searchShutdown.bind(this), SSDP_DISCOVER_TIMEOUT, Ci.nsITimer.TYPE_ONE_SHOT);
|
||||
|
||||
let data = SSDP_DISCOVER_PACKET;
|
||||
for (let [key, target] of this._targets) {
|
||||
let msgData = data.replace("%SEARCH_TARGET%", target.target);
|
||||
for (let [key, device] of this._devices) {
|
||||
let msgData = data.replace("%SEARCH_TARGET%", device.target);
|
||||
try {
|
||||
let msgRaw = converter.convertToByteArray(msgData);
|
||||
socket.send(SSDP_ADDRESS, SSDP_PORT, msgRaw, msgRaw.length);
|
||||
@@ -196,28 +196,28 @@ var SimpleServiceDiscovery = {
|
||||
});
|
||||
},
|
||||
|
||||
_searchFixedTargets: function _searchFixedTargets() {
|
||||
let fixedTargets = null;
|
||||
_searchFixedDevices: function _searchFixedDevices() {
|
||||
let fixedDevices = null;
|
||||
try {
|
||||
fixedTargets = Services.prefs.getCharPref("browser.casting.fixedTargets");
|
||||
fixedDevices = Services.prefs.getCharPref("browser.casting.fixedDevices");
|
||||
} catch (e) {}
|
||||
|
||||
if (!fixedTargets) {
|
||||
if (!fixedDevices) {
|
||||
return;
|
||||
}
|
||||
|
||||
fixedTargets = JSON.parse(fixedTargets);
|
||||
for (let fixedTarget of fixedTargets) {
|
||||
fixedDevices = JSON.parse(fixedDevices);
|
||||
for (let fixedDevice of fixedDevices) {
|
||||
// Verify we have the right data
|
||||
if (!"location" in fixedTarget || !"target" in fixedTarget) {
|
||||
if (!"location" in fixedDevice || !"target" in fixedDevice) {
|
||||
continue;
|
||||
}
|
||||
|
||||
fixedTarget.location = this._forceTrailingSlash(fixedTarget.location);
|
||||
fixedDevice.location = this._forceTrailingSlash(fixedDevice.location);
|
||||
|
||||
let service = {
|
||||
location: fixedTarget.location,
|
||||
target: fixedTarget.target
|
||||
location: fixedDevice.location,
|
||||
target: fixedDevice.target
|
||||
};
|
||||
|
||||
// We don't assume the fixed target is ready. We still need to ping it.
|
||||
@@ -264,28 +264,28 @@ var SimpleServiceDiscovery = {
|
||||
});
|
||||
},
|
||||
|
||||
registerTarget: function registerTarget(aTarget) {
|
||||
registerDevice: function registerDevice(aDevice) {
|
||||
// We must have "target" and "factory" defined
|
||||
if (!("target" in aTarget) || !("factory" in aTarget)) {
|
||||
if (!("target" in aDevice) || !("factory" in aDevice)) {
|
||||
// Fatal for registration
|
||||
throw "Registration requires a target and a location";
|
||||
}
|
||||
|
||||
// Only add if we don't already know about this target
|
||||
if (!this._targets.has(aTarget.target)) {
|
||||
this._targets.set(aTarget.target, aTarget);
|
||||
// Only add if we don't already know about this device
|
||||
if (!this._devices.has(aDevice.target)) {
|
||||
this._devices.set(aDevice.target, aDevice);
|
||||
}
|
||||
},
|
||||
|
||||
unregisterTarget: function unregisterTarget(aTarget) {
|
||||
unregisterDevice: function unregisterDevice(aDevice) {
|
||||
// We must have "target" and "factory" defined
|
||||
if (!("target" in aTarget) || !("factory" in aTarget)) {
|
||||
if (!("target" in aDevice) || !("factory" in aDevice)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Only remove if we know about this target
|
||||
if (this._targets.has(aTarget.target)) {
|
||||
this._targets.delete(aTarget.target);
|
||||
if (this._devices.has(aDevice.target)) {
|
||||
this._devices.delete(aDevice.target);
|
||||
}
|
||||
},
|
||||
|
||||
@@ -294,9 +294,9 @@ var SimpleServiceDiscovery = {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Find the registration for the target
|
||||
if (this._targets.has(aService.target)) {
|
||||
return this._targets.get(aService.target).factory(aService);
|
||||
// Find the registration for the device
|
||||
if (this._devices.has(aService.target)) {
|
||||
return this._devices.get(aService.target).factory(aService);
|
||||
}
|
||||
return null;
|
||||
},
|
||||
@@ -312,7 +312,7 @@ var SimpleServiceDiscovery = {
|
||||
get services() {
|
||||
let array = [];
|
||||
for (let [key, service] of this._services) {
|
||||
let target = this._targets.get(service.target);
|
||||
let target = this._devices.get(service.target);
|
||||
service.extensions = target.extensions;
|
||||
service.types = target.types;
|
||||
array.push(service);
|
||||
@@ -320,20 +320,20 @@ var SimpleServiceDiscovery = {
|
||||
return array;
|
||||
},
|
||||
|
||||
// Returns false if the service does not match the target's filters
|
||||
// Returns false if the service does not match the device's filters
|
||||
_filterService: function _filterService(aService) {
|
||||
let target = this._targets.get(aService.target);
|
||||
if (!target) {
|
||||
let device = this._devices.get(aService.target);
|
||||
if (!device) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// If we have no filter, everything passes
|
||||
if (!("filters" in target)) {
|
||||
if (!("filters" in device)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// If any filter fails, the service fails
|
||||
let filters = target.filters;
|
||||
let filters = device.filters;
|
||||
for (let filter in filters) {
|
||||
if (filter in aService && aService[filter] != filters[filter]) {
|
||||
return false;
|
||||
@@ -369,7 +369,7 @@ var SimpleServiceDiscovery = {
|
||||
},
|
||||
|
||||
_addService: function(service) {
|
||||
// Filter out services that do not match the target filter
|
||||
// Filter out services that do not match the device filter
|
||||
if (!this._filterService(service)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user