public bool Write(Database database, StreamWriter stream, bool encrypt = true) { // Clear the last error this.ErrorString = string.Empty; XmlDocument document = new XmlDocument(); this.Append(document, document, database); StringWriter sw = new StringWriter(); XmlTextWriter xw = new XmlTextWriter(sw); xw.Formatting = Formatting.Indented; xw.Indentation = 4; document.WriteTo(xw); string fileDataString = sw.ToString(); if (encrypt) { DatabaseCrypto.CryptoStatus status; fileDataString = DatabaseCrypto.Encrypt(fileDataString, database.Password, database.Compression, out status); if (status != DatabaseCrypto.CryptoStatus.NoError) { this.ErrorString = DatabaseCrypto.StatusMessage(status); return false; } } stream.Write(fileDataString); return true; }
public Database Read(StreamReader stream, string password) { // Clear the last error this.ErrorString = string.Empty; // Check if the stream is unreadable if (!stream.EndOfStream) { this.ErrorString = "Stream was not readable."; return null; } // Get the contents of the database file and create a new XML document string fileDataString = stream.ReadToEnd(); XmlDocument doc = new XmlDocument(); // Try and see if it's a valid XML document; if it is, we'll simply continue on and read // it (unencrypted mode), if it's not, we'll try to decrypt it (encrypted mode) try { doc.LoadXml(fileDataString); DatabaseCrypto.CryptoStatus status; fileDataString = DatabaseCrypto.Decrypt(fileDataString, password, out status); if (status != DatabaseCrypto.CryptoStatus.NoError) { this.ErrorString = DatabaseCrypto.StatusMessage(status); return null; } } catch (XmlException) { } try { doc.LoadXml(fileDataString); XmlElement root = doc.DocumentElement; if (root.Name != DatabaseKeys.XML_DATABASE) { this.ErrorString = "Missing root XML element."; return null; } Version version = new Version(root.Attributes[DatabaseKeys.XML_VERSION].Value); if (version != Database.Version) { this.ErrorString = string.Format(CultureInfo.InvariantCulture, "Unsupported database version: {0}", version); return null; } Database db = new Database(); db.FromXml(root); // Recursively read in all the groups and their subnodes this.ReadGroup(db, root); return db; } catch (XmlException) { this.ErrorString = "Unable to parse the XML tree."; return null; } }