OpenRA.MapPreview.UpdateRemoteSearch C# (CSharp) Method

UpdateRemoteSearch() public method

public UpdateRemoteSearch ( MapStatus status, MiniYaml yaml, Action parseMetadata = null ) : void
status MapStatus
yaml MiniYaml
parseMetadata Action
return void
        public void UpdateRemoteSearch(MapStatus status, MiniYaml yaml, Action<MapPreview> parseMetadata = null)
        {
            var newData = innerData.Clone();
            newData.Status = status;
            newData.Class = MapClassification.Remote;

            if (status == MapStatus.DownloadAvailable)
            {
                try
                {
                    var r = FieldLoader.Load<RemoteMapData>(yaml);

                    // Map download has been disabled server side
                    if (!r.downloading)
                    {
                        newData.Status = MapStatus.Unavailable;
                        return;
                    }

                    newData.Title = r.title;
                    newData.Categories = r.categories;
                    newData.Author = r.author;
                    newData.PlayerCount = r.players;
                    newData.Bounds = r.bounds;
                    newData.TileSet = r.tileset;

                    var spawns = new CPos[r.spawnpoints.Length / 2];
                    for (var j = 0; j < r.spawnpoints.Length; j += 2)
                        spawns[j / 2] = new CPos(r.spawnpoints[j], r.spawnpoints[j + 1]);
                    newData.SpawnPoints = spawns;
                    newData.GridType = r.map_grid_type;
                    try
                    {
                        newData.Preview = new Bitmap(new MemoryStream(Convert.FromBase64String(r.minimap)));
                    }
                    catch (Exception e)
                    {
                        Log.Write("debug", "Failed parsing mapserver minimap response: {0}", e);
                        newData.Preview = null;
                    }

                    var playersString = Encoding.UTF8.GetString(Convert.FromBase64String(r.players_block));
                    newData.Players = new MapPlayers(MiniYaml.FromString(playersString));

                    newData.SetRulesetGenerator(modData, () =>
                    {
                        var rulesString = Encoding.UTF8.GetString(Convert.FromBase64String(r.rules));
                        var rulesYaml = new MiniYaml("", MiniYaml.FromString(rulesString)).ToDictionary();
                        var ruleDefinitions = LoadRuleSection(rulesYaml, "Rules");
                        var weaponDefinitions = LoadRuleSection(rulesYaml, "Weapons");
                        var voiceDefinitions = LoadRuleSection(rulesYaml, "Voices");
                        var musicDefinitions = LoadRuleSection(rulesYaml, "Music");
                        var notificationDefinitions = LoadRuleSection(rulesYaml, "Notifications");
                        var sequenceDefinitions = LoadRuleSection(rulesYaml, "Sequences");
                        var rules = Ruleset.Load(modData, this, TileSet, ruleDefinitions, weaponDefinitions,
                            voiceDefinitions, notificationDefinitions, musicDefinitions, sequenceDefinitions);
                        var flagged = Ruleset.DefinesUnsafeCustomRules(modData, this, ruleDefinitions,
                            weaponDefinitions, voiceDefinitions, notificationDefinitions, sequenceDefinitions);
                        return Pair.New(rules, flagged);
                    });
                }
                catch (Exception e)
                {
                    Log.Write("debug", "Failed parsing mapserver response: {0}", e);
                }

                // Commit updated data before running the callbacks
                innerData = newData;

                if (innerData.Preview != null)
                    cache.CacheMinimap(this);

                if (parseMetadata != null)
                    parseMetadata(this);
            }

            // Update the status and class unconditionally
            innerData = newData;
        }