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); }