|
DBus-1-TQt
1.0
|
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