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

Jan Luebbe jluebbe at debian.org
Mon Feb 2 18:51:41 UTC 2009


The following commit has been merged in the master branch:
commit c6c9001f33a332b92e31ce81a169fa2d9efa5a01
Author: Jan Luebbe <jluebbe at debian.org>
Date:   Fri Dec 19 00:18:51 2008 +0100

    otimed: use network database to install a time zone file

diff --git a/framework/subsystems/ogsmd/gsm/const.py b/framework/subsystems/ogsmd/gsm/const.py
index a940f23..c1273a8 100644
--- a/framework/subsystems/ogsmd/gsm/const.py
+++ b/framework/subsystems/ogsmd/gsm/const.py
@@ -1120,9 +1120,9 @@ def parseNetworks( filename ):
         line = line.decode( "UTF-8" ).rstrip()
         if not line: # empty line, flush and reset
             if network:
-                networks[( network["MCC"], network["MNC"] )] = network
-                del network["MCC"]
-                del network["MNC"]
+                networks[( network["mcc"], network["mnc"] )] = network
+                del network["mcc"]
+                del network["mnc"]
             common_header = []
             common = {}
             network_header = []
@@ -1132,7 +1132,7 @@ def parseNetworks( filename ):
             continue
         if line[0] == "#": # header
             data = line[1:].split("\t")
-            data = [x.strip() for x in data]
+            data = [x.strip().lower() for x in data]
             if data[0]:
                 common_header = data
             elif data[1]:
@@ -1146,13 +1146,13 @@ def parseNetworks( filename ):
                 common = dict( zip( common_header, data ) )
             elif data[1]: # new network, flush old
                 if network:
-                    networks[( network["MCC"], network["MNC"] )] = network
-                    del network["MCC"]
-                    del network["MNC"]
+                    networks[( network["mcc"], network["mnc"] )] = network
+                    del network["mcc"]
+                    del network["mnc"]
                 if not common: raise "Missing common info near line %i" % linenumber
                 if not network_header: raise "Missing network header near line %i" % linenumber
                 network = dict( zip( network_header, data[1:] ) )
-                if not (network["MCC"]+network["MNC"]).isdigit(): raise "Invaild MCC or MNC near line %i" % linenumber
+                if not (network["mcc"]+network["mnc"]).isdigit(): raise "Invaild MCC or MNC near line %i" % linenumber
                 network.update( common )
             elif data[2]:
                 if not common: raise "Missing common info near line %i" % linenumber
diff --git a/framework/subsystems/otimed/otimed.py b/framework/subsystems/otimed/otimed.py
index 847e721..665aab3 100644
--- a/framework/subsystems/otimed/otimed.py
+++ b/framework/subsystems/otimed/otimed.py
@@ -16,6 +16,7 @@ __version__ = "0.2.0"
 
 from datetime import datetime, timedelta
 from math import sqrt
+import shutil
 import socket
 import struct
 import time
@@ -36,6 +37,15 @@ def getOutput(cmd):
 def toSeconds( delta ):
     return delta.days*24*60*60+delta.seconds+delta.microseconds*0.000001
 
+def drop_dbus_result( *args ):
+    if args:
+        logger.warning( "unhandled dbus result: %s", args )
+
+def log_dbus_error( desc ):
+    def dbus_error( e, desc = desc ):
+        logger.error( "%s (%s %s: %s)" % ( desc, e.__class__.__name__, e.get_dbus_name(), e.get_dbus_message() ) )
+    return dbus_error
+
 #============================================================================#
 class TimeSource( object ):
 #============================================================================#
@@ -111,6 +121,62 @@ class NTPTimeSource( TimeSource ):
             logger.warning( "NTP: no timestamp received" )
 
 #============================================================================#
+class ZoneSource( object ):
+#============================================================================#
+    def __init__( self, bus ):
+        self.zone = None
+        self.mccmnc = None
+        self.isocode = None
+        self.bus = bus
+        self.bus.add_signal_receiver(
+            self._handleNetworkStatusChanged,
+            "Status",
+            "org.freesmartphone.GSM.Network",
+            None,
+            None
+        )
+        proxy = bus.get_object( "org.freesmartphone.ogsmd", "/org/freesmartphone/GSM/Server" )
+        self.gsmdata = dbus.Interface( proxy, "org.freesmartphone.GSM.Data" )
+
+    def _handleNetworkStatusChanged( self, status ):
+        if "code" in status:
+            code = str( status["code"] )
+            if self.mccmnc == code:
+                return
+            self.mccmnc = code
+            mcc = code[:3]
+            mnc = code[3:]
+            logger.debug( "GSM: MCC=%s MNC=%s", mcc, mnc )
+            self.gsmdata.GetNetworkInfo(
+                mcc, mnc,
+                reply_handler=self._handleNetworkInfoReply,
+                error_handler=log_dbus_error( "error while calling org.freesmartphone.GSM.Data.GetNetworkInfo" )
+            )
+        else:
+            self.zone = None
+            logger.debug( "GSM: no network code" )
+
+    def _handleNetworkInfoReply( self, info ):
+        if "iso" in info:
+            if self.isocode == info["iso"]:
+                return
+            self.isocode = info["iso"]
+            logger.debug( "GSM: ISO-Code %s", info["iso"] )
+            for line in open( "/usr/share/zoneinfo/zone.tab", "r" ):
+                data = line.rstrip().split( "\t" )
+                if self.isocode == data[0]:
+                    self.zone = data[2]
+                    break
+            logger.info( "GSM: Zone %s", self.zone )
+            try:
+                shutil.copyfile( "/usr/share/zoneinfo/"+self.zone, "/etc/localtime" )
+            except:
+                logger.warning( "failed to install time zone file to /etc/localtime" )
+        else:
+            self.zone = None
+            logger.debug( "GSM: no ISO-Code for this network" )
+
+#============================================================================#
 class Time( dbus.service.Object ):
 #============================================================================#
     def __init__( self, bus ):
@@ -119,9 +185,11 @@ class Time( dbus.service.Object ):
         self.interface = "org.freesmartphone.Time"
         self.bus = bus
 
-        self.sources = []
-        self.sources.append( GPSTimeSource( self.bus ) )
-        self.sources.append( NTPTimeSource( self.bus ) )
+        self.timesources = []
+        self.timesources.append( GPSTimeSource( self.bus ) )
+        self.timesources.append( NTPTimeSource( self.bus ) )
+
+        self.zonesource = ZoneSource( self.bus )
 
         self.interval = 90
         self.updateTimeout = gobject.timeout_add_seconds( self.interval, self._handleUpdateTimeout )
@@ -129,7 +197,7 @@ class Time( dbus.service.Object ):
     def _handleUpdateTimeout( self ):
         logger.debug( "checking time sources" )
         offsets = []
-        for source in self.sources:
+        for source in self.timesources:
             if not source.offset is None:
                 offsets.append( toSeconds( source.offset ) )
 
@@ -145,7 +213,7 @@ class Time( dbus.service.Object ):
         if sd < 15.0 < mean:
             logger.info( "adjusting clock by %f seconds" % mean )
             d = timedelta( seconds=mean )
-            for source in self.sources:
+            for source in self.timesources:
                 if not source.offset is None:
                     source.offset = source.offset - d
             t = datetime.utcnow() + d

-- 
FSO frameworkd Debian packaging



More information about the pkg-fso-commits mailing list