public static void ClearCache() { if (Earth3d.Logging) { Earth3d.WriteLogMessage("Clear Cache"); } tileMutex.WaitOne(); queueMutex.WaitOne(); WaitingTileQueueMutex.WaitOne(); try { WaitingTileQueue = new Queue <Tile>(); foreach (Tile t in tiles.Values) { try { t.CleanUp(true); } catch { } } tiles.Clear(); } finally { tileMutex.ReleaseMutex(); queueMutex.ReleaseMutex(); WaitingTileQueueMutex.ReleaseMutex(); } return; }
public static Tile GetCachedTile(int level, int x, int y, IImageSet dataset, Tile parent) { if (level < dataset.BaseLevel) { return(null); } Tile retTile = null; long tileKey = ImageSetHelper.GetTileKey(dataset, level, x, y); try { if (!tiles.ContainsKey(tileKey)) { return(null); } else { retTile = tiles[tileKey]; } } catch { if (Earth3d.Logging) { Earth3d.WriteLogMessage("Tile Initialize: Exception"); } } return(retTile); }
public static void PurgeQueue() { if (Earth3d.Logging) { Earth3d.WriteLogMessage("Purging Queue"); } queueMutex.WaitOne(); queue.Clear(); RequestCount = 0; queueMutex.ReleaseMutex(); }
public void Shutdown() { if (Earth3d.Logging) { Earth3d.WriteLogMessage("Shutting Down Web Server"); } _bQuit = true; foreach (WebListener wl in listeners) { wl.Stop(); } listeners.Clear(); }
public static Tile GetTileNow(int level, int x, int y, IImageSet dataset, Tile parent) { if (level < dataset.BaseLevel) { return(null); } Tile retTile = null; long tileKey = ImageSetHelper.GetTileKey(dataset, level, x, y); try { if (!tiles.ContainsKey(tileKey)) { retTile = ImageSetHelper.GetNewTile(dataset, level, x, y, parent); tileMutex.WaitOne(); tiles.Add(tileKey, retTile); tileMutex.ReleaseMutex(); } else { retTile = tiles[tileKey]; } } catch { if (Earth3d.Logging) { Earth3d.WriteLogMessage("GetTile: Exception"); } } finally { //todoperf get rid of this write for GC retTile.AccessCount = AccessID++; } // Create if not ready to render if (!retTile.ReadyToRender) { TileCache.GetTileFromWeb(retTile, false); retTile.CreateGeometry(Earth3d.MainWindow.RenderContext11, false); } return(retTile); }
// Age things in queue. If they are not visible they will go away in time public static void DecimateQueue() { queueMutex.WaitOne(); removeList.Clear(); try { foreach (Tile t in queue.Values) { if (!t.RequestPending) { t.RequestHits = t.RequestHits / 2; try { if (t.RequestHits < 2)// && !t.DirectLoad) { removeList.Add(t.Key); } else if (!t.InViewFrustum) { removeList.Add(t.Key); } } catch { } } } foreach (long key in removeList) { queue.Remove(key); } } catch { if (Earth3d.Logging) { Earth3d.WriteLogMessage("DecimateQueue: Exception"); } } finally { queueMutex.ReleaseMutex(); } }
public static Tile GetTile(int level, int x, int y, IImageSet dataset, Tile parent) { if (level < dataset.BaseLevel) { return(null); } Tile retTile = null; long tileKey = ImageSetHelper.GetTileKey(dataset, level, x, y); try { if (!tiles.ContainsKey(tileKey)) { retTile = ImageSetHelper.GetNewTile(dataset, level, x, y, parent); tileMutex.WaitOne(); tiles.Add(tileKey, retTile); tileMutex.ReleaseMutex(); } else { retTile = tiles[tileKey]; } } catch { if (Earth3d.Logging) { Earth3d.WriteLogMessage("GetTile: Exception"); } } finally { //todoperf get rid of this write for GC retTile.AccessCount = AccessID++; } return(retTile); }
public void ListenerThreadFunc(object data) { WebListener webListener = data as WebListener; if (webListener == null) { return; } _RunCount++; while (!_bQuit) { try { //Accept a new connection Socket mySocket = webListener.Listener.AcceptSocket(); if (mySocket.Connected) { if (AsyncRequests) { ThreadPool.QueueUserWorkItem(new WaitCallback(HandleRequest), mySocket); } else { HandleRequest(mySocket); } } } catch { if (Earth3d.Logging) { Earth3d.WriteLogMessage("Web Server Listener Exception"); } } } _RunCount--; }
public bool Startup() { if (Earth3d.Logging) { Earth3d.WriteLogMessage("Starting Web Server"); } SetAccessLists(); if (!initializedOnce) { RequestHandler.RegisterHandler(new HTTPImagesetWtml()); RequestHandler.RegisterHandler(new HTTPLayerApi()); RequestHandler.RegisterHandler(new HttpXmlRpc()); RequestHandler.RegisterHandler(new HttpImageFiles()); RequestHandler.RegisterHandler(new HttpCrossDomain()); RequestHandler.RegisterHandler(new HttpClientStatus()); XmlRpcMethod.RegisterDispatchMap(new SampClientReceiveNotification()); initializedOnce = true; } try { // Find IPV4 Address _bQuit = false; IpAddress = ""; listeners.Clear(); WebListener listener = null; foreach (IPAddress ipAdd in Dns.GetHostEntry(Dns.GetHostName()).AddressList) { if (ipAdd.AddressFamily == AddressFamily.InterNetwork) { if (string.IsNullOrEmpty(IpAddress)) { IpAddress = ipAdd.ToString(); } if (ipAdd.ToString() != "127.0.0.1") { if (Earth3d.Logging) { Earth3d.WriteLogMessage(" Web Server - Adding:" + ipAdd.ToString()); } listener = new WebListener(new ParameterizedThreadStart(ListenerThreadFunc), ipAdd); listeners.Add(listener); listener.Start(); } } } if (Earth3d.Logging) { Earth3d.WriteLogMessage(" Web Server - Adding Loopback"); } // Add Loopback localhost listener = new WebListener(new ParameterizedThreadStart(ListenerThreadFunc), IPAddress.Loopback); listeners.Add(listener); listener.Start(); } catch (Exception e) { if (Earth3d.Logging) { Earth3d.WriteLogMessage("Failed Starting Web Server"); Earth3d.WriteLogMessage(e.Message); Earth3d.WriteLogMessage(e.Source); Earth3d.WriteLogMessage(e.StackTrace); } _bQuit = true; return(false); } return(true); }
public static void HandleRequest(object param) { Socket mySocket = (Socket)param; int iStartPos = 0; String sRequest; String sErrorMessage; try { //Console.WriteLine("\nClient Connected!!\n==================\nCLient IP {0}\nLocal IP {1}", mySocket.RemoteEndPoint, mySocket.LocalEndPoint) ; //make a byte array and receive data from the client Byte[] bReceive = new Byte[4096]; int i = mySocket.Receive(bReceive, bReceive.Length, 0); //Convert Byte to String string sBuffer = Encoding.UTF8.GetString(bReceive, 0, i); string body = ""; int bodySize = 0; if (string.IsNullOrEmpty(sBuffer) || (sBuffer.Substring(0, 3) != "GET" && sBuffer.Substring(0, 4) != "POST")) { mySocket.Close(); return; } if (sBuffer.Substring(0, 4) == "POST") { string contentLength = "Content-Length:"; int start = sBuffer.IndexOf(contentLength); int bodyLeft = bodySize; if (start > -1) { start += contentLength.Length; string length = sBuffer.Substring(start); length = length.Substring(0, length.IndexOf("\r")); bodySize = Convert.ToInt32(length); bodyLeft = bodySize; int bodyStart = sBuffer.IndexOf("\r\n\r\n") + 4; if (sBuffer.Length > bodyStart) { body = sBuffer.Substring(bodyStart); bodyLeft = bodySize - body.Length; } } bool sentContinue = false; int count = 0; bool firstTime = true; if (bodyLeft > 0) { StringBuilder sb = new StringBuilder(body, bodySize); while (bodyLeft > 0) { if (!firstTime && (bodyLeft == bodySize) && !sentContinue && (sBuffer.Contains("Expect: 100-continue"))) { RequestHandler.SendContinue(ref mySocket); sentContinue = true; } firstTime = false; string moreData = RequestHandler.GetBody(bodyLeft, ref mySocket); bodyLeft -= moreData.Length; sb.Append(moreData); count++; } body = sb.ToString(); } } // Look for HTTP request iStartPos = sBuffer.IndexOf("HTTP", 1); // Get the HTTP _Text and version e.g. it will return "HTTP/1.1" RequestHandler.HttpVersion = sBuffer.Substring(iStartPos, 8); // Extract the Requested Type and Requested file/directory sRequest = sBuffer.Substring(0, iStartPos - 1); //Replace backslash with Forward Slash, if Any sRequest.Replace("\\", "/"); //Console.WriteLine("Request: " + sRequest); // Check authentication from whitelist IPEndPoint ipep = mySocket.RemoteEndPoint as IPEndPoint; bool authenticated = true; if (ipep != null) { authenticated = IsAuthorized(ipep.Address); } try { if (Earth3d.Logging) { Earth3d.WriteLogMessage("Web Request:" + sRequest); } RequestHandler rh = RequestHandler.GetHandler(sRequest); if (rh != null) { rh.ProcessRequest(sRequest, ref mySocket, authenticated, body); mySocket.Close(); return; } //Console.WriteLine("Sending 404 error"); sErrorMessage = "<H2>Error!! No Default File Name Specified</H2>"; RequestHandler.SendHeader(RequestHandler.HttpVersion, "", sErrorMessage.Length, " 404 Not Found", ref mySocket); RequestHandler.SendToBrowser(sErrorMessage, ref mySocket); mySocket.Close(); } catch (Exception ex) { if (Earth3d.Logging) { Earth3d.WriteLogMessage("Web Server Request Exception" + ex.Message); } sErrorMessage = "<H2>Error: " + ex.ToString() + "</H2>"; RequestHandler.SendHeader(RequestHandler.HttpVersion, "", sErrorMessage.Length, " 200 OK", ref mySocket); RequestHandler.SendHeader(RequestHandler.HttpVersion, "", sErrorMessage.Length, " 404 Not Found", ref mySocket); RequestHandler.SendToBrowser(sErrorMessage, ref mySocket); mySocket.Close(); return; } } catch { } }
public static void GetDemTileFromWeb(Tile retTile) { string directory = retTile.DemDirectory; if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } string filename = retTile.DemFilename; FileInfo fi = new FileInfo(filename); bool exists = fi.Exists; if (exists) { if (fi.Length != 2178 && fi.Length != 1026 && fi.Length != 2052 && (retTile.Dataset.Projection != ProjectionType.Mercator)) { try { File.Delete(filename); } catch { } exists = false; } } if (!exists) { try { WebClient Client = new WebClient(); Client.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); string dlFile = string.Format("{0}.tmp{1}", filename, NodeID); Client.DownloadFile(CacheProxy.GetCacheUrl(retTile.DemURL), dlFile); try { if (File.Exists(dlFile)) { if (File.Exists(filename)) { File.Delete(filename); } File.Move(dlFile, filename); } } catch { } fi = new FileInfo(filename); exists = fi.Exists; } catch { if (Earth3d.Logging) { Earth3d.WriteLogMessage("Dem Download: Exception"); } exists = false; } } retTile.DemReady = true; retTile.demFileExists = exists; return; }
public static Tile GetTileFromWeb(Tile retTile, bool Initialize) { WebClient Client = null; if (retTile.Dataset.Projection == ProjectionType.SkyImage && retTile.Dataset.Url.EndsWith("/screenshot.png")) { SkyImageTile tile = retTile as SkyImageTile; Client = new WebClient(); string url = tile.URL; tile.ImageData = Client.DownloadData(url); retTile.DemReady = true; retTile.FileExists = true; retTile.ReadyToRender = true; retTile.TextureReady = true; //retTile.CreateGeometry(Tile.prepDevice); Client.Dispose(); return(retTile); } Tile parent = retTile.Parent; if (retTile.DemEnabled && (parent == null || (parent != null && parent.DemGeneration == 0))) { GetDemTileFromWeb(retTile); } else { retTile.DemReady = true; } if (retTile.Dataset.WcsImage != null && retTile.Dataset.WcsImage is FitsImage) { retTile.TextureReady = true; InitializeTile(retTile); return(retTile); } string directory = retTile.Directory; if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } string filename = retTile.FileName; Client = new WebClient(); FileInfo fi = new FileInfo(filename); bool exists = fi.Exists; if (exists) { if (fi.Length != 8 && fi.Length < 100 || retTile.Volitile) { try { File.Delete(filename); } catch { } exists = false; } } if (!exists) { try { if (retTile.Dataset.IsMandelbrot) { retTile.ComputeMandel(); fi = new FileInfo(filename); exists = fi.Exists; } else { Client.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); string url = retTile.URL; if (string.IsNullOrEmpty(url)) { retTile.errored = true; } else { string dlFile = string.Format("{0}.tmp{1}", filename, NodeID); Client.DownloadFile(CacheProxy.GetCacheUrl(url), dlFile); try { if (File.Exists(dlFile)) { if (File.Exists(filename)) { File.Delete(filename); } File.Move(dlFile, filename); } } catch { // UiTools.ShowMessageBox("File Download collision catch"); } fi = new FileInfo(filename); exists = fi.Exists; } // Code for drawing tile it onto tile for debuggin //if (retTile.Dataset.Projection == ProjectionType.Toast) //{ // //Bitmap bmpText = new Bitmap(filename); // Bitmap bmpText = UiTools.LoadBitmap(filename); // Graphics g = Graphics.FromImage(bmpText); // g.DrawString(retTile.Key, UiTools.StandardRegular, UiTools.StadardTextBrush, new RectangleF(0, 0, 255, 255), UiTools.StringFormatCenterCenter); // g.Flush(); // g.Dispose(); // bmpText.Save(filename); // bmpText.Dispose(); //} } } catch { //todo retry login on non - HTTP failuers. if (Earth3d.Logging) { Earth3d.WriteLogMessage("Tile Download: Exception"); } retTile.errored = true; } } try { if (exists) { if (fi.Length < 100 || (fi.Length == 1033)) { retTile.errored = true; return(retTile); } } // todo 3d Cities remove support for 3d Cities for now if (retTile.Dataset.Projection == ProjectionType.Mercator && Properties.Settings.Default.Show3dCities) { string tileID = retTile.GetTileID(); //check coverage cache before downloading int gen = CoverageMap.GetCoverage(tileID); if (gen > 0) { //try downloading mesh try { string meshFilename = retTile.FileName + ".mesh"; if (!File.Exists(meshFilename)) { Client.Headers.Add("User-Agent", "Win8Microsoft.BingMaps.3DControl/2.214.2315.0 (;;;;x64 Windows RT)"); string dlFile = string.Format("{0}.tmp{1}", meshFilename, NodeID); Client.DownloadFile(string.Format("http://ak.t{1}.tiles.virtualearth.net/tiles/mtx{0}?g={2}", tileID, Tile.GetServerID(retTile.X, retTile.Y), gen.ToString()), dlFile); try { if (File.Exists(dlFile)) { if (File.Exists(meshFilename)) { File.Delete(meshFilename); } File.Move(dlFile, meshFilename); } } catch { // UiTools.ShowMessageBox("File Download collision catch"); } } } catch { } } } retTile.FileExists = true; retTile.TextureReady = true; if (Initialize) { InitializeTile(retTile); } } catch (System.Exception) { if (Earth3d.Logging) { Earth3d.WriteLogMessage("Tile Initialize: Exception"); } retTile.errored = true; } return(retTile); }