OpenRA.MapPreview.Install C# (CSharp) Method

Install() public method

public Install ( System.Action onSuccess ) : void
onSuccess System.Action
return void
        public void Install(Action onSuccess)
        {
            if (Status != MapStatus.DownloadAvailable || !Game.Settings.Game.AllowDownloading)
                return;

            innerData.Status = MapStatus.Downloading;
            var installLocation = cache.MapLocations.FirstOrDefault(p => p.Value == MapClassification.User);
            if (installLocation.Key == null || !(installLocation.Key is IReadWritePackage))
            {
                Log.Write("debug", "Map install directory not found");
                innerData.Status = MapStatus.DownloadError;
                return;
            }

            var mapInstallPackage = installLocation.Key as IReadWritePackage;
            var modData = Game.ModData;
            new Thread(() =>
            {
                // Request the filename from the server
                // Run in a worker thread to avoid network delays
                var mapUrl = Game.Settings.Game.MapRepository + Uid;
                var mapFilename = string.Empty;
                try
                {
                    var request = WebRequest.Create(mapUrl);
                    request.Method = "HEAD";
                    using (var res = request.GetResponse())
                    {
                        // Map not found
                        if (res.Headers["Content-Disposition"] == null)
                        {
                            innerData.Status = MapStatus.DownloadError;
                            return;
                        }

                        mapFilename = res.Headers["Content-Disposition"].Replace("attachment; filename = ", "");
                    }

                    Action<DownloadProgressChangedEventArgs> onDownloadProgress = i => { DownloadBytes = i.BytesReceived; DownloadPercentage = i.ProgressPercentage; };
                    Action<DownloadDataCompletedEventArgs> onDownloadComplete = i =>
                    {
                        download = null;

                        if (i.Error != null)
                        {
                            Log.Write("debug", "Remote map download failed with error: {0}", Download.FormatErrorMessage(i.Error));
                            Log.Write("debug", "URL was: {0}", mapUrl);

                            innerData.Status = MapStatus.DownloadError;
                            return;
                        }

                        mapInstallPackage.Update(mapFilename, i.Result);
                        Log.Write("debug", "Downloaded map to '{0}'", mapFilename);
                        Game.RunAfterTick(() =>
                        {
                            var package = modData.ModFiles.OpenPackage(mapFilename, mapInstallPackage);
                            if (package == null)
                                innerData.Status = MapStatus.DownloadError;
                            else
                            {
                                UpdateFromMap(package, mapInstallPackage, MapClassification.User, null, GridType);
                                onSuccess();
                            }
                        });
                    };

                    download = new Download(mapUrl, onDownloadProgress, onDownloadComplete);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    innerData.Status = MapStatus.DownloadError;
                }
            }).Start();
        }