From c916037773d7d3d8d37ca2c5a8899b7b728e377d Mon Sep 17 00:00:00 2001 From: Owen Fraser-Green Date: Tue, 23 Mar 2004 12:10:32 +0000 Subject: First checkin of the Mono bindings. --- mono/DBusType/ObjectPath.cs | 110 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 mono/DBusType/ObjectPath.cs (limited to 'mono/DBusType/ObjectPath.cs') diff --git a/mono/DBusType/ObjectPath.cs b/mono/DBusType/ObjectPath.cs new file mode 100644 index 00000000..e20ae18d --- /dev/null +++ b/mono/DBusType/ObjectPath.cs @@ -0,0 +1,110 @@ +using System; +using System.Runtime.InteropServices; +using System.Reflection.Emit; + +using DBus; + +namespace DBus.DBusType +{ + /// + /// An object path. + /// + public class ObjectPath : IDBusType + { + public const char Code = 'o'; + private string pathName = null; + private object val = null; + private Service service = null; + + private ObjectPath() + { + } + + public ObjectPath(object val) + { + this.val = val; + } + + public ObjectPath(IntPtr iter) + { + + this.pathName = Marshal.PtrToStringAnsi(dbus_message_iter_get_object_path(iter)); + } + + public void SetService(Service service) + { + this.service = service; + } + + private string PathName + { + get { + if (this.pathName == null && this.val != null) { + Handler handler = this.service.GetHandler(this.val); + this.pathName = handler.PathName; + } + + return this.pathName; + } + } + + public void Append(IntPtr iter) + { + if (PathName == null) { + throw new ApplicationException("Unable to append ObjectPath before calling SetService()"); + } + + if (!dbus_message_iter_append_object_path(iter, Marshal.StringToHGlobalAnsi(PathName))) + throw new ApplicationException("Failed to append OBJECT_PATH argument:" + val); + } + + public static bool Suits(System.Type type) + { + object[] attributes = type.GetCustomAttributes(typeof(InterfaceAttribute), true); + if (attributes.Length == 1) { + return true; + } else { + return false; + } + } + + public static void EmitMarshalIn(ILGenerator generator, Type type) + { + if (type.IsByRef) { + generator.Emit(OpCodes.Ldind_Ref); + } + } + + public static void EmitMarshalOut(ILGenerator generator, Type type, bool isReturn) + { + generator.Emit(OpCodes.Castclass, type); + if (!isReturn) { + generator.Emit(OpCodes.Stind_Ref); + } + } + + public object Get() + { + throw new ArgumentException("Cannot call Get on an ObjectPath without specifying type."); + } + + public object Get(System.Type type) + { + if (this.service == null) { + throw new ApplicationException("Unable to get ObjectPath before calling SetService()"); + } + + try { + return this.service.GetObject(type, PathName); + } catch(Exception ex) { + throw new ArgumentException("Cannot cast object pointed to by Object Path to type '" + type.ToString() + "': " + ex); + } + } + + [DllImport("dbus-1")] + private extern static IntPtr dbus_message_iter_get_object_path(IntPtr iter); + + [DllImport("dbus-1")] + private extern static bool dbus_message_iter_append_object_path(IntPtr iter, IntPtr pathName); + } +} -- cgit