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