[gnome-shell] network: Update for new APIs
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] network: Update for new APIs
- Date: Thu, 29 Aug 2013 16:11:08 +0000 (UTC)
commit e1c4cfd7eb6a30f590806b9d162d8b65621596b7
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Fri Aug 23 16:21:30 2013 -0400
network: Update for new APIs
New network manager APIs mean we don't have to do any scanning
through the active networks and synchronize state ourselves.
https://bugzilla.gnome.org/show_bug.cgi?id=706098
js/ui/status/network.js | 189 +++++++++++++++-------------------------------
1 files changed, 62 insertions(+), 127 deletions(-)
---
diff --git a/js/ui/status/network.js b/js/ui/status/network.js
index 55ae01b..3208cdf 100644
--- a/js/ui/status/network.js
+++ b/js/ui/status/network.js
@@ -1172,14 +1172,14 @@ const NMVPNSection = new Lang.Class({
this._client.deactivate_connection(activeConnection);
},
- addActiveConnection: function(activeConnection) {
- let item = this._connectionItems.get(activeConnection._connection.get_uuid());
- item.setActiveConnection(activeConnection);
- },
-
- removeActiveConnection: function(activeConnection) {
- let item = this._connectionItems.get(activeConnection._connection.get_uuid());
- item.setActiveConnection(null);
+ setActiveConnections: function(vpnConnections) {
+ this._connectionItems.values().forEach(function(item) {
+ item.setActiveConnection(null);
+ });
+ vpnConnections.forEach(Lang.bind(this, function(a) {
+ let item = this._connectionItems.get(a._connection.get_uuid());
+ item.setActiveConnection(a);
+ }));
},
_makeConnectionItem: function(connection) {
@@ -1277,7 +1277,8 @@ const NMApplet = new Lang.Class({
this._client.connect('notify::manager-running', Lang.bind(this, this._syncNMState));
this._client.connect('notify::networking-enabled', Lang.bind(this, this._syncNMState));
this._client.connect('notify::state', Lang.bind(this, this._syncNMState));
- this._client.connect('notify::active-connections', Lang.bind(this, this._syncActiveConnections));
+ this._client.connect('notify::physical-connection', Lang.bind(this, this._syncMainConnection));
+ this._client.connect('notify::active-connections', Lang.bind(this, this._syncVPNConnections));
this._client.connect('device-added', Lang.bind(this, this._deviceAdded));
this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved));
this._settings.connect('new-connection', Lang.bind(this, this._newConnection));
@@ -1410,136 +1411,77 @@ const NMApplet = new Lang.Class({
devices.splice(pos, 1);
},
- _getSupportedActiveConnections: function() {
- let activeConnections = this._client.get_active_connections() || [ ];
- let supportedConnections = [];
+ _ensureActiveConnectionProps: function(a) {
+ if (!a._connection) {
+ a._connection = this._settings.get_connection_by_path(a.connection);
- for (let i = 0; i < activeConnections.length; i++) {
- let devices = activeConnections[i].get_devices();
- if (!devices || !devices[0])
- continue;
- // Ignore connections via unrecognized device types
- if (!this._dtypes[devices[0].device_type])
- continue;
-
- // Ignore slave connections
- let connectionPath = activeConnections[i].connection;
- let connection = this._settings.get_connection_by_path(connectionPath);
-
- // connection might be null, if libnm-glib fails to create
- // the object due to version incompatibility, or if the
- // connection is not visible to the current user
- if (connection && this._ignoreConnection(connection))
- continue;
-
- supportedConnections.push(activeConnections[i]);
+ // This list is guaranteed to have only one device in it.
+ let device = a.get_devices()[0]._delegate;
+ a._primaryDevice = device;
}
- return supportedConnections;
},
- _syncActiveConnections: function() {
- let closedConnections = [ ];
- let newActiveConnections = this._getSupportedActiveConnections();
- for (let i = 0; i < this._activeConnections.length; i++) {
- let a = this._activeConnections[i];
- if (newActiveConnections.indexOf(a) == -1) // connection is removed
- closedConnections.push(a);
+ _getMainConnection: function() {
+ let connection;
+
+ connection = this._client.get_physical_connection();
+ if (connection) {
+ this._ensureActiveConnectionProps(connection);
+ return connection;
}
- for (let i = 0; i < closedConnections.length; i++) {
- let a = closedConnections[i];
- if (a._type == NetworkManager.SETTING_VPN_SETTING_NAME)
- this._vpnSection.removeActiveConnection(a);
- if (a._inited) {
- a.disconnect(a._notifyStateId);
- a.disconnect(a._notifyDefaultId);
- a.disconnect(a._notifyDefault6Id);
- a._inited = false;
- }
+ connection = this._client.get_activating_connection();
+ if (connection) {
+ this._ensureActiveConnectionProps(connection);
+ return connection;
}
+ return null;
+ },
+
+ _syncMainConnection: function() {
if (this._mainConnectionIconChangedId > 0) {
this._mainConnection._primaryDevice.disconnect(this._mainConnectionIconChangedId);
this._mainConnectionIconChangedId = 0;
}
- this._activeConnections = newActiveConnections;
- this._mainConnection = null;
-
- let activating = null;
- let default_ip4 = null;
- let default_ip6 = null;
- let active_any = null;
- for (let i = 0; i < this._activeConnections.length; i++) {
- let a = this._activeConnections[i];
-
- if (!a._inited) {
- a._notifyDefaultId = a.connect('notify::default', Lang.bind(this,
this._syncActiveConnections));
- a._notifyDefault6Id = a.connect('notify::default6', Lang.bind(this,
this._syncActiveConnections));
- a._notifyStateId = a.connect('notify::state', Lang.bind(this, this._notifyActivated));
-
- a._inited = true;
- }
-
- if (!a._connection) {
- a._connection = this._settings.get_connection_by_path(a.connection);
-
- if (a._connection) {
- a._type = a._connection._type;
- a._section = this._ctypes[a._type];
- } else {
- a._connection = null;
- a._type = null;
- a._section = null;
- log('Cannot find connection for active (or connection cannot be read)');
- }
- }
-
- if (a['default'])
- default_ip4 = a;
- if (a.default6)
- default_ip6 = a;
-
- if (a.state == NetworkManager.ActiveConnectionState.ACTIVATING)
- activating = a;
- else if (a.state == NetworkManager.ActiveConnectionState.ACTIVATED)
- active_any = a;
-
- if (!a._primaryDevice) {
- if (a._type != NetworkManager.SETTING_VPN_SETTING_NAME) {
- // This list is guaranteed to have one device in it.
- a._primaryDevice = a.get_devices()[0]._delegate;
- } else {
- a._primaryDevice = this._vpnSection;
- this._vpnSection.addActiveConnection(a);
- }
-
- if (a.state == NetworkManager.ActiveConnectionState.ACTIVATED
- && a._primaryDevice && a._primaryDevice._notification) {
- a._primaryDevice._notification.destroy();
- a._primaryDevice._notification = null;
- }
- }
+ if (this._mainConnectionStateChangedId > 0) {
+ this._mainConnection.disconnect(this._mainConnectionStateChangedId);
+ this._mainConnectionStateChangedId = 0;
}
- this._mainConnection = default_ip4 || default_ip6 || active_any || activating || null;
+ this._mainConnection = this._getMainConnection();
if (this._mainConnection) {
- let dev = this._mainConnection._primaryDevice;
- this._mainConnectionIconChangedId = dev.connect('icon-changed', Lang.bind(this,
this._updateIcon));
+ if (this._mainConnection._primaryDevice)
+ this._mainConnectionIconChangedId =
this._mainConnection._primaryDevice.connect('icon-changed', Lang.bind(this, this._updateIcon));
+ this._mainConnectionStateChangedId = this._mainConnection.connect('notify::state',
Lang.bind(this, this._mainConnectionStateChanged));
+ this._mainConnectionStateChanged();
}
this._updateIcon();
},
- _notifyActivated: function(activeConnection) {
- if (activeConnection.state == NetworkManager.ActiveConnectionState.ACTIVATED
- && activeConnection._primaryDevice && activeConnection._primaryDevice._notification) {
- activeConnection._primaryDevice._notification.destroy();
- activeConnection._primaryDevice._notification = null;
- }
+ _syncVPNConnections: function() {
+ let activeConnections = this._client.get_active_connections() || [];
+ let vpnConnections = activeConnections.filter(function(a) {
+ return (a instanceof NMClient.VPNConnection);
+ });
+ vpnConnections.forEach(Lang.bind(this, function(a) {
+ this._ensureActiveConnectionProps(a);
+ }));
+ this._vpnSection.setActiveConnections(vpnConnections);
- this._syncActiveConnections();
+ this._updateIcon();
+ },
+
+ _mainConnectionStateChanged: function() {
+ let a = this._mainConnection;
+ let dev = a._primaryDevice;
+ if (a.state == NetworkManager.ActiveConnectionState.ACTIVATED && dev && dev._notification) {
+ dev._notification.destroy();
+ dev._notification = null;
+ }
},
_ignoreConnection: function(connection) {
@@ -1576,7 +1518,6 @@ const NMApplet = new Lang.Class({
_newConnection: function(settings, connection) {
this._addConnection(connection);
- this._syncActiveConnections();
},
_connectionRemoved: function(connection) {
@@ -1627,24 +1568,18 @@ const NMApplet = new Lang.Class({
},
_syncNMState: function() {
- this._syncActiveConnections();
-
this.indicators.visible = this._client.manager_running;
this.menu.actor.visible = this._client.networking_enabled;
},
_updateIcon: function() {
- let mc = this._mainConnection;
-
- if (!this._client.networking_enabled || !mc) {
+ if (!this._client.networking_enabled || !this._mainConnection) {
this._primaryIndicator.icon_name = 'network-offline-symbolic';
} else {
let dev = this._mainConnection._primaryDevice;
- if (!dev) {
- log('Active connection with no primary device?');
- return;
- }
- this._primaryIndicator.icon_name = dev.getIndicatorIcon(mc);
+ this._primaryIndicator.visible = (dev != null);
+ if (dev)
+ this._primaryIndicator.icon_name = dev.getIndicatorIcon();
}
this._vpnIndicator.icon_name = this._vpnSection.getIndicatorIcon();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]