Exemplo n.º 1
0
 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;
 }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 public static void PurgeQueue()
 {
     if (Earth3d.Logging)
     {
         Earth3d.WriteLogMessage("Purging Queue");
     }
     queueMutex.WaitOne();
     queue.Clear();
     RequestCount = 0;
     queueMutex.ReleaseMutex();
 }
Exemplo n.º 4
0
 public void Shutdown()
 {
     if (Earth3d.Logging)
     {
         Earth3d.WriteLogMessage("Shutting Down Web Server");
     }
     _bQuit = true;
     foreach (WebListener wl in listeners)
     {
         wl.Stop();
     }
     listeners.Clear();
 }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        // 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();
            }
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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--;
        }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
        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
            {
            }
        }
Exemplo n.º 11
0
        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;
        }
Exemplo n.º 12
0
        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);
        }