コード例 #1
0
        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;
        }
コード例 #2
0
        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;
            }
        }