Advertisement
Guest User

Untitled

a guest
Apr 7th, 2017
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. EnableExplicit
  2.  
  3. ;Original Code ==> https://github.com/maxmind/geoip-api-c
  4. ;GeoIP Demo By Celtic88 2016(c) v: 1.1 new update 2017 add support for ipv6
  5. ;For full code contact me in skype :celtic906
  6.  
  7. Structure in6_addr
  8.   StructureUnion
  9.     u_char.b[16];
  10.     u_short.w[8];
  11.   EndStructureUnion
  12. EndStructure
  13.  
  14. Import "Ws2_32.lib"
  15.   inet_pton.l(Family.l,pszAddrString.p-ascii,*pAddrBuf.in6_addr); https://msdn.microsoft.com/en-us/library/windows/desktop/cc805844(v=vs.85).aspx
  16. EndImport
  17. ;For linux here http://man7.org/linux/man-pages/man3/inet_pton.3.html
  18. ;Mac x https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/inet_pton.3.html
  19.  
  20. ;http://www.minocacorp.com/doc/820/file/apps/inc/libc/netinet/in.h/
  21. Macro IN6_IS_ADDR_LOOPBACK(adr)
  22.   ((adr\u_short[0] = 0) And (adr\u_short[1] = 0) And (adr\u_short[2] = 0) And (adr\u_short[3] = 0) And (adr\u_short[4] = 0) And (adr\u_short[5] = 0) And (adr\u_short[6] = 0) And (adr\u_short[7] = $0100))
  23. EndMacro
  24.  
  25. Macro IN6_IS_ADDR_LINKLOCAL(adr)
  26.   ((adr\u_char[0] = $fffffffffffffffe) And ((adr\u_char[1] & $ffffffffffffffc0) = $ffffffffffffff80))
  27. EndMacro
  28.  
  29. Macro GEOIP_CHKBIT_V6(bit,ptr)
  30.   (ptr\u_char[((127 - bit) >> 3)] & (1 << (~(127 - bit) & 7)))
  31. EndMacro
  32.  
  33. #AF_INET6 = 23
  34.  
  35. #GeoIPMaxContry = 255
  36.  
  37. #STRUCTURE_INFO_MAX_SIZE = 20
  38. #FULL_RECORD_LENGTH = 50
  39. #COUNTRY_BEGIN = 16776960
  40.  
  41. #GEOIP_COUNTRY_EDITION = 1
  42. #GEOIP_COUNTRY_EDITION_V6 = 12
  43. #GEOIP_CITY_EDITION_REV1 = 2
  44. #GEOIP_CITY_EDITION_REV1_V6 = 30
  45. #GEOIP_ASNUM_EDITION = 9
  46. #GEOIP_ASNUM_EDITION_V6 = 21
  47.  
  48. Structure GeoIP_Info
  49.   GeoIP_databaseType.a
  50.   GeoIP_Path.s
  51.   GeoIP_fCach_Memory.b
  52.   GeoIP_File_ID.i
  53.   GeoIP_Size.l
  54.   GeoIP_databaseSegments.l
  55.   *GeoIP_datBuffer
  56. EndStructure
  57.  
  58. Structure GeoIPRecord
  59.   Index_Data.l
  60.   country_code.s
  61.   country_code3.s
  62.   country_name.s
  63.   region.s
  64.   city.s
  65.   postal_code.s
  66.   latitude.f
  67.   longitude.f
  68.   metro_code.l
  69.   area_code.l
  70.   continent_code.s
  71.   Geo_Asn.s
  72.   time_zone.s
  73.   GeoIP_databaseType.a
  74. EndStructure
  75.  
  76. Global Dim GeoIP_CountryNames.s(#GeoIPMaxContry)
  77. Global Dim GeoIP_CountryCodes.s(#GeoIPMaxContry)
  78. Global Dim GeoIP_CountryContinent.s(#GeoIPMaxContry)
  79. Global Dim GeoIP_CountryCodes3.s(#GeoIPMaxContry)
  80. Global Dim GeoIP_Countrytimezone.s(2,715)
  81.  
  82. IncludeFile "GeoIPData.PBI"
  83.  
  84. Procedure.b GeoIP_Dataini()
  85.   Protected Ii.a,uo.l
  86.   Restore GeoIP_DCountryNames
  87.   For Ii = 0 To #GeoIPMaxContry
  88.     Read.s GeoIP_CountryNames(Ii)
  89.   Next
  90.   Restore GeoIP_DCountryCodes
  91.   For Ii = 0 To #GeoIPMaxContry
  92.     Read.s GeoIP_CountryCodes(Ii)
  93.   Next
  94.   Restore GeoIP_DCountryContinent
  95.   For Ii = 0 To #GeoIPMaxContry
  96.     Read.s GeoIP_CountryContinent(Ii)
  97.   Next
  98.   Restore GeoIP_DCountryCodes3
  99.   For Ii = 0 To #GeoIPMaxContry
  100.     Read.s GeoIP_CountryCodes3(Ii)
  101.   Next  
  102.   Restore GeoIP_Dtimezone
  103.   For uo = 0 To 715
  104.     For Ii = 0 To 2
  105.       Read.s GeoIP_Countrytimezone(Ii,uo)
  106.     Next
  107.   Next
  108. EndProcedure
  109.  
  110. Procedure.b GeoIP_Free(*iGeoIP_Info.GeoIP_Info)
  111.   If *iGeoIP_Info < 1
  112.     ProcedureReturn 0
  113.   EndIf
  114.   With *iGeoIP_Info
  115.     If \GeoIP_File_ID
  116.       CloseFile(\GeoIP_File_ID)
  117.     EndIf
  118.   EndWith
  119.   ClearStructure(*iGeoIP_Info, GeoIP_Info)
  120.   FreeMemory(*iGeoIP_Info)
  121. EndProcedure
  122.  
  123. Procedure.i GeoIP_OPen(GeoIP_Path.s,GeoIP_fCach_Memory.b=0,*GeoIP_datBuffer=0,GeoIP_datBufferSize.l=0)
  124.  
  125.   Protected GetSize.l = GeoIP_datBufferSize
  126.   Protected Dim buf.a(2)
  127.   Protected Ii.l,j.l,nRdb.l
  128.   Protected GoPenf.i
  129.  
  130.   If GeoIP_fCach_Memory
  131.     If Not *GeoIP_datBuffer Or Not GeoIP_datBufferSize
  132.       ProcedureReturn -1
  133.     EndIf
  134.   Else
  135.     GetSize = FileSize(GeoIP_Path)
  136.     If GetSize > 0
  137.       GoPenf = OpenFile(#PB_Any,GeoIP_Path)
  138.     Else
  139.       ProcedureReturn -1
  140.     EndIf
  141.     If GoPenf =0
  142.       ProcedureReturn -1
  143.     EndIf
  144.   EndIf
  145.  
  146.   Protected *iGeoIP_Info.GeoIP_Info = AllocateMemory(SizeOf(GeoIP_Info))
  147.   If *iGeoIP_Info =0
  148.     CloseFile(GoPenf)
  149.     ProcedureReturn -2
  150.   EndIf
  151.  
  152.   With *iGeoIP_Info
  153.     \GeoIP_databaseType = #GEOIP_COUNTRY_EDITION
  154.     \GeoIP_databaseSegments = #COUNTRY_BEGIN    
  155.     \GeoIP_datBuffer = *GeoIP_datBuffer
  156.     \GeoIP_fCach_Memory = GeoIP_fCach_Memory
  157.     \GeoIP_File_ID = GoPenf
  158.     \GeoIP_Size = GeoIP_datBufferSize
  159.    
  160.     GetSize-3
  161.    
  162.     If Not \GeoIP_fCach_Memory
  163.       FileSeek(\GeoIP_File_ID, GetSize)
  164.     EndIf
  165.    
  166.     For Ii=0 To #STRUCTURE_INFO_MAX_SIZE - 1
  167.      
  168.       If \GeoIP_fCach_Memory
  169.         nRdb = CopyMemory(\GeoIP_datBuffer + GetSize, @BUF(), 3)
  170.       Else
  171.         nRdb = ReadData(\GeoIP_File_ID,@BUF(), 3)
  172.       EndIf
  173.      
  174.       If nRdb < 3
  175.         GeoIP_Free(*iGeoIP_Info)
  176.         ProcedureReturn -3
  177.       EndIf
  178.      
  179.       If BUF(0) = 255 And BUF(1) = 255 And BUF(2) = 255
  180.        
  181.         GetSize + 3
  182.        
  183.         If \GeoIP_fCach_Memory
  184.          
  185.           \GeoIP_databaseType = PeekA(\GeoIP_datBuffer + GetSize)
  186.           nRdb = CopyMemory(\GeoIP_datBuffer + GetSize + 1, @BUF(), 3)
  187.          
  188.         Else
  189.          
  190.           FileSeek(\GeoIP_File_ID, GetSize)
  191.           \GeoIP_databaseType = ReadAsciiCharacter(\GeoIP_File_ID)
  192.           FileSeek(\GeoIP_File_ID, GetSize + 1)
  193.           nRdb = ReadData(\GeoIP_File_ID,@BUF(), 3)
  194.          
  195.         EndIf
  196.        
  197.         If nRdb < 3
  198.           GeoIP_Free(*iGeoIP_Info)
  199.           ProcedureReturn -3
  200.         EndIf
  201.        
  202.         If \GeoIP_databaseType = #GEOIP_COUNTRY_EDITION_V6
  203.           Break
  204.         EndIf
  205.        
  206.         If \GeoIP_databaseType = #GEOIP_ASNUM_EDITION_V6 Or
  207.            \GeoIP_databaseType = #GEOIP_CITY_EDITION_REV1 Or
  208.            \GeoIP_databaseType = #GEOIP_ASNUM_EDITION Or
  209.            \GeoIP_databaseType = #GEOIP_CITY_EDITION_REV1_V6
  210.          
  211.           \GeoIP_databaseSegments = 0
  212.           For j = 0 To 2
  213.             \GeoIP_databaseSegments + (BUF(j) << (j * 8))
  214.           Next
  215.          
  216.         Else
  217.          
  218.           GeoIP_Free(*iGeoIP_Info)
  219.           ProcedureReturn -4
  220.          
  221.         EndIf
  222.        
  223.       EndIf
  224.      
  225.       GetSize - 4
  226.      
  227.       If Not \GeoIP_fCach_Memory
  228.         FileSeek(\GeoIP_File_ID, GetSize)
  229.       EndIf
  230.      
  231.     Next
  232.    
  233.     If Not \GeoIP_fCach_Memory
  234.       FileSeek(\GeoIP_File_ID, 0)
  235.     EndIf
  236.    
  237.   EndWith
  238.   ProcedureReturn *iGeoIP_Info
  239. EndProcedure
  240.  
  241. Procedure GeoIP_is_private_ipnum_v4(ipnum.q)
  242.   ProcedureReturn Bool((ipnum >= 167772160 And ipnum <= 184549375) Or
  243.                        (ipnum >= 2851995648 And ipnum <= 2852061183) Or
  244.                        (ipnum >= 2886729728 And ipnum <= 2887778303) Or
  245.                        (ipnum >= 3232235520 And ipnum <= 3232301055) Or
  246.                        (ipnum >= 2130706432 And ipnum <= 2147483647))
  247. EndProcedure
  248.  
  249. Procedure.q GeoIP_ConvertIPAddressToNumber_IPv4(Address.s)
  250.   If CountString(Address, ".") = 3
  251.     ProcedureReturn (Pow(256,3) * Val(StringField(Address, 1, "."))) +
  252. (Pow(256,2) * Val(StringField(Address, 2, "."))) +
  253. (256 * Val(StringField(Address, 3, "."))) +
  254. Val(StringField(Address, 4, "."))
  255.   EndIf
  256.   ProcedureReturn 0
  257. EndProcedure
  258.  
  259. Procedure GeoIP_is_private_ipnum_v6(*IPAddressnum.in6_addr)
  260.   If IN6_IS_ADDR_LOOPBACK(*IPAddressnum) =1 Or IN6_IS_ADDR_LINKLOCAL(*IPAddressnum) =1
  261.     ProcedureReturn 1
  262.   EndIf
  263.   ProcedureReturn 0
  264. EndProcedure
  265.  
  266. Procedure GeoIP_ConvertIPAddressToNumber_IPv6(IPAddressV6.s, *IPAddressnum.in6_addr)
  267.   ProcedureReturn inet_pton(#AF_INET6, IPAddressV6, *IPAddressnum)
  268. EndProcedure
  269.  
  270. Procedure.l GeoIP_Seek_Record_IPV6(*iGeoIP_Info.GeoIP_Info,IPAddressV6.s)
  271.  
  272.   If *iGeoIP_Info < 1
  273.     ProcedureReturn -1
  274.   EndIf
  275.  
  276.   Protected IPAddressnum.in6_addr
  277.   If Not GeoIP_ConvertIPAddressToNumber_IPv6(IPAddressV6, @IPAddressnum)
  278.     ProcedureReturn -2
  279.   EndIf
  280.  
  281.   If GeoIP_is_private_ipnum_v6(@IPAddressnum)
  282.     ProcedureReturn -3
  283.   EndIf
  284.  
  285.   Protected depth.l
  286.   Protected x.l ,nRdb.l
  287.   Protected Dim stack_buffer.a(2 * 3)
  288.   Protected offset.l = 0
  289.   Protected record_pair_length.l = 6
  290.   Protected byte_offset.l
  291.  
  292.   With *iGeoIP_Info
  293.    
  294.     For depth = 127 To 0 Step -1
  295.      
  296.       byte_offset = record_pair_length * offset
  297.      
  298.       If \GeoIP_fCach_Memory
  299.         nRdb = CopyMemory(\GeoIP_datBuffer + byte_offset, @stack_buffer(), record_pair_length)
  300.       Else
  301.         FileSeek(\GeoIP_File_ID,byte_offset)
  302.         nRdb = ReadData(\GeoIP_File_ID,@stack_buffer(), record_pair_length)
  303.       EndIf
  304.      
  305.       If nRdb < record_pair_length
  306.         ProcedureReturn -2
  307.       EndIf
  308.      
  309.       If GEOIP_CHKBIT_V6(depth,@IPAddressnum)
  310.        
  311.         x = (stack_buffer(3 * 1 + 0) << (0 * 8)) +
  312.             (stack_buffer(3 * 1 + 1) << (1 * 8)) +
  313.             (stack_buffer(3 * 1 + 2) << (2 * 8))
  314.        
  315.       Else
  316.        
  317.         x = (stack_buffer(3 * 0 + 0) << (0 * 8)) +
  318.             (stack_buffer(3 * 0 + 1) << (1 * 8)) +
  319.             (stack_buffer(3 * 0 + 2) << (2 * 8))
  320.        
  321.       EndIf
  322.      
  323.       If (x >= \GeoIP_databaseSegments)
  324.         ProcedureReturn x
  325.       EndIf
  326.      
  327.       offset = x
  328.     Next
  329.    
  330.   EndWith
  331. EndProcedure
  332.  
  333. Procedure.l GeoIP_Seek_Record(*iGeoIP_Info.GeoIP_Info,IPAddress.s)
  334.  
  335.   If *iGeoIP_Info < 1
  336.     ProcedureReturn -1
  337.   EndIf
  338.  
  339.   Protected ipnum.q = GeoIP_ConvertIPAddressToNumber_IPv4(IPAddress)
  340.   If Not ipnum
  341.     ProcedureReturn -2
  342.   EndIf
  343.  
  344.   If GeoIP_is_private_ipnum_v4(ipnum)
  345.     ProcedureReturn -3
  346.   EndIf
  347.  
  348.   Protected depth.l
  349.   Protected x.l ,nRdb.l
  350.   Protected Dim stack_buffer.a(2 * 3)
  351.   Protected offset.l = 0
  352.   Protected record_pair_length.l = 6
  353.   Protected byte_offset.l
  354.  
  355.   With *iGeoIP_Info
  356.    
  357.     For depth = 31 To 0 Step -1
  358.      
  359.       byte_offset = record_pair_length * offset
  360.      
  361.       If \GeoIP_fCach_Memory
  362.         nRdb = CopyMemory(\GeoIP_datBuffer + byte_offset, @stack_buffer(), record_pair_length)
  363.       Else
  364.         FileSeek(\GeoIP_File_ID,byte_offset)
  365.         nRdb = ReadData(\GeoIP_File_ID,@stack_buffer(), record_pair_length)
  366.       EndIf
  367.      
  368.       If nRdb < record_pair_length
  369.         ProcedureReturn -2
  370.       EndIf
  371.      
  372.       If (ipnum & (1 << depth))
  373.        
  374.         x = (stack_buffer(3 * 1 + 0) << (0 * 8)) +
  375.             (stack_buffer(3 * 1 + 1) << (1 * 8)) +
  376.             (stack_buffer(3 * 1 + 2) << (2 * 8))
  377.        
  378.       Else
  379.        
  380.         x = (stack_buffer(3 * 0 + 0) << (0 * 8)) +
  381.             (stack_buffer(3 * 0 + 1) << (1 * 8)) +
  382.             (stack_buffer(3 * 0 + 2) << (2 * 8))
  383.        
  384.       EndIf
  385.      
  386.       If (x >= \GeoIP_databaseSegments)
  387.         ProcedureReturn x
  388.       EndIf
  389.      
  390.       offset = x
  391.     Next
  392.    
  393.   EndWith
  394.   ProcedureReturn 0
  395. EndProcedure
  396.  
  397. Procedure.s GeoIP_Get_ASMname(*iGeoIP_Info.GeoIP_Info,seek_record.l)
  398.  
  399.   If *iGeoIP_Info < 1
  400.     ProcedureReturn ""
  401.   EndIf
  402.  
  403.   If seek_record < 1
  404.     ProcedureReturn ""
  405.   EndIf
  406.  
  407.   Protected Dim record_buf.a(#FULL_RECORD_LENGTH-1)
  408.   Protected record_pointer.l, nRdb.l
  409.  
  410.   With *iGeoIP_Info
  411.     record_pointer = seek_record + (5) * \GeoIP_databaseSegments
  412.    
  413.     If \GeoIP_fCach_Memory
  414.       nRdb = CopyMemory(\GeoIP_datBuffer + record_pointer, @record_buf(), #FULL_RECORD_LENGTH)
  415.     Else
  416.       FileSeek(\GeoIP_File_ID, record_pointer)
  417.       nRdb = ReadData(\GeoIP_File_ID, @record_buf(), #FULL_RECORD_LENGTH)
  418.     EndIf
  419.    
  420.     If nRdb < #FULL_RECORD_LENGTH
  421.       ProcedureReturn ""
  422.     EndIf
  423.    
  424.   EndWith
  425.  
  426.   ProcedureReturn PeekS(@record_buf(),-1,#PB_UTF8)
  427. EndProcedure
  428.  
  429. Procedure.s GeoIP_Time_Zone_By_Country_and_Region(country.s, region.s)
  430.   Protected uo.l
  431.   For uo = 0 To 715
  432.     If GeoIP_Countrytimezone(0,uo) = country
  433.       If GeoIP_Countrytimezone(1,uo) <> "*" And region <> ""
  434.         For uo = uo To 715
  435.           If GeoIP_Countrytimezone(1,uo) = region
  436.             Break
  437.           EndIf        
  438.         Next
  439.         Break
  440.       Else
  441.         Break
  442.       EndIf
  443.     EndIf
  444.   Next
  445.   If uo < 716
  446.     ProcedureReturn GeoIP_Countrytimezone(2,uo)
  447.   EndIf
  448.   ProcedureReturn ""
  449. EndProcedure
  450.  
  451. Procedure.b GeoIP_Extract_Record(*iGeoIP_Info.GeoIP_Info, *iGeoIPRecord.GeoIPRecord, seek_record.l)
  452.   If *iGeoIP_Info < 1
  453.     ProcedureReturn -1
  454.   EndIf
  455.   ClearStructure(*iGeoIPRecord, GeoIPRecord)
  456.   If Not *iGeoIPRecord
  457.     ProcedureReturn -1
  458.   EndIf
  459.  
  460.   If seek_record < 0
  461.     ProcedureReturn 0
  462.   EndIf
  463.  
  464.   *iGeoIPRecord\GeoIP_databaseType = *iGeoIP_Info\GeoIP_databaseType
  465.  
  466.   If *iGeoIP_Info\GeoIP_databaseType = #GEOIP_COUNTRY_EDITION Or *iGeoIP_Info\GeoIP_databaseType = #GEOIP_COUNTRY_EDITION_V6
  467.     seek_record - *iGeoIP_Info\GeoIP_databaseSegments
  468.     If seek_record > -1 And seek_record < #GeoIPMaxContry +1
  469.       With *iGeoIPRecord
  470.         \Index_Data = seek_record
  471.         \country_name =GeoIP_CountryNames(\Index_Data )
  472.         \country_code = GeoIP_CountryCodes(\Index_Data )
  473.         \continent_code = GeoIP_CountryContinent(\Index_Data )
  474.         \country_code3 = GeoIP_CountryCodes3(\Index_Data )
  475.         \time_zone = GeoIP_time_zone_by_country_and_region(\country_code ,"")
  476.         ProcedureReturn 1
  477.       EndWith
  478.     EndIf
  479.     ProcedureReturn 0
  480.   EndIf
  481.  
  482.   Protected record_pointer.l
  483.   Protected Dim record_buf.a(#FULL_RECORD_LENGTH-1)
  484.   Protected str_length.l = 0, nRdb.l, j.l
  485.  
  486.   Protected latitude.f = 0
  487.   Protected longitude.f = 0
  488.   Protected latitudei.i = 0
  489.   Protected longitudei.i = 0  
  490.   Protected metroarea_combo.l = 0
  491.  
  492.   With *iGeoIP_Info
  493.    
  494.     record_pointer = seek_record + 5 * \GeoIP_databaseSegments
  495.    
  496.     If \GeoIP_fCach_Memory
  497.       nRdb = CopyMemory(\GeoIP_datBuffer + record_pointer, @record_buf(), #FULL_RECORD_LENGTH)
  498.     Else
  499.       FileSeek(\GeoIP_File_ID, record_pointer)
  500.       nRdb = ReadData(\GeoIP_File_ID, @record_buf(), #FULL_RECORD_LENGTH)
  501.     EndIf
  502.    
  503.     If nRdb < #FULL_RECORD_LENGTH
  504.       ProcedureReturn -2
  505.     EndIf
  506.    
  507.   EndWith
  508.  
  509.   ;   ShowMemoryViewer(@record_buf(),50)
  510.  
  511.   If record_buf(0) > -1 And record_buf(0) < #GeoIPMaxContry +1
  512.     With *iGeoIPRecord
  513.       \Index_Data = record_buf(0)
  514.       \country_name =GeoIP_CountryNames(\Index_Data )
  515.       \country_code = GeoIP_CountryCodes(\Index_Data )
  516.       \continent_code = GeoIP_CountryContinent(\Index_Data )
  517.       \country_code3 = GeoIP_CountryCodes3(\Index_Data )
  518.       \region = PeekS(@record_buf(1),-1, #PB_UTF8)
  519.       \time_zone = GeoIP_time_zone_by_country_and_region(\country_code ,\region)
  520.      
  521.       str_length + Len(\region) + 1 + 1
  522.      
  523.       \city = PeekS(@record_buf(str_length),-1,#PB_UTF8)
  524.      
  525.       str_length + Len(\city) + 1
  526.      
  527.       \postal_code = PeekS(@record_buf(str_length),-1,#PB_UTF8)
  528.      
  529.       str_length + Len(\postal_code) + 1
  530.      
  531.       For j = 0 To 2
  532.         latitudei + (record_buf(str_length + j) << (j * 8))
  533.       Next
  534.       \latitude = (latitudei / 10000 - 180)
  535.      
  536.       str_length + 3
  537.      
  538.       For j = 0 To 2
  539.         longitudei + (record_buf(str_length+j) << (j * 8))
  540.       Next
  541.       \longitude = (longitudei / 10000 - 180)
  542.      
  543.       str_length + 3
  544.      
  545.       If \country_code = "US"
  546.         For j = 0 To 2
  547.           metroarea_combo + (record_buf(str_length+j) << (j * 8))
  548.         Next
  549.         \metro_code = metroarea_combo / 1000
  550.         \area_code = metroarea_combo % 1000
  551.       EndIf
  552.      
  553.     EndWith
  554.     ProcedureReturn 1
  555.   EndIf
  556.   ProcedureReturn 0
  557. EndProcedure
  558.  
  559. GeoIP_Dataini()
  560.  
  561. Define *GeoIP = GeoIP_OPen("GeoIPv6.dat")
  562. Define seek_record = GeoIP_Seek_Record_IPV6(*GeoIP,"2001:4860:4860::8888")
  563. Define iGeoIPRecord.GeoIPRecord
  564. GeoIP_Extract_Record(*GeoIP, @iGeoIPRecord, seek_record)
  565. Debug iGeoIPRecord\country_name
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement