using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Xml.Serialization; using RainmeterStudio.Core; using RainmeterStudio.Core.Model; using RainmeterStudio.Core.Storage; namespace RainmeterStudio.Editor.ProjectEditor { /// /// Project storage, loads and saves project files /// [PluginExport] public class ProjectStorage : IDocumentStorage { /// /// Loads a project from file /// /// Path to file to load /// Loaded project public Project Read(string path) { // Open file var file = File.OpenText(path); // Deserialize file var serializer = new XmlSerializer(typeof(Project), new XmlRootAttribute("project")); Project project = serializer.Deserialize(file) as Project; if (project != null) { project.Path = path; } // Clean up file.Close(); return project; } /// /// Saves a project to file /// /// Project to save /// File to save to public void Write(Project project, string path) { // Open file var file = File.OpenWrite(path); // Serialize file var serializer = new XmlSerializer(typeof(Project), new XmlRootAttribute("project")); serializer.Serialize(file, project); // Clean up file.Close(); project.Path = path; } /// /// Saves a project /// /// Saves a project to the path specified in the 'Path' property public void Write(Project project) { Write(project, project.Path); } /// /// Reads the project as a ProjectDocument. /// Use Load to get only the Project. /// /// Path to project file /// A project document public IDocument ReadDocument(string path) { Project project = Read(path); var document = new ProjectDocument(project); document.Reference = new Reference(Path.GetFileName(path), path); return document; } /// /// Writes a project document to file /// /// /// public void WriteDocument(IDocument document, string path) { var projectDocument = (ProjectDocument)document; Write(projectDocument.Project, path); } /// /// Returns true if the file is a project storage /// /// Path to file /// True if the file can be read by this storage public bool CanReadDocument(string path) { return (Path.GetExtension(path) == ".rsproj"); } /// /// Returns true if this can write specified document type /// /// Document type /// True if document can be written by this storage public bool CanWriteDocument(Type documentType) { return documentType.Equals(typeof(ProjectDocument)); } } }