00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "message.h"
00024
00025 #include <qmap.h>
00026
00027 #include <cstdlib>
00028
00029 namespace DBusQt {
00030
00031 struct Message::iterator::IteratorData {
00032 DBusMessageIter *iter;
00033 QVariant var;
00034 bool end;
00035 DBusMessage *mesg;
00036 };
00037
00041 Message::iterator::iterator()
00042 {
00043 d = new IteratorData;
00044 d->iter = 0; d->end = true;
00045 }
00046
00051 Message::iterator::iterator( DBusMessage* msg )
00052 {
00053 d = new IteratorData;
00054 d->mesg = msg;
00055 d->iter = static_cast<DBusMessageIter *>( malloc( sizeof(DBusMessageIter) ) );
00056 dbus_message_iter_init( d->mesg, d->iter );
00057 if ( !d->iter ) {
00058 qDebug("No iterator??");
00059 }
00060 fillVar();
00061 d->end = false;
00062 }
00063
00068 Message::iterator::iterator( const iterator& itr )
00069 {
00070 d = new IteratorData;
00071 d->iter = itr.d->iter;
00072 d->var = itr.d->var;
00073 d->end = itr.d->end;
00074 }
00075
00079 Message::iterator::~iterator()
00080 {
00081 free( d->iter );
00082 delete d; d=0;
00083 }
00084
00090 Message::iterator&
00091 Message::iterator::operator=( const iterator& itr )
00092 {
00093 IteratorData *tmp = new IteratorData;
00094 tmp->iter = itr.d->iter;
00095 tmp->var = itr.d->var;
00096 tmp->end = itr.d->end;
00097 delete d; d=tmp;
00098 return *this;
00099 }
00100
00105 const QVariant&
00106 Message::iterator::operator*() const
00107 {
00108 return d->var;
00109 }
00110
00115 QVariant&
00116 Message::iterator::operator*()
00117 {
00118 return d->var;
00119 }
00120
00126 Message::iterator&
00127 Message::iterator::operator++()
00128 {
00129 if ( d->end )
00130 return *this;
00131
00132 if ( dbus_message_iter_next( d->iter ) ) {
00133 fillVar();
00134 } else {
00135 d->end = true;
00136 d->var = QVariant();
00137 }
00138 return *this;
00139 }
00140
00145 Message::iterator
00146 Message::iterator::operator++(int)
00147 {
00148 iterator itr( *this );
00149 operator++();
00150 return itr;
00151 }
00152
00158 bool
00159 Message::iterator::operator==( const iterator& it )
00160 {
00161 if ( d->end == it.d->end ) {
00162 if ( d->end == true ) {
00163 return true;
00164 } else {
00165 return d->var == it.d->var;
00166 }
00167 } else
00168 return false;
00169 }
00170
00177 bool
00178 Message::iterator::operator!=( const iterator& it )
00179 {
00180 return !operator==( it );
00181 }
00182
00183 QVariant Message::iterator::marshallBaseType( DBusMessageIter* i )
00184 {
00185 QVariant ret;
00186 switch (dbus_message_iter_get_arg_type(i)) {
00187 case DBUS_TYPE_INT32:
00188 ret = QVariant( dbus_message_iter_get_int32(i) );
00189 break;
00190 case DBUS_TYPE_UINT32:
00191 ret = QVariant( dbus_message_iter_get_uint32(i) );
00192 break;
00193 case DBUS_TYPE_DOUBLE:
00194 ret = QVariant( dbus_message_iter_get_double(i) );
00195 break;
00196 case DBUS_TYPE_STRING:
00197 {
00198 char *str = dbus_message_iter_get_string(i);
00199 ret = QVariant( QString::fromLatin1(str) );
00200 dbus_free(str);
00201 }
00202 break;
00203 default:
00204 ret = QVariant();
00205 break;
00206 }
00207 return ret;
00208 }
00209
00213 void
00214 Message::iterator::fillVar()
00215 {
00216 switch ( dbus_message_iter_get_arg_type( d->iter ) ) {
00217 case DBUS_TYPE_INT32:
00218 case DBUS_TYPE_UINT32:
00219 case DBUS_TYPE_DOUBLE:
00220 case DBUS_TYPE_STRING:
00221 d->var = marshallBaseType( d->iter );
00222 break;
00223 case DBUS_TYPE_ARRAY: {
00224 switch ( dbus_message_iter_get_array_type( d->iter ) ) {
00225 case DBUS_TYPE_STRING: {
00226 QStringList tempList;
00227 int count;
00228 char** charArray;
00229 dbus_message_iter_get_string_array( d->iter, &charArray, &count );
00230 for ( int i=0; i < count; i++ ) {
00231 tempList.append( QString( charArray[i] ) );
00232 }
00233 d->var = QVariant( tempList );
00234 dbus_free( charArray );
00235 break;
00236 }
00237 default:
00238 qDebug( "Array of type not implemented" );
00239 d->var = QVariant();
00240 break;
00241 }
00242 break;
00243 }
00244 case DBUS_TYPE_DICT: {
00245 qDebug( "Got a hash!" );
00246 QMap<QString, QVariant> tempMap;
00247 DBusMessageIter dictIter;
00248 dbus_message_iter_init_dict_iterator( d->iter, &dictIter );
00249 do {
00250 char *key = dbus_message_iter_get_dict_key( &dictIter );
00251 tempMap[key] = marshallBaseType( &dictIter );
00252 dbus_free( key );
00253 dbus_message_iter_next( &dictIter );
00254 } while( dbus_message_iter_has_next( &dictIter ) );
00255 d->var = QVariant( tempMap );
00256 break;
00257 qDebug( "Hash/Dict type not implemented" );
00258 d->var = QVariant();
00259 break;
00260 }
00261 default:
00262 qDebug( "not implemented" );
00263 d->var = QVariant();
00264 break;
00265 }
00266 }
00267
00272 QVariant
00273 Message::iterator::var() const
00274 {
00275 return d->var;
00276 }
00277
00278 struct Message::Private {
00279 DBusMessage *msg;
00280 };
00281
00282 Message::Message( DBusMessage *m )
00283 {
00284 d = new Private;
00285 d->msg = m;
00286 }
00287
00291 Message::Message( int messageType )
00292 {
00293 d = new Private;
00294 d->msg = dbus_message_new( messageType );
00295 }
00296
00302 Message::Message( const QString& service, const QString& path,
00303 const QString& interface, const QString& method )
00304 {
00305 d = new Private;
00306 d->msg = dbus_message_new_method_call( service.latin1(), path.latin1(),
00307 interface.latin1(), method.latin1() );
00308 }
00309
00317 Message::Message( const Message& replayingTo )
00318 {
00319 d = new Private;
00320 d->msg = dbus_message_new_method_return( replayingTo.d->msg );
00321 }
00322
00323 Message:: Message( const QString& path, const QString& interface,
00324 const QString& name )
00325 {
00326 d = new Private;
00327 d->msg = dbus_message_new_signal( path.ascii(), interface.ascii(),
00328 name.ascii() );
00329 }
00330
00331 Message::Message( const Message& replayingTo, const QString& errorName,
00332 const QString& errorMessage )
00333 {
00334 d = new Private;
00335 d->msg = dbus_message_new_error( replayingTo.d->msg, errorName.utf8(),
00336 errorMessage.utf8() );
00337 }
00338
00339 Message Message::operator=( const Message& other )
00340 {
00341
00342
00343 return (Message &)(d->msg);
00344 }
00348 Message::~Message()
00349 {
00350 if ( d->msg ) {
00351 dbus_message_unref( d->msg );
00352 }
00353 delete d; d=0;
00354 }
00355
00356 int Message::type() const
00357 {
00358 return dbus_message_get_type( d->msg );
00359 }
00360
00361 void Message::setPath( const QString& path )
00362 {
00363 dbus_message_set_path( d->msg, path.ascii() );
00364 }
00365
00366 QString Message::path() const
00367 {
00368 return dbus_message_get_path( d->msg );
00369 }
00370
00371 void Message::setInterface( const QString& iface )
00372 {
00373 dbus_message_set_interface( d->msg, iface.ascii() );
00374 }
00375
00376 QString Message::interface() const
00377 {
00378 return dbus_message_get_interface( d->msg );
00379 }
00380
00381 void Message::setMember( const QString& member )
00382 {
00383 dbus_message_set_member( d->msg, member.ascii() );
00384 }
00385
00386 QString Message::member() const
00387 {
00388 return dbus_message_get_member( d->msg );
00389 }
00390
00391 void Message::setErrorName( const QString& err )
00392 {
00393 dbus_message_set_error_name( d->msg, err );
00394 }
00395
00396 QString Message::errorName() const
00397 {
00398 return dbus_message_get_error_name( d->msg );
00399 }
00400
00401 void Message::setDestination( const QString& dest )
00402 {
00403 dbus_message_set_destination( d->msg, dest );
00404 }
00405
00406 QString Message::destination() const
00407 {
00408 return dbus_message_get_destination( d->msg );
00409 }
00410
00416 bool
00417 Message::setSender( const QString& sender )
00418 {
00419 return dbus_message_set_sender( d->msg, sender.latin1() );
00420 }
00421
00426 QString
00427 Message::sender() const
00428 {
00429 return dbus_message_get_sender( d->msg );
00430 }
00431
00432 QString Message::signature() const
00433 {
00434 return dbus_message_get_signature( d->msg );
00435 }
00436
00437
00443 Message::iterator
00444 Message::begin() const
00445 {
00446 return iterator( d->msg );
00447 }
00448
00454 Message::iterator
00455 Message::end() const
00456 {
00457 return iterator();
00458 }
00459
00465 QVariant
00466 Message::at( int i )
00467 {
00468 iterator itr( d->msg );
00469
00470 while ( i-- ) {
00471 if ( itr == end() )
00472 return QVariant();
00473 ++itr;
00474 }
00475 return *itr;
00476 }
00477
00482 DBusMessage*
00483 Message::message() const
00484 {
00485 return d->msg;
00486 }
00487
00488 Message& Message::operator<<( bool b )
00489 {
00490 dbus_message_append_args( d->msg, DBUS_TYPE_BOOLEAN, b,
00491 DBUS_TYPE_INVALID );
00492
00493 return (Message &)(d->msg);
00494 }
00495
00496 Message& Message::operator<<( Q_INT8 byte )
00497 {
00498 dbus_message_append_args( d->msg, DBUS_TYPE_BYTE, byte,
00499 DBUS_TYPE_INVALID );
00500
00501 return (Message &)(d->msg);
00502 }
00503
00504 Message& Message::operator<<( Q_INT32 num )
00505 {
00506 dbus_message_append_args( d->msg, DBUS_TYPE_INT32, num,
00507 DBUS_TYPE_INVALID );
00508
00509 return (Message &)(d->msg);
00510 }
00511
00512 Message& Message::operator<<( Q_UINT32 num )
00513 {
00514 dbus_message_append_args( d->msg, DBUS_TYPE_UINT32, num,
00515 DBUS_TYPE_INVALID );
00516
00517 return (Message &)(d->msg);
00518 }
00519
00520 Message& Message::operator<<( Q_INT64 num )
00521 {
00522 dbus_message_append_args( d->msg, DBUS_TYPE_INT64, num,
00523 DBUS_TYPE_INVALID );
00524
00525 return (Message &)(d->msg);
00526 }
00527
00528 Message& Message::operator<<( Q_UINT64 num )
00529 {
00530 dbus_message_append_args( d->msg, DBUS_TYPE_UINT64, num,
00531 DBUS_TYPE_INVALID );
00532
00533 return (Message &)(d->msg);
00534 }
00535
00536 Message& Message::operator<<( double num )
00537 {
00538 dbus_message_append_args( d->msg, DBUS_TYPE_DOUBLE, num,
00539 DBUS_TYPE_INVALID );
00540
00541 return (Message &)(d->msg);
00542 }
00543
00544 Message& Message::operator<<( const QString& str )
00545 {
00546 dbus_message_append_args( d->msg, DBUS_TYPE_STRING, str.unicode(),
00547 DBUS_TYPE_INVALID );
00548
00549 return (Message &)(d->msg);
00550 }
00551
00552 Message& Message::operator<<( const QVariant& custom )
00553 {
00554
00555
00556 return (Message &)(d->msg);
00557 }
00558
00559 }