[pkg-fso-commits] [SCM] FSO frameworkd Debian packaging branch, master, updated. milestone4-368-g700ab82

Michael 'Mickey' Lauer mickey at vanille-media.de
Mon Feb 2 18:51:35 UTC 2009


The following commit has been merged in the master branch:
commit 8909b59fda7d868d23036e689a61f259f1c6884f
Author: Michael 'Mickey' Lauer <mickey at vanille-media.de>
Date:   Fri Dec 12 17:02:36 2008 +0100

    ogsmd: Implemented org.freesmartphone.GSM.Phone.[Start|Stop]AutoRegister()
    and its signal org.freesmartphone.GSM.Phone.ServiceStatus()
    This is a convenient way to ensure that ogsmd always tries to unlock the SIM
    and register with a provider, if necessary.
    (Corresponding functionality for Gprs is under discussion).

diff --git a/ChangeLog b/ChangeLog
index cdeee2e..b14537b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,17 @@
+2008-12-12	Michael Lauer	<mickey at openmoko.org>
+
+	* [ogsmd] Implemented org.freesmartphone.GSM.Phone.[Start|Stop]AutoRegister()
+	  and its signal org.freesmartphone.GSM.Phone.ServiceStatus()
+	  This is a convenient way to ensure that ogsmd always tries to unlock the SIM
+	  and register with a provider, if necessary.
+	  (Corresponding functionality for Gprs is under discussion).
+
 2008-12-11	Michael Lauer	<mickey at openmoko.org>
 
 	* [ogsmd] Implemented org.freesmartphone.GSM.PDP.NetworkStatus()
 	* [ogsmd] Implemented org.freesmartphone.GSM.PDP.GetNetworkStatus()
 	* [ogsmd] Implemented org.freesmartphone.GSM.Network.TimeZoneReport()
-	* [ogsmd] Refactor PDP handling
+	* [ogsmd] Refactored PDP handling for more stability
 
 2008-12-06	Michael Lauer	<mickey at openmoko.org>
 
diff --git a/framework/subsystems/ogsmd/server.py b/framework/subsystems/ogsmd/server.py
index f55f9be..adb647d 100644
--- a/framework/subsystems/ogsmd/server.py
+++ b/framework/subsystems/ogsmd/server.py
@@ -11,16 +11,15 @@ Module: server
 """
 
 MODULE_NAME = "ogsmd.server"
-__version__ = "0.1.0"
+__version__ = "0.2.0"
 
 from framework import resource
+from framework.patterns import tasklet
 
 import dbus
 import dbus.service
 from dbus import DBusException
 
-from gobject import timeout_add, idle_add
-import weakref
 import math
 import sys, os
 import types
@@ -32,10 +31,11 @@ from device import DBUS_INTERFACE_DEVICE, \
                    DBUS_OBJECT_PATH_DEVICE, \
                    DBUS_BUS_NAME_DEVICE, \
                    DBUS_INTERFACE_SIM, \
+                   DBUS_INTERFACE_NETWORK, \
                    DBUS_INTERFACE_CB
 
-DBUS_INTERFACE_NETWORK = "org.freesmartphone.Network"
 DBUS_INTERFACE_HZ = "org.freesmartphone.GSM.HZ"
+DBUS_INTERFACE_PHONE = "org.freesmartphone.GSM.Phone"
 DBUS_OBJECT_PATH_SERVER = "/org/freesmartphone/GSM/Server"
 
 HOMEZONE_DEBUG = False
@@ -60,12 +60,18 @@ class Server( dbus.service.Object ):
         self.homezones = None
         self.zone = "unknown"
         self.setupSignals()
+        self._autoRegister = False
+        self._service = "unknown"
+        self.pin = None
 
     def setupSignals( self ):
         device = self.bus.get_object( DBUS_BUS_NAME_DEVICE, DBUS_OBJECT_PATH_DEVICE )
         self.fso_cb = dbus.Interface( device, DBUS_INTERFACE_CB )
         self.fso_cb.connect_to_signal( "IncomingCellBroadcast", self.onIncomingCellBroadcast )
         self.fso_sim = dbus.Interface( device, DBUS_INTERFACE_SIM )
+        self.fso_network = dbus.Interface( device, DBUS_INTERFACE_NETWORK )
+        self.fso_network.connect_to_signal( "Status", self.onIncomingGsmNetworkStatus )
+        self.fso_device = dbus.Interface( device, DBUS_INTERFACE_DEVICE )
 
     def __del__( self ):
         server = None
@@ -108,6 +114,20 @@ class Server( dbus.service.Object ):
         maxdist = math.sqrt( zr ) * 10
         return dist < maxdist
 
+    def onIncomingGsmNetworkStatus( self, status ):
+        reg = status["registration"]
+        if reg in "home roaming".split():
+            self._updateServiceStatus( "online" )
+        else:
+            self._updateServiceStatus( "offline" )
+        if reg in "unregistered denied".split() and self._autoRegister:
+            self.Register( self.pin, lambda:None, lambda Foo:None )
+
+    def _updateServiceStatus( self, status ):
+        if self._service != status:
+            self._service = status
+            self.ServiceStatus( status )
+
     #
     # dbus org.freesmartphone.GSM.HZ
     #
@@ -136,31 +156,43 @@ class Server( dbus.service.Object ):
         self.fso_sim.GetHomeZones( reply_handler=gotHomezones, error_handler=lambda error:None )
 
     #
-    # dbus org.freesmartphone.Network
+    # dbus org.freesmartphone.GSM.Phone
     #
-    @dbus.service.method( DBUS_INTERFACE_HZ, "", "s",
+    @dbus.service.method( DBUS_INTERFACE_PHONE, "s", "",
                           async_callbacks=( "dbus_ok", "dbus_error" ) )
-    def GetHomeZoneStatus( self, dbus_ok, dbus_error ):
-        dbus_ok( self.zone )
+    def StartAutoRegister( self, pin, dbus_ok, dbus_error ):
+        self.pin = pin
+        self._autoRegister = True
+        dbus_ok()
 
-    @dbus.service.signal( DBUS_INTERFACE_HZ, "s" )
-    def HomeZoneStatus( self, zone ):
-        self.zone = zone
-        logger.info( "home zone status now %s" % zone )
+        self.fso_network.GetStatus( reply_handler=self.onIncomingGsmNetworkStatus, error_handler=lambda Foo:None )
 
-    @dbus.service.method( DBUS_INTERFACE_HZ, "", "as",
+    @dbus.service.method( DBUS_INTERFACE_PHONE, "", "",
                           async_callbacks=( "dbus_ok", "dbus_error" ) )
-    def GetKnownHomeZones( self, dbus_ok, dbus_error ):
+    def StopAutoRegister( self, dbus_ok, dbus_error ):
+        self._autoRegister = False
+        dbus_ok()
 
-        def gotHomezones( homezones, self=self, dbus_ok=dbus_ok ):
-            logger.info( "got SIM homezones: %s", homezones )
-            self.homezones = homezones
-            # debug code, if you have no homezones on your SIM. To test, use:
-            # gsm.DebugInjectString("UNSOL","+CBM: 16,221,0,1,1\r\n347747555093\r\r\r\n")
-            if HOMEZONE_DEBUG: self.homezones = [ ( "city", 347747, 555093, 1000 ), ( "home", 400000, 500000, 1000 ) ]
-            dbus_ok( [ zone[0] for zone in self.homezones ] )
-
-        self.fso_sim.GetHomeZones( reply_handler=gotHomezones, error_handler=lambda error:None )
+    @dbus.service.method( DBUS_INTERFACE_PHONE, "s", "",
+                          async_callbacks=( "dbus_ok", "dbus_error" ) )
+    def Register( self, pin, dbus_ok, dbus_error ):
+
+        @tasklet.tasklet
+        def worker( self, pin ):
+            try:
+                yield tasklet.WaitDBus( self.fso_device.SetAntennaPower, True )
+            except dbus.DBusException, e: # may be locked
+                if e.get_dbus_name() != "org.freesmartphone.GSM.SIM.AuthFailed":
+                    raise
+                else:
+                    yield tasklet.WaitDBus( self.fso_sim.SendAuthCode, pin )
+
+            yield tasklet.WaitDBus( self.fso_network.Register )
+        worker( self, pin ).start_dbus( dbus_ok, dbus_error )
+
+    @dbus.service.signal( DBUS_INTERFACE_PHONE, "s" )
+    def ServiceStatus( self, service ):
+       logger.info( "service status now %s" % service )
 
 #=========================================================================#
 def factory( prefix, controller ):

-- 
FSO frameworkd Debian packaging



More information about the pkg-fso-commits mailing list