More dbus bits
[gregoa/zavai.git] / src / gsm.vala
1 /*
2  * gsm - gsm resource for zavai
3  *
4  * Copyright (C) 2009  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 using GLib;
22
23 namespace zavai {
24 namespace gsm {
25
26 public class GSM: zavai.Service
27 {
28     public dynamic DBus.Object network;
29     public dynamic DBus.Object call;
30     public dynamic DBus.Object device;
31     public dynamic DBus.Object sim;
32     protected Pid child_pid;
33     protected int child_watch_id;
34
35     public GSM()
36     {
37         Object(name: "gsm.gsm");
38
39         network = null;
40         call = null;
41         device = null;
42         sim = null;
43
44         child_pid = 0;
45         child_watch_id = 0;
46     }
47
48     /// Request GPS resource
49     public override void start()
50     {
51         if (started) return;
52
53         string command = zavai.config.homedir + "/gsm run";
54         zavai.log.info("Run program: " + command);
55         string[] args = command.split(" ");
56         try {
57             Process.spawn_async(
58                 Environment.get_home_dir(),
59                 args,
60                 null,
61                 SpawnFlags.SEARCH_PATH | SpawnFlags.DO_NOT_REAP_CHILD,
62                 null,
63                 out child_pid);
64         } catch (SpawnError e) {
65             zavai.log.error("Running " + command + ": " + e.message);
66         }
67
68         // Add a child watch source to know when it ends
69         ChildWatch.add(child_pid, on_child);
70
71         network = zavai.registry.sbus.get_object(
72             "org.freesmartphone.ogpsd", 
73             "/org/freesmartphone/GSM/Device",
74             "org.freesmartphone.GSM.Network");
75         call = zavai.registry.sbus.get_object(
76             "org.freesmartphone.ogpsd", 
77             "/org/freesmartphone/GSM/Device",
78             "org.freesmartphone.GSM.Call");
79         device = zavai.registry.sbus.get_object(
80             "org.freesmartphone.ogpsd", 
81             "/org/freesmartphone/GSM/Device",
82             "org.freesmartphone.GSM.Device");
83         sim = zavai.registry.sbus.get_object(
84             "org.freesmartphone.ogpsd", 
85             "/org/freesmartphone/GSM/Device",
86             "org.freesmartphone.GSM.SIM");
87
88         device.SetAntennaPower(true, on_antenna_power);
89         //                             reply_handler = self.cbAntennaPowerReply,
90         //                             error_handler = self.cbAntennaPowerError)
91
92         // try {
93         //     device.Enable();
94         //     zavai.log.info("Started GSM");
95         //     base.start();
96         // } catch (GLib.Error e) {
97         //     zavai.log.error(e.message);
98         // }
99         base.start();
100     }
101
102     protected void on_antenna_power(Error e)
103     {
104         if (e != null)
105         {
106             zavai.log.warning("on_antenna_power: " + e.message);
107             // if str(e).find("current status is 'enabling'") >= 0 or str(e).find("current status is 'unknown'") >= 0:
108             //     time.sleep(10)
109             //     self.cbStartAntenna(0)
110             // else:
111             //     self.gsm_sim_iface.GetAuthStatus(reply_handler = self.cbAuthStatusReply,
112             //             error_handler = lambda e: (dbg("cbAuthStatusError %s" % e), self.loop.quit()))
113             return;
114         }
115         zavai.log.warning("on_antenna_power ok");
116         // network.Register(reply_handler = self.cbRegisterReply,
117         //                  error_handler = lambda e: (dbg("cbRegisterError %s" % e), self.loop.quit()))
118     }
119
120     // Release usage of GPS
121     public override void stop()
122     {
123         if (!started) return;
124
125         Posix.kill((Posix.pid_t)child_pid, Posix.SIGTERM);
126     }
127
128     public void on_child(Pid pid, int status)
129     {
130         zavai.log.info("Exited");
131 stderr.printf("STATUS %d\n", status);
132         Process.close_pid(pid);
133
134         // try {
135         //     device.Disable();
136         //     zavai.log.info("Stopped GSM");
137         //     base.stop();
138         // } catch (GLib.Error e) {
139         //     zavai.log.error(e.message);
140         // }
141
142         network = null;
143         call = null;
144         device = null;
145         sim = null;
146
147         base.stop();
148     }
149 }
150
151 public class GPRS: zavai.Service
152 {
153     public dynamic DBus.Object device;
154
155     public GPRS()
156     {
157         Object(name: "gsm.gprs");
158
159         device = zavai.registry.sbus.get_object(
160             "org.freesmartphone.ogsmd", 
161             "/org/freesmartphone/GSM/Device",
162             "org.freesmartphone.GSM.PDP");
163     }
164
165     /// Request GPS resource
166     public override void start()
167     {
168         if (started) return;
169         try {
170             //gsm.request(name);
171             device.ActivateContext(
172                 zavai.config.gprs_apn,
173                 zavai.config.gprs_user,
174                 zavai.config.gprs_pass);
175             zavai.log.info("Started GPRS");
176             base.start();
177         } catch (GLib.Error e) {
178             zavai.log.error(e.message);
179         }
180         base.start();
181     }
182
183     // Release usage of GPS
184     public override void stop()
185     {
186         if (!started) return;
187         try {
188             //gsm.release(name);
189             device.DeactivateContext();
190             zavai.log.info("Stopped GPRS");
191             base.stop();
192         } catch (GLib.Error e) {
193             zavai.log.error(e.message);
194         }
195         base.stop();
196     }
197 }
198
199 public zavai.gsm.GSM gsm = null;
200 public zavai.gsm.GPRS gprs = null;
201
202 public void init()
203 {
204     gsm = new GSM();
205     gprs = new GPRS();
206 }
207
208 }
209 }