Bug 1020564 - Change SSDP 'target' references to 'device' to cut down on confusing concepts r=wesj

This commit is contained in:
Mark Finkle
2014-09-12 20:55:00 -04:00
parent 209fe68d2b
commit 46064598d9
4 changed files with 60 additions and 60 deletions

View File

@@ -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 = {

View File

@@ -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);

View File

@@ -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();

View File

@@ -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;
}