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 != "" && 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); } } } }