dcop Library API Documentation

dcopref.h

00001 /*
00002 Copyright (c) 2002 Matthias Ettrich <ettrich@kde.org>
00003 Copyright (c) 1999 Preston Brown <pbrown@kde.org>
00004 
00005 Permission is hereby granted, free of charge, to any person obtaining a copy
00006 of this software and associated documentation files (the "Software"), to deal
00007 in the Software without restriction, including without limitation the rights
00008 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00009 copies of the Software, and to permit persons to whom the Software is
00010 furnished to do so, subject to the following conditions:
00011 
00012 The above copyright notice and this permission notice shall be included in
00013 all copies or substantial portions of the Software.
00014 
00015 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00016 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00017 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
00018 AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
00019 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
00020 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00021 */
00022 
00023 #ifndef _DCOPREF_H
00024 #define _DCOPREF_H
00025 
00026 #include <qcstring.h>
00027 #include <dcoptypes.h>
00028 #include <kdatastream.h> // needed for proper bool marshalling
00029 #include "kdelibs_export.h"
00030 
00031 class QDataStream;
00032 class DCOPObject;
00033 class DCOPClient;
00034 
00044 class DCOP_EXPORT DCOPReply
00045 {
00046 public:
00053     template<class T>
00054     operator T() {
00055     T t;
00056     if ( typeCheck( dcopTypeName(t), true ) ) {
00057         QDataStream reply( data, IO_ReadOnly );
00058         reply >> t;
00059     } else {
00060         dcopTypeInit(t);
00061     }
00062     return t;
00063     }
00071     template <class T> bool get(  T& t, const char* tname ) {
00072     if ( typeCheck( tname, false ) ) {
00073         QDataStream reply( data, IO_ReadOnly );
00074         reply >> t;
00075         return true;
00076     }
00077     return false;
00078     }
00087     template <class T> bool get(  T& t ) {
00088     if ( typeCheck( dcopTypeName(t), false ) ) {
00089         QDataStream reply( data, IO_ReadOnly );
00090         reply >> t;
00091         return true;
00092     }
00093     return false;
00094     }
00095 
00100     inline bool isValid() const { return !type.isNull(); }
00101 
00103     QByteArray data;
00105     QCString type;
00106 private:
00107     bool typeCheck( const char* t );
00108     bool typeCheck( const char* t, bool warn );
00109 };
00110 
00121 class DCOP_EXPORT DCOPArg  {
00122 public:
00131     template <class T> DCOPArg( const T& t, const char* tname_arg )
00132     : tname(tname_arg)
00133     {
00134         QDataStream ds( data, IO_WriteOnly );
00135         ds << t;
00136     }
00145     template <class T> DCOPArg( const T& t )
00146     : tname( dcopTypeName(t) )
00147     {
00148         QDataStream ds( data, IO_WriteOnly );
00149         ds << t;
00150     }
00151 
00153     QByteArray data;
00155     const char* tname;
00156 };
00157 
00158 inline const char* dcopTypeName( const DCOPArg &arg )  { return arg.tname; }
00159 inline QDataStream & operator << (QDataStream & str, const DCOPArg& arg )
00160    { str.writeRawBytes( arg.data.data(), arg.data.size() ); return str; }
00161 
00162 
00163 
00279 class DCOP_EXPORT DCOPRef
00280 {
00281 public:
00286     DCOPRef();
00287 
00291     DCOPRef( const DCOPRef& ref );
00299     DCOPRef( const QCString& app, const QCString& obj = "" );
00300 
00306     DCOPRef( DCOPObject *object );
00307 
00317     DCOPRef( const QCString& app, const QCString& obj, const QCString& type );
00318 
00324     bool isNull() const;
00325 
00330     QCString app() const;
00331 
00337     QCString obj() const;
00338 
00342     QCString object() const;
00343 
00348     QCString type() const;
00349 
00350 
00354     DCOPRef& operator=( const DCOPRef& );
00355 
00362     void setRef( const QCString& app, const QCString& obj = "" );
00363 
00370     void setRef( const QCString& app, const QCString& obj, const QCString& type );
00371 
00372 
00377     void clear();
00378 
00379 
00386     DCOPClient* dcopClient() const;
00387 
00394     void setDCOPClient( DCOPClient *client );
00395 
00404     enum EventLoopFlag { NoEventLoop, UseEventLoop };
00418     DCOPReply call( const QCString& fun ) {
00419     QByteArray data;
00420     return callInternal( fun, "()", data );
00421     }
00422 
00436     DCOPReply callExt( const QCString& fun, EventLoopFlag useEventLoop=NoEventLoop,
00437             int timeout=-1 ) {
00438     QByteArray data;
00439     return callInternal( fun, "()", data, useEventLoop, timeout );
00440     }
00441 
00457     template <class T1>
00458     DCOPReply call( const QCString& fun, const T1& t1 ) {
00459     QCString args;
00460     args.sprintf( "(%s)",
00461              dcopTypeName(t1) );
00462     QByteArray data;
00463     QDataStream ds( data, IO_WriteOnly );
00464     ds << t1;
00465     return callInternal( fun, args, data );
00466     }
00467 
00483     template <class T1>
00484     DCOPReply callExt( const QCString& fun,
00485             EventLoopFlag useEventLoop, int timeout,
00486             const T1& t1) {
00487     QCString args;
00488     args.sprintf( "(%s)",
00489              dcopTypeName(t1) );
00490     QByteArray data;
00491     QDataStream ds( data, IO_WriteOnly );
00492     ds << t1;
00493     return callInternal( fun, args, data, useEventLoop, timeout );
00494     }
00495 
00513     template <class T1, class T2>
00514     DCOPReply call( const QCString& fun,
00515             const T1& t1,
00516             const T2& t2 ) {
00517     QCString args;
00518     args.sprintf( "(%s,%s)",
00519              dcopTypeName(t1),
00520              dcopTypeName(t2) );
00521     QByteArray data;
00522     QDataStream ds( data, IO_WriteOnly );
00523     ds << t1 << t2;
00524     return callInternal( fun, args, data );
00525     }
00526 
00544     template <class T1, class T2>
00545     DCOPReply callExt( const QCString& fun,
00546             EventLoopFlag useEventLoop, int timeout,
00547             const T1& t1,
00548             const T2& t2) {
00549     QCString args;
00550     args.sprintf( "(%s,%s)",
00551              dcopTypeName(t1),
00552              dcopTypeName(t2) );
00553     QByteArray data;
00554     QDataStream ds( data, IO_WriteOnly );
00555     ds << t1 << t2;
00556     return callInternal( fun, args, data, useEventLoop, timeout );
00557     }
00558 
00578     template <class T1, class T2, class T3>
00579     DCOPReply call( const QCString& fun,
00580             const T1& t1,
00581             const T2& t2,
00582             const T3& t3 ) {
00583     QCString args;
00584     args.sprintf( "(%s,%s,%s)",
00585              dcopTypeName(t1),
00586              dcopTypeName(t2),
00587              dcopTypeName(t3) );
00588     QByteArray data;
00589     QDataStream ds( data, IO_WriteOnly );
00590     ds << t1 << t2 << t3;
00591     return callInternal( fun, args, data );
00592     }
00593 
00613     template <class T1, class T2, class T3>
00614     DCOPReply callExt( const QCString& fun,
00615             EventLoopFlag useEventLoop, int timeout,
00616             const T1& t1,
00617             const T2& t2,
00618             const T3& t3) {
00619     QCString args;
00620     args.sprintf( "(%s,%s,%s)",
00621              dcopTypeName(t1),
00622              dcopTypeName(t2),
00623              dcopTypeName(t3) );
00624     QByteArray data;
00625     QDataStream ds( data, IO_WriteOnly );
00626     ds << t1 << t2 << t3;
00627     return callInternal( fun, args, data, useEventLoop, timeout );
00628     }
00629 
00651     template <class T1,class T2,class T3,class T4>
00652     DCOPReply call( const QCString& fun,
00653             const T1& t1,
00654             const T2& t2,
00655             const T3& t3,
00656             const T4& t4 ) {
00657     QCString args;
00658     args.sprintf( "(%s,%s,%s,%s)",
00659              dcopTypeName(t1),
00660              dcopTypeName(t2),
00661              dcopTypeName(t3),
00662              dcopTypeName(t4) );
00663     QByteArray data;
00664     QDataStream ds( data, IO_WriteOnly );
00665     ds << t1 << t2 << t3 << t4;
00666     return callInternal( fun, args, data );
00667     }
00668 
00690     template <class T1,class T2,class T3,class T4>
00691     DCOPReply callExt( const QCString& fun,
00692             EventLoopFlag useEventLoop, int timeout,
00693             const T1& t1,
00694             const T2& t2,
00695             const T3& t3,
00696             const T4& t4) {
00697     QCString args;
00698     args.sprintf( "(%s,%s,%s,%s)",
00699              dcopTypeName(t1),
00700              dcopTypeName(t2),
00701              dcopTypeName(t3),
00702              dcopTypeName(t4) );
00703     QByteArray data;
00704     QDataStream ds( data, IO_WriteOnly );
00705     ds << t1 << t2 << t3 << t4;
00706     return callInternal( fun, args, data, useEventLoop, timeout );
00707     }
00708 
00732     template <class T1,class T2,class T3,class T4,class T5>
00733     DCOPReply call( const QCString& fun,
00734             const T1& t1,
00735             const T2& t2,
00736             const T3& t3,
00737             const T4& t4,
00738             const T5& t5 ) {
00739     QCString args;
00740     args.sprintf( "(%s,%s,%s,%s,%s)",
00741              dcopTypeName(t1),
00742              dcopTypeName(t2),
00743              dcopTypeName(t3),
00744              dcopTypeName(t4),
00745              dcopTypeName(t5) );
00746     QByteArray data;
00747     QDataStream ds( data, IO_WriteOnly );
00748     ds << t1 << t2 << t3 << t4 << t5;
00749     return callInternal( fun, args, data );
00750     }
00751 
00775     template <class T1,class T2,class T3,class T4,class T5>
00776     DCOPReply callExt( const QCString& fun,
00777             EventLoopFlag useEventLoop, int timeout,
00778             const T1& t1,
00779             const T2& t2,
00780             const T3& t3,
00781             const T4& t4,
00782             const T5& t5 ) {
00783     QCString args;
00784     args.sprintf( "(%s,%s,%s,%s,%s)",
00785              dcopTypeName(t1),
00786              dcopTypeName(t2),
00787              dcopTypeName(t3),
00788              dcopTypeName(t4),
00789              dcopTypeName(t5) );
00790     QByteArray data;
00791     QDataStream ds( data, IO_WriteOnly );
00792     ds << t1 << t2 << t3 << t4 << t5;
00793     return callInternal( fun, args, data, useEventLoop, timeout );
00794     }
00795 
00821     template <class T1,class T2,class T3,class T4,class T5,class T6>
00822     DCOPReply call( const QCString& fun,
00823             const T1& t1,
00824             const T2& t2,
00825             const T3& t3,
00826             const T4& t4,
00827             const T5& t5,
00828             const T6& t6 ) {
00829     QCString args;
00830     args.sprintf( "(%s,%s,%s,%s,%s,%s)",
00831              dcopTypeName(t1),
00832              dcopTypeName(t2),
00833              dcopTypeName(t3),
00834              dcopTypeName(t4),
00835              dcopTypeName(t5),
00836              dcopTypeName(t6) );
00837     QByteArray data;
00838     QDataStream ds( data, IO_WriteOnly );
00839     ds << t1 << t2 << t3 << t4 << t5 << t6;
00840     return callInternal( fun, args, data );
00841     }
00842 
00868     template <class T1,class T2,class T3,class T4,class T5,class T6>
00869     DCOPReply callExt( const QCString& fun,
00870             EventLoopFlag useEventLoop, int timeout,
00871             const T1& t1,
00872             const T2& t2,
00873             const T3& t3,
00874             const T4& t4,
00875             const T5& t5,
00876             const T6& t6) {
00877     QCString args;
00878     args.sprintf( "(%s,%s,%s,%s,%s,%s)",
00879              dcopTypeName(t1),
00880              dcopTypeName(t2),
00881              dcopTypeName(t3),
00882              dcopTypeName(t4),
00883              dcopTypeName(t5),
00884              dcopTypeName(t6) );
00885     QByteArray data;
00886     QDataStream ds( data, IO_WriteOnly );
00887     ds << t1 << t2 << t3 << t4 << t5 << t6;
00888     return callInternal( fun, args, data, useEventLoop, timeout );
00889     }
00917     template <class T1,class T2,class T3,class T4,class T5,class T6,class T7>
00918     DCOPReply call( const QCString& fun,
00919             const T1& t1,
00920             const T2& t2,
00921             const T3& t3,
00922             const T4& t4,
00923             const T5& t5,
00924             const T6& t6,
00925             const T7& t7 ) {
00926     QCString args;
00927     args.sprintf( "(%s,%s,%s,%s,%s,%s,%s)",
00928              dcopTypeName(t1),
00929              dcopTypeName(t2),
00930              dcopTypeName(t3),
00931              dcopTypeName(t4),
00932              dcopTypeName(t5),
00933              dcopTypeName(t6),
00934              dcopTypeName(t7) );
00935     QByteArray data;
00936     QDataStream ds( data, IO_WriteOnly );
00937     ds << t1 << t2 << t3 << t4 << t5 << t6 << t7;
00938     return callInternal( fun, args, data );
00939     }
00940 
00968     template <class T1,class T2,class T3,class T4,class T5,class T6,class T7>
00969     DCOPReply callExt( const QCString& fun,
00970             EventLoopFlag useEventLoop, int timeout,
00971             const T1& t1,
00972             const T2& t2,
00973             const T3& t3,
00974             const T4& t4,
00975             const T5& t5,
00976             const T6& t6,
00977             const T7& t7) {
00978     QCString args;
00979     args.sprintf( "(%s,%s,%s,%s,%s,%s,%s)",
00980              dcopTypeName(t1),
00981              dcopTypeName(t2),
00982              dcopTypeName(t3),
00983              dcopTypeName(t4),
00984              dcopTypeName(t5),
00985              dcopTypeName(t6),
00986              dcopTypeName(t7) );
00987     QByteArray data;
00988     QDataStream ds( data, IO_WriteOnly );
00989     ds << t1 << t2 << t3 << t4 << t5 << t6 << t7;
00990     return callInternal( fun, args, data, useEventLoop, timeout );
00991     }
00992 
01022     template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
01023     DCOPReply call( const QCString& fun,
01024             const T1& t1,
01025             const T2& t2,
01026             const T3& t3,
01027             const T4& t4,
01028             const T5& t5,
01029             const T6& t6,
01030             const T7& t7,
01031             const T8& t8 ) {
01032     QCString args;
01033     args.sprintf( "(%s,%s,%s,%s,%s,%s,%s,%s)",
01034              dcopTypeName(t1),
01035              dcopTypeName(t2),
01036              dcopTypeName(t3),
01037              dcopTypeName(t4),
01038              dcopTypeName(t5),
01039              dcopTypeName(t6),
01040              dcopTypeName(t7),
01041              dcopTypeName(t8) );
01042     QByteArray data;
01043     QDataStream ds( data, IO_WriteOnly );
01044     ds << t1 << t2 << t3 << t4 << t5 << t6 << t7 << t8;
01045     return callInternal( fun, args, data );
01046     }
01047 
01077     template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
01078     DCOPReply callExt( const QCString& fun,
01079             EventLoopFlag useEventLoop, int timeout,
01080             const T1& t1,
01081             const T2& t2,
01082             const T3& t3,
01083             const T4& t4,
01084             const T5& t5,
01085             const T6& t6,
01086             const T7& t7,
01087             const T8& t8) {
01088     QCString args;
01089     args.sprintf( "(%s,%s,%s,%s,%s,%s,%s,%s)",
01090              dcopTypeName(t1),
01091              dcopTypeName(t2),
01092              dcopTypeName(t3),
01093              dcopTypeName(t4),
01094              dcopTypeName(t5),
01095              dcopTypeName(t6),
01096              dcopTypeName(t7),
01097              dcopTypeName(t8) );
01098     QByteArray data;
01099     QDataStream ds( data, IO_WriteOnly );
01100     ds << t1 << t2 << t3 << t4 << t5 << t6 << t7 << t8;
01101     return callInternal( fun, args, data, useEventLoop, timeout );
01102     }
01103 
01117     bool send( const QCString& fun ) {
01118     QByteArray data;
01119     return sendInternal( fun, "()", data );
01120     }
01121 
01138     template <class T1>
01139     bool send( const QCString& fun, const T1& t1 ) {
01140     QCString args;
01141     args.sprintf( "(%s)",
01142              dcopTypeName(t1) );
01143     QByteArray data;
01144     QDataStream ds( data, IO_WriteOnly );
01145     ds << t1;
01146     return sendInternal( fun, args, data );
01147     }
01166     template <class T1, class T2>
01167     bool send( const QCString& fun,
01168             const T1& t1,
01169             const T2& t2 ) {
01170     QCString args;
01171     args.sprintf( "(%s,%s)",
01172              dcopTypeName(t1),
01173              dcopTypeName(t2) );
01174     QByteArray data;
01175     QDataStream ds( data, IO_WriteOnly );
01176     ds << t1 << t2;
01177     return sendInternal( fun, args, data );
01178     }
01199     template <class T1, class T2, class T3>
01200     bool send( const QCString& fun,
01201             const T1& t1,
01202             const T2& t2,
01203             const T3& t3 ) {
01204     QCString args;
01205     args.sprintf( "(%s,%s,%s)",
01206              dcopTypeName(t1),
01207              dcopTypeName(t2),
01208              dcopTypeName(t3) );
01209     QByteArray data;
01210     QDataStream ds( data, IO_WriteOnly );
01211     ds << t1 << t2 << t3;
01212     return sendInternal( fun, args, data );
01213     }
01236     template <class T1,class T2,class T3,class T4>
01237     bool send( const QCString& fun,
01238             const T1& t1,
01239             const T2& t2,
01240             const T3& t3,
01241             const T4& t4 ) {
01242     QCString args;
01243     args.sprintf( "(%s,%s,%s,%s)",
01244              dcopTypeName(t1),
01245              dcopTypeName(t2),
01246              dcopTypeName(t3),
01247              dcopTypeName(t4) );
01248     QByteArray data;
01249     QDataStream ds( data, IO_WriteOnly );
01250     ds << t1 << t2 << t3 << t4;
01251     return sendInternal( fun, args, data );
01252     }
01277     template <class T1,class T2,class T3,class T4,class T5>
01278     bool send( const QCString& fun,
01279             const T1& t1,
01280             const T2& t2,
01281             const T3& t3,
01282             const T4& t4,
01283             const T5& t5 ) {
01284     QCString args;
01285     args.sprintf( "(%s,%s,%s,%s,%s)",
01286              dcopTypeName(t1),
01287              dcopTypeName(t2),
01288              dcopTypeName(t3),
01289              dcopTypeName(t4),
01290              dcopTypeName(t5) );
01291     QByteArray data;
01292     QDataStream ds( data, IO_WriteOnly );
01293     ds << t1 << t2 << t3 << t4 << t5;
01294     return sendInternal( fun, args, data );
01295     }
01322     template <class T1,class T2,class T3,class T4,class T5,class T6>
01323     bool send( const QCString& fun,
01324             const T1& t1,
01325             const T2& t2,
01326             const T3& t3,
01327             const T4& t4,
01328             const T5& t5,
01329             const T6& t6 ) {
01330     QCString args;
01331     args.sprintf( "(%s,%s,%s,%s,%s,%s)",
01332              dcopTypeName(t1),
01333              dcopTypeName(t2),
01334              dcopTypeName(t3),
01335              dcopTypeName(t4),
01336              dcopTypeName(t5),
01337              dcopTypeName(t6) );
01338     QByteArray data;
01339     QDataStream ds( data, IO_WriteOnly );
01340     ds << t1 << t2 << t3 << t4 << t5 << t6;
01341     return sendInternal( fun, args, data );
01342     }
01371     template <class T1,class T2,class T3,class T4,class T5,class T6,class T7>
01372     bool send( const QCString& fun,
01373             const T1& t1,
01374             const T2& t2,
01375             const T3& t3,
01376             const T4& t4,
01377             const T5& t5,
01378             const T6& t6,
01379             const T7& t7 ) {
01380     QCString args;
01381     args.sprintf( "(%s,%s,%s,%s,%s,%s,%s)",
01382              dcopTypeName(t1),
01383              dcopTypeName(t2),
01384              dcopTypeName(t3),
01385              dcopTypeName(t4),
01386              dcopTypeName(t5),
01387              dcopTypeName(t6),
01388              dcopTypeName(t7) );
01389     QByteArray data;
01390     QDataStream ds( data, IO_WriteOnly );
01391     ds << t1 << t2 << t3 << t4 << t5 << t6 << t7;
01392     return sendInternal( fun, args, data );
01393     }
01424     template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
01425     bool send( const QCString& fun,
01426             const T1& t1,
01427             const T2& t2,
01428             const T3& t3,
01429             const T4& t4,
01430             const T5& t5,
01431             const T6& t6,
01432             const T7& t7,
01433             const T8& t8 ) {
01434     QCString args;
01435     args.sprintf( "(%s,%s,%s,%s,%s,%s,%s,%s)",
01436              dcopTypeName(t1),
01437              dcopTypeName(t2),
01438              dcopTypeName(t3),
01439              dcopTypeName(t4),
01440              dcopTypeName(t5),
01441              dcopTypeName(t6),
01442              dcopTypeName(t7),
01443              dcopTypeName(t8) );
01444     QByteArray data;
01445     QDataStream ds( data, IO_WriteOnly );
01446     ds << t1 << t2 << t3 << t4 << t5 << t6 << t7 << t8;
01447     return sendInternal( fun, args, data );
01448     }
01449 
01450 
01451 
01452 private:
01453     DCOPReply callInternal( const QCString& fun, const QCString& args, const QByteArray& data,
01454                 EventLoopFlag useEventLoop, int timeout );
01455     DCOPReply callInternal( const QCString& fun, const QCString& args, const QByteArray& data );
01456     bool sendInternal( const QCString& fun, const QCString& args, const QByteArray& data );
01457 
01458     QCString m_app;
01459     QCString m_obj;
01460     QCString m_type;
01461 
01462     class DCOPRefPrivate;
01463     DCOPRefPrivate *d;
01464 };
01465 
01469 DCOP_EXPORT QDataStream& operator<<( QDataStream&, const DCOPRef& ref );
01473 DCOP_EXPORT QDataStream& operator>>( QDataStream&, DCOPRef& ref );
01474 
01475 #endif
KDE Logo
This file is part of the documentation for dcop Library Version 3.3.90.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 30 10:09:16 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003