DotLibrary
[ class tree: DotLibrary ] [ index: DotLibrary ] [ all elements ]

Source for file Api.php

Documentation is available at Api.php

  1. <?php
  2. /**
  3. * DotBoost Technologies Inc.
  4. * DotKernel Application Framework
  5. *
  6. @category   DotKernel
  7. @package    DotLibrary
  8. @copyright  Copyright (c) 2009 DotBoost  Technologies (http://www.dotboost.com)
  9. @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
  10. @version    $Id: Api.php 158 2010-06-25 08:59:20Z teo $
  11. */
  12.  
  13. /**
  14.  * Defined constants used for GeoIp database reading
  15.  */
  16. define("GEOIP_COUNTRY_BEGIN"16776960);
  17. define("GEOIP_STATE_BEGIN_REV0"16700000);
  18. define("GEOIP_STATE_BEGIN_REV1"16000000);
  19. define("GEOIP_STANDARD"0);
  20. define("GEOIP_MEMORY_CACHE"1);
  21. define("GEOIP_SHARED_MEMORY"2);
  22. define("STRUCTURE_INFO_MAX_SIZE"20);
  23. define("DATABASE_INFO_MAX_SIZE"100);
  24. define("GEOIP_COUNTRY_EDITION"106);
  25. define("GEOIP_PROXY_EDITION"8);
  26. define("GEOIP_ASNUM_EDITION"9);
  27. define("GEOIP_NETSPEED_EDITION"10);
  28. define("GEOIP_REGION_EDITION_REV0"112);
  29. define("GEOIP_REGION_EDITION_REV1"3);
  30. define("GEOIP_CITY_EDITION_REV0"111);
  31. define("GEOIP_CITY_EDITION_REV1"2);
  32. define("GEOIP_ORG_EDITION"110);
  33. define("GEOIP_ISP_EDITION"4);
  34. define("SEGMENT_RECORD_LENGTH"3);
  35. define("STANDARD_RECORD_LENGTH"3);
  36. define("ORG_RECORD_LENGTH"4);
  37. define("MAX_RECORD_LENGTH"4);
  38. define("MAX_ORG_RECORD_LENGTH"300);
  39. define("GEOIP_SHM_KEY"0x4f415401);
  40. define("US_OFFSET"1);
  41. define("CANADA_OFFSET"677);
  42. define("WORLD_OFFSET"1353);
  43. define("FIPS_RANGE"360);
  44. define("GEOIP_UNKNOWN_SPEED"0);
  45. define("GEOIP_DIALUP_SPEED"1);
  46. define("GEOIP_CABLEDSL_SPEED"2);
  47. define("GEOIP_CORPORATE_SPEED"3);
  48.  
  49. /**
  50. * Geo IP API - connect to Geoip.dat database to return the country based on IP address
  51. @category   DotKernel
  52. @package    DotLibrary
  53. @subpackage DotGeoip
  54. @author     DotKernel Team <team@dotkernel.com>
  55. */
  56. class Dot_Geoip_Api extends Dot_Geoip
  57. {
  58.     /**
  59.      * Flags country code
  60.      * @access private
  61.      * @var string 
  62.      */
  63.     private $flags;
  64.     /**
  65.      * File handle identifier
  66.      * @access private
  67.      * @var resource 
  68.      */
  69.     private $filehandle;
  70.     /**
  71.      * Memmory buffered - the read string
  72.      * @access private
  73.      * @var string 
  74.      */
  75.     private $memoryBuffer;
  76.     /**
  77.      * Database type
  78.      * @access private
  79.      * @var int 
  80.      */
  81.     private $databaseType;
  82.     /**
  83.      * Database segments
  84.      * @access private
  85.      * @var int 
  86.      */
  87.     private $databaseSegments;    
  88.     /**
  89.      * Record length
  90.      * @access private
  91.      * @var int 
  92.      */
  93.     private $recordLength;    
  94.     /**
  95.      * ID returned by shmop_open() function to access the shared memory segment
  96.      * @access private
  97.      * @var int 
  98.      */
  99.     private $shmid;    
  100.     /**
  101.      * Array with country code to number corespondence
  102.      * @access private
  103.      * @var array 
  104.      */
  105.     private $GEOIP_COUNTRY_CODE_TO_NUMBER = array(
  106.         "" => 0"AP" => 1"EU" => 2"AD" => 3"AE" => 4"AF" => 5
  107.         "AG" => 6"AI" => 7"AL" => 8"AM" => 9"AN" => 10"AO" => 11
  108.         "AQ" => 12"AR" => 13"AS" => 14"AT" => 15"AU" => 16"AW" => 17
  109.         "AZ" => 18"BA" => 19"BB" => 20"BD" => 21"BE" => 22"BF" => 23
  110.         "BG" => 24"BH" => 25"BI" => 26"BJ" => 27"BM" => 28"BN" => 29
  111.         "BO" => 30"BR" => 31"BS" => 32"BT" => 33"BV" => 34"BW" => 35
  112.         "BY" => 36"BZ" => 37"CA" => 38"CC" => 39"CD" => 40"CF" => 41
  113.         "CG" => 42"CH" => 43"CI" => 44"CK" => 45"CL" => 46"CM" => 47
  114.         "CN" => 48"CO" => 49"CR" => 50"CU" => 51"CV" => 52"CX" => 53
  115.         "CY" => 54"CZ" => 55"DE" => 56"DJ" => 57"DK" => 58"DM" => 59
  116.         "DO" => 60"DZ" => 61"EC" => 62"EE" => 63"EG" => 64"EH" => 65
  117.         "ER" => 66"ES" => 67"ET" => 68"FI" => 69"FJ" => 70"FK" => 71
  118.         "FM" => 72"FO" => 73"FR" => 74"FX" => 75"GA" => 76"GB" => 77,
  119.         "GD" => 78"GE" => 79"GF" => 80"GH" => 81"GI" => 82"GL" => 83
  120.         "GM" => 84"GN" => 85"GP" => 86"GQ" => 87"GR" => 88"GS" => 89
  121.         "GT" => 90"GU" => 91"GW" => 92"GY" => 93"HK" => 94"HM" => 95
  122.         "HN" => 96"HR" => 97"HT" => 98"HU" => 99"ID" => 100"IE" => 101
  123.         "IL" => 102"IN" => 103"IO" => 104"IQ" => 105"IR" => 106"IS" => 107
  124.         "IT" => 108"JM" => 109"JO" => 110"JP" => 111"KE" => 112"KG" => 113
  125.         "KH" => 114"KI" => 115"KM" => 116"KN" => 117"KP" => 118"KR" => 119
  126.         "KW" => 120"KY" => 121"KZ" => 122"LA" => 123"LB" => 124"LC" => 125
  127.         "LI" => 126"LK" => 127"LR" => 128"LS" => 129"LT" => 130"LU" => 131
  128.         "LV" => 132"LY" => 133"MA" => 134"MC" => 135"MD" => 136"MG" => 137
  129.         "MH" => 138"MK" => 139"ML" => 140"MM" => 141"MN" => 142"MO" => 143
  130.         "MP" => 144"MQ" => 145"MR" => 146"MS" => 147"MT" => 148"MU" => 149
  131.         "MV" => 150"MW" => 151"MX" => 152"MY" => 153"MZ" => 154"NA" => 155,
  132.         "NC" => 156"NE" => 157"NF" => 158"NG" => 159"NI" => 160"NL" => 161
  133.         "NO" => 162"NP" => 163"NR" => 164"NU" => 165"NZ" => 166"OM" => 167
  134.         "PA" => 168"PE" => 169"PF" => 170"PG" => 171"PH" => 172"PK" => 173
  135.         "PL" => 174"PM" => 175"PN" => 176"PR" => 177"PS" => 178"PT" => 179
  136.         "PW" => 180"PY" => 181"QA" => 182"RE" => 183"RO" => 184"RU" => 185
  137.         "RW" => 186"SA" => 187"SB" => 188"SC" => 189"SD" => 190"SE" => 191
  138.         "SG" => 192"SH" => 193"SI" => 194"SJ" => 195"SK" => 196"SL" => 197
  139.         "SM" => 198"SN" => 199"SO" => 200"SR" => 201"ST" => 202"SV" => 203
  140.         "SY" => 204"SZ" => 205"TC" => 206"TD" => 207"TF" => 208"TG" => 209
  141.         "TH" => 210"TJ" => 211"TK" => 212"TM" => 213"TN" => 214"TO" => 215
  142.         "TL" => 216"TR" => 217"TT" => 218"TV" => 219"TW" => 220"TZ" => 221
  143.         "UA" => 222"UG" => 223"UM" => 224"US" => 225"UY" => 226"UZ" => 227
  144.         "VA" => 228"VC" => 229"VE" => 230"VG" => 231"VI" => 232"VN" => 233,
  145.         "VU" => 234"WF" => 235"WS" => 236"YE" => 237"YT" => 238"RS" => 239
  146.         "ZA" => 240"ZM" => 241"ME" => 242"ZW" => 243"A1" => 244"A2" => 245
  147.         "O1" => 246"AX" => 247"GG" => 248"IM" => 249"JE" => 250"BL" => 251,
  148.         "MF" => 252);    
  149.     /**
  150.      * Array with country codes (2 chars)
  151.      * @access private
  152.      * @var array 
  153.      */
  154.     private $GEOIP_COUNTRY_CODES = array(
  155.         """AP""EU""AD""AE""AF""AG""AI""AL""AM""AN""AO""AQ",
  156.         "AR""AS""AT""AU""AW""AZ""BA""BB""BD""BE""BF""BG""BH",
  157.         "BI""BJ""BM""BN""BO""BR""BS""BT""BV""BW""BY""BZ""CA",
  158.         "CC""CD""CF""CG""CH""CI""CK""CL""CM""CN""CO""CR""CU",
  159.         "CV""CX""CY""CZ""DE""DJ""DK""DM""DO""DZ""EC""EE""EG",
  160.         "EH""ER""ES""ET""FI""FJ""FK""FM""FO""FR""FX""GA""GB",
  161.         "GD""GE""GF""GH""GI""GL""GM""GN""GP""GQ""GR""GS""GT",
  162.         "GU""GW""GY""HK""HM""HN""HR""HT""HU""ID""IE""IL""IN",
  163.         "IO""IQ""IR""IS""IT""JM""JO""JP""KE""KG""KH""KI""KM",
  164.         "KN""KP""KR""KW""KY""KZ""LA""LB""LC""LI""LK""LR""LS",
  165.         "LT""LU""LV""LY""MA""MC""MD""MG""MH""MK""ML""MM""MN",
  166.         "MO""MP""MQ""MR""MS""MT""MU""MV""MW""MX""MY""MZ""NA",
  167.         "NC""NE""NF""NG""NI""NL""NO""NP""NR""NU""NZ""OM""PA",
  168.         "PE""PF""PG""PH""PK""PL""PM""PN""PR""PS""PT""PW""PY",
  169.         "QA""RE""RO""RU""RW""SA""SB""SC""SD""SE""SG""SH""SI",
  170.         "SJ""SK""SL""SM""SN""SO""SR""ST""SV""SY""SZ""TC""TD",
  171.         "TF""TG""TH""TJ""TK""TM""TN""TO""TL""TR""TT""TV""TW",
  172.         "TZ""UA""UG""UM""US""UY""UZ""VA""VC""VE""VG""VI""VN",
  173.         "VU""WF""WS""YE""YT""RS""ZA""ZM""ME""ZW""A1""A2""O1",
  174.         "AX""GG""IM""JE""BL""MF");    
  175.     /**
  176.      * Array with country codes (3 chars)
  177.      * @access private
  178.      * @var array 
  179.      */
  180.     private $GEOIP_COUNTRY_CODES3 = array(
  181.         "","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","ANT","AGO","AQ","ARG",
  182.         "ASM","AUT","AUS","ABW","AZE","BIH","BRB","BGD","BEL","BFA","BGR","BHR","BDI",
  183.         "BEN","BMU","BRN","BOL","BRA","BHS","BTN","BV","BWA","BLR","BLZ","CAN","CC",
  184.         "COD","CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI","CUB","CPV",
  185.         "CX","CYP","CZE","DEU","DJI","DNK","DMA","DOM","DZA","ECU","EST","EGY","ESH",
  186.         "ERI","ESP","ETH","FIN","FJI","FLK","FSM","FRO","FRA","FX","GAB","GBR","GRD",
  187.         "GEO","GUF","GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","GS","GTM","GUM",
  188.         "GNB","GUY","HKG","HM","HND","HRV","HTI","HUN","IDN","IRL","ISR","IND","IO",
  189.         "IRQ","IRN","ISL","ITA","JAM","JOR","JPN","KEN","KGZ","KHM","KIR","COM","KNA",
  190.         "PRK","KOR","KWT","CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU",
  191.         "LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI","MMR","MNG","MAC",
  192.         "MNP","MTQ","MRT","MSR","MLT","MUS","MDV","MWI","MEX","MYS","MOZ","NAM","NCL",
  193.         "NER","NFK","NGA","NIC","NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER",
  194.         "PYF","PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW","PRY","QAT",
  195.         "REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN","SWE","SGP","SHN","SVN","SJM",
  196.         "SVK","SLE","SMR","SEN","SOM","SUR","STP","SLV","SYR","SWZ","TCA","TCD","TF",
  197.         "TGO","THA","TJK","TKL","TLS","TKM","TUN","TON","TUR","TTO","TUV","TWN","TZA",
  198.         "UKR","UGA","UM","USA","URY","UZB","VAT","VCT","VEN","VGB","VIR","VNM","VUT",
  199.         "WLF","WSM","YEM","YT","SRB","ZAF","ZMB","MNE","ZWE","A1","A2","O1",
  200.         "ALA","GGY","IMN","JEY","BLM","MAF");    
  201.     /**
  202.      * Array with country names
  203.      * @access private
  204.      * @var array 
  205.      */
  206.     private $GEOIP_COUNTRY_NAMES = array(
  207.         """Asia/Pacific Region""Europe""Andorra""United Arab Emirates",
  208.         "Afghanistan""Antigua and Barbuda""Anguilla""Albania""Armenia",
  209.         "Netherlands Antilles""Angola""Antarctica""Argentina""American Samoa",
  210.         "Austria""Australia""Aruba""Azerbaijan""Bosnia and Herzegovina",
  211.         "Barbados""Bangladesh""Belgium""Burkina Faso""Bulgaria""Bahrain",
  212.         "Burundi""Benin""Bermuda""Brunei Darussalam""Bolivia""Brazil",
  213.         "Bahamas""Bhutan""Bouvet Island""Botswana""Belarus""Belize",
  214.         "Canada""Cocos (Keeling) Islands""Congo, The Democratic Republic of the",
  215.         "Central African Republic""Congo""Switzerland""Cote D'Ivoire""Cook Islands",
  216.         "Chile""Cameroon""China""Colombia""Costa Rica""Cuba""Cape Verde",
  217.         "Christmas Island""Cyprus""Czech Republic""Germany""Djibouti",
  218.         "Denmark""Dominica""Dominican Republic""Algeria""Ecuador""Estonia",
  219.         "Egypt""Western Sahara""Eritrea""Spain""Ethiopia""Finland""Fiji",
  220.         "Falkland Islands (Malvinas)""Micronesia, Federated States of""Faroe Islands",
  221.         "France""France, Metropolitan""Gabon""United Kingdom",
  222.         "Grenada""Georgia""French Guiana""Ghana""Gibraltar""Greenland",
  223.         "Gambia""Guinea""Guadeloupe""Equatorial Guinea""Greece""South Georgia and the South Sandwich Islands",
  224.         "Guatemala""Guam""Guinea-Bissau",
  225.         "Guyana""Hong Kong""Heard Island and McDonald Islands""Honduras",
  226.         "Croatia""Haiti""Hungary""Indonesia""Ireland""Israel""India",
  227.         "British Indian Ocean Territory""Iraq""Iran, Islamic Republic of",
  228.         "Iceland""Italy""Jamaica""Jordan""Japan""Kenya""Kyrgyzstan",
  229.         "Cambodia""Kiribati""Comoros""Saint Kitts and Nevis""Korea, Democratic People's Republic of",
  230.         "Korea, Republic of""Kuwait""Cayman Islands",
  231.         "Kazakhstan""Lao People's Democratic Republic""Lebanon""Saint Lucia",
  232.         "Liechtenstein""Sri Lanka""Liberia""Lesotho""Lithuania""Luxembourg",
  233.         "Latvia""Libyan Arab Jamahiriya""Morocco""Monaco""Moldova, Republic of",
  234.         "Madagascar""Marshall Islands""Macedonia",
  235.         "Mali""Myanmar""Mongolia""Macau""Northern Mariana Islands",
  236.         "Martinique""Mauritania""Montserrat""Malta""Mauritius""Maldives",
  237.         "Malawi""Mexico""Malaysia""Mozambique""Namibia""New Caledonia",
  238.         "Niger""Norfolk Island""Nigeria""Nicaragua""Netherlands""Norway",
  239.         "Nepal""Nauru""Niue""New Zealand""Oman""Panama""Peru""French Polynesia",
  240.         "Papua New Guinea""Philippines""Pakistan""Poland""Saint Pierre and Miquelon",
  241.         "Pitcairn Islands""Puerto Rico""Palestinian Territory",
  242.         "Portugal""Palau""Paraguay""Qatar""Reunion""Romania",
  243.         "Russian Federation""Rwanda""Saudi Arabia""Solomon Islands",
  244.         "Seychelles""Sudan""Sweden""Singapore""Saint Helena""Slovenia",
  245.         "Svalbard and Jan Mayen""Slovakia""Sierra Leone""San Marino""Senegal",
  246.         "Somalia""Suriname""Sao Tome and Principe""El Salvador""Syrian Arab Republic",
  247.         "Swaziland""Turks and Caicos Islands""Chad""French Southern Territories",
  248.         "Togo""Thailand""Tajikistan""Tokelau""Turkmenistan",
  249.         "Tunisia""Tonga""Timor-Leste""Turkey""Trinidad and Tobago""Tuvalu",
  250.         "Taiwan""Tanzania, United Republic of""Ukraine",
  251.         "Uganda""United States Minor Outlying Islands""United States""Uruguay",
  252.         "Uzbekistan""Holy See (Vatican City State)""Saint Vincent and the Grenadines",
  253.         "Venezuela""Virgin Islands, British""Virgin Islands, U.S.",
  254.         "Vietnam""Vanuatu""Wallis and Futuna""Samoa""Yemen""Mayotte",
  255.         "Serbia""South Africa""Zambia""Montenegro""Zimbabwe",
  256.         "Anonymous Proxy","Satellite Provider","Other",
  257.         "Aland Islands","Guernsey","Isle of Man","Jersey","Saint Barthelemy","Saint Martin");        
  258.     /**
  259.      * Array with continent codes
  260.      * @access private
  261.      * @var array 
  262.      */
  263.     private $GEOIP_CONTINENT_CODES = array(
  264.         "--""AS""EU""EU""AS""AS""SA""SA""EU""AS",
  265.         "SA""AF""AN""SA""OC""EU""OC""SA""AS""EU",
  266.         "SA""AS""EU""AF""EU""AS""AF""AF""SA""AS",
  267.         "SA""SA""SA""AS""AF""AF""EU""SA""NA""AS",
  268.         "AF""AF""AF""EU""AF""OC""SA""AF""AS""SA",
  269.         "SA""SA""AF""AS""AS""EU""EU""AF""EU""SA",
  270.         "SA""AF""SA""EU""AF""AF""AF""EU""AF""EU",
  271.         "OC""SA""OC""EU""EU""EU""AF""EU""SA""AS",
  272.         "SA""AF""EU""SA""AF""AF""SA""AF""EU""SA",
  273.         "SA""OC""AF""SA""AS""AF""SA""EU""SA""EU",
  274.         "AS""EU""AS""AS""AS""AS""AS""EU""EU""SA",
  275.         "AS""AS""AF""AS""AS""OC""AF""SA""AS""AS",
  276.         "AS""SA""AS""AS""AS""SA""EU""AS""AF""AF",
  277.         "EU""EU""EU""AF""AF""EU""EU""AF""OC""EU",
  278.         "AF""AS""AS""AS""OC""SA""AF""SA""EU""AF",
  279.         "AS""AF""NA""AS""AF""AF""OC""AF""OC""AF",
  280.         "SA""EU""EU""AS""OC""OC""OC""AS""SA""SA",
  281.         "OC""OC""AS""AS""EU""SA""OC""SA""AS""EU",
  282.         "OC""SA""AS""AF""EU""AS""AF""AS""OC""AF",
  283.         "AF""EU""AS""AF""EU""EU""EU""AF""EU""AF",
  284.         "AF""SA""AF""SA""AS""AF""SA""AF""AF""AF",
  285.         "AS""AS""OC""AS""AF""OC""AS""EU""SA""OC",
  286.         "AS""AF""EU""AF""OC""NA""SA""AS""EU""SA",
  287.         "SA""SA""SA""AS""OC""OC""OC""AS""AF""EU",
  288.         "AF""AF""EU""AF""--""--""--""EU""EU""EU",
  289.         "EU""SA""SA" );
  290.     /**
  291.      * Constructor
  292.      * @access public
  293.      * @return Dot_Geoip_Api 
  294.      */
  295.     public function __construct()
  296.     {    
  297.     }            
  298.     /**
  299.      * Get the country by IP
  300.      * Return an array with : short name, like 'us' and long name, like 'United States'
  301.      * @access public
  302.      * @param string $path - path to geoip.dat  database file
  303.      * @param string $ip 
  304.      * @return array 
  305.      */
  306.     public function getCountryByAddr($path$ip)
  307.     {
  308.         $country array('unknown','unknown');
  309.         $filePath $path.'Geoip.dat';
  310.         $this->geoipOpen($filePathGEOIP_STANDARD);
  311.         $countryCode $this->geoipCountryCodeByAddr($ip);
  312.         $this->geoipClose();
  313.         if($countryCode)
  314.         {
  315.             $countryIndex array_search($countryCode$this->GEOIP_COUNTRY_CODES);
  316.             $country[0strtolower($countryCode);
  317.             $country[1$this->GEOIP_COUNTRY_NAMES[$countryIndex];
  318.         }
  319.         return $country;
  320.     }
  321.     /**
  322.      * Open Geoip database
  323.      * @access private
  324.      * @param string $filename 
  325.      * @param int $flags 
  326.      * @return void 
  327.      */
  328.     private function geoipOpen($filename$flags
  329.     {
  330.       $this->flags = $flags;
  331.       if ($this->flags GEOIP_SHARED_MEMORY
  332.       {
  333.         $this->shmid = @shmop_open (GEOIP_SHM_KEY"a"00);
  334.       }
  335.       else 
  336.       {
  337.         $this->filehandle = fopen($filename,"rb"or die"Can not open $filename\n);
  338.         if ($this->flags GEOIP_MEMORY_CACHE
  339.         {
  340.             $sArray fstat($this->filehandle);
  341.             $this->memoryBuffer = fread($this->filehandle$sArray['size']);
  342.         }
  343.       }    
  344.       $this->setupSegments();
  345.     }
  346.     /**
  347.      * Close opened file
  348.      * @access private
  349.      * @return bool 
  350.      */
  351.     private function geoipClose(
  352.     {
  353.       if ($this->flags GEOIP_SHARED_MEMORY
  354.       {
  355.         return true;
  356.       }    
  357.       return fclose($this->filehandle);
  358.     }
  359.     /**
  360.      * Get country code based on IP address
  361.      * @access private
  362.      * @param string $addr 
  363.      * @return string 
  364.      */
  365.     private function geoipCountryCodeByAddr($addr
  366.     {
  367.       if ($this->databaseType == GEOIP_CITY_EDITION_REV1
  368.       {
  369.         $record $this->geoip_record_by_addr($addr);
  370.         if $record !== false 
  371.         {
  372.           return $record->country_code;
  373.         }
  374.       
  375.       else 
  376.       {
  377.         $countryId $this->geoipCountryIdByAddr($addr);
  378.         if ($countryId !== false
  379.         {
  380.           return $this->GEOIP_COUNTRY_CODES[$countryId];
  381.         }
  382.       }
  383.       return false;
  384.     }
  385.     /**
  386.      * Get country id based on IP address
  387.      * @access private
  388.      * @param string $addr 
  389.      * @return int 
  390.      */
  391.     private function geoipCountryIdByAddr($addr
  392.     {
  393.       $ipNum ip2long($addr);
  394.       return $this->geoipSeekCountry($ipNumGEOIP_COUNTRY_BEGIN;
  395.     }
  396.     /**
  397.      * Search the country based on IP address
  398.      * @access private
  399.      * @param int $ipnum 
  400.      * @return int 
  401.      */
  402.     private function geoipSeekCountry($ipNum
  403.     {
  404.       $offset 0;
  405.       for ($depth 31$depth >= 0--$depth
  406.       {
  407.         if ($this->flags GEOIP_MEMORY_CACHE
  408.         {
  409.           // workaround php's broken substr, strpos, etc handling with
  410.           // mbstring.func_overload and mbstring.internal_encoding
  411.           $enc mb_internal_encoding();
  412.           mb_internal_encoding('ISO-8859-1');
  413.           $buf substr($this->memoryBuffer,
  414.                         $this->recordLength * $offset,
  415.                         $this->recordLength);
  416.           mb_internal_encoding($enc);
  417.         
  418.         elseif ($this->flags GEOIP_SHARED_MEMORY
  419.         {
  420.           $buf @shmop_read($this->shmid
  421.                              $this->recordLength * $offset,
  422.                              $this->recordLength );
  423.         
  424.         else 
  425.         {
  426.           fseek($this->filehandle$this->recordLength * $offsetSEEK_SET== or die("fseek failed");
  427.           $buf fread($this->filehandle$this->recordLength);
  428.         }
  429.         $x array(0,0);
  430.         for ($i 0$i 2++$i
  431.         {
  432.           for ($j 0$j $this->recordLength++$j
  433.           {
  434.             $x[$i+= ord($buf[$this->recordLength * $i $j]<< ($j 8);
  435.           }
  436.         }
  437.         if ($ipNum (<< $depth)) 
  438.         {
  439.           if ($x[1>= $this->databaseSegments
  440.           {
  441.             return $x[1];
  442.           }
  443.           $offset $x[1];
  444.         
  445.         else 
  446.         {
  447.           if ($x[0>= $this->databaseSegments
  448.           {
  449.             return $x[0];
  450.           }
  451.           $offset $x[0];
  452.         }
  453.       }
  454.       trigger_error("error traversing database - perhaps it is corrupt?"E_USER_ERROR);
  455.       return false;
  456.     }
  457.     /**
  458.      * Setup segments from GeoIp
  459.      * @access private
  460.      * @return void 
  461.      */    
  462.     private function setupSegments()
  463.     {
  464.       $this->databaseType = GEOIP_COUNTRY_EDITION;
  465.       $this->recordLength = STANDARD_RECORD_LENGTH;
  466.       if ($this->flags GEOIP_SHARED_MEMORY
  467.       {
  468.         $offset @shmop_size ($this->shmid3;
  469.         for ($i 0$i STRUCTURE_INFO_MAX_SIZE$i++
  470.         {
  471.             $delim @shmop_read ($this->shmid$offset3);
  472.             $offset += 3;
  473.             if ($delim == (chr(255).chr(255).chr(255))) 
  474.             {
  475.                 $this->databaseType = ord(@shmop_read ($this->shmid$offset1));
  476.                 $offset++;
  477.                 if ($this->databaseType == GEOIP_REGION_EDITION_REV0)
  478.                 {
  479.                     $this->databaseSegments = GEOIP_STATE_BEGIN_REV0;
  480.                 
  481.                 else if ($this->databaseType == GEOIP_REGION_EDITION_REV1)
  482.                 {
  483.                     $this->databaseSegments = GEOIP_STATE_BEGIN_REV1;
  484.                 
  485.                 else if (($this->databaseType == GEOIP_CITY_EDITION_REV0)
  486.                          || ($this->databaseType == GEOIP_CITY_EDITION_REV1
  487.                          || ($this->databaseType == GEOIP_ORG_EDITION)
  488.                          || ($this->databaseType == GEOIP_ISP_EDITION)
  489.                          || ($this->databaseType == GEOIP_ASNUM_EDITION)
  490.                         )
  491.                 {
  492.                     $this->databaseSegments = 0;
  493.                     $buf @shmop_read ($this->shmid$offsetSEGMENT_RECORD_LENGTH);
  494.                     for ($j 0;$j SEGMENT_RECORD_LENGTH;$j++)
  495.                     {
  496.                         $this->databaseSegments += (ord($buf[$j]<< ($j 8));
  497.                     }
  498.                     if (($this->databaseType == GEOIP_ORG_EDITION
  499.                         || ($this->databaseType == GEOIP_ISP_EDITION)
  500.                        
  501.                     {
  502.                         $this->recordLength = ORG_RECORD_LENGTH;
  503.                     }
  504.                 }
  505.                 break;
  506.             }
  507.             else 
  508.             {
  509.                 $offset -= 4;
  510.             }
  511.         }
  512.         if (($this->databaseType == GEOIP_COUNTRY_EDITION)
  513.             || ($this->databaseType == GEOIP_PROXY_EDITION)
  514.             || ($this->databaseType == GEOIP_NETSPEED_EDITION)
  515.            )
  516.         {
  517.             $this->databaseSegments = GEOIP_COUNTRY_BEGIN;
  518.         }
  519.     }
  520.     else 
  521.     {
  522.         $filepos ftell($this->filehandle);
  523.         fseek($this->filehandle-3SEEK_END);
  524.         for ($i 0$i STRUCTURE_INFO_MAX_SIZE$i++
  525.         {
  526.             $delim fread($this->filehandle,3);
  527.             if ($delim == (chr(255).chr(255).chr(255)))
  528.             {
  529.                 $this->databaseType = ord(fread($this->filehandle,1));
  530.                 if ($this->databaseType == GEOIP_REGION_EDITION_REV0)
  531.                 {
  532.                     $this->databaseSegments = GEOIP_STATE_BEGIN_REV0;
  533.                 }
  534.                 else if ($this->databaseType == GEOIP_REGION_EDITION_REV1)
  535.                 {
  536.                     $this->databaseSegments = GEOIP_STATE_BEGIN_REV1;
  537.                 }  
  538.                 else if (($this->databaseType == GEOIP_CITY_EDITION_REV0)
  539.                          || ($this->databaseType == GEOIP_CITY_EDITION_REV1)
  540.                          || ($this->databaseType == GEOIP_ORG_EDITION
  541.                          || ($this->databaseType == GEOIP_ISP_EDITION
  542.                          || ($this->databaseType == GEOIP_ASNUM_EDITION))
  543.                 {
  544.                     $this->databaseSegments = 0;
  545.                     $buf fread($this->filehandle,SEGMENT_RECORD_LENGTH);
  546.                     for ($j 0;$j SEGMENT_RECORD_LENGTH;$j++)
  547.                     {
  548.                         $this->databaseSegments += (ord($buf[$j]<< ($j 8));
  549.                     }
  550.                     if ($this->databaseType == GEOIP_ORG_EDITION || $this->databaseType == GEOIP_ISP_EDITION
  551.                     {
  552.                         $this->recordLength = ORG_RECORD_LENGTH;
  553.                     }
  554.                 }
  555.                 break;
  556.             }
  557.             else 
  558.             {
  559.                 fseek($this->filehandle-4SEEK_CUR);
  560.             }
  561.         }
  562.         if (($this->databaseType == GEOIP_COUNTRY_EDITION)
  563.             || ($this->databaseType == GEOIP_PROXY_EDITION)
  564.             || ($this->databaseType == GEOIP_NETSPEED_EDITION))
  565.         {
  566.             $this->databaseSegments = GEOIP_COUNTRY_BEGIN;
  567.         }
  568.         fseek($this->filehandle,$filepos,SEEK_SET);
  569.      }
  570.     }
  571. }

Documentation generated on Wed, 21 Jul 2010 07:34:37 +0000 by phpDocumentor 1.4.3