Register with network also on the PIN code path
[gregoa/zavai.git] / zavai / gsm.vala
1 /*
2  * gsm - gsm resource for zavai
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 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("Registering with network");
130         network.Register(on_network_register);
131     }
132 }
133
134 public class GSM: zavai.ScriptMonitorService
135 {
136     protected dynamic DBus.Object dbus;
137     public dynamic DBus.Object call;
138     protected GSMActivator activator;
139
140     public signal void status_changed(string message);
141
142     public GSM()
143     {
144         Object(name: "gsm");
145
146         activator = new GSMActivator();
147         activator.status_changed += (msg) => { status_changed(msg); };
148
149         call = null;
150
151         dbus = zavai.registry.sbus.get_object(
152                 "org.freedesktop.DBus",
153                 "/org/freedesktop/DBus",
154                 "org.freedesktop.DBus");
155         dbus.NameOwnerChanged += on_name_owner_changed;
156     }
157
158     /// Request GPS resource
159     public override void start()
160     {
161         if (started) return;
162
163         status_changed("Starting");
164
165         script_start();
166
167         call = zavai.registry.sbus.get_object(
168             "org.freesmartphone.ogsmd", 
169             "/org/freesmartphone/GSM/Device",
170             "org.freesmartphone.GSM.Call");
171
172         base.start();
173     }
174
175     protected void on_name_owner_changed(DBus.Object sender, string name, string oldOwner, string newOwner)
176     {
177         zavai.log.debug("NOC " + name + " from " + oldOwner + " to " + newOwner);
178         if (name == "org.freesmartphone.ogsmd" && newOwner != "")
179         {
180             status_changed("ogpsd came online");
181             activator.begin();
182         }
183     }
184
185     // Release usage of GPS
186     public override void stop()
187     {
188         if (!started) return;
189
190         script_stop();
191     }
192
193     protected override void cleanup_after_script_stop()
194     {
195         call = null;
196     }
197 }
198
199 public class GPRS: zavai.Service
200 {
201     public dynamic DBus.Object device;
202
203     public GPRS()
204     {
205         Object(name: "gsm.gprs");
206
207         device = zavai.registry.sbus.get_object(
208             "org.freesmartphone.ogsmd", 
209             "/org/freesmartphone/GSM/Device",
210             "org.freesmartphone.GSM.PDP");
211     }
212
213     /// Request GPS resource
214     public override void start()
215     {
216         if (started) return;
217         try {
218             //gsm.request(name);
219             device.ActivateContext(
220                 zavai.config.gprs_apn,
221                 zavai.config.gprs_user,
222                 zavai.config.gprs_pass);
223             zavai.log.info("Started GPRS");
224             base.start();
225         } catch (GLib.Error e) {
226             zavai.log.error(e.message);
227         }
228         base.start();
229     }
230
231     // Release usage of GPS
232     public override void stop()
233     {
234         if (!started) return;
235         try {
236             //gsm.release(name);
237             device.DeactivateContext();
238             zavai.log.info("Stopped GPRS");
239             base.stop();
240         } catch (GLib.Error e) {
241             zavai.log.error(e.message);
242         }
243         base.stop();
244     }
245 }
246
247 public zavai.gsm.GSM gsm = null;
248 public zavai.gsm.GPRS gprs = null;
249
250 public void init()
251 {
252     gsm = new GSM();
253     gprs = new GPRS();
254 }
255
256 }
257 }