diff options
author | Ajay Garg <ajay@activitycentral.com> | 2011-12-15 09:00:49 (GMT) |
---|---|---|
committer | Anish Mangal <anish@activitycentral.com> | 2012-04-27 10:02:36 (GMT) |
commit | fb45fed092be5e357633ab520e5f1c9193250064 (patch) | |
tree | dfae119c796c520db2d356da38a7525d2420642a | |
parent | b20695640b61497ab60a97dec3e64793dca78ee1 (diff) |
Connecting to Hidden-Wireless-Networks.
Signed-off-by: Ajay Garg <ajay@activitycentral.com>
-rw-r--r-- | extensions/cpsection/network/model.py | 48 | ||||
-rw-r--r-- | extensions/cpsection/network/view.py | 182 |
2 files changed, 230 insertions, 0 deletions
diff --git a/extensions/cpsection/network/model.py b/extensions/cpsection/network/model.py index 916ce8c..9592fdd 100644 --- a/extensions/cpsection/network/model.py +++ b/extensions/cpsection/network/model.py @@ -18,6 +18,9 @@ import dbus from gettext import gettext as _ import gconf +import os +import subprocess +import logging from jarabe.model import network @@ -27,7 +30,9 @@ _NM_PATH = '/org/freedesktop/NetworkManager' _NM_IFACE = 'org.freedesktop.NetworkManager' KEYWORDS = ['network', 'jabber', 'radio', 'server'] +HIDDEN_SSID_FILE = os.path.expanduser('~/.sugar/default/nm/hidden_ssid') +_logger = logging.getLogger('ControlPanel - Network') class ReadError(Exception): def __init__(self, value): @@ -142,3 +147,46 @@ def set_publish_information(value): client = gconf.client_get_default() client.set_bool('/desktop/sugar/collaboration/publish_gadget', value) return 0 + + +def is_hidden_network_connect_package_available(): + if os.path.exists('/etc/init.d/z-sugar-hidden-network-connect'): + return True + return False + + +def get_ssids(): + ssids = [] + + # If the file does not exist, return. + if not os.path.exists(HIDDEN_SSID_FILE): + return ssids + + f = open(HIDDEN_SSID_FILE, 'r') + for ssid in f.readlines(): + ssids.append(ssid.rstrip('\n')) + f.close() + + return ssids + + +def set_ssids(ssids): + + # First remove the old ssid-file, if it exists. + if os.path.exists(HIDDEN_SSID_FILE): + try: + os.remove(HIDDEN_SSID_FILE) + except: + _logger.exception('Error removing file.') + return + + # Do nothing and return, if the values-list is empty + if len(ssids) == 0: + return + + # If we reach here, we have a non-empty ssid-values-list. + f = open(HIDDEN_SSID_FILE, 'w') + for ssid in ssids: + if len(ssid) > 0: + f.write(ssid + '\n') + f.close() diff --git a/extensions/cpsection/network/view.py b/extensions/cpsection/network/view.py index 381dcb6..9a2444a 100644 --- a/extensions/cpsection/network/view.py +++ b/extensions/cpsection/network/view.py @@ -19,6 +19,8 @@ import gobject from gettext import gettext as _ from sugar.graphics import style +from sugar.graphics.alert import Alert +from sugar.graphics.icon import Icon from jarabe.controlpanel.sectionview import SectionView from jarabe.controlpanel.inlinealert import InlineAlert @@ -30,6 +32,123 @@ TITLE = _('Network') _APPLY_TIMEOUT = 3000 +class AddRemoveWidget(gtk.HBox): + + def __init__(self, label, add_button_clicked_cb, + remove_button_clicked_cb, index): + gtk.Box.__init__(self) + self.set_homogeneous(False) + self.set_spacing(10) + + self._index = index + self._add_button_added = False + self._remove_button_added = False + + self._entry_box = gtk.Entry() + self._entry_box.set_text(label) + self.pack_start(self._entry_box, expand=False) + self._entry_box.show() + + add_icon = Icon(icon_name='list-add') + self._add_button = gtk.Button() + self._add_button.set_image(add_icon) + self._add_button.connect('clicked', + add_button_clicked_cb, + self) + + remove_icon = Icon(icon_name='list-remove') + self._remove_button = gtk.Button() + self._remove_button.set_image(remove_icon) + self._remove_button.connect('clicked', + remove_button_clicked_cb, + self) + + self.__add_add_button() + self.__add_remove_button() + + def _get_index(self): + return self._index + + def _set_index(self, value): + self._index = value + + def _get_entry(self): + return self._entry_box.get_text() + + def __add_add_button(self): + self.pack_start(self._add_button, expand=False) + self._add_button.show() + self._add_button_added = True + + def _remove_remove_button_if_not_already(self): + if self._remove_button_added: + self.__remove_remove_button() + + def __remove_remove_button(self): + self.remove(self._remove_button) + self._remove_button_added = False + + def _add_remove_button_if_not_already(self): + if not self._remove_button_added: + self.__add_remove_button() + + def __add_remove_button(self): + self.pack_start(self._remove_button, expand=False) + self._remove_button.show() + self._remove_button_added = True + + +class MultiWidget(gtk.VBox): + + def __init__(self): + gtk.VBox.__init__(self) + + def _add_widget(self, label): + new_widget = AddRemoveWidget(label, + self.__add_button_clicked_cb, + self.__remove_button_clicked_cb, + len(self.get_children())) + self.add(new_widget) + new_widget.show() + self.show() + self._update_remove_button_statuses() + + def __add_button_clicked_cb(self, add_button, + add_button_container): + self._add_widget('') + self._update_remove_button_statuses() + + def __remove_button_clicked_cb(self, remove_button, + remove_button_container): + for child in self.get_children(): + if child._get_index() > remove_button_container._get_index(): + child._set_index(child._get_index() - 1) + + self.remove(remove_button_container) + self._update_remove_button_statuses() + + def _update_remove_button_statuses(self): + children = self.get_children() + + # Now, if there is only one entry, remove-button + # should not be shown. + if len(children) == 1: + children[0]._remove_remove_button_if_not_already() + + # Alternatively, if there are more than 1 entries, + # remove-button should be shown for all. + if len(children) > 1: + for child in children: + child._add_remove_button_if_not_already() + + + def _get_entries(self): + entries = [] + for child in self.get_children(): + entries.append(child._get_entry()) + + return entries + class Network(SectionView): def __init__(self, model, alerts): @@ -50,6 +169,7 @@ class Network(SectionView): self._radio_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING) self._jabber_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING) + self._hidden_network_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING) workspace = gtk.VBox() workspace.show() @@ -171,6 +291,55 @@ class Network(SectionView): workspace.pack_start(box_mesh, expand=False) box_mesh.show() + if self._model.is_hidden_network_connect_package_available(): + separator_hidden_network = gtk.HSeparator() + workspace.pack_start(separator_hidden_network, False) + separator_hidden_network.show() + + label_hidden_network = gtk.Label(_('Hidden Networks')) + label_hidden_network.set_alignment(0, 0) + workspace.pack_start(label_hidden_network, expand=False) + label_hidden_network.show() + box_hidden_network = gtk.VBox() + box_hidden_network.set_border_width(style.DEFAULT_SPACING * 2) + box_hidden_network.set_spacing(style.DEFAULT_SPACING) + + info = gtk.Label(_("Enter the SSIDs of the hidden networks.")) + info.set_alignment(0, 0) + info.set_line_wrap(True) + box_hidden_network.pack_start(info, expand=False) + info.show() + + self._hidden_network_alert = InlineAlert() + self.hidden_network_msg = 'XO-reboot is required for the' \ + ' changes to take effect.' + self._hidden_network_alert.props.msg =_(self.hidden_network_msg) + self._hidden_network_alert_box.pack_start(self._hidden_network_alert, + expand=False) + box_hidden_network.pack_end(self._hidden_network_alert_box, + expand=False) + self._hidden_network_alert_box.show() + self._hidden_network_alert.show() + + self._widget_table = MultiWidget() + box_hidden_network.pack_start(self._widget_table, expand=False) + self._widget_table.show() + + save_button = gtk.Button() + save_button.set_alignment(0, 0) + save_button.set_label('Save') + save_button.connect('clicked', self.__save_button_clicked_cb) + box_save_button = gtk.HBox() + box_save_button.set_homogeneous(False) + box_save_button.pack_start(save_button, expand=False) + save_button.show() + + box_hidden_network.pack_start(box_save_button, expand=False) + box_save_button.show() + + workspace.pack_start(box_hidden_network, expand=False) + box_hidden_network.show() + scrolled = gtk.ScrolledWindow() scrolled.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) scrolled.add_with_viewport(workspace) @@ -200,6 +369,15 @@ class Network(SectionView): self._clear_history_button.connect( \ 'clicked', self.__network_configuration_reset_cb) + if self._model.is_hidden_network_connect_package_available(): + + ssids = self._model.get_ssids() + if len(ssids) == 0: + self._widget_table._add_widget('') + else: + for ssid in ssids: + self._widget_table._add_widget(ssid) + def undo(self): self._button.disconnect(self._radio_change_handler) self._entry.disconnect(self._jabber_change_handler) @@ -259,3 +437,7 @@ class Network(SectionView): self._model.clear_networks() if not self._model.have_networks(): self._clear_history_button.set_sensitive(False) + + def __save_button_clicked_cb(self, save_button): + self._model.set_ssids(self._widget_table._get_entries()) + save_button.set_sensitive(False) |