Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/extensions
diff options
context:
space:
mode:
Diffstat (limited to 'extensions')
-rw-r--r--extensions/cpsection/Makefile.am3
-rw-r--r--extensions/cpsection/aboutcomputer/view.py2
-rw-r--r--extensions/cpsection/modemconfiguration/Makefile.am6
-rw-r--r--extensions/cpsection/modemconfiguration/__init__.py22
-rw-r--r--extensions/cpsection/modemconfiguration/model.py70
-rw-r--r--extensions/cpsection/modemconfiguration/view.py250
-rw-r--r--extensions/cpsection/network/model.py115
-rw-r--r--extensions/cpsection/network/view.py8
-rw-r--r--extensions/cpsection/power/model.py31
-rw-r--r--extensions/cpsection/power/view.py58
-rw-r--r--extensions/deviceicon/network.py628
11 files changed, 226 insertions, 967 deletions
diff --git a/extensions/cpsection/Makefile.am b/extensions/cpsection/Makefile.am
index 90d36ea..73e5164 100644
--- a/extensions/cpsection/Makefile.am
+++ b/extensions/cpsection/Makefile.am
@@ -1,5 +1,4 @@
-SUBDIRS = aboutme aboutcomputer datetime frame language \
- modemconfiguration network power
+SUBDIRS = aboutme aboutcomputer datetime frame language network power
sugardir = $(pkgdatadir)/extensions/cpsection
sugar_PYTHON = __init__.py
diff --git a/extensions/cpsection/aboutcomputer/view.py b/extensions/cpsection/aboutcomputer/view.py
index 4b638ff..dd4f8f3 100644
--- a/extensions/cpsection/aboutcomputer/view.py
+++ b/extensions/cpsection/aboutcomputer/view.py
@@ -174,7 +174,7 @@ class AboutComputer(SectionView):
vbox_copyright.set_border_width(style.DEFAULT_SPACING * 2)
vbox_copyright.set_spacing(style.DEFAULT_SPACING)
- label_copyright = gtk.Label("© 2006-2010 One Laptop per Child "
+ label_copyright = gtk.Label("© 2006-2009 One Laptop per Child "
"Association Inc; Red Hat Inc; Collabora Ltd; "
"and Contributors.")
label_copyright.set_alignment(0, 0)
diff --git a/extensions/cpsection/modemconfiguration/Makefile.am b/extensions/cpsection/modemconfiguration/Makefile.am
deleted file mode 100644
index 3e2613e..0000000
--- a/extensions/cpsection/modemconfiguration/Makefile.am
+++ /dev/null
@@ -1,6 +0,0 @@
-sugardir = $(pkgdatadir)/extensions/cpsection/modemconfiguration
-
-sugar_PYTHON = \
- __init__.py \
- model.py \
- view.py
diff --git a/extensions/cpsection/modemconfiguration/__init__.py b/extensions/cpsection/modemconfiguration/__init__.py
deleted file mode 100644
index 8a219dc..0000000
--- a/extensions/cpsection/modemconfiguration/__init__.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright (C) 2009 Paraguay Educa, Martin Abente
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 US
-
-from gettext import gettext as _
-
-CLASS = 'ModemConfiguration'
-ICON = 'module-modemconfiguration'
-TITLE = _('Modem Configuration')
-
diff --git a/extensions/cpsection/modemconfiguration/model.py b/extensions/cpsection/modemconfiguration/model.py
deleted file mode 100644
index 2545ce1..0000000
--- a/extensions/cpsection/modemconfiguration/model.py
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright (C) 2009 Paraguay Educa, Martin Abente
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 US
-
-import gconf
-
-from jarabe.model.network import GSM_USERNAME_PATH, GSM_PASSWORD_PATH, \
- GSM_NUMBER_PATH, GSM_APN_PATH, GSM_PIN_PATH, \
- GSM_PUK_PATH
-
-def get_username():
- client = gconf.client_get_default()
- return client.get_string(GSM_USERNAME_PATH) or ''
-
-def get_password():
- client = gconf.client_get_default()
- return client.get_string(GSM_PASSWORD_PATH) or ''
-
-def get_number():
- client = gconf.client_get_default()
- return client.get_string(GSM_NUMBER_PATH) or ''
-
-def get_apn():
- client = gconf.client_get_default()
- return client.get_string(GSM_APN_PATH) or ''
-
-def get_pin():
- client = gconf.client_get_default()
- return client.get_string(GSM_PIN_PATH) or ''
-
-def get_puk():
- client = gconf.client_get_default()
- return client.get_string(GSM_PUK_PATH) or ''
-
-def set_username(username):
- client = gconf.client_get_default()
- client.set_string(GSM_USERNAME_PATH, username)
-
-def set_password(password):
- client = gconf.client_get_default()
- client.set_string(GSM_PASSWORD_PATH, password)
-
-def set_number(number):
- client = gconf.client_get_default()
- client.set_string(GSM_NUMBER_PATH, number)
-
-def set_apn(apn):
- client = gconf.client_get_default()
- client.set_string(GSM_APN_PATH, apn)
-
-def set_pin(pin):
- client = gconf.client_get_default()
- client.set_string(GSM_PIN_PATH, pin)
-
-def set_puk(puk):
- client = gconf.client_get_default()
- client.set_string(GSM_PUK_PATH, puk)
-
diff --git a/extensions/cpsection/modemconfiguration/view.py b/extensions/cpsection/modemconfiguration/view.py
deleted file mode 100644
index b236f3f..0000000
--- a/extensions/cpsection/modemconfiguration/view.py
+++ /dev/null
@@ -1,250 +0,0 @@
-# Copyright (C) 2009 Paraguay Educa, Martin Abente
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 US
-
-import os
-import logging
-from gettext import gettext as _
-
-import gtk
-import gobject
-
-from sugar.graphics import style
-
-from jarabe.controlpanel.sectionview import SectionView
-
-APPLY_TIMEOUT = 1000
-
-class EntryWithLabel(gtk.HBox):
- __gtype_name__ = "SugarEntryWithLabel"
-
- def __init__(self, label_text):
- gtk.HBox.__init__(self, spacing=style.DEFAULT_SPACING)
-
- self._timeout_sid = 0
- self._changed_handler = None
- self._is_valid = True
-
- self.label = gtk.Label(label_text)
- self.label.modify_fg(gtk.STATE_NORMAL,
- style.COLOR_SELECTION_GREY.get_gdk_color())
- self.label.set_alignment(1, 0.5)
- self.pack_start(self.label, expand=False)
- self.label.show()
-
- self._entry = gtk.Entry(25)
- self._entry.connect('changed', self.__entry_changed_cb)
- self._entry.set_width_chars(25)
- self.pack_start(self._entry, expand=False)
- self._entry.show()
-
- def __entry_changed_cb(self, widget, data=None):
- if self._timeout_sid:
- gobject.source_remove(self._timeout_sid)
- self._timeout_sid = gobject.timeout_add(APPLY_TIMEOUT,
- self.__timeout_cb)
-
- def __timeout_cb(self):
- self._timeout_sid = 0
-
- if self._entry.get_text() == self.get_value():
- return False
-
- try:
- self.set_value(self._entry.get_text())
- except ValueError:
- self._is_valid = False
- else:
- self._is_valid = True
-
- self.notify('is-valid')
-
- return False
-
- def set_text_from_model(self):
- self._entry.set_text(self.get_value())
-
- def get_value(self):
- raise NotImplementedError
-
- def set_value(self):
- raise NotImplementedError
-
- def _get_is_valid(self):
- return self._is_valid
- is_valid = gobject.property(type=bool, getter=_get_is_valid, default=True)
-
-class UsernameEntry(EntryWithLabel):
- def __init__(self, model):
- EntryWithLabel.__init__(self, _('Username:'))
- self._model = model
-
- def get_value(self):
- return self._model.get_username()
-
- def set_value(self, username):
- self._model.set_username(username)
-
-class PasswordEntry(EntryWithLabel):
- def __init__(self, model):
- EntryWithLabel.__init__(self, _('Password:'))
- self._model = model
-
- def get_value(self):
- return self._model.get_password()
-
- def set_value(self, password):
- self._model.set_password(password)
-
-class NumberEntry(EntryWithLabel):
- def __init__(self, model):
- EntryWithLabel.__init__(self, _('Number:'))
- self._model = model
-
- def get_value(self):
- return self._model.get_number()
-
- def set_value(self, number):
- self._model.set_number(number)
-
-class ApnEntry(EntryWithLabel):
- def __init__(self, model):
- EntryWithLabel.__init__(self, _('Access Point Name (APN):'))
- self._model = model
-
- def get_value(self):
- return self._model.get_apn()
-
- def set_value(self, apn):
- self._model.set_apn(apn)
-
-class PinEntry(EntryWithLabel):
- def __init__(self, model):
- EntryWithLabel.__init__(self, _('Personal Identity Number (PIN):'))
- self._model = model
-
- def get_value(self):
- return self._model.get_pin()
-
- def set_value(self, pin):
- self._model.set_pin(pin)
-
-class PukEntry(EntryWithLabel):
- def __init__(self, model):
- EntryWithLabel.__init__(self, _('Personal Unblocking Key (PUK):'))
- self._model = model
-
- def get_value(self):
- return self._model.get_puk()
-
- def set_value(self, puk):
- self._model.set_puk(puk)
-
-
-class ModemConfiguration(SectionView):
- def __init__(self, model, alerts=None):
- SectionView.__init__(self)
-
- self._model = model
- self.restart_alerts = alerts
-
- self.set_border_width(style.DEFAULT_SPACING)
- self.set_spacing(style.DEFAULT_SPACING)
- self._group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
-
- explanation = _("You will need to provide the following " \
- "information to set up a mobile " \
- "broadband connection to a cellular "\
- "(3G) network.")
- self._text = gtk.Label(explanation)
- self._text.set_width_chars(100)
- self._text.set_line_wrap(True)
- self._text.set_alignment(0, 0)
- self.pack_start(self._text, False)
- self._text.show()
-
- self._username_entry = UsernameEntry(model)
- self._username_entry.connect('notify::is-valid',
- self.__notify_is_valid_cb)
- self._group.add_widget(self._username_entry.label)
- self.pack_start(self._username_entry, expand=False)
- self._username_entry.show()
-
- self._password_entry = PasswordEntry(model)
- self._password_entry.connect('notify::is-valid',
- self.__notify_is_valid_cb)
- self._group.add_widget(self._password_entry.label)
- self.pack_start(self._password_entry, expand=False)
- self._password_entry.show()
-
- self._number_entry = NumberEntry(model)
- self._number_entry.connect('notify::is-valid',
- self.__notify_is_valid_cb)
- self._group.add_widget(self._number_entry.label)
- self.pack_start(self._number_entry, expand=False)
- self._number_entry.show()
-
- self._apn_entry = ApnEntry(model)
- self._apn_entry.connect('notify::is-valid',
- self.__notify_is_valid_cb)
- self._group.add_widget(self._apn_entry.label)
- self.pack_start(self._apn_entry, expand=False)
- self._apn_entry.show()
-
- self._pin_entry = PinEntry(model)
- self._pin_entry.connect('notify::is-valid',
- self.__notify_is_valid_cb)
- self._group.add_widget(self._pin_entry.label)
- self.pack_start(self._pin_entry, expand=False)
- self._pin_entry.show()
-
- self._puk_entry = PukEntry(model)
- self._puk_entry.connect('notify::is-valid',
- self.__notify_is_valid_cb)
- self._group.add_widget(self._puk_entry.label)
- self.pack_start(self._puk_entry, expand=False)
- self._puk_entry.show()
-
- self.setup()
-
- def setup(self):
- self._username_entry.set_text_from_model()
- self._password_entry.set_text_from_model()
- self._number_entry.set_text_from_model()
- self._apn_entry.set_text_from_model()
- self._pin_entry.set_text_from_model()
- self._puk_entry.set_text_from_model()
-
- self.needs_restart = False
-
- def undo(self):
- self._model.undo()
-
- def _validate(self):
- if self._username_entry.is_valid and \
- self._password_entry.is_valid and \
- self._number_entry.is_valid and \
- self._apn_entry.is_valid and \
- self._pin_entry.is_valid and \
- self._puk_entry.is_valid:
- self.props.is_valid = True
- else:
- self.props.is_valid = False
-
- def __notify_is_valid_cb(self, entry, pspec):
- if entry.is_valid:
- self.needs_restart = True
- self._validate()
-
diff --git a/extensions/cpsection/network/model.py b/extensions/cpsection/network/model.py
index 945254a..87db6d9 100644
--- a/extensions/cpsection/network/model.py
+++ b/extensions/cpsection/network/model.py
@@ -15,14 +15,9 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
-import logging
import dbus
from gettext import gettext as _
-from jarabe.model import network
import gconf
-import os
-
-_logger = logging.getLogger('ControlPanel - Network')
_NM_SERVICE = 'org.freedesktop.NetworkManager'
_NM_PATH = '/org/freedesktop/NetworkManager'
@@ -67,107 +62,50 @@ def _restart_jabber():
_PS_INTERFACE)
except dbus.DBusException:
raise ReadError('%s service not available' % _PS_SERVICE)
- ps.RetryConnections()
+ ps.RestartServerConnection()
-def print_radio():
- print ('off', 'on')[get_radio()]
-
-def get_radio_nm():
- """ Get the state of NetworkManager
- The user can enable/disable wireless and/or networking
- return true only if wireless and network are enabled
- """
+def get_radio():
bus = dbus.SystemBus()
try:
obj = bus.get_object(_NM_SERVICE, _NM_PATH)
- nm_props = dbus.Interface(obj, dbus.PROPERTIES_IFACE)
+ nm_props = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
except dbus.DBusException:
raise ReadError('%s service not available' % _NM_SERVICE)
- state = nm_props.Get(_NM_IFACE, 'NetworkingEnabled')
- wireless_state = nm_props.Get(_NM_IFACE, 'WirelessEnabled')
- _logger.debug('nm state: %s' % state)
- _logger.debug('nm wireless_state: %s' % wireless_state)
- if state in (0, 1) and wireless_state in (0, 1):
- return (state == 1) and (wireless_state == 1)
+ state = nm_props.Get(_NM_IFACE, 'WirelessEnabled')
+ if state in (0, 1):
+ return state
else:
raise ReadError(_('State is unknown.'))
-def set_radio_nm(state):
- """Enable/disable NetworkManager
- state : 'on/off'
- """
- if not state in ('on', 1, 'off', 0):
- raise ValueError(_("Error in specified radio argument use on/off."))
-
- bus = dbus.SystemBus()
- try:
- obj = bus.get_object(_NM_SERVICE, _NM_PATH)
- nm_props = dbus.Interface(obj, dbus.PROPERTIES_IFACE)
- nm = dbus.Interface(obj, _NM_IFACE)
- except dbus.DBusException:
- raise ReadError('%s service not available' % _NM_SERVICE)
-
- if state == 'on' or state == 1:
- new_state = True
- else:
- new_state = False
-
- prev_state = nm_props.Get(_NM_IFACE, 'NetworkingEnabled')
- if prev_state != new_state:
- nm.Enable(new_state)
- nm_props.Set(_NM_IFACE, 'WirelessEnabled', new_state)
-
- return 0
-
-def get_radio_rfkill():
- pipe_stdout = os.popen('/sbin/rfkill list wifi', 'r')
- try:
- output = pipe_stdout.read()
- _logger.debug('rfkill said: %s' % output)
- blocked = " blocked: yes" in output
- # if not soft- or hard-blocked, radio is on
- return not blocked
-
- finally:
- pipe_stdout.close()
-
-RFKILL_STATE_FILE = '/home/olpc/.rfkill_block_wifi'
-
-def set_radio_rfkill(state):
+def print_radio():
+ print ('off', 'on')[get_radio()]
+
+def set_radio(state):
"""Turn Radio 'on' or 'off'
state : 'on/off'
- """
+ """
if state == 'on' or state == 1:
- os.spawnl(os.P_WAIT, "/sbin/rfkill", "rfkill", "unblock", "wifi")
- # remove the flag file (checked at boot)
+ bus = dbus.SystemBus()
try:
- os.unlink(RFKILL_STATE_FILE)
- except:
- _logger.debug('File %s was not unlinked' % RFKILL_STATE_FILE)
+ obj = bus.get_object(_NM_SERVICE, _NM_PATH)
+ nm_props = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
+ except dbus.DBusException:
+ raise ReadError('%s service not available' % _NM_SERVICE)
+ nm_props.Set(_NM_IFACE, 'WirelessEnabled', True)
elif state == 'off' or state == 0:
- os.spawnl(os.P_WAIT, "/sbin/rfkill", "rfkill", "block", "wifi")
- # touch the flag file
+ bus = dbus.SystemBus()
try:
- fd = open(RFKILL_STATE_FILE, 'w')
- except IOError:
- _logger.debug('File %s is not writeable' % RFKILL_STATE_FILE)
- else:
- fd.close()
+ obj = bus.get_object(_NM_SERVICE, _NM_PATH)
+ nm_props = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
+ except dbus.DBusException:
+ raise ReadError('%s service not available' % _NM_SERVICE)
+ nm_props.Set(_NM_IFACE, 'WirelessEnabled', False)
else:
raise ValueError(_("Error in specified radio argument use on/off."))
return 0
-def get_radio():
- """Get status from rfkill and nm"""
- return get_radio_rfkill() and get_radio_nm()
-
-def set_radio(state):
- """ Set status to dot-file and rfkill, and nm"""
- set_radio_rfkill(state)
- set_radio_nm(state)
-
def clear_registration():
"""Clear the registration with the schoolserver
"""
@@ -178,16 +116,13 @@ def clear_registration():
def clear_networks():
"""Clear saved passwords and network configurations.
"""
- network.clear_connections()
-
-def count_networks():
- return network.count_connections()
+ pass
def get_publish_information():
client = gconf.client_get_default()
publish = client.get_bool('/desktop/sugar/collaboration/publish_gadget')
return publish
-
+
def print_publish_information():
print get_publish_information()
diff --git a/extensions/cpsection/network/view.py b/extensions/cpsection/network/view.py
index c387667..ef28f00 100644
--- a/extensions/cpsection/network/view.py
+++ b/extensions/cpsection/network/view.py
@@ -101,8 +101,6 @@ class Network(SectionView):
self._clear_history_button = gtk.Button()
self._clear_history_button.set_label(_('Discard network history'))
box_clear_history.pack_start(self._clear_history_button, expand=False)
- if self._model.count_networks() == 0:
- self._clear_history_button.set_sensitive(False)
self._clear_history_button.show()
box_wireless.pack_start(box_clear_history, expand=False)
box_clear_history.show()
@@ -210,9 +208,7 @@ class Network(SectionView):
self._radio_alert.props.msg = detail
self._radio_valid = False
else:
- self._radio_valid = True
- if self._model.count_networks() != 0:
- self._clear_history_button.set_sensitive(True)
+ self._radio_valid = True
self._validate()
return False
@@ -243,5 +239,3 @@ class Network(SectionView):
def __network_configuration_reset_cb(self, widget):
self._model.clear_networks()
- if self._model.count_networks() == 0:
- self._clear_history_button.set_sensitive(False)
diff --git a/extensions/cpsection/power/model.py b/extensions/cpsection/power/model.py
index c580439..33ec905 100644
--- a/extensions/cpsection/power/model.py
+++ b/extensions/cpsection/power/model.py
@@ -66,10 +66,7 @@ def set_automatic_pm(enabled):
else:
fd.close()
else:
- try:
- os.unlink(POWERD_INHIBIT_FLAG)
- except:
- _logger.debug('File %s was not unlinked' % POWERD_INHIBIT_FLAG)
+ os.unlink(POWERD_INHIBIT_FLAG)
return 0
# ohmd
@@ -90,3 +87,29 @@ def set_automatic_pm(enabled):
client.set_bool('/desktop/sugar/power/automatic', enabled)
return 0
+def get_extreme_pm():
+ client = gconf.client_get_default()
+ return client.get_bool('/desktop/sugar/power/extreme')
+
+def print_extreme_pm():
+ print ('off', 'on')[get_extreme_pm()]
+
+def set_extreme_pm(enabled):
+ """Extreme power management on/off."""
+
+ bus = dbus.SystemBus()
+ proxy = bus.get_object(OHM_SERVICE_NAME, OHM_SERVICE_PATH)
+ keystore = dbus.Interface(proxy, OHM_SERVICE_IFACE)
+
+ if enabled == 'on' or enabled == 1:
+ keystore.SetKey("suspend.extreme_pm", 1)
+ enabled = True
+ elif enabled == 'off' or enabled == 0:
+ keystore.SetKey("suspend.extreme_pm", 0)
+ enabled = False
+ else:
+ raise ValueError(_("Error in extreme pm argument, use on/off."))
+
+ client = gconf.client_get_default()
+ client.set_bool('/desktop/sugar/power/extreme', enabled)
+ return 0
diff --git a/extensions/cpsection/power/view.py b/extensions/cpsection/power/view.py
index d6e2b8c..8f1ed56 100644
--- a/extensions/cpsection/power/view.py
+++ b/extensions/cpsection/power/view.py
@@ -29,6 +29,8 @@ class Power(SectionView):
self._model = model
self.restart_alerts = alerts
self._automatic_pm_valid = True
+ self._extreme_pm_valid = True
+ self._extreme_pm_change_handler = None
self._automatic_pm_change_handler = None
self.set_border_width(style.DEFAULT_SPACING * 2)
@@ -36,6 +38,7 @@ class Power(SectionView):
group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL)
self._automatic_pm_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING)
+ self._extreme_pm_alert_box = gtk.HBox(spacing=style.DEFAULT_SPACING)
separator_pm = gtk.HSeparator()
self.pack_start(separator_pm, expand=False)
@@ -77,6 +80,35 @@ class Power(SectionView):
self._automatic_pm_alert.props.msg = self.restart_msg
self._automatic_pm_alert.show()
+ box_extreme_pm = gtk.HBox(spacing=style.DEFAULT_SPACING)
+ label_extreme_pm = gtk.Label(
+ _('Extreme power management (disables' \
+ 'wireless radio, increases battery life)'))
+ label_extreme_pm.set_alignment(0, 0.5)
+ self._extreme_button = gtk.CheckButton()
+ self._extreme_button.set_alignment(0, 0)
+ box_extreme_pm.pack_start(self._extreme_button, expand=False)
+ self._extreme_button.show()
+ box_extreme_pm.pack_start(label_extreme_pm, expand=False)
+ group.add_widget(label_extreme_pm)
+ label_extreme_pm.show()
+ box_pm.pack_start(box_extreme_pm, expand=False)
+ box_extreme_pm.show()
+
+ self._extreme_pm_alert = InlineAlert()
+ label_extreme_pm_error = gtk.Label()
+ group.add_widget(label_extreme_pm_error)
+ self._extreme_pm_alert_box.pack_start(label_extreme_pm_error,
+ expand=False)
+ label_extreme_pm_error.show()
+ self._extreme_pm_alert_box.pack_start(self._extreme_pm_alert,
+ expand=False)
+ box_pm.pack_end(self._extreme_pm_alert_box, expand=False)
+ self._extreme_pm_alert_box.show()
+ if 'extreme_pm' in self.restart_alerts:
+ self._extreme_pm_alert.props.msg = self.restart_msg
+ self._extreme_pm_alert.show()
+
self.pack_start(box_pm, expand=False)
box_pm.show()
@@ -85,26 +117,38 @@ class Power(SectionView):
def setup(self):
try:
automatic_state = self._model.get_automatic_pm()
+ extreme_state = self._model.get_extreme_pm()
except Exception, detail:
self._automatic_pm_alert.props.msg = detail
self._automatic_pm_alert.show()
+ self._extreme_pm_alert.props.msg = detail
+ self._extreme_pm_alert.show()
else:
self._automatic_button.set_active(automatic_state)
+ self._extreme_button.set_active(extreme_state)
+ self._extreme_pm_valid = True
self._automatic_pm_valid = True
self.needs_restart = False
self._automatic_pm_change_handler = self._automatic_button.connect( \
'toggled', self.__automatic_pm_toggled_cb)
+ self._extreme_pm_change_handler = self._extreme_button.connect( \
+ 'toggled', self.__extreme_pm_toggled_cb)
def undo(self):
self._automatic_button.disconnect(self._automatic_pm_change_handler)
+ self._extreme_button.disconnect(self._extreme_pm_change_handler)
self._model.undo()
+ self._extreme_pm_alert.hide()
self._automatic_pm_alert.hide()
def _validate(self):
- self.props.is_valid = self._automatic_pm_valid
+ if self._extreme_pm_valid and self._automatic_pm_valid:
+ self.props.is_valid = True
+ else:
+ self.props.is_valid = False
def __automatic_pm_toggled_cb(self, widget, data=None):
state = widget.get_active()
@@ -119,3 +163,15 @@ class Power(SectionView):
self._validate()
return False
+ def __extreme_pm_toggled_cb(self, widget, data=None):
+ state = widget.get_active()
+ try:
+ self._model.set_extreme_pm(state)
+ except Exception, detail:
+ print detail
+ self._extreme_pm_alert.props.msg = detail
+ else:
+ self._extreme_pm_valid = True
+
+ self._validate()
+ return False
diff --git a/extensions/deviceicon/network.py b/extensions/deviceicon/network.py
index 12ea9f6..dc14f9c 100644
--- a/extensions/deviceicon/network.py
+++ b/extensions/deviceicon/network.py
@@ -1,7 +1,6 @@
#
-# Copyright (C) 2008-2010 One Laptop Per Child
+# Copyright (C) 2008 One Laptop Per Child
# Copyright (C) 2009 Tomeu Vizoso, Simon Schampijer
-# Copyright (C) 2009 Paraguay Educa, Martin Abente
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -23,8 +22,7 @@ import sha
import socket
import struct
import re
-import datetime
-import time
+
import gtk
import gobject
import gconf
@@ -37,7 +35,6 @@ from sugar.graphics.toolbutton import ToolButton
from sugar.graphics.tray import TrayIcon
from sugar.graphics import xocolor
from sugar.util import unique_id
-from sugar import profile
from jarabe.model import network
from jarabe.model.network import Settings
@@ -53,23 +50,35 @@ _NM_PATH = '/org/freedesktop/NetworkManager'
_NM_DEVICE_IFACE = 'org.freedesktop.NetworkManager.Device'
_NM_WIRED_IFACE = 'org.freedesktop.NetworkManager.Device.Wired'
_NM_WIRELESS_IFACE = 'org.freedesktop.NetworkManager.Device.Wireless'
-_NM_OLPC_MESH_IFACE = 'org.freedesktop.NetworkManager.Device.OlpcMesh'
-_NM_SERIAL_IFACE = 'org.freedesktop.NetworkManager.Device.Serial'
_NM_ACCESSPOINT_IFACE = 'org.freedesktop.NetworkManager.AccessPoint'
_NM_ACTIVE_CONN_IFACE = 'org.freedesktop.NetworkManager.Connection.Active'
-_GSM_STATE_NOT_READY = 0
-_GSM_STATE_DISCONNECTED = 1
-_GSM_STATE_CONNECTING = 2
-_GSM_STATE_CONNECTED = 3
-_GSM_STATE_NEED_AUTH = 4
+_NM_DEVICE_STATE_UNKNOWN = 0
+_NM_DEVICE_STATE_UNMANAGED = 1
+_NM_DEVICE_STATE_UNAVAILABLE = 2
+_NM_DEVICE_STATE_DISCONNECTED = 3
+_NM_DEVICE_STATE_PREPARE = 4
+_NM_DEVICE_STATE_CONFIG = 5
+_NM_DEVICE_STATE_NEED_AUTH = 6
+_NM_DEVICE_STATE_IP_CONFIG = 7
+_NM_DEVICE_STATE_ACTIVATED = 8
+_NM_DEVICE_STATE_FAILED = 9
+
+def frequency_to_channel(frequency):
+ ftoc = { 2412: 1, 2417: 2, 2422: 3, 2427: 4,
+ 2432: 5, 2437: 6, 2442: 7, 2447: 8,
+ 2452: 9, 2457: 10, 2462: 11, 2467: 12,
+ 2472: 13}
+ return ftoc[frequency]
class WirelessPalette(Palette):
__gtype_name__ = 'SugarWirelessPalette'
__gsignals__ = {
'deactivate-connection' : (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([]))
+ gobject.TYPE_NONE, ([])),
+ 'create-connection' : (gobject.SIGNAL_RUN_FIRST,
+ gobject.TYPE_NONE, ([])),
}
def __init__(self, primary_text):
@@ -103,23 +112,21 @@ class WirelessPalette(Palette):
self._disconnect_item.connect('activate', self.__disconnect_activate_cb)
self.menu.append(self._disconnect_item)
+ self._adhoc_item = gtk.MenuItem(_('Create new wireless network'))
+ self._adhoc_item.connect('activate', self.__adhoc_activate_cb)
+ self.menu.append(self._adhoc_item)
+ self._adhoc_item.show()
+
def set_connecting(self):
self.props.secondary_text = _('Connecting...')
- def _set_connected(self, iaddress):
+ def set_connected(self, frequency, iaddress):
self.set_content(self._info)
self.props.secondary_text = _('Connected')
+ self._set_channel(frequency)
self._set_ip_address(iaddress)
self._disconnect_item.show()
- def set_connected_with_frequency(self, frequency, iaddress):
- self._set_connected(iaddress)
- self._set_frequency(frequency)
-
- def set_connected_with_channel(self, channel, iaddress):
- self._set_connected(iaddress)
- self._set_channel(channel)
-
def set_disconnected(self):
self.props.primary_text = ''
self.props.secondary_text = ''
@@ -129,14 +136,14 @@ class WirelessPalette(Palette):
def __disconnect_activate_cb(self, menuitem):
self.emit('deactivate-connection')
- def _set_frequency(self, frequency):
+ def __adhoc_activate_cb(self, menuitem):
+ self.emit('create-connection')
+
+ def _set_channel(self, frequency):
try:
- channel = network.frequency_to_channel(frequency)
+ channel = frequency_to_channel(frequency)
except KeyError:
channel = 0
- self._set_channel(channel)
-
- def _set_channel(self, channel):
self._channel_label.set_text("%s: %d" % (_("Channel"), channel))
def _set_ip_address(self, ip_address):
@@ -195,105 +202,10 @@ class WiredPalette(Palette):
ip_address_text = ""
self._ip_address_label.set_text(ip_address_text)
-class GsmPalette(Palette):
- __gtype_name__ = 'SugarGsmPalette'
-
- __gsignals__ = {
- 'gsm-connect' : (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([])),
- 'gsm-disconnect' : (gobject.SIGNAL_RUN_FIRST,
- gobject.TYPE_NONE, ([])),
- }
-
- def __init__(self):
- Palette.__init__(self, label=_('Wireless modem'))
-
- self._current_state = None
-
- self._toggle_state_item = gtk.MenuItem('')
- self._toggle_state_item.connect('activate', self.__toggle_state_cb)
- self.menu.append(self._toggle_state_item)
- self._toggle_state_item.show()
-
- self.set_gsm_state(_GSM_STATE_NOT_READY)
-
- self.info_box = gtk.VBox()
-
- self.data_label = gtk.Label()
- self.data_label.props.xalign = 0.0
- label_alignment = self._add_widget_with_padding(self.data_label)
- self.info_box.pack_start(label_alignment)
- self.data_label.show()
- label_alignment.show()
-
- self.connection_time_label = gtk.Label()
- self.connection_time_label.props.xalign = 0.0
- label_alignment = self._add_widget_with_padding( \
- self.connection_time_label)
- self.info_box.pack_start(label_alignment)
- self.connection_time_label.show()
- label_alignment.show()
-
- self.info_box.show()
- self.set_content(self.info_box)
-
- def _add_widget_with_padding(self, child, xalign=0, yalign=0.5):
- alignment = gtk.Alignment(xalign=xalign, yalign=yalign,
- xscale=1, yscale=0.33)
- alignment.set_padding(style.DEFAULT_SPACING,
- style.DEFAULT_SPACING,
- style.DEFAULT_SPACING,
- style.DEFAULT_SPACING)
- alignment.add(child)
- return alignment
-
- def set_gsm_state(self, state):
- self._current_state = state
- self._update_label_and_text()
-
- def _update_label_and_text(self):
- if self._current_state == _GSM_STATE_NOT_READY:
- self._toggle_state_item.get_child().set_label('...')
- self.props.secondary_text = _('Please wait...')
-
- elif self._current_state == _GSM_STATE_DISCONNECTED:
- self._toggle_state_item.get_child().set_label(_('Connect'))
- self.props.secondary_text = _('Disconnected')
-
- elif self._current_state == _GSM_STATE_CONNECTING:
- self._toggle_state_item.get_child().set_label(_('Cancel'))
- self.props.secondary_text = _('Connecting...')
-
- elif self._current_state == _GSM_STATE_CONNECTED:
- self._toggle_state_item.get_child().set_label(_('Disconnect'))
- self.props.secondary_text = _('Connected')
-
- elif self._current_state == _GSM_STATE_NEED_AUTH:
- self._toggle_state_item.get_child().set_label(_('Sim requires Pin/Puk'))
- self.props.secondary_text = _('Authentication Error')
-
- else:
- raise ValueError('Invalid GSM state while updating label and ' \
- 'text, %s' % str(self._current_state))
-
- def __toggle_state_cb(self, menuitem):
- if self._current_state == _GSM_STATE_NOT_READY:
- pass
- elif self._current_state == _GSM_STATE_DISCONNECTED:
- self.emit('gsm-connect')
- elif self._current_state == _GSM_STATE_CONNECTING:
- self.emit('gsm-disconnect')
- elif self._current_state == _GSM_STATE_CONNECTED:
- self.emit('gsm-disconnect')
- elif self._current_state == _GSM_STATE_NEED_AUTH:
- self.emit('gsm-disconnect')
- else:
- raise ValueError('Invalid GSM state while emitting signal, %s' % \
- str(self._current_state))
-
class WirelessDeviceView(ToolButton):
+ _ICON_NAME = 'network-wireless'
FRAME_POSITION_RELATIVE = 302
def __init__(self, device):
@@ -312,7 +224,7 @@ class WirelessDeviceView(ToolButton):
self._active_ap_op = None
self._icon = PulsingIcon()
- self._icon.props.icon_name = get_icon_state('network-wireless', 0)
+ self._icon.props.icon_name = get_icon_state(self._ICON_NAME, 0)
self._inactive_color = xocolor.XoColor( \
"%s,%s" % (style.COLOR_BUTTON_GREY.get_svg(),
style.COLOR_TRANSPARENT.get_svg()))
@@ -326,10 +238,13 @@ class WirelessDeviceView(ToolButton):
self._palette = WirelessPalette(self._name)
self._palette.connect('deactivate-connection',
self.__deactivate_connection_cb)
+ self._palette.connect('create-connection',
+ self.__create_connection_cb)
self.set_palette(self._palette)
self._palette.set_group_id('frame')
- self._device_props = dbus.Interface(self._device, dbus.PROPERTIES_IFACE)
+ self._device_props = dbus.Interface(self._device,
+ 'org.freedesktop.DBus.Properties')
self._device_props.GetAll(_NM_DEVICE_IFACE, byte_arrays=True,
reply_handler=self.__get_device_props_reply_cb,
error_handler=self.__get_device_props_error_cb)
@@ -370,7 +285,7 @@ class WirelessDeviceView(ToolButton):
return
self._active_ap_op = active_ap_op
active_ap = self._bus.get_object(_NM_SERVICE, active_ap_op)
- props = dbus.Interface(active_ap, dbus.PROPERTIES_IFACE)
+ props = dbus.Interface(active_ap, 'org.freedesktop.DBus.Properties')
props.GetAll(_NM_ACCESSPOINT_IFACE, byte_arrays=True,
reply_handler=self.__get_all_ap_props_reply_cb,
@@ -394,6 +309,11 @@ class WirelessDeviceView(ToolButton):
def __ap_properties_changed_cb(self, properties):
self._update_properties(properties)
+ def _name_encodes_colors(self):
+ """Match #XXXXXX,#YYYYYY at the end of the network name"""
+ return self._name[-7] == '#' and self._name[-8] == ',' \
+ and self._name[-15] == '#'
+
def _update_properties(self, properties):
if 'Mode' in properties:
self._mode = properties['Mode']
@@ -409,9 +329,11 @@ class WirelessDeviceView(ToolButton):
self._frequency = properties['Frequency']
if self._color == None:
- if self._mode == network.NM_802_11_MODE_ADHOC and \
- self._name.startswith('Ad-hoc Network'):
- self._color = profile.get_color()
+ if self._mode == network.NM_802_11_MODE_ADHOC \
+ and self._name_encodes_colors():
+ encoded_color = self._name.split("#", 1)
+ if len(encoded_color) == 2:
+ self._color = xocolor.XoColor('#' + encoded_color[1])
else:
sh = sha.new()
data = self._name + hex(self._flags)
@@ -447,27 +369,14 @@ class WirelessDeviceView(ToolButton):
else:
state = network.DEVICE_STATE_UNKNOWN
- if self._mode != network.NM_802_11_MODE_ADHOC and \
- self._name.startswith('Ad-hoc Network') == False:
- if state == network.DEVICE_STATE_ACTIVATED:
- icon_name = '%s-connected' % 'network-wireless'
- else:
- icon_name = 'network-wireless'
-
- icon_name = get_icon_state(icon_name, self._strength)
- if icon_name:
- self._icon.props.icon_name = icon_name
+ if state == network.DEVICE_STATE_ACTIVATED:
+ icon_name = '%s-connected' % self._ICON_NAME
else:
- try:
- channel = network.frequency_to_channel(self._frequency)
- except KeyError:
- channel = 1
- if state == network.DEVICE_STATE_ACTIVATED:
- self._icon.props.icon_name = 'network-adhoc-%s-connected' \
- % channel
- else:
- self._icon.props.icon_name = 'network-adhoc-%s' % channel
- self._icon.props.base_color = profile.get_color()
+ icon_name = self._ICON_NAME
+
+ icon_name = get_icon_state(icon_name, self._strength)
+ if icon_name:
+ self._icon.props.icon_name = icon_name
if state == network.DEVICE_STATE_PREPARE or \
state == network.DEVICE_STATE_CONFIG or \
@@ -477,8 +386,7 @@ class WirelessDeviceView(ToolButton):
self._icon.props.pulsing = True
elif state == network.DEVICE_STATE_ACTIVATED:
address = self._device_props.Get(_NM_DEVICE_IFACE, 'Ip4Address')
- self._palette.set_connected_with_frequency(self._frequency,
- address)
+ self._palette.set_connected(self._frequency, address)
self._icon.props.pulsing = False
else:
self._icon.props.badge_name = None
@@ -491,145 +399,74 @@ class WirelessDeviceView(ToolButton):
self._icon.props.base_color = self._color
def __deactivate_connection_cb(self, palette, data=None):
- connection = network.find_connection_by_ssid(self._name)
- if connection:
- if self._mode == network.NM_802_11_MODE_INFRA:
- connection.set_disconnected()
-
if self._active_ap_op is not None:
obj = self._bus.get_object(_NM_SERVICE, _NM_PATH)
netmgr = dbus.Interface(obj, _NM_IFACE)
- netmgr_props = dbus.Interface(netmgr, dbus.PROPERTIES_IFACE)
+ netmgr_props = dbus.Interface(
+ netmgr, 'org.freedesktop.DBus.Properties')
active_connections_o = netmgr_props.Get(_NM_IFACE,
'ActiveConnections')
for conn_o in active_connections_o:
obj = self._bus.get_object(_NM_IFACE, conn_o)
- props = dbus.Interface(obj, dbus.PROPERTIES_IFACE)
+ props = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
ap_op = props.Get(_NM_ACTIVE_CONN_IFACE, 'SpecificObject')
if ap_op == self._active_ap_op:
netmgr.DeactivateConnection(conn_o)
break
- def __activate_reply_cb(self, connection):
- logging.debug('Network created: %s', connection)
-
- def __activate_error_cb(self, err):
- logging.debug('Failed to create network: %s', err)
-
-class OlpcMeshDeviceView(ToolButton):
- _ICON_NAME = 'network-mesh'
- FRAME_POSITION_RELATIVE = 302
-
- def __init__(self, device, state):
- ToolButton.__init__(self)
-
- self._bus = dbus.SystemBus()
- self._device = device
- self._device_props = None
- self._device_state = None
- self._channel = 0
-
- self._icon = PulsingIcon(icon_name=self._ICON_NAME)
- self._inactive_color = xocolor.XoColor( \
- "%s,%s" % (style.COLOR_BUTTON_GREY.get_svg(),
- style.COLOR_TRANSPARENT.get_svg()))
- self._icon.props.pulse_color = profile.get_color()
- self._icon.props.base_color = self._inactive_color
-
- self.set_icon_widget(self._icon)
- self._icon.show()
-
- self.set_palette_invoker(FrameWidgetInvoker(self))
- self._palette = WirelessPalette(_("Mesh Network"))
- self._palette.connect('deactivate-connection',
- self.__deactivate_connection)
- self.set_palette(self._palette)
- self._palette.set_group_id('frame')
+ def __create_connection_cb(self, palette, data=None):
+ """Create an 802.11 IBSS network.
- self.update_state(state)
-
- self._device_props = dbus.Interface(self._device,
- 'org.freedesktop.DBus.Properties')
- self._device_props.Get(_NM_OLPC_MESH_IFACE, 'ActiveChannel',
- reply_handler=self.__get_active_channel_reply_cb,
- error_handler=self.__get_active_channel_error_cb)
-
- self._bus.add_signal_receiver(self.__wireless_properties_changed_cb,
- signal_name='PropertiesChanged',
- path=device.object_path,
- dbus_interface=_NM_OLPC_MESH_IFACE)
-
- def disconnect(self):
- self._bus.remove_signal_receiver(self.__wireless_properties_changed_cb,
- signal_name='PropertiesChanged',
- path=self._device.object_path,
- dbus_interface=_NM_OLPC_MESH_IFACE)
-
- def __get_active_channel_reply_cb(self, channel):
- self._channel = channel
- self._update_text()
-
- def __get_active_channel_error_cb(self, err):
- logging.error('Error getting the active channel: %s', err)
-
- def __state_changed_cb(self, new_state, old_state, reason):
- self._device_state = new_state
- self._update()
-
- def __wireless_properties_changed_cb(self, properties):
- if 'ActiveChannel' in properties:
- self._channel = properties['ActiveChannel']
- self._update_text()
-
- def _update_text(self):
- text = _("Mesh Network") + " " + str(self._channel)
- self._palette.props.primary_text = text
+ The user's color is encoded at the end of the network name. The network
+ name is truncated so that it does not exceed the 32 byte SSID limit.
+ """
+ client = gconf.client_get_default()
+ nick = client.get_string('/desktop/sugar/user/nick').decode('utf-8')
+ color = client.get_string('/desktop/sugar/user/color')
+ color_suffix = ' %s' % color
+
+ format = _('%s\'s network').encode('utf-8')
+ extra_length = (len(format) - len('%s')) + len(color_suffix)
+ name_limit = 32 - extra_length
+
+ # truncate the nick and use a regex to drop any partial characters
+ # at the end
+ nick = nick.encode('utf-8')[:name_limit]
+ nick = re.sub("([\xf6-\xf7][\x80-\xbf]{0,2}|[\xe0-\xef][\x80-\xbf]{0,1}|[\xc0-\xdf])$", '', nick)
+
+ connection_name = format % nick
+ connection_name += color_suffix
+
+ connection = network.find_connection(connection_name)
+ if connection is None:
+ settings = Settings()
+ settings.connection.id = 'Auto ' + connection_name
+ settings.connection.uuid = unique_id()
+ settings.connection.type = '802-11-wireless'
+ settings.wireless.ssid = dbus.ByteArray(connection_name)
+ settings.wireless.band = 'bg'
+ settings.wireless.mode = 'adhoc'
+ settings.ip4_config = IP4Config()
+ settings.ip4_config.method = 'link-local'
+
+ connection = network.add_connection(connection_name, settings)
- def _update(self):
- state = self._device_state
+ obj = self._bus.get_object(_NM_SERVICE, _NM_PATH)
+ netmgr = dbus.Interface(obj, _NM_IFACE)
- if state in [network.DEVICE_STATE_PREPARE,
- network.DEVICE_STATE_CONFIG,
- network.DEVICE_STATE_NEED_AUTH,
- network.DEVICE_STATE_IP_CONFIG]:
- self._icon.props.base_color = self._inactive_color
- self._icon.props.pulse_color = profile.get_color()
- self._palette.set_connecting()
- self._icon.props.pulsing = True
- elif state == network.DEVICE_STATE_ACTIVATED:
- address = self._device_props.Get(_NM_DEVICE_IFACE, 'Ip4Address')
- self._palette.set_connected_with_channel(self._channel, address)
- self._icon.props.base_color = profile.get_color()
- self._icon.props.pulsing = False
- self._update_text()
+ netmgr.ActivateConnection(network.SETTINGS_SERVICE,
+ connection.path,
+ self._device.object_path,
+ '/',
+ reply_handler=self.__activate_reply_cb,
+ error_handler=self.__activate_error_cb)
- def update_state(self, state):
- self._device_state = state
- self._update()
+ def __activate_reply_cb(self, connection):
+ logging.debug('Network created: %s', connection)
- def __deactivate_connection(self, palette, data=None):
- obj = self._bus.get_object(_NM_SERVICE, _NM_PATH)
- netmgr = dbus.Interface(obj, _NM_IFACE)
- netmgr_props = dbus.Interface(netmgr, 'org.freedesktop.DBus.Properties')
- active_connections_o = netmgr_props.Get(_NM_IFACE,
- 'ActiveConnections')
-
- for conn_o in active_connections_o:
- # The connection path for a mesh connection is the device itself.
- obj = self._bus.get_object(_NM_IFACE, conn_o)
- props = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
- ap_op = props.Get(_NM_ACTIVE_CONN_IFACE, 'SpecificObject')
-
- try:
- obj = self._bus.get_object(_NM_IFACE, ap_op)
- props = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
- type = props.Get(_NM_DEVICE_IFACE, 'DeviceType')
- if type == network.DEVICE_TYPE_802_11_OLPC_MESH:
- netmgr.DeactivateConnection(conn_o)
- break
- except dbus.exceptions.DBusException:
- pass
+ def __activate_error_cb(self, err):
+ logging.debug('Failed to create network: %s', err)
class WiredDeviceView(TrayIcon):
@@ -649,172 +486,12 @@ class WiredDeviceView(TrayIcon):
self._palette.set_connected(speed, address)
-class GsmDeviceView(TrayIcon):
-
- _ICON_NAME = 'network-gsm'
- FRAME_POSITION_RELATIVE = 303
-
- def __init__(self, device):
- self._connection_time_handler = None
- self._connection_timestamp = 0
-
- client = gconf.client_get_default()
- color = xocolor.XoColor(client.get_string('/desktop/sugar/user/color'))
-
- TrayIcon.__init__(self, icon_name=self._ICON_NAME, xo_color=color)
-
- self._bus = dbus.SystemBus()
- self._device = device
-
- self.set_palette_invoker(FrameWidgetInvoker(self))
- self._palette = self._create_gsm_palette()
- self.set_palette(self._palette)
-
- self._bus.add_signal_receiver(self.__state_changed_cb,
- signal_name='StateChanged',
- path=self._device.object_path,
- dbus_interface=_NM_DEVICE_IFACE)
- self._bus.add_signal_receiver(self.__ppp_stats_changed_cb,
- signal_name='PppStats',
- path=self._device.object_path,
- dbus_interface=_NM_SERIAL_IFACE)
-
- def _create_gsm_palette(self):
- palette = GsmPalette()
-
- palette.set_group_id('frame')
- palette.connect('gsm-connect', self.__gsm_connect_cb)
- palette.connect('gsm-disconnect', self.__gsm_disconnect_cb)
-
- props = dbus.Interface(self._device, 'org.freedesktop.DBus.Properties')
- props.GetAll(_NM_DEVICE_IFACE, byte_arrays=True,
- reply_handler=self.__current_state_check_cb,
- error_handler=self.__current_state_check_error_cb)
-
- return palette
-
- def __gsm_connect_cb(self, palette, data=None):
- connection = network.find_gsm_connection()
- if connection is not None:
- obj = self._bus.get_object(_NM_SERVICE, _NM_PATH)
- netmgr = dbus.Interface(obj, _NM_IFACE)
- netmgr.ActivateConnection(network.SETTINGS_SERVICE,
- connection.path,
- self._device.object_path,
- '/',
- reply_handler=self.__connect_cb,
- error_handler=self.__connect_error_cb)
-
- def __connect_cb(self, active_connection):
- logging.debug('Connected successfully to gsm device, %s',
- active_connection)
-
- def __connect_error_cb(self, error):
- raise RuntimeError('Error when connecting to gsm device, %s' % error)
-
- def __gsm_disconnect_cb(self, palette, data=None):
- obj = self._bus.get_object(_NM_SERVICE, _NM_PATH)
- netmgr = dbus.Interface(obj, _NM_IFACE)
- netmgr_props = dbus.Interface(netmgr, 'org.freedesktop.DBus.Properties')
- active_connections_o = netmgr_props.Get(_NM_IFACE, 'ActiveConnections')
-
- for conn_o in active_connections_o:
- obj = self._bus.get_object(_NM_IFACE, conn_o)
- props = dbus.Interface(obj, 'org.freedesktop.DBus.Properties')
- devices = props.Get(_NM_ACTIVE_CONN_IFACE, 'Devices')
- if self._device.object_path in devices:
- netmgr.DeactivateConnection(
- conn_o,
- reply_handler=self.__disconnect_cb,
- error_handler=self.__disconnect_error_cb)
- break
-
- def __disconnect_cb(self):
- logging.debug('Disconnected successfully gsm device')
-
- def __disconnect_error_cb(self, error):
- raise RuntimeError('Error when disconnecting gsm device, %s' % error)
-
- def __state_changed_cb(self, new_state, old_state, reason):
- logging.debug('GSM State: %s to %s, reason %s', old_state, new_state, reason)
- self._update_state(int(new_state))
-
- def __current_state_check_cb(self, properties):
- self._update_state(int(properties['State']))
-
- def __current_state_check_error_cb(self, error):
- raise RuntimeError('Error when checking gsm device state, %s' % error)
-
- def _update_state(self, state):
- gsm_state = None
-
- if state == network.DEVICE_STATE_ACTIVATED:
- gsm_state = _GSM_STATE_CONNECTED
- connection = network.find_gsm_connection()
- if connection is not None:
- connection.set_connected()
- self._connection_timestamp = time.time() - \
- connection.get_settings().connection.timestamp
- self._connection_time_handler = gobject.timeout_add( \
- 1000, self.__connection_timecount_cb)
- self._update_stats(0, 0)
- self._update_connection_time()
- self._palette.info_box.show()
-
- if state == network.DEVICE_STATE_DISCONNECTED:
- gsm_state = _GSM_STATE_DISCONNECTED
- self._connection_timestamp = 0
- if self._connection_time_handler is not None:
- gobject.source_remove(self._connection_time_handler)
- self._palette.info_box.hide()
-
- elif state in [network.DEVICE_STATE_UNMANAGED,
- network.DEVICE_STATE_UNAVAILABLE,
- network.DEVICE_STATE_UNKNOWN]:
- gsm_state = _GSM_STATE_NOT_READY
-
- elif state in [network.DEVICE_STATE_PREPARE,
- network.DEVICE_STATE_CONFIG,
- network.DEVICE_STATE_IP_CONFIG]:
- gsm_state = _GSM_STATE_CONNECTING
-
- elif state in [network.DEVICE_STATE_NEED_AUTH]:
- gsm_state = _GSM_STATE_NEED_AUTH
-
- if self._palette is not None:
- self._palette.set_gsm_state(gsm_state)
-
- def disconnect(self):
- self._bus.remove_signal_receiver(self.__state_changed_cb,
- signal_name='StateChanged',
- path=self._device.object_path,
- dbus_interface=_NM_DEVICE_IFACE)
-
- def __ppp_stats_changed_cb(self, in_bytes, out_bytes):
- self._update_stats(in_bytes, out_bytes)
-
- def _update_stats(self, in_bytes, out_bytes):
- in_kbytes = in_bytes / 1024
- out_kbytes = out_bytes / 1024
- text = _("Data sent %d kb / received %d kb") % (out_kbytes, in_kbytes)
- self._palette.data_label.set_text(text)
-
- def __connection_timecount_cb(self):
- self._connection_timestamp = self._connection_timestamp + 1
- self._update_connection_time()
- return True
-
- def _update_connection_time(self):
- connection_time = datetime.datetime.fromtimestamp( \
- self._connection_timestamp)
- text = _("Connection time ") + connection_time.strftime('%H : %M : %S')
- self._palette.connection_time_label.set_text(text)
-
class WirelessDeviceObserver(object):
def __init__(self, device, tray):
self._device = device
self._device_view = None
self._tray = tray
+
self._device_view = WirelessDeviceView(self._device)
self._tray.add_device(self._device_view)
@@ -825,65 +502,6 @@ class WirelessDeviceObserver(object):
self._device_view = None
-class MeshDeviceObserver(object):
- def __init__(self, device, tray):
- self._bus = dbus.SystemBus()
- self._device = device
- self._device_view = None
- self._tray = tray
-
- props = dbus.Interface(self._device, dbus.PROPERTIES_IFACE)
- props.GetAll(_NM_DEVICE_IFACE, byte_arrays=True,
- reply_handler=self.__get_device_props_reply_cb,
- error_handler=self.__get_device_props_error_cb)
-
- self._bus.add_signal_receiver(self.__state_changed_cb,
- signal_name='StateChanged',
- path=self._device.object_path,
- dbus_interface=_NM_DEVICE_IFACE)
-
- def _remove_device_view(self):
- self._device_view.disconnect()
- self._tray.remove_device(self._device_view)
- self._device_view = None
-
-
-
- def disconnect(self):
- if self._device_view is not None:
- self._remove_device_view()
-
- self._bus.remove_signal_receiver(self.__state_changed_cb,
- signal_name='StateChanged',
- path=self._device.object_path,
- dbus_interface=_NM_DEVICE_IFACE)
-
- def __get_device_props_reply_cb(self, properties):
- if 'State' in properties:
- self._update_state(properties['State'])
-
- def __get_device_props_error_cb(self, err):
- logging.error('Error getting the device properties: %s', err)
-
- def __state_changed_cb(self, new_state, old_state, reason):
- self._update_state(new_state)
-
- def _update_state(self, state):
- if state in (network.DEVICE_STATE_PREPARE, network.DEVICE_STATE_CONFIG,
- network.DEVICE_STATE_NEED_AUTH,
- network.DEVICE_STATE_IP_CONFIG,
- network.DEVICE_STATE_ACTIVATED):
- if self._device_view is not None:
- self._device_view.update_state(state)
- return
-
- self._device_view = OlpcMeshDeviceView(self._device, state)
- self._tray.add_device(self._device_view)
- else:
- if self._device_view is not None:
- self._remove_device_view()
-
-
class WiredDeviceObserver(object):
def __init__(self, device, tray):
self._bus = dbus.SystemBus()
@@ -892,7 +510,7 @@ class WiredDeviceObserver(object):
self._device_view = None
self._tray = tray
- props = dbus.Interface(self._device, dbus.PROPERTIES_IFACE)
+ props = dbus.Interface(self._device, 'org.freedesktop.DBus.Properties')
props.GetAll(_NM_DEVICE_IFACE, byte_arrays=True,
reply_handler=self.__get_device_props_reply_cb,
error_handler=self.__get_device_props_error_cb)
@@ -920,7 +538,8 @@ class WiredDeviceObserver(object):
def _update_state(self, state):
if state == network.DEVICE_STATE_ACTIVATED:
- props = dbus.Interface(self._device, dbus.PROPERTIES_IFACE)
+ props = dbus.Interface(self._device,
+ 'org.freedesktop.DBus.Properties')
address = props.Get(_NM_DEVICE_IFACE, 'Ip4Address')
speed = props.Get(_NM_WIRED_IFACE, 'Speed')
self._device_view = WiredDeviceView(speed, address)
@@ -931,19 +550,6 @@ class WiredDeviceObserver(object):
del self._device_view
self._device_view = None
-class GsmDeviceObserver(object):
- def __init__(self, device, tray):
- self._device = device
- self._device_view = None
- self._tray = tray
-
- self._device_view = GsmDeviceView(device)
- self._tray.add_device(self._device_view)
-
- def disconnect(self):
- self._device_view.disconnect()
- self._tray.remove_device(self._device_view)
- self._device_view = None
class NetworkManagerObserver(object):
def __init__(self, tray):
@@ -978,7 +584,7 @@ class NetworkManagerObserver(object):
def _check_device(self, device_op):
nm_device = self._bus.get_object(_NM_SERVICE, device_op)
- props = dbus.Interface(nm_device, dbus.PROPERTIES_IFACE)
+ props = dbus.Interface(nm_device, 'org.freedesktop.DBus.Properties')
device_type = props.Get(_NM_DEVICE_IFACE, 'DeviceType')
if device_type == network.DEVICE_TYPE_802_3_ETHERNET:
@@ -987,12 +593,6 @@ class NetworkManagerObserver(object):
elif device_type == network.DEVICE_TYPE_802_11_WIRELESS:
device = WirelessDeviceObserver(nm_device, self._tray)
self._devices[device_op] = device
- elif device_type == network.DEVICE_TYPE_802_11_OLPC_MESH:
- device = MeshDeviceObserver(nm_device, self._tray)
- self._devices[device_op] = device
- elif device_type == network.DEVICE_TYPE_GSM_MODEM:
- device = GsmDeviceObserver(nm_device, self._tray)
- self._devices[device_op] = device
def __device_added_cb(self, device_op):
self._check_device(device_op)