{"id":557,"date":"2009-10-19T23:30:06","date_gmt":"2009-10-19T21:30:06","guid":{"rendered":"http:\/\/blogs.wittwer.fr\/whiler\/?p=557"},"modified":"2023-03-12T15:08:48","modified_gmt":"2023-03-12T14:08:48","slug":"sample-geolite-city-delphi","status":"publish","type":"post","link":"https:\/\/blogs.wittwer.fr\/whiler\/2009\/10\/19\/sample-geolite-city-delphi\/","title":{"rendered":"Exemple GeoLite City avec Delphi"},"content":{"rendered":"<p><a target=\"_blank\" href=\"https:\/\/www.maxmind.com\/\" rel=\"noopener\">MaxMind<\/a> fournit des bases de donn\u00e9es de <a href=\"http:\/\/fr.wikipedia.org\/wiki\/g\u00e9olocalisation\" rel=\"glossary\" target=\"_blank\" title=\"Wikipedia, D&eacute;finition de&nbsp;: g\u00e9olocalisation\" style=\"\" >g\u00e9olocalisation<\/a><sup style=\"font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA\" ><em>W<\/em><\/sup>, dont <a target=\"_blank\" href=\"https:\/\/www.maxmind.com\/app\/geolitecity\" rel=\"noopener\">GeoLite City<\/a>, qui est gratuit et permet de localiser g\u00e9ographiquement une adresse IP.<br \/>\nCette base de donn\u00e9es est actualis\u00e9e tous les mois.<\/p>\n<p>Une <a target=\"_blank\" href=\"https:\/\/www.maxmind.com\/app\/pascal\" rel=\"noopener\">API pour Delphi<\/a> est disponible, mais celle-ci, au jour d&rsquo;aujourd&rsquo;hui, n&rsquo;a pas encore \u00e9t\u00e9 port\u00e9e sous <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Delphi_(informatique)\" rel=\"glossary\" target=\"_blank\" title=\"Wikipedia, D&eacute;finition de&nbsp;: Delphi 2009\" style=\"\" >Delphi 2009<\/a><sup style=\"font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA\" ><em>W<\/em><\/sup>, la premi\u00e8re version <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Unicode\" rel=\"glossary\" target=\"_blank\" title=\"Wikipedia, D&eacute;finition de&nbsp;: Unicode\" style=\"\" >Unicode<\/a><sup style=\"font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA\" ><em>W<\/em><\/sup> qui introduit des nouveaux types de cha\u00eenes de caract\u00e8res dans ce langage, et engendre une erreur avec l&rsquo;API telle qu&rsquo;elle est fournie.<\/p>\n<p>Je suis donc parti de l'<a href=\"http:\/\/fr.wikipedia.org\/wiki\/Interface_de_programmation\" rel=\"glossary\" target=\"_blank\" title=\"Wikipedia, D&eacute;finition de&nbsp;: API\" style=\"\" >API<\/a><sup style=\"font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA\" ><em>W<\/em><\/sup> fournie, et j&rsquo;ai chang\u00e9 quelques types, cast\u00e9 quelques variables, et supprim\u00e9 ainsi tous les warnings que j&rsquo;obtenais&#8230; je ne suis pas un expert Delphi, loin de l\u00e0, mais si cela vous interresse de r\u00e9cup\u00e9rer un code qui compile, voici un exemple qui fonctionne. Vous aurez besoin de la base de g\u00e9olocalisation, disponible \u00e0 cette adresse pour pouvoir ex\u00e9cuter cette application&nbsp;: <a title=\"T\u00e9l\u00e9charger la base\" href=\"https:\/\/geolite.maxmind.com\/download\/geoip\/database\/GeoLiteCity.dat.gz\">https:\/\/geolite.maxmind.com\/download\/geoip\/database\/GeoLiteCity.dat.gz<\/a><\/p>\n<p>Je me suis \u00e9galement inspir\u00e9 de l&rsquo;<a target=\"_blank\" href=\"https:\/\/wordpress.org\/extend\/plugins\/visitor-maps\/\" rel=\"noopener\">extension<\/a> <a target=\"_blank\" href=\"\/whiler\/visitors\/\" rel=\"noopener\">install\u00e9e<\/a> sur ce blog pour la localisation sur la planisph\u00e8re et l&rsquo;ajout des r\u00e9gions en toutes lettres&#8230;<\/p>\n<p>Ces noms de r\u00e9gions viennent en plus de l&rsquo;API standard&#8230; Les pays et r\u00e9gions sont soit en fran\u00e7ais, soit en anglais.<br \/>\n<!--more--><br \/>\nLe fichier <a title=\"Enregistrez la cible du lien\" href=\"\/whiler\/wp-content\/uploads\/2009\/10\/GeoIP.pas\">GeoIP.pas<\/a>, l&rsquo;API avec les r\u00e9gions en plus (constantes volontairement tronqu\u00e9es dans l&rsquo;affichage du blog)&nbsp;:<\/p>\n<div class=\"codecolorer-container delphi dawn\" style=\"overflow:auto;white-space:nowrap;width:480px;height:300px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/>64<br \/>65<br \/>66<br \/>67<br \/>68<br \/>69<br \/>70<br \/>71<br \/>72<br \/>73<br \/>74<br \/>75<br \/>76<br \/>77<br \/>78<br \/>79<br \/>80<br \/>81<br \/>82<br \/>83<br \/>84<br \/>85<br \/>86<br \/>87<br \/>88<br \/>89<br \/>90<br \/>91<br \/>92<br \/>93<br \/>94<br \/>95<br \/>96<br \/>97<br \/>98<br \/>99<br \/>100<br \/>101<br \/>102<br \/>103<br \/>104<br \/>105<br \/>106<br \/>107<br \/>108<br \/>109<br \/>110<br \/>111<br \/>112<br \/>113<br \/>114<br \/>115<br \/>116<br \/>117<br \/>118<br \/>119<br \/>120<br \/>121<br \/>122<br \/>123<br \/>124<br \/>125<br \/>126<br \/>127<br \/>128<br \/>129<br \/>130<br \/>131<br \/>132<br \/>133<br \/>134<br \/>135<br \/>136<br \/>137<br \/>138<br \/>139<br \/>140<br \/>141<br \/>142<br \/>143<br \/>144<br \/>145<br \/>146<br \/>147<br \/>148<br \/>149<br \/>150<br \/>151<br \/>152<br \/>153<br \/>154<br \/>155<br \/>156<br \/>157<br \/>158<br \/>159<br \/>160<br \/>161<br \/>162<br \/>163<br \/>164<br \/>165<br \/>166<br \/>167<br \/>168<br \/>169<br \/>170<br \/>171<br \/>172<br \/>173<br \/>174<br \/>175<br \/>176<br \/>177<br \/>178<br \/>179<br \/>180<br \/>181<br \/>182<br \/>183<br \/>184<br \/>185<br \/>186<br \/>187<br \/>188<br \/>189<br \/>190<br \/>191<br \/>192<br \/>193<br \/>194<br \/>195<br \/>196<br \/>197<br \/>198<br \/>199<br \/>200<br \/>201<br \/>202<br \/>203<br \/>204<br \/>205<br \/>206<br \/>207<br \/>208<br \/>209<br \/>210<br \/>211<br \/>212<br \/>213<br \/>214<br \/>215<br \/>216<br \/>217<br \/>218<br \/>219<br \/>220<br \/>221<br \/>222<br \/>223<br \/>224<br \/>225<br \/>226<br \/>227<br \/>228<br \/>229<br \/>230<br \/>231<br \/>232<br \/>233<br \/>234<br \/>235<br \/>236<br \/>237<br \/>238<br \/>239<br \/>240<br \/>241<br \/>242<br \/>243<br \/>244<br \/>245<br \/>246<br \/>247<br \/>248<br \/>249<br \/>250<br \/>251<br \/>252<br \/>253<br \/>254<br \/>255<br \/>256<br \/>257<br \/>258<br \/>259<br \/>260<br \/>261<br \/>262<br \/>263<br \/>264<br \/>265<br \/>266<br \/>267<br \/>268<br \/>269<br \/>270<br \/>271<br \/>272<br \/>273<br \/>274<br \/>275<br \/>276<br \/>277<br \/>278<br \/>279<br \/>280<br \/>281<br \/>282<br \/>283<br \/>284<br \/>285<br \/>286<br \/>287<br \/>288<br \/>289<br \/>290<br \/>291<br \/>292<br \/>293<br \/>294<br \/>295<br \/>296<br \/>297<br \/>298<br \/>299<br \/>300<br \/>301<br \/>302<br \/>303<br \/>304<br \/>305<br \/>306<br \/>307<br \/>308<br \/>309<br \/>310<br \/>311<br \/>312<br \/>313<br \/>314<br \/>315<br \/>316<br \/>317<br \/>318<br \/>319<br \/>320<br \/>321<br \/>322<br \/>323<br \/>324<br \/>325<br \/>326<br \/>327<br \/>328<br \/>329<br \/>330<br \/>331<br \/>332<br \/>333<br \/>334<br \/>335<br \/>336<br \/>337<br \/>338<br \/>339<br \/>340<br \/>341<br \/>342<br \/>343<br \/>344<br \/>345<br \/>346<br \/>347<br \/>348<br \/>349<br \/>350<br \/>351<br \/>352<br \/>353<br \/>354<br \/>355<br \/>356<br \/>357<br \/>358<br \/>359<br \/>360<br \/>361<br \/>362<br \/>363<br \/>364<br \/>365<br \/>366<br \/>367<br \/>368<br \/>369<br \/>370<br \/>371<br \/>372<br \/>373<br \/>374<br \/>375<br \/>376<br \/>377<br \/>378<br \/>379<br \/>380<br \/>381<br \/>382<br \/>383<br \/>384<br \/>385<br \/>386<br \/>387<br \/>388<br \/>389<br \/>390<br \/>391<br \/>392<br \/>393<br \/>394<br \/>395<br \/>396<br \/>397<br \/>398<br \/>399<br \/>400<br \/>401<br \/>402<br \/>403<br \/>404<br \/>405<br \/>406<br \/>407<br \/>408<br \/>409<br \/>410<br \/>411<br \/>412<br \/>413<br \/>414<br \/>415<br \/>416<br \/>417<br \/>418<br \/>419<br \/>420<br \/>421<br \/>422<br \/>423<br \/>424<br \/>425<br \/>426<br \/>427<br \/>428<br \/>429<br \/>430<br \/>431<br \/>432<br \/>433<br \/>434<br \/>435<br \/>436<br \/>437<br \/>438<br \/>439<br \/>440<br \/>441<br \/>442<br \/>443<br \/>444<br \/>445<br \/>446<br \/>447<br \/>448<br \/>449<br \/>450<br \/>451<br \/>452<br \/>453<br \/>454<br \/>455<br \/>456<br \/>457<br \/>458<br \/>459<br \/>460<br \/>461<br \/>462<br \/>463<br \/>464<br \/>465<br \/>466<br \/>467<br \/>468<br \/>469<br \/>470<br \/>471<br \/>472<br \/>473<br \/>474<br \/>475<br \/>476<br \/>477<br \/>478<br \/>479<br \/>480<br \/>481<br \/>482<br \/>483<br \/>484<br \/>485<br \/>486<br \/>487<br \/>488<br \/>489<br \/>490<br \/>491<br \/>492<br \/>493<br \/>494<br \/>495<br \/>496<br \/>497<br \/>498<br \/>499<br \/>500<br \/>501<br \/>502<br \/>503<br \/>504<br \/>505<br \/>506<br \/>507<br \/>508<br \/>509<br \/>510<br \/>511<br \/>512<br \/>513<br \/>514<br \/>515<br \/>516<br \/>517<br \/>518<br \/>519<br \/>520<br \/>521<br \/>522<br \/>523<br \/>524<br \/>525<br \/>526<br \/>527<br \/>528<br \/>529<br \/>530<br \/>531<br \/>532<br \/>533<br \/>534<br \/>535<br \/>536<br \/>537<br \/>538<br \/>539<br \/>540<br \/>541<br \/>542<br \/>543<br \/>544<br \/>545<br \/>546<br \/>547<br \/>548<br \/>549<br \/>550<br \/>551<br \/>552<br \/>553<br \/>554<br \/>555<br \/>556<br \/>557<br \/>558<br \/>559<br \/>560<br \/>561<br \/>562<br \/>563<br \/>564<br \/>565<br \/>566<br \/>567<br \/>568<br \/>569<br \/>570<br \/>571<br \/>572<br \/>573<br \/>574<br \/>575<br \/>576<br \/>577<br \/>578<br \/>579<br \/>580<br \/>581<br \/>582<br \/>583<br \/>584<br \/>585<br \/>586<br \/>587<br \/>588<br \/>589<br \/>590<br \/>591<br \/>592<br \/>593<br \/>594<br \/><\/div><\/td><td><div class=\"delphi codecolorer\"><span class=\"coMULTI\">{<br \/>\n&nbsp;* Copyright (C) 2005 MaxMind LLC &nbsp;All Rights Reserved.<br \/>\n&nbsp;*<br \/>\n&nbsp;* This library is free software; you can redistribute it and\/or<br \/>\n&nbsp;* modify it under the terms of the GNU General Public<br \/>\n&nbsp;* License as published by the Free Software Foundation; either<br \/>\n&nbsp;* version 2 of the License, or (at your option) any later version.<br \/>\n&nbsp;*<br \/>\n&nbsp;* This library is distributed in the hope that it will be useful,<br \/>\n&nbsp;* but WITHOUT ANY WARRANTY; without even the implied warranty of<br \/>\n&nbsp;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. &nbsp;See the GNU<br \/>\n&nbsp;* General Public License for more details.<br \/>\n&nbsp;*<br \/>\n&nbsp;* You should have received a copy of the GNU General Public<br \/>\n&nbsp;* License along with this library; if not, write to the Free Software<br \/>\n&nbsp;* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA &nbsp;02111-1307 &nbsp;USA<br \/>\n<br \/>\n&nbsp;* ChangeLog<br \/>\n&nbsp;* 2003-04-09 Translation of C# class to Pascal provided by W. Tracz<br \/>\n&nbsp;* 2005-07-20 Added support for GeoIP Region, City, ISP and Organization (Yvan Schwab\/esoftys)<br \/>\n&nbsp;* 2009-10-18 Compatible with Delphi 2009 and above (AnsiString) + regions added<br \/>\n}<\/span><br \/>\n<br \/>\n<span class=\"coMULTI\">{ Thanks to W. Tracz\/Yvan Schwab for contributing this class }<\/span><br \/>\n<br \/>\n<span class=\"kw1\">unit<\/span> GeoIP<span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">interface<\/span><br \/>\n<br \/>\n<span class=\"kw1\">uses<\/span> Classes<span class=\"sy1\">,<\/span> SysUtils<span class=\"sy1\">,<\/span> WinSock<span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">type<\/span><br \/>\n&nbsp; TGeoIPResult <span class=\"sy3\">=<\/span> <span class=\"br0\">&#40;<\/span><br \/>\n&nbsp; &nbsp; GEOIP_SUCCESS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">,<\/span><br \/>\n&nbsp; &nbsp; GEOIP_NODATA &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy3\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy1\">,<\/span><br \/>\n&nbsp; &nbsp; GEOIP_ERROR_IPADDR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy3\">=<\/span> <span class=\"nu0\">2<\/span><span class=\"sy1\">,<\/span><br \/>\n&nbsp; &nbsp; GEOIP_ERROR_DBTYPE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy3\">=<\/span> <span class=\"nu0\">3<\/span><span class=\"sy1\">,<\/span><br \/>\n&nbsp; &nbsp; GEOIP_ERROR_IO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy3\">=<\/span> <span class=\"nu0\">4<\/span><br \/>\n&nbsp; <span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; TGeoIPDBTypes <span class=\"sy3\">=<\/span> <span class=\"br0\">&#40;<\/span><br \/>\n&nbsp; &nbsp; GEOIP_COUNTRY_EDITION &nbsp; &nbsp; <span class=\"sy3\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy1\">,<\/span><br \/>\n&nbsp; &nbsp; GEOIP_REGION_EDITION_REV0 <span class=\"sy3\">=<\/span> <span class=\"nu0\">7<\/span><span class=\"sy1\">,<\/span><br \/>\n&nbsp; &nbsp; GEOIP_CITY_EDITION_REV0 &nbsp; <span class=\"sy3\">=<\/span> <span class=\"nu0\">6<\/span><span class=\"sy1\">,<\/span><br \/>\n&nbsp; &nbsp; GEOIP_ORG_EDITION &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy3\">=<\/span> <span class=\"nu0\">5<\/span><span class=\"sy1\">,<\/span><br \/>\n&nbsp; &nbsp; GEOIP_ISP_EDITION &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy3\">=<\/span> <span class=\"nu0\">4<\/span><span class=\"sy1\">,<\/span><br \/>\n&nbsp; &nbsp; GEOIP_CITY_EDITION_REV1 &nbsp; <span class=\"sy3\">=<\/span> <span class=\"nu0\">2<\/span><span class=\"sy1\">,<\/span><br \/>\n&nbsp; &nbsp; GEOIP_REGION_EDITION_REV1 <span class=\"sy3\">=<\/span> <span class=\"nu0\">3<\/span><span class=\"sy1\">,<\/span><br \/>\n&nbsp; &nbsp; GEOIP_PROXY_EDITION &nbsp; &nbsp; &nbsp; <span class=\"sy3\">=<\/span> <span class=\"nu0\">8<\/span><span class=\"sy1\">,<\/span><br \/>\n&nbsp; &nbsp; GEOIP_ASNUM_EDITION &nbsp; &nbsp; &nbsp; <span class=\"sy3\">=<\/span> <span class=\"nu0\">9<\/span><br \/>\n&nbsp; <span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; TGeoIPCountry <span class=\"sy3\">=<\/span> <span class=\"kw1\">record<\/span><br \/>\n&nbsp; &nbsp; CountryCode<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; CountryName<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; TGeoIPRegion <span class=\"sy3\">=<\/span> <span class=\"kw1\">record<\/span><br \/>\n&nbsp; &nbsp; CountryCode<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Region<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; TGeoIPCity <span class=\"sy3\">=<\/span> <span class=\"kw1\">record<\/span><br \/>\n&nbsp; &nbsp; CountryCode<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; CountryName<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Region<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; City<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; PostalCode<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Latitude<span class=\"sy1\">:<\/span> <span class=\"kw4\">Double<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Longitude<span class=\"sy1\">:<\/span> <span class=\"kw4\">Double<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; DmaCode<span class=\"sy1\">:<\/span> <span class=\"kw4\">Integer<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; AreaCode<span class=\"sy1\">:<\/span> <span class=\"kw4\">Integer<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; TGeoIPOrg <span class=\"sy3\">=<\/span> <span class=\"kw1\">record<\/span><br \/>\n&nbsp; &nbsp; Name<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; TGeoIP <span class=\"sy3\">=<\/span> <span class=\"kw1\">class<\/span><br \/>\n&nbsp; <span class=\"kw1\">private<\/span><br \/>\n&nbsp; &nbsp; FInputFile<span class=\"sy1\">:<\/span> TFileStream<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; FDatabaseType<span class=\"sy1\">:<\/span> TGeoIPDBTypes<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; FDatabaseSegments<span class=\"sy1\">:<\/span> <span class=\"kw1\">array<\/span> <span class=\"kw1\">of<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; FDatabaseInfo<span class=\"sy1\">:<\/span> <span class=\"kw4\">string<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; FRecordLength<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; slRegions <span class=\"sy1\">:<\/span> TStringList<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">function<\/span> &nbsp;_GetCity<span class=\"br0\">&#40;<\/span>IPNum<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> GeoIPCity<span class=\"sy1\">:<\/span> TGeoIPCity<span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> TGeoIPResult<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">function<\/span> &nbsp;_GetCountry<span class=\"br0\">&#40;<\/span>IPNum<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> GeoIPCountry<span class=\"sy1\">:<\/span> TGeoIPCountry<span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> TGeoIPResult<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">function<\/span> &nbsp;_GetOrg<span class=\"br0\">&#40;<\/span>IPNum<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> GeoIPOrg<span class=\"sy1\">:<\/span> TGeoIPOrg<span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> TGeoIPResult<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">function<\/span> &nbsp;_GetRegion<span class=\"br0\">&#40;<\/span>IPNum<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> GeoIPRegion<span class=\"sy1\">:<\/span> TGeoIPRegion<span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> TGeoIPResult<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">function<\/span> &nbsp;AddrToNum<span class=\"br0\">&#40;<\/span><span class=\"kw1\">const<\/span> IPAddr<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">procedure<\/span> InitDBFile<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">function<\/span> &nbsp;SeekRecord<span class=\"br0\">&#40;<\/span>IPNum<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">procedure<\/span> InitRegions<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">public<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">constructor<\/span> Create<span class=\"br0\">&#40;<\/span><span class=\"kw1\">const<\/span> FileName<span class=\"sy1\">:<\/span> <span class=\"kw4\">string<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">destructor<\/span> Destroy<span class=\"sy1\">;<\/span> <span class=\"kw1\">override<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">function<\/span> GetCity<span class=\"br0\">&#40;<\/span><span class=\"kw1\">const<\/span> IPAddr<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> GeoIPCity<span class=\"sy1\">:<\/span> TGeoIPCity<span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> TGeoIPResult<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">function<\/span> GetCountry<span class=\"br0\">&#40;<\/span><span class=\"kw1\">const<\/span> IPAddr<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> GeoIPCountry<span class=\"sy1\">:<\/span> TGeoIPCountry<span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> TGeoIPResult<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">function<\/span> GetDatabaseInfo<span class=\"sy1\">:<\/span> <span class=\"kw4\">string<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">function<\/span> GetOrg<span class=\"br0\">&#40;<\/span><span class=\"kw1\">const<\/span> IPAddr<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> GeoIPOrg<span class=\"sy1\">:<\/span> TGeoIPOrg<span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> TGeoIPResult<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">function<\/span> GetRegion<span class=\"br0\">&#40;<\/span><span class=\"kw1\">const<\/span> IPAddr<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> GeoIPRegion<span class=\"sy1\">:<\/span> TGeoIPRegion<span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> TGeoIPResult<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">const<\/span><br \/>\n&nbsp; CountryCodes<span class=\"sy1\">:<\/span><span class=\"kw1\">array<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"sy1\">..<\/span><span class=\"nu0\">252<\/span><span class=\"br0\">&#93;<\/span> <span class=\"kw1\">of<\/span> <span class=\"kw4\">ansistring<\/span> <span class=\"sy3\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"st0\">'--'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AP'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'EU'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AD'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AE'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AF'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AG'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AI'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AL'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AN'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AO'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AQ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AR'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AS'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AT'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AU'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AW'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AZ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BA'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BB'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BD'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BE'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BF'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BG'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BH'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BI'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BJ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BN'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BO'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BR'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BS'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BT'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BV'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BW'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BY'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BZ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CA'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CC'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CD'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CF'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CG'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CH'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CI'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CK'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CL'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CN'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CO'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CR'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CU'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CV'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CX'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CY'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'CZ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'DE'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'DJ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'DK'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'DM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'DO'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'DZ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'EC'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'EE'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'EG'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'EH'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'ER'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'ES'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'ET'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'FI'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'FJ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'FK'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'FM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'FO'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'FR'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'FX'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GA'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GB'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GD'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GE'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GF'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GH'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GI'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GL'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GN'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GP'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GQ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GR'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GS'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GT'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GU'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GW'<\/span><span class=\"sy1\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st0\">'GY'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'HK'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'HM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'HN'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'HR'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'HT'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'HU'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'ID'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'IE'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'IL'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'IN'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'IO'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'IQ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'IR'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'IS'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'IT'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'JM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'JO'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'JP'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'KE'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'KG'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'KH'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'KI'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'KM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'KN'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'KP'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'KR'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'KW'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'KY'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'KZ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'LA'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'LB'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'LC'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'LI'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'LK'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'LR'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'LS'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'LT'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'LU'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'LV'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'LY'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MA'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MC'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MD'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MG'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MH'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MK'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'ML'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MN'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MO'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MP'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MQ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MR'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MS'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MT'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MU'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MV'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MW'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MX'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MY'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MZ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'NA'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'NC'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'NE'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'NF'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'NG'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'NI'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'NL'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'NO'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'NP'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'NR'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'NU'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'NZ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'OM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'PA'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'PE'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'PF'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'PG'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'PH'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'PK'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'PL'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'PM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'PN'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'PR'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'PS'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'PT'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'PW'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'PY'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'QA'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'RE'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'RO'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'RU'<\/span><span class=\"sy1\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st0\">'RW'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SA'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SB'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SC'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SD'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SE'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SG'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SH'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SI'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SJ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SK'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SL'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SN'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SO'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SR'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'ST'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SV'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SY'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'SZ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'TC'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'TD'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'TF'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'TG'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'TH'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'TJ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'TK'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'TM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'TN'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'TO'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'TL'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'TR'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'TT'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'TV'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'TW'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'TZ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'UA'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'UG'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'UM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'US'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'UY'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'UZ'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'VA'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'VC'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'VE'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'VG'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'VI'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'VN'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'VU'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'WF'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'WS'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'YE'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'YT'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'RS'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'ZA'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'ZM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'ME'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'ZW'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'A1'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'A2'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'O1'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'AX'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'GG'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'IM'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'JE'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'BL'<\/span><span class=\"sy1\">,<\/span><span class=\"st0\">'MF'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; CountryNames<span class=\"sy1\">:<\/span><span class=\"kw1\">array<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"sy1\">..<\/span><span class=\"nu0\">252<\/span><span class=\"br0\">&#93;<\/span> <span class=\"kw1\">of<\/span> <span class=\"kw4\">ansistring<\/span> <span class=\"sy3\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"st0\">'ND'<\/span><span class=\"sy1\">,<\/span> <span class=\"st0\">'R\u00e9gion Asie \/ Pacifique'<\/span><span class=\"sy1\">,<\/span> <span class=\"st0\">'Europe'<\/span><span class=\"sy1\">,<\/span> <span class=\"st0\">'Andorre'<\/span><span class=\"sy1\">,<\/span> <span class=\"st0\">'\u00c9mirats Arabes Unis'<\/span><span class=\"sy1\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st0\">'Afghanistan'<\/span><span class=\"sy1\">,<\/span> <br \/>\n<span class=\"br0\">&#91;<\/span><span class=\"sy1\">...<\/span><span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"sy1\">,<\/span> <span class=\"st0\">'Saint-Barth\u00e9lemy'<\/span><span class=\"sy1\">,<\/span> <span class=\"st0\">'Saint Martin'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; RegionNames<span class=\"sy1\">:<\/span><span class=\"kw1\">array<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"sy1\">..<\/span><span class=\"nu0\">4209<\/span><span class=\"br0\">&#93;<\/span> <span class=\"kw1\">of<\/span> <span class=\"kw4\">ansistring<\/span> <span class=\"sy3\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"st0\">'AD02=Canillo'<\/span><span class=\"sy1\">,<\/span> <span class=\"st0\">'AD03=Encamp'<\/span><span class=\"sy1\">,<\/span> <span class=\"st0\">'AD04=La Massana'<\/span><span class=\"sy1\">,<\/span> <span class=\"st0\">'AD05=Ordino'<\/span><span class=\"sy1\">,<\/span> <span class=\"st0\">'AD06=Sant Julia de Loria'<\/span><span class=\"sy1\">,<\/span> <span class=\"st0\">'AD07=Andorra la Vella'<\/span><span class=\"sy1\">,<\/span> <span class=\"st0\">'AD08=Escaldes-Engordany'<\/span><span class=\"sy1\">,<\/span> <span class=\"st0\">'AE01=Abu Dhabi'<\/span><span class=\"sy1\">,<\/span> <span class=\"st0\">'AE02=Ajman'<\/span><span class=\"sy1\">,<\/span> <span class=\"st0\">'AE03=Dubai'<\/span><span class=\"sy1\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#91;<\/span><span class=\"sy1\">...<\/span><span class=\"br0\">&#93;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"st0\">'ZW10=Harare'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">implementation<\/span><br \/>\n<br \/>\n<span class=\"kw1\">const<\/span><br \/>\n&nbsp; COUNTRY_BEGIN <span class=\"sy3\">=<\/span> <span class=\"nu0\">16776960<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; STATE_BEGIN_REV0 <span class=\"sy3\">=<\/span> <span class=\"nu0\">16700000<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; STATE_BEGIN_REV1 &nbsp;<span class=\"sy3\">=<\/span> <span class=\"nu0\">16000000<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; STRUCTURE_INFO_MAX_SIZE <span class=\"sy3\">=<\/span> <span class=\"nu0\">20<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; DATABASE_INFO_MAX_SIZE <span class=\"sy3\">=<\/span> <span class=\"nu0\">100<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; SEGMENT_RECORD_LENGTH <span class=\"sy3\">=<\/span> <span class=\"nu0\">3<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; STANDARD_RECORD_LENGTH <span class=\"sy3\">=<\/span> <span class=\"nu0\">3<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; ORG_RECORD_LENGTH <span class=\"sy3\">=<\/span> <span class=\"nu0\">4<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; MAX_RECORD_LENGTH <span class=\"sy3\">=<\/span> <span class=\"nu0\">4<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; MAX_ORG_RECORD_LENGTH <span class=\"sy3\">=<\/span> <span class=\"nu0\">300<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; FULL_RECORD_LENGTH <span class=\"sy3\">=<\/span> <span class=\"nu0\">50<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; US_OFFSET <span class=\"sy3\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; CANADA_OFFSET <span class=\"sy3\">=<\/span> <span class=\"nu0\">677<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; WORLD_OFFSET <span class=\"sy3\">=<\/span> <span class=\"nu0\">1353<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; FIPS_RANGE <span class=\"sy3\">=<\/span> <span class=\"nu0\">360<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"coMULTI\">{ TGeoIP }<\/span><br \/>\n<br \/>\n<span class=\"kw1\">constructor<\/span> TGeoIP<span class=\"sy1\">.<\/span><span class=\"me1\">Create<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">const<\/span> FileName<span class=\"sy1\">:<\/span> <span class=\"kw4\">string<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; <span class=\"kw1\">inherited<\/span> Create<span class=\"sy1\">;<\/span><br \/>\n&nbsp; FInputFile <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> TFileStream<span class=\"sy1\">.<\/span><span class=\"me1\">Create<\/span><span class=\"br0\">&#40;<\/span>FileName<span class=\"sy1\">,<\/span> fmOpenRead <span class=\"kw1\">or<\/span> fmShareDenyNone<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; InitDBFile<span class=\"sy1\">;<\/span><br \/>\n&nbsp; InitRegions<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">destructor<\/span> TGeoIP<span class=\"sy1\">.<\/span><span class=\"me1\">Destroy<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"kw3\">Assigned<\/span><span class=\"br0\">&#40;<\/span>FInputFile<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"me1\">Free<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"kw3\">Assigned<\/span><span class=\"br0\">&#40;<\/span>slRegions<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; slRegions<span class=\"sy1\">.<\/span><span class=\"me1\">Free<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">inherited<\/span> Destroy<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> TGeoIP<span class=\"sy1\">.<\/span>_GetCity<span class=\"br0\">&#40;<\/span>IPNum<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> GeoIPCity<span class=\"sy1\">:<\/span> TGeoIPCity<span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> TGeoIPResult<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; &nbsp;SeekCity<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;RecordPointer<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;StrLen<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;buf<span class=\"sy1\">:<\/span> <span class=\"kw1\">array<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"sy1\">..<\/span><span class=\"me1\">FULL_RECORD_LENGTH<\/span><span class=\"sy3\">-<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> <span class=\"kw1\">of<\/span> <span class=\"kw4\">Byte<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;p<span class=\"sy1\">:<\/span> <span class=\"kw4\">PAnsiChar<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;i<span class=\"sy1\">:<\/span> <span class=\"kw4\">Integer<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;DmaAreaCombo<span class=\"sy1\">:<\/span> <span class=\"kw4\">Integer<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>FDatabaseType &lt;&gt; GEOIP_CITY_EDITION_REV0<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span> <span class=\"br0\">&#40;<\/span>FDatabaseType &lt;&gt; GEOIP_CITY_EDITION_REV1<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GEOIP_ERROR_DBTYPE<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Exit<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; SeekCity <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> SeekRecord<span class=\"br0\">&#40;<\/span>IPNum<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> SeekCity <span class=\"sy3\">=<\/span> FDatabaseSegments<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GEOIP_NODATA<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Exit<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; RecordPointer <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> SeekCity <span class=\"sy3\">+<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">2<\/span> <span class=\"sy3\">*<\/span> FRecordLength <span class=\"sy3\">-<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy3\">*<\/span> FDatabaseSegments<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw3\">Seek<\/span><span class=\"br0\">&#40;<\/span>RecordPointer<span class=\"sy1\">,<\/span> soFromBeginning<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw1\">Read<\/span><span class=\"br0\">&#40;<\/span>buf<span class=\"sy1\">,<\/span> FULL_RECORD_LENGTH<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"co1\">\/\/ get country<\/span><br \/>\n&nbsp; GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">CountryCode<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> CountryCodes<span class=\"br0\">&#91;<\/span>buf<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">CountryName<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> CountryNames<span class=\"br0\">&#91;<\/span>buf<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"co1\">\/\/ get region<\/span><br \/>\n&nbsp; p <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"sy2\">@<\/span>buf<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; StrLen <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">while<\/span> <span class=\"br0\">&#40;<\/span>p<span class=\"br0\">&#91;<\/span>StrLen<span class=\"br0\">&#93;<\/span> &lt;&gt; <span class=\"re1\">#0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">do<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">Inc<\/span><span class=\"br0\">&#40;<\/span>StrLen<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Region<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw3\">Copy<\/span><span class=\"br0\">&#40;<\/span>p<span class=\"sy1\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">,<\/span> StrLen<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"co1\">\/\/ Region label<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Region<\/span> &lt;&gt; <span class=\"st0\">''<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span> <span class=\"br0\">&#40;<\/span>slRegions<span class=\"sy1\">.<\/span><span class=\"me1\">IndexOfName<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">string<\/span><span class=\"br0\">&#40;<\/span>GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">CountryCode<\/span> <span class=\"sy3\">+<\/span> GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Region<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> &lt;&gt; <span class=\"sy3\">-<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Region<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw4\">AnsiString<\/span><span class=\"br0\">&#40;<\/span>slRegions<span class=\"sy1\">.<\/span><span class=\"me1\">Values<\/span><span class=\"br0\">&#91;<\/span><span class=\"kw4\">string<\/span><span class=\"br0\">&#40;<\/span>GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">CountryCode<\/span> <span class=\"sy3\">+<\/span> GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Region<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"co1\">\/\/ get city<\/span><br \/>\n&nbsp; <span class=\"kw3\">Inc<\/span><span class=\"br0\">&#40;<\/span>p<span class=\"sy1\">,<\/span> StrLen <span class=\"sy3\">+<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; StrLen <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">while<\/span> <span class=\"br0\">&#40;<\/span>p<span class=\"br0\">&#91;<\/span>StrLen<span class=\"br0\">&#93;<\/span> &lt;&gt; <span class=\"re1\">#0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">do<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">Inc<\/span><span class=\"br0\">&#40;<\/span>StrLen<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">City<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw3\">Copy<\/span><span class=\"br0\">&#40;<\/span>p<span class=\"sy1\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">,<\/span> StrLen<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"co1\">\/\/ get postal code<\/span><br \/>\n&nbsp; <span class=\"kw3\">Inc<\/span><span class=\"br0\">&#40;<\/span>p<span class=\"sy1\">,<\/span> StrLen <span class=\"sy3\">+<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; StrLen <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">while<\/span> <span class=\"br0\">&#40;<\/span>p<span class=\"br0\">&#91;<\/span>StrLen<span class=\"br0\">&#93;<\/span> &lt;&gt; <span class=\"re1\">#0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">do<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">Inc<\/span><span class=\"br0\">&#40;<\/span>StrLen<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">PostalCode<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw3\">Copy<\/span><span class=\"br0\">&#40;<\/span>p<span class=\"sy1\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">,<\/span> StrLen<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"co1\">\/\/ get latitude<\/span><br \/>\n&nbsp; <span class=\"kw3\">Inc<\/span><span class=\"br0\">&#40;<\/span>p<span class=\"sy1\">,<\/span> StrLen <span class=\"sy3\">+<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Latitude<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0.0<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">for<\/span> i<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span><span class=\"nu0\">0<\/span> <span class=\"kw1\">to<\/span> <span class=\"nu0\">2<\/span> <span class=\"kw1\">do<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Latitude<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Latitude<\/span> <span class=\"sy3\">+<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw4\">Integer<\/span><span class=\"br0\">&#40;<\/span>p<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">shl<\/span> <span class=\"br0\">&#40;<\/span>i<span class=\"sy3\">*<\/span><span class=\"nu0\">8<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Latitude<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Latitude<\/span><span class=\"sy3\">\/<\/span><span class=\"nu0\">10000<\/span> <span class=\"sy3\">-<\/span> <span class=\"nu0\">180<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"co1\">\/\/ get longitude<\/span><br \/>\n&nbsp; <span class=\"kw3\">Inc<\/span><span class=\"br0\">&#40;<\/span>p<span class=\"sy1\">,<\/span> <span class=\"nu0\">3<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Longitude<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0.0<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">for<\/span> i<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span><span class=\"nu0\">0<\/span> <span class=\"kw1\">to<\/span> <span class=\"nu0\">2<\/span> <span class=\"kw1\">do<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Longitude<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Longitude<\/span> <span class=\"sy3\">+<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw4\">Integer<\/span><span class=\"br0\">&#40;<\/span>p<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">shl<\/span> <span class=\"br0\">&#40;<\/span>i<span class=\"sy3\">*<\/span><span class=\"nu0\">8<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Longitude<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Longitude<\/span><span class=\"sy3\">\/<\/span><span class=\"nu0\">10000<\/span> <span class=\"sy3\">-<\/span> <span class=\"nu0\">180<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"co1\">\/\/ get area code and dma code for post April 2002 databases and for US locations<\/span><br \/>\n&nbsp; GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">DmaCode<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">AreaCode<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> FDatabaseType <span class=\"sy3\">=<\/span> GEOIP_CITY_EDITION_REV1 <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">CountryCode<\/span> <span class=\"sy3\">=<\/span> <span class=\"st0\">'US'<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw3\">Inc<\/span><span class=\"br0\">&#40;<\/span>p<span class=\"sy1\">,<\/span> <span class=\"nu0\">3<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; DmaAreaCombo <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">for<\/span> i<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span><span class=\"nu0\">0<\/span> <span class=\"kw1\">to<\/span> <span class=\"nu0\">2<\/span> <span class=\"kw1\">do<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; DmaAreaCombo <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> DmaAreaCombo <span class=\"sy3\">+<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw4\">Integer<\/span><span class=\"br0\">&#40;<\/span>p<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">shl<\/span> <span class=\"br0\">&#40;<\/span>i<span class=\"sy3\">*<\/span><span class=\"nu0\">8<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">DmaCode<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> DmaAreaCombo <span class=\"kw1\">div<\/span> <span class=\"nu0\">1000<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">AreaCode<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> DmaAreaCombo <span class=\"kw1\">mod<\/span> <span class=\"nu0\">1000<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GEOIP_SUCCESS<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> TGeoIP<span class=\"sy1\">.<\/span>_GetCountry<span class=\"br0\">&#40;<\/span>IPNum<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> GeoIPCountry<span class=\"sy1\">:<\/span> TGeoIPCountry<span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> TGeoIPResult<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; &nbsp;ret<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>FDatabaseType &lt;&gt; GEOIP_COUNTRY_EDITION<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span> <span class=\"br0\">&#40;<\/span>FDatabaseType &lt;&gt; GEOIP_PROXY_EDITION<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GEOIP_ERROR_DBTYPE<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Exit<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; ret <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> SeekRecord<span class=\"br0\">&#40;<\/span>IPNum<span class=\"br0\">&#41;<\/span> <span class=\"sy3\">-<\/span> COUNTRY_BEGIN<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> ret &gt; <span class=\"nu0\">0<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; GeoIPCountry<span class=\"sy1\">.<\/span><span class=\"me1\">CountryCode<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> CountryCodes<span class=\"br0\">&#91;<\/span>ret<span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; GeoIPCountry<span class=\"sy1\">.<\/span><span class=\"me1\">CountryName<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> CountryNames<span class=\"br0\">&#91;<\/span>ret<span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GEOIP_SUCCESS<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><br \/>\n&nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GEOIP_NODATA<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> TGeoIP<span class=\"sy1\">.<\/span>_GetOrg<span class=\"br0\">&#40;<\/span>IPNum<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> GeoIPOrg<span class=\"sy1\">:<\/span> TGeoIPOrg<span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> TGeoIPResult<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; &nbsp;SeekOrg<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;RecordPointer<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;StrLen<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;buf<span class=\"sy1\">:<\/span> <span class=\"kw1\">array<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"sy1\">..<\/span><span class=\"me1\">MAX_ORG_RECORD_LENGTH<\/span><span class=\"sy3\">-<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> <span class=\"kw1\">of<\/span> <span class=\"kw4\">Byte<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;p<span class=\"sy1\">:<\/span> <span class=\"kw4\">PAnsiChar<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>FDatabaseType &lt;&gt; GEOIP_ORG_EDITION<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span> <span class=\"br0\">&#40;<\/span>FDatabaseType &lt;&gt; GEOIP_ISP_EDITION<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span> <span class=\"br0\">&#40;<\/span>FDatabaseType &lt;&gt; GEOIP_ASNUM_EDITION<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GEOIP_ERROR_DBTYPE<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Exit<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; SeekOrg <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> SeekRecord<span class=\"br0\">&#40;<\/span>IPNum<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> SeekOrg <span class=\"sy3\">=<\/span> FDatabaseSegments<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GEOIP_NODATA<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Exit<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; RecordPointer <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> SeekOrg <span class=\"sy3\">+<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">2<\/span> <span class=\"sy3\">*<\/span> FRecordLength <span class=\"sy3\">-<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy3\">*<\/span> FDatabaseSegments<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw3\">Seek<\/span><span class=\"br0\">&#40;<\/span>RecordPointer<span class=\"sy1\">,<\/span> soFromBeginning<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw1\">Read<\/span><span class=\"br0\">&#40;<\/span>buf<span class=\"sy1\">,<\/span> FULL_RECORD_LENGTH<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; p <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"sy2\">@<\/span>buf<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; StrLen <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">while<\/span> <span class=\"br0\">&#40;<\/span>p<span class=\"br0\">&#91;<\/span>StrLen<span class=\"br0\">&#93;<\/span> &lt;&gt; <span class=\"re1\">#0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">do<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">Inc<\/span><span class=\"br0\">&#40;<\/span>StrLen<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; GeoIPOrg<span class=\"sy1\">.<\/span><span class=\"me1\">Name<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw3\">Copy<\/span><span class=\"br0\">&#40;<\/span>p<span class=\"sy1\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">,<\/span> StrLen<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GEOIP_SUCCESS<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> TGeoIP<span class=\"sy1\">.<\/span>_GetRegion<span class=\"br0\">&#40;<\/span>IPNum<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> GeoIPRegion<span class=\"sy1\">:<\/span> TGeoIPRegion<span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> TGeoIPResult<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; &nbsp;SeekRegion<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>FDatabaseType &lt;&gt; GEOIP_REGION_EDITION_REV0<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span> <span class=\"br0\">&#40;<\/span>FDatabaseType &lt;&gt; GEOIP_REGION_EDITION_REV1<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GEOIP_ERROR_DBTYPE<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Exit<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; SeekRegion <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> SeekRecord<span class=\"br0\">&#40;<\/span>IPNum<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> FDatabaseType <span class=\"sy3\">=<\/span> GEOIP_REGION_EDITION_REV0 <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ Region Edition, pre June 2003<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">Dec<\/span><span class=\"br0\">&#40;<\/span>SeekRegion<span class=\"sy1\">,<\/span> STATE_BEGIN_REV0<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> SeekRegion &gt;<span class=\"sy3\">=<\/span> <span class=\"nu0\">1000<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; GeoIPRegion<span class=\"sy1\">.<\/span><span class=\"me1\">CountryCode<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"st0\">'US'<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; GeoIPRegion<span class=\"sy1\">.<\/span><span class=\"me1\">Region<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw4\">AnsiString<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">Chr<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>SeekRegion <span class=\"sy3\">-<\/span> <span class=\"nu0\">1000<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">div<\/span> <span class=\"nu0\">26<\/span> <span class=\"sy3\">+<\/span> <span class=\"nu0\">65<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy3\">+<\/span> <span class=\"kw3\">Chr<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>SeekRegion <span class=\"sy3\">-<\/span> <span class=\"nu0\">1000<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">mod<\/span> <span class=\"nu0\">26<\/span> <span class=\"sy3\">+<\/span> <span class=\"nu0\">65<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; GeoIPRegion<span class=\"sy1\">.<\/span><span class=\"me1\">CountryCode<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> CountryCodes<span class=\"br0\">&#91;<\/span>SeekRegion<span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; GeoIPRegion<span class=\"sy1\">.<\/span><span class=\"me1\">Region<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"st0\">''<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><br \/>\n&nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span> FDatabaseType <span class=\"sy3\">=<\/span> GEOIP_REGION_EDITION_REV1 <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ Region Edition, post June 2003<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">Dec<\/span><span class=\"br0\">&#40;<\/span>SeekRegion<span class=\"sy1\">,<\/span> STATE_BEGIN_REV1<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> SeekRegion &lt; US_OFFSET <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Unknown<\/span><br \/>\n&nbsp; &nbsp; &nbsp; GeoIPRegion<span class=\"sy1\">.<\/span><span class=\"me1\">CountryCode<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"st0\">''<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; GeoIPRegion<span class=\"sy1\">.<\/span><span class=\"me1\">Region<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"st0\">''<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span> SeekRegion &lt; CANADA_OFFSET <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ USA State<\/span><br \/>\n&nbsp; &nbsp; &nbsp; GeoIPRegion<span class=\"sy1\">.<\/span><span class=\"me1\">CountryCode<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"st0\">'US'<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; GeoIPRegion<span class=\"sy1\">.<\/span><span class=\"me1\">Region<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw4\">AnsiString<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">Chr<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>SeekRegion <span class=\"sy3\">-<\/span> US_OFFSET<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">div<\/span> <span class=\"nu0\">26<\/span> <span class=\"sy3\">+<\/span> <span class=\"nu0\">65<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy3\">+<\/span> <span class=\"kw3\">Chr<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>SeekRegion <span class=\"sy3\">-<\/span> US_OFFSET<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">mod<\/span> <span class=\"nu0\">26<\/span> <span class=\"sy3\">+<\/span> <span class=\"nu0\">65<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span> SeekRegion &lt; WORLD_OFFSET <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Canada Province<\/span><br \/>\n&nbsp; &nbsp; &nbsp; GeoIPRegion<span class=\"sy1\">.<\/span><span class=\"me1\">CountryCode<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"st0\">'CA'<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; GeoIPRegion<span class=\"sy1\">.<\/span><span class=\"me1\">Region<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw4\">AnsiString<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">Chr<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>SeekRegion <span class=\"sy3\">-<\/span> CANADA_OFFSET<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">div<\/span> <span class=\"nu0\">26<\/span> <span class=\"sy3\">+<\/span> <span class=\"nu0\">65<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy3\">+<\/span> <span class=\"kw3\">Chr<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>SeekRegion <span class=\"sy3\">-<\/span> CANADA_OFFSET<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">mod<\/span> <span class=\"nu0\">26<\/span> <span class=\"sy3\">+<\/span> <span class=\"nu0\">65<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Not US or Canada<\/span><br \/>\n&nbsp; &nbsp; &nbsp; GeoIPRegion<span class=\"sy1\">.<\/span><span class=\"me1\">CountryCode<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> CountryCodes<span class=\"br0\">&#91;<\/span><span class=\"br0\">&#40;<\/span>SeekRegion <span class=\"sy3\">-<\/span> WORLD_OFFSET<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">div<\/span> FIPS_RANGE<span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; GeoIPRegion<span class=\"sy1\">.<\/span><span class=\"me1\">Region<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"st0\">''<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GEOIP_SUCCESS<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> TGeoIP<span class=\"sy1\">.<\/span><span class=\"me1\">AddrToNum<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">const<\/span> IPAddr<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; &nbsp;netlong<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;temp<span class=\"sy1\">:<\/span> <span class=\"kw4\">PAnsiChar<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\ntemp <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw4\">PAnsiChar<\/span><span class=\"br0\">&#40;<\/span>IPAddr<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; netlong <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> inet_addr<span class=\"br0\">&#40;<\/span>temp<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> netlong &lt;&gt; INADDR_NONE <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> ntohl<span class=\"br0\">&#40;<\/span>netlong<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> TGeoIP<span class=\"sy1\">.<\/span><span class=\"me1\">GetCity<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">const<\/span> IPAddr<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> GeoIPCity<span class=\"sy1\">:<\/span> TGeoIPCity<span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> TGeoIPResult<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; &nbsp;IPNum<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; IPNum <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> AddrToNum<span class=\"br0\">&#40;<\/span>IPAddr<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> IPNum <span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GEOIP_ERROR_IPADDR<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Exit<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> _GetCity<span class=\"br0\">&#40;<\/span>IPNum<span class=\"sy1\">,<\/span> GeoIPCity<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> TGeoIP<span class=\"sy1\">.<\/span><span class=\"me1\">GetCountry<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">const<\/span> IPAddr<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> GeoIPCountry<span class=\"sy1\">:<\/span> TGeoIPCountry<span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> TGeoIPResult<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; &nbsp;IPNum<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; IPNum <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> AddrToNum<span class=\"br0\">&#40;<\/span>IPAddr<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> IPNum <span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GEOIP_ERROR_IPADDR<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Exit<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> _GetCountry<span class=\"br0\">&#40;<\/span>IPNum<span class=\"sy1\">,<\/span> GeoIPCountry<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> TGeoIP<span class=\"sy1\">.<\/span><span class=\"me1\">GetDatabaseInfo<\/span><span class=\"sy1\">:<\/span> <span class=\"kw4\">string<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; &nbsp;i<span class=\"sy1\">:<\/span> <span class=\"kw4\">Integer<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;delim<span class=\"sy1\">:<\/span> <span class=\"kw1\">array<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"sy1\">..<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#93;<\/span> <span class=\"kw1\">of<\/span> <span class=\"kw4\">Byte<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;HasStructureInfo<span class=\"sy1\">:<\/span> <span class=\"kw4\">Boolean<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; FDatabaseInfo <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"st0\">''<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; HasStructureInfo <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw2\">False<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw3\">Seek<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy3\">-<\/span><span class=\"nu0\">3<\/span><span class=\"sy1\">,<\/span> soFromEnd<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">for<\/span> i<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span><span class=\"nu0\">0<\/span> <span class=\"kw1\">to<\/span> STRUCTURE_INFO_MAX_SIZE<span class=\"sy3\">-<\/span><span class=\"nu0\">1<\/span> <span class=\"kw1\">do<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw1\">Read<\/span><span class=\"br0\">&#40;<\/span>delim<span class=\"sy1\">,<\/span> <span class=\"nu0\">3<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>delim<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy3\">=<\/span> <span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span> <span class=\"br0\">&#40;<\/span>delim<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy3\">=<\/span> <span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span> <span class=\"br0\">&#40;<\/span>delim<span class=\"br0\">&#91;<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy3\">=<\/span> <span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; HasStructureInfo <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw2\">True<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; Break<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw3\">Seek<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy3\">-<\/span><span class=\"nu0\">4<\/span><span class=\"sy1\">,<\/span> soFromCurrent<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> HasStructureInfo <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw3\">Seek<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy3\">-<\/span><span class=\"nu0\">3<\/span><span class=\"sy1\">,<\/span> soFromCurrent<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ no structure info, must be pre Sep 2002 database, go back to end<\/span><br \/>\n&nbsp; &nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw3\">Seek<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy3\">-<\/span><span class=\"nu0\">3<\/span><span class=\"sy1\">,<\/span> soFromEnd<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">for<\/span> i<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span><span class=\"nu0\">0<\/span> <span class=\"kw1\">to<\/span> DATABASE_INFO_MAX_SIZE<span class=\"sy3\">-<\/span><span class=\"nu0\">1<\/span> <span class=\"kw1\">do<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw1\">Read<\/span><span class=\"br0\">&#40;<\/span>delim<span class=\"sy1\">,<\/span> <span class=\"nu0\">3<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>delim<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span> <span class=\"br0\">&#40;<\/span>delim<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span> <span class=\"br0\">&#40;<\/span>delim<span class=\"br0\">&#91;<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw3\">SetLength<\/span><span class=\"br0\">&#40;<\/span>FDatabaseInfo<span class=\"sy1\">,<\/span> i<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw1\">Read<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">PChar<\/span><span class=\"br0\">&#40;<\/span>FDatabaseInfo<span class=\"br0\">&#41;<\/span><span class=\"sy2\">^<\/span><span class=\"sy1\">,<\/span> i<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; Break<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw3\">Seek<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy3\">-<\/span><span class=\"nu0\">4<\/span><span class=\"sy1\">,<\/span> soFromCurrent<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> FDatabaseInfo<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> TGeoIP<span class=\"sy1\">.<\/span><span class=\"me1\">GetOrg<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">const<\/span> IPAddr<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> GeoIPOrg<span class=\"sy1\">:<\/span> TGeoIPOrg<span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> TGeoIPResult<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; &nbsp;IPNum<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; IPNum <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> AddrToNum<span class=\"br0\">&#40;<\/span>IPAddr<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> IPNum <span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GEOIP_ERROR_IPADDR<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Exit<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> _GetOrg<span class=\"br0\">&#40;<\/span>IPNum<span class=\"sy1\">,<\/span> GeoIPOrg<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> TGeoIP<span class=\"sy1\">.<\/span><span class=\"me1\">GetRegion<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">const<\/span> IPAddr<span class=\"sy1\">:<\/span> <span class=\"kw4\">ansistring<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> GeoIPRegion<span class=\"sy1\">:<\/span> TGeoIPRegion<span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> TGeoIPResult<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; &nbsp;IPNum<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; IPNum <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> AddrToNum<span class=\"br0\">&#40;<\/span>IPAddr<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> IPNum <span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GEOIP_ERROR_IPADDR<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Exit<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> _GetRegion<span class=\"br0\">&#40;<\/span>IPNum<span class=\"sy1\">,<\/span> GeoIPRegion<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TGeoIP<span class=\"sy1\">.<\/span><span class=\"me1\">InitDBFile<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; &nbsp;i<span class=\"sy1\">,<\/span>j<span class=\"sy1\">:<\/span> <span class=\"kw4\">Integer<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;delim<span class=\"sy1\">:<\/span> <span class=\"kw1\">array<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"sy1\">..<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#93;<\/span> <span class=\"kw1\">of<\/span> <span class=\"kw4\">Byte<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;buf<span class=\"sy1\">:<\/span> <span class=\"kw1\">array<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"sy1\">..<\/span><span class=\"me1\">SEGMENT_RECORD_LENGTH<\/span><span class=\"sy3\">-<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> <span class=\"kw1\">of<\/span> <span class=\"kw4\">Byte<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/ default to GeoIP Country Edition<\/span><br \/>\n&nbsp; FDatabaseType <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GEOIP_COUNTRY_EDITION<span class=\"sy1\">;<\/span><br \/>\n&nbsp; FRecordLength <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> STANDARD_RECORD_LENGTH<span class=\"sy1\">;<\/span><br \/>\n&nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw3\">Seek<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy3\">-<\/span><span class=\"nu0\">3<\/span><span class=\"sy1\">,<\/span> soFromEnd<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">for<\/span> i<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span><span class=\"nu0\">0<\/span> <span class=\"kw1\">to<\/span> STRUCTURE_INFO_MAX_SIZE<span class=\"sy3\">-<\/span><span class=\"nu0\">1<\/span> <span class=\"kw1\">do<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw1\">Read<\/span><span class=\"br0\">&#40;<\/span>delim<span class=\"sy1\">,<\/span> <span class=\"nu0\">3<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>delim<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy3\">=<\/span> <span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span> <span class=\"br0\">&#40;<\/span>delim<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy3\">=<\/span> <span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span> <span class=\"br0\">&#40;<\/span>delim<span class=\"br0\">&#91;<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy3\">=<\/span> <span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw1\">Read<\/span><span class=\"br0\">&#40;<\/span>FDatabaseType<span class=\"sy1\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"kw4\">Byte<\/span><span class=\"br0\">&#40;<\/span>FDatabaseType<span class=\"br0\">&#41;<\/span> &gt;<span class=\"sy3\">=<\/span> <span class=\"nu0\">106<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Backward compatibility with databases from April 2003 and earlier<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">Dec<\/span><span class=\"br0\">&#40;<\/span>FDatabaseType<span class=\"sy1\">,<\/span> <span class=\"nu0\">105<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> FDatabaseType <span class=\"sy3\">=<\/span> GEOIP_REGION_EDITION_REV0 <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Region Edition, pre June 2003<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">SetLength<\/span><span class=\"br0\">&#40;<\/span>FDatabaseSegments<span class=\"sy1\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; FDatabaseSegments<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> STATE_BEGIN_REV0<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">end<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span> FDatabaseType <span class=\"sy3\">=<\/span> GEOIP_REGION_EDITION_REV1 <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ Region Edition, post June 2003<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">SetLength<\/span><span class=\"br0\">&#40;<\/span>FDatabaseSegments<span class=\"sy1\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; FDatabaseSegments<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> STATE_BEGIN_REV1<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">end<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>FDatabaseType <span class=\"sy3\">=<\/span> GEOIP_CITY_EDITION_REV0<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">or<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#40;<\/span>FDatabaseType <span class=\"sy3\">=<\/span> GEOIP_CITY_EDITION_REV1<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">or<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#40;<\/span>FDatabaseType <span class=\"sy3\">=<\/span> GEOIP_ORG_EDITION<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">or<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#40;<\/span>FDatabaseType <span class=\"sy3\">=<\/span> GEOIP_ISP_EDITION<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">or<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#40;<\/span>FDatabaseType <span class=\"sy3\">=<\/span> GEOIP_ASNUM_EDITION<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"co1\">\/\/ City\/Org Editions have two segments, read offset of second segment<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">SetLength<\/span><span class=\"br0\">&#40;<\/span>FDatabaseSegments<span class=\"sy1\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; FDatabaseSegments<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw1\">Read<\/span><span class=\"br0\">&#40;<\/span>buf<span class=\"sy1\">,<\/span> SEGMENT_RECORD_LENGTH<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">for<\/span> j<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span><span class=\"nu0\">0<\/span> <span class=\"kw1\">to<\/span> SEGMENT_RECORD_LENGTH<span class=\"sy3\">-<\/span><span class=\"nu0\">1<\/span> <span class=\"kw1\">do<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">Inc<\/span><span class=\"br0\">&#40;<\/span>FDatabaseSegments<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy1\">,<\/span> <span class=\"kw4\">Integer<\/span><span class=\"br0\">&#40;<\/span>buf<span class=\"br0\">&#91;<\/span>j<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">shl<\/span> <span class=\"br0\">&#40;<\/span>j<span class=\"sy3\">*<\/span><span class=\"nu0\">8<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>FDatabaseType <span class=\"sy3\">=<\/span> GEOIP_ORG_EDITION<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">or<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#40;<\/span>FDatabaseType <span class=\"sy3\">=<\/span> GEOIP_ISP_EDITION<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FRecordLength <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> ORG_RECORD_LENGTH<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; Break<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw3\">Seek<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy3\">-<\/span><span class=\"nu0\">4<\/span><span class=\"sy1\">,<\/span> soFromCurrent<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>FDatabaseType <span class=\"sy3\">=<\/span> GEOIP_COUNTRY_EDITION<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">or<\/span><br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"br0\">&#40;<\/span>FDatabaseType <span class=\"sy3\">=<\/span> GEOIP_PROXY_EDITION<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">SetLength<\/span><span class=\"br0\">&#40;<\/span>FDatabaseSegments<span class=\"sy1\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; FDatabaseSegments<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> COUNTRY_BEGIN<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TGeoIP<span class=\"sy1\">.<\/span><span class=\"me1\">InitRegions<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; f<span class=\"sy1\">,<\/span>t<span class=\"sy1\">,<\/span>loop<span class=\"sy1\">:<\/span> <span class=\"kw4\">Integer<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; slRegions <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> TStringList<span class=\"sy1\">.<\/span><span class=\"me1\">Create<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; f <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw3\">Low<\/span><span class=\"br0\">&#40;<\/span>RegionNames<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; t <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw3\">High<\/span><span class=\"br0\">&#40;<\/span>RegionNames<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"kw1\">for<\/span> loop <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> f <span class=\"kw1\">to<\/span> t <span class=\"kw1\">do<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; slRegions<span class=\"sy1\">.<\/span><span class=\"me1\">Add<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">string<\/span><span class=\"br0\">&#40;<\/span>RegionNames<span class=\"br0\">&#91;<\/span>loop<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> TGeoIP<span class=\"sy1\">.<\/span><span class=\"me1\">SeekRecord<\/span><span class=\"br0\">&#40;<\/span>IPNum<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; &nbsp;depth<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;offset<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;i<span class=\"sy1\">,<\/span>j<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;x<span class=\"sy1\">:<\/span> <span class=\"kw1\">array<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"sy1\">..<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> <span class=\"kw1\">of<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;y<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;buf<span class=\"sy1\">:<\/span> <span class=\"kw1\">array<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"sy1\">..<\/span><span class=\"nu0\">2<\/span><span class=\"sy3\">*<\/span>MAX_RECORD_LENGTH<span class=\"sy3\">-<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> <span class=\"kw1\">of<\/span> <span class=\"kw4\">Byte<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; offset <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">for<\/span> depth<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span><span class=\"nu0\">31<\/span> <span class=\"kw1\">downto<\/span> <span class=\"nu0\">0<\/span> <span class=\"kw1\">do<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw3\">Seek<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">2<\/span> <span class=\"sy3\">*<\/span> FRecordLength <span class=\"sy3\">*<\/span> offset<span class=\"sy1\">,<\/span> soFromBeginning<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; FInputFile<span class=\"sy1\">.<\/span><span class=\"kw1\">Read<\/span><span class=\"br0\">&#40;<\/span>buf<span class=\"sy1\">,<\/span> <span class=\"nu0\">2<\/span> <span class=\"sy3\">*<\/span> FRecordLength<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span> i<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span><span class=\"nu0\">0<\/span> <span class=\"kw1\">to<\/span> <span class=\"nu0\">1<\/span> <span class=\"kw1\">do<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; x<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">for<\/span> j<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span><span class=\"nu0\">0<\/span> <span class=\"kw1\">to<\/span> FRecordLength<span class=\"sy3\">-<\/span><span class=\"nu0\">1<\/span> <span class=\"kw1\">do<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; y <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> buf<span class=\"br0\">&#91;<\/span>i<span class=\"sy3\">*<\/span>FRecordLength<span class=\"sy3\">+<\/span>j<span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; x<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> x<span class=\"br0\">&#91;<\/span>i<span class=\"br0\">&#93;<\/span> <span class=\"sy3\">+<\/span> <span class=\"br0\">&#40;<\/span>y <span class=\"kw1\">shl<\/span> <span class=\"br0\">&#40;<\/span>j<span class=\"sy3\">*<\/span><span class=\"nu0\">8<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>IPNum <span class=\"kw1\">and<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span> <span class=\"kw1\">shl<\/span> depth<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> &lt;&gt; <span class=\"nu0\">0<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> x<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> &gt;<span class=\"sy3\">=<\/span> FDatabaseSegments<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> x<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Exit<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">end<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Offset <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> x<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> x<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span> &gt;<span class=\"sy3\">=<\/span> FDatabaseSegments<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> x<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Exit<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">end<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Offset <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> x<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">.<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p><!--nextpage--><br \/>\nLe fichier <a title=\"Enregistrez la cible du lien\" href=\"\/whiler\/wp-content\/uploads\/2009\/10\/main.pas\">main.pas<\/a>, exemple d&rsquo;utilisation :<\/p>\n<div class=\"codecolorer-container delphi dawn\" style=\"overflow:auto;white-space:nowrap;width:480px;height:300px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/>64<br \/>65<br \/>66<br \/>67<br \/>68<br \/>69<br \/>70<br \/>71<br \/>72<br \/>73<br \/>74<br \/>75<br \/>76<br \/>77<br \/>78<br \/>79<br \/>80<br \/>81<br \/>82<br \/>83<br \/>84<br \/>85<br \/>86<br \/>87<br \/>88<br \/>89<br \/>90<br \/>91<br \/>92<br \/>93<br \/>94<br \/>95<br \/>96<br \/>97<br \/>98<br \/>99<br \/>100<br \/>101<br \/>102<br \/>103<br \/>104<br \/>105<br \/>106<br \/>107<br \/>108<br \/>109<br \/>110<br \/>111<br \/>112<br \/>113<br \/>114<br \/>115<br \/>116<br \/>117<br \/>118<br \/>119<br \/>120<br \/>121<br \/>122<br \/>123<br \/>124<br \/>125<br \/>126<br \/>127<br \/>128<br \/>129<br \/>130<br \/>131<br \/>132<br \/>133<br \/>134<br \/>135<br \/>136<br \/>137<br \/>138<br \/>139<br \/>140<br \/>141<br \/>142<br \/>143<br \/>144<br \/>145<br \/>146<br \/>147<br \/>148<br \/>149<br \/>150<br \/>151<br \/>152<br \/>153<br \/>154<br \/>155<br \/>156<br \/>157<br \/>158<br \/>159<br \/>160<br \/>161<br \/>162<br \/>163<br \/>164<br \/>165<br \/>166<br \/>167<br \/>168<br \/>169<br \/>170<br \/>171<br \/>172<br \/>173<br \/>174<br \/>175<br \/>176<br \/>177<br \/>178<br \/>179<br \/>180<br \/>181<br \/>182<br \/>183<br \/>184<br \/>185<br \/>186<br \/>187<br \/>188<br \/>189<br \/>190<br \/>191<br \/>192<br \/>193<br \/>194<br \/>195<br \/>196<br \/>197<br \/>198<br \/>199<br \/>200<br \/>201<br \/>202<br \/>203<br \/>204<br \/>205<br \/>206<br \/>207<br \/>208<br \/>209<br \/>210<br \/>211<br \/>212<br \/>213<br \/>214<br \/>215<br \/>216<br \/>217<br \/>218<br \/>219<br \/>220<br \/>221<br \/>222<br \/>223<br \/>224<br \/>225<br \/>226<br \/>227<br \/>228<br \/>229<br \/>230<br \/>231<br \/>232<br \/>233<br \/>234<br \/><\/div><\/td><td><div class=\"delphi codecolorer\"><span class=\"kw1\">unit<\/span> main<span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">interface<\/span><br \/>\n<br \/>\n<span class=\"kw1\">uses<\/span><br \/>\n&nbsp; Windows<span class=\"sy1\">,<\/span> Messages<span class=\"sy1\">,<\/span> SysUtils<span class=\"sy1\">,<\/span> Variants<span class=\"sy1\">,<\/span> Classes<span class=\"sy1\">,<\/span> Graphics<span class=\"sy1\">,<\/span> Controls<span class=\"sy1\">,<\/span> Forms<span class=\"sy1\">,<\/span><br \/>\n&nbsp; Dialogs<span class=\"sy1\">,<\/span> StdCtrls<span class=\"sy1\">,<\/span> ExtCtrls<span class=\"sy1\">,<\/span> jpeg<span class=\"sy1\">,<\/span> GeoIP<span class=\"sy1\">,<\/span> Math<span class=\"sy1\">,<\/span> WinSock<span class=\"sy1\">,<\/span> Buttons<span class=\"sy1\">,<\/span> ShellAPI<span class=\"sy1\">,<\/span> Clipbrd<span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">const<\/span><br \/>\n&nbsp; DOWNLOAD_URL <span class=\"sy3\">=<\/span> <span class=\"st0\">'https:\/\/geolite.maxmind.com\/download\/geoip\/database\/GeoLiteCity.dat.gz'<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; MAP_URL &nbsp; &nbsp; &nbsp;<span class=\"sy3\">=<\/span> <span class=\"st0\">'https:\/\/blogs.wittwer.fr\/whiler\/visitors\/'<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; BORDERS &nbsp; &nbsp; &nbsp;<span class=\"sy3\">=<\/span> clYellow<span class=\"sy1\">;<\/span><br \/>\n&nbsp; MIDDLE &nbsp; &nbsp; &nbsp; <span class=\"sy3\">=<\/span> clRed<span class=\"sy1\">;<\/span><br \/>\n&nbsp; NOT_DEFINED &nbsp;<span class=\"sy3\">=<\/span> <span class=\"nu0\">4<\/span><span class=\"sy1\">;<\/span> &nbsp; &nbsp;<span class=\"co1\">\/\/ &gt; Pi<\/span><br \/>\n&nbsp; EARTH_RADIUS <span class=\"sy3\">=<\/span> <span class=\"nu0\">6378<\/span><span class=\"sy1\">;<\/span> <span class=\"co1\">\/\/ Rayon \u00e9quatorial : 6 378,137<\/span><br \/>\n<br \/>\n<span class=\"kw1\">type<\/span><br \/>\n&nbsp; TfrmMain <span class=\"sy3\">=<\/span> <span class=\"kw1\">class<\/span><span class=\"br0\">&#40;<\/span>TForm<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; btnGetLocation<span class=\"sy1\">:<\/span> TButton<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; lbledtIP<span class=\"sy1\">:<\/span> TLabeledEdit<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; grpLocation<span class=\"sy1\">:<\/span> TGroupBox<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; imgMap<span class=\"sy1\">:<\/span> TImage<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; lbledtCountry<span class=\"sy1\">:<\/span> TLabeledEdit<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; lbledtCity<span class=\"sy1\">:<\/span> TLabeledEdit<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; lbledtRegion<span class=\"sy1\">:<\/span> TLabeledEdit<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; bbtnrefreshImage<span class=\"sy1\">:<\/span> TBitBtn<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; bbtnMaxMind<span class=\"sy1\">:<\/span> TBitBtn<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; bbtnMap<span class=\"sy1\">:<\/span> TBitBtn<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; bbtnDistance<span class=\"sy1\">:<\/span> TBitBtn<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; lblDistance<span class=\"sy1\">:<\/span> TLabel<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; mmoIPs<span class=\"sy1\">:<\/span> TMemo<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; bbtnMapToClipboard<span class=\"sy1\">:<\/span> TBitBtn<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">procedure<\/span> btnGetLocationClick<span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">procedure<\/span> FormDestroy<span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">procedure<\/span> lbledtIPChange<span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">procedure<\/span> bbtnrefreshImageClick<span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">procedure<\/span> FormCreate<span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">procedure<\/span> bbtnMaxMindClick<span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">procedure<\/span> bbtnMapClick<span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">procedure<\/span> lbledtIPDblClick<span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">procedure<\/span> bbtnMapToClipboardClick<span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">private<\/span><br \/>\n&nbsp; &nbsp; <span class=\"coMULTI\">{ D\u00e9clarations priv\u00e9es }<\/span><br \/>\n&nbsp; &nbsp;GeoIP<span class=\"sy1\">:<\/span> TGeoIP<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;bDefaultMap<span class=\"sy1\">:<\/span> TBitmap<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;dPreviousLongitude <span class=\"sy1\">:<\/span> <span class=\"kw4\">Double<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;dPreviousLatitude &nbsp;<span class=\"sy1\">:<\/span> <span class=\"kw4\">Double<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">function<\/span> &nbsp;GetLocation<span class=\"br0\">&#40;<\/span>sIP<span class=\"sy1\">:<\/span> <span class=\"kw4\">AnsiString<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> <span class=\"kw4\">Boolean<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">procedure<\/span> DrawPin<span class=\"br0\">&#40;<\/span>dLongitude<span class=\"sy1\">,<\/span> dLatitude<span class=\"sy1\">:<\/span> <span class=\"kw4\">Double<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">procedure<\/span> CalculateDistance<span class=\"br0\">&#40;<\/span>dLongitude<span class=\"sy1\">,<\/span> dLatitude<span class=\"sy1\">:<\/span> <span class=\"kw4\">Double<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">function<\/span> &nbsp;CheckIP<span class=\"br0\">&#40;<\/span>sIP<span class=\"sy1\">:<\/span> <span class=\"kw4\">string<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> <span class=\"kw4\">Boolean<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">public<\/span><br \/>\n&nbsp; &nbsp; <span class=\"coMULTI\">{ D\u00e9clarations publiques }<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; frmMain<span class=\"sy1\">:<\/span> TfrmMain<span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">implementation<\/span><br \/>\n<br \/>\n<span class=\"co2\">{$R *.dfm}<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TfrmMain<span class=\"sy1\">.<\/span><span class=\"me1\">bbtnMapClick<\/span><span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; ShellExecute<span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"sy1\">,<\/span> <span class=\"st0\">'open'<\/span><span class=\"sy1\">,<\/span> <span class=\"kw4\">PChar<\/span><span class=\"br0\">&#40;<\/span>MAP_URL<span class=\"br0\">&#41;<\/span><span class=\"sy1\">,<\/span> <span class=\"kw1\">nil<\/span><span class=\"sy1\">,<\/span> <span class=\"kw1\">nil<\/span><span class=\"sy1\">,<\/span> SW_SHOWNORMAL<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TfrmMain<span class=\"sy1\">.<\/span><span class=\"me1\">bbtnMapToClipboardClick<\/span><span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; Clipboard<span class=\"sy1\">.<\/span><span class=\"me1\">Assign<\/span><span class=\"br0\">&#40;<\/span>imgMap<span class=\"sy1\">.<\/span><span class=\"me1\">Picture<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Bitmap<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; MessageDlg<span class=\"br0\">&#40;<\/span><span class=\"st0\">'Carte copi\u00e9e dans le presse-papier.'<\/span><span class=\"sy1\">,<\/span> &nbsp;mtInformation<span class=\"sy1\">,<\/span> <span class=\"br0\">&#91;<\/span>mbOK<span class=\"br0\">&#93;<\/span><span class=\"sy1\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TfrmMain<span class=\"sy1\">.<\/span><span class=\"me1\">bbtnMaxMindClick<\/span><span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; ShellExecute<span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"sy1\">,<\/span> <span class=\"st0\">'open'<\/span><span class=\"sy1\">,<\/span> <span class=\"kw4\">PChar<\/span><span class=\"br0\">&#40;<\/span>DOWNLOAD_URL<span class=\"br0\">&#41;<\/span><span class=\"sy1\">,<\/span> <span class=\"kw1\">nil<\/span><span class=\"sy1\">,<\/span> <span class=\"kw1\">nil<\/span><span class=\"sy1\">,<\/span> SW_SHOWNORMAL<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TfrmMain<span class=\"sy1\">.<\/span><span class=\"me1\">bbtnrefreshImageClick<\/span><span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; imgMap<span class=\"sy1\">.<\/span><span class=\"me1\">Refresh<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; imgMap<span class=\"sy1\">.<\/span><span class=\"me1\">Picture<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Assign<\/span><span class=\"br0\">&#40;<\/span>bDefaultMap<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TfrmMain<span class=\"sy1\">.<\/span><span class=\"me1\">btnGetLocationClick<\/span><span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; sIP<span class=\"sy1\">:<\/span> &nbsp; <span class=\"kw4\">AnsiString<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; iLoop<span class=\"sy1\">,<\/span> iMax<span class=\"sy1\">:<\/span> <span class=\"kw4\">Integer<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>mmoIPs<span class=\"sy1\">.<\/span><span class=\"me1\">Visible<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; iMax <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> mmoIPs<span class=\"sy1\">.<\/span><span class=\"me1\">Lines<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Count<\/span> <span class=\"sy3\">-<\/span> <span class=\"nu0\">1<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">for<\/span> iLoop <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span> <span class=\"kw1\">to<\/span> iMax <span class=\"kw1\">do<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; sIP <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw4\">AnsiString<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">Trim<\/span><span class=\"br0\">&#40;<\/span>mmoIPs<span class=\"sy1\">.<\/span><span class=\"me1\">Lines<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; GetLocation<span class=\"br0\">&#40;<\/span>sIP<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; mmoIPs<span class=\"sy1\">.<\/span><span class=\"me1\">Lines<\/span><span class=\"sy1\">.<\/span><span class=\"kw3\">Delete<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; mmoIPs<span class=\"sy1\">.<\/span><span class=\"me1\">Visible<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw2\">False<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><br \/>\n&nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; sIP <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw4\">AnsiString<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">Trim<\/span><span class=\"br0\">&#40;<\/span>lbledtIP<span class=\"sy1\">.<\/span><span class=\"me1\">Text<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; GetLocation<span class=\"br0\">&#40;<\/span>sIP<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TfrmMain<span class=\"sy1\">.<\/span><span class=\"me1\">CalculateDistance<\/span><span class=\"br0\">&#40;<\/span>dLongitude<span class=\"sy1\">,<\/span> dLatitude<span class=\"sy1\">:<\/span> <span class=\"kw4\">Double<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">function<\/span> ArcCosWithZero<span class=\"br0\">&#40;<\/span>dValue<span class=\"sy1\">:<\/span> <span class=\"kw4\">Double<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> <span class=\"kw4\">Double<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">var<\/span><br \/>\n&nbsp; &nbsp; dCheck<span class=\"sy1\">:<\/span> <span class=\"kw4\">Double<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; dCheck <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw3\">sqrt<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy3\">-<\/span>dValue<span class=\"sy3\">*<\/span>dValue<span class=\"sy3\">+<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>dCheck <span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; &nbsp; dCheck <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0.0000000001<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"sy3\">-<\/span><span class=\"kw3\">ArcTan<\/span><span class=\"br0\">&#40;<\/span>dValue <span class=\"sy3\">\/<\/span> dCheck<span class=\"br0\">&#41;<\/span> <span class=\"sy3\">+<\/span> <span class=\"br0\">&#40;<\/span>Pi <span class=\"sy3\">\/<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; dDistance <span class=\"sy1\">:<\/span> <span class=\"kw4\">Double<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/ Degr\u00e9s en radians<\/span><br \/>\n&nbsp; dLongitude <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> dLongitude <span class=\"sy3\">\/<\/span> <span class=\"nu0\">180<\/span> <span class=\"sy3\">*<\/span> Pi<span class=\"sy1\">;<\/span><br \/>\n&nbsp; dLatitude &nbsp;<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> dLatitude &nbsp;<span class=\"sy3\">\/<\/span> <span class=\"nu0\">180<\/span> <span class=\"sy3\">*<\/span> Pi<span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>dPreviousLongitude &lt;&gt; NOT_DEFINED<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span> <span class=\"br0\">&#40;<\/span>dPreviousLatitude &lt;&gt; NOT_DEFINED<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/Distance = Rayon * | arccos[ sin(LatA).sin(LatB)+cos(LatA).cos(LatB).cos(LonA-LonB) ] |<\/span><br \/>\n&nbsp; &nbsp; <span class=\"co1\">\/\/ Rayon \u00e9quatorial : 6 378,137<\/span><br \/>\n&nbsp; &nbsp; dDistance <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> EARTH_RADIUS <span class=\"sy3\">*<\/span> ArcCosWithZero<span class=\"br0\">&#40;<\/span><span class=\"kw3\">Sin<\/span><span class=\"br0\">&#40;<\/span>dPreviousLatitude<span class=\"br0\">&#41;<\/span><span class=\"sy3\">*<\/span><span class=\"kw3\">Sin<\/span><span class=\"br0\">&#40;<\/span>dLatitude<span class=\"br0\">&#41;<\/span><span class=\"sy3\">+<\/span><span class=\"kw3\">Cos<\/span><span class=\"br0\">&#40;<\/span>dPreviousLatitude<span class=\"br0\">&#41;<\/span><span class=\"sy3\">*<\/span><span class=\"kw3\">Cos<\/span><span class=\"br0\">&#40;<\/span>dLatitude<span class=\"br0\">&#41;<\/span><span class=\"sy3\">*<\/span><span class=\"kw3\">Cos<\/span><span class=\"br0\">&#40;<\/span>dPreviousLongitude <span class=\"sy3\">-<\/span> dLongitude<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; lblDistance<span class=\"sy1\">.<\/span><span class=\"me1\">Caption<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw3\">Format<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'Distance entre les deux derni\u00e8res adresses IPs : %8.2f km'<\/span><span class=\"sy1\">,<\/span> <span class=\"br0\">&#91;<\/span>dDistance<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; dPreviousLongitude <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> dLongitude<span class=\"sy1\">;<\/span><br \/>\n&nbsp; dPreviousLatitude &nbsp;<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> dLatitude<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> TfrmMain<span class=\"sy1\">.<\/span><span class=\"me1\">CheckIP<\/span><span class=\"br0\">&#40;<\/span>sIP<span class=\"sy1\">:<\/span> <span class=\"kw4\">string<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> <span class=\"kw4\">Boolean<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; &nbsp;netlong<span class=\"sy1\">:<\/span> <span class=\"kw4\">Cardinal<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; netlong <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> inet_addr<span class=\"br0\">&#40;<\/span><span class=\"kw4\">PAnsiChar<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">AnsiString<\/span><span class=\"br0\">&#40;<\/span>sIP<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; Result &nbsp;<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"br0\">&#40;<\/span>netlong &lt;&gt; INADDR_NONE<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TfrmMain<span class=\"sy1\">.<\/span><span class=\"me1\">DrawPin<\/span><span class=\"br0\">&#40;<\/span>dLongitude<span class=\"sy1\">,<\/span> dLatitude<span class=\"sy1\">:<\/span> <span class=\"kw4\">Double<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">const<\/span><br \/>\n&nbsp; scale <span class=\"sy3\">=<\/span> <span class=\"nu0\">0.5625<\/span><span class=\"sy1\">;<\/span> <span class=\"co1\">\/\/(360 \/ Largeur|width Image);<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; pin<span class=\"sy1\">:<\/span> TPoint<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>dLongitude &lt;&gt; <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span> <span class=\"br0\">&#40;<\/span>dLatitude &lt;&gt; <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; pin<span class=\"sy1\">.<\/span><span class=\"me1\">X<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw3\">Floor<\/span><span class=\"br0\">&#40;<\/span> <span class=\"br0\">&#40;<\/span>dLongitude <span class=\"sy3\">+<\/span> <span class=\"nu0\">180<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy3\">\/<\/span> scale <span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; pin<span class=\"sy1\">.<\/span><span class=\"me1\">Y<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw3\">Floor<\/span><span class=\"br0\">&#40;<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">90<\/span> <span class=\"sy3\">-<\/span> dLatitude<span class=\"br0\">&#41;<\/span> &nbsp; <span class=\"sy3\">\/<\/span> scale <span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">with<\/span> imgMap<span class=\"sy1\">.<\/span><span class=\"me1\">Canvas<\/span> <span class=\"kw1\">do<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">with<\/span> pin <span class=\"kw1\">do<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Pixels<span class=\"br0\">&#91;<\/span>X &nbsp; &nbsp;<span class=\"sy1\">,<\/span> Y &nbsp; &nbsp;<span class=\"br0\">&#93;<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> MIDDLE<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Pixels<span class=\"br0\">&#91;<\/span>X <span class=\"sy3\">-<\/span> <span class=\"nu0\">1<\/span><span class=\"sy1\">,<\/span> Y &nbsp; &nbsp;<span class=\"br0\">&#93;<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> BORDERS<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Pixels<span class=\"br0\">&#91;<\/span>X <span class=\"sy3\">+<\/span> <span class=\"nu0\">1<\/span><span class=\"sy1\">,<\/span> Y &nbsp; &nbsp;<span class=\"br0\">&#93;<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> BORDERS<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Pixels<span class=\"br0\">&#91;<\/span>X &nbsp; &nbsp;<span class=\"sy1\">,<\/span> Y <span class=\"sy3\">-<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> BORDERS<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Pixels<span class=\"br0\">&#91;<\/span>X &nbsp; &nbsp;<span class=\"sy1\">,<\/span> Y <span class=\"sy3\">+<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> BORDERS<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TfrmMain<span class=\"sy1\">.<\/span><span class=\"me1\">FormCreate<\/span><span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; dPreviousLongitude <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> NOT_DEFINED<span class=\"sy1\">;<\/span><br \/>\n&nbsp; dPreviousLatitude &nbsp;<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> NOT_DEFINED<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/ Save initial bitmap<\/span><br \/>\n&nbsp; bDefaultMap <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> TBitmap<span class=\"sy1\">.<\/span><span class=\"me1\">Create<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">with<\/span> bDefaultMap <span class=\"kw1\">do<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; Width &nbsp;<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">640<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Height <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">320<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Assign<span class=\"br0\">&#40;<\/span>imgMap<span class=\"sy1\">.<\/span><span class=\"me1\">Picture<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Bitmap<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TfrmMain<span class=\"sy1\">.<\/span><span class=\"me1\">FormDestroy<\/span><span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"kw3\">Assigned<\/span><span class=\"br0\">&#40;<\/span>GeoIP<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; GeoIP<span class=\"sy1\">.<\/span><span class=\"me1\">Free<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"kw3\">Assigned<\/span><span class=\"br0\">&#40;<\/span>bDefaultMap<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; bDefaultMap<span class=\"sy1\">.<\/span><span class=\"me1\">Free<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> TfrmMain<span class=\"sy1\">.<\/span><span class=\"me1\">GetLocation<\/span><span class=\"br0\">&#40;<\/span>sIP<span class=\"sy1\">:<\/span> <span class=\"kw4\">AnsiString<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> <span class=\"kw4\">Boolean<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; &nbsp;GeoIPCity<span class=\"sy1\">:<\/span> TGeoIPCity<span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"kw1\">not<\/span> <span class=\"kw3\">Assigned<\/span><span class=\"br0\">&#40;<\/span>GeoIP<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; GeoIP <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> TGeoIP<span class=\"sy1\">.<\/span><span class=\"me1\">Create<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'GeoLiteCity.dat'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"br0\">&#40;<\/span>GeoIP<span class=\"sy1\">.<\/span><span class=\"me1\">GetCity<\/span><span class=\"br0\">&#40;<\/span>sIP<span class=\"sy1\">,<\/span> GeoIPCity<span class=\"br0\">&#41;<\/span> <span class=\"sy3\">=<\/span> GEOIP_SUCCESS<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>Result<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; lbledtCountry<span class=\"sy1\">.<\/span><span class=\"me1\">Text<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw4\">string<\/span><span class=\"br0\">&#40;<\/span>GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">CountryName<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; lbledtRegion<span class=\"sy1\">.<\/span><span class=\"me1\">Text<\/span> &nbsp;<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw4\">string<\/span><span class=\"br0\">&#40;<\/span>GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Region<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; lbledtCity<span class=\"sy1\">.<\/span><span class=\"me1\">Text<\/span> &nbsp; &nbsp;<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw4\">string<\/span><span class=\"br0\">&#40;<\/span>GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">City<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; DrawPin<span class=\"br0\">&#40;<\/span>GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Longitude<\/span><span class=\"sy1\">,<\/span> GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Latitude<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; CalculateDistance<span class=\"br0\">&#40;<\/span>GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Longitude<\/span><span class=\"sy1\">,<\/span> GeoIPCity<span class=\"sy1\">.<\/span><span class=\"me1\">Latitude<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><br \/>\n&nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; lbledtCountry<span class=\"sy1\">.<\/span><span class=\"me1\">Text<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"st0\">''<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; lbledtRegion<span class=\"sy1\">.<\/span><span class=\"me1\">Text<\/span> &nbsp;<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"st0\">'Erreur'<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; lbledtCity<span class=\"sy1\">.<\/span><span class=\"me1\">Text<\/span> &nbsp; &nbsp;<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"st0\">''<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TfrmMain<span class=\"sy1\">.<\/span><span class=\"me1\">lbledtIPChange<\/span><span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; <span class=\"kw1\">with<\/span> lbledtIP <span class=\"kw1\">do<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> CheckIP<span class=\"br0\">&#40;<\/span>Text<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; &nbsp; Font<span class=\"sy1\">.<\/span><span class=\"me1\">Color<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> clBlue<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; &nbsp; &nbsp; Font<span class=\"sy1\">.<\/span><span class=\"me1\">Color<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> clRed<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TfrmMain<span class=\"sy1\">.<\/span><span class=\"me1\">lbledtIPDblClick<\/span><span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; mmoIPs<span class=\"sy1\">.<\/span><span class=\"me1\">Text<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> lbledtIP<span class=\"sy1\">.<\/span><span class=\"me1\">Text<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; mmoIPs<span class=\"sy1\">.<\/span><span class=\"me1\">Visible<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw2\">True<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">.<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p><!--nextpage--><br \/>\nLa fiche <a title=\"Enregistrez la cible du lien\" href=\"\/whiler\/wp-content\/uploads\/2009\/10\/GeoIP.dfm\">main.dfm<\/a>&nbsp;:<br \/>\n<div id=\"attachment_753\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a title=\"La fiche\" href=\"\/whiler\/wp-content\/uploads\/2009\/10\/geoip-form1.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-753\" src=\"\/whiler\/wp-content\/uploads\/2009\/10\/geoip-form1-300x206.jpg\" alt=\"La fiche\" title=\"Cliquer pour agrandir\" width=\"300\" height=\"206\" class=\"size-medium wp-image-753\" srcset=\"https:\/\/blogs.wittwer.fr\/whiler\/wp-content\/uploads\/2009\/10\/geoip-form1-300x206.jpg 300w, https:\/\/blogs.wittwer.fr\/whiler\/wp-content\/uploads\/2009\/10\/geoip-form1.jpg 711w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-753\" class=\"wp-caption-text\">La fiche<\/p><\/div><\/p>\n<p>Si vous voulez directement tester l&rsquo;application compil\u00e9e&nbsp;: <a title=\"Enregistrez la cible du lien\" href=\"\/whiler\/wp-content\/uploads\/2009\/10\/WGeoIP.exe\">WGeoIP.exe<\/a> Il faudra simplement t\u00e9l\u00e9charger la base de donn\u00e9es de g\u00e9olocalisation et l&rsquo;extraire dans le m\u00eame r\u00e9pertoire (Un lien est int\u00e9gr\u00e9 \u00e0 l&rsquo;application pour le t\u00e9l\u00e9chargement).<\/p>\n<p>Vous pouvez, si vous le souhaitez, t\u00e9l\u00e9charger l&rsquo;ensemble des fichier \u00e0 partir d&rsquo;ici&nbsp;: <a title=\"Enregistrez la cible du lien\" href=\"\/whiler\/wp-content\/uploads\/2009\/10\/geoip.zip\">geoip.zip<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>MaxMind fournit des bases de donn\u00e9es de g\u00e9olocalisationW, dont GeoLite City, qui est gratuit et permet de localiser g\u00e9ographiquement une adresse IP.<br \/>\n[&#8230;]<\/p>\n<p>Une API pour Delphi est disponible, mais celle-ci, au jour d\u2019aujourd\u2019hui, n\u2019a pas encore \u00e9t\u00e9 port\u00e9e sous Delphi 2009, la premi\u00e8re version Unicode qui introduit des nouveaux types de cha\u00eenes de caract\u00e8res dans ce langage, et engendre une erreur avec l\u2019API telle qu\u2019elle est fournie.<\/p>\n<p>Je suis donc parti de l\u2019API fournie, et j\u2019ai chang\u00e9 quelques types, cast\u00e9 quelques variables, et supprim\u00e9 ainsi tous les warnings que j\u2019obtenais\u2026 <\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"categories":[7,6],"tags":[122,15,27,154,43,119,120,118,108,121],"class_list":["post-557","post","type-post","status-publish","format-standard","hentry","category-delphi","category-dev","tag-122","tag-api","tag-coloration-syntaxique","tag-delphi","tag-donnees","tag-geolite","tag-localisation","tag-maxmind","tag-script","tag-unicode"],"_links":{"self":[{"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/posts\/557","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/comments?post=557"}],"version-history":[{"count":1,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/posts\/557\/revisions"}],"predecessor-version":[{"id":6409,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/posts\/557\/revisions\/6409"}],"wp:attachment":[{"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/media?parent=557"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/categories?post=557"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/tags?post=557"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}