private static void WritePropertySet(XmlWriter writer, PropertySetFormats.PropertySet data) { if (data.DefinedSchema != null) { WritePropertySetSchema(writer, data.DefinedSchema); } writer.WriteStartElement("PropertySet"); writer.WriteAttributeString("name", GetSymbolName(data.Name)); if (data.SchemaName != DataFormats.Symbol.Invalid) { writer.WriteAttributeString("schema", GetSymbolName(data.SchemaName)); } if ((data.Flags & DataFormats.PropertyCollectionFlags.SkipParentCheck) != 0) { writer.WriteAttributeString("skipparentcheck", "True"); } if (data.ReferenceCount != 0) { writer.WriteAttributeString("refs", data.ReferenceCount.ToString(CultureInfo.InvariantCulture)); } var ignoredFlags = DataFormats.PropertyCollectionFlags.IsSet | DataFormats.PropertyCollectionFlags.OwnerIsList | DataFormats.PropertyCollectionFlags.OwnerIsSet | DataFormats.PropertyCollectionFlags.SkipParentCheck; var cleanedFlags = data.Flags & ~ignoredFlags; if (cleanedFlags != DataFormats.PropertyCollectionFlags.None) { writer.WriteAttributeString("flags", cleanedFlags.ToString()); } foreach (var parent in data.Parents) { writer.WriteElementString("Parent", GetSymbolName(parent.NameId)); } foreach (var kv in data.Properties) { writer.WriteStartElement("Property"); WriteProperty(writer, kv.Key, kv.Value, data.DefaultProperties.Contains(kv.Key) == true); writer.WriteEndElement(); } writer.WriteEndElement(); }
private static PropertySetFormats.PropertySet ReadPropertySet(XPathNavigator nav, object parent) { PropertySetFormats.PropertySetSchema definedSchema = null; var rawSchema = nav.SelectSingleNode("PropertySetSchema"); if (rawSchema != null) { definedSchema = ReadPropertySetSchema(rawSchema); } var root = nav.SelectSingleNode("PropertySet"); if (root == null) { throw new InvalidOperationException(); } var instance = new PropertySetFormats.PropertySet(); instance.DefinedSchema = definedSchema; instance.Name = root.ParseAttributeSymbol("name"); instance.Flags = root.ParseAttributeEnum("flags", DataFormats.PropertyCollectionFlags.None); instance.Flags &= _NonSetListMask; instance.Flags |= DataFormats.PropertyCollectionFlags.IsSet; instance.Flags |= GetOwnerFlag(parent); instance.SchemaName = root.ParseAttributeSymbol("schema", DataFormats.Symbol.Invalid); if (root.ParseAttributeBoolean("skipparentcheck", false) == true) { instance.Flags |= DataFormats.PropertyCollectionFlags.SkipParentCheck; } instance.ReferenceCount = root.ParseAttributeUInt16("refs", 0); instance.Parents.Clear(); var rawParents = root.Select("Parent"); while (rawParents.MoveNext() == true) { var rawParent = rawParents.Current; uint dummy; if (Helpers.TryParseSymbol(rawParent.Value, out dummy) == false) { throw new FormatException("failed to parse parent"); } instance.Parents.Add(new DataFormats.ResourceHandle(dummy)); } instance.Properties.Clear(); instance.DefaultProperties.Clear(); var rawProperties = root.Select("Property"); while (rawProperties.MoveNext() == true) { var rawProperty = rawProperties.Current; var name = rawProperty.ParseAttributeSymbol("name"); var isDefault = rawProperty.ParseAttributeBoolean("default", false); var value = ParseProperty(rawProperty, instance); instance.Properties.Add(name.Id, value); if (isDefault == true) { instance.DefaultProperties.Add(name.Id); } } return(instance); }