private void Save(Project project, string filename, ProjectSerializer serializer)
        {
            var data = DoSave(project, filename, serializer);

            File.WriteAllBytes(filename, data);
            project.UnsavedChanges  = false;
            project.ProjectFileName = filename;
        }
        private byte[] DoSave(Project project, string filename, ProjectSerializer serializer)
        {
            var data = serializer.Save(project);

            if (!IsUncompressedProject(filename))
            {
                data = Util.TryZip(data);
            }

            return(data);
        }
        private byte[] DoSave(Project project, string filename, ProjectSerializer serializer)
        {
            var data = SerializeWith(project, serializer);

            if (IsLikelyCompressed(filename))
            {
                data = Util.TryZip(data);
            }

            return(data);
        }
        private void Save(Project project, string filename, ProjectSerializer serializer)
        {
            var data = DoSave(project, filename, serializer);

            WriteBytes(filename, data);

            if (project.Session != null)
            {
                project.Session.UnsavedChanges  = false;
                project.Session.ProjectFileName = filename;
            }
        }
        private void PostSerialize(string filename, ProjectXmlSerializer.Root xmlRoot, ProjectSerializer serializer)
        {
            if (xmlRoot?.Project?.Data?.SnesAddressSpace != null || xmlRoot?.Project?.Session == null)
            {
                throw new InvalidDataException(
                          "Internal error with deserialized data, either Project, Data, Session, or SnesAddressSpace failed to load correctly.");
            }

            xmlRoot.Project.Session = new ProjectSession(xmlRoot.Project)
            {
                ProjectFileName = filename
            };

            // at this stage, 'Data' is populated with everything EXCEPT the actual ROM bytes.
            // It would be easy to store the ROM bytes in the save file, but, for copyright reasons,
            // we leave it out.
            //
            // So now, with all our metadata loaded successfully, we now open the .smc file on disk
            // and marry the original rom's bytes with all of our metadata loaded from the project file.

            var romAddCmd = new AddRomDataCommand(xmlRoot)
            {
                GetNextRomFileToTry = RomPromptFn,
                MigrationRunner     = serializer.MigrationRunner,
            };

            romAddCmd.TryReadAttachedProjectRom();
        }
 protected virtual (ProjectXmlSerializer.Root xmlRoot, string warning) DeserializeWith(
     ProjectSerializer serializer, byte[] rawBytes
     ) => serializer.Load(rawBytes);