diff options
Diffstat (limited to 'rpms/sugar/0035-Share-3g-connection.patch')
-rw-r--r-- | rpms/sugar/0035-Share-3g-connection.patch | 300 |
1 files changed, 300 insertions, 0 deletions
diff --git a/rpms/sugar/0035-Share-3g-connection.patch b/rpms/sugar/0035-Share-3g-connection.patch new file mode 100644 index 0000000..32da69f --- /dev/null +++ b/rpms/sugar/0035-Share-3g-connection.patch @@ -0,0 +1,300 @@ +From c16b121d6ceab84da73d7c4bf1e703b8e45e60c4 Mon Sep 17 00:00:00 2001 +From: Martin Abente <martin.abente.lahaye@gmail.org> +Date: Mon, 1 Nov 2010 14:23:51 -0300 +Subject: [PATCH sugar 35/74] Share 3g connection + +dextrose backport +--- + extensions/deviceicon/network.py | 179 +++++++++++++++++++++++++++++++++++-- + 1 files changed, 169 insertions(+), 10 deletions(-) + +diff --git a/extensions/deviceicon/network.py b/extensions/deviceicon/network.py +index 789ea13..234b06b 100644 +--- a/extensions/deviceicon/network.py ++++ b/extensions/deviceicon/network.py +@@ -23,6 +23,8 @@ + import hashlib + import socket + import struct ++import random ++import re + import datetime + import time + import gtk +@@ -39,6 +41,7 @@ + from sugar.graphics.menuitem import MenuItem + from sugar.graphics.icon import Icon + from sugar.graphics import xocolor ++from sugar.util import unique_id + from sugar import profile + + from jarabe.model import network +@@ -58,6 +61,7 @@ + _NM_OLPC_MESH_IFACE = 'org.freedesktop.NetworkManager.Device.OlpcMesh' + _NM_ACCESSPOINT_IFACE = 'org.freedesktop.NetworkManager.AccessPoint' + _NM_ACTIVE_CONN_IFACE = 'org.freedesktop.NetworkManager.Connection.Active' ++_NM_OBJ_PROPERTIES = 'org.freedesktop.DBus.Properties' + + _GSM_STATE_NOT_READY = 0 + _GSM_STATE_DISCONNECTED = 1 +@@ -65,6 +69,12 @@ + _GSM_STATE_CONNECTED = 3 + _GSM_STATE_FAILED = 4 + ++_GSM_SHARING_PRIVATE = 0 ++_GSM_SHARING_TRYING = 1 ++_GSM_SHARING_NEIGHBORHOOD = 2 ++ ++_GSM_SHARING_CHANNELS = [2,3,4,5,7,8,9,10,12,13] ++ + + class WirelessPalette(Palette): + __gtype_name__ = 'SugarWirelessPalette' +@@ -207,6 +217,9 @@ class GsmPalette(Palette): + __gsignals__ = { + 'gsm-connect': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])), + 'gsm-disconnect': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])), ++ 'gsm-private': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])), ++ 'gsm-neighborhood': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ++ ([])) + } + + def __init__(self): +@@ -215,12 +228,17 @@ def __init__(self): + + self._current_state = None + self._failed_connection = False ++ self._sharing_state = _GSM_SHARING_PRIVATE + + self._toggle_state_item = MenuItem('') + self._toggle_state_item.connect('activate', self.__toggle_state_cb) + self.menu.append(self._toggle_state_item) + self._toggle_state_item.show() + ++ self._sharing_toggle_item = MenuItem('') ++ self._sharing_toggle_item.connect('activate', self.__sharing_toggle_cb) ++ self.menu.append(self._sharing_toggle_item) ++ + self.info_box = gtk.VBox() + + self.error_title_label = gtk.Label("") +@@ -305,6 +323,9 @@ def _update_label_and_text(self, reason=0): + icon = Icon(icon_name='media-eject', \ + icon_size=gtk.ICON_SIZE_MENU) + self._toggle_state_item.set_image(icon) ++ self.sharing_update_text() ++ self._sharing_toggle_item.show() ++ return + + elif self._current_state == _GSM_STATE_FAILED: + message_error = self._get_error_by_nm_reason(reason) +@@ -313,6 +334,8 @@ def _update_label_and_text(self, reason=0): + raise ValueError('Invalid GSM state while updating label and ' \ + 'text, %s' % str(self._current_state)) + ++ self._sharing_toggle_item.hide() ++ + def __toggle_state_cb(self, menuitem): + if self._current_state == _GSM_STATE_NOT_READY: + pass +@@ -373,6 +396,38 @@ def _get_error_by_nm_reason(self, reason): + message_tuple = (network.get_error_by_reason(reason), message) + return message_tuple + ++ def sharing_update_text(self): ++ if self._sharing_state == _GSM_SHARING_PRIVATE: ++ self._sharing_toggle_item.get_child().set_label(_('Private')) ++ icon = Icon(icon_name='zoom-home', icon_size=gtk.ICON_SIZE_MENU) ++ self._sharing_toggle_item.set_image(icon) ++ ++ elif self._sharing_state == _GSM_SHARING_TRYING: ++ self._sharing_toggle_item.get_child().set_label(_('Please wait...')) ++ ++ elif self._sharing_state == _GSM_SHARING_NEIGHBORHOOD: ++ self._sharing_toggle_item.get_child().set_label(_('My Neighborhood')) ++ icon = Icon(icon_name='zoom-neighborhood', icon_size=gtk.ICON_SIZE_MENU) ++ self._sharing_toggle_item.set_image(icon) ++ ++ else: ++ raise ValueError('Invalid GSM sharing state while updating, %s' % \ ++ str(self._sharing_state)) ++ ++ def __sharing_toggle_cb(self, menuitem): ++ if self._sharing_state == _GSM_SHARING_PRIVATE: ++ self.emit('gsm-neighborhood') ++ ++ elif self._sharing_state == _GSM_SHARING_TRYING: ++ pass ++ ++ elif self._sharing_state == _GSM_SHARING_NEIGHBORHOOD: ++ self.emit('gsm-private') ++ ++ else: ++ raise ValueError('Invalid GSM sharing state, %s' % \ ++ str(self._sharing_state)) ++ + + class WirelessDeviceView(ToolButton): + +@@ -530,8 +585,16 @@ def _update_state(self): + else: + state = network.DEVICE_STATE_UNKNOWN + +- if self._mode != network.NM_802_11_MODE_ADHOC and \ +- network.is_sugar_adhoc_network(self._name) == False: ++ if self._mode == network.NM_802_11_MODE_ADHOC and \ ++ network.is_sugar_adhoc_network(self._name): ++ channel = network.frequency_to_channel(self._frequency) ++ 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() ++ else: + if state == network.DEVICE_STATE_ACTIVATED: + icon_name = '%s-connected' % 'network-wireless' + else: +@@ -540,14 +603,6 @@ def _update_state(self): + icon_name = get_icon_state(icon_name, self._strength) + if icon_name: + self._icon.props.icon_name = icon_name +- else: +- channel = network.frequency_to_channel(self._frequency) +- 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() + + if state == network.DEVICE_STATE_PREPARE or \ + state == network.DEVICE_STATE_CONFIG or \ +@@ -728,6 +783,8 @@ class GsmDeviceView(TrayIcon): + def __init__(self, device): + self._connection_time_handler = None + self._connection_timestamp = 0 ++ self._shared_connection = None ++ self._target_dev_path = None + + client = gconf.client_get_default() + color = xocolor.XoColor(client.get_string('/desktop/sugar/user/color')) +@@ -754,6 +811,8 @@ def create_palette(self): + palette.set_group_id('frame') + palette.connect('gsm-connect', self.__gsm_connect_cb) + palette.connect('gsm-disconnect', self.__gsm_disconnect_cb) ++ palette.connect('gsm-neighborhood', self.__gsm_start_sharing_cb) ++ palette.connect('gsm-private', self.__gsm_stop_sharing_cb) + + self._palette = palette + +@@ -879,6 +938,106 @@ def __connection_timecount_cb(self): + self._palette.update_connection_time(connection_time) + return True + ++ def __gsm_start_sharing_cb(self, palette): ++ if self._palette._sharing_state == _GSM_SHARING_PRIVATE: ++ logging.debug('GSM will start sharing now') ++ self._palette._sharing_state = _GSM_SHARING_TRYING ++ self._palette.sharing_update_text() ++ ++ nm_obj = self._bus.get_object(_NM_SERVICE, _NM_PATH) ++ nm_iface = dbus.Interface(nm_obj, _NM_IFACE) ++ devs_paths = nm_iface.GetDevices() ++ ++ target_dev_path = None ++ for dev_path in devs_paths: ++ dev_obj = self._bus.get_object(_NM_SERVICE, dev_path) ++ dev_props = dbus.Interface(dev_obj, _NM_OBJ_PROPERTIES) ++ device_type = dev_props.Get(_NM_DEVICE_IFACE, 'DeviceType') ++ if device_type == network.DEVICE_TYPE_802_11_WIRELESS: ++ target_dev_path = dev_path ++ break ++ ++ if target_dev_path == None: ++ self._gsm_sharing_reset() ++ raise RuntimeError('No device for sharing') ++ self._target_dev_path = target_dev_path ++ ++ client = gconf.client_get_default() ++ nick = client.get_string('/desktop/sugar/user/nick') ++ nick = re.sub('\W', '', nick) ++ ++ name_format = '%s network' ++ format_length = len(name_format) - len('%s') ++ nick_length = 31 - format_length ++ name = name_format % nick[:nick_length] ++ ++ connection = network.find_connection_by_ssid(name) ++ if connection == None: ++ settings = network.Settings() ++ settings.connection.id = name ++ settings.connection.uuid = unique_id() ++ settings.connection.type = '802-11-wireless' ++ settings.wireless.ssid = dbus.ByteArray(name) ++ settings.wireless.mode = 'adhoc' ++ settings.wireless.band = 'bg' ++ chosen_channel = random.randrange(len(_GSM_SHARING_CHANNELS)) ++ settings.wireless.channel = _GSM_SHARING_CHANNELS[chosen_channel] ++ settings.ip4_config = network.IP4Config() ++ settings.ip4_config.method = 'shared' ++ connection = network.add_connection(name, settings) ++ ++ nm_iface.ActivateConnection(network.SETTINGS_SERVICE, ++ connection.path, ++ target_dev_path, ++ '/', ++ reply_handler=self.__gsm_sharing_ok_cb, ++ error_handler=self.__gsm_sharing_error_cb) ++ ++ def __gsm_sharing_ok_cb(self, connection): ++ logging.debug('GSM sharing is enabled') ++ self._shared_connection = connection ++ self._bus.add_signal_receiver(self.__gsm_sharing_changed_cb, ++ signal_name='StateChanged', ++ path=self._target_dev_path, ++ dbus_interface=_NM_DEVICE_IFACE) ++ self._palette._sharing_state = _GSM_SHARING_NEIGHBORHOOD ++ self._palette.sharing_update_text() ++ ++ def __gsm_sharing_changed_cb(self, new_state, old_state, reason): ++ if new_state == network.DEVICE_STATE_DISCONNECTED: ++ self._gsm_sharing_reset() ++ ++ def _gsm_sharing_reset(self): ++ logging.debug('GSM sharing is disabled') ++ if self._target_dev_path != None: ++ self._bus.remove_signal_receiver(self.__gsm_sharing_changed_cb, ++ signal_name='StateChanged', ++ path=self._target_dev_path, ++ dbus_interface=_NM_DEVICE_IFACE) ++ self._shared_connection = None ++ self._target_dev_path = None ++ self._palette._sharing_state = _GSM_SHARING_PRIVATE ++ self._palette.sharing_update_text() ++ ++ def __gsm_sharing_error_cb(self, error): ++ logging.debug('GSM sharing could not start: %s' % str(error)) ++ self._gsm_sharing_reset() ++ ++ def __gsm_stop_sharing_cb(self, palette): ++ logging.debug('GSM will stop sharing now') ++ nm_obj = self._bus.get_object(_NM_SERVICE, _NM_PATH) ++ nm_iface = dbus.Interface(nm_obj, _NM_IFACE) ++ nm_iface.DeactivateConnection( ++ self._shared_connection, ++ reply_handler=self.__gsm_stop_sharing_ok_cb, ++ error_handler=self.__gsm_stop_sharing_error_cb) ++ ++ def __gsm_stop_sharing_ok_cb(self): ++ self._gsm_sharing_reset() ++ ++ def __gsm_stop_sharing_error_cb(self): ++ logging.debug('GSM sharing could not stop') ++ + + class WirelessDeviceObserver(object): + def __init__(self, device, tray): +-- +1.7.6 + |