• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

KDECore

kdcoppropertyproxy.cpp

Go to the documentation of this file.
00001 /* This file is part of the KDE project
00002    Copyright (C) 1999 Simon Hausmann <hausmann@kde.org>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License as published by the Free Software Foundation; either
00007    version 2 of the License, or (at your option) any later version.
00008 
00009    This library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Library General Public License for more details.
00013 
00014    You should have received a copy of the GNU Library General Public License
00015    along with this library; see the file COPYING.LIB.  If not, write to
00016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017    Boston, MA 02110-1301, USA.
00018 */
00019 
00020 #include "kdcoppropertyproxy.h"
00021 
00022 #include <qstrlist.h>
00023 #include <qmetaobject.h>
00024 #include <qvariant.h>
00025 #include <qcursor.h>
00026 #include <qbitmap.h>
00027 #include <qregion.h>
00028 #include <qpointarray.h>
00029 #include <qiconset.h>
00030 #include <qfont.h>
00031 #include <qimage.h>
00032 #include <qbrush.h>
00033 #include <qpalette.h>
00034 
00035 #include <ctype.h>
00036 #include <assert.h>
00037 
00038 class KDCOPPropertyProxyPrivate
00039 {
00040 public:
00041   KDCOPPropertyProxyPrivate()
00042   {
00043   }
00044   ~KDCOPPropertyProxyPrivate()
00045   {
00046   }
00047 
00048   QObject *m_object;
00049 };
00050 
00051 KDCOPPropertyProxy::KDCOPPropertyProxy( QObject *object )
00052 {
00053   d = new KDCOPPropertyProxyPrivate;
00054   d->m_object = object;
00055 }
00056 
00057 KDCOPPropertyProxy::~KDCOPPropertyProxy()
00058 {
00059   delete d;
00060 }
00061 
00062 bool KDCOPPropertyProxy::isPropertyRequest( const QCString &fun )
00063 {
00064   return isPropertyRequest( fun, d->m_object );
00065 }
00066 
00067 bool KDCOPPropertyProxy::processPropertyRequest( const QCString &fun, const QByteArray &data,
00068                                                  QCString &replyType, QByteArray &replyData )
00069 {
00070   return processPropertyRequest( fun, data, replyType, replyData, d->m_object );
00071 }
00072 
00073 QValueList<QCString> KDCOPPropertyProxy::functions()
00074 {
00075   return functions( d->m_object );
00076 }
00077 
00078 bool KDCOPPropertyProxy::isPropertyRequest( const QCString &fun, QObject *object )
00079 {
00080   if ( fun == "property(QCString)" ||
00081        fun == "setProperty(QCString,QVariant)" ||
00082        fun == "propertyNames(bool)" )
00083     return true;
00084 
00085   bool set;
00086   QCString propName, arg;
00087   return decodePropertyRequestInternal( fun, object, set, propName, arg );
00088 }
00089 
00090 QValueList<QCString> KDCOPPropertyProxy::functions( QObject *object )
00091 {
00092   QValueList<QCString> res;
00093   res << "QVariant property(QCString property)";
00094   res << "bool setProperty(QCString name,QVariant property)";
00095   res << "QValueList<QCString> propertyNames(bool super)";
00096 
00097   QMetaObject *metaObj = object->metaObject();
00098   QStrList properties = metaObj->propertyNames( true );
00099   QStrListIterator it( properties );
00100   for (; it.current(); ++it )
00101   {
00102     const QMetaProperty *metaProp = metaObj->property( metaObj->findProperty( it.current(), true ), true );
00103 
00104     assert( metaProp );
00105 
00106     QCString name = it.current();
00107     name.prepend( " " );
00108     name.prepend( metaProp->type() );
00109     name.append( "()" );
00110     res << name;
00111 
00112     if ( metaProp->writable() )
00113     {
00114       QCString setName = it.current();
00115       setName[ 0 ] = toupper( setName[ 0 ] );
00116       setName = "void set" + setName + "(" + metaProp->type() + " " + it.current() + ")";
00117       res << setName;
00118     }
00119   }
00120 
00121   return res;
00122 }
00123 
00124 bool KDCOPPropertyProxy::processPropertyRequest( const QCString &fun, const QByteArray &data,
00125                                                  QCString &replyType, QByteArray &replyData,
00126                                                  QObject *object )
00127 {
00128   if ( fun == "property(QCString)" )
00129   {
00130     QCString propName;
00131     QDataStream stream( data, IO_ReadOnly );
00132     stream >> propName;
00133 
00134     replyType = "QVariant";
00135     QDataStream reply( replyData, IO_WriteOnly );
00136     reply << object->property( propName );
00137     return true;
00138   }
00139 
00140   if ( fun == "setProperty(QCString,QVariant)" )
00141   {
00142     QCString propName;
00143     QVariant propValue;
00144     QDataStream stream( data, IO_ReadOnly );
00145     stream >> propName >> propValue;
00146 
00147     replyType = "bool";
00148     QDataStream reply( replyData, IO_WriteOnly );
00149     reply << (Q_INT8)object->setProperty( propName, propValue );
00150     return true;
00151   }
00152 
00153   if ( fun == "propertyNames(bool)" )
00154   {
00155     Q_INT8 b;
00156     QDataStream stream( data, IO_ReadOnly );
00157     stream >> b;
00158 
00159     QValueList<QCString> res;
00160     QStrList props = object->metaObject()->propertyNames( static_cast<bool>( b ) );
00161     QStrListIterator it( props );
00162     for (; it.current(); ++it )
00163       res.append( it.current() );
00164 
00165     replyType = "QValueList<QCString>";
00166     QDataStream reply( replyData, IO_WriteOnly );
00167     reply << res;
00168     return true;
00169   }
00170 
00171   bool set;
00172   QCString propName, arg;
00173 
00174   bool res = decodePropertyRequestInternal( fun, object, set, propName, arg );
00175   if ( !res )
00176     return false;
00177 
00178   if ( set )
00179   {
00180     QVariant prop;
00181     QDataStream stream( data, IO_ReadOnly );
00182 
00183     QVariant::Type type = QVariant::nameToType( arg );
00184     if ( type == QVariant::Invalid )
00185       return false;
00186 
00187 #define DEMARSHAL( type, val ) \
00188   case QVariant::type: \
00189     { \
00190       val v; \
00191       stream >> v; \
00192       prop = QVariant( v ); \
00193     } \
00194     break;
00195 
00196     typedef QValueList<QVariant> ListType;
00197     typedef QMap<QString,QVariant> MapType;
00198 
00199     switch ( type )
00200     {
00201       DEMARSHAL( Cursor, QCursor )
00202       DEMARSHAL( Bitmap, QBitmap )
00203       DEMARSHAL( PointArray, QPointArray )
00204       DEMARSHAL( Region, QRegion )
00205       DEMARSHAL( List, ListType )
00206       DEMARSHAL( Map, MapType )
00207       DEMARSHAL( String, QString )
00208       DEMARSHAL( CString, QCString )
00209       DEMARSHAL( StringList, QStringList )
00210       DEMARSHAL( Font, QFont )
00211       DEMARSHAL( Pixmap, QPixmap )
00212       DEMARSHAL( Image, QImage )
00213       DEMARSHAL( Brush, QBrush )
00214       DEMARSHAL( Point, QPoint )
00215       DEMARSHAL( Rect, QRect )
00216       DEMARSHAL( Size, QSize )
00217       DEMARSHAL( Color, QColor )
00218       DEMARSHAL( Palette, QPalette )
00219       DEMARSHAL( ColorGroup, QColorGroup )
00220       case QVariant::IconSet:
00221       {
00222         QPixmap val;
00223         stream >> val;
00224         prop = QVariant( QIconSet( val ) );
00225       }
00226       break;
00227       DEMARSHAL( Int, int )
00228       DEMARSHAL( UInt, uint )
00229       case QVariant::Bool:
00230       {
00231         Q_INT8 v;
00232         stream >> v;
00233         prop = QVariant( static_cast<bool>( v ), 1 );
00234       }
00235         break;
00236       DEMARSHAL( Double, double )
00237       default:
00238         return false;
00239     }
00240 
00241     replyType = "void";
00242     return object->setProperty( propName, prop );
00243   }
00244   else
00245   {
00246     QVariant prop = object->property( propName );
00247 
00248     if ( prop.type() == QVariant::Invalid )
00249       return false;
00250 
00251     replyType = prop.typeName();
00252     QDataStream reply( replyData, IO_WriteOnly );
00253 
00254 #define MARSHAL( type ) \
00255   case QVariant::type: \
00256     reply << prop.to##type(); \
00257     break;
00258 
00259     switch ( prop.type() )
00260     {
00261       MARSHAL( Cursor )
00262       MARSHAL( Bitmap )
00263       MARSHAL( PointArray )
00264       MARSHAL( Region )
00265       MARSHAL( List )
00266       MARSHAL( Map )
00267       MARSHAL( String )
00268       MARSHAL( CString )
00269       MARSHAL( StringList )
00270       MARSHAL( Font )
00271       MARSHAL( Pixmap )
00272       MARSHAL( Image )
00273       MARSHAL( Brush )
00274       MARSHAL( Point )
00275       MARSHAL( Rect )
00276       MARSHAL( Size )
00277       MARSHAL( Color )
00278       MARSHAL( Palette )
00279       MARSHAL( ColorGroup )
00280       case QVariant::IconSet:
00281         reply << prop.toIconSet().pixmap();
00282         break;
00283       MARSHAL( Int )
00284       MARSHAL( UInt )
00285       case QVariant::Bool:
00286         reply << (Q_INT8)prop.toBool();
00287         break;
00288       MARSHAL( Double )
00289       default:
00290         return false;
00291     }
00292 
00293 #undef MARSHAL
00294 #undef DEMARSHAL
00295 
00296     return true;
00297   }
00298 
00299   return false;
00300 }
00301 
00302 bool KDCOPPropertyProxy::decodePropertyRequestInternal( const QCString &fun, QObject *object, bool &set,
00303                                                         QCString &propName, QCString &arg )
00304 {
00305   if ( fun.length() < 3 )
00306     return false;
00307 
00308   set = false;
00309 
00310   propName = fun;
00311 
00312   if ( propName.left( 3 ) == "set" )
00313   {
00314     propName.detach();
00315     set = true;
00316     propName = propName.mid( 3 );
00317     int p1 = propName.find( '(' );
00318 
00319     uint len = propName.length();
00320 
00321     if ( propName[ len - 1 ] != ')' )
00322       return false;
00323 
00324     arg = propName.mid( p1+1, len - p1 - 2 );
00325     propName.truncate( p1 );
00326     propName[ 0 ] = tolower( propName[ 0 ] );
00327   }
00328   else
00329     propName.truncate( propName.length() - 2 );
00330 
00331   if ( !object->metaObject()->propertyNames( true ).contains( propName ) )
00332     return false;
00333 
00334   return true;
00335 }

KDECore

Skip menu "KDECore"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

API Reference

Skip menu "API Reference"
  • dcop
  • DNSSD
  • interfaces
  • Kate
  • kconf_update
  • KDECore
  • KDED
  • kdefx
  • KDEsu
  • kdeui
  • KDocTools
  • KHTML
  • KImgIO
  • KInit
  • kio
  • kioslave
  • KJS
  • KNewStuff
  • KParts
  • KUtils
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal