fixed changes to namespaces
[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._recursive_unset(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         settings = self._getAllNetworkSettings()
40         for setting in settings:
41             store.append([setting.getNetworkName(), setting.getLaunchingOfBrowserEnabled()])
42         return store
43     
44
45     def get(self, ssid):
46         key = self._assembleRootKeyForSsid(ssid)
47         if self._gc.dir_exists(key):
48             return NetworkSetting(self._loadValuesFromGConf(key))
49         print "WARNING: No settings to return for network name", ssid
50         return None
51     
52     
53     def save(self, network_setting):
54         self._saveValuesToGConf(network_setting)
55     
56     
57     def _assembleRootKeyForSsid(self, ssid):
58         safe = self._replaceForbiddenCharacters(ssid)
59         return self._root_path + '/' + safe
60     
61     
62     def _getAllNetworkSettings(self):
63         dirs = self._gc.all_dirs(self._root_path)
64         settings = []
65         key_offset = len(self._root_path) + 1
66         for dir in dirs:
67             key = dir[key_offset:]
68             if self.__DEFAULT_SETTINGS != key:
69                 settings.append(self.get(key))
70         return settings
71     
72     
73     def _loadValuesFromGConf(self, path):
74         """Loads all values under a given path in gconf recursively into a dict"""
75         
76         values = {}
77         path_length = len(path) + 1 # remove trailing / too
78         
79         dirs = self._gc.all_dirs(path)
80         for sub_dir_path in dirs:
81             key = sub_dir_path[path_length:]
82             values[key] = self._loadValuesFromGConf(sub_dir_path)
83         
84         entries = self._gc.all_entries(path)
85         for entry in entries:
86             full_key = entry.get_key()
87             key = full_key[path_length:]
88             gvalue = entry.get_value()
89             if gvalue.type == gconf.VALUE_BOOL:
90                 values[key] = gvalue.get_bool()
91             elif gvalue.type == gconf.VALUE_STRING:
92                 values[key] = gvalue.get_string()
93             else:
94                 print 'ga'
95         
96         return values
97     
98     
99     def _recursive_unset(self, dir):
100         # there's no recursive_unset available in gconf so we'll have to do it ourselves
101         all_entries = self._gc.all_entries(dir)
102         for entry in all_entries:
103             self._gc.unset(entry.get_key())
104         for sub_dir in self._gc.all_dirs(dir):
105             self._recursive_unset(sub_dir)
106         self._gc.suggest_sync()
107
108     
109     def _replaceForbiddenCharacters(self, str):
110         allowed = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_'
111         result = ''
112         for c in str:
113             if c in allowed:
114                 result = result + c
115             else:
116                 result = result + '__'
117         return result
118     
119     
120     def _saveValuesToGConf(self, network_setting):
121         """Saves all values "recursively" from NetworkSetting"""
122         
123         network_name = network_setting.getNetworkName()
124         key = self._assembleRootKeyForSsid(network_name)
125         browser = network_setting.getNameOfBrowserToLaunch()
126         launch = network_setting.getLaunchingOfBrowserEnabled()
127         options = network_setting.getBrowserOptions()
128         
129         self._gc.set_string(key + "/name", network_name)
130         self._gc.set_string(key + '/browser', browser)
131         self._gc.set_bool(key + '/launch', launch)
132         for option_key in options:
133             self._gc.set_string(key + "/options/" + option_key, options[option_key])
134