Exemplo n.º 1
0
        private static void SerializeFolder(string path, BuildFolder folder)
        {
            var xmlFolder = new XmlBuildFolder
            {
                Version    = BuildVersion.ToString(),
                IsExpanded = folder.IsExpanded,
                Builds     = folder.Builds.Select(b => b.Name).ToList()
            };

            Directory.CreateDirectory(path);
            XmlSerializationUtils.SerializeToFile(xmlFolder, Path.Combine(path, BuildFolderFileName));
        }
        /// <summary>
        /// Serializes the given build.
        /// </summary>
        /// <remarks>
        /// Folders have to be serialized right after being changed to update parent information in time.
        ///
        /// The folder builds are moved to has to be serialized before their old folder.
        /// </remarks>
        public void SerializeBuild(IBuild build)
        {
            string oldName;

            _names.TryGetValue(build, out oldName);
            var name = build.Name;

            _names[build] = name;

            var path    = PathFor(build, true);
            var oldPath = path.Remove(path.Length - SerializationUtils.EncodeFileName(name).Length)
                          + SerializationUtils.EncodeFileName(oldName);
            var poeBuild = build as PoEBuild;

            if (poeBuild != null)
            {
                SerializeBuild(path, poeBuild);
                if (oldName != null && oldName != name)
                {
                    File.Delete(oldPath + BuildFileExtension);
                }
            }
            else
            {
                if (oldName != null && oldName != name)
                {
                    Directory.Move(oldPath, path);
                }
                var folder = (BuildFolder)build;

                // Move builds that are in folder.Builds but have _parents set to another folder
                // from their old folder to this one.
                foreach (var b in folder.Builds)
                {
                    BuildFolder parent;
                    _parents.TryGetValue(b, out parent);
                    if (_markedForDeletion.ContainsKey(b) || (parent != null && parent != folder))
                    {
                        var    isBuild   = b is PoEBuild;
                        var    extension = isBuild ? BuildFileExtension : "";
                        string old;
                        if (_markedForDeletion.ContainsKey(b))
                        {
                            old = _markedForDeletion[b];
                            _markedForDeletion.Remove(b);
                        }
                        else
                        {
                            old = PathFor(b, true) + extension;
                        }

                        var newPath = Path.Combine(path,
                                                   SerializationUtils.EncodeFileName(_names[b]) + extension);
                        if (old == newPath)
                        {
                            continue;
                        }
                        if (isBuild)
                        {
                            File.Move(old, newPath);
                        }
                        else
                        {
                            Directory.Move(old, newPath);
                        }
                    }
                }

                // Mark builds that have folder as _parents entry but are no longer in folder.Builds.
                // These will either be moved when their new folder is saved or deleted when Delete is called.
                // Skip unsaved builds (those are not contained in _names)
                foreach (var parentsEntry in _parents)
                {
                    var b = parentsEntry.Key;
                    if (parentsEntry.Value != folder ||
                        !_names.ContainsKey(b) ||
                        folder.Builds.Contains(b))
                    {
                        continue;
                    }
                    var extension = b is PoEBuild ? BuildFileExtension : "";
                    _markedForDeletion[b] = PathFor(b, true) + extension;
                }

                var xmlFolder = new XmlBuildFolder
                {
                    Version    = BuildVersion.ToString(),
                    IsExpanded = folder.IsExpanded,
                    Builds     = folder.Builds.Select(b => b.Name).ToList()
                };
                Directory.CreateDirectory(path);
                SerializationUtils.XmlSerialize(xmlFolder, Path.Combine(path, BuildFolderFileName));
            }

            // Just recreate these. Easier than handling all edge cases.
            InitParents();
        }
 private static void SerializeFolder(string path, BuildFolder folder)
 {
     var xmlFolder = new XmlBuildFolder
     {
         Version = BuildVersion.ToString(),
         IsExpanded = folder.IsExpanded,
         Builds = folder.Builds.Select(b => b.Name).ToList()
     };
     Directory.CreateDirectory(path);
     SerializationUtils.XmlSerializeToFile(xmlFolder, Path.Combine(path, BuildFolderFileName));
 }