dcopsignals.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <dcopserver.h>
00023 #include <dcopsignals.h>
00024
00025 template class QPtrList<DCOPSignalConnection>;
00026
00027 DCOPSignals::DCOPSignals()
00028 {
00029 connections.setAutoDelete(true);
00030 }
00031
00037 void
00038 DCOPSignals::emitSignal( DCOPConnection *conn, const QCString &_fun, const QByteArray &data, bool excludeSelf)
00039 {
00040 #ifdef Q_OS_UNIX
00041 QCString senderObj;
00042 QCString fun = _fun;
00043 int i = fun.find('#');
00044 if (i > -1)
00045 {
00046 senderObj = fun.left(i);
00047 fun = fun.mid(i+1);
00048 }
00049
00050 DCOPSignalConnectionList *list = connections.find(fun);
00051 if (!list) return;
00052 for(DCOPSignalConnection *current = list->first(); current; current = list->next())
00053 {
00054 bool doSend = false;
00055 if (current->senderConn)
00056 {
00057 if (current->senderConn == conn)
00058 doSend = true;
00059 }
00060 else if (!current->sender.isEmpty())
00061 {
00062 if ((conn && current->sender == conn->appId) || (current->sender == "DCOPServer"))
00063 doSend = true;
00064 }
00065 else
00066 {
00067 doSend = true;
00068 }
00069
00070 if (!current->senderObj.isEmpty() &&
00071 (current->senderObj != senderObj))
00072 {
00073 doSend = false;
00074 }
00075
00076 if (excludeSelf && (conn == current->recvConn))
00077 doSend = false;
00078 if (doSend)
00079 {
00080 the_server->sendMessage(current->recvConn, conn ? conn->appId : QCString("DCOPServer"),
00081 current->recvConn->appId, current->recvObj,
00082 current->slot, data);
00083 }
00084 }
00085 #endif //Q_OS_UNIX
00086 }
00087
00098 bool
00099 DCOPSignals::connectSignal( const QCString &sender, const QCString &senderObj,
00100 const QCString &signal,
00101 DCOPConnection *conn, const QCString &receiverObj,
00102 const QCString &slot, bool Volatile)
00103 {
00104 #ifdef Q_OS_UNIX
00105
00106 QCString signalArgs, slotArgs;
00107 int i,j;
00108 i = signal.find('(');
00109 if (i < 0) return false;
00110 signalArgs = signal.mid(i+1);
00111 j = signalArgs.find(')');
00112 if (j < 0) return false;
00113 signalArgs.truncate(j);
00114 i = slot.find('(');
00115 if (i < 0) return false;
00116 slotArgs = slot.mid(i+1);
00117 j = slotArgs.find(')');
00118 if (j < 0) return false;
00119 slotArgs.truncate(j);
00120
00121 if(signalArgs != slotArgs)
00122 {
00123
00124 if (signalArgs.length() <= slotArgs.length())
00125 return false;
00126 if ((slotArgs.length() > 0) && (signalArgs[slotArgs.length()] != ','))
00127 return false;
00128 if (signalArgs.left(slotArgs.length()) != slotArgs)
00129 return false;
00130 }
00131
00132 DCOPConnection *senderConn = 0;
00133 if (Volatile)
00134 {
00135 senderConn = the_server->findApp(sender);
00136 if (!senderConn)
00137 return false;
00138 }
00139 DCOPSignalConnection *current = new DCOPSignalConnection;
00140 current->sender = sender;
00141 current->senderObj = senderObj;
00142 current->senderConn = senderConn;
00143 current->signal = signal;
00144 current->recvConn = conn;
00145 current->recvObj = receiverObj;
00146 current->slot = slot;
00147
00148 DCOPSignalConnectionList *list = connections.find(signal);
00149 if (!list)
00150 {
00151 list = new DCOPSignalConnectionList;
00152 connections.insert(signal, list);
00153 }
00154
00155 list->append( current );
00156 conn->signalConnectionList()->append(current);
00157 if (senderConn)
00158 senderConn->signalConnectionList()->append(current);
00159 return true;
00160 #else
00161 return false;
00162 #endif
00163 }
00164
00174 bool
00175 DCOPSignals::disconnectSignal( const QCString &sender, const QCString &senderObj,
00176 const QCString &signal,
00177 DCOPConnection *conn, const QCString &receiverObj,
00178 const QCString &slot)
00179 {
00180 if (sender.isEmpty() && signal.isEmpty())
00181 {
00182 removeConnections(conn, receiverObj);
00183 return true;
00184 }
00185
00186 DCOPSignalConnectionList *list = connections.find(signal);
00187 if (!list)
00188 return false;
00189
00190 DCOPSignalConnection *next = 0;
00191 bool result = false;
00192
00193 #ifdef Q_OS_UNIX
00194 for(DCOPSignalConnection *current = list->first(); current; current = next)
00195 {
00196 next = list->next();
00197
00198 if (current->recvConn != conn)
00199 continue;
00200
00201 if (current->senderConn)
00202 {
00203 if (current->senderConn->appId != sender)
00204 continue;
00205 }
00206 else if (current->sender != sender)
00207 continue;
00208
00209 if (!senderObj.isEmpty() &&
00210 (current->senderObj != senderObj))
00211 continue;
00212
00213 if (!receiverObj.isEmpty() &&
00214 (current->recvObj != receiverObj))
00215 continue;
00216
00217 if (!slot.isEmpty() &&
00218 (current->slot != slot))
00219 continue;
00220
00221 result = true;
00222 list->removeRef(current);
00223 conn->signalConnectionList()->removeRef(current);
00224 if (current->senderConn)
00225 current->senderConn->signalConnectionList()->removeRef(current);
00226 delete current;
00227 }
00228 #endif //Q_OS_UNIX
00229 return result;
00230 }
00231
00238 void
00239 DCOPSignals::removeConnections(DCOPConnection *conn, const QCString &obj)
00240 {
00241 #ifdef Q_OS_UNIX
00242 DCOPSignalConnectionList *list = conn->_signalConnectionList;
00243 if (!list)
00244 return;
00245
00246 DCOPSignalConnection *next = 0;
00247
00248 for(DCOPSignalConnection *current = list->first(); current; current = next)
00249 {
00250 next = list->next();
00251
00252 if (!obj.isEmpty())
00253 {
00254 if ((current->senderConn == conn) && (current->senderObj != obj))
00255 continue;
00256
00257 if ((current->recvConn == conn) && (current->recvObj != obj))
00258 continue;
00259 }
00260
00261 if (current->senderConn && (current->senderConn != conn))
00262 current->senderConn->signalConnectionList()->removeRef(current);
00263
00264 if (current->recvConn != conn)
00265 current->recvConn->signalConnectionList()->removeRef(current);
00266
00267 DCOPSignalConnectionList *signalList = connections.find(current->signal);
00268 if (signalList)
00269 {
00270 signalList->removeRef(current);
00271 if (signalList->isEmpty())
00272 connections.remove(current->signal);
00273 }
00274 else
00275 {
00276 qDebug("Error: Signal Connection was not in signalList!\n");
00277 }
00278 list->removeRef(current);
00279 delete current;
00280 }
00281 #endif //Q_OS_UNIX
00282 }
00283
00284
This file is part of the documentation for dcop Library Version 3.4.0.