internal AufsImpl(MergedVolumeInfo volumeInfo) { if (volumeInfo == null) { throw new ArgumentNullException("volumeInfo"); } this.volumeInfo = volumeInfo; this.members = volumeInfo.Members; this.policy = volumeInfo.Policy; }
private void readConfiguration() { bool isValid = true; XmlReaderSettings settings = new XmlReaderSettings(); using (StreamReader schemaReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(this.GetType(), "configschema.xsd"))) // load the schema embedded resource to validate the user's config file { settings.Schemas.Add(null, XmlReader.Create(schemaReader)); settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; settings.ValidationType = ValidationType.Schema; settings.ValidationEventHandler += (sender, e) => // if there's any validation events (errors), then the configuration file is invalid { Console.Error.WriteLine(e.Message); isValid = false; }; using (XmlReader reader = XmlReader.Create(this.configPath, settings)) { XmlDocument configDoc = new XmlDocument(); configDoc.Load(reader); if (!isValid) { throw new InvalidDataException("Configuration file format is invalid"); } List<Member> members = new List<Member>(); foreach (XmlNode memberNode in configDoc.SelectNodes("//aufsconfig/members/member")) { string path = memberNode.Attributes["path"].Value; bool readOnly = false; if (memberNode.Attributes["readonly"] != null) { readOnly = Convert.ToBoolean(memberNode.Attributes["readonly"].Value); } members.Add(new Member(path, readOnly)); } CreationPolicy policy = PolicyLoader.GetPolicy(configDoc.SelectSingleNode("//aufsconfig/volume").Attributes["policy"].Value, members); string driveLetter = configDoc.SelectSingleNode("//aufsconfig/volume/letter").InnerText; string driveLabel = configDoc.SelectSingleNode("//aufsconfig/volume/label").InnerText; this.mergedVolume = new MergedVolumeInfo(members, driveLetter.ToCharArray()[0], driveLabel, policy); } } }