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 <dcopobject.h>
00026
#include <dcopclient.h>
00027
00028
QMap<QCString, DCOPObject *> *kde_dcopObjMap = 0;
00029
00030
static inline QMap<QCString, DCOPObject *> *objMap()
00031 {
00032
if (!kde_dcopObjMap)
00033 kde_dcopObjMap =
new QMap<QCString, DCOPObject *>;
00034
return kde_dcopObjMap;
00035 }
00036
00037
class DCOPObject::DCOPObjectPrivate
00038 {
00039
public:
00040 DCOPObjectPrivate()
00041 { m_signalConnections = 0; m_dcopClient = 0; }
00042
00043
unsigned int m_signalConnections;
00044
DCOPClient *m_dcopClient;
00045 };
00046
00047 DCOPObject::DCOPObject()
00048 {
00049 d =
new DCOPObjectPrivate;
00050 ident.
sprintf(
"%p", (
void *)
this );
00051 objMap()->insert(ident,
this );
00052 }
00053
00054 DCOPObject::DCOPObject(
QObject *obj)
00055 {
00056 d =
new DCOPObjectPrivate;
00057
QObject *currentObj = obj;
00058
while (currentObj != 0L) {
00059 ident.
prepend( currentObj->
name() );
00060 ident.
prepend(
"/");
00061 currentObj = currentObj->
parent();
00062 }
00063
if ( ident[0] ==
'/' )
00064 ident = ident.
mid(1);
00065
00066 objMap()->insert(ident,
this);
00067 }
00068
00069 DCOPObject::DCOPObject(
const QCString &_objId)
00070 : ident(_objId)
00071 {
00072 d =
new DCOPObjectPrivate;
00073
if ( ident.
isEmpty() )
00074 ident.
sprintf(
"%p", (
void *)
this );
00075 objMap()->insert(ident,
this);
00076 }
00077
00078 DCOPObject::~DCOPObject()
00079 {
00080
DCOPClient *client =
DCOPClient::mainClient();
00081
if ( d->m_signalConnections > 0 && client )
00082 client->
disconnectDCOPSignal( 0, 0, 0,
objId(), 0 );
00083
00084 objMap()->remove(ident);
00085
delete d;
00086 }
00087
00088 DCOPClient *
DCOPObject::callingDcopClient()
00089 {
00090
return d->m_dcopClient;
00091 }
00092
00093
void DCOPObject::setCallingDcopClient(
DCOPClient *client)
00094 {
00095 d->m_dcopClient = client;
00096 }
00097
00098 bool DCOPObject::setObjId(
const QCString &objId)
00099 {
00100
if (objMap()->find(objId)!=objMap()->end())
return false;
00101
00102
DCOPClient *client =
DCOPClient::mainClient();
00103
if ( d->m_signalConnections > 0 && client )
00104 client->
disconnectDCOPSignal( 0, 0, 0, ident, 0 );
00105
00106 objMap()->remove(ident);
00107 ident=objId;
00108 objMap()->insert(ident,
this);
00109
return true;
00110 }
00111
00112 QCString DCOPObject::objId()
const
00113
{
00114
return ident;
00115 }
00116
00117 bool DCOPObject::hasObject(
const QCString &_objId)
00118 {
00119
if (objMap()->contains(_objId))
00120
return true;
00121
else
00122
return false;
00123 }
00124
00125 DCOPObject *
DCOPObject::find(
const QCString &_objId)
00126 {
00127
QMap<QCString, DCOPObject *>::ConstIterator it;
00128 it = objMap()->find(_objId);
00129
if (it != objMap()->end())
00130
return *it;
00131
else
00132
return 0L;
00133 }
00134
00135 QPtrList<DCOPObject> DCOPObject::match(
const QCString &partialId)
00136 {
00137
QPtrList<DCOPObject> mlist;
00138
QMap<QCString, DCOPObject *>::ConstIterator it(objMap()->begin());
00139
for (; it != objMap()->end(); ++it)
00140
if (it.key().left(partialId.
length()) == partialId)
00141 mlist.
append(it.data());
00142
return mlist;
00143 }
00144
00145
00146 QCString DCOPObject::objectName(
QObject* obj )
00147 {
00148
if ( obj == 0 )
00149
return QCString();
00150
00151
QCString identity;
00152
00153
QObject *currentObj = obj;
00154
while (currentObj != 0 )
00155 {
00156 identity.
prepend( currentObj->
name() );
00157 identity.
prepend(
"/");
00158 currentObj = currentObj->
parent();
00159 }
00160
if ( identity[0] ==
'/' )
00161 identity = identity.
mid(1);
00162
00163
return identity;
00164 }
00165
00166 bool DCOPObject::process(
const QCString &fun,
const QByteArray &data,
00167
QCString& replyType,
QByteArray &replyData)
00168 {
00169
if ( fun ==
"interfaces()" ) {
00170 replyType =
"QCStringList";
00171
QDataStream reply( replyData, IO_WriteOnly );
00172 reply <<
interfaces();
00173
return true;
00174 }
else if ( fun ==
"functions()" ) {
00175 replyType =
"QCStringList";
00176
QDataStream reply( replyData, IO_WriteOnly );
00177 reply <<
functions();
00178
return true;
00179 }
00180
return processDynamic( fun, data, replyType, replyData );
00181 }
00182
00183 bool DCOPObject::processDynamic(
const QCString&,
const QByteArray&,
QCString&,
QByteArray& )
00184 {
00185
return false;
00186 }
00187 QCStringList DCOPObject::interfacesDynamic()
00188 {
00189
QCStringList result;
00190
return result;
00191 }
00192
00193 QCStringList DCOPObject::functionsDynamic()
00194 {
00195
QCStringList result;
00196
return result;
00197 }
00198 QCStringList DCOPObject::interfaces()
00199 {
00200
QCStringList result =
interfacesDynamic();
00201 result <<
"DCOPObject";
00202
return result;
00203 }
00204
00205 QCStringList DCOPObject::functions()
00206 {
00207
QCStringList result =
functionsDynamic();
00208 result.
prepend(
"QCStringList functions()");
00209 result.
prepend(
"QCStringList interfaces()");
00210
return result;
00211 }
00212
00213 void DCOPObject::emitDCOPSignal(
const QCString &signal,
const QByteArray &data)
00214 {
00215
DCOPClient *client =
DCOPClient::mainClient();
00216
if ( client )
00217 client->
emitDCOPSignal(
objId(), signal, data );
00218 }
00219
00220 bool DCOPObject::connectDCOPSignal(
const QCString &sender,
const QCString &senderObj,
00221
const QCString &signal,
00222
const QCString &slot,
00223
bool Volatile)
00224 {
00225
DCOPClient *client =
DCOPClient::mainClient();
00226
00227
if ( !client )
00228
return false;
00229
00230 d->m_signalConnections++;
00231
return client->
connectDCOPSignal( sender, senderObj, signal,
objId(), slot, Volatile );
00232 }
00233
00234 bool DCOPObject::disconnectDCOPSignal(
const QCString &sender,
const QCString &senderObj,
00235
const QCString &signal,
00236
const QCString &slot)
00237 {
00238
DCOPClient *client =
DCOPClient::mainClient();
00239
00240
if ( !client )
00241
return false;
00242
00243 d->m_signalConnections--;
00244
return client->
disconnectDCOPSignal( sender, senderObj, signal,
objId(), slot );
00245 }
00246
00247
00248
QPtrList<DCOPObjectProxy>* DCOPObjectProxy::proxies = 0;
00249
00250 DCOPObjectProxy::DCOPObjectProxy()
00251 {
00252
if ( !proxies )
00253 proxies =
new QPtrList<DCOPObjectProxy>;
00254 proxies->
append(
this );
00255 }
00256
00257 DCOPObjectProxy::DCOPObjectProxy(
DCOPClient*)
00258 {
00259
if ( !proxies )
00260 proxies =
new QPtrList<DCOPObjectProxy>;
00261 proxies->
append(
this );
00262 }
00263
00264 DCOPObjectProxy:: ~DCOPObjectProxy()
00265 {
00266
if ( proxies )
00267 proxies->
removeRef(
this );
00268 }
00269
00270 bool DCOPObjectProxy::process(
const QCString& ,
00271
const QCString& ,
00272
const QByteArray& ,
00273
QCString& ,
00274
QByteArray & )
00275 {
00276
return false;
00277 }
00278
00279
void DCOPObject::virtual_hook(
int,
void* )
00280 { }
00281
00282
void DCOPObjectProxy::virtual_hook(
int,
void* )
00283 { }