remove preg call parsing of info lines; we've got the real edss1 messages to utilize
[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         'edss1msg' => 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 == 'Debug') {
76             $this->parseEDSS1($details);
77         }
78     }
79
80     /**
81      * Example string: "T02: 00 A3 06 0A 08 01 01 5A FF 0A"
82      *
83      * @param string $details Detail string of a debug message
84      *
85      */
86     protected function parseEDSS1($details)
87     {
88         if ($details{0} != 'T' && $details{0} != 'N') {
89             //we only want byte data
90             return;
91         }
92         if (substr($details, 16, 4) != ' 08 ') {
93             //only E-DSS-1, no other packets
94             return;
95         }
96         
97         $bytestring = substr($details, 5);
98         $bytes = static::getBytesFromHexString($bytestring);
99
100         $mp = new EDSS1_Parser();
101         $msg = $mp->parse($bytes);
102
103         $this->log('edss1msg', array('msg' => $msg));
104     }
105
106     protected function log($type, $arData)
107     {
108         if (!isset($this->logger[$type])) {
109             throw new \Exception('Unknown log type: ' . $type);
110         }
111         
112         if (count($this->logger[$type])) {
113             foreach ($this->logger[$type] as $logger) {
114                 $logger->log($type, $arData);
115             }
116         }
117     }
118
119     public static function getBytesFromHexString($bytestring)
120     {
121         $bytes = '';
122         foreach (explode(' ', $bytestring) as $strbyte) {
123             $bytes .= chr(hexdec($strbyte));
124         }
125         return $bytes;
126     }
127
128     protected function prepareDump()
129     {
130         if ($this->config->dumpFile === null) {
131             return;
132         }
133         $this->dumpHdl = fopen($this->config->dumpFile, 'w');
134         if (!$this->dumpHdl) {
135             throw new Exception('Cannot open replay file for reading');
136         }
137     }
138
139     protected function dump($msg)
140     {
141         fwrite($this->dumpHdl, $msg . "\n");
142     }
143 }
144
145 ?>