Merge pull request #1319 from directhex/systemwide-per-arch-aot-cache
[mono.git] / mcs / class / System.Xml.Linq / System.Xml.Linq / XObject.cs
index 31f4a2591d84581ee7d50787fbeca82ac006baa0..0e094d0c474e82baf83dbfa1094e23a718378b62 100644 (file)
@@ -26,6 +26,7 @@
 
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Xml;
 
 namespace System.Xml.Linq
@@ -92,11 +93,7 @@ namespace System.Xml.Linq
 
                public object Annotation (Type type)
                {
-                       if (annotations != null)
-                               foreach (object o in annotations)
-                                       if (o.GetType () == type)
-                                               return o;
-                       throw new ArgumentException ();
+                       return Annotations (type).FirstOrDefault ();
                }
 
                public IEnumerable<T> Annotations<T> () where T : class
@@ -107,10 +104,12 @@ namespace System.Xml.Linq
 
                public IEnumerable<object> Annotations (Type type)
                {
+                       if (type == null)
+                               throw new ArgumentNullException ("type");
                        if (annotations == null)
                                yield break;
                        foreach (object o in annotations)
-                               if (o.GetType () == type)
+                               if (type.IsAssignableFrom (o.GetType ()))
                                        yield return o;
                }
 
@@ -124,24 +123,101 @@ namespace System.Xml.Linq
                        if (annotations == null)
                                return;
                        for (int i = 0; i < annotations.Count; i++)
-                               if (annotations [i].GetType () == type)
+                               if (type.IsAssignableFrom (annotations [i].GetType ()))
                                        annotations.RemoveAt (i);
                }
 
-               [MonoTODO]
-               int IXmlLineInfo.LineNumber {
+               internal int LineNumber {
                        get { return line; }
+                       set { line = value; }
                }
 
-               [MonoTODO]
-               int IXmlLineInfo.LinePosition {
+               internal int LinePosition {
                        get { return column; }
+                       set { column = value; }
+               }
+
+               int IXmlLineInfo.LineNumber {
+                       get { return LineNumber; }
+               }
+
+               int IXmlLineInfo.LinePosition {
+                       get { return LinePosition; }
                }
 
-               [MonoTODO]
                bool IXmlLineInfo.HasLineInfo ()
                {
                        return line > 0;
                }
+
+               internal void FillLineInfoAndBaseUri (XmlReader r, LoadOptions options)
+               {
+                       if ((options & LoadOptions.SetLineInfo) != LoadOptions.None) {
+                               IXmlLineInfo li = r as IXmlLineInfo;
+                               if (li != null && li.HasLineInfo ()) {
+                                       LineNumber = li.LineNumber;
+                                       LinePosition = li.LinePosition;
+                               }
+                       }
+                       if ((options & LoadOptions.SetBaseUri) != LoadOptions.None)
+                               BaseUri = r.BaseURI;
+               }
+               
+               internal void OnAddingObject (object addedObject)
+               {
+                       OnChanging (addedObject, XObjectChangeEventArgs.Add);
+               }
+
+               internal void OnAddedObject (object addedObject)
+               {
+                       OnChanged (addedObject, XObjectChangeEventArgs.Add);
+               }
+
+               internal void OnNameChanging (object renamedObject)
+               {
+                       OnChanging (renamedObject, XObjectChangeEventArgs.Name);
+               }
+
+               internal void OnNameChanged (object renamedObject)
+               {
+                       OnChanged (renamedObject, XObjectChangeEventArgs.Name);
+               }
+               
+               internal void OnRemovingObject (object removedObject)
+               {
+                       OnChanging (removedObject, XObjectChangeEventArgs.Remove);
+               }
+
+               internal void OnRemovedObject (object removedObject)
+               {
+                       OnChanged (removedObject, XObjectChangeEventArgs.Remove);
+               }
+
+               internal void OnValueChanging (object changedObject)
+               {
+                       OnChanging (changedObject, XObjectChangeEventArgs.Value);
+               }
+
+               internal void OnValueChanged (object changedObject)
+               {
+                       OnChanged (changedObject, XObjectChangeEventArgs.Value);
+               }
+
+               
+               void OnChanging (object sender, XObjectChangeEventArgs args)
+               {
+                       if (Changing != null)
+                               Changing (sender, args);
+                       if (Owner != null)
+                               Owner.OnChanging (sender, args);
+               }
+
+               void OnChanged (object sender, XObjectChangeEventArgs args)
+               {
+                       if (Changed != null)
+                               Changed (sender, args);
+                       if (Owner != null)
+                               Owner.OnChanged (sender, args);
+               }
        }
 }