1 /* -*- mode: C++; c-file-style: "gnu" -*- */
2 /* message.cpp: Qt wrapper for DBusMessage
4 * Copyright (C) 2003 Zack Rusin <zack@kde.org>
6 * Licensed under the Academic Free License version 1.2
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 struct Message::iterator::IteratorData {
30 DBusMessageIter *iter;
38 Message::iterator::iterator()
41 d->iter = 0; d->end = true;
45 * Constructs iterator for the message.
46 * @param msg message whose fields we want to iterate
48 Message::iterator::iterator( DBusMessage* msg)
51 d->iter = dbus_message_get_fields_iter( msg );
56 * Copy constructor for the iterator.
59 Message::iterator::iterator( const iterator& itr )
62 dbus_message_iter_ref( itr.d->iter );
63 d->iter = itr.d->iter;
71 Message::iterator::~iterator()
73 dbus_message_iter_unref( d->iter );
78 * Creates an iterator equal to the @p itr iterator
79 * @param itr other iterator
83 Message::iterator::operator=( const iterator& itr )
85 //in case we'll ever go fot exception safety
86 dbus_message_iter_ref( itr.d->iter );
87 IteratorData *tmp = new IteratorData;
88 tmp->iter = itr.d->iter;
89 tmp->var = itr.d->var;
90 tmp->end = itr.d->end;
91 dbus_message_iter_unref( d->iter );
97 * Returns the constant QVariant held by the iterator.
98 * @return the constant reference to QVariant held by this iterator
101 Message::iterator::operator*() const
107 * Returns the QVariant held by the iterator.
108 * @return reference to QVariant held by this iterator
111 Message::iterator::operator*()
117 * Moves to the next field and return a reference to itself after
119 * @return reference to self after incrementing
122 Message::iterator::operator++()
127 if ( dbus_message_iter_next( d->iter ) ) {
137 * Moves to the next field and returns self before incrementing.
138 * @return self before incrementing
141 Message::iterator::operator++(int)
143 iterator itr( *this );
149 * Compares this iterator to @p it iterator.
150 * @param it the iterator to which we're comparing this one to
151 * @return true if they're equal, false otherwise
154 Message::iterator::operator==( const iterator& it )
156 if ( d->end == it.d->end ) {
157 if ( d->end == true ) {
160 return d->var == it.d->var;
167 * Compares two iterators.
168 * @param it The other iterator.
169 * @return true if two iterators are not equal, false
173 Message::iterator::operator!=( const iterator& it )
175 return !operator==( it );
179 * Fills QVariant based on what current DBusMessageIter helds.
182 Message::iterator::fillVar()
184 switch ( dbus_message_iter_get_field_type( d->iter ) ) {
185 case DBUS_TYPE_INT32:
186 d->var = QVariant( dbus_message_iter_get_int32( d->iter ) );
188 case DBUS_TYPE_UINT32:
189 d->var = QVariant( dbus_message_iter_get_uint32( d->iter ) );
191 case DBUS_TYPE_DOUBLE:
192 d->var = QVariant( dbus_message_iter_get_double( d->iter ) );
194 case DBUS_TYPE_STRING:
195 d->var = QVariant( QString(dbus_message_iter_get_string( d->iter )) );
197 case DBUS_TYPE_BYTE_ARRAY:
202 ar = reinterpret_cast<char*>( dbus_message_iter_get_byte_array( d->iter, &len ) );
203 a.setRawData( ar, len );
204 QDataStream stream( a, IO_ReadOnly );
206 a.resetRawData( ar, len );
209 case DBUS_TYPE_STRING_ARRAY:
210 #warning "String array not implemented"
211 //d->var = QVariant( dbus_message_iter_get_string_array );
214 kdWarning()<<k_funcinfo<<" Serious problem!! "<<endl;
221 * Returns a QVariant help by this iterator.
222 * @return QVariant held by this iterator
225 Message::iterator::var() const
230 struct Message::MessagePrivate {
235 * Constructs a new Message with the given service and name.
236 * @param service service service that the message should be sent to
237 * @param name name of the message
239 Message::Message( const QString& service, const QString& name )
241 d = new MessagePrivate;
242 d->msg = dbus_message_new( service.latin1(), name.latin1() );
246 * Constructs a message that is a reply to some other
248 * @param name the name of the message
249 * @param replayingTo original_message the message which the created
250 * message is a reply to.
252 Message::Message( const QString& name, const Message& replayingTo )
254 d = new MessagePrivate;
255 d->msg = dbus_message_new_reply( name.latin1(), replayingTo );
259 * Creates a message just like @p other
260 * @param other the copied message
262 Message::Message( const Message& other )
264 d = new MessagePrivate;
265 d->msg = dbus_message_new_from_message( other );
273 dbus_message_unref( d->msg );
278 * Sets the message sender.
279 * @param sender the sender
280 * @return false if unsuccessful
283 Message::setSender( const QString& sender )
285 return dbus_message_set_sender( d->msg, sender.latin1() );
289 * Sets a flag indicating that the message is an error reply
290 * message, i.e. an "exception" rather than a normal response.
291 * @param error true if this is an error message.
294 Message::setError( bool error )
296 return dbus_message_set_is_error( d->msg, error );
300 * Returns name of this message.
304 Message::name() const
306 return dbus_message_get_name( d->msg );
310 * Returns service associated with this message.
314 Message::service() const
316 return dbus_message_get_service( d->msg );
320 * Returns sender of this message.
324 Message::sender() const
326 return dbus_message_get_sender( d->msg );
330 * Checks whether this message is an error indicating message.
331 * @return true if this is an error message
334 Message::isError() const
336 return dbus_message_get_is_error( d->msg );
340 * Message can be casted to DBusMessage* to make it easier to
341 * use it with raw DBus.
342 * @return underlying DBusMessage*
344 Message::operator DBusMessage*() const
350 * Appends data to this message. It can be anything QVariant accepts.
351 * @param var Data to append
354 Message::append( const QVariant& var )
356 switch ( var.type() ) {
358 dbus_message_append_int32( d->msg, var.toInt() );
361 dbus_message_append_uint32( d->msg, var.toUInt() );
363 case QVariant::String: //what about QVariant::CString ?
364 dbus_message_append_string( d->msg, var.toString() );
366 case QVariant::Double:
367 dbus_message_append_double( d->msg, var.toDouble() );
369 case QVariant::Invalid:
371 default: // handles QVariant::ByteArray
373 QDataStream stream( a, IO_WriteOnly );
375 dbus_message_append_byte_array( d->msg, a.data(), a.size() );
381 * Returns the starting iterator for the fields of this
383 * @return starting iterator
386 Message::begin() const
388 return iterator( d->msg );
392 * Returns the ending iterator for the fields of this
394 * @return ending iterator
403 * Returns the field at position @p i
404 * @param i position of the wanted field
405 * @return QVariant at position @p i or an empty QVariant
410 iterator itr( d->msg );
414 return QVariant();//nothing there
421 * The underlying DBusMessage of this class.
422 * @return DBusMessage pointer.
425 Message::message() const