dbus-pending-call.c revision e3dc6e281aae288e995f9d6a2675662ac3d0749f
1a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/* -*- mode: C; c-file-style: "gnu" -*- */ 2a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/* dbus-pending-call.c Object representing a call in progress. 3a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 4a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Copyright (C) 2002, 2003 Red Hat Inc. 5a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 643605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1 7a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 8a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * This program is free software; you can redistribute it and/or modify 9a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * it under the terms of the GNU General Public License as published by 10a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * the Free Software Foundation; either version 2 of the License, or 11a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * (at your option) any later version. 12a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 13a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * This program is distributed in the hope that it will be useful, 14a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of 15a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * GNU General Public License for more details. 17a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 18a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * You should have received a copy of the GNU General Public License 19a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * along with this program; if not, write to the Free Software 20a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 22a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */ 23a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 24a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington#include "dbus-internals.h" 25ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington#include "dbus-connection-internal.h" 26e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J#include "dbus-pending-call-internal.h" 27ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington#include "dbus-pending-call.h" 28a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington#include "dbus-list.h" 29a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington#include "dbus-threads.h" 30a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington#include "dbus-test.h" 31a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 32a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/** 33a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @defgroup DBusPendingCallInternals DBusPendingCall implementation details 34a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @ingroup DBusInternals 35a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @brief DBusPendingCall private implementation details. 36a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 37a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * The guts of DBusPendingCall and its methods. 38a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 39a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @{ 40a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */ 41a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 42e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 43e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @brief Internals of DBusPendingCall 44e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 45e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Opaque object representing a reply message that we're waiting for. 46e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 47e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jstruct DBusPendingCall 48e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 49e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusAtomic refcount; /**< reference count */ 50e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 51e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusDataSlotList slot_list; /**< Data stored by allocated integer ID */ 52e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 53e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusPendingCallNotifyFunction function; /**< Notifier when reply arrives. */ 54e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 55e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusConnection *connection; /**< Connections we're associated with */ 56e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusMessage *reply; /**< Reply (after we've received it) */ 57e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusTimeout *timeout; /**< Timeout */ 58e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 59e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusList *timeout_link; /**< Preallocated timeout response */ 60e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 61e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J dbus_uint32_t reply_serial; /**< Expected serial of reply */ 62e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 63e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J unsigned int completed : 1; /**< TRUE if completed */ 64e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J unsigned int timeout_added : 1; /**< Have added the timeout */ 65e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J}; 66e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 67583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtonstatic dbus_int32_t notify_user_data_slot = -1; 68583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 69a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/** 70a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Creates a new pending reply object. 71a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 72a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param connection connection where reply will arrive 73ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param timeout_milliseconds length of timeout, -1 for default 74ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param timeout_handler timeout handler, takes pending call as data 75a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @returns a new #DBusPendingCall or #NULL if no memory. 76a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */ 77a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc PenningtonDBusPendingCall* 78ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington_dbus_pending_call_new (DBusConnection *connection, 79ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington int timeout_milliseconds, 80ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington DBusTimeoutHandler timeout_handler) 81a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{ 82a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington DBusPendingCall *pending; 83ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington DBusTimeout *timeout; 84a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 85aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington _dbus_assert (timeout_milliseconds >= 0 || timeout_milliseconds == -1); 86ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 87ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington if (timeout_milliseconds == -1) 88ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington timeout_milliseconds = _DBUS_DEFAULT_TIMEOUT_VALUE; 89583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 909e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington /* it would probably seem logical to pass in _DBUS_INT_MAX for 919e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * infinite timeout, but then math in 929e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * _dbus_connection_block_for_reply would get all overflow-prone, so 939e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * smack that down. 949e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington */ 959e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington if (timeout_milliseconds > _DBUS_ONE_HOUR_IN_MILLISECONDS * 6) 969e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington timeout_milliseconds = _DBUS_ONE_HOUR_IN_MILLISECONDS * 6; 979e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington 98583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington if (!dbus_pending_call_allocate_data_slot (¬ify_user_data_slot)) 99583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington return NULL; 100ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 1014097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington pending = dbus_new0 (DBusPendingCall, 1); 102a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 103a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington if (pending == NULL) 104583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington { 105583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington dbus_pending_call_free_data_slot (¬ify_user_data_slot); 106583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington return NULL; 107583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington } 108a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 109ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington timeout = _dbus_timeout_new (timeout_milliseconds, 110ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington timeout_handler, 111ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington pending, NULL); 112ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 113ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington if (timeout == NULL) 114ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington { 115583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington dbus_pending_call_free_data_slot (¬ify_user_data_slot); 116ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington dbus_free (pending); 117ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington return NULL; 118ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington } 119ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 120a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington pending->refcount.value = 1; 121a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington pending->connection = connection; 122ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington pending->timeout = timeout; 123583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 124583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington _dbus_data_slot_list_init (&pending->slot_list); 125ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 126a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington return pending; 127a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington} 128a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 129ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington/** 130e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Sets the reply of a pending call with the given message, 131e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * or if the message is #NULL, by timing out the pending call. 132e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 133e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending call 134e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param message the message to complete the call with, or #NULL 135e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * to time out the call 136e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 137e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jvoid 138e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J_dbus_pending_call_set_reply (DBusPendingCall *pending, 139e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusMessage *message) 140e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 141e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J if (message == NULL) 142e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J { 143e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J message = pending->timeout_link->data; 144e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_list_clear (&pending->timeout_link); 145e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J } 146e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J else 147e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J dbus_message_ref (message); 148e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 149e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_verbose (" handing message %p (%s) to pending call serial %u\n", 150e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J message, 151e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN ? 152e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J "method return" : 153e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR ? 154e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J "error" : "other type", 155e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J pending->reply_serial); 156e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 157e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending->reply == NULL); 158e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending->reply_serial == dbus_message_get_reply_serial (message)); 159e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J pending->reply = message; 160e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 161e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 162e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 163ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * Calls notifier function for the pending call 164ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * and sets the call to completed. 165ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * 166ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param pending the pending call 167ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * 168ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington */ 169ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Penningtonvoid 170e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J_dbus_pending_call_complete (DBusPendingCall *pending) 171ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington{ 1729e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington _dbus_assert (!pending->completed); 1739e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington 174ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington pending->completed = TRUE; 175ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 176ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington if (pending->function) 177583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington { 178583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington void *user_data; 179583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington user_data = dbus_pending_call_get_data (pending, 180583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington notify_user_data_slot); 181583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 182583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington (* pending->function) (pending, user_data); 183583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington } 184ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington} 185ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 186e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jvoid 187e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J_dbus_pending_call_queue_timeout_error (DBusPendingCall *pending, 188e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusConnection *connection) 189e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 190e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J if (pending->timeout_link) 191e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J { 192e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_connection_queue_synthesized_message_link (connection, 193e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J pending->timeout_link); 194e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J pending->timeout_link = NULL; 195e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J } 196e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 197e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 198e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 199e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Checks to see if a timeout has been added 200e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 201e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call 202e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @returns #TRUE if there is a timeout or #FALSE if not 203e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 204e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jdbus_bool_t 205e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J_dbus_pending_call_is_timeout_added (DBusPendingCall *pending) 206e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 207e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending != NULL); 208e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 209e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J return pending->timeout_added; 210e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 211e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 212e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 213e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 214e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Sets wether the timeout has been added 215e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 216e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call 217e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param is_added whether or not a timeout is added 218e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 219e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jvoid 220e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J_dbus_pending_call_set_timeout_added (DBusPendingCall *pending, 221e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J dbus_bool_t is_added) 222e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 223e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending != NULL); 224e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 225e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J pending->timeout_added = is_added; 226e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 227e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 228e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 229e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 230e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Retrives the timeout 231e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 232e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call 233e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @returns a timeout object 234e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 235e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (JDBusTimeout * 236e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J_dbus_pending_call_get_timeout (DBusPendingCall *pending) 237e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 238e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending != NULL); 239e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 240e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J return pending->timeout; 241e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 242e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 243e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 244e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Gets the reply's serial number 245e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 246e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call 247e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @returns a serial number for the reply or 0 248e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 249e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jdbus_uint32_t 250e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J_dbus_pending_call_get_reply_serial (DBusPendingCall *pending) 251e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 252e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending != NULL); 253e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 254e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J return pending->reply_serial; 255e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 256e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 257e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 258e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Sets the reply's serial number 259e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 260e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call 261e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param serial the serial number 262e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 263e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jvoid 264e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J_dbus_pending_call_set_reply_serial (DBusPendingCall *pending, 265e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J dbus_uint32_t serial) 266e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 267e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending != NULL); 268e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending->reply_serial == 0); 269e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 270e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J pending->reply_serial = serial; 271e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 272e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 273e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 274e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Gets the connection associated with this pending call 275e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 276e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call 277e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @returns the connection associated with the pending call 278e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 279e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (JDBusConnection * 280e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J_dbus_pending_call_get_connection (DBusPendingCall *pending) 281e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 282e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending != NULL); 283e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 284e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J return pending->connection; 285e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 286e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 287e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 288e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Sets the connection associated with the pending call 289e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 290e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call 291e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param connection the connection which is associated with the pending call 292e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 293e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jvoid 294e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J_dbus_pending_call_set_connection (DBusPendingCall *pending, 295e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusConnection *connection) 296e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 297e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending != NULL); 298e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 299e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J pending->connection = connection; 300e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 301e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 302e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 303e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * NULLs out the connection 304e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 305e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call 306e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 307e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jvoid 308e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J_dbus_pending_call_clear_connection (DBusPendingCall *pending) 309e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 310e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_assert (pending != NULL); 311e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 312e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J pending->connection = NULL; 313e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 314e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 315e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/** 316e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Sets the reply message associated with the pending call to a timeout error 317e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * 318e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call 319e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param message the message we are sending the error reply to 320e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param serial serial number for the reply 321e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @return #FALSE on OOM 322e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */ 323e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jdbus_bool_t 324e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J_dbus_pending_call_set_timeout_error (DBusPendingCall *pending, 325e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusMessage *message, 326e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J dbus_uint32_t serial) 327e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{ 328e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusList *reply_link; 329e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J DBusMessage *reply; 330e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 331e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J reply = dbus_message_new_error (message, DBUS_ERROR_NO_REPLY, 332e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J "No reply within specified time"); 333e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J if (reply == NULL) 334e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J return FALSE; 335e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 336e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J reply_link = _dbus_list_alloc_link (reply); 337e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J if (reply_link == NULL) 338e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J { 339e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J dbus_message_unref (reply); 340e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J return FALSE; 341e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J } 342e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 343e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J pending->timeout_link = reply_link; 344e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 345e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J _dbus_pending_call_set_reply_serial (pending, serial); 346e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 347e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J return TRUE; 348e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J} 349e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J 350a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/** @} */ 351a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 352a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/** 353a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @defgroup DBusPendingCall DBusPendingCall 354a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @ingroup DBus 355a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @brief Pending reply to a method call message 356a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 357a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * A DBusPendingCall is an object representing an 358a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * expected reply. A #DBusPendingCall can be created 359a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * when you send a message that should have a reply. 360a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 361a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @{ 362a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */ 363a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 364a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/** 365a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @typedef DBusPendingCall 366a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 367a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Opaque data type representing a message pending. 368a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */ 369a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 370a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/** 371a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Increments the reference count on a pending call. 372a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 373a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param pending the pending call object 3749f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal * @returns the pending call object 375a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */ 3769f1a60dbba69844c0a04b3dd86280352736187ceMikael HallendalDBusPendingCall * 377a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Penningtondbus_pending_call_ref (DBusPendingCall *pending) 378a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{ 379eacb2afdc2903874f5dfde80b4ee338ea333c75eOlivier Andrieu _dbus_return_val_if_fail (pending != NULL, NULL); 380a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 381a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington _dbus_atomic_inc (&pending->refcount); 3829f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal 3839f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal return pending; 384a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington} 385a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 386a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/** 387a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Decrements the reference count on a pending call, 388a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * freeing it if the count reaches 0. 389a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 390a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param pending the pending call object 391a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */ 392a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Penningtonvoid 393a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Penningtondbus_pending_call_unref (DBusPendingCall *pending) 394a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{ 395a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington dbus_bool_t last_unref; 396a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 397a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington _dbus_return_if_fail (pending != NULL); 398a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 399a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington last_unref = (_dbus_atomic_dec (&pending->refcount) == 1); 400a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 401a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington if (last_unref) 402a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington { 403ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington /* If we get here, we should be already detached 404ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * from the connection, or never attached. 405ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington */ 406ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington _dbus_assert (pending->connection == NULL); 407ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington _dbus_assert (!pending->timeout_added); 408ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 409ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington /* this assumes we aren't holding connection lock... */ 410583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington _dbus_data_slot_list_free (&pending->slot_list); 411583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 412ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington if (pending->timeout != NULL) 413ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington _dbus_timeout_unref (pending->timeout); 414ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 415ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington if (pending->timeout_link) 416a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington { 417ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington dbus_message_unref ((DBusMessage *)pending->timeout_link->data); 418ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington _dbus_list_free_link (pending->timeout_link); 419ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington pending->timeout_link = NULL; 420a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington } 421a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 422a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington if (pending->reply) 423a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington { 424a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington dbus_message_unref (pending->reply); 425a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington pending->reply = NULL; 426a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington } 427a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 428a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington dbus_free (pending); 429583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 430583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington dbus_pending_call_free_data_slot (¬ify_user_data_slot); 431a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington } 432a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington} 433a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 434a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/** 435a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Sets a notification function to be called when the reply is 436a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * received or the pending call times out. 437a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 438a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param pending the pending call 439a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param function notifier function 440a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param user_data data to pass to notifier function 441a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param free_user_data function to free the user data 442583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @returns #FALSE if not enough memory 443a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */ 444583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_bool_t 445a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Penningtondbus_pending_call_set_notify (DBusPendingCall *pending, 446a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington DBusPendingCallNotifyFunction function, 447a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington void *user_data, 448a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington DBusFreeFunction free_user_data) 449a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{ 450583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington _dbus_return_val_if_fail (pending != NULL, FALSE); 451a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 452583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington /* could invoke application code! */ 453583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington if (!dbus_pending_call_set_data (pending, notify_user_data_slot, 454583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington user_data, free_user_data)) 455583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington return FALSE; 456583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 457a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington pending->function = function; 458a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 459583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington return TRUE; 460a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington} 461a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 462ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington/** 4631dcacffc325e50754d4cc3338822d1f03c8b6e45Havoc Pennington * Cancels the pending call, such that any reply or error received 4641dcacffc325e50754d4cc3338822d1f03c8b6e45Havoc Pennington * will just be ignored. Drops the dbus library's internal reference 4651dcacffc325e50754d4cc3338822d1f03c8b6e45Havoc Pennington * to the #DBusPendingCall so will free the call if nobody else is 4661dcacffc325e50754d4cc3338822d1f03c8b6e45Havoc Pennington * holding a reference. However you usually get a reference 4671dcacffc325e50754d4cc3338822d1f03c8b6e45Havoc Pennington * from dbus_connection_send() so probably your app owns a ref also. 468ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * 469ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param pending the pending call 470ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington */ 471ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Penningtonvoid 472ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Penningtondbus_pending_call_cancel (DBusPendingCall *pending) 473ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington{ 474ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington if (pending->connection) 475ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington _dbus_connection_remove_pending_call (pending->connection, 476ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington pending); 477ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington} 478a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 479ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington/** 480ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * Checks whether the pending call has received a reply 481ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * yet, or not. 482ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * 483583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @todo not thread safe? I guess it has to lock though it sucks 484583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * 485ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param pending the pending call 486583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @returns #TRUE if a reply has been received */ 487ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Penningtondbus_bool_t 488ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Penningtondbus_pending_call_get_completed (DBusPendingCall *pending) 489a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{ 490ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington return pending->completed; 491a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington} 492a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 493ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington/** 4949e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * Gets the reply, or returns #NULL if none has been received 4959e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * yet. Ownership of the reply message passes to the caller. This 4969e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * function can only be called once per pending call, since the reply 4979e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * message is tranferred to the caller. 498583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * 499ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param pending the pending call 500ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @returns the reply message or #NULL. 501ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington */ 502ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc PenningtonDBusMessage* 5039e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Penningtondbus_pending_call_steal_reply (DBusPendingCall *pending) 504a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{ 5059e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington DBusMessage *message; 5069e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington 5079e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington _dbus_return_val_if_fail (pending->completed, NULL); 5089e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington _dbus_return_val_if_fail (pending->reply != NULL, NULL); 5099e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington 5109e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington message = pending->reply; 5119e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington pending->reply = NULL; 5129e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington 5139e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington return message; 514a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington} 515a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 516a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington/** 517a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * Block until the pending call is completed. The blocking is as with 518a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * dbus_connection_send_with_reply_and_block(); it does not enter the 519a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * main loop or process other messages, it simply waits for the reply 520a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * in question. 521a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * 522583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * If the pending call is already completed, this function returns 523583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * immediately. 524583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * 525a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * @todo when you start blocking, the timeout is reset, but it should 526a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * really only use time remaining since the pending call was created. 527a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * 528a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * @param pending the pending call 529a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington */ 530a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Penningtonvoid 531a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Penningtondbus_pending_call_block (DBusPendingCall *pending) 532a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington{ 5339e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington _dbus_connection_block_pending_call (pending); 534a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington} 535a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington 536583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtonstatic DBusDataSlotAllocator slot_allocator; 537583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington_DBUS_DEFINE_GLOBAL_LOCK (pending_call_slots); 538583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 539583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington/** 540583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * Allocates an integer ID to be used for storing application-specific 541583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * data on any DBusPendingCall. The allocated ID may then be used 542583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * with dbus_pending_call_set_data() and dbus_pending_call_get_data(). 543583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * The passed-in slot must be initialized to -1, and is filled in 544583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * with the slot ID. If the passed-in slot is not -1, it's assumed 545583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * to be already allocated, and its refcount is incremented. 546583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * 547583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * The allocated slot is global, i.e. all DBusPendingCall objects will 548583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * have a slot with the given integer ID reserved. 549583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * 550583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param slot_p address of a global variable storing the slot 551583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @returns #FALSE on failure (no memory) 552583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington */ 553583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_bool_t 554583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_pending_call_allocate_data_slot (dbus_int32_t *slot_p) 555583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington{ 556583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington return _dbus_data_slot_allocator_alloc (&slot_allocator, 557583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington _DBUS_LOCK_NAME (pending_call_slots), 558583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington slot_p); 559583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington} 560583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 561583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington/** 562583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * Deallocates a global ID for #DBusPendingCall data slots. 563583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * dbus_pending_call_get_data() and dbus_pending_call_set_data() may 564583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * no longer be used with this slot. Existing data stored on existing 565583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * DBusPendingCall objects will be freed when the #DBusPendingCall is 566583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * finalized, but may not be retrieved (and may only be replaced if 567583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * someone else reallocates the slot). When the refcount on the 568583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * passed-in slot reaches 0, it is set to -1. 569583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * 570583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param slot_p address storing the slot to deallocate 571583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington */ 572583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtonvoid 573583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_pending_call_free_data_slot (dbus_int32_t *slot_p) 574583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington{ 575583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington _dbus_return_if_fail (*slot_p >= 0); 576583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 577583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington _dbus_data_slot_allocator_free (&slot_allocator, slot_p); 578583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington} 579583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 580583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington/** 581583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * Stores a pointer on a #DBusPendingCall, along 582583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * with an optional function to be used for freeing 583583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * the data when the data is set again, or when 584583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * the pending call is finalized. The slot number 585583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * must have been allocated with dbus_pending_call_allocate_data_slot(). 586583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * 587583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param pending the pending_call 588583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param slot the slot number 589583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param data the data to store 590583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param free_data_func finalizer function for the data 591583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @returns #TRUE if there was enough memory to store the data 592583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington */ 593583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_bool_t 594583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_pending_call_set_data (DBusPendingCall *pending, 595583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington dbus_int32_t slot, 596583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington void *data, 597583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington DBusFreeFunction free_data_func) 598583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington{ 599583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington DBusFreeFunction old_free_func; 600583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington void *old_data; 601583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington dbus_bool_t retval; 602583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 603583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington _dbus_return_val_if_fail (pending != NULL, FALSE); 604583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington _dbus_return_val_if_fail (slot >= 0, FALSE); 605583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 606583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington retval = _dbus_data_slot_list_set (&slot_allocator, 607583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington &pending->slot_list, 608583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington slot, data, free_data_func, 609583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington &old_free_func, &old_data); 610583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 611583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington if (retval) 612583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington { 613583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington if (old_free_func) 614583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington (* old_free_func) (old_data); 615583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington } 616583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 617583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington return retval; 618583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington} 619583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 620583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington/** 621583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * Retrieves data previously set with dbus_pending_call_set_data(). 622583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * The slot must still be allocated (must not have been freed). 623583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * 624583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param pending the pending_call 625583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param slot the slot to get data from 626583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @returns the data, or #NULL if not found 627583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington */ 628583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtonvoid* 629583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_pending_call_get_data (DBusPendingCall *pending, 630583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington dbus_int32_t slot) 631583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington{ 632583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington void *res; 633583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 634583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington _dbus_return_val_if_fail (pending != NULL, NULL); 635583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 636583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington res = _dbus_data_slot_list_get (&slot_allocator, 637583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington &pending->slot_list, 638583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington slot); 639583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 640583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington return res; 641583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington} 642583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington 643ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington/** @} */ 644ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 645ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington#ifdef DBUS_BUILD_TESTS 646ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington 647a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/** 648a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @ingroup DBusPendingCallInternals 649a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Unit test for DBusPendingCall. 650a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * 651a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @returns #TRUE on success. 652a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */ 653a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Penningtondbus_bool_t 654a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington_dbus_pending_call_test (const char *test_data_dir) 655a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{ 656a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington 657a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington return TRUE; 658a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington} 659a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington#endif /* DBUS_BUILD_TESTS */ 660