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
00030 class QDataStream;
00031 class DCOPObject;
00032 class DCOPClient;
00033
00043 class DCOPReply
00044 {
00045 public:
00052 template<class T>
00053 operator T() {
00054 T t;
00055 if ( typeCheck( dcopTypeName(t) ) ) {
00056 QDataStream reply( data, IO_ReadOnly );
00057 reply >> t;
00058 } else {
00059 dcopTypeInit(t);
00060 }
00061 return t;
00062 }
00070 template <class T> bool get( T& t, const char* tname ) {
00071 if ( typeCheck( tname ) ) {
00072 QDataStream reply( data, IO_ReadOnly );
00073 reply >> t;
00074 return true;
00075 }
00076 return false;
00077 }
00087 template <class T> bool get( T& t ) {
00088 if ( typeCheck( dcopTypeName(t) ) ) {
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 };
00109
00120 class DCOPArg {
00121 public:
00130 template <class T> DCOPArg( const T& t, const char* tname_arg )
00131 : tname(tname_arg)
00132 {
00133 QDataStream ds( data, IO_WriteOnly );
00134 ds << t;
00135 }
00144 template <class T> DCOPArg( const T& t )
00145 : tname( dcopTypeName(t) )
00146 {
00147 QDataStream ds( data, IO_WriteOnly );
00148 ds << t;
00149 }
00150
00152 QByteArray data;
00154 const char* tname;
00155 };
00156
00157 inline const char* dcopTypeName( const DCOPArg &arg ) { return arg.tname; }
00158 inline QDataStream & operator << (QDataStream & str, const DCOPArg& arg )
00159 { str.writeRawBytes( arg.data.data(), arg.data.size() ); return str; }
00160
00161
00162
00275 class DCOPRef
00276 {
00277 public:
00281 DCOPRef();
00282
00286 DCOPRef( const DCOPRef& ref );
00294 DCOPRef( const QCString& app, const QCString& obj = "" );
00295
00301 DCOPRef( DCOPObject *object );
00302
00312 DCOPRef( const QCString& app, const QCString& obj, const QCString& type );
00313
00318 bool isNull() const;
00319
00324 QCString app() const;
00325
00331 QCString obj() const;
00332
00336 QCString object() const;
00337
00342 QCString type() const;
00343
00344
00348 DCOPRef& operator=( const DCOPRef& );
00349
00355 void setRef( const QCString& app, const QCString& obj = "" );
00356
00363 void setRef( const QCString& app, const QCString& obj, const QCString& type );
00364
00365
00369 void clear();
00370
00371
00378 DCOPClient* dcopClient() const;
00379
00386 void setDCOPClient( DCOPClient *client );
00387
00401 DCOPReply call( const QCString& fun ) {
00402 QByteArray data;
00403 return callInternal( fun, "()", data );
00404 }
00405
00421 template <class T1>
00422 DCOPReply call( const QCString& fun, const T1& t1 ) {
00423 QCString args;
00424 args.sprintf( "(%s)",
00425 dcopTypeName(t1) );
00426 QByteArray data;
00427 QDataStream ds( data, IO_WriteOnly );
00428 ds << t1;
00429 return callInternal( fun, args, data );
00430 }
00431
00449 template <class T1, class T2>
00450 DCOPReply call( const QCString& fun,
00451 const T1& t1,
00452 const T2& t2 ) {
00453 QCString args;
00454 args.sprintf( "(%s,%s)",
00455 dcopTypeName(t1),
00456 dcopTypeName(t2) );
00457 QByteArray data;
00458 QDataStream ds( data, IO_WriteOnly );
00459 ds << t1 << t2;
00460 return callInternal( fun, args, data );
00461 }
00462
00482 template <class T1, class T2, class T3>
00483 DCOPReply call( const QCString& fun,
00484 const T1& t1,
00485 const T2& t2,
00486 const T3& t3 ) {
00487 QCString args;
00488 args.sprintf( "(%s,%s,%s)",
00489 dcopTypeName(t1),
00490 dcopTypeName(t2),
00491 dcopTypeName(t3) );
00492 QByteArray data;
00493 QDataStream ds( data, IO_WriteOnly );
00494 ds << t1 << t2 << t3;
00495 return callInternal( fun, args, data );
00496 }
00497
00519 template <class T1,class T2,class T3,class T4>
00520 DCOPReply call( const QCString& fun,
00521 const T1& t1,
00522 const T2& t2,
00523 const T3& t3,
00524 const T4& t4 ) {
00525 QCString args;
00526 args.sprintf( "(%s,%s,%s,%s)",
00527 dcopTypeName(t1),
00528 dcopTypeName(t2),
00529 dcopTypeName(t3),
00530 dcopTypeName(t4) );
00531 QByteArray data;
00532 QDataStream ds( data, IO_WriteOnly );
00533 ds << t1 << t2 << t3 << t4;
00534 return callInternal( fun, args, data );
00535 }
00536
00560 template <class T1,class T2,class T3,class T4,class T5>
00561 DCOPReply call( const QCString& fun,
00562 const T1& t1,
00563 const T2& t2,
00564 const T3& t3,
00565 const T4& t4,
00566 const T5& t5 ) {
00567 QCString args;
00568 args.sprintf( "(%s,%s,%s,%s,%s)",
00569 dcopTypeName(t1),
00570 dcopTypeName(t2),
00571 dcopTypeName(t3),
00572 dcopTypeName(t4),
00573 dcopTypeName(t5) );
00574 QByteArray data;
00575 QDataStream ds( data, IO_WriteOnly );
00576 ds << t1 << t2 << t3 << t4 << t5;
00577 return callInternal( fun, args, data );
00578 }
00579
00605 template <class T1,class T2,class T3,class T4,class T5,class T6>
00606 DCOPReply call( const QCString& fun,
00607 const T1& t1,
00608 const T2& t2,
00609 const T3& t3,
00610 const T4& t4,
00611 const T5& t5,
00612 const T6& t6 ) {
00613 QCString args;
00614 args.sprintf( "(%s,%s,%s,%s,%s,%s)",
00615 dcopTypeName(t1),
00616 dcopTypeName(t2),
00617 dcopTypeName(t3),
00618 dcopTypeName(t4),
00619 dcopTypeName(t5),
00620 dcopTypeName(t6) );
00621 QByteArray data;
00622 QDataStream ds( data, IO_WriteOnly );
00623 ds << t1 << t2 << t3 << t4 << t5 << t6;
00624 return callInternal( fun, args, data );
00625 }
00626
00654 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7>
00655 DCOPReply call( const QCString& fun,
00656 const T1& t1,
00657 const T2& t2,
00658 const T3& t3,
00659 const T4& t4,
00660 const T5& t5,
00661 const T6& t6,
00662 const T7& t7 ) {
00663 QCString args;
00664 args.sprintf( "(%s,%s,%s,%s,%s,%s,%s)",
00665 dcopTypeName(t1),
00666 dcopTypeName(t2),
00667 dcopTypeName(t3),
00668 dcopTypeName(t4),
00669 dcopTypeName(t5),
00670 dcopTypeName(t6),
00671 dcopTypeName(t7) );
00672 QByteArray data;
00673 QDataStream ds( data, IO_WriteOnly );
00674 ds << t1 << t2 << t3 << t4 << t5 << t6 << t7;
00675 return callInternal( fun, args, data );
00676 }
00677
00707 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
00708 DCOPReply call( const QCString& fun,
00709 const T1& t1,
00710 const T2& t2,
00711 const T3& t3,
00712 const T4& t4,
00713 const T5& t5,
00714 const T6& t6,
00715 const T7& t7,
00716 const T8& t8 ) {
00717 QCString args;
00718 args.sprintf( "(%s,%s,%s,%s,%s,%s,%s,%s)",
00719 dcopTypeName(t1),
00720 dcopTypeName(t2),
00721 dcopTypeName(t3),
00722 dcopTypeName(t4),
00723 dcopTypeName(t5),
00724 dcopTypeName(t6),
00725 dcopTypeName(t7),
00726 dcopTypeName(t8) );
00727 QByteArray data;
00728 QDataStream ds( data, IO_WriteOnly );
00729 ds << t1 << t2 << t3 << t4 << t5 << t6 << t7 << t8;
00730 return callInternal( fun, args, data );
00731 }
00732
00746 bool send( const QCString& fun ) {
00747 QByteArray data;
00748 return sendInternal( fun, "()", data );
00749 }
00750
00767 template <class T1>
00768 bool send( const QCString& fun, const T1& t1 ) {
00769 QCString args;
00770 args.sprintf( "(%s)",
00771 dcopTypeName(t1) );
00772 QByteArray data;
00773 QDataStream ds( data, IO_WriteOnly );
00774 ds << t1;
00775 return sendInternal( fun, args, data );
00776 }
00795 template <class T1, class T2>
00796 bool send( const QCString& fun,
00797 const T1& t1,
00798 const T2& t2 ) {
00799 QCString args;
00800 args.sprintf( "(%s,%s)",
00801 dcopTypeName(t1),
00802 dcopTypeName(t2) );
00803 QByteArray data;
00804 QDataStream ds( data, IO_WriteOnly );
00805 ds << t1 << t2;
00806 return sendInternal( fun, args, data );
00807 }
00828 template <class T1, class T2, class T3>
00829 bool send( const QCString& fun,
00830 const T1& t1,
00831 const T2& t2,
00832 const T3& t3 ) {
00833 QCString args;
00834 args.sprintf( "(%s,%s,%s)",
00835 dcopTypeName(t1),
00836 dcopTypeName(t2),
00837 dcopTypeName(t3) );
00838 QByteArray data;
00839 QDataStream ds( data, IO_WriteOnly );
00840 ds << t1 << t2 << t3;
00841 return sendInternal( fun, args, data );
00842 }
00865 template <class T1,class T2,class T3,class T4>
00866 bool send( const QCString& fun,
00867 const T1& t1,
00868 const T2& t2,
00869 const T3& t3,
00870 const T4& t4 ) {
00871 QCString args;
00872 args.sprintf( "(%s,%s,%s,%s)",
00873 dcopTypeName(t1),
00874 dcopTypeName(t2),
00875 dcopTypeName(t3),
00876 dcopTypeName(t4) );
00877 QByteArray data;
00878 QDataStream ds( data, IO_WriteOnly );
00879 ds << t1 << t2 << t3 << t4;
00880 return sendInternal( fun, args, data );
00881 }
00906 template <class T1,class T2,class T3,class T4,class T5>
00907 bool send( const QCString& fun,
00908 const T1& t1,
00909 const T2& t2,
00910 const T3& t3,
00911 const T4& t4,
00912 const T5& t5 ) {
00913 QCString args;
00914 args.sprintf( "(%s,%s,%s,%s,%s)",
00915 dcopTypeName(t1),
00916 dcopTypeName(t2),
00917 dcopTypeName(t3),
00918 dcopTypeName(t4),
00919 dcopTypeName(t5) );
00920 QByteArray data;
00921 QDataStream ds( data, IO_WriteOnly );
00922 ds << t1 << t2 << t3 << t4 << t5;
00923 return sendInternal( fun, args, data );
00924 }
00951 template <class T1,class T2,class T3,class T4,class T5,class T6>
00952 bool send( const QCString& fun,
00953 const T1& t1,
00954 const T2& t2,
00955 const T3& t3,
00956 const T4& t4,
00957 const T5& t5,
00958 const T6& t6 ) {
00959 QCString args;
00960 args.sprintf( "(%s,%s,%s,%s,%s,%s)",
00961 dcopTypeName(t1),
00962 dcopTypeName(t2),
00963 dcopTypeName(t3),
00964 dcopTypeName(t4),
00965 dcopTypeName(t5),
00966 dcopTypeName(t6) );
00967 QByteArray data;
00968 QDataStream ds( data, IO_WriteOnly );
00969 ds << t1 << t2 << t3 << t4 << t5 << t6;
00970 return sendInternal( fun, args, data );
00971 }
01000 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7>
01001 bool send( const QCString& fun,
01002 const T1& t1,
01003 const T2& t2,
01004 const T3& t3,
01005 const T4& t4,
01006 const T5& t5,
01007 const T6& t6,
01008 const T7& t7 ) {
01009 QCString args;
01010 args.sprintf( "(%s,%s,%s,%s,%s,%s,%s)",
01011 dcopTypeName(t1),
01012 dcopTypeName(t2),
01013 dcopTypeName(t3),
01014 dcopTypeName(t4),
01015 dcopTypeName(t5),
01016 dcopTypeName(t6),
01017 dcopTypeName(t7) );
01018 QByteArray data;
01019 QDataStream ds( data, IO_WriteOnly );
01020 ds << t1 << t2 << t3 << t4 << t5 << t6 << t7;
01021 return sendInternal( fun, args, data );
01022 }
01053 template <class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
01054 bool send( const QCString& fun,
01055 const T1& t1,
01056 const T2& t2,
01057 const T3& t3,
01058 const T4& t4,
01059 const T5& t5,
01060 const T6& t6,
01061 const T7& t7,
01062 const T8& t8 ) {
01063 QCString args;
01064 args.sprintf( "(%s,%s,%s,%s,%s,%s,%s,%s)",
01065 dcopTypeName(t1),
01066 dcopTypeName(t2),
01067 dcopTypeName(t3),
01068 dcopTypeName(t4),
01069 dcopTypeName(t5),
01070 dcopTypeName(t6),
01071 dcopTypeName(t7),
01072 dcopTypeName(t8) );
01073 QByteArray data;
01074 QDataStream ds( data, IO_WriteOnly );
01075 ds << t1 << t2 << t3 << t4 << t5 << t6 << t7 << t8;
01076 return sendInternal( fun, args, data );
01077 }
01078
01079
01080
01081 private:
01082 DCOPReply callInternal( const QCString& fun, const QCString& args, const QByteArray& data );
01083 bool sendInternal( const QCString& fun, const QCString& args, const QByteArray& data );
01084
01085 QCString m_app;
01086 QCString m_obj;
01087 QCString m_type;
01088
01089 class DCOPRefPrivate;
01090 DCOPRefPrivate *d;
01091 };
01092
01096 QDataStream& operator<<( QDataStream&, const DCOPRef& ref );
01100 QDataStream& operator>>( QDataStream&, DCOPRef& ref );
01101
01102 #endif