+ if (stream == null)
+ return null;
+ if (Info.Format == Mxml)
+ {
+ XmlDocument doc = new XmlDocument (name_table);
+ XmlTextReader reader = new XmlTextReader (stream, name_table);
+
+ reader.WhitespaceHandling = WhitespaceHandling.None;
+ try {
+ reader.Read ();
+ while (reader.NodeType != XmlNodeType.Element)
+ reader.Read ();
+ doc.LoadXml ("<" + reader.Name + "></" + reader.Name + ">");
+ reader.Read ();
+ XmlNode node = null;
+ while (reader.NodeType == XmlNodeType.Element
+ ? reader.Name != stop.Name
+ : reader.NodeType != XmlNodeType.EndElement)
+ if (reader.NodeType == XmlNodeType.Element)
+ node = doc.DocumentElement.InsertAfter (doc.ReadNode (reader),
+ node);
+ } catch (Exception e) {
+ Console.WriteLine (e);
+ } finally {
+ reader.Close ();
+ stream.Dispose ();
+ }
+ return doc;
+ }
+
+ MPlist plist = null;
+ try {
+ plist = new MPlist (stream, stop);
+ LastLoaded = DateTime.Now;
+ } catch (Exception e) {
+ Console.WriteLine (e);
+ LastLoadStatus = LoadStatus.InvalidContents;
+ } finally {
+ stream.Dispose ();
+ }
+ return plist;
+ }
+
+ public XmlNode Load (string id, params string[] nodes)
+ {
+ FileStream stream = get_stream ();
+ if (stream == null)
+ return null;
+ if (Info.Format != Mxml)
+ throw new Exception ("Not an XML format");
+
+ XmlDocument doc = new XmlDocument (name_table);
+ XmlTextReader reader = new XmlTextReader (stream, name_table);
+ int len = nodes.Length;
+
+ reader.WhitespaceHandling = WhitespaceHandling.None;
+ do {
+ reader.Read ();
+ } while (reader.NodeType != XmlNodeType.Element);
+
+ if (reader.Name != nodes[0])
+ return null;
+
+ string ns = reader.GetAttribute ("xmlns");
+ XmlNode top = doc.CreateNode (XmlNodeType.Element, nodes[0], ns);
+ XmlNode node = top;
+
+ try {
+ int i;
+
+ for (i = 1; i + 1 < len; i++)
+ {
+ if (! reader.ReadToDescendant (nodes[i]))
+ return null;
+ node = node.InsertAfter (doc.CreateNode (XmlNodeType.Element,
+ nodes[i], ns), null);
+ }
+ if (! reader.ReadToDescendant (nodes[i]))
+ return null;
+ XmlNode ref_node = null;
+ while (reader.NodeType != XmlNodeType.EndElement)
+ {
+ if (reader.NodeType == XmlNodeType.Element)
+ {
+ if (reader.Name == nodes[i]
+ && (id == null || id == reader.GetAttribute ("id")))
+ ref_node = node.InsertAfter (doc.ReadNode (reader), ref_node);
+ else
+ reader.Skip ();
+ }
+ else
+ reader.Read ();
+ }
+
+ } catch (Exception e) {
+ Console.WriteLine (e);
+ } finally {
+ reader.Close ();
+ stream.Dispose ();
+ }
+ return top;
+ }
+
+ /// <summary>Return a list of currently available database
+ /// directory names</summary>.
+ public static string[] DirectoryList ()
+ {
+ List<string> dirs = new List<string> ();
+
+ for (int i = 1; i < 4; i++)
+ if (DBDirs[i].Dirname != null)
+ dirs.Add (DBDirs[i].Dirname);
+ return dirs.ToArray ();
+ }
+
+ public MSymbol Format { get { return Info.Format; } }
+
+ public static bool Changed (DateTime time)
+ {
+ update_all (false);
+ return (time < LastUpdateTime);
+ }
+
+ public bool NeedReload ()
+ {
+ return update_status ();
+ }
+
+ // For IComparable<MDatabase>
+ public int CompareTo (MDatabase other)
+ {
+ return (ListIndex == other.ListIndex
+ ? DirIndex - other.DirIndex
+ : ListIndex - other.ListIndex);