From 29ff32499e239e6189b80ef3b9e76384920205a7 Mon Sep 17 00:00:00 2001 From: Christian Weiske Date: Sat, 4 Aug 2012 23:26:16 +0200 Subject: [PATCH] begin work on call detaillers (load name from ldap, load location from opengeodb) --- src/callnotifier/CLI.php | 2 + src/callnotifier/CallMonitor.php | 26 +++++++ src/callnotifier/CallMonitor/Detailler.php | 16 ++++ .../CallMonitor/Detailler/LDAP.php | 26 +++++++ .../CallMonitor/Detailler/OpenGeoDb.php | 74 +++++++++++++++++++ 5 files changed, 144 insertions(+) create mode 100644 src/callnotifier/CallMonitor/Detailler.php create mode 100644 src/callnotifier/CallMonitor/Detailler/LDAP.php create mode 100644 src/callnotifier/CallMonitor/Detailler/OpenGeoDb.php diff --git a/src/callnotifier/CLI.php b/src/callnotifier/CLI.php index 2a6d3ca..8958f78 100644 --- a/src/callnotifier/CLI.php +++ b/src/callnotifier/CLI.php @@ -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); diff --git a/src/callnotifier/CallMonitor.php b/src/callnotifier/CallMonitor.php index 428136f..7c6168c 100644 --- a/src/callnotifier/CallMonitor.php +++ b/src/callnotifier/CallMonitor.php @@ -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 index 0000000..188e765 --- /dev/null +++ b/src/callnotifier/CallMonitor/Detailler.php @@ -0,0 +1,16 @@ + diff --git a/src/callnotifier/CallMonitor/Detailler/LDAP.php b/src/callnotifier/CallMonitor/Detailler/LDAP.php new file mode 100644 index 0000000..833fd46 --- /dev/null +++ b/src/callnotifier/CallMonitor/Detailler/LDAP.php @@ -0,0 +1,26 @@ +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 index 0000000..1260438 --- /dev/null +++ b/src/callnotifier/CallMonitor/Detailler/OpenGeoDb.php @@ -0,0 +1,74 @@ +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']; + } + +} + +?> -- 2.30.2