NetworkStatus: show "firmware missing" when firmware is not available

Since device state Unavailable is generic and has substates, instead
of using an hack for carrier, introduce some code that checks both
for carrier and firmware-missing when in that device state, and updates
the UI accordingly.
This commit is contained in:
Giovanni Campagna 2011-03-25 17:10:38 +01:00
parent 9b51ff7241
commit da852a94bd

View File

@ -478,12 +478,24 @@ NMDevice.prototype = {
/* Translators: this is for network connections that require some kind of key or password */ /* Translators: this is for network connections that require some kind of key or password */
return _("authentication required"); return _("authentication required");
case NetworkManager.DeviceState.UNAVAILABLE: case NetworkManager.DeviceState.UNAVAILABLE:
// we don't check if the carrier property is actually false, as that causes race // This state is actually a compound of various states (generically unavailable,
// conditions if state is changed before the new carrier value is picked by libnm-glib // firmware missing, carrier not available), that are exposed by different properties
if (this.device.capabilities & NetworkManager.DeviceCapabilities.CARRIER_DETECT) // (whose state may or may not updated when we receive state-changed).
if (!this._firmwareMissingId)
this._firmwareMissingId = this.device.connect('notify::firmware-missing', Lang.bind(this, this._substateChanged));
if (this.device.firmware_missing) {
/* Translators: this is for devices that require some kind of firmware or kernel
module, which is missing */
return _("firmware missing");
}
if (this.device.capabilities & NetworkManager.DeviceCapabilities.CARRIER_DETECT) {
if (!this._carrierChangedId)
this._carrierChangedId = this.device.connect('notify::carrier', Lang.bind(this, this._substateChanged));
if (!this.carrier) {
/* Translators: this is for wired network devices that are physically disconnected */ /* Translators: this is for wired network devices that are physically disconnected */
return _("cable unplugged"); return _("cable unplugged");
else }
}
/* Translators: this is for a network device that cannot be activated (for example it /* Translators: this is for a network device that cannot be activated (for example it
is disabled by rfkill, or it has no coverage */ is disabled by rfkill, or it has no coverage */
return _("unavailable"); return _("unavailable");
@ -595,6 +607,16 @@ NMDevice.prototype = {
break; break;
} }
if (this._carrierChangedId) {
// see above for why this is needed
GObject.Object.prototype.disconnect.call(this.device, this._carrierChangedId);
this._carrierChangedId = 0;
}
if (this._firmwareChangedId) {
GObject.Object.prototype.disconnect.call(this.device, this._firmwareChangedId);
this._firmwareChangedId = 0;
}
this.statusItem.setStatus(this.getStatusLabel()); this.statusItem.setStatus(this.getStatusLabel());
this.statusItem.setToggleState(this.connected); this.statusItem.setToggleState(this.connected);
@ -603,6 +625,12 @@ NMDevice.prototype = {
this.emit('state-changed'); this.emit('state-changed');
}, },
_substateChanged: function() {
this.statusItem.setStatus(this.getStatusLabel());
this.emit('state-changed');
},
_getDescription: function() { _getDescription: function() {
let dev_product = this.device.get_product(); let dev_product = this.device.get_product();
let dev_vendor = this.device.get_vendor(); let dev_vendor = this.device.get_vendor();