*** empty log message ***
[m17n/m17n-lib-cs.git] / MDatabase.cs
index afefa61..01d5755 100644 (file)
@@ -240,7 +240,7 @@ namespace M17N.Core
       }
     }
 
-    public delegate object Loader (Tag tag, object extra_info);
+    public delegate MPlist Loader (Tag tag, object extra_info);
 
     internal class MDatabaseInfo
     {
@@ -417,7 +417,6 @@ namespace M17N.Core
       };
 
     public Tag tag;
-    public NameTable name_table = new NameTable ();
     private Loader loader;
     private object ExtraInfo;
     // Directory of the database file.
@@ -969,12 +968,6 @@ namespace M17N.Core
 
     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;
@@ -990,24 +983,12 @@ namespace M17N.Core
       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)
@@ -1024,123 +1005,163 @@ namespace M17N.Core
       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++)
@@ -1166,14 +1187,13 @@ namespace M17N.Core
            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