/** * add GGSN specific parsing methods. */ protected function addParsingMethods() { $newParsingMethods = array('diagnostics' => function ($data) { $ret = false; $diags = $this->ggsnConfig['fields_translate']['diagnostics']; if (!is_array($data)) { $diag = intval(implode('.', unpack('C', $data))); $ret = isset($diags[$diag]) ? $diags[$diag] : false; } else { foreach ($diags as $key => $diagnostics) { if (is_array($diagnostics) && isset($data[$key])) { $diag = intval(implode('.', unpack('C', $data[$key]))); Billrun_Factory::log()->log($diag . " : " . $diagnostics[$diag], Zend_Log::DEBUG); $ret = $diagnostics[$diag]; } } } return $ret; }, 'timezone' => function ($data) { $smode = unpack('c*', $data); //$timeSaving=intval( $smode[2] & 0x3 ); //time zone offset is repesented by multiples of 15 minutes. $quarterOffset = Billrun_Util::bcd_decode($smode[1] & 0xf7); if (abs($quarterOffset) <= 52) { //data sanity check less then 13hours offset $h = str_pad(abs(intval($quarterOffset / 4)), 2, "0", STR_PAD_LEFT); // calc the offset hours $m = str_pad(abs($quarterOffset % 4 * 15), 2, "0", STR_PAD_LEFT); // calc the offset minutes return (($smode[1] & 0x8) == 0 ? "+" : "-") . "{$h}:{$m}"; } //Billrun_Factory::log()->log($data. " : ". print_r($smode,1),Zend_Log::DEBUG ); return false; }, 'ch_ch_selection_mode' => function ($data) { $smode = intval(implode('.', unpack('C', $data))); return isset($this->ggsnConfig['fields_translate']['ch_ch_selection_mode'][$smode]) ? $this->ggsnConfig['fields_translate']['ch_ch_selection_mode'][$smode] : false; }, 'bcd_encode' => function ($fieldData) { $halfBytes = unpack('C*', $fieldData); $ret = ''; foreach ($halfBytes as $byte) { $ret .= Billrun_Util::bcd_decode($byte); } return $ret; }, 'default' => function ($type, $data) { return is_array($data) ? '' : implode('', unpack($type, $data)); }); $this->parsingMethods = array_merge($this->parsingMethods, $newParsingMethods); }