call echo logger
[auerswald-callnotifier.git] / src / callnotifier / CallMonitor.php
index a910e9f13008d55a2398821d89c349e3a74871d5..9abdba80c959cf61b8ab65c38f699ded6aa5389b 100644 (file)
@@ -4,9 +4,15 @@ namespace callnotifier;
 /**
  * Watches EDSS1 messages for calls. Keeps an internal call state
  * and notifies loggers of incoming and finished calls.
+ *
+ * Notifications:
+ * - incomingCall
+ * - finishedCall
  */
 class CallMonitor
 {
+    protected $currentCalls = array();
+
     public function __construct($config, $log)
     {
         $this->config = $config;
@@ -15,8 +21,58 @@ class CallMonitor
 
     public function handle(EDSS1_Message $msg)
     {
+        $callId = $msg->callRef;
+        if (!array_key_exists($callId, $this->currentCalls)) {
+            $this->handleNew($callId, $msg);
+        } else {
+            $this->handleExisting($callId, $msg);
+        }
+    }
+
+    protected function handleNew($callId, EDSS1_Message $msg)
+    {
+        if ($msg->type != EDSS1_Message::SETUP) {
+            return;
+        }
+        $this->currentCalls[$callId] = new CallMonitor_Call();
+        $this->handleSetup($callId, $msg);
     }
 
+
+    protected function handleSetup($callId, EDSS1_Message $msg)
+    {
+        $call = $this->currentCalls[$callId];
+        $call->start = time();
+        foreach ($msg->parameters as $param) {
+            switch ($param->type) {
+            case EDSS1_Parameter::CALLING_PARTY_NUMBER:
+                $call->from = $param->number;
+                break;
+            case EDSS1_Parameter::CALLED_PARTY_NUMBER:
+                $call->to = $param->number;
+                break;
+            }
+        }
+    }
+
+
+    protected function handleExisting($callId, EDSS1_Message $msg)
+    {
+        $call = $this->currentCalls[$callId];
+
+        switch ($msg->type) {
+        case EDSS1_Message::CALL_PROCEEDING:
+            $this->log->log('incomingCall', array('call' => $call));
+            break;
+
+        case EDSS1_Message::RELEASE:
+        case EDSS1_Message::RELEASE_COMPLETE:
+            $call->end = time();
+            $this->log->log('finishedCall', array('call' => $call));
+            unset($this->currentCalls[$callId]);
+            break;
+        }
+    }
 }
 
 ?>