}
}
- public delegate object Loader (Tag tag, object extra_info);
+ public delegate MPlist Loader (Tag tag, object extra_info);
internal class MDatabaseInfo
{
};
public Tag tag;
- public NameTable name_table = new NameTable ();
private Loader loader;
private object ExtraInfo;
// Directory of the database file.
private FileStream get_stream ()
{
- if (loader != null
- || (Info.Format != MSymbol.plist && Info.Format != Mxml))
- {
- LastLoadStatus = LoadStatus.InvalidLoadMethod;
- return null;
- }
if (DBStatus != MDBStatus.READY)
{
LastLoadStatus = LoadStatus.NotAvailable;
return stream;
}
- public object Load ()
+ public MPlist Load ()
{
if (loader != null)
return loader (tag, ExtraInfo);
- if (Info.Format == Mxml)
- {
- XmlDocument doc = new XmlDocument (name_table);
- try {
- XmlTextReader reader
- = new XmlTextReader (FileInfo.FullName, name_table);
- doc.Load (reader);
- LastLoaded = DateTime.Now;
- } catch (Exception e) {
- Console.WriteLine (e);
- LastLoadStatus = LoadStatus.InvalidContents;
- }
- return doc;
- }
+ if (Info.Format != MSymbol.plist)
+ throw new Exception ("Not a plist database");
FileStream stream = get_stream ();
if (stream == null)
return plist;
}
- public object Load (MSymbol key, MSymbol stop)
+ public MPlist Load (MSymbol key, MSymbol stop)
{
- FileStream stream = get_stream ();
+ if (loader != null)
+ throw new Exception ("Partial load is impossible");
+ if (Info.Format != MSymbol.plist)
+ throw new Exception ("Not a plist database");
+ FileStream stream = get_stream ();
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 = doc.DocumentElement;
- while (reader.NodeType == XmlNodeType.Element
- ? reader.Name != stop.Name
- : reader.NodeType != XmlNodeType.EndElement)
- if (reader.NodeType == XmlNodeType.Element
- && reader.Name == key.Name)
- node = doc.DocumentElement.InsertAfter (doc.ReadNode (reader),
- node);
- } finally {
- reader.Close ();
- stream.Dispose ();
- }
- return doc;
- }
-
- MPlist plist = null;
try {
- plist = new MPlist (stream, key, stop);
+ MPlist plist = new MPlist (stream, key, stop);
LastLoaded = DateTime.Now;
+ return plist;
} catch {
LastLoadStatus = LoadStatus.InvalidContents;
+ return null;
} finally {
stream.Dispose ();
}
- return plist;
}
- public object Load (MSymbol stop)
+ public MPlist Load (MSymbol stop)
{
- FileStream stream = get_stream ();
+ if (loader != null)
+ throw new Exception ("Partial load is impossible");
+ if (Info.Format != MSymbol.plist)
+ throw new Exception ("Not a plist database");
+ FileStream stream = get_stream ();
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);
+ MPlist plist = new MPlist (stream, stop);
LastLoaded = DateTime.Now;
+ return plist;
} catch (Exception e) {
Console.WriteLine (e);
LastLoadStatus = LoadStatus.InvalidContents;
+ return null;
} finally {
stream.Dispose ();
}
- return plist;
}
- public XmlNode Load (string id, params string[] nodes)
+ private XmlTextReader get_reader (XmlDocument doc)
+ {
+ XmlTextReader reader;
+
+ try {
+ if (doc.NameTable != null)
+ reader = new XmlTextReader (FileInfo.FullName, doc.NameTable);
+ else
+ reader = new XmlTextReader (FileInfo.FullName);
+ reader.WhitespaceHandling = WhitespaceHandling.None;
+ } catch {
+ LastLoadStatus = LoadStatus.NotReadable;
+ reader = null;
+ }
+ return reader;
+ }
+
+ public bool Load (XmlDocument doc)
{
- FileStream stream = get_stream ();
- if (stream == null)
- return null;
if (Info.Format != Mxml)
- throw new Exception ("Not an XML format");
+ throw new Exception ("Not an XML database");
+ XmlTextReader reader = get_reader (doc);
+ if (reader == null)
+ return false;
+ try {
+ doc.Load (reader);
+ LastLoaded = DateTime.Now;
+ return true;
+ } catch (Exception e) {
+ Console.WriteLine (e);
+ LastLoadStatus = LoadStatus.InvalidContents;
+ return false;
+ } finally {
+ reader.Close ();
+ }
+ }
- XmlDocument doc = new XmlDocument (name_table);
- XmlTextReader reader = new XmlTextReader (stream, name_table);
- int len = nodes.Length;
+ public bool Load (XmlDocument doc, MSymbol key, MSymbol stop)
+ {
+ if (Info.Format != Mxml)
+ throw new Exception ("Not an XML database");
+ XmlTextReader reader = get_reader (doc);
+ if (reader == null)
+ return false;
+ try {
+ reader.Read ();
+ while (reader.NodeType != XmlNodeType.Element)
+ reader.Read ();
+ doc.LoadXml ("<" + reader.Name + "></" + reader.Name + ">");
+ reader.Read ();
+ XmlNode node = doc.DocumentElement;
+ while (reader.NodeType == XmlNodeType.Element
+ ? reader.Name != stop.Name
+ : reader.NodeType != XmlNodeType.EndElement)
+ if (reader.NodeType == XmlNodeType.Element
+ && reader.Name == key.Name)
+ node = doc.DocumentElement.InsertAfter (doc.ReadNode (reader),
+ node);
+ return true;
+ } catch (Exception e) {
+ Console.WriteLine (e);
+ return false;
+ } finally {
+ reader.Close ();
+ }
+ }
- reader.WhitespaceHandling = WhitespaceHandling.None;
- do {
+ public bool Load (XmlDocument doc, MSymbol stop)
+ {
+ if (Info.Format != Mxml)
+ throw new Exception ("Not an XML database");
+ XmlTextReader reader = get_reader (doc);
+ if (reader == null)
+ return false;
+ try {
reader.Read ();
- } while (reader.NodeType != XmlNodeType.Element);
+ while (reader.NodeType != XmlNodeType.Element)
+ reader.Read ();
+ doc.LoadXml ("<" + reader.Name + "></" + reader.Name + ">");
+ reader.Read ();
+ XmlNode node = doc.DocumentElement;
+ while (reader.NodeType == XmlNodeType.Element
+ ? reader.Name != stop.Name
+ : reader.NodeType != XmlNodeType.EndElement)
+ node = doc.DocumentElement.InsertAfter (doc.ReadNode (reader), node);
+ return true;
+ } catch (Exception e) {
+ Console.WriteLine (e);
+ return false;
+ } finally {
+ reader.Close ();
+ }
+ }
- if (reader.Name != nodes[0])
+ public XmlNode Load (XmlDocument doc, string id, params string[] nodes)
+ {
+ if (Info.Format != Mxml)
+ throw new Exception ("Not an XML database");
+ XmlTextReader reader = get_reader (doc);
+ if (reader == null)
return null;
-
- string ns = reader.GetAttribute ("xmlns");
- XmlNode top = doc.CreateNode (XmlNodeType.Element, nodes[0], ns);
- XmlNode node = top;
-
try {
+ int len = nodes.Length;
+ 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;
int i;
for (i = 1; i + 1 < len; i++)
else
reader.Read ();
}
-
+ return top;
} catch (Exception e) {
Console.WriteLine (e);
+ return null;
} finally {
reader.Close ();
- stream.Dispose ();
}
- return top;
}
/// <summary>Return a list of currently available database