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