]> ToastFreeware Gitweb - gregoa/zavai.git/blobdiff - src/gsm.vala
More activation motions
[gregoa/zavai.git] / src / gsm.vala
index f73ac1557c677cadf03061556b5d8cca26b182f2..105d6efb7d246eb62f7a87c880e22c00897c3124 100644 (file)
@@ -23,24 +23,116 @@ using GLib;
 namespace zavai {
 namespace gsm {
 
+// Isolate here the insane loops we need to go through to turn on the bloody
+// gsm
+protected class GSMActivator : Object
+{
+    public dynamic DBus.Object device;
+    public dynamic DBus.Object network;
+    public dynamic DBus.Object sim;
+
+    public GSMActivator()
+    {
+        device = null;
+        network = null;
+        sim = null;
+    }
+
+    public void begin()
+    {
+        if (device == null)
+        {
+            device = zavai.registry.sbus.get_object(
+                    "org.freesmartphone.ogsmd", 
+                    "/org/freesmartphone/GSM/Device",
+                    "org.freesmartphone.GSM.Device");
+            network = zavai.registry.sbus.get_object(
+                "org.freesmartphone.ogsmd", 
+                "/org/freesmartphone/GSM/Device",
+                "org.freesmartphone.GSM.Network");
+            sim = zavai.registry.sbus.get_object(
+                    "org.freesmartphone.ogsmd", 
+                    "/org/freesmartphone/GSM/Device",
+                    "org.freesmartphone.GSM.SIM");
+        }
+
+        device.SetAntennaPower(true, on_antenna_power);
+    }
+
+    protected void on_antenna_power(Error e)
+    {
+        if (e != null)
+        {
+            zavai.log.warning("on_antenna_power: " + e.message);
+            if (e.message.str("current status is 'enabling'") != null
+                || e.message.str("current status is 'unknown'") != null)
+            {
+                zavai.log.info("trying again after 5 seconds");
+                Timeout.add(5 * 1000, () => {
+                    device.SetAntennaPower(true, on_antenna_power);
+                    return false;
+                });
+            } else {
+                sim.GetAuthStatus(on_auth_status);
+            }
+            return;
+        }
+        zavai.log.warning("on_antenna_power ok");
+        network.Register(on_network_register);
+    }
+
+    protected void on_network_register(Error e)
+    {
+        if (e != null)
+        {
+            zavai.log.warning("on_network_register: " + e.message);
+            return;
+        }
+        zavai.log.info("on_network_register: registered");
+    }
+
+    protected void on_auth_status(string status, Error e)
+    {
+        if (e != null)
+        {
+            zavai.log.warning("on_auth_status: " + e.message);
+            return;
+        }
+        zavai.log.info("on_auth_status: " + status);
+        if (status == "READY")
+            device.SetAntennaPower(true, on_antenna_power);
+        else if (status == "SIM PIN")
+            sim.SendAuthCode(zavai.config.sim_pin, on_auth_code);
+        else
+            zavai.log.debug("Unknown status: " + status);
+    }
+
+    protected void on_auth_code(Error e)
+    {
+        if (e != null)
+        {
+            zavai.log.warning("on_auth_code: " + e.message);
+            return;
+        }
+        zavai.log.info("PIN OK");
+    }
+}
+
 public class GSM: zavai.Service
 {
     protected dynamic DBus.Object dbus;
-    public dynamic DBus.Object network;
     public dynamic DBus.Object call;
-    public dynamic DBus.Object device;
-    public dynamic DBus.Object sim;
     protected Pid child_pid;
     protected int child_watch_id;
+    protected GSMActivator activator;
 
     public GSM()
     {
         Object(name: "gsm.gsm");
 
-        network = null;
+        activator = new GSMActivator();
+
         call = null;
-        device = null;
-        sim = null;
 
         child_pid = 0;
         child_watch_id = 0;
@@ -84,22 +176,10 @@ public class GSM: zavai.Service
         // Add a child watch source to know when it ends
         ChildWatch.add(child_pid, on_child);
 
-        network = zavai.registry.sbus.get_object(
-            "org.freesmartphone.ogsmd", 
-            "/org/freesmartphone/GSM/Device",
-            "org.freesmartphone.GSM.Network");
         call = zavai.registry.sbus.get_object(
             "org.freesmartphone.ogsmd", 
             "/org/freesmartphone/GSM/Device",
             "org.freesmartphone.GSM.Call");
-        device = zavai.registry.sbus.get_object(
-            "org.freesmartphone.ogsmd", 
-            "/org/freesmartphone/GSM/Device",
-            "org.freesmartphone.GSM.Device");
-        sim = zavai.registry.sbus.get_object(
-            "org.freesmartphone.ogsmd", 
-            "/org/freesmartphone/GSM/Device",
-            "org.freesmartphone.GSM.SIM");
 
         // try {
         //     device.Enable();
@@ -115,30 +195,7 @@ public class GSM: zavai.Service
     {
         zavai.log.debug("NOC " + name + " from " + oldOwner + " to " + newOwner);
         if (name == "org.freesmartphone.ogsmd" && newOwner != "")
-        {
-            // Frameworkd started
-            device.SetAntennaPower(true, on_antenna_power);
-            //                             reply_handler = self.cbAntennaPowerReply,
-            //                             error_handler = self.cbAntennaPowerError)
-        }
-    }
-
-    protected void on_antenna_power(Error e)
-    {
-        if (e != null)
-        {
-            zavai.log.warning("on_antenna_power: " + e.message);
-            // if str(e).find("current status is 'enabling'") >= 0 or str(e).find("current status is 'unknown'") >= 0:
-            //     time.sleep(10)
-            //     self.cbStartAntenna(0)
-            // else:
-            //     self.gsm_sim_iface.GetAuthStatus(reply_handler = self.cbAuthStatusReply,
-            //             error_handler = lambda e: (dbg("cbAuthStatusError %s" % e), self.loop.quit()))
-            return;
-        }
-        zavai.log.warning("on_antenna_power ok");
-        // network.Register(reply_handler = self.cbRegisterReply,
-        //                  error_handler = lambda e: (dbg("cbRegisterError %s" % e), self.loop.quit()))
+            activator.begin();
     }
 
     // Release usage of GPS
@@ -172,10 +229,7 @@ stderr.printf("STATUS %d\n", status);
             return;
         }
 
-        network = null;
         call = null;
-        device = null;
-        sim = null;
 
         base.stop();
     }