Location: PHPKode > scripts > server.met Parser Class > server-met-parser-class/server_met_reader.php
<?php
/*
*
*    Copyright (C) 2008  Volkan KIRIK
*
*/

/*
*    This program is free software: you can redistribute it and/or modify
*    it under the terms of the GNU General Public License as published by
*    the Free Software Foundation, either version 3 of the License, or
*    (at your option) any later version.
*
*    This program is distributed in the hope that it will be useful,
*    but WITHOUT ANY WARRANTY; without even the implied warranty of
*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*    GNU General Public License for more details.
*
*    You should have received a copy of the GNU General Public License
*    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*
*/
class server_met_parser {
	var $fp;
	var $ed2k_servers;
	var $errlog = array();
	var $slimit = 500;

	function ireadch ($fp, $number, $cast=true) {
		$c = '';
	    do $c.= fgetc($fp); while (--$number);
		if (!$cast) {
			return $c;
		}
	    return (int)$c;
	}

	function lreadch ($fp, $number, $cast=true) {
		$c = '';
	    do $c.= ord(fgetc($fp)); while (--$number);
		if (!$cast) {
			return $c;
		}
	    return (int)$c;
	}

	function readlong ($fp) {
		if (!$fp) {
			return NULL;
		}
	    $c = ord(fgetc($fp));
	    $c |= (ord(fgetc($fp)) << 8);
	    $c |= (ord(fgetc($fp)) << 16);
	    $c |= (ord(fgetc($fp)) << 24);
	    return (int)$c;
	}

	function strtoascii($string, $reverse=false) {
	$strlength = strlen($string);
		$retString = '';
		for($i = 0; $i < $strlength; $i++){
			if (!$reverse) {
				$retString .= ord($string[$i]);
			} else {
				$ch_3 = substr($string,$i,3);
				$ch_2 = substr($string,$i,2);

				// ascii values of d-z characters are between 100-122
				if ( ($ch_3 <= 122) && ($ch_3 >= 100) ) {
					$retString .= chr($ch_3);
					$i++;
				}
				// ascii values of 0-9 characters are between 48-57
				// ascii values of A-Z characters are between 65-90
				else {
					$retString .= chr($ch_2);
				}
				$i++;
			}
		}

		return $retString;   
	}

	function isDecimalNumber($n) {
	  return (string)(float)$n === (string)$n;
	}

	function setlimit($n) {
		if ( empty($n) || !is_numeric($n) || ($n <= 0) ) {
			return false;
		}
		$this->slimit = $n;
	}

	function openfile($filename) {
		$this->fp = fopen($filename, 'r');
		if ( !$this->fp ) {
			return false;
		}
		return true;
	}

	function closefile() {
		@fclose($this->fp);
	}

	function parsefile($filename) {
		if ( !$this->openfile($filename) ) {
			$this->errlog[] = 'File Open Failed';
			return false;
		}

		$validate = $this->lreadch($this->fp,1);
		if ( ($validate!=hexdec('0x0E')) && ($validate!=hexdec('0xE0')) ) {
			$this->errlog[] = 'File Validate Failed';
			return false;
		}

		$serversf = 0;
		$serversf = $this->readlong($this->fp);
		$serversc = 0;

		$this->ed2k_servers = array();
		while( ($serversc < $serversf) && $this->fp && ($serversc < $this->slimit) ) {
			for ($icount=0;$icount<4;$icount++){
				$ip[$icount]=ord(fgetc($this->fp));
			}
			$port = ord(fgetc($this->fp));
			$port |= (ord(fgetc($this->fp)) << 8);
			$meta = $this->readlong($this->fp);   

			$ip_addr = sprintf('%u.%u.%u.%u', $ip[0],$ip[1],$ip[2],$ip[3]);
			$port = sprintf('%ld', $port);
//			print $ip_addr . ':' . $port . "\n\n"; // for testing

			// Create new element in array with IP Addr & Port
			$this->ed2k_servers[] = array('addr' => $ip_addr, 'port' => $port);
			// Get Server ID
			$server_id = count($this->ed2k_servers) - 1;

			// Create new element for Block of Tags
			$this->ed2k_servers[$server_id]['tags'] = array();

			for ($lcount=0;$lcount<$meta;$lcount++) {
				$t_type = intval(ord(fgetc($this->fp)));		// Tag type
				$t_length = ord(fgetc($this->fp));			// Name Length
				$t_length |= (ord(fgetc($this->fp)) << 8);
				if ($t_length==='EOF') {
					exit(0);
				}
				if ($t_length) {		// Tag Name
					$t_name_code = $this->lreadch($this->fp,$t_length,false);
					if ( $this->isDecimalNumber($t_name_code) ) {
						$tag_id = dechex($t_name_code);
					} else {
						$tag_id = $this->strtoascii($t_name_code, true);
					}
					$t_name = '?';
					switch ($t_name_code) {
						case $this->strtoascii('files'):
							$t_name = 'Files';
							$t_name_type = 'ascii';
						break;

						case $this->strtoascii('users'):
							$t_name = 'Users';
							$t_name_type = 'ascii';
						break;

						case $this->strtoascii('lowusers'):
							$t_name = 'Low_Users';
							$t_name_type = 'ascii';
						break;

						case $this->strtoascii('maxusers'):
							$t_name = 'Max_Users';
							$t_name_type = 'ascii';
						break;

						case hexdec('0x87'):
							$t_name = 'Max_Users';
							$t_name_type = 'unicode';
						break;

						case hexdec('0x01'):
							$t_name = 'Server_Name';
							$t_name_type = 'unicode';
						break;

						case hexdec('0x0B'):
							$t_name = 'Description';
							$t_name_type = 'unicode';
						break;

						case hexdec('0x0C'):
							$t_name = 'Ping';
							$t_name_type = 'unicode';
						break;

						case hexdec('0x0D'):
							$t_name = 'Fail';
							$t_name_type = 'unicode';
						break;

						case hexdec('0x0E'):
							$t_name = 'Preference';
							$t_name_type = 'unicode';
						break;

						case hexdec('0x85'):
							$t_name = 'DNS';
							$t_name_type = 'unicode';
						break;

						case hexdec('0x88'):
							$t_name = 'Soft_Files';
							$t_name_type = 'unicode';
						break;

						case hexdec('0x89'):
							$t_name = 'Hard_Files';
							$t_name_type = 'unicode';
						break;

						case hexdec('0x90'):
							$t_name = 'Last_Ping';
							$t_name_type = 'unicode';
						break;

						case hexdec('0x91'):
							$t_name = 'Version';
							$t_name_type = 'unicode';
						break;

						case hexdec('0x92'):
							$t_name = 'UDP_Flags';
							$t_name_type = 'unicode';
						break;

						case hexdec('0x93'):
							$t_name = 'Auxiliary_Ports';
							$t_name_type = 'unicode';
						break;

						case hexdec('0x94'):
							$t_name = 'LowID_Clients';
							$t_name_type = 'unicode';
						break;

						default:
							$t_name = '-';
							$t_name_type = 'unknown';
						break;
					}

//					echo 'Tag Name: ' . $t_name . "\n";
				}

				if ($t_type==2) {        // String Tag
					$t_length = ord(fgetc($this->fp)); // Value Length
					$t_length |= (ord(fgetc($this->fp)) << 8);
					if ($t_length==='EOF') {
						break;
					}
					if ($t_length) {
						$t_value = $this->ireadch($this->fp,$t_length,false);
//						echo 'Tag Value (string): ' . $t_value . "\n";
					} // else jump over
				} else if ($t_type==3) { // Number Tag
					$t_value = $this->readlong($this->fp);
					$t_value = intval($t_value);
//					echo 'Tag Value (integer): ' . $t_value . "\n";
				}

//				echo "\n";
				if ( isset($this->ed2k_servers[$server_id]['tags'][$t_name.'_'.$t_name_type]) ) {
					$this->ed2k_servers[$server_id]['tags'][$t_name.'_'.$t_name_type.'_2'] = array('id' => $tag_id, 'value' => $t_value);
				} else {
					$this->ed2k_servers[$server_id]['tags'][$t_name.'_'.$t_name_type] = array('id' => $tag_id, 'value' => $t_value);
				}
			}//rof

			$serversc++;
		}
		return $this->ed2k_servers;
	}
}
?>
Return current item: server.met Parser Class