DBus-1-TQt  1.0
tqdbusmessage.cpp
Go to the documentation of this file.
00001 /* qdbusmessage.cpp
00002  *
00003  * Copyright (C) 2005 Harald Fernengel <harry@kdevelop.org>
00004  * Copyright (C) 2005 Kevin Krammer <kevin.krammer@gmx.at>
00005  *
00006  * Licensed under the Academic Free License version 2.1
00007  *
00008  * This program is free software; you can redistribute it and/or modify
00009  * it under the terms of the GNU General Public License as published by
00010  * the Free Software Foundation; either version 2 of the License, or
00011  * (at your option) any later version.
00012  *
00013  * This program is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016  * GNU General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU General Public License
00019  * along with this program; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
00021  * USA.
00022  *
00023  */
00024 
00025 #include "tqdbusmessage.h"
00026 
00027 #include <tqstringlist.h>
00028 
00029 #include <dbus/dbus.h>
00030 
00031 #include "tqdbusmarshall.h"
00032 #include "tqdbusmessage_p.h"
00033 
00034 TQT_DBusMessagePrivate::TQT_DBusMessagePrivate(TQT_DBusMessage *qq)
00035     : msg(0), reply(0), q(qq), type(DBUS_MESSAGE_TYPE_INVALID), timeout(-1), ref(1)
00036 {
00037 }
00038 
00039 TQT_DBusMessagePrivate::~TQT_DBusMessagePrivate()
00040 {
00041     if (msg)
00042         dbus_message_unref(msg);
00043     if (reply)
00044         dbus_message_unref(reply);
00045 }
00046 
00048 
00049 
00050 TQT_DBusMessage TQT_DBusMessage::signal(const TQString &path, const TQString &interface,
00051                                   const TQString &member)
00052 {
00053     TQT_DBusMessage message;
00054     message.d->type = DBUS_MESSAGE_TYPE_SIGNAL;
00055     message.d->path = path;
00056     message.d->interface = interface;
00057     message.d->member = member;
00058 
00059     return message;
00060 }
00061 
00062 TQT_DBusMessage TQT_DBusMessage::methodCall(const TQString &service, const TQString &path,
00063                                       const TQString &interface, const TQString &method)
00064 {
00065     TQT_DBusMessage message;
00066     message.d->type = DBUS_MESSAGE_TYPE_METHOD_CALL;
00067     message.d->service = service;
00068     message.d->path = path;
00069     message.d->interface = interface;
00070     message.d->member = method;
00071 
00072     return message;
00073 }
00074 
00075 TQT_DBusMessage TQT_DBusMessage::methodReply(const TQT_DBusMessage &other)
00076 {
00077     Q_ASSERT(other.d->msg);
00078 
00079     TQT_DBusMessage message;
00080     message.d->type = DBUS_MESSAGE_TYPE_METHOD_RETURN;
00081     message.d->reply = dbus_message_ref(other.d->msg);
00082 
00083     return message;
00084 }
00085 
00086 TQT_DBusMessage TQT_DBusMessage::methodError(const TQT_DBusMessage &other, const TQT_DBusError& error)
00087 {
00088     Q_ASSERT(other.d->msg);
00089 
00090     TQT_DBusMessage message;
00091     if (!error.isValid())
00092     {
00093         tqWarning("TQT_DBusMessage: error passed to methodError() is not valid!");
00094         return message;
00095     }
00096 
00097     message.d->type = DBUS_MESSAGE_TYPE_ERROR;
00098     message.d->reply = dbus_message_ref(other.d->msg);
00099     message.d->error = error;
00100 
00101     return message;
00102 }
00103 
00104 TQT_DBusMessage::TQT_DBusMessage()
00105 {
00106     d = new TQT_DBusMessagePrivate(this);
00107 }
00108 
00109 TQT_DBusMessage::TQT_DBusMessage(const TQT_DBusMessage &other)
00110     : TQValueList<TQT_DBusData>(other)
00111 {
00112     d = other.d;
00113     d->ref.ref();
00114 }
00115 
00116 TQT_DBusMessage::~TQT_DBusMessage()
00117 {
00118     if (!d->ref.deref())
00119         delete d;
00120 }
00121 
00122 TQT_DBusMessage &TQT_DBusMessage::operator=(const TQT_DBusMessage &other)
00123 {
00124     TQValueList<TQT_DBusData>::operator=(other);
00125     // FIXME-QT4 qAtomicAssign(d, other.d);
00126     if (other.d) other.d->ref.ref();
00127     TQT_DBusMessagePrivate* old = d;
00128     d = other.d;
00129     if (old && !old->ref.deref())
00130         delete old;
00131     return *this;
00132 }
00133 
00134 DBusMessage *TQT_DBusMessage::toDBusMessage() const
00135 {
00136     DBusMessage *msg = 0;
00137     switch (d->type) {
00138     case DBUS_MESSAGE_TYPE_METHOD_CALL:
00139         msg = dbus_message_new_method_call(d->service.utf8().data(),
00140                 d->path.utf8().data(), d->interface.utf8().data(),
00141                 d->member.utf8().data());
00142         break;
00143     case DBUS_MESSAGE_TYPE_SIGNAL:
00144         msg = dbus_message_new_signal(d->path.utf8().data(),
00145                 d->interface.utf8().data(), d->member.utf8().data());
00146         break;
00147     case DBUS_MESSAGE_TYPE_METHOD_RETURN:
00148         msg = dbus_message_new_method_return(d->reply);
00149         break;
00150     case DBUS_MESSAGE_TYPE_ERROR:
00151         msg = dbus_message_new_error(d->reply, d->error.name().utf8().data(),
00152                 d->error.message().utf8().data());
00153         break;
00154     }
00155     if (!msg)
00156         return 0;
00157 
00158     TQT_DBusMarshall::listToMessage(*this, msg);
00159     return msg;
00160 }
00161 
00162 TQT_DBusMessage TQT_DBusMessage::fromDBusMessage(DBusMessage *dmsg)
00163 {
00164     TQT_DBusMessage message;
00165     if (!dmsg)
00166         return message;
00167 
00168     message.d->type = dbus_message_get_type(dmsg);
00169     message.d->path = TQString::fromUtf8(dbus_message_get_path(dmsg));
00170     message.d->interface = TQString::fromUtf8(dbus_message_get_interface(dmsg));
00171     message.d->member = TQString::fromUtf8(dbus_message_get_member(dmsg));
00172     message.d->sender = TQString::fromUtf8(dbus_message_get_sender(dmsg));
00173     message.d->msg = dbus_message_ref(dmsg);
00174 
00175     DBusError dbusError;
00176     dbus_error_init(&dbusError);
00177     if (dbus_set_error_from_message(&dbusError, dmsg))
00178     {
00179         message.d->error = TQT_DBusError(&dbusError);
00180     }
00181 
00182     TQT_DBusMarshall::messageToList(message, dmsg);
00183 
00184     return message;
00185 }
00186 
00187 TQString TQT_DBusMessage::path() const
00188 {
00189     return d->path;
00190 }
00191 
00192 TQString TQT_DBusMessage::interface() const
00193 {
00194     return d->interface;
00195 }
00196 
00197 TQString TQT_DBusMessage::member() const
00198 {
00199     return d->member;
00200 }
00201 
00202 TQString TQT_DBusMessage::sender() const
00203 {
00204     return d->sender;
00205 }
00206 
00207 TQT_DBusError TQT_DBusMessage::error() const
00208 {
00209     return d->error;
00210 }
00211 
00212 int TQT_DBusMessage::timeout() const
00213 {
00214     return d->timeout;
00215 }
00216 
00217 void TQT_DBusMessage::setTimeout(int ms)
00218 {
00219     d->timeout = ms;
00220 }
00221 
00226 int TQT_DBusMessage::serialNumber() const
00227 {
00228     if (!d->msg)
00229         return 0;
00230     return dbus_message_get_serial(d->msg);
00231 }
00232 
00241 int TQT_DBusMessage::replySerialNumber() const
00242 {
00243     if (!d->msg)
00244         return 0;
00245     return dbus_message_get_reply_serial(d->msg);
00246 }
00247 
00248 TQT_DBusMessage::MessageType TQT_DBusMessage::type() const
00249 {
00250     switch (d->type) {
00251     case DBUS_MESSAGE_TYPE_METHOD_CALL:
00252         return MethodCallMessage;
00253     case DBUS_MESSAGE_TYPE_METHOD_RETURN:
00254         return ReplyMessage;
00255     case DBUS_MESSAGE_TYPE_ERROR:
00256         return ErrorMessage;
00257     case DBUS_MESSAGE_TYPE_SIGNAL:
00258         return SignalMessage;
00259     default:
00260         return InvalidMessage;
00261     }
00262 }
00263 
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Defines