00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
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