private static async Task OnDownload()

in CommandLine/XblConnectedStorage/Program.cs [85:151]


        private static async Task<int> OnDownload(Options options)
        {
            string gamertag = options.GamerTag;
            Guid scid = options.ServiceConfigurationId;
            string sandbox = options.Sandbox;

            List<TitleBlobInfo> savedGameInfos = await ConnectedStorage.ListSavedGamesAsync(gamertag, scid.ToString(), sandbox, string.Empty, 0, 0);

            if (savedGameInfos.Count == 0)
            {
                Console.WriteLine("No saves found.");
                return 0;
            }

            Directory.CreateDirectory(Path.GetDirectoryName(options.OutputFile));
            XmlWriterSettings xmlWriterSettings = new XmlWriterSettings()
            {
                Indent = true
            };
            using (XmlWriter xbStorageXmlWriter = XmlWriter.Create(options.OutputFile, xmlWriterSettings))
            {
                xbStorageXmlWriter.WriteStartDocument();
                xbStorageXmlWriter.WriteStartElement("XbConnectedStorageSpace");
                xbStorageXmlWriter.WriteStartElement("ContextDescription");
                xbStorageXmlWriter.WriteStartElement("Account");
                xbStorageXmlWriter.WriteAttributeString("msa", "change@me.com");
                xbStorageXmlWriter.WriteEndElement(); // Account
                xbStorageXmlWriter.WriteStartElement("Title");
                xbStorageXmlWriter.WriteAttributeString("scid", scid.ToString());
                xbStorageXmlWriter.WriteEndElement(); // Title
                xbStorageXmlWriter.WriteEndElement(); // ContextDescription
                xbStorageXmlWriter.WriteStartElement("Data");
                xbStorageXmlWriter.WriteStartElement("Containers");

                foreach (TitleBlobInfo savedGameInfo in savedGameInfos)
                {
                    string savedGameName = savedGameInfo.FileName.Substring(0, savedGameInfo.FileName.IndexOf(','));

                    xbStorageXmlWriter.WriteStartElement("Container");
                    xbStorageXmlWriter.WriteAttributeString("name", savedGameName);
                    xbStorageXmlWriter.WriteStartElement("Blobs");

                    SavedGameV2Response savedGame = await ConnectedStorage.DownloadSavedGameAsync(gamertag, scid, sandbox, savedGameName);

                    foreach (ExtendedAtomInfo atomInfo in savedGame.Atoms)
                    {
                        xbStorageXmlWriter.WriteStartElement("Blob");
                        xbStorageXmlWriter.WriteAttributeString("name", atomInfo.Name);

                        byte[] atomContent = await ConnectedStorage.DownloadAtomAsync(gamertag, scid, sandbox, atomInfo.Atom);

                        xbStorageXmlWriter.WriteCData(Convert.ToBase64String(atomContent));
                        xbStorageXmlWriter.WriteEndElement(); // Blob
                    }

                    xbStorageXmlWriter.WriteEndElement(); // Blobs
                }

                xbStorageXmlWriter.WriteEndElement(); // Containers
                xbStorageXmlWriter.WriteEndElement(); // Data
                xbStorageXmlWriter.WriteEndElement(); // XbConnectedStorageSpace
            }

            Console.WriteLine($"Operation complete. Downloaded {savedGameInfos.Count} save containers to {options.OutputFile}.");

            return 0;
        }