* @license AGPL v3
* @link http://cweiske.de/linksys-wrt3g-tools.htm
*/
class Wrt3g_HtmlParser
{
protected static $arTranslations = array(
'GPRS_MSG.WWBEAR' => 'type',
'GPRS_MSG.NNAME' => 'network',
'GPRS_MSG.STRENGTH' => 'signal strength',
'GPRS_MSG.ACQUIRING' => 'aquiring',
'GPRS_MSG.WWBEAR_GPRS' => 'GPRS',
'GPRS_MSG.WWBEAR_UMTS' => 'UMTS',
'GPRS_MSG.None' => null,
'GPRS_MSG.FAIR' => 'fair',
'GPRS_MSG.GOOD' => 'good',
'GPRS_MSG.EXCELLENT' => 'excellent',
'GPRS_MSG.NOSIGNAL' => 'no signal',
'GPRS_MSG.CTIME' => 'connection time',
'GPRS_MSG.CFW' => 'card firmware',
'GPRS_MSG.CMOD' => 'card model',
'GPRS_MSG.CREV' => 'card revision',
'GPRS_MSG.IMSI' => 'IMSI',
'GPRS_MSG.SESSIONUSAGE' => 'session usage',
);
/**
* Parses the body of /index_wstatus1.asp and returns extracted values.
* If no connection is established, the values are NULL.
*
* @param string $body HTML document to parse
*
* @return array Array of key-value pairs, probably with
* - "type" - i.e. "GPRS"
* - "network" - Carrier network name, i.e. "BASE DE"
* - "signal strength" - good, excellent, poor
*/
public function index_wstatus1($body)
{
$doc = new DomDocument();
$doc->loadHtml($body);
$xpath = new DOMXPath($doc);
$entries = $xpath->query('//table/tr/td');
$arMatches = array();
foreach ($entries as $entry) {
$s = $doc->saveXML($entry);
$s = str_replace(
array(''),
'', $s
);
$s = strip_tags($s);
//some strange utf8 space char
$s = str_replace("\xC2\xA0", ' ', $s);
$s = trim($s);
$s = str_replace(
array('Capture(', ') :'),
'', $s
);
if (substr($s, -1) == ')') {
$s = substr($s, 0, -1);
}
$arMatches[] = $s;
}
$arRetval = array();
$arData = array();
reset($arMatches);
while (current($arMatches)) {
$key = current($arMatches);
$value = next($arMatches);
if (isset(self::$arTranslations[$key])) {
$key = self::$arTranslations[$key];
}
if (isset(self::$arTranslations[$value])) {
$value = self::$arTranslations[$value];
}
if ($value == 'aquiring') {
$value = null;
}
$arRetval[$key] = $value;
next($arMatches);
}
return $arRetval;
}
/**
* Parses the body of /index_wstatus2.asp and returns extracted values.
*
* @param string $body HTML document to parse
*
* @return array Array with "connection" as key and one of "connecting",
* "connected" or "disconnected" as value.
*/
public function index_wstatus2($body)
{
preg_match('/var status2 = "(.+)"/', $body, $arMatches);
if (!isset($arMatches[1])) {
return array();
}
$strStatus = $arMatches[1];
//Connecting
//Disconnected
//Connected
return array('connection' => strtolower($strStatus));
}
/**
* Parses the HTML body of /Status_NoAuth.asp and returns the extracted
* values.
*
* @param string $body HTML document to parse
*
* @return array Array of key-value pairs with the following keys:
* - type
* - network
* - signal strength
* - connection time
* - session usage (array)
* - card model
* - card revision
* - card firmware
* - IMSI
*/
public function status_noauth($body)
{
$body = str_replace(
array(' ', '', ''),
'', $body
);
$doc = new DomDocument();
libxml_use_internal_errors(true);//html is broken
$doc->loadHtml($body);
$xpath = new DOMXPath($doc);
$trs = $xpath->query('//table//table/tbody/tr');
$arRaw = array('connection' => null);
$bAquiring = false;
foreach ($trs as $tr) {
$titleItems = $xpath->query('td[@width=125]/text()', $tr);
$valueItems = $xpath->query('td[@width=296]/*[1]', $tr);
if ($titleItems->length && $valueItems->length) {
$title = substr($doc->saveXML($titleItems->item(0)), 8, -2);
$value = $doc->saveXML($valueItems->item(0));
$arRaw[self::$arTranslations[$title]] = $value;
}
}
foreach ($arRaw as $key => &$value) {
$value = trim(strip_tags($value));
if (substr($value, 0, 8) == 'Capture(') {
$value = self::$arTranslations[substr($value, 8, -1)];
if ($value == 'aquiring') {
$bAquiring = true;
$value = null;
}
}
}
unset($value);
if ($bAquiring) {
$arRaw['connection'] = 'connecting';
} else if ($arRaw['type'] != null) {
$arRaw['connection'] = 'connected';
} else {
$arRaw['connection'] = 'disconnected';
}
if (isset($arRaw['connection time'])) {
$arRaw['connection time'] = str_replace(
array(
' Capture(GPRS_MSG.HOURS)',
' Capture(GPRS_MSG.MINUTE)',
' Capture(GPRS_MSG.SECOND)',
),
array(
'h', 'm', 's'
),
$arRaw['connection time']
);
}
if (isset($arRaw['session usage'])) {
$arS = explode(
'TX = ',
str_replace('RX = ', '', $arRaw['session usage'])
);
if (count($arS) > 1) {
$arRaw['session usage'] = array(
'received' => $arS[0],
'sent' => $arS[1]
);
}
}
if (preg_match('/Capture\\(share.firmwarever\\):(.+?)', $body, $arMatches)) {
$arRaw['router firmware'] = trim($arMatches[1]);
}
return $arRaw;
}
}