diff options
Diffstat (limited to 'mono/DBusType/Nil.cs')
-rw-r--r-- | mono/DBusType/Nil.cs | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/mono/DBusType/Nil.cs b/mono/DBusType/Nil.cs new file mode 100644 index 00000000..e39b64a9 --- /dev/null +++ b/mono/DBusType/Nil.cs @@ -0,0 +1,68 @@ +using System; +using System.Runtime.InteropServices; +using System.Reflection.Emit; + +using DBus; + +namespace DBus.DBusType +{ + /// <summary> + /// Marks a "void"/"unset"/"nonexistent"/"null" argument. + /// </summary> + public class Nil : IDBusType + { + public const char Code = 'v'; + + private Nil() + { + } + + public Nil(object nil) + { + } + + public Nil(IntPtr iter) + { + } + + public void Append(IntPtr iter) + { + if (!dbus_message_iter_append_nil(iter)) + throw new ApplicationException("Failed to append NIL argument"); + } + + public static bool Suits(System.Type type) + { + return false; + } + + public static void EmitMarshalIn(ILGenerator generator, Type type) + { + if (type.IsByRef) { + generator.Emit(OpCodes.Ldind_I1); + } + } + + public static void EmitMarshalOut(ILGenerator generator, Type type, bool isReturn) + { + generator.Emit(OpCodes.Unbox, type); + generator.Emit(OpCodes.Ldind_I1); + if (!isReturn) { + generator.Emit(OpCodes.Stind_I1); + } + } + + public object Get() + { + return null; + } + + public object Get(System.Type type) + { + throw new ArgumentException("Cannot cast DBus.Type.Nil to type '" + type.ToString() + "'"); + } + + [DllImport("dbus-1")] + private extern static bool dbus_message_iter_append_nil(IntPtr iter); + } +} |