diff options
-rw-r--r--[-rwxr-xr-x] | extensions/cpsection/modemconfiguration/model.py | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/extensions/cpsection/modemconfiguration/model.py b/extensions/cpsection/modemconfiguration/model.py index 2545ce1..73b9c63 100755..100644 --- a/extensions/cpsection/modemconfiguration/model.py +++ b/extensions/cpsection/modemconfiguration/model.py @@ -14,12 +14,38 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 US +from __future__ import with_statement import gconf +import gtk +import os +import locale +import logging + +from xml.etree.cElementTree import ElementTree +from gettext import gettext as _ from jarabe.model.network import GSM_USERNAME_PATH, GSM_PASSWORD_PATH, \ GSM_NUMBER_PATH, GSM_APN_PATH, GSM_PIN_PATH, \ GSM_PUK_PATH +from cpsection.modemconfiguration.config import PROVIDERS_PATH, \ + PROVIDERS_FORMAT_SUPPORTED, \ + COUNTRY_CODES_PATH + +_country_code, _encoding = locale.getdefaultlocale() +if _country_code is not None: + _tags = _country_code.lower().split('_') + LANG = _tags[0] + if len(_tags) > 1 and len(_tags[1]) == 2: + COUNTRY_CODE = _tags[1] + else: + COUNTRY_CODE = None +else: + LANG = None + COUNTRY_CODE = None + +LANG_NS_ATTR = '{http://www.w3.org/XML/1998/namespace}lang' + def get_username(): client = gconf.client_get_default() return client.get_string(GSM_USERNAME_PATH) or '' @@ -68,3 +94,114 @@ def set_puk(puk): client = gconf.client_get_default() client.set_string(GSM_PUK_PATH, puk) +def has_providers_db(): + if not os.path.isfile(COUNTRY_CODES_PATH): + logging.debug("Mobile broadband provider database: Country " \ + "codes path %s not found.", COUNTRY_CODES_PATH) + return False + try: + tree = ElementTree(file=PROVIDERS_PATH) + except (IOError, SyntaxError), e: + logging.debug("Mobile broadband provider database: Could not read " \ + "provider information %s error=%s", PROVIDERS_PATH) + return False + else: + elem = tree.getroot() + if elem is None or elem.get('format') != PROVIDERS_FORMAT_SUPPORTED: + logging.debug("Mobile broadband provider database: Could not " \ + "read provider information. %s is wrong format.", + elem.get('format')) + return False + return True + + +class CountryListStore(gtk.ListStore): + def __init__(self): + gtk.ListStore.__init__(self, str, object) + codes = {} + with open(COUNTRY_CODES_PATH) as codes_file: + for line in codes_file: + if line.startswith('#'): + continue + code, name = line.split('\t')[:2] + codes[code.lower()] = name.strip() + etree = ElementTree(file=PROVIDERS_PATH).getroot() + self._country_idx = None + i = 0 + for elem in etree.findall('.//country'): + code = elem.attrib['code'] + if code == COUNTRY_CODE: + self._country_idx = i + else: + i += 1 + if code in codes: + self.append((codes[code], elem)) + else: + self.append((code, elem)) + + def get_row_providers(self, row): + return self[row][1] + + def guess_country_row(self): + if self._country_idx is not None: + return self._country_idx + else: + return -1 + +class ProviderListStore(gtk.ListStore): + def __init__(self, elem): + gtk.ListStore.__init__(self, str, object) + for provider_elem in elem.findall('.//provider'): + apns = provider_elem.findall('.//apn') + if not apns: + # Skip carriers with CDMA entries only + continue + names = provider_elem.findall('.//name') + for name in names: + if name.get(LANG_NS_ATTR) is None: + # serviceproviders.xml default value + provider_name = name.text + elif name.get(LANG_NS_ATTR) == LANG: + # Great! We found a name value for our locale! + provider_name = name.text + break + self.append((provider_name, apns)) + + def get_row_plans(self, row): + return self[row][1] + +class PlanListStore(gtk.ListStore): + DEFAULT_NUMBER = '*99#' + + def __init__(self, elems): + gtk.ListStore.__init__(self, str, object) + for apn_elem in elems: + plan = {} + names = apn_elem.findall('.//name') + if names: + for name in names: + if name.get(LANG_NS_ATTR) is None: + plan['name'] = name.text + elif name.get(LANG_NS_ATTR) == LANG: + plan['name'] = name.text + break + else: + plan['name'] = _('Default') + plan['apn'] = apn_elem.get('value') + user = apn_elem.find('.//username') + if user is not None: + plan['username'] = user.text + else: + plan['username'] = '' + passwd = apn_elem.find('.//password') + if passwd is not None: + plan['password'] = passwd.text + else: + plan['password'] = '' + + plan['number'] = self.DEFAULT_NUMBER + + self.append((plan['name'], plan)) + + def get_row_plan(self, row): + return self[row][1] |