246 lines
8.2 KiB
C#
246 lines
8.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Net.Sockets;
|
|
using System.Xml;
|
|
using System.Threading;
|
|
using SafeMobileLib.MessageDecoders;
|
|
|
|
namespace SafeMobileLib
|
|
{
|
|
public class Address
|
|
{
|
|
private string value;
|
|
public string Value
|
|
{
|
|
get { return this.value; }
|
|
set { this.value = value; }
|
|
}
|
|
|
|
public string lat;
|
|
public string lng;
|
|
public string addr_hash;
|
|
public htCell_t cell;
|
|
|
|
private TcpClient tcpClient;
|
|
private NetworkStream stream;
|
|
private Boolean running = true;
|
|
|
|
public Address()
|
|
{
|
|
}
|
|
|
|
public Address(htCell_t cell)
|
|
{
|
|
lat = cell.lat;
|
|
lng = cell.lng;
|
|
addr_hash = Utils.Compute4digitALG(cell.d_lat, cell.d_lng);
|
|
this.cell = cell;
|
|
}
|
|
|
|
public Address(double lat, double lng)
|
|
{
|
|
addr_hash = Utils.Compute4digitALG(lat, lng);
|
|
this.lat = lat.ToString();
|
|
this.lng = lng.ToString();
|
|
}
|
|
|
|
public void Compute()
|
|
{
|
|
while (running)
|
|
{
|
|
try
|
|
{
|
|
if (SN_Queues.computeAddressQueue.Count > 0)
|
|
{
|
|
Address gps_addr = SN_Queues.computeAddressQueue.GetItem(100);
|
|
if (gps_addr != null)
|
|
{
|
|
bool OK;
|
|
//string addr = GetADDrFromGeocoder(gps_addr.lat, gps_addr.lng, out OK);
|
|
//string addr = GetADDrFromServer(gps_addr.lat, gps_addr.lng, out OK);
|
|
string addr = GetADDrFromGoogle(gps_addr.lat, gps_addr.lng, out OK);
|
|
//Utils.WriteLine("lat:" + gps_addr.lat + " lng:" + gps_addr.lng + " Addr:" + addr);
|
|
|
|
if (OK)
|
|
{
|
|
//add data to our own queue
|
|
lock (SN_Queues.ht_addressList.SyncRoot)
|
|
{
|
|
if (SN_Queues.ht_addressList.ContainsKey(gps_addr.addr_hash))
|
|
{
|
|
((Address)SN_Queues.ht_addressList[gps_addr.addr_hash]).Value = addr;
|
|
}
|
|
}
|
|
//add to DB
|
|
gps_addr.Value = addr;
|
|
}
|
|
else
|
|
{
|
|
//add to DB
|
|
gps_addr.Value = "N/A";
|
|
}
|
|
|
|
|
|
DBhandle.UpdateAddressValue(gps_addr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DBhandle.GetUnComputeAddr();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Utils.WriteLine("ComputeAddressQueue Exception:" + ex.ToString(), ConsoleColor.Red);
|
|
}
|
|
Thread.Sleep(10);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
public string GetADDrFromGoogle(string lat, string lng, out bool OK)
|
|
{
|
|
string addr = "";
|
|
OK = false;
|
|
try
|
|
{
|
|
XmlDocument doc = new XmlDocument();
|
|
doc.Load("http://maps.googleapis.com/maps/api/geocode/xml?latlng=" + lat + "," + lng + "&sensor=false");
|
|
|
|
XmlNode element = doc.SelectSingleNode("//GeocodeResponse/status");
|
|
if (element.InnerText == "OK")
|
|
{
|
|
element = doc.SelectSingleNode("//GeocodeResponse/result/formatted_address");
|
|
addr = element.InnerText.Replace("'", "`");
|
|
OK = true;
|
|
}
|
|
else
|
|
{
|
|
OK = false;
|
|
Utils.WriteLine("Failed to retrevi address for lat:" + lat + " lng:" + lng + " response:" + element.InnerText);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Utils.WriteLine("GetADDrFromGoogle Exception:" + ex.ToString(), ConsoleColor.Red);
|
|
}
|
|
return addr;
|
|
}
|
|
|
|
public string GetADDrFromGeocoder(string lat, string lng, out bool OK)
|
|
{
|
|
string addr = "";
|
|
OK = false;
|
|
try
|
|
{
|
|
XmlDocument doc = new XmlDocument();
|
|
//doc.Load("http://maps.googleapis.com/maps/api/geocode/xml?latlng=" + lat + "," + lng + "&sensor=false");
|
|
doc.Load("http://geocoder.ca/?auth=156773750766443301201x1900&latt=" + lat + "&longt=" + lng + "&reverse=1&geoit=xml");
|
|
XmlNode element = doc.SelectSingleNode("//geodata/error");
|
|
if (element == null)
|
|
{
|
|
element = doc.SelectSingleNode("//geodata/stnumber");
|
|
string strnr = element.InnerText.Replace("'", "`");
|
|
|
|
element = doc.SelectSingleNode("//geodata/staddress");
|
|
string staddress = element.InnerText.Replace("'", "`");
|
|
|
|
element = doc.SelectSingleNode("//geodata/city");
|
|
string city = element.InnerText.Replace("'", "`");
|
|
|
|
element = doc.SelectSingleNode("//geodata/prov");
|
|
string prov = element.InnerText.Replace("'", "`");
|
|
|
|
element = doc.SelectSingleNode("//geodata/postal");
|
|
string postal = element.InnerText.Replace("'", "`");
|
|
|
|
addr = strnr + " " + staddress + " " + city + " " + prov + " " + postal;
|
|
OK = true;
|
|
}
|
|
else
|
|
{
|
|
OK = false;
|
|
Utils.WriteLine("Failed to retrevi address for lat:" + lat + " lng:" + lng);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Utils.WriteLine(ex.ToString());
|
|
}
|
|
return addr;
|
|
}
|
|
|
|
static ASCIIEncoding encoder = new ASCIIEncoding();
|
|
|
|
public string GetADDrFromServer(string lat, string lng, out bool OK)
|
|
{
|
|
string addr = "";
|
|
OK = false;
|
|
|
|
try
|
|
{
|
|
if (tcpClient != null)
|
|
{
|
|
if (!tcpClient.Connected)
|
|
{
|
|
tcpClient.Close();
|
|
tcpClient = null;
|
|
//start TCP
|
|
StartTCP();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
StartTCP();
|
|
}
|
|
if (tcpClient.Connected && stream.CanWrite)
|
|
{
|
|
string temp = "#" + lat + "#" + lng + "#";
|
|
byte[] data = Encoding.ASCII.GetBytes(temp);
|
|
stream.Write(data, 0, data.Length);
|
|
|
|
data = new byte[1024];
|
|
int recv = stream.Read(data, 0, data.Length);
|
|
string str = System.Text.Encoding.ASCII.GetString(data, 0, recv);
|
|
str = str.Replace("\n", "");
|
|
Console.WriteLine("############## Str: " + str + " ##################");
|
|
if (str != "<Lookup Failed>" && str != "")
|
|
{
|
|
OK = true;
|
|
addr = str;
|
|
}
|
|
else
|
|
{
|
|
addr = "N/A";
|
|
OK = false;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Utils.WriteLine(ex.ToString());
|
|
}
|
|
return addr;
|
|
}
|
|
|
|
public void StartTCP()
|
|
{
|
|
tcpClient = new TcpClient("173.167.145.205", 10116);
|
|
|
|
stream = tcpClient.GetStream();
|
|
}
|
|
|
|
public void StopAddressThread()
|
|
{
|
|
try
|
|
{
|
|
running = false;
|
|
tcpClient.Close();
|
|
}
|
|
catch (Exception ee) { Utils.WriteLine(ee.ToString(), ConsoleColor.Red); }
|
|
}
|
|
}
|
|
}
|