示例#1
0
    public Location getLocation(long ipnum)
    {
        int record_pointer;

        byte[]   record_buf = new byte[FULL_RECORD_LENGTH];
        char[]   record_buf2 = new char[FULL_RECORD_LENGTH];
        int      record_buf_offset = 0;
        Location record = new Location();
        int      str_length = 0;
        int      j, Seek_country;
        double   latitude = 0, longitude = 0;

        try
        {
            Seek_country = SeekCountry(ipnum);
            if (Seek_country == databaseSegments[0])
            {
                return(null);
            }
            record_pointer = Seek_country + ((2 * recordLength - 1) * databaseSegments[0]);
            if ((dboptions & GEOIP_MEMORY_CACHE) == 1)
            {
                Array.Copy(dbbuffer, record_pointer, record_buf, 0, Math.Min(dbbuffer.Length - record_pointer, FULL_RECORD_LENGTH));
            }
            else
            {
                lock (ioLock)
                {
                    file.Seek(record_pointer, SeekOrigin.Begin);
                    file.Read(record_buf, 0, FULL_RECORD_LENGTH);
                }
            }
            for (int a0 = 0; a0 < FULL_RECORD_LENGTH; a0++)
            {
                record_buf2[a0] = Convert.ToChar(record_buf[a0]);
            }
            // get country
            record.countryCode = countryCode[unsignedByteToInt(record_buf[0])];
            record.countryName = countryName[unsignedByteToInt(record_buf[0])];
            record_buf_offset++;

            // get region
            while (record_buf[record_buf_offset + str_length] != '\0')
            {
                str_length++;
            }
            if (str_length > 0)
            {
                record.region = new String(record_buf2, record_buf_offset, str_length);
            }
            record_buf_offset += str_length + 1;
            str_length         = 0;

            // get region_name
            record.regionName = RegionName.getRegionName(record.countryCode, record.region);

            // get city
            while (record_buf[record_buf_offset + str_length] != '\0')
            {
                str_length++;
            }
            if (str_length > 0)
            {
                record.city = new String(record_buf2, record_buf_offset, str_length);
            }
            record_buf_offset += (str_length + 1);
            str_length         = 0;

            // get postal code
            while (record_buf[record_buf_offset + str_length] != '\0')
            {
                str_length++;
            }
            if (str_length > 0)
            {
                record.postalCode = new String(record_buf2, record_buf_offset, str_length);
            }
            record_buf_offset += (str_length + 1);

            // get latitude
            for (j = 0; j < 3; j++)
            {
                latitude += (unsignedByteToInt(record_buf[record_buf_offset + j]) << (j * 8));
            }
            record.latitude    = (float)latitude / 10000 - 180;
            record_buf_offset += 3;

            // get longitude
            for (j = 0; j < 3; j++)
            {
                longitude += (unsignedByteToInt(record_buf[record_buf_offset + j]) << (j * 8));
            }
            record.longitude = (float)longitude / 10000 - 180;

            record.metro_code = record.dma_code = 0;
            record.area_code  = 0;
            if (databaseType == DatabaseInfo.CITY_EDITION_REV1)
            {
                // get metro_code
                int metroarea_combo = 0;
                if (record.countryCode == "US")
                {
                    record_buf_offset += 3;
                    for (j = 0; j < 3; j++)
                    {
                        metroarea_combo += (unsignedByteToInt(record_buf[record_buf_offset + j]) << (j * 8));
                    }
                    record.metro_code = record.dma_code = metroarea_combo / 1000;
                    record.area_code  = metroarea_combo % 1000;
                }
            }
        }
        catch (IOException)
        {
            Console.Write("IO Exception while seting up segments");
        }
        return(record);
    }