Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAjay Garg <ajay@activitycentral.com>2011-12-15 09:00:49 (GMT)
committer Anish Mangal <anish@activitycentral.com>2012-04-27 10:02:36 (GMT)
commitfb45fed092be5e357633ab520e5f1c9193250064 (patch)
treedfae119c796c520db2d356da38a7525d2420642a
parentb20695640b61497ab60a97dec3e64793dca78ee1 (diff)
Connecting to Hidden-Wireless-Networks.
Signed-off-by: Ajay Garg <ajay@activitycentral.com>
-rw-r--r--extensions/cpsection/network/model.py48
-rw-r--r--extensions/cpsection/network/view.py182
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)