Started redoing GSM as a service that manages a child gsm driver process
[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 device;
29     protected Pid child_pid;
30     protected int child_watch_id;
31
32     public GSM()
33     {
34         Object(name: "gsm.gsm");
35
36         device = null;
37         child_pid = 0;
38         child_watch_id = 0;
39     }
40
41     /// Request GPS resource
42     public override void start()
43     {
44         if (started) return;
45
46         string command = "sleep 10";
47         zavai.log.info("Run program: " + command);
48         string[] args = command.split(" ");
49         try {
50             Process.spawn_async(
51                 Environment.get_home_dir(),
52                 args,
53                 null,
54                 SpawnFlags.SEARCH_PATH | SpawnFlags.DO_NOT_REAP_CHILD,
55                 null,
56                 out child_pid);
57         } catch (SpawnError e) {
58             zavai.log.error("Running " + command + ": " + e.message);
59         }
60
61         // Add a child watch source to know when it ends
62         ChildWatch.add(child_pid, on_child);
63
64         // device = zavai.registry.sbus.get_object(
65         //     "org.freesmartphone.ogpsd", 
66         //     "/org/freesmartphone/GSM/Device",
67         //     "org.freesmartphone.Resource");
68
69         // try {
70         //     device.Enable();
71         //     zavai.log.info("Started GSM");
72         //     base.start();
73         // } catch (GLib.Error e) {
74         //     zavai.log.error(e.message);
75         // }
76         base.start();
77     }
78
79     // Release usage of GPS
80     public override void stop()
81     {
82         if (!started) return;
83
84         Posix.kill((Posix.pid_t)child_pid, Posix.SIGTERM);
85     }
86
87     public void on_child(Pid pid, int status)
88     {
89         zavai.log.info("Exited");
90 stderr.printf("STATUS %d\n", status);
91         Process.close_pid(pid);
92
93         // try {
94         //     device.Disable();
95         //     zavai.log.info("Stopped GSM");
96         //     base.stop();
97         // } catch (GLib.Error e) {
98         //     zavai.log.error(e.message);
99         // }
100
101         base.stop();
102     }
103 }
104
105 public class GPRS: zavai.Service
106 {
107     public dynamic DBus.Object device;
108
109     public GPRS()
110     {
111         Object(name: "gsm.gprs");
112
113         device = zavai.registry.sbus.get_object(
114             "org.freesmartphone.ogsmd", 
115             "/org/freesmartphone/GSM/Device",
116             "org.freesmartphone.GSM.PDP");
117     }
118
119     /// Request GPS resource
120     public override void start()
121     {
122         if (started) return;
123         try {
124             //gsm.request(name);
125             device.ActivateContext(
126                 zavai.config.gprs_apn,
127                 zavai.config.gprs_user,
128                 zavai.config.gprs_pass);
129             zavai.log.info("Started GPRS");
130             base.start();
131         } catch (GLib.Error e) {
132             zavai.log.error(e.message);
133         }
134         base.start();
135     }
136
137     // Release usage of GPS
138     public override void stop()
139     {
140         if (!started) return;
141         try {
142             //gsm.release(name);
143             device.DeactivateContext();
144             zavai.log.info("Stopped GPRS");
145             base.stop();
146         } catch (GLib.Error e) {
147             zavai.log.error(e.message);
148         }
149         base.stop();
150     }
151 }
152
153 public zavai.gsm.GSM gsm = null;
154 public zavai.gsm.GPRS gprs = null;
155
156 public void init()
157 {
158     gsm = new GSM();
159     gprs = new GPRS();
160 }
161
162 }
163 }