diff options
Diffstat (limited to 'mono/Message.cs')
-rw-r--r-- | mono/Message.cs | 437 |
1 files changed, 0 insertions, 437 deletions
diff --git a/mono/Message.cs b/mono/Message.cs deleted file mode 100644 index f9556b5d..00000000 --- a/mono/Message.cs +++ /dev/null @@ -1,437 +0,0 @@ -namespace DBus -{ - - using System; - using System.Runtime.InteropServices; - using System.Diagnostics; - using System.Collections; - - public class Message : IDisposable - { - private static Stack stack = new Stack (); - - static public Message Current { - get - { - return stack.Count > 0 ? (Message) stack.Peek () : null; - } - } - - static internal void Push (Message message) - { - stack.Push (message); - } - - static internal void Pop () - { - stack.Pop (); - } - - - /// <summary> - /// A pointer to the underlying Message structure - /// </summary> - private IntPtr rawMessage; - - /// <summary> - /// The current slot number - /// </summary> - private static int slot = -1; - - // Keep in sync with C - public enum MessageType - { - Invalid = 0, - MethodCall = 1, - MethodReturn = 2, - Error = 3, - Signal = 4 - } - - private Arguments arguments = null; - - protected Service service = null; - protected string pathName = null; - protected string interfaceName = null; - protected string name = null; - private string key= null; - - protected Message() - { - // An empty constructor for the sake of sub-classes which know how to construct theirselves. - } - - protected Message(IntPtr rawMessage, Service service) - { - RawMessage = rawMessage; - this.service = service; - } - - protected Message(MessageType messageType) - { - // the assignment bumps the refcount - RawMessage = dbus_message_new((int) messageType); - - if (RawMessage == IntPtr.Zero) { - throw new OutOfMemoryException(); - } - - dbus_message_unref(RawMessage); - } - - protected Message(MessageType messageType, Service service) : this(messageType) - { - this.service = service; - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - public void Dispose (bool disposing) - { - if (disposing) { - if (this.arguments != null) - this.arguments.Dispose (); - } - - RawMessage = IntPtr.Zero; // free the native object - } - - ~Message() - { - Dispose (false); - } - - public static Message Wrap(IntPtr rawMessage, Service service) - { - if (slot > -1) { - // If we already have a Message object associated with this rawMessage then return it - IntPtr rawThis = dbus_message_get_data(rawMessage, slot); - if (rawThis != IntPtr.Zero && ((GCHandle)rawThis).Target == typeof(DBus.Message)) - return (DBus.Message) ((GCHandle)rawThis).Target; - } - // If it doesn't exist then create a new Message around it - Message message = null; - MessageType messageType = (MessageType) dbus_message_get_type(rawMessage); - - switch (messageType) { - case MessageType.Signal: - message = new Signal(rawMessage, service); - break; - case MessageType.MethodCall: - message = new MethodCall(rawMessage, service); - break; - case MessageType.MethodReturn: - message = new MethodReturn(rawMessage, service); - break; - case MessageType.Error: - message = new ErrorMessage(rawMessage, service); - break; - default: - throw new ApplicationException("Unknown message type to wrap: " + messageType); - } - - return message; - } - - internal IntPtr RawMessage - { - get - { - return rawMessage; - } - set - { - if (value == rawMessage) - return; - - if (rawMessage != IntPtr.Zero) - { - // Get the reference to this - IntPtr rawThis = dbus_message_get_data(rawMessage, Slot); - Debug.Assert (rawThis != IntPtr.Zero); - - // Blank over the reference - dbus_message_set_data(rawMessage, Slot, IntPtr.Zero, IntPtr.Zero); - - // Free the reference - ((GCHandle) rawThis).Free(); - - // Unref the connection - dbus_message_unref(rawMessage); - } - - this.rawMessage = value; - - if (rawMessage != IntPtr.Zero) - { - GCHandle rawThis; - - dbus_message_ref(rawMessage); - - // We store a weak reference to the C# object on the C object - rawThis = GCHandle.Alloc(this, GCHandleType.WeakTrackResurrection); - - dbus_message_set_data(rawMessage, Slot, (IntPtr) rawThis, IntPtr.Zero); - } - } - } - - public void Send(ref int serial) - { - if (!dbus_connection_send (Service.Connection.RawConnection, RawMessage, ref serial)) - throw new OutOfMemoryException (); - - Service.Connection.Flush(); - } - - public void Send() - { - int ignored = 0; - Send(ref ignored); - } - - public void SendWithReply() - { - IntPtr rawPendingCall = IntPtr.Zero; - - if (!dbus_connection_send_with_reply (Service.Connection.RawConnection, RawMessage, rawPendingCall, Service.Connection.Timeout)) - throw new OutOfMemoryException(); - } - - public MethodReturn SendWithReplyAndBlock() - { - Error error = new Error(); - error.Init(); - - IntPtr rawMessage = dbus_connection_send_with_reply_and_block(Service.Connection.RawConnection, - RawMessage, - Service.Connection.Timeout, - ref error); - - if (rawMessage != IntPtr.Zero) { - MethodReturn methodReturn = new MethodReturn(rawMessage, Service); - // Ownership of a ref is passed onto us from - // dbus_connection_send_with_reply_and_block(). It gets reffed as - // a result of being passed into the MethodReturn ctor, so unref - // the extra one here. - dbus_message_unref (rawMessage); - - return methodReturn; - } else { - throw new DBusException(error); - } - } - - public MessageType Type - { - get - { - return (MessageType) dbus_message_get_type(RawMessage); - } - } - - public Service Service - { - set - { - if (this.service != null && (value.Name != this.service.Name)) { - if (!dbus_message_set_destination(RawMessage, value.Name)) { - throw new OutOfMemoryException(); - } - } - - this.service = value; - } - get - { - return this.service; - } - } - - protected virtual string PathName - { - set - { - if (value != this.pathName) - { - if (!dbus_message_set_path(RawMessage, value)) { - throw new OutOfMemoryException(); - } - - this.pathName = value; - } - } - get - { - if (this.pathName == null) { - this.pathName = Marshal.PtrToStringAnsi(dbus_message_get_path(RawMessage)); - } - - return this.pathName; - } - } - - protected virtual string InterfaceName - { - set - { - if (value != this.interfaceName) - { - dbus_message_set_interface (RawMessage, value); - this.interfaceName = value; - } - } - get - { - if (this.interfaceName == null) { - this.interfaceName = Marshal.PtrToStringAnsi(dbus_message_get_interface(RawMessage)); - } - - return this.interfaceName; - } - } - - protected virtual string Name - { - set { - if (value != this.name) { - dbus_message_set_member(RawMessage, value); - this.name = value; - } - } - get { - if (this.name == null) { - this.name = Marshal.PtrToStringAnsi(dbus_message_get_member(RawMessage)); - } - - return this.name; - } - } - - public string Key - { - get { - if (this.key == null) { - this.key = Name + " " + Arguments; - } - - return this.key; - } - } - - public Arguments Arguments - { - get - { - if (this.arguments == null) { - this.arguments = new Arguments(this); - } - - return this.arguments; - } - } - - public string Sender - { - get - { - return Marshal.PtrToStringAnsi(dbus_message_get_sender(RawMessage)); - } - } - - public string Destination - { - get - { - return Marshal.PtrToStringAnsi(dbus_message_get_destination(RawMessage)); - } - } - - protected int Slot - { - get - { - if (slot == -1) - { - // We need to initialize the slot - if (!dbus_message_allocate_data_slot (ref slot)) - throw new OutOfMemoryException (); - - Debug.Assert (slot >= 0); - } - - return slot; - } - } - - [DllImport ("dbus-1", EntryPoint="dbus_message_new")] - protected extern static IntPtr dbus_message_new (int messageType); - - [DllImport ("dbus-1", EntryPoint="dbus_message_unref")] - protected extern static void dbus_message_unref (IntPtr ptr); - - [DllImport ("dbus-1", EntryPoint="dbus_message_ref")] - protected extern static void dbus_message_ref (IntPtr ptr); - - [DllImport ("dbus-1", EntryPoint="dbus_message_allocate_data_slot")] - protected extern static bool dbus_message_allocate_data_slot (ref int slot); - - [DllImport ("dbus-1", EntryPoint="dbus_message_free_data_slot")] - protected extern static void dbus_message_free_data_slot (ref int slot); - - [DllImport ("dbus-1", EntryPoint="dbus_message_set_data")] - protected extern static bool dbus_message_set_data (IntPtr ptr, - int slot, - IntPtr data, - IntPtr free_data_func); - - [DllImport ("dbus-1", EntryPoint="dbus_message_get_data")] - protected extern static IntPtr dbus_message_get_data (IntPtr ptr, - int slot); - - [DllImport ("dbus-1", EntryPoint="dbus_connection_send")] - private extern static bool dbus_connection_send (IntPtr ptr, - IntPtr message, - ref int client_serial); - - [DllImport ("dbus-1", EntryPoint="dbus_connection_send_with_reply")] - private extern static bool dbus_connection_send_with_reply (IntPtr rawConnection, IntPtr rawMessage, IntPtr rawPendingCall, int timeout); - - [DllImport ("dbus-1", EntryPoint="dbus_connection_send_with_reply_and_block")] - private extern static IntPtr dbus_connection_send_with_reply_and_block (IntPtr rawConnection, IntPtr message, int timeout, ref Error error); - - [DllImport("dbus-1")] - private extern static int dbus_message_get_type(IntPtr rawMessage); - - [DllImport("dbus-1")] - private extern static bool dbus_message_set_path(IntPtr rawMessage, string pathName); - - [DllImport("dbus-1")] - private extern static IntPtr dbus_message_get_path(IntPtr rawMessage); - - [DllImport("dbus-1")] - private extern static bool dbus_message_set_interface (IntPtr rawMessage, string interfaceName); - - [DllImport("dbus-1")] - private extern static IntPtr dbus_message_get_interface(IntPtr rawMessage); - - [DllImport("dbus-1")] - private extern static bool dbus_message_set_member(IntPtr rawMessage, string name); - - [DllImport("dbus-1")] - private extern static IntPtr dbus_message_get_member(IntPtr rawMessage); - - [DllImport("dbus-1")] - private extern static bool dbus_message_set_destination(IntPtr rawMessage, string serviceName); - - [DllImport("dbus-1")] - private extern static IntPtr dbus_message_get_destination(IntPtr rawMessage); - - [DllImport("dbus-1")] - private extern static IntPtr dbus_message_get_sender(IntPtr rawMessage); - } -} |