major rewrite
[wifi-assistant] / package / src / wifi_assistant / settings / network_settings.py
diff --git a/package/src/wifi_assistant/settings/network_settings.py b/package/src/wifi_assistant/settings/network_settings.py
new file mode 100644 (file)
index 0000000..0a489a9
--- /dev/null
@@ -0,0 +1,133 @@
+import gnome.gconf as gconf
+from NetworkSetting import NetworkSetting
+import gtk, gobject
+
+
+class NetworkSettings(object):
+    '''
+    Reads and Writes NetworkSettings from/to GConf.
+    '''
+
+    __DEFAULT_SETTINGS = 'default_settings'
+    
+    def __init__(self, gconf_client, root_path):
+        self._gc = gconf_client
+        self._root_path = root_path
+        
+    
+    def delete(self, network_setting):
+        key = self._assembleRootKeyForSsid(network_setting.getNetworkName())
+        self._recursive_unset(key)
+        
+        
+    def getDefaultSettings(self):
+        settings = self.get(self.__DEFAULT_SETTINGS)
+        if settings is None:
+            settings = NetworkSetting()
+            settings.setNetworkName(self.__DEFAULT_SETTINGS)
+            settings.setLaunchingOfBrowserEnabled(True)
+            settings.setBrowserOptions({'url':'http://wifi-assistant.garage.maemo.org/'})
+            self.save(settings)
+        return settings
+    
+
+    def getListStore(self):
+        """Returns a ListStore with one Row per Network Setting"""
+
+        store = gtk.ListStore(str, gobject.TYPE_BOOLEAN)
+        settings = self._getAllNetworkSettings()
+        for setting in settings:
+            store.append([setting.getNetworkName(), setting.getLaunchingOfBrowserEnabled()])
+        return store
+    
+
+    def get(self, ssid):
+        key = self._assembleRootKeyForSsid(ssid)
+        if self._gc.dir_exists(key):
+            return NetworkSetting(self._loadValuesFromGConf(key))
+        print "WARNING: No settings to return for network name", ssid
+        return None
+    
+    
+    def save(self, network_setting):
+        self._saveValuesToGConf(network_setting)
+    
+    
+    def _assembleRootKeyForSsid(self, ssid):
+        safe = self._replaceForbiddenCharacters(ssid)
+        return self._root_path + '/' + safe
+    
+    
+    def _getAllNetworkSettings(self):
+        dirs = self._gc.all_dirs(self._root_path)
+        settings = []
+        key_offset = len(self._root_path) + 1
+        for dir in dirs:
+            key = dir[key_offset:]
+            if self.__DEFAULT_SETTINGS != key:
+                settings.append(self.get(key))
+        return settings
+    
+    
+    def _loadValuesFromGConf(self, path):
+        """Loads all values under a given path in gconf recursively into a dict"""
+        
+        values = {}
+        path_length = len(path) + 1 # remove trailing / too
+        
+        dirs = self._gc.all_dirs(path)
+        for sub_dir_path in dirs:
+            key = sub_dir_path[path_length:]
+            values[key] = self._loadValuesFromGConf(sub_dir_path)
+        
+        entries = self._gc.all_entries(path)
+        for entry in entries:
+            full_key = entry.get_key()
+            key = full_key[path_length:]
+            gvalue = entry.get_value()
+            if gvalue.type == gconf.VALUE_BOOL:
+                values[key] = gvalue.get_bool()
+            elif gvalue.type == gconf.VALUE_STRING:
+                values[key] = gvalue.get_string()
+            else:
+                print 'ga'
+        
+        return values
+    
+    
+    def _recursive_unset(self, dir):
+        # there's no recursive_unset available in gconf so we'll have to do it ourselves
+        all_entries = self._gc.all_entries(dir)
+        for entry in all_entries:
+            self._gc.unset(entry.get_key())
+        for sub_dir in self._gc.all_dirs(dir):
+            self._recursive_unset(sub_dir)
+        self._gc.suggest_sync()
+
+    
+    def _replaceForbiddenCharacters(self, str):
+        allowed = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_'
+        result = ''
+        for c in str:
+            if c in allowed:
+                result = result + c
+            else:
+                result = result + '__'
+        return result
+    
+    
+    def _saveValuesToGConf(self, network_setting):
+        """Saves all values "recursively" from NetworkSetting"""
+        
+        network_name = network_setting.getNetworkName()
+        key = self._assembleRootKeyForSsid(network_name)
+        browser = network_setting.getNameOfBrowserToLaunch()
+        launch = network_setting.getLaunchingOfBrowserEnabled()
+        options = network_setting.getBrowserOptions()
+        
+        self._gc.set_string(key + "/name", network_name)
+        self._gc.set_string(key + '/browser', browser)
+        self._gc.set_bool(key + '/launch', launch)
+        for option_key in options:
+            self._gc.set_string(key + "/options/" + option_key, options[option_key])
+        
\ No newline at end of file