00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "dcopref.h"
00026 #include "dcopclient.h"
00027 #include "dcopobject.h"
00028
00029 #include <qdatastream.h>
00030
00031 #define STR( s ) ( s.data() ? s.data() : "" )
00032
00033 bool DCOPReply::typeCheck( const char* t )
00034 {
00035 return typeCheck( t, true );
00036 }
00037
00038 bool DCOPReply::typeCheck( const char* t, bool warn )
00039 {
00040 if ( type == t )
00041 return true;
00042 if( warn
00043 || strcmp( t, "<unknown>" ))
00044 qWarning( "WARNING: DCOPReply<%s>: cast to '%s' error",
00045 STR( type ), t );
00046 return false;
00047 }
00048
00049
00050 DCOPReply DCOPRef::callInternal( const QCString& fun, const QCString& args, const QByteArray& data )
00051 {
00052 return callInternal( fun, args, data, NoEventLoop, -1 );
00053 }
00054
00055 DCOPReply DCOPRef::callInternal( const QCString& fun, const QCString& args, const QByteArray& data,
00056 EventLoopFlag useEventLoop, int timeout )
00057 {
00058 DCOPReply reply;
00059 if ( isNull() ) {
00060 qWarning( "DCOPRef: call '%s' on null reference error",
00061 STR( fun ) );
00062 return reply;
00063 }
00064 QCString sig = fun;
00065 if ( fun.find('(') == -1 ) {
00066 sig += args;
00067 if( args.find( "<unknown" ) != -1 )
00068 qWarning("DCOPRef: unknown type error "
00069 "<\"%s\",\"%s\">::call(\"%s\",%s",
00070 STR(m_app), STR(m_obj), STR(fun), args.data()+1 );
00071 }
00072 DCOPClient* dc = dcopClient();
00073 if ( !dc || !dc->isAttached() ) {
00074 qWarning( "DCOPRef::call(): no DCOP client or client not attached error" );
00075 return reply;
00076 }
00077 dc->call( m_app, m_obj, sig, data, reply.type, reply.data, useEventLoop == UseEventLoop, timeout );
00078 return reply;
00079 }
00080
00081 bool DCOPRef::sendInternal( const QCString& fun, const QCString& args, const QByteArray& data )
00082 {
00083 if ( isNull() ) {
00084 qWarning( "DCOPRef: send '%s' on null reference error",
00085 STR( fun ) );
00086 return false;
00087 }
00088 Q_UNUSED( data );
00089 QCString sig = fun;
00090 if ( fun.find('(') == -1 ) {
00091 sig += args;
00092 if( args.find( "<unknown" ) != -1 )
00093 qWarning("DCOPRef: unknown type error "
00094 "<\"%s\",\"%s\">::send(\"%s\",%s",
00095 STR(m_app), STR(m_obj), STR(fun), args.data()+1 );
00096 }
00097 DCOPClient* dc = dcopClient();
00098 if ( !dc || !dc->isAttached() ) {
00099 qWarning( "DCOPRef::send(): no DCOP client or client not attached error" );
00100 return false;
00101 }
00102 return dc->send( m_app, m_obj, sig, data );
00103 }
00104
00105 DCOPRef::DCOPRef()
00106 :d(0)
00107 {
00108 }
00109
00110 DCOPRef::DCOPRef( const DCOPRef& ref )
00111 :d( ref.d )
00112 {
00113 m_app = ref.app();
00114 m_obj = ref.obj();
00115 m_type = ref.type();
00116 }
00117
00118 DCOPRef::DCOPRef( DCOPObject *o )
00119 : m_app( DCOPClient::mainClient() ? DCOPClient::mainClient()->appId() : QCString() ),
00120 m_obj( o->objId() ), m_type( o->interfaces().last() ), d(0)
00121
00122 {
00123 }
00124
00125 DCOPRef::DCOPRef( const QCString& _app, const QCString& obj )
00126 : m_app( _app ), m_obj( obj ), d(0)
00127 {
00128 }
00129
00130 DCOPRef::DCOPRef( const QCString& _app, const QCString& _obj, const QCString& _type )
00131 : m_app( _app ), m_obj( _obj ), m_type( _type ), d(0)
00132 {
00133 }
00134
00135 bool DCOPRef::isNull() const
00136 {
00137 return ( m_app.isNull() || m_obj.isNull() );
00138 }
00139
00140 QCString DCOPRef::app() const
00141 {
00142 return m_app;
00143 }
00144
00145 QCString DCOPRef::obj() const
00146 {
00147 return m_obj;
00148 }
00149
00150 QCString DCOPRef::object() const
00151 {
00152 return m_obj;
00153 }
00154
00155
00156 QCString DCOPRef::type() const
00157 {
00158 return m_type;
00159 }
00160
00161 void DCOPRef::setDCOPClient( DCOPClient* dc )
00162 {
00163 d = (DCOPRefPrivate*) dc;
00164 }
00165
00166 DCOPClient* DCOPRef::dcopClient() const
00167 {
00168 return d ? (DCOPClient*)d : DCOPClient::mainClient();
00169 }
00170
00171 DCOPRef& DCOPRef::operator=( const DCOPRef& ref )
00172 {
00173 d = ref.d;
00174 m_app = ref.app();
00175 m_obj = ref.obj();
00176 m_type = ref.type();
00177 return *this;
00178 }
00179
00180 void DCOPRef::setRef( const QCString& _app, const QCString& _obj )
00181 {
00182 m_app = _app;
00183 m_obj = _obj;
00184 m_type = 0;
00185 }
00186
00187 void DCOPRef::setRef( const QCString& _app, const QCString& _obj, const QCString& _type )
00188 {
00189 m_app = _app;
00190 m_obj = _obj;
00191 m_type = _type;
00192 }
00193
00194 void DCOPRef::clear()
00195 {
00196 m_app = 0;
00197 m_obj = 0;
00198 m_type = 0;
00199 }
00200
00201 QDataStream& operator<<( QDataStream& str, const DCOPRef& ref )
00202 {
00203 str << ref.app();
00204 str << ref.obj();
00205 str << ref.type();
00206
00207 return str;
00208 }
00209
00210 QDataStream& operator>>( QDataStream& str, DCOPRef& ref )
00211 {
00212 QCString a, o, t;
00213 str >> a >> o >> t;
00214
00215 ref.setRef( a, o, t );
00216
00217 return str;
00218 }