[gnome-shell] network: Rewrite VPN section to be independent of NMConnectionBased
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] network: Rewrite VPN section to be independent of NMConnectionBased
- Date: Fri, 14 Jun 2013 18:17:14 +0000 (UTC)
commit 7ae7f046c27a9596b9bd138f42c9135b248b9665
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Fri Apr 26 19:21:02 2013 -0400
network: Rewrite VPN section to be independent of NMConnectionBased
https://bugzilla.gnome.org/show_bug.cgi?id=701954
js/ui/status/network.js | 204 ++++++++++++++++++++++++-----------------------
1 files changed, 104 insertions(+), 100 deletions(-)
---
diff --git a/js/ui/status/network.js b/js/ui/status/network.js
index 640cfe2..5ecb2cc 100644
--- a/js/ui/status/network.js
+++ b/js/ui/status/network.js
@@ -9,6 +9,7 @@ const NMGtk = imports.gi.NMGtk;
const Signals = imports.signals;
const St = imports.gi.St;
+const Hash = imports.misc.hash;
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
@@ -1319,26 +1320,38 @@ const NMDeviceVirtual = new Lang.Class({
},
});
-const NMVPNSection = new Lang.Class({
- Name: 'NMVPNSection',
- Extends: NMConnectionBased,
- category: NMConnectionCategory.VPN,
+const NMVPNConnectionItem = new Lang.Class({
+ Name: 'NMVPNConnectionItem',
- _init: function(client) {
- this.parent([]);
+ _init: function(client, connection) {
this._client = client;
+ this.connection = connection;
+ this._activeConnection = null;
+ this._activeConnectionChangedId = 0;
- this.section = new PopupMenu.PopupMenuSection();
- this._deferredWorkId = Main.initializeDeferredWork(this.section.actor, Lang.bind(this,
this._createSection));
+ this.menuItem = new PopupMenu.PopupSwitchMenuItem(connection.get_id(), false,
+ { style_class: 'popup-subtitle-menu-item' });
+ this.menuItem.connect('toggled', Lang.bind(this, this._toggle));
+
+ this._sync();
},
- connectionValid: function(connection) {
- // filtering is done by NMApplet code
- return true;
+ destroy: function() {
+ this.menuItem.destroy();
},
- getStatusLabel: function(activeConnection) {
- switch(activeConnection.vpn_state) {
+ isActive: function() {
+ if (this._activeConnection == null)
+ return false;
+
+ return this._activeConnection.vpn_state == NetworkManager.VPNConnectionState.ACTIVATED;
+ },
+
+ _getStatus: function() {
+ if (this._activeConnection == null)
+ return null;
+
+ switch(this._activeConnection.vpn_state) {
case NetworkManager.VPNConnectionState.DISCONNECTED:
case NetworkManager.VPNConnectionState.ACTIVATED:
return null;
@@ -1352,85 +1365,26 @@ const NMVPNSection = new Lang.Class({
case NetworkManager.VPNConnectionState.FAILED:
return _("connection failed");
default:
- log('VPN connection state invalid, is %d'.format(this.device.state));
return 'invalid';
}
},
- removeActiveConnection: function(activeConnection) {
- let pos = this._findConnection(activeConnection.uuid);
- if (pos < 0)
- return;
-
- let obj = this._connections[pos];
- obj.active.disconnect(obj.stateChangedId);
- obj.active = null;
-
- if (obj.item) {
- obj.item.setToggleState(false);
- obj.item.setStatus(null);
- }
- },
-
- addActiveConnection: function(activeConnection) {
- let pos = this._findConnection(activeConnection.uuid);
- if (pos < 0)
- return;
-
- let obj = this._connections[pos];
- obj.active = activeConnection;
- obj.stateChangedId = obj.active.connect('vpn-state-changed',
- Lang.bind(this, this._connectionStateChanged));
-
- if (obj.item) {
- obj.item.setToggleState(obj.active.vpn_state ==
- NetworkManager.VPNConnectionState.ACTIVATED);
- obj.item.setStatus(this.getStatusLabel(obj.active));
- }
- },
-
- _queueCreateSection: function() {
- this.section.removeAll();
- Main.queueDeferredWork(this._deferredWorkId);
- },
-
- _createConnectionItem: function(obj) {
- let menuItem = new PopupMenu.PopupSwitchMenuItem(obj.name, false,
- { style_class: 'popup-subtitle-menu-item' });
- menuItem.connect('toggled', Lang.bind(this, function(menuItem) {
- if (menuItem.state) {
- this._client.activate_connection(obj.connection, null, null, null);
- // Immediately go back to disconnected, until NM tells us to change
- menuItem.setToggleState(false);
- } else if (obj.active) {
- this._client.deactivate_connection(obj.active);
- }
- }));
-
- if (obj.active) {
- menuItem.setToggleState(obj.active.vpn_state ==
- NetworkManager.VPNConnectionState.ACTIVATED);
- menuItem.setStatus(this.getStatusLabel(obj.active));
- }
+ _toggle: function() {
+ if (this._activeConnection == null)
+ this._client.activate_connection(this.connection, null, null, null);
+ else
+ this._client.deactivate_connection(this._activeConnection);
- return menuItem;
+ this._sync();
},
- _createSection: function() {
- if (this._connections.length > 0) {
- this.section.actor.show();
-
- for(let j = 0; j < this._connections.length; ++j) {
- let obj = this._connections[j];
- obj.item = this._createConnectionItem(obj);
- this.section.addMenuItem(obj.item);
- }
- } else {
- this.section.actor.hide()
- }
+ _sync: function() {
+ this.menuItem.setToggleState(this.isActive());
+ this.menuItem.setStatus(this._getStatus());
+ this.emit('icon-changed');
},
- _connectionStateChanged: function(vpnConnection, newstate, reason) {
+ _connectionStateChanged: function(ac, newstate, reason) {
if (newstate == NetworkManager.VPNConnectionState.FAILED &&
reason != NetworkManager.VPNConnectionStateReason.NO_SECRETS) {
// FIXME: if we ever want to show something based on reason,
@@ -1439,24 +1393,27 @@ const NMVPNSection = new Lang.Class({
this.emit('activation-failed', reason);
}
- let pos = this._findConnection(vpnConnection.uuid);
- if (pos >= 0) {
- let obj = this._connections[pos];
- if (obj.item) {
- obj.item.setToggleState(vpnConnection.vpn_state ==
- NetworkManager.VPNConnectionState.ACTIVATED);
- obj.item.setStatus(this.getStatusLabel(vpnConnection));
- }
- } else {
- log('Could not find connection for vpn-state-changed handler');
+ this._sync();
+ },
+
+ setActiveConnection: function(activeConnection) {
+ if (this._activeConnectionChangedId > 0) {
+ this._activeConnection.disconnect(this._activeConnectionChangedId);
+ this._activeConnectionChangedId = 0;
}
- this.emit('icon-changed');
+ this._activeConnection = activeConnection;
+
+ if (this._activeConnection)
+ this._activeConnectionChangedId = this._activeConnection.connect('vpn-state-changed',
+ Lang.bind(this,
this._connectionStateChanged));
+
+ this._sync();
},
- _getIconForConnection: function(vpnConnection) {
- if (vpnConnection) {
- if (vpnConnection.state == NetworkManager.ActiveConnectionState.ACTIVATING)
+ getIndicatorIcon: function() {
+ if (this._activeConnection) {
+ if (this._activeConnection.state == NetworkManager.ActiveConnectionState.ACTIVATING)
return 'network-vpn-acquiring-symbolic';
else
return 'network-vpn-symbolic';
@@ -1464,17 +1421,64 @@ const NMVPNSection = new Lang.Class({
return '';
}
},
+});
+Signals.addSignalMethods(NMVPNConnectionItem.prototype);
+
+const NMVPNSection = new Lang.Class({
+ Name: 'NMVPNSection',
+ category: NMConnectionCategory.VPN,
+
+ _init: function(client) {
+ this._client = client;
+ this._connectionItems = new Hash.Map();
+
+ this.section = new PopupMenu.PopupMenuSection();
+ },
+
+ checkConnection: function(connection) {
+ if (this._connectionItems.has(connection.get_uuid()))
+ return;
+
+ let item = new NMVPNConnectionItem(this._client, connection);
+
+ item.connect('icon-changed', Lang.bind(this, function() {
+ this.emit('icon-changed');
+ }));
+ item.connect('activation-failed', Lang.bind(this, function(item, reason) {
+ this.emit('activation-failed', reason);
+ }));
+
+ this.section.addMenuItem(item.menuItem);
+ this._connectionItems.set(connection.get_uuid(), item);
+ },
+
+ removeConnection: function(connection) {
+ this._connectionItems.get(connection.get_uuid()).destroy();
+ this._connectionItems.delete(connection.get_uuid());
+ },
+
+ 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);
+ },
getIndicatorIcon: function() {
- for (let i = 0; i < this._connections.length; i++) {
- let obj = this._connections[i];
- let icon = this._getIconForConnection(obj.active);
+ let items = this._connectionItems.values();
+ for (let i = 0; i < items.length; i++) {
+ let item = items[i];
+ let icon = item.getIndicatorIcon();
if (icon)
return icon;
}
return '';
},
});
+Signals.addSignalMethods(NMVPNSection.prototype);
const NMApplet = new Lang.Class({
Name: 'NMApplet',
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]