|
|
|
/* qdbusmessage.h TQT_DBusMessage object
|
|
|
|
*
|
|
|
|
* Copyright (C) 2005 Harald Fernengel <harry@tdevelop.org>
|
|
|
|
* Copyright (C) 2005-2007 Kevin Krammer <kevin.krammer@gmx.at>
|
|
|
|
*
|
|
|
|
* Licensed under the Academic Free License version 2.1
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program 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 General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
|
|
|
* USA.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef TQDBUSMESSAGE_H
|
|
|
|
#define TQDBUSMESSAGE_H
|
|
|
|
|
|
|
|
#include "tqdbusmacros.h"
|
|
|
|
#include "tqdbusdata.h"
|
|
|
|
|
|
|
|
#include <tqvaluelist.h>
|
|
|
|
|
|
|
|
#include <limits.h>
|
|
|
|
|
|
|
|
class TQT_DBusError;
|
|
|
|
class TQT_DBusMessagePrivate;
|
|
|
|
struct DBusMessage;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief A message converts and transports data over D-Bus
|
|
|
|
*
|
|
|
|
* A TQT_DBusMessage is implicitly shared, similar to a TQString, i.e. copying
|
|
|
|
* a message creates just a shallow copy.
|
|
|
|
*
|
|
|
|
* The TQT_DBusMessage is the TQt3 bindings means of encapsulating data for a
|
|
|
|
* method call, a method reply or an error.
|
|
|
|
*
|
|
|
|
* Data specifying the sender and receipient is directly accessible through
|
|
|
|
* getter methods, while data, e.g. method parameters or return values, are
|
|
|
|
* managed as a list of TQT_DBusData.
|
|
|
|
*
|
|
|
|
* To create a message suitable for sending use one of the static factory
|
|
|
|
* methods:
|
|
|
|
* - signal() for creating a D-Bus signal message
|
|
|
|
*
|
|
|
|
* - methodCall() for creating a D-Bus method calls to a service object
|
|
|
|
*
|
|
|
|
* - methodReply() for creating a method reply on success
|
|
|
|
*
|
|
|
|
* - methodError() for creating a method reply on error
|
|
|
|
*
|
|
|
|
* @note for applications that just want to perform method calls and/or receive
|
|
|
|
* signals, it is usually more convenient to use TQT_DBusProxy instead.
|
|
|
|
*
|
|
|
|
* Message sending is achieved through TQT_DBusConnection
|
|
|
|
*
|
|
|
|
* Example:
|
|
|
|
* @code
|
|
|
|
* TQT_DBusConnection con = TQT_DBusConnection::sessionBus();
|
|
|
|
*
|
|
|
|
* // receipient service is the bus' main interface
|
|
|
|
*
|
|
|
|
* TQString service = "org.freedesktop.DBus";
|
|
|
|
* TQString path = "/org/freedesktop/DBus";
|
|
|
|
* TQString interface = "org.freedesktop.DBus";
|
|
|
|
*
|
|
|
|
* TQT_DBusMessage msg = TQBusMessage::methodCall(service, path, interface, "ListNames");
|
|
|
|
*
|
|
|
|
* TQT_DBusMessage reply = con.sendWithReply(msg);
|
|
|
|
*
|
|
|
|
* // awaiting for a message list
|
|
|
|
*
|
|
|
|
* if (reply.type() != TQT_DBusMessage::ReplyMessage || reply.count() != 2 ||
|
|
|
|
* reply[0].type() != TQT_DBusData::List)
|
|
|
|
* {
|
|
|
|
* // error handling here
|
|
|
|
* }
|
|
|
|
* else
|
|
|
|
* {
|
|
|
|
* TQStringList list = reply[0].toTQStringList();
|
|
|
|
*
|
|
|
|
* // reply handling here
|
|
|
|
* }
|
|
|
|
* @endcode
|
|
|
|
*
|
|
|
|
* A service returning such a reply would do something like this
|
|
|
|
* @code
|
|
|
|
* bool Service::handleMethodCall(const TQT_DBusMessage& call)
|
|
|
|
* {
|
|
|
|
* // checks for correctness, i.e. correct interface, member,
|
|
|
|
* // would usually haven been placed here
|
|
|
|
*
|
|
|
|
* TQStringList result;
|
|
|
|
* result << "Foo" << "Bar";
|
|
|
|
*
|
|
|
|
* TQT_DBusMessage reply = TQT_DBusMessage::methodReply(call);
|
|
|
|
* reply << TQT_DBusData::fromList(result);
|
|
|
|
*
|
|
|
|
* connection.send(reply);
|
|
|
|
*
|
|
|
|
* return true;
|
|
|
|
* }
|
|
|
|
* @endcode
|
|
|
|
*/
|
|
|
|
class TQDBUS_EXPORT TQT_DBusMessage: public TQValueList<TQT_DBusData>
|
|
|
|
{
|
|
|
|
friend class TQT_DBusConnection;
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* @brief Anonymous enum for timeout constants
|
|
|
|
*
|
|
|
|
* @see timeout()
|
|
|
|
* @see setTimeout()
|
|
|
|
*/
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Use whatever D-Bus has as default timeout
|
|
|
|
*/
|
|
|
|
DefaultTimeout = -1,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Use no timeout at all, i.e. wait as long as necessary
|
|
|
|
*/
|
|
|
|
NoTimeout = INT_MAX
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief D-Bus message types
|
|
|
|
*
|
|
|
|
* A message of a specific type can be created using the respective factory
|
|
|
|
* method. A message created by the default constructor becomes an
|
|
|
|
* InvalidMessage
|
|
|
|
*
|
|
|
|
* @see type()
|
|
|
|
* @see signal()
|
|
|
|
* @see methodCall()
|
|
|
|
* @see methodReply()
|
|
|
|
* @see methodError()
|
|
|
|
*/
|
|
|
|
enum MessageType
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* An invalid message cannot be sent over D-Bus. This type serves for
|
|
|
|
* initializing message variables without requiring a "real" message
|
|
|
|
*/
|
|
|
|
InvalidMessage,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A message for doing method calls on remote service objects
|
|
|
|
*
|
|
|
|
* @see methodCall()
|
|
|
|
*/
|
|
|
|
MethodCallMessage,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A message for replying to a method call in case of success
|
|
|
|
*
|
|
|
|
* @see methodReply()
|
|
|
|
*/
|
|
|
|
ReplyMessage,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A message for replying to a method call in case of failure
|
|
|
|
*
|
|
|
|
* @see methodError()
|
|
|
|
*/
|
|
|
|
ErrorMessage,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A message for emitting D-Bus signals
|
|
|
|
*
|
|
|
|
* @see signal()
|
|
|
|
*/
|
|
|
|
SignalMessage
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Creates an empty and invalid message
|
|
|
|
*
|
|
|
|
* To create a message suitable for sending through D-Bus see the factory
|
|
|
|
* methods signal(), methodCall(), methodReply() and methodError()
|
|
|
|
*
|
|
|
|
* @see #InvalidMessage
|
|
|
|
*/
|
|
|
|
TQT_DBusMessage();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Creates a shallow copy of the given message
|
|
|
|
*
|
|
|
|
* This instance will become a handle to the same message data the other
|
|
|
|
* message is using, including #MessageType
|
|
|
|
*
|
|
|
|
* @param other the message to copy
|
|
|
|
*/
|
|
|
|
TQT_DBusMessage(const TQT_DBusMessage &other);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Destroys a message
|
|
|
|
*
|
|
|
|
* If this message handle is the last one using this respective message
|
|
|
|
* content, the message content will be deleted as well
|
|
|
|
*/
|
|
|
|
~TQT_DBusMessage();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Creates a shallow copy of the given message
|
|
|
|
*
|
|
|
|
* This instance will become a handle to the same message data the other
|
|
|
|
* message is usingm including #MessageType
|
|
|
|
*
|
|
|
|
* Any content used in this instance will be deleted if this instance was
|
|
|
|
* the last handle using that content
|
|
|
|
*
|
|
|
|
* @param other the message to copy
|
|
|
|
*
|
|
|
|
* @return a reference to this instance as required by assignment operator
|
|
|
|
* semantics
|
|
|
|
*/
|
|
|
|
TQT_DBusMessage &operator=(const TQT_DBusMessage &other);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Creates a message for sending a D-Bus signal
|
|
|
|
*
|
|
|
|
* Sending/emitting a signal over D-Bus requires a message of type
|
|
|
|
* #SignalMessage as well as the information where it is coming from, i.e.
|
|
|
|
* which interface of which object is sending it.
|
|
|
|
* See @ref dbusconventions for recommendations on those parameters.
|
|
|
|
*
|
|
|
|
* @param path the object path of the service object
|
|
|
|
* @param interface the object's interface to which the signal belongs
|
|
|
|
* @param member the signal's name
|
|
|
|
*
|
|
|
|
* @return a message suitable for appending arguments and for sending
|
|
|
|
*
|
|
|
|
* @see TQT_DBusConnection::send()
|
|
|
|
*/
|
|
|
|
static TQT_DBusMessage signal(const TQString &path, const TQString &interface,
|
|
|
|
const TQString &member);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Creates a message for sending a D-Bus method call
|
|
|
|
*
|
|
|
|
* Invoking a method over D-Bus requires a message of type
|
|
|
|
* #MethodCallMessage as well as the information where it should be sent
|
|
|
|
* to, e.g which interface of which object in which service.
|
|
|
|
* See @ref dbusconventions for recommendations on those parameters.
|
|
|
|
*
|
|
|
|
* @param service the D-Bus name of the application hosting the service
|
|
|
|
* object
|
|
|
|
* @param path the object path of the service object
|
|
|
|
* @param interface the object's interface to which the method belongs
|
|
|
|
* @param method the method's name
|
|
|
|
*
|
|
|
|
* @return a message suitable for appending arguments and for sending
|
|
|
|
*
|
|
|
|
* @see methodReply()
|
|
|
|
* @see methodError()
|
|
|
|
* @see TQT_DBusConnection::send()
|
|
|
|
*/
|
|
|
|
static TQT_DBusMessage methodCall(const TQString &service, const TQString &path,
|
|
|
|
const TQString &interface, const TQString &method);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Creates a message for replying to a D-Bus method call
|
|
|
|
*
|
|
|
|
* Replying to a D-Bus method call in the case of success requires a message
|
|
|
|
* of type #ReplyMessage as well as the information to which method call it
|
|
|
|
* is replying to.
|
|
|
|
*
|
|
|
|
* @param other the method call message it is replying to
|
|
|
|
*
|
|
|
|
* @return a message suitable for appending arguments and for sending
|
|
|
|
*
|
|
|
|
* @see methodCall()
|
|
|
|
* @see methodError()
|
|
|
|
* @see TQT_DBusConnection::send()
|
|
|
|
*/
|
|
|
|
static TQT_DBusMessage methodReply(const TQT_DBusMessage &other);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Creates a message for replying to a D-Bus method call
|
|
|
|
*
|
|
|
|
* Replying to a D-Bus method call in the case of failure requires a message
|
|
|
|
* of type #ErrorMessage as well as the information to which method call it
|
|
|
|
* is replying to and which error occured.
|
|
|
|
*
|
|
|
|
* @param other the method call message it is replying to
|
|
|
|
* @param error the error which occured during during the method call
|
|
|
|
*
|
|
|
|
* @return a message suitable for appending arguments and for sending
|
|
|
|
*
|
|
|
|
* @see methodCall()
|
|
|
|
* @see methodReply()
|
|
|
|
* @see TQT_DBusConnection::send()
|
|
|
|
*/
|
|
|
|
static TQT_DBusMessage methodError(const TQT_DBusMessage &other, const TQT_DBusError& error);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Returns the message's object path
|
|
|
|
*
|
|
|
|
* See section @ref dbusconventions-objectpath for details.
|
|
|
|
*
|
|
|
|
* The context of the object path depends on the message type:
|
|
|
|
* - #SignalMessage: the path of the service object which emits the signal
|
|
|
|
* - #MethodCallMessage: the path of the service object the call is sent to
|
|
|
|
* - #ReplyMessage: the path of the object which is replying
|
|
|
|
* - #ErrorMessage: the path of the object which is replying
|
|
|
|
*
|
|
|
|
* @return a non-empty object path or @c TQString()
|
|
|
|
*
|
|
|
|
* @see interface()
|
|
|
|
* @see member()
|
|
|
|
* @see sender()
|
|
|
|
*/
|
|
|
|
TQString path() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Returns the message's interface name
|
|
|
|
*
|
|
|
|
* See section @ref dbusconventions-interfacename for details.
|
|
|
|
*
|
|
|
|
* The context of the interface name depends on the message type:
|
|
|
|
* - #SignalMessage: the name of the interface which emits the signal
|
|
|
|
* - #MethodCallMessage: the name of the interface the call is sent to
|
|
|
|
* - #ReplyMessage: the name of the interface to which the method belonged
|
|
|
|
* - #ErrorMessage: the name of the interface to which the method belonged
|
|
|
|
*
|
|
|
|
* @return a non-empty interface name or @c TQString()
|
|
|
|
*
|
|
|
|
* @see path()
|
|
|
|
* @see member()
|
|
|
|
* @see sender()
|
|
|
|
*/
|
|
|
|
TQString interface() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Returns the message's member name
|
|
|
|
*
|
|
|
|
* See section @ref dbusconventions-membername for details.
|
|
|
|
*
|
|
|
|
* The context of the member name depends on the message type:
|
|
|
|
* - #SignalMessage: the name of the emitted signal
|
|
|
|
* - #MethodCallMessage: the name of the method to call
|
|
|
|
* - #ReplyMessage: the name of the method which replies
|
|
|
|
* - #ErrorMessage: the name of the method which replies
|
|
|
|
*
|
|
|
|
* @return a non-empty member name or @c TQString()
|
|
|
|
*
|
|
|
|
* @see path()
|
|
|
|
* @see interface()
|
|
|
|
* @see sender()
|
|
|
|
*/
|
|
|
|
TQString member() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Returns the name of the message sender
|
|
|
|
*
|
|
|
|
* The message sender name or address used on the D-Bus message bus
|
|
|
|
* to refer to the application which sent this message.
|
|
|
|
*
|
|
|
|
* See section @ref dbusconventions-servicename for details.
|
|
|
|
*
|
|
|
|
* This can either be a unique name as handed out by the bus, see
|
|
|
|
* TQT_DBusConnection::uniqueName() or a name registered with
|
|
|
|
* TQT_DBusConnection::requestName()
|
|
|
|
*
|
|
|
|
* @return a non-empty D-Bus sender name or @c TQString()
|
|
|
|
*
|
|
|
|
* @see path()
|
|
|
|
* @see interface()
|
|
|
|
* @see member()
|
|
|
|
*/
|
|
|
|
TQString sender() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Returns the error of an error message
|
|
|
|
*
|
|
|
|
* If this message is of type #ErrorMessage, this method can be used
|
|
|
|
* to retrieve the respective error object
|
|
|
|
*
|
|
|
|
* @return the transported error object. Will be empty if this is not an
|
|
|
|
* error message
|
|
|
|
*
|
|
|
|
* @see type()
|
|
|
|
*/
|
|
|
|
TQT_DBusError error() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Returns which kind of message this is
|
|
|
|
*
|
|
|
|
* @return the message's type
|
|
|
|
*/
|
|
|
|
MessageType type() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Returns the message's timeout
|
|
|
|
*
|
|
|
|
* @return the asynchronous wait timeout in milliseconds
|
|
|
|
*
|
|
|
|
* @see setTimeout()
|
|
|
|
*/
|
|
|
|
int timeout() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Sets the message's timeout
|
|
|
|
*
|
|
|
|
* The timeout is the number of milliseconds the D-Bus connection will
|
|
|
|
* wait for the reply of an asynchronous call.
|
|
|
|
*
|
|
|
|
* If no reply is received in time, an error message will be delivered to
|
|
|
|
* the asynchronous reply receiver.
|
|
|
|
*
|
|
|
|
* If no timeout is set explicitly, #DefaultTimeout is assumed, which is
|
|
|
|
* usually the best option
|
|
|
|
*
|
|
|
|
* @return the asynchronous wait timeout in milliseconds
|
|
|
|
*
|
|
|
|
* @param ms timeout in milliseconds
|
|
|
|
*
|
|
|
|
* @see timeout()
|
|
|
|
* @see #DefaultTimeout
|
|
|
|
* @see #NoTimeout
|
|
|
|
*/
|
|
|
|
void setTimeout(int ms);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Returns the message's serial number
|
|
|
|
*
|
|
|
|
* The serial number is some kind of short term identifier for messages
|
|
|
|
* travelling the same connection.
|
|
|
|
*
|
|
|
|
* It can be used to associate a reply or error message with a method
|
|
|
|
* call message.
|
|
|
|
*
|
|
|
|
* @return the message's serial number or @c 0 if the message hasn't been
|
|
|
|
* send yets
|
|
|
|
*
|
|
|
|
* @see replySerialNumber()
|
|
|
|
*/
|
|
|
|
int serialNumber() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Returns the message's reply serial number
|
|
|
|
*
|
|
|
|
* The reply serial number is the serial number of the method call message
|
|
|
|
* this message is a reply to.
|
|
|
|
*
|
|
|
|
* If this is neither a message of type #ReplyMessage or #ErrorMessage, the
|
|
|
|
* returned value will be @c 0
|
|
|
|
*
|
|
|
|
* It can be used to associate a reply or error message with a method
|
|
|
|
* call message.
|
|
|
|
*
|
|
|
|
* @return the serial number of the associated method call message or @c 0
|
|
|
|
* if this message is not a reply message
|
|
|
|
*
|
|
|
|
* @see serialNumber()
|
|
|
|
* @see methodReply()
|
|
|
|
* @see methodError()
|
|
|
|
* @see TQT_DBusConnection::sendWithAsyncReply()
|
|
|
|
* @see TQT_DBusProxy::sendWithAsyncReply()
|
|
|
|
*/
|
|
|
|
int replySerialNumber() const;
|
|
|
|
|
|
|
|
//protected:
|
|
|
|
/**
|
|
|
|
* @brief Creates a raw D-Bus message from this TQt3-bindings message
|
|
|
|
*
|
|
|
|
* Marshalls data contained in the message's value list into D-Bus data
|
|
|
|
* format and creates a low level API D-Bus message for it.
|
|
|
|
*
|
|
|
|
* @note ownership of the returned message is transferred to the caller,
|
|
|
|
* i.e. it has to be deleted using dbus_message_unref()
|
|
|
|
*
|
|
|
|
* @return a C API D-Bus message or @c 0 if this is an #InvalidMessage
|
|
|
|
* or marshalling failed
|
|
|
|
*/
|
|
|
|
DBusMessage *toDBusMessage() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Creates a TQt3-bindings message from the given raw D-Bus message
|
|
|
|
*
|
|
|
|
* De-marshalls data contained in the message to a list of TQT_DBusData.
|
|
|
|
*
|
|
|
|
* @note ownership of the given message is shared between the caller and
|
|
|
|
* the returned message, i.e. the message as increased the reference
|
|
|
|
* counter and will still have access to the raw message even if the
|
|
|
|
* caller "deleted" it using dbus_message_unref()
|
|
|
|
*
|
|
|
|
* @param dmsg a C API D-Bus message
|
|
|
|
*
|
|
|
|
* @return a TQt3 bindings message. Can be an #InvalidMessage if the given
|
|
|
|
* message was @c 0 or if de-marshalling failed
|
|
|
|
*/
|
|
|
|
static TQT_DBusMessage fromDBusMessage(DBusMessage *dmsg);
|
|
|
|
|
|
|
|
private:
|
|
|
|
TQT_DBusMessagePrivate *d;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|