initial import of ussd-pad
[ussd-widget] / ussd-pad / src / opt / ussd-pad / utils / Config.py
1 """
2 Class for storing and retrieving configuration values via GConf.
3 """
4
5
6 try:
7     # GNOME
8     import gconf
9 except:
10     try:
11         # Maemo    
12         import gnome.gconf as gconf
13     except:
14         # last resort...
15         from utils import gconftool as gconf
16         
17         
18 _CLIENT = gconf.client_get_default()
19
20
21 class Config(object):
22     """
23     Class for storing and retrieving configuration values via GConf.
24     
25     Example::
26       cfg = Config("my-plugin", [("foo", Config.STRING, "foobar"),
27                                  ("bar", Config.INTEGER, 10)])
28       cfg["foo"] = "Some string"
29       print cfg["bar"]
30       
31     @since: 0.96
32     """
33
34     INTEGER = 0
35     STRING = 1
36     BOOL = 2
37     INTEGER_LIST = 3
38     STRING_LIST = 4
39     
40     
41     def __init__(self, prefix, schema):
42         """
43         Creates a new Config object for storing configuration under the given
44         prefix with the given schema. Prefix must end with "/".
45         
46         Schema is a list of tuples of the form
47         C{(key_name, datatype, default_value)}
48         describing the valid keys that can be stored.
49         @since: 0.96
50         
51         @param prefix: prefix for keys
52         @param schema: list of schema tuples
53         """
54         
55         self.__prefix = prefix
56         self.__schema = schema
57         
58         
59     def __lookup_schema(self, key):
60         
61         for k, t, d in self.__schema:
62             if (k == key):
63                 return (t, d)
64         #end for
65         raise KeyError("no such key %s" % key)
66         
67         
68     def __getitem__(self, key):
69     
70         return self.__get(key)
71         
72         
73     def __setitem__(self, key, value):
74     
75         self.__set(key, value)
76         
77
78     def __get(self, key):
79     
80         dtype, default = self.__lookup_schema(key)
81         
82         if (dtype == self.STRING):
83             return _CLIENT.get_string(self.__prefix + key) \
84                    or default
85         elif (dtype == self.STRING_LIST):
86             l = _CLIENT.get_list(self.__prefix + key, gconf.VALUE_STRING) or []
87             return l[:] or default[:]
88         elif (dtype == self.INTEGER):
89             try:
90                 have_key = _CLIENT.get_without_default(self.__prefix + key)
91             except:
92                 have_key = False
93
94             v = _CLIENT.get_int(self.__prefix + key)
95             if (not have_key): v = default
96             return v
97         elif (dtype == self.INTEGER_LIST):                
98             l = _CLIENT.get_list(self.__prefix + key, gconf.VALUE_INT) or []
99             return l[:] or default[:]
100         elif (dtype == self.BOOL):
101             try:
102                 have_key = _CLIENT.get_without_default(self.__prefix + key)
103             except:
104                 have_key = False
105
106             v = _CLIENT.get_bool(self.__prefix + key)
107             if (not have_key): v = default
108             return v
109         else:
110             return None    
111         
112         
113     def __set(self, key, value):
114     
115         dtype, default = self.__lookup_schema(key)
116         
117         if (dtype == self.STRING):
118             _CLIENT.set_string(self.__prefix + key, value)
119         elif (dtype == self.STRING_LIST):
120             _CLIENT.set_list(self.__prefix + key, gconf.VALUE_STRING, value)
121         elif (dtype == self.INTEGER):
122             _CLIENT.set_int(self.__prefix + key, value)
123         elif (dtype == self.INTEGER_LIST):
124             _CLIENT.set_list(self.__prefix + key, gconf.VALUE_INT, value)
125         elif (dtype == self.BOOL):
126             _CLIENT.set_bool(self.__prefix + key, value)
127