dbus-pending-call.c revision 174c63f176b9074ffe3cca8df016c53d68cafce9
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 */
4715ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington
4815ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington/**
4915ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * shorter and more visible way to write _dbus_connection_lock()
5015ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington */
51222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J#define CONNECTION_LOCK(connection)   _dbus_connection_lock(connection)
5215ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington/**
5315ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * shorter and more visible way to write _dbus_connection_unlock()
5415ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington */
55222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J#define CONNECTION_UNLOCK(connection) _dbus_connection_unlock(connection)
56222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
572a895edf6b1cad3915f5ca9e8b41f4bba780b2e0Havoc Pennington/**
582a895edf6b1cad3915f5ca9e8b41f4bba780b2e0Havoc Pennington * Implementation details of #DBusPendingCall - all fields are private.
592a895edf6b1cad3915f5ca9e8b41f4bba780b2e0Havoc Pennington */
60e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jstruct DBusPendingCall
61e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{
62e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  DBusAtomic refcount;                            /**< reference count */
63e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
64e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  DBusDataSlotList slot_list;                     /**< Data stored by allocated integer ID */
65e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
66e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  DBusPendingCallNotifyFunction function;         /**< Notifier when reply arrives. */
67e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
68e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  DBusConnection *connection;                     /**< Connections we're associated with */
69e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  DBusMessage *reply;                             /**< Reply (after we've received it) */
70e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  DBusTimeout *timeout;                           /**< Timeout */
71e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
72e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  DBusList *timeout_link;                         /**< Preallocated timeout response */
73e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
74e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  dbus_uint32_t reply_serial;                     /**< Expected serial of reply */
75e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
76e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  unsigned int completed : 1;                     /**< TRUE if completed */
77e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  unsigned int timeout_added : 1;                 /**< Have added the timeout */
78e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J};
79e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
80583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtonstatic dbus_int32_t notify_user_data_slot = -1;
81583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington
82a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/**
83a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Creates a new pending reply object.
84a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington *
85a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param connection connection where reply will arrive
86ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param timeout_milliseconds length of timeout, -1 for default
87ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param timeout_handler timeout handler, takes pending call as data
88a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @returns a new #DBusPendingCall or #NULL if no memory.
89a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */
90a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc PenningtonDBusPendingCall*
91222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_new_unlocked (DBusConnection    *connection,
92222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J                                 int                timeout_milliseconds,
93222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J                                 DBusTimeoutHandler timeout_handler)
94a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{
95a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington  DBusPendingCall *pending;
96ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington  DBusTimeout *timeout;
97a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington
98aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington  _dbus_assert (timeout_milliseconds >= 0 || timeout_milliseconds == -1);
995efe8e7f1d97931710558495a951e0b35afbfb72John (J
100ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington  if (timeout_milliseconds == -1)
101ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington    timeout_milliseconds = _DBUS_DEFAULT_TIMEOUT_VALUE;
102583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington
1039e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington  /* it would probably seem logical to pass in _DBUS_INT_MAX for
1049e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington   * infinite timeout, but then math in
1059e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington   * _dbus_connection_block_for_reply would get all overflow-prone, so
1069e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington   * smack that down.
1079e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington   */
1089e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington  if (timeout_milliseconds > _DBUS_ONE_HOUR_IN_MILLISECONDS * 6)
1099e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington    timeout_milliseconds = _DBUS_ONE_HOUR_IN_MILLISECONDS * 6;
1109e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington
111583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington  if (!dbus_pending_call_allocate_data_slot (&notify_user_data_slot))
112583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington    return NULL;
113ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington
1144097e94af3d2fb1eb865343e3f76ca3949e7c69bHavoc Pennington  pending = dbus_new0 (DBusPendingCall, 1);
115a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington
116a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington  if (pending == NULL)
117583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington    {
118583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington      dbus_pending_call_free_data_slot (&notify_user_data_slot);
119583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington      return NULL;
120583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington    }
121a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington
122ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington  timeout = _dbus_timeout_new (timeout_milliseconds,
123ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington                               timeout_handler,
124ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington			       pending, NULL);
125ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington
126ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington  if (timeout == NULL)
127ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington    {
128583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington      dbus_pending_call_free_data_slot (&notify_user_data_slot);
129ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington      dbus_free (pending);
130ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington      return NULL;
131ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington    }
132ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington
133a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington  pending->refcount.value = 1;
134a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington  pending->connection = connection;
135a549de8b7a744ec52e514d1e38ac9f2370b5f8b6John (J  _dbus_connection_ref_unlocked (pending->connection);
1365efe8e7f1d97931710558495a951e0b35afbfb72John (J
137ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington  pending->timeout = timeout;
138583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington
1395efe8e7f1d97931710558495a951e0b35afbfb72John (J
140583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington  _dbus_data_slot_list_init (&pending->slot_list);
141ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington
142a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington  return pending;
143a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington}
144a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington
145ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington/**
146e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Sets the reply of a pending call with the given message,
147e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * or if the message is #NULL, by timing out the pending call.
148e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J *
149e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending call
150e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param message the message to complete the call with, or #NULL
151e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J *  to time out the call
152e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */
153e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jvoid
154222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_set_reply_unlocked (DBusPendingCall *pending,
155222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J                                       DBusMessage     *message)
156e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{
157e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  if (message == NULL)
158e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J    {
159e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J      message = pending->timeout_link->data;
160e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J      _dbus_list_clear (&pending->timeout_link);
161e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J    }
162e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  else
163e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J    dbus_message_ref (message);
164e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
165e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  _dbus_verbose ("  handing message %p (%s) to pending call serial %u\n",
166e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J                 message,
167e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J                 dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN ?
168e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J                 "method return" :
169e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J                 dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR ?
170e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J                 "error" : "other type",
171e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J                 pending->reply_serial);
172e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
173e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  _dbus_assert (pending->reply == NULL);
174e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  _dbus_assert (pending->reply_serial == dbus_message_get_reply_serial (message));
175e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  pending->reply = message;
176e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J}
177e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
178e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/**
179ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * Calls notifier function for the pending call
180ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * and sets the call to completed.
181ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington *
182ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param pending the pending call
183ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington *
184ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington */
185ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Penningtonvoid
186e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J_dbus_pending_call_complete (DBusPendingCall *pending)
187ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington{
1889e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington  _dbus_assert (!pending->completed);
1899e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington
190ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington  pending->completed = TRUE;
191ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington
192ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington  if (pending->function)
193583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington    {
194583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington      void *user_data;
195583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington      user_data = dbus_pending_call_get_data (pending,
196583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington                                              notify_user_data_slot);
197583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington
198583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington      (* pending->function) (pending, user_data);
199583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington    }
200ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington}
201ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington
20215ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington/**
20315ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * If the pending call hasn't been timed out, add its timeout
20415ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * error reply to the connection's incoming message queue.
20515ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington *
20615ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * @param pending the pending call
20715ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * @param connection the connection the call was sent to
20815ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington */
209e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jvoid
210222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_queue_timeout_error_unlocked (DBusPendingCall *pending,
211222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J                                                 DBusConnection  *connection)
212e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{
213222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  _dbus_assert (connection == pending->connection);
214222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
215e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  if (pending->timeout_link)
216e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J    {
217e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J      _dbus_connection_queue_synthesized_message_link (connection,
218e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J						       pending->timeout_link);
219e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J      pending->timeout_link = NULL;
220e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J    }
221e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J}
222e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
223e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/**
224e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Checks to see if a timeout has been added
225e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J *
226e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call
227e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @returns #TRUE if there is a timeout or #FALSE if not
228e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */
229e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jdbus_bool_t
230222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_is_timeout_added_unlocked (DBusPendingCall  *pending)
231e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{
232e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  _dbus_assert (pending != NULL);
233e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
234e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  return pending->timeout_added;
235e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J}
236e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
237e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
238e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/**
239e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Sets wether the timeout has been added
240e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J *
241e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call
242e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param is_added whether or not a timeout is added
243e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */
244e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jvoid
245222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_set_timeout_added_unlocked (DBusPendingCall  *pending,
246222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J                                               dbus_bool_t       is_added)
247e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{
248e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  _dbus_assert (pending != NULL);
249e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
250e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  pending->timeout_added = is_added;
251e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J}
252e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
253e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
254e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/**
255e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Retrives the timeout
256e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J *
257e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call
258e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @returns a timeout object
259e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */
260e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (JDBusTimeout *
261222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_get_timeout_unlocked (DBusPendingCall  *pending)
262e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{
263e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  _dbus_assert (pending != NULL);
264e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
265e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  return pending->timeout;
266e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J}
267e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
268e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/**
269e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Gets the reply's serial number
270e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J *
271e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call
272e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @returns a serial number for the reply or 0
273e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */
274e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jdbus_uint32_t
275222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_get_reply_serial_unlocked (DBusPendingCall  *pending)
276e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{
277e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  _dbus_assert (pending != NULL);
278e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
279e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  return pending->reply_serial;
280e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J}
281e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
282e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/**
283e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Sets the reply's serial number
284e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J *
285e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call
286e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param serial the serial number
287e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */
288e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jvoid
289222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_set_reply_serial_unlocked  (DBusPendingCall *pending,
290222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J                                               dbus_uint32_t serial)
291e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{
292e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  _dbus_assert (pending != NULL);
293e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  _dbus_assert (pending->reply_serial == 0);
294e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
295e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  pending->reply_serial = serial;
296e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J}
297e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
298e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/**
299222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * Gets the connection associated with this pending call.
300222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J *
301222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * @param pending the pending_call
302222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * @returns the connection associated with the pending call
303222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J */
304222bd07e9df5e3b5a367d1282b43fd3a827a7552John (JDBusConnection *
305222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_get_connection_and_lock (DBusPendingCall *pending)
306222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J{
307222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  _dbus_assert (pending != NULL);
308222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
309222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  CONNECTION_LOCK (pending->connection);
310222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  return pending->connection;
311222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J}
312222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
313222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J/**
314222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * Gets the connection associated with this pending call.
315e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J *
316e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call
317e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @returns the connection associated with the pending call
318e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */
319e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (JDBusConnection *
320222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_get_connection_unlocked (DBusPendingCall *pending)
321e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{
322e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  _dbus_assert (pending != NULL);
323e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
324222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  return pending->connection;
325e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J}
326e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
327e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J/**
328e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * Sets the reply message associated with the pending call to a timeout error
329e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J *
330e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param pending the pending_call
331e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param message the message we are sending the error reply to
332e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @param serial serial number for the reply
333e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J * @return #FALSE on OOM
334e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J */
335e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (Jdbus_bool_t
336222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_set_timeout_error_unlocked (DBusPendingCall *pending,
337222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J                                               DBusMessage     *message,
338222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J                                               dbus_uint32_t    serial)
339e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J{
340e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  DBusList *reply_link;
341e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  DBusMessage *reply;
342e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
343e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  reply = dbus_message_new_error (message, DBUS_ERROR_NO_REPLY,
344d330ea7d1c98d29383dff2fc0a48269bde998760Havoc Pennington                                  "Did not receive a reply. Possible causes include: "
345d330ea7d1c98d29383dff2fc0a48269bde998760Havoc Pennington                                  "the remote application did not send a reply, "
346d330ea7d1c98d29383dff2fc0a48269bde998760Havoc Pennington                                  "the message bus security policy blocked the reply, "
347d330ea7d1c98d29383dff2fc0a48269bde998760Havoc Pennington                                  "the reply timeout expired, or "
348d330ea7d1c98d29383dff2fc0a48269bde998760Havoc Pennington                                  "the network connection was broken.");
349e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  if (reply == NULL)
350e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J    return FALSE;
351e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
352e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  reply_link = _dbus_list_alloc_link (reply);
353e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  if (reply_link == NULL)
354e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J    {
355e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J      dbus_message_unref (reply);
356e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J      return FALSE;
357e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J    }
358e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
359e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  pending->timeout_link = reply_link;
360e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
361222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  _dbus_pending_call_set_reply_serial_unlocked (pending, serial);
362e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
363e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J  return TRUE;
364e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J}
365e3dc6e281aae288e995f9d6a2675662ac3d0749fJohn (J
366a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/**
367222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * Increments the reference count on a pending call,
368222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * while the lock on its connection is already held.
369222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J *
370222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * @param pending the pending call object
371222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * @returns the pending call object
372222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J */
373222bd07e9df5e3b5a367d1282b43fd3a827a7552John (JDBusPendingCall *
374222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_ref_unlocked (DBusPendingCall *pending)
375222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J{
376222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  pending->refcount.value += 1;
377222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
378222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  return pending;
379222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J}
380222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
381a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington
382222bd07e9df5e3b5a367d1282b43fd3a827a7552John (Jstatic void
383222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_last_unref (DBusPendingCall *pending)
384222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J{
385222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  DBusConnection *connection;
386222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
387222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  /* If we get here, we should be already detached
388222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J   * from the connection, or never attached.
389222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J   */
390222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  _dbus_assert (!pending->timeout_added);
391222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
392222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  connection = pending->connection;
393222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
394222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  /* this assumes we aren't holding connection lock... */
395222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  _dbus_data_slot_list_free (&pending->slot_list);
396222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
397222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  if (pending->timeout != NULL)
398222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J    _dbus_timeout_unref (pending->timeout);
399222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
400222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  if (pending->timeout_link)
401222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J    {
402222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J      dbus_message_unref ((DBusMessage *)pending->timeout_link->data);
403222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J      _dbus_list_free_link (pending->timeout_link);
404222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J      pending->timeout_link = NULL;
405222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J    }
406222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
407222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  if (pending->reply)
408222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J    {
409222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J      dbus_message_unref (pending->reply);
410222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J      pending->reply = NULL;
411222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J    }
412222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
413222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  dbus_free (pending);
414222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
415222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  dbus_pending_call_free_data_slot (&notify_user_data_slot);
416222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
417222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  /* connection lock should not be held. */
418222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  /* Free the connection last to avoid a weird state while
419222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J   * calling out to application code where the pending exists
420222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J   * but not the connection.
421222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J   */
422222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  dbus_connection_unref (connection);
423222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J}
424222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
425222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J/**
426222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * Decrements the reference count on a pending call,
427222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * freeing it if the count reaches 0. Assumes
428222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * connection lock is already held.
429222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J *
430222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * @param pending the pending call object
431222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J */
432222bd07e9df5e3b5a367d1282b43fd3a827a7552John (Jvoid
433222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J_dbus_pending_call_unref_and_unlock (DBusPendingCall *pending)
434222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J{
435222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  dbus_bool_t last_unref;
436222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
437222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  _dbus_assert (pending->refcount.value > 0);
438222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
439222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  pending->refcount.value -= 1;
440222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  last_unref = pending->refcount.value == 0;
441222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
442222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  CONNECTION_UNLOCK (pending->connection);
443222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  if (last_unref)
444222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J    _dbus_pending_call_last_unref (pending);
445222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J}
446222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
447a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/**
448174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * Checks whether the pending call has received a reply
449174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * yet, or not. Assumes connection lock is held.
450174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington *
451174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @param pending the pending call
452174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @returns #TRUE if a reply has been received
453174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington */
454174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Penningtondbus_bool_t
455174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington_dbus_pending_call_get_completed_unlocked (DBusPendingCall    *pending)
456174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington{
457174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  return pending->completed;
458174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington}
459174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington
460174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Penningtonstatic DBusDataSlotAllocator slot_allocator;
461174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington_DBUS_DEFINE_GLOBAL_LOCK (pending_call_slots);
462174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington
463174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington/**
464174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * Stores a pointer on a #DBusPendingCall, along
465174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * with an optional function to be used for freeing
466174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * the data when the data is set again, or when
467174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * the pending call is finalized. The slot number
468174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * must have been allocated with dbus_pending_call_allocate_data_slot().
469174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington *
470174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @param pending the pending_call
471174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @param slot the slot number
472174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @param data the data to store
473174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @param free_data_func finalizer function for the data
474174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @returns #TRUE if there was enough memory to store the data
475174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington */
476174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Penningtondbus_bool_t
477174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington_dbus_pending_call_set_data_unlocked (DBusPendingCall  *pending,
478174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington                                     dbus_int32_t      slot,
479174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington                                     void             *data,
480174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington                                     DBusFreeFunction  free_data_func)
481174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington{
482174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  DBusFreeFunction old_free_func;
483174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  void *old_data;
484174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  dbus_bool_t retval;
485174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington
486174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  retval = _dbus_data_slot_list_set (&slot_allocator,
487174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington                                     &pending->slot_list,
488174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington                                     slot, data, free_data_func,
489174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington                                     &old_free_func, &old_data);
490174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington
491174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  /* Drop locks to call out to app code */
492174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  CONNECTION_UNLOCK (pending->connection);
493174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington
494174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  if (retval)
495174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington    {
496174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington      if (old_free_func)
497174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington        (* old_free_func) (old_data);
498174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington    }
499174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington
500174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  CONNECTION_LOCK (pending->connection);
501174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington
502174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  return retval;
503174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington}
504174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington
505174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington/** @} */
506174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington
507174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington/**
508174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @defgroup DBusPendingCall DBusPendingCall
509174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @ingroup  DBus
510174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @brief Pending reply to a method call message
511174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington *
512174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * A DBusPendingCall is an object representing an
513174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * expected reply. A #DBusPendingCall can be created
514174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * when you send a message that should have a reply.
515174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington *
516174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @{
517174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington */
518174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington
519174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington/**
520174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @typedef DBusPendingCall
521174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington *
522174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * Opaque data type representing a message pending.
523174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington */
524174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington
525174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington/**
526174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * Increments the reference count on a pending call.
527174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington *
528174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @param pending the pending call object
529174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington * @returns the pending call object
530174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington */
531174c63f176b9074ffe3cca8df016c53d68cafce9Havoc PenningtonDBusPendingCall *
532174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Penningtondbus_pending_call_ref (DBusPendingCall *pending)
533174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington{
534174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  _dbus_return_val_if_fail (pending != NULL, NULL);
535174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington
536174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  /* The connection lock is better than the global
537174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington   * lock in the atomic increment fallback
538174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington   */
539174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington#ifdef DBUS_HAVE_ATOMIC_INT
540174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  _dbus_atomic_inc (&pending->refcount);
541174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington#else
542174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  CONNECTION_LOCK (pending->connection);
543174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  _dbus_assert (pending->refcount.value > 0);
544174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington
545174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  pending->refcount.value += 1;
546174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  CONNECTION_UNLOCK (pending->connection);
547174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington#endif
548174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington
549174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington  return pending;
550174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington}
551174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington
552174c63f176b9074ffe3cca8df016c53d68cafce9Havoc Pennington/**
553a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Decrements the reference count on a pending call,
554a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * freeing it if the count reaches 0.
555a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington *
556a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param pending the pending call object
557a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */
558a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Penningtonvoid
559a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Penningtondbus_pending_call_unref (DBusPendingCall *pending)
560a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{
561a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington  dbus_bool_t last_unref;
562a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington
563a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington  _dbus_return_if_fail (pending != NULL);
564a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington
565222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  /* More efficient to use the connection lock instead of atomic
566222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J   * int fallback if we lack atomic int decrement
567222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J   */
568222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J#ifdef DBUS_HAVE_ATOMIC_INT
569a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington  last_unref = (_dbus_atomic_dec (&pending->refcount) == 1);
570222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J#else
571222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  CONNECTION_LOCK (pending->connection);
572222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  _dbus_assert (pending->refcount.value > 0);
573222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  pending->refcount.value -= 1;
574222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  last_unref = pending->refcount.value == 0;
575222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  CONNECTION_UNLOCK (pending->connection);
576222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J#endif
577222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
578a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington  if (last_unref)
579222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J    _dbus_pending_call_last_unref(pending);
580a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington}
581a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington
582a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/**
583a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Sets a notification function to be called when the reply is
584a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * received or the pending call times out.
585a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington *
586a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param pending the pending call
587a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param function notifier function
588a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param user_data data to pass to notifier function
589a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @param free_user_data function to free the user data
590583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @returns #FALSE if not enough memory
591a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */
592583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_bool_t
593a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Penningtondbus_pending_call_set_notify (DBusPendingCall              *pending,
594a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington                              DBusPendingCallNotifyFunction function,
595a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington                              void                         *user_data,
596a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington                              DBusFreeFunction              free_user_data)
597a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{
598583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington  _dbus_return_val_if_fail (pending != NULL, FALSE);
599a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington
600222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  CONNECTION_LOCK (pending->connection);
601222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
602583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington  /* could invoke application code! */
603222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  if (!_dbus_pending_call_set_data_unlocked (pending, notify_user_data_slot,
604222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J                                             user_data, free_user_data))
605583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington    return FALSE;
606583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington
607a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington  pending->function = function;
608a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington
609222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  CONNECTION_UNLOCK (pending->connection);
610222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
611583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington  return TRUE;
612a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington}
613a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington
614ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington/**
6151dcacffc325e50754d4cc3338822d1f03c8b6e45Havoc Pennington * Cancels the pending call, such that any reply or error received
6161dcacffc325e50754d4cc3338822d1f03c8b6e45Havoc Pennington * will just be ignored.  Drops the dbus library's internal reference
6171dcacffc325e50754d4cc3338822d1f03c8b6e45Havoc Pennington * to the #DBusPendingCall so will free the call if nobody else is
6181dcacffc325e50754d4cc3338822d1f03c8b6e45Havoc Pennington * holding a reference. However you usually get a reference
6191dcacffc325e50754d4cc3338822d1f03c8b6e45Havoc Pennington * from dbus_connection_send() so probably your app owns a ref also.
620ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington *
621ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param pending the pending call
622ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington */
623ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Penningtonvoid
624ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Penningtondbus_pending_call_cancel (DBusPendingCall *pending)
625ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington{
62657657889128dc54069525cce47bce51365dbde0fJohn (J  _dbus_return_if_fail (pending != NULL);
62757657889128dc54069525cce47bce51365dbde0fJohn (J
628222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  _dbus_connection_remove_pending_call (pending->connection,
629222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J                                        pending);
630ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington}
631a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington
632ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington/**
633ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * Checks whether the pending call has received a reply
634222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * yet, or not.
635583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington *
636ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param pending the pending call
637222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J * @returns #TRUE if a reply has been received
638222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J */
639ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Penningtondbus_bool_t
640ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Penningtondbus_pending_call_get_completed (DBusPendingCall *pending)
641a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{
642222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  dbus_bool_t completed;
643222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
64457657889128dc54069525cce47bce51365dbde0fJohn (J  _dbus_return_val_if_fail (pending != NULL, FALSE);
64557657889128dc54069525cce47bce51365dbde0fJohn (J
646222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  CONNECTION_LOCK (pending->connection);
647222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  completed = pending->completed;
648222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  CONNECTION_UNLOCK (pending->connection);
649222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
650222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  return completed;
651a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington}
652a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington
653ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington/**
6549e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * Gets the reply, or returns #NULL if none has been received
6559e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * yet. Ownership of the reply message passes to the caller. This
6569e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * function can only be called once per pending call, since the reply
6579e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington * message is tranferred to the caller.
658583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington *
659ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @param pending the pending call
660ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington * @returns the reply message or #NULL.
661ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington */
662ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc PenningtonDBusMessage*
6639e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Penningtondbus_pending_call_steal_reply (DBusPendingCall *pending)
664a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{
6659e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington  DBusMessage *message;
6669e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington
66757657889128dc54069525cce47bce51365dbde0fJohn (J  _dbus_return_val_if_fail (pending != NULL, NULL);
6689e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington  _dbus_return_val_if_fail (pending->completed, NULL);
6699e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington  _dbus_return_val_if_fail (pending->reply != NULL, NULL);
670222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
671222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  CONNECTION_LOCK (pending->connection);
6729e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington
6739e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington  message = pending->reply;
6749e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington  pending->reply = NULL;
6759e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington
676222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  CONNECTION_UNLOCK (pending->connection);
677222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
6789e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington  return message;
679a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington}
680a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington
681a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington/**
682a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * Block until the pending call is completed.  The blocking is as with
683a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * dbus_connection_send_with_reply_and_block(); it does not enter the
684a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * main loop or process other messages, it simply waits for the reply
685a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * in question.
686a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington *
687583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * If the pending call is already completed, this function returns
688583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * immediately.
689583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington *
69015c60238853f2896738c23b53e574b5d9cae1635John (J * @todo when you start blocking, the timeout is reset, but it should
691a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * really only use time remaining since the pending call was created.
69215c60238853f2896738c23b53e574b5d9cae1635John (J * This requires storing timestamps instead of intervals in the timeout
693a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington *
694a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington * @param pending the pending call
695a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington */
696a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Penningtonvoid
697a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Penningtondbus_pending_call_block (DBusPendingCall *pending)
698a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington{
69957657889128dc54069525cce47bce51365dbde0fJohn (J  _dbus_return_if_fail (pending != NULL);
70057657889128dc54069525cce47bce51365dbde0fJohn (J
7019e4450872a6861bd93a01dabe14d2d16f6c84d3fHavoc Pennington  _dbus_connection_block_pending_call (pending);
702a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington}
703a1b0bd33408f03894987ac32b4e6b46c6a15a594Havoc Pennington
704583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington/**
705583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * Allocates an integer ID to be used for storing application-specific
706583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * data on any DBusPendingCall. The allocated ID may then be used
707583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * with dbus_pending_call_set_data() and dbus_pending_call_get_data().
708583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * The passed-in slot must be initialized to -1, and is filled in
709583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * with the slot ID. If the passed-in slot is not -1, it's assumed
710583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * to be already allocated, and its refcount is incremented.
711583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington *
712583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * The allocated slot is global, i.e. all DBusPendingCall objects will
713583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * have a slot with the given integer ID reserved.
714583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington *
715583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param slot_p address of a global variable storing the slot
716583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @returns #FALSE on failure (no memory)
717583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington */
718583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_bool_t
719583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_pending_call_allocate_data_slot (dbus_int32_t *slot_p)
720583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington{
72157657889128dc54069525cce47bce51365dbde0fJohn (J  _dbus_return_val_if_fail (slot_p != NULL, FALSE);
72257657889128dc54069525cce47bce51365dbde0fJohn (J
723583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington  return _dbus_data_slot_allocator_alloc (&slot_allocator,
72414cc7d28a8308060428bbc9b3dd357eaea3a4749John (J                                          &_DBUS_LOCK_NAME (pending_call_slots),
725583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington                                          slot_p);
726583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington}
727583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington
728583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington/**
729583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * Deallocates a global ID for #DBusPendingCall data slots.
730583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * dbus_pending_call_get_data() and dbus_pending_call_set_data() may
731583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * no longer be used with this slot.  Existing data stored on existing
732583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * DBusPendingCall objects will be freed when the #DBusPendingCall is
733583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * finalized, but may not be retrieved (and may only be replaced if
734583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * someone else reallocates the slot).  When the refcount on the
735583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * passed-in slot reaches 0, it is set to -1.
736583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington *
737583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param slot_p address storing the slot to deallocate
738583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington */
739583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtonvoid
740583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_pending_call_free_data_slot (dbus_int32_t *slot_p)
741583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington{
74257657889128dc54069525cce47bce51365dbde0fJohn (J  _dbus_return_if_fail (slot_p != NULL);
743583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington  _dbus_return_if_fail (*slot_p >= 0);
744222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
745583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington  _dbus_data_slot_allocator_free (&slot_allocator, slot_p);
746583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington}
747583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington
748583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington/**
749583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * Stores a pointer on a #DBusPendingCall, along
750583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * with an optional function to be used for freeing
751583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * the data when the data is set again, or when
752583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * the pending call is finalized. The slot number
753583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * must have been allocated with dbus_pending_call_allocate_data_slot().
754583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington *
755583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param pending the pending_call
756583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param slot the slot number
757583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param data the data to store
758583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param free_data_func finalizer function for the data
759583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @returns #TRUE if there was enough memory to store the data
760583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington */
761583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_bool_t
762222bd07e9df5e3b5a367d1282b43fd3a827a7552John (Jdbus_pending_call_set_data (DBusPendingCall  *pending,
763222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J                            dbus_int32_t      slot,
764222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J                            void             *data,
765222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J                            DBusFreeFunction  free_data_func)
766222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J{
767222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  dbus_bool_t retval;
768222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
769222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  _dbus_return_val_if_fail (pending != NULL, FALSE);
770222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  _dbus_return_val_if_fail (slot >= 0, FALSE);
771222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
772222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J
773222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  CONNECTION_LOCK (pending->connection);
774222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  retval = _dbus_pending_call_set_data_unlocked (pending, slot, data, free_data_func);
775222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  CONNECTION_UNLOCK (pending->connection);
776583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington  return retval;
777583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington}
778583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington
779583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington/**
780583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * Retrieves data previously set with dbus_pending_call_set_data().
781583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * The slot must still be allocated (must not have been freed).
782583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington *
783583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param pending the pending_call
784583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @param slot the slot to get data from
785583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington * @returns the data, or #NULL if not found
786583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington */
787583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtonvoid*
788583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Penningtondbus_pending_call_get_data (DBusPendingCall   *pending,
789583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington                            dbus_int32_t       slot)
790583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington{
791583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington  void *res;
792583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington
793583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington  _dbus_return_val_if_fail (pending != NULL, NULL);
794583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington
795222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  CONNECTION_LOCK (pending->connection);
796583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington  res = _dbus_data_slot_list_get (&slot_allocator,
797583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington                                  &pending->slot_list,
798583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington                                  slot);
799222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J  CONNECTION_UNLOCK (pending->connection);
800583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington
801583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington  return res;
802583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington}
803583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington
804ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington/** @} */
805ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington
806ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington#ifdef DBUS_BUILD_TESTS
807ef614207fc4f03e5cc02faeb109f739eb1ccdf31Havoc Pennington
808a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington/**
809a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @ingroup DBusPendingCallInternals
810a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * Unit test for DBusPendingCall.
811a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington *
812a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington * @returns #TRUE on success.
813a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington */
814a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Penningtondbus_bool_t
815a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington_dbus_pending_call_test (const char *test_data_dir)
816a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington{
817a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington
818a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington  return TRUE;
819a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington}
820a6c8a71b1bcba04b63812a61f668e87af0922e5eHavoc Pennington#endif /* DBUS_BUILD_TESTS */
821