begin work on call detaillers (load name from ldap, load location from opengeodb)
authorChristian Weiske <cweiske@cweiske.de>
Sat, 4 Aug 2012 21:26:16 +0000 (23:26 +0200)
committerChristian Weiske <cweiske@cweiske.de>
Sat, 4 Aug 2012 21:26:16 +0000 (23:26 +0200)
src/callnotifier/CLI.php
src/callnotifier/CallMonitor.php
src/callnotifier/CallMonitor/Detailler.php [new file with mode: 0644]
src/callnotifier/CallMonitor/Detailler/LDAP.php [new file with mode: 0644]
src/callnotifier/CallMonitor/Detailler/OpenGeoDb.php [new file with mode: 0644]

index 2a6d3ca..8958f78 100644 (file)
@@ -36,6 +36,8 @@ class CLI
         );
 
         $callMonitor = new CallMonitor($this->config, $log);
+        $callMonitor->addDetailler(new CallMonitor_Detailler_LDAP());
+        $callMonitor->addDetailler(new CallMonitor_Detailler_OpenGeoDb());
 
         $handler = new MessageHandler($this->config, $log, $callMonitor);
 
index 428136f..7c6168c 100644 (file)
@@ -13,12 +13,24 @@ class CallMonitor
 {
     protected $currentCalls = array();
 
+    /**
+     * Array of objects that are able to load details for a call
+     *
+     * @var array
+     */
+    protected $detaillers = array();
+
     public function __construct($config, $log)
     {
         $this->config = $config;
         $this->log = $log;
     }
 
+    public function addDetailler(CallMonitor_Detailler $detailler)
+    {
+        $this->detaillers[] = $detailler;
+    }
+
     public function handle(EDSS1_Message $msg)
     {
         $callId = $msg->callRef;
@@ -82,6 +94,7 @@ class CallMonitor
                     unset($this->currentCalls[$otherCallId]);
                 }
             }
+            $this->loadCallDetails($call);
             $this->log->log('startingCall', array('call' => $call));
             break;
 
@@ -131,6 +144,19 @@ class CallMonitor
         }
         return $number;
     }
+
+    /**
+     * Load details for a call, e.g. the name of the calling person
+     * or the area
+     *
+     * @return void
+     */
+    protected function loadCallDetails($call)
+    {
+        foreach ($this->detaillers as $detailler) {
+            $detailler->loadCallDetails($call);
+        }
+    }
 }
 
 ?>
diff --git a/src/callnotifier/CallMonitor/Detailler.php b/src/callnotifier/CallMonitor/Detailler.php
new file mode 100644 (file)
index 0000000..188e765
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+namespace callnotifier;
+
+interface CallMonitor_Detailler
+{
+    /**
+     * Loads additional data into the call, e.g. name of the caller
+     *
+     * @param CallMonitor_Call $call Call to update
+     *
+     * @return void
+     */
+    public function loadCallDetails(CallMonitor_Call $call);
+}
+
+?>
diff --git a/src/callnotifier/CallMonitor/Detailler/LDAP.php b/src/callnotifier/CallMonitor/Detailler/LDAP.php
new file mode 100644 (file)
index 0000000..833fd46
--- /dev/null
@@ -0,0 +1,26 @@
+<?php
+namespace callnotifier;
+
+class CallMonitor_Detailler_LDAP implements CallMonitor_Detailler
+{
+    public function __construct()
+    {
+    }
+
+    public function loadCallDetails(CallMonitor_Call $call)
+    {
+        if ($call->type == CallMonitor_Call::INCOMING) {
+            $call->fromName = $this->loadName($call->from);
+        } else {
+            $call->toName = $this->loadName($call->to);
+        }
+    }
+
+    protected function loadName($number)
+    {
+        return 'foo';
+    }
+
+}
+
+?>
diff --git a/src/callnotifier/CallMonitor/Detailler/OpenGeoDb.php b/src/callnotifier/CallMonitor/Detailler/OpenGeoDb.php
new file mode 100644 (file)
index 0000000..1260438
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+namespace callnotifier;
+
+class CallMonitor_Detailler_OpenGeoDb implements CallMonitor_Detailler
+{
+    protected $db;
+
+    public function __construct()
+    {
+        $this->db = new \PDO(
+            'mysql:host=dojo;dbname=opengeodb',
+            'opengeodb-read',
+            'opengeodb',
+            array(
+                \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
+                \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC
+            )
+        );
+    }
+
+    public function loadCallDetails(CallMonitor_Call $call)
+    {
+        if ($call->type == CallMonitor_Call::INCOMING) {
+            $call->fromLocation = $this->loadLocation($call->from);
+        } else {
+            $call->toLocation = $this->loadLocation($call->to);
+        }
+    }
+
+    protected function loadLocation($number)
+    {
+        //area codes in germany can be 3 to 6 numbers
+        //FIXME: what about international numbers?
+        for ($n = 3; $n <= 6; $n++) {
+            $areacode = substr($number, 0, $n);
+            $name = $this->getNameForAreaCode($areacode);
+            if ($name !== null) {
+                return $name;
+            }
+        }
+
+        return null;
+    }
+
+    protected function getNameForAreaCode($areacode)
+    {
+        $stm = $this->db->query(
+            'SELECT loc_id FROM geodb_textdata'
+            . ' WHERE text_type = "500400000"'//area code
+            . ' AND text_val = ' . $this->db->quote($areacode)
+        );
+        $res = $stm->fetch();
+        if ($res === false) {
+            //area code does not exist
+            return null;
+        }
+
+        $locId = $res['loc_id'];
+        $stm = $this->db->query(
+            'SELECT text_val FROM geodb_textdata'
+            . ' WHERE text_type = "500100000"'//name
+            . ' AND loc_id = ' . $this->db->quote($locId)
+        );
+        $res = $stm->fetch();
+        if ($res === false) {
+            return null;
+        }
+
+        return $res['text_val'];
+    }
+
+}
+
+?>