00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef _DCOPREF_H
00024 #define _DCOPREF_H
00025
00026 #include <qcstring.h>
00027 #include <dcoptypes.h>
00028 #include <kdatastream.h>
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