Handle empty iterators.
authorOwen Fraser-Green <owen@discobabe.net>
Sat, 1 May 2004 19:56:27 +0000 (19:56 +0000)
committerOwen Fraser-Green <owen@discobabe.net>
Sat, 1 May 2004 19:56:27 +0000 (19:56 +0000)
ChangeLog
mono/Arguments.cs
mono/DBusType/Array.cs
mono/DBusType/Dict.cs

index 7ea9a6b..bcddcdf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2004-05-01  Owen Fraser-Green  <owen@discobabe.net>
+
+       * mono/DBusType/Dict.cs: Handle empty dicts
+       * mono/DBusType/Array.cs: Handle empty arrays
+       * mono/Arguments.cs: Handle empty arguments
+
 2004-04-30  Owen Fraser-Green  <owen@discobabe.net>
 
        * dbus-sharp.pc.in: Modified to include include Libs and Requires
index d5407a5..9b191a6 100644 (file)
@@ -181,15 +181,17 @@ namespace DBus
       string key = "";
 
       // Iterate through the parameters getting the type codes to a string
-      dbus_message_iter_init(message.RawMessage, iter);
+      bool empty = dbus_message_iter_init(message.RawMessage, iter);
 
-      do {
-       char code = (char) dbus_message_iter_get_arg_type(iter);
-       if (code == '\0')
-         return key;
-       
-       key += code;
-      } while (dbus_message_iter_next(iter));
+      if (!empty) {
+       do {
+         char code = (char) dbus_message_iter_get_arg_type(iter);
+         if (code == '\0')
+           return key;
+         
+         key += code;
+       } while (dbus_message_iter_next(iter));
+      }
       
       Marshal.FreeCoTaskMem(iter);
 
@@ -219,6 +221,7 @@ namespace DBus
     {
       private Arguments arguments;
       private bool started = false;
+      private bool empty = false;
       private IntPtr iter = Marshal.AllocCoTaskMem(Arguments.DBusMessageIterSize);
       
       public ArgumentsEnumerator(Arguments arguments)
@@ -238,13 +241,13 @@ namespace DBus
          return dbus_message_iter_next(iter);
        } else {
          started = true;
-         return true;
+         return !empty;
        }
       }
       
       public void Reset()
       {
-       dbus_message_iter_init(arguments.message.RawMessage, iter);
+       empty = dbus_message_iter_init(arguments.message.RawMessage, iter);
        started = false;
       }
       
@@ -274,7 +277,7 @@ namespace DBus
     private extern static bool dbus_message_iter_next(IntPtr iter);
 
     [DllImport("dbus-1")]
-    private extern static void dbus_message_iter_init(IntPtr rawMessage, IntPtr iter);
+    private extern static bool dbus_message_iter_init(IntPtr rawMessage, IntPtr iter);
 
     [DllImport("dbus-1")]
     private extern static int dbus_message_iter_get_arg_type(IntPtr iter);
index 34a842c..917fa78 100644 (file)
@@ -36,18 +36,20 @@ namespace DBus.DBusType
       IntPtr arrayIter = Marshal.AllocCoTaskMem(Arguments.DBusMessageIterSize);
       
       int elementTypeCode;
-      dbus_message_iter_init_array_iterator(iter, arrayIter, out elementTypeCode);
+      bool empty = dbus_message_iter_init_array_iterator(iter, arrayIter, out elementTypeCode);
       this.elementType = (Type) Arguments.DBusTypes[(char) elementTypeCode];
 
       elements = new ArrayList();
 
-      do {
-       object [] pars = new Object[2];
-       pars[0] = arrayIter;
-       pars[1] = service;
-       DBusType.IDBusType dbusType = (DBusType.IDBusType) Activator.CreateInstance(elementType, pars);
-       elements.Add(dbusType);
-      } while (dbus_message_iter_next(arrayIter));
+      if (!empty) {
+       do {
+         object [] pars = new Object[2];
+         pars[0] = arrayIter;
+         pars[1] = service;
+         DBusType.IDBusType dbusType = (DBusType.IDBusType) Activator.CreateInstance(elementType, pars);
+         elements.Add(dbusType);
+       } while (dbus_message_iter_next(arrayIter));
+      }
       
       Marshal.FreeCoTaskMem(arrayIter);
     }
@@ -118,7 +120,7 @@ namespace DBus.DBusType
     }    
 
     [DllImport("dbus-1")]
-    private extern static void dbus_message_iter_init_array_iterator(IntPtr iter,
+    private extern static bool dbus_message_iter_init_array_iterator(IntPtr iter,
                                                                     IntPtr arrayIter,
                                                                     out int elementType);
  
index bd64943..e93d7d7 100644 (file)
@@ -31,20 +31,22 @@ namespace DBus.DBusType
     {
       IntPtr dictIter = Marshal.AllocCoTaskMem(Arguments.DBusMessageIterSize);
       
-      dbus_message_iter_init_dict_iterator(iter, dictIter);
+      bool empty = dbus_message_iter_init_dict_iterator(iter, dictIter);
 
       this.val = new Hashtable();
 
-      do {
-       string key = dbus_message_iter_get_dict_key(dictIter);
-
-       // Get the argument type and get the value
-       Type elementType = (Type) DBus.Arguments.DBusTypes[(char) dbus_message_iter_get_arg_type(dictIter)];
-       object [] pars = new Object[1];
-       pars[0] = dictIter;
-       DBusType.IDBusType dbusType = (DBusType.IDBusType) Activator.CreateInstance(elementType, pars);
-       this.val.Add(key, dbusType);
-      } while (dbus_message_iter_next(dictIter));
+      if (!empty) {
+       do {
+         string key = dbus_message_iter_get_dict_key(dictIter);
+         
+         // Get the argument type and get the value
+         Type elementType = (Type) DBus.Arguments.DBusTypes[(char) dbus_message_iter_get_arg_type(dictIter)];
+         object [] pars = new Object[1];
+         pars[0] = dictIter;
+         DBusType.IDBusType dbusType = (DBusType.IDBusType) Activator.CreateInstance(elementType, pars);
+         this.val.Add(key, dbusType);
+       } while (dbus_message_iter_next(dictIter));
+      }
       
       Marshal.FreeCoTaskMem(dictIter);
     }
@@ -120,7 +122,7 @@ namespace DBus.DBusType
     }    
 
     [DllImport("dbus-1")]
-    private extern static void dbus_message_iter_init_dict_iterator(IntPtr iter,
+    private extern static bool dbus_message_iter_init_dict_iterator(IntPtr iter,
                                                                    IntPtr dictIter);
  
     [DllImport("dbus-1")]