blob: 8bbb6208ba7f9aedf6cbcec9fe5ae7dfe903701c [file] [log] [blame]
/*
*
* D-Bus++ - C++ bindings for D-Bus
*
* Copyright (C) 2005-2007 Paolo Durante <shackan@gmail.com>
*
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#ifndef __DBUSXX_PENDING_CALL_H
#define __DBUSXX_PENDING_CALL_H
#include "api.h"
#include "util.h"
#include "message.h"
namespace DBus {
class Connection;
class PendingCall;
typedef Slot<void, PendingCall *> AsyncReplyHandler;
class DXXAPI PendingCall
{
public:
struct Private;
PendingCall(Private *);
PendingCall(const PendingCall &);
virtual ~PendingCall();
PendingCall &operator = (const PendingCall &);
/*!
* \brief Checks whether the pending call has received a reply yet, or not.
*
* \return true If a reply has been received.
*/
bool completed();
/*!
* \brief Cancels the pending call, such that any reply or error received will
* just be ignored.
*
* Drops the dbus library's internal reference to the DBusPendingCall so will
* free the call if nobody else is holding a reference. However you usually
* get a reference from Connection::send_async() so probably your app
* owns a ref also.
*
* Note that canceling a pending call will not simulate a timed-out call; if a
* call times out, then a timeout error reply is received. If you cancel the
* call, no reply is received unless the the reply was already received before
* you cancelled.
*/
void cancel();
/*!
* \brief Block until the pending call is completed.
*
* The blocking is as with Connection::send_blocking(); it
* does not enter the main loop or process other messages, it simply waits for
* the reply in question.
*
* If the pending call is already completed, this function returns immediately.
*/
void block();
/*!
* \brief Stores a pointer on a PendingCall, along with an optional function to
* be used for freeing the data when the data is set again, or when the
* pending call is finalized.
*
* The slot is allocated automatically.
*
* \param data The data to store.
* \throw ErrorNoMemory
*/
void data( void* data );
/*!
* \brief Retrieves data previously set with dbus_pending_call_set_data().
*
* The slot must still be allocated (must not have been freed).
*
* \return The data, or NULL if not found.
*/
void *data();
/*!
* \return The reply handler slot.
*/
AsyncReplyHandler& reply_handler();
/*!
* \brief Sets a callback to handle an asynchronous reply to a method
* invocation.
*
* If the pending call has not been cancelled, the supplied callback will
* be invoked when a reply is received. The callback is a templated
* class, where the two template arguments are the type of the single
* argument taken by the handler function, and the return type of that
* function.
*
* \param handler The callback.
*/
void reply_handler(const AsyncReplyHandler& handler);
/*!
* \brief Gets the reply message
*
* Ownership of the reply message passes to the caller. This function can only
* be called once per pending call, since the reply message is tranferred to
* the caller.
*
* \return The reply Message.
* \throw ErrorNoReply
*/
Message steal_reply();
private:
RefPtrI<Private> _pvt;
friend struct Private;
friend class Connection;
};
} /* namespace DBus */
#endif//__DBUSXX_PENDING_CALL_H