Added config options for call and sms ringtones
[gregoa/zavai.git] / src / config.vala
1 /*
2  * config - zavai configuration
3  *
4  * Copyright (C) 2009--2010  Enrico Zini <enrico@enricozini.org>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 namespace zavai {
22
23 public class Config
24 {
25     protected Lua.LuaVM lua;
26     protected weak string get_string(string name)
27     {
28         lua.get_global(name);
29         weak string res = lua.to_string(-1);
30         lua.pop(1);
31         return res;
32     }
33     protected string set_string(string name, string? val)
34     {
35         if (val == null)
36             lua.push_nil();
37         else
38             lua.push_string(val);
39         lua.set_global(name);
40         return val;
41     }
42     protected weak int get_int(string name)
43     {
44         lua.get_global(name);
45         int res = lua.to_integer(-1);
46         lua.pop(1);
47         return res;
48     }
49     protected int set_int(string name, int val)
50     {
51         lua.push_integer(val);
52         lua.set_global(name);
53         return val;
54     }
55
56     private string _version;
57     public string version
58     {
59         get { return _version; }
60         set { _version = set_string("version", value); }
61     }
62
63     // "phone" or "laptop"
64     private string _profile;
65     public string profile
66     {
67         get { return _profile; }
68         set { _profile = set_string("profile", value); }
69     }
70
71     private string _homedir;
72     public string homedir
73     {
74         get { return _homedir; }
75         set { _homedir = set_string("homedir", value); }
76     }
77
78     private string _icondir;
79     public string icondir
80     {
81         get { return _icondir; }
82         set { _icondir = set_string("icondir", value); }
83     }
84
85     private int _min_button_height;
86     public int min_button_height
87     {
88         get { return _min_button_height; }
89         set { _min_button_height = set_int("min_button_height", value); }
90     }
91
92     private string _gpsd_host;
93     public string gpsd_host
94     {
95         get { return _gpsd_host; }
96         set { _gpsd_host = set_string("gpsd_host", value); }
97     }
98
99     private string _gpsd_port;
100     public string gpsd_port
101     {
102         get { return _gpsd_port; }
103         set { _gpsd_port = set_string("gpsd_port", value); }
104     }
105
106     private string _gprs_apn;
107     public string gprs_apn
108     {
109         get { return _gprs_apn; }
110         set { _gprs_apn = set_string("gprs_apn", value); }
111     }
112
113     private string _gprs_user;
114     public string gprs_user
115     {
116         get { return _gprs_user; }
117         set { _gprs_user = set_string("gprs_user", value); }
118     }
119
120     private string _gprs_pass;
121     public string gprs_pass
122     {
123         get { return _gprs_pass; }
124         set { _gprs_pass = set_string("gprs_pass", value); }
125     }
126
127     private string _sim_pin;
128     public string sim_pin
129     {
130         get { return _sim_pin; }
131         set { _sim_pin = set_string("sim_pin", value); }
132     }
133
134     private int _power_button_keycode;
135     public int power_button_keycode
136     {
137         get { return _power_button_keycode; }
138         set { _power_button_keycode = set_int("power_button_keycode", value); }
139     }
140
141     private int _aux_button_keycode;
142     public int aux_button_keycode
143     {
144         get { return _aux_button_keycode; }
145         set { _aux_button_keycode = set_int("aux_button_keycode", value); }
146     }
147
148     private string _ringtone_alarm;
149     public string ringtone_alarm
150     {
151         get { return _ringtone_alarm; }
152         set { _ringtone_alarm = set_string("ringtone_alarm", value); }
153     }
154
155     private string _ringtone_call;
156     public string ringtone_call
157     {
158         get { return _ringtone_call; }
159         set { _ringtone_call = set_string("ringtone_call", value); }
160     }
161
162     private string _ringtone_sms;
163     public string ringtone_sms
164     {
165         get { return _ringtone_sms; }
166         set { _ringtone_sms = set_string("ringtone_sms", value); }
167     }
168
169     public int backlight_max
170     {
171         get;
172         set;
173     }
174
175     private string _argv0;
176     public string argv0 {
177         get { return _argv0; }
178         set {
179             if (value.chr(-1, '/') != null)
180             {
181                 if (Path.is_absolute(value))
182                 {
183                     _argv0 = value;
184                 } else {
185                     _argv0 = Path.build_filename(Environment.get_current_dir(), value, null);
186                 }
187             } else {
188                 _argv0 = Environment.find_program_in_path(value);
189             }
190             zavai.log.debug("ARGV0: " + _argv0);
191         }
192     }
193
194     /// Reread config values from the Lua VM, to be run after running Lua code
195     protected void refresh_from_lua()
196     {
197         _version = get_string("version");
198         _profile = get_string("profile");
199         _homedir = get_string("homedir");
200         _icondir = get_string("icondir");
201         _min_button_height = get_int("min_button_height");
202         _gpsd_host = get_string("gpsd_host");
203         _gpsd_port = get_string("gpsd_port");
204         _gprs_apn = get_string("gprs_apn");
205         _gprs_user = get_string("gprs_user");
206         _gprs_pass = get_string("gprs_pass");
207         _sim_pin = get_string("sim_pin");
208         _power_button_keycode = get_int("power_button_keycode");
209         _aux_button_keycode = get_int("aux_button_keycode");
210         _ringtone_alarm = get_string("ringtone_alarm");
211         _ringtone_call = get_string("ringtone_call");
212         _ringtone_sms = get_string("ringtone_sms");
213     }
214
215     public Config()
216     {
217         lua = new Lua.LuaVM();
218         lua.open_libs();
219
220         // Set defaults
221         version = "0.1";
222         profile = "phone";
223         homedir = GLib.Environment.get_home_dir() + "/.zavai";
224         icondir = GLib.Environment.get_variable("ZAVAI_ICONDIR");
225         if (icondir == null)
226                 icondir = "/usr/share/zavai/icons";
227         min_button_height = 80;
228         gpsd_host = "localhost";
229         gpsd_port = "gpsd";
230         gprs_apn = "general.t-mobile.uk";
231         gprs_user = "x";
232         gprs_pass = "x";
233         sim_pin = "1234";
234         backlight_max = 15;
235         power_button_keycode = 124;
236         aux_button_keycode = 177;
237         ringtone_alarm = "file:///usr/share/sounds/yue-fso/lec1.ogg";
238         ringtone_call = "file:///usr/share/sounds/yue-fso/jmf1.ogg";
239         ringtone_sms = "file:///usr/share/sounds/yue-fso/nothing4.ogg";
240
241         // Read config
242         if (lua.do_file(homedir + "/config"))
243         {
244             zavai.log.error("Failed to parse " + homedir + "/config: " + lua.to_string(-1));
245         }
246         refresh_from_lua();
247     }
248
249     /**
250      * Find a zavai script.
251      * 
252      * ~/.zavai/NAME is searched first, then /usr/share/zavai/hooks/
253      *
254      * If the script is not found, NULL is returned
255      */
256     public string? find_script(string name)
257     {
258         string candidate = homedir + "/" + name;
259         if (FileUtils.test(candidate, FileTest.EXISTS))
260             return candidate;
261         candidate = "/usr/share/zavai/hooks/" + name;
262         if (FileUtils.test(candidate, FileTest.EXISTS))
263             return candidate;
264         return null;
265     }
266
267     public void find_and_run_script(string script, string args) throws SpawnError
268     {
269         string cmd = find_script(script);
270         if (cmd == null)
271             throw new SpawnError.NOENT("hook '" + cmd + "' not found");
272         run_script(cmd + " " + args);
273     }
274
275     public void run_script(string command) throws SpawnError
276     {
277         zavai.log.info("Run program: " + command);
278         string[] args = command.split(" ");
279         Pid pid;
280         Process.spawn_async(
281             Environment.get_home_dir(),
282             args,
283             null,
284             SpawnFlags.SEARCH_PATH,
285             null,
286             out pid);
287     }
288
289     public int run_script_sync(string command, out string std_out, out string std_err) throws SpawnError
290     {
291         int status = -1;
292         zavai.log.info("Run program: " + command);
293         string[] args = command.split(" ");
294         bool res = Process.spawn_sync(Environment.get_home_dir(), args, null, SpawnFlags.SEARCH_PATH, null, out std_out, out std_err, out status);
295         return status;
296     }
297 }
298
299 public Config config = null;
300
301 }