echo logger
[auerswald-callnotifier.git] / src / callnotifier / MessageHandler.php
1 <?php
2 namespace callnotifier;
3
4 class MessageHandler
5 {
6     protected $dumpHdl;
7
8     /**
9      * Array of logger object arrays.
10      * Key is the notification type, value is an array of logger objects
11      * that want to get notified about the type.
12      *
13      * @var array
14      */
15     protected $logger = array(
16         'msgData' => array(),
17         'incomingCall' => array()
18     );
19
20
21     public function __construct($config)
22     {
23         $this->config = $config;
24         $this->prepareDump();
25     }
26
27     /**
28      * Add a logger
29      *
30      * @param Logger       $logger Logger object to register
31      * @param array|string $types  Single notification type or array of such
32      *                             types. "*" means "register for all types".
33      *
34      * @return self
35      */
36     public function addLogger(Logger $logger, $types)
37     {
38         if ($types == '*') {
39             $types = array_keys($this->logger);
40         }
41         $types = (array)$types;
42
43         foreach ($types as $type) {
44             if (!isset($this->logger[$type])) {
45                 throw new \Exception('Unknown log type: ' . $type);
46             }
47             $this->logger[$type][] = $logger;
48         }
49     }
50
51     public function handle($msg)
52     {
53         if ($this->config->dumpFile !== null) {
54             $this->dump($msg);
55         }
56         if (substr($msg, 0, 9) != '[DKANPROT') {
57             //unknown message type
58             return;
59         }
60         $regex = '#^\\[DKANPROT-([^ ]+) ([0-9]+)\\] (.*)$#';
61         if (!preg_match($regex, $msg, $matches)) {
62             //message should always be that way
63             return false;
64         }
65         list(, $type, $someid, $details) = $matches;
66         $this->log(
67             'msgData',
68             array(
69                 'type' => $type,
70                 'id' => $someid,
71                 'details' => $details
72             )
73         );
74
75         if ($type != 'Info') {
76             //we only want info messages
77             return;
78         }
79         //Vegw/Ets-Cref:[0xffef]/[0x64] - VEGW_SETUP from upper layer to internal destination: CGPN[**22]->CDPN[41], 
80         $regex = '#CGPN\\[([^\\]]+)\\]->CDPN\\[([^\\]]+)\\]#';
81         if (preg_match($regex, $details, $matches)) {
82             list(, $from, $to) = $matches;
83             $this->log('incomingCall', array('from' => $from, 'to' => $to));
84         }
85     }
86
87     protected function log($type, $arData)
88     {
89         if (!isset($this->logger[$type])) {
90             throw new \Exception('Unknown log type: ' . $type);
91         }
92         
93         if (count($this->logger[$type])) {
94             foreach ($this->logger[$type] as $logger) {
95                 $logger->log($type, $arData);
96             }
97         }
98     }
99
100     protected function prepareDump()
101     {
102         if ($this->config->dumpFile === null) {
103             return;
104         }
105         $this->dumpHdl = fopen($this->config->dumpFile, 'w');
106         if (!$this->dumpHdl) {
107             throw new Exception('Cannot open replay file for reading');
108         }
109     }
110
111     protected function dump($msg)
112     {
113         fwrite($this->dumpHdl, $msg . "\n");
114     }
115 }
116
117 ?>