make a regular gui module for android
[electrum-nvc.git] / lib / simple_config.py
1 import json, ast
2 import os, ast
3 from util import user_dir, print_error
4
5 from version import ELECTRUM_VERSION, SEED_VERSION
6
7
8
9 class SimpleConfig:
10
11     def __init__(self, options={}):
12
13         # system conf, readonly
14         self.system_config = {}
15         self.read_system_config()
16
17         # user conf, writeable
18         self.user_dir = user_dir()
19         self.user_config = {}
20         self.read_user_config()
21
22         # command-line options
23         self.options_config = options
24
25         self.wallet_config = {}
26         self.wallet_file_exists = False
27         self.init_path(self.options_config.get('wallet_path'))
28         print_error( "path", self.path )
29         if self.path:
30             self.read_wallet_config(self.path)
31             
32             
33             
34         
35
36     def set_key(self, key, value, save = False):
37         # find where a setting comes from and save it there
38         if self.options_config.get(key) is not None:
39             print "Warning: not changing '%s' because it was passed as a command-line option"%key
40             return
41
42         elif self.user_config.get(key) is not None:
43             self.user_config[key] = value
44             if save: self.save_user_config()
45
46         elif self.system_config.get(key) is not None:
47             if str(self.system_config[key]) != str(value):
48                 print "Warning: not changing '%s' because it was set in the system configuration"%key
49
50         elif self.wallet_config.get(key) is not None:
51             self.wallet_config[key] = value
52             if save: self.save_wallet_config()
53
54         else:
55             # add key to wallet config
56             self.wallet_config[key] = value
57             if save: self.save_wallet_config()
58
59
60     def get(self, key, default=None):
61         # 1. command-line options always override everything
62         if self.options_config.has_key(key) and self.options_config.get(key) is not None:
63             out = self.options_config.get(key)
64
65         # 2. user configuration 
66         elif self.user_config.has_key(key):
67             out = self.user_config.get(key)
68
69         # 2. system configuration
70         elif self.system_config.has_key(key):
71             out = self.system_config.get(key)
72
73         # 3. use the wallet file config
74         else:
75             out = self.wallet_config.get(key)
76
77         if out is None and default is not None:
78             out = default
79
80         # try to fix the type
81         if default is not None and type(out) != type(default):
82             import ast
83             try:
84                 out = ast.literal_eval(out)
85             except:
86                 print "type error, using default value"
87                 out = default
88
89         return out
90
91
92     def is_modifiable(self, key):
93         if self.options_config.has_key(key):
94             return False
95         elif self.user_config.has_key(key):
96             return True
97         elif self.system_config.has_key(key):
98             return False
99         else:
100             return True
101
102
103     def read_system_config(self):
104         name = '/etc/electrum.conf'
105         if os.path.exists(name):
106             try:
107                 import ConfigParser
108             except:
109                 print "cannot parse electrum.conf. please install ConfigParser"
110                 return
111                 
112             p = ConfigParser.ConfigParser()
113             p.read(name)
114             try:
115                 for k, v in p.items('client'):
116                     self.system_config[k] = v
117             except ConfigParser.NoSectionError:
118                 pass
119
120
121     def read_user_config(self):
122         if not self.user_dir: return
123
124         name = os.path.join( self.user_dir, 'electrum.conf')
125         if os.path.exists(name):
126             try:
127                 import ConfigParser
128             except:
129                 print "cannot parse electrum.conf. please install ConfigParser"
130                 return
131                 
132             p = ConfigParser.ConfigParser()
133             p.read(name)
134             try:
135                 for k, v in p.items('client'):
136                     self.user_config[k] = v
137             except ConfigParser.NoSectionError:
138                 pass
139
140
141     def init_path(self, path):
142         """Set the path of the wallet."""
143
144         if not path:
145             path = self.get('default_wallet_path')
146
147         if path is not None:
148             self.path = path
149             return
150
151         # Look for wallet file in the default data directory.
152         # Make wallet directory if it does not yet exist.
153         if not os.path.exists(self.user_dir):
154             os.mkdir(self.user_dir)
155         self.path = os.path.join(self.user_dir, "electrum.dat")
156
157
158     def save_user_config(self):
159         if not self.user_dir: return
160
161         import ConfigParser
162         config = ConfigParser.RawConfigParser()
163         config.add_section('client')
164         for k,v in self.user_config.items():
165             config.set('client', k, v)
166
167         with open( os.path.join( self.user_dir, 'electrum.conf'), 'wb') as configfile:
168             config.write(configfile)
169         
170
171
172
173     def read_wallet_config(self, path):
174         """Read the contents of the wallet file."""
175         try:
176             with open(self.path, "r") as f:
177                 data = f.read()
178         except IOError:
179             return
180         try:
181             d = ast.literal_eval( data )  #parse raw data from reading wallet file
182         except:
183             raise IOError("Cannot read wallet file.")
184
185         self.wallet_config = d
186         self.wallet_file_exists = True
187
188
189
190     def save(self):
191         self.save_wallet_config()
192
193
194     def save_wallet_config(self):
195         s = repr(self.wallet_config)
196         f = open(self.path,"w")
197         f.write( s )
198         f.close()
199         if self.get('gui') != 'android':
200             import stat
201             os.chmod(self.path,stat.S_IREAD | stat.S_IWRITE)
202