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