Revert "Split non-ui functions in separate lib"
[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 // Isolate here the insane loops we need to go through to turn on the bloody
27 // gsm
28 protected class GSMActivator : Object
29 {
30     public dynamic DBus.Object device;
31     public dynamic DBus.Object network;
32     public dynamic DBus.Object sim;
33
34     public signal void status_changed(string message);
35
36     public GSMActivator()
37     {
38         device = null;
39         network = null;
40         sim = null;
41     }
42
43     public void begin()
44     {
45         if (device == null)
46         {
47             device = zavai.registry.sbus.get_object(
48                     "org.freesmartphone.ogsmd", 
49                     "/org/freesmartphone/GSM/Device",
50                     "org.freesmartphone.GSM.Device");
51             network = zavai.registry.sbus.get_object(
52                 "org.freesmartphone.ogsmd", 
53                 "/org/freesmartphone/GSM/Device",
54                 "org.freesmartphone.GSM.Network");
55             sim = zavai.registry.sbus.get_object(
56                     "org.freesmartphone.ogsmd", 
57                     "/org/freesmartphone/GSM/Device",
58                     "org.freesmartphone.GSM.SIM");
59         }
60
61         status_changed("Turning on antenna");
62         device.SetAntennaPower(true, on_antenna_power);
63     }
64
65     protected void on_antenna_power(Error e)
66     {
67         if (e != null)
68         {
69             zavai.log.warning("on_antenna_power: " + e.message);
70             if (e.message.str("current status is 'enabling'") != null
71                 || e.message.str("current status is 'unknown'") != null)
72             {
73                 status_changed("Waiting for ogsmd to settle");
74                 zavai.log.info("trying again after 2 seconds");
75                 Timeout.add(2 * 1000, () => {
76                     device.SetAntennaPower(true, on_antenna_power);
77                     return false;
78                 });
79             } else {
80                 status_changed("Checking if PIN is required");
81                 sim.GetAuthStatus(on_auth_status);
82             }
83             return;
84         }
85         zavai.log.warning("on_antenna_power ok");
86         status_changed("Registering with network");
87         network.Register(on_network_register);
88     }
89
90     protected void on_network_register(Error e)
91     {
92         if (e != null)
93         {
94             zavai.log.warning("on_network_register: " + e.message);
95             return;
96         }
97         status_changed("Registered with network");
98     }
99
100     protected void on_auth_status(string status, Error e)
101     {
102         if (e != null)
103         {
104             zavai.log.warning("on_auth_status: " + e.message);
105             return;
106         }
107         zavai.log.info("on_auth_status: " + status);
108         if (status == "READY")
109         {
110             status_changed("PIN ok");
111             device.SetAntennaPower(true, on_antenna_power);
112         }
113         else if (status == "SIM PIN")
114         {
115             status_changed("Sending PIN");
116             sim.SendAuthCode(zavai.config.sim_pin, on_auth_code);
117         }
118         else
119             zavai.log.debug("Unknown status: " + status);
120     }
121
122     protected void on_auth_code(Error e)
123     {
124         if (e != null)
125         {
126             zavai.log.warning("on_auth_code: " + e.message);
127             return;
128         }
129         status_changed("PIN OK");
130     }
131 }
132
133 public class GSM: zavai.ScriptMonitorService
134 {
135     protected dynamic DBus.Object dbus;
136     public dynamic DBus.Object call;
137     protected GSMActivator activator;
138
139     public signal void status_changed(string message);
140
141     public GSM()
142     {
143         Object(name: "gsm");
144
145         activator = new GSMActivator();
146         activator.status_changed += (msg) => { status_changed(msg); };
147
148         call = null;
149
150         dbus = zavai.registry.sbus.get_object(
151                 "org.freedesktop.DBus",
152                 "/org/freedesktop/DBus",
153                 "org.freedesktop.DBus");
154         dbus.NameOwnerChanged += on_name_owner_changed;
155     }
156
157     /// Request GPS resource
158     public override void start()
159     {
160         if (started) return;
161
162         status_changed("Starting");
163
164         script_start();
165
166         call = zavai.registry.sbus.get_object(
167             "org.freesmartphone.ogsmd", 
168             "/org/freesmartphone/GSM/Device",
169             "org.freesmartphone.GSM.Call");
170
171         base.start();
172     }
173
174     protected void on_name_owner_changed(DBus.Object sender, string name, string oldOwner, string newOwner)
175     {
176         zavai.log.debug("NOC " + name + " from " + oldOwner + " to " + newOwner);
177         if (name == "org.freesmartphone.ogsmd" && newOwner != "")
178         {
179             status_changed("ogpsd came online");
180             activator.begin();
181         }
182     }
183
184     // Release usage of GPS
185     public override void stop()
186     {
187         if (!started) return;
188
189         script_stop();
190     }
191
192     protected override void cleanup_after_script_stop()
193     {
194         call = null;
195     }
196 }
197
198 public class GPRS: zavai.Service
199 {
200     public dynamic DBus.Object device;
201
202     public GPRS()
203     {
204         Object(name: "gsm.gprs");
205
206         device = zavai.registry.sbus.get_object(
207             "org.freesmartphone.ogsmd", 
208             "/org/freesmartphone/GSM/Device",
209             "org.freesmartphone.GSM.PDP");
210     }
211
212     /// Request GPS resource
213     public override void start()
214     {
215         if (started) return;
216         try {
217             //gsm.request(name);
218             device.ActivateContext(
219                 zavai.config.gprs_apn,
220                 zavai.config.gprs_user,
221                 zavai.config.gprs_pass);
222             zavai.log.info("Started GPRS");
223             base.start();
224         } catch (GLib.Error e) {
225             zavai.log.error(e.message);
226         }
227         base.start();
228     }
229
230     // Release usage of GPS
231     public override void stop()
232     {
233         if (!started) return;
234         try {
235             //gsm.release(name);
236             device.DeactivateContext();
237             zavai.log.info("Stopped GPRS");
238             base.stop();
239         } catch (GLib.Error e) {
240             zavai.log.error(e.message);
241         }
242         base.stop();
243     }
244 }
245
246 public zavai.gsm.GSM gsm = null;
247 public zavai.gsm.GPRS gprs = null;
248
249 public void init()
250 {
251     gsm = new GSM();
252     gprs = new GPRS();
253 }
254
255 }
256 }