fixed sorting - Bug #11198
[wifi-assistant] / package / src / wifi_assistant / settings / network_settings.py
1 import gnome.gconf as gconf
2 import gtk, gobject
3
4 from wifi_assistant.settings.network_setting import NetworkSetting
5
6
7 class NetworkSettings(object):
8     '''
9     Reads and Writes NetworkSettings from/to GConf.
10     '''
11
12     __DEFAULT_SETTINGS = 'default_settings'
13     
14     def __init__(self, gconf_client, root_path):
15         self._gc = gconf_client
16         self._root_path = root_path
17         
18     
19     def delete(self, network_setting):
20         key = self._assembleRootKeyForSsid(network_setting.getNetworkName())
21         self._recursiveUnset(key)
22         
23         
24     def getDefaultSettings(self):
25         settings = self.get(self.__DEFAULT_SETTINGS)
26         if settings is None:
27             settings = NetworkSetting()
28             settings.setNetworkName(self.__DEFAULT_SETTINGS)
29             settings.setLaunchingOfBrowserEnabled(True)
30             settings.setBrowserOptions({'url':'http://wifi-assistant.garage.maemo.org/'})
31             self.save(settings)
32         return settings
33     
34
35     def getListStore(self):
36         """Returns a ListStore with one Row per Network Setting"""
37
38         store = gtk.ListStore(str, gobject.TYPE_BOOLEAN)
39         
40         settings = self._getAllNetworkSettings()
41         for setting in settings:
42             store.append([setting.getNetworkName(), setting.getLaunchingOfBrowserEnabled()])
43
44         # sorting
45         store.set_sort_column_id(0, gtk.SORT_ASCENDING)
46
47         return store
48
49
50     def get(self, ssid):
51         key = self._assembleRootKeyForSsid(ssid)
52         if self._gc.dir_exists(key):
53             return NetworkSetting(self._loadValuesFromGConf(key))
54         print "WARNING: No settings to return for network name", ssid
55         return None
56     
57     
58     def save(self, network_setting):
59         self._saveValuesToGConf(network_setting)
60     
61     
62     def _assembleRootKeyForSsid(self, ssid):
63         safe = self._replaceForbiddenCharacters(ssid)
64         return self._root_path + '/' + safe
65     
66     
67     def _getAllNetworkSettings(self):
68         dirs = self._gc.all_dirs(self._root_path)
69         settings = []
70         key_offset = len(self._root_path) + 1
71         for dir in dirs:
72             key = dir[key_offset:]
73             if self.__DEFAULT_SETTINGS != key:
74                 settings.append(self.get(key))
75         return settings
76     
77     
78     def _loadValuesFromGConf(self, path):
79         """Loads all values under a given path in gconf recursively into a dict"""
80         
81         values = {}
82         path_length = len(path) + 1 # remove trailing / too
83         
84         dirs = self._gc.all_dirs(path)
85         for sub_dir_path in dirs:
86             key = sub_dir_path[path_length:]
87             values[key] = self._loadValuesFromGConf(sub_dir_path)
88         
89         entries = self._gc.all_entries(path)
90         for entry in entries:
91             full_key = entry.get_key()
92             key = full_key[path_length:]
93             gvalue = entry.get_value()
94             if gvalue.type == gconf.VALUE_BOOL:
95                 values[key] = gvalue.get_bool()
96             elif gvalue.type == gconf.VALUE_STRING:
97                 values[key] = gvalue.get_string()
98             else:
99                 print 'ga'
100         
101         return values
102     
103     
104     def _recursiveUnset(self, dir):
105         # there's no recursive_unset available in gconf so we'll have to do it ourselves
106         all_entries = self._gc.all_entries(dir)
107         for entry in all_entries:
108             self._gc.unset(entry.get_key())
109         for sub_dir in self._gc.all_dirs(dir):
110             self._recursiveUnset(sub_dir)
111         self._gc.suggest_sync()
112
113     
114     def _replaceForbiddenCharacters(self, str):
115         allowed = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_'
116         result = ''
117         for c in str:
118             if c in allowed:
119                 result = result + c
120             else:
121                 result = result + '__'
122         return result
123     
124     
125     def _saveValuesToGConf(self, network_setting):
126         """Saves all values "recursively" from NetworkSetting"""
127         
128         network_name = network_setting.getNetworkName()
129         key = self._assembleRootKeyForSsid(network_name)
130         browser = network_setting.getNameOfBrowserToLaunch()
131         launch = network_setting.getLaunchingOfBrowserEnabled()
132         options = network_setting.getBrowserOptions()
133         
134         self._gc.set_string(key + "/name", network_name)
135         self._gc.set_string(key + '/browser', browser)
136         self._gc.set_bool(key + '/launch', launch)
137         for option_key in options:
138             self._gc.set_string(key + "/options/" + option_key, options[option_key])
139