Main Page | Modules | Class Hierarchy | Data Structures | Directories | File List | Data Fields | Related Pages

message.cpp

00001 /* -*- mode: C++; c-file-style: "gnu" -*- */
00002 /* message.cpp: Qt wrapper for DBusMessage
00003  *
00004  * Copyright (C) 2003  Zack Rusin <zack@kde.org>
00005  *
00006  * Licensed under the Academic Free License version 2.0
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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   //FIXME: ref the other.d->msg instead of copying it?
00342  /* SUSE autobuild: No return was given */
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();//nothing there
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   /* SUSE autobuild: No return was given */
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   /* SUSE autobuild: No return was given */
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   /* SUSE autobuild: No return was given */
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   /* SUSE autobuild: No return was given */
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   /* SUSE autobuild: No return was given */
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   /* SUSE autobuild: No return was given */
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   /* SUSE autobuild: No return was given */
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   /* SUSE autobuild: No return was given */
00549  return (Message &)(d->msg);
00550 }
00551 
00552 Message& Message::operator<<( const QVariant& custom )
00553 {
00554   //FIXME: imeplement
00555   /* SUSE autobuild: No return was given */
00556  return (Message &)(d->msg);
00557 }
00558 
00559 }

Generated on Tue Mar 22 19:11:26 2005 for D-BUS by  doxygen 1.4.1