projects
/
quassel.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
f6b9eed
)
clean up
author
Marcus Eggenberger
<egs@quassel-irc.org>
Mon, 24 Aug 2009 16:42:55 +0000
(18:42 +0200)
committer
Marcus Eggenberger
<egs@quassel-irc.org>
Mon, 24 Aug 2009 19:54:07 +0000
(21:54 +0200)
src/common/signalproxy.cpp
patch
|
blob
|
history
src/common/signalproxy.h
patch
|
blob
|
history
src/common/syncableobject.cpp
patch
|
blob
|
history
src/common/syncableobject.h
patch
|
blob
|
history
diff --git
a/src/common/signalproxy.cpp
b/src/common/signalproxy.cpp
index
89b434b
..
a738715
100644
(file)
--- a/
src/common/signalproxy.cpp
+++ b/
src/common/signalproxy.cpp
@@
-231,6
+231,17
@@
SignalProxy::SignalProxy(ProxyMode mode, QIODevice* device, QObject* parent)
}
SignalProxy::~SignalProxy() {
}
SignalProxy::~SignalProxy() {
+ QList<SyncableObject *> syncObjects;
+ QHash<QByteArray, ObjectId>::iterator classIter = _syncSlave.begin();
+ while(classIter != _syncSlave.end()) {
+ syncObjects << classIter->values();
+ classIter++;
+ }
+ _syncSlave.clear();
+ foreach(SyncableObject *obj, syncObjects) {
+ obj->stopSynchronize(this);
+ }
+
removeAllPeers();
}
removeAllPeers();
}
@@
-389,21
+400,24
@@
void SignalProxy::removePeerBySender() {
removePeer(sender());
}
removePeer(sender());
}
-void SignalProxy::objectRenamed(const QString &newname, const QString &oldname) {
- SyncableObject *syncObject = qobject_cast<SyncableObject *>(sender());
- const QMetaObject *meta = syncObject->syncMetaObject();
- const QByteArray className(meta->className());
- objectRenamed(className, newname, oldname);
-
+void SignalProxy::renameObject(const SyncableObject *obj, const QString &newname, const QString &oldname) {
if(proxyMode() == Client)
return;
if(proxyMode() == Client)
return;
+ const QMetaObject *meta = obj->syncMetaObject();
+ const QByteArray className(meta->className());
+ objectRenamed(className, newname, oldname);
+
QVariantList params;
params << "__objectRenamed__" << className << newname << oldname;
dispatchSignal(RpcCall, params);
}
void SignalProxy::objectRenamed(const QByteArray &classname, const QString &newname, const QString &oldname) {
QVariantList params;
params << "__objectRenamed__" << className << newname << oldname;
dispatchSignal(RpcCall, params);
}
void SignalProxy::objectRenamed(const QByteArray &classname, const QString &newname, const QString &oldname) {
+ qDebug() << "SignalProxy::objectRenamed" << classname << newname << oldname;
+ if(proxyMode() == Server)
+ return;
+
if(_syncSlave.contains(classname) && _syncSlave[classname].contains(oldname) && oldname != newname) {
SyncableObject *obj = _syncSlave[classname][newname] = _syncSlave[classname].take(oldname);
requestInit(obj);
if(_syncSlave.contains(classname) && _syncSlave[classname].contains(oldname) && oldname != newname) {
SyncableObject *obj = _syncSlave[classname][newname] = _syncSlave[classname].take(oldname);
requestInit(obj);
@@
-424,9
+438,9
@@
SignalProxy::ExtendedMetaObject *SignalProxy::extendedMetaObject(const QMetaObje
return 0;
}
return 0;
}
-SignalProxy::ExtendedMetaObject *SignalProxy::createExtendedMetaObject(const QMetaObject *meta) {
+SignalProxy::ExtendedMetaObject *SignalProxy::createExtendedMetaObject(const QMetaObject *meta
, bool checkConflicts
) {
if(!_extendedMetaObjects.contains(meta)) {
if(!_extendedMetaObjects.contains(meta)) {
- _extendedMetaObjects[meta] = new ExtendedMetaObject(meta);
+ _extendedMetaObjects[meta] = new ExtendedMetaObject(meta
, checkConflicts
);
}
return _extendedMetaObjects[meta];
}
}
return _extendedMetaObjects[meta];
}
@@
-467,16
+481,13
@@
bool SignalProxy::attachSlot(const QByteArray& sigName, QObject* recv, const cha
}
void SignalProxy::synchronize(SyncableObject *obj) {
}
void SignalProxy::synchronize(SyncableObject *obj) {
- createExtendedMetaObject(obj);
+ createExtendedMetaObject(obj
, true
);
// attaching as slave to receive sync Calls
QByteArray className(obj->syncMetaObject()->className());
_syncSlave[className][obj->objectName()] = obj;
// attaching as slave to receive sync Calls
QByteArray className(obj->syncMetaObject()->className());
_syncSlave[className][obj->objectName()] = obj;
- disconnect(obj, SIGNAL(destroyed(QObject *)), this, SLOT(detachObject(QObject *)));
- connect(obj, SIGNAL(destroyed(QObject *)), this, SLOT(detachObject(QObject *)));
if(proxyMode() == Server) {
if(proxyMode() == Server) {
- connect(obj, SIGNAL(objectRenamed(QString, QString)), this, SLOT(objectRenamed(QString, QString)));
obj->setInitialized();
emit objectInitialized(obj);
} else {
obj->setInitialized();
emit objectInitialized(obj);
} else {
@@
-490,7
+501,6
@@
void SignalProxy::synchronize(SyncableObject *obj) {
}
void SignalProxy::detachObject(QObject *obj) {
}
void SignalProxy::detachObject(QObject *obj) {
- stopSync(obj);
detachSignals(obj);
detachSlots(obj);
}
detachSignals(obj);
detachSlots(obj);
}
@@
-509,7
+519,7
@@
void SignalProxy::detachSlots(QObject* receiver) {
}
}
}
}
-void SignalProxy::stopSync
(Q
Object *obj) {
+void SignalProxy::stopSync
hronize(Syncable
Object *obj) {
// we can't use a className here, since it might be effed up, if we receive the call as a result of a decon
// gladly the objectName() is still valid. So we have only to iterate over the classes not each instance! *sigh*
QHash<QByteArray, ObjectId>::iterator classIter = _syncSlave.begin();
// we can't use a className here, since it might be effed up, if we receive the call as a result of a decon
// gladly the objectName() is still valid. So we have only to iterate over the classes not each instance! *sigh*
QHash<QByteArray, ObjectId>::iterator classIter = _syncSlave.begin();
@@
-520,6
+530,7
@@
void SignalProxy::stopSync(QObject *obj) {
}
classIter++;
}
}
classIter++;
}
+ obj->stopSynchronize(this);
}
void SignalProxy::dispatchSignal(const RequestType &requestType, const QVariantList ¶ms) {
}
void SignalProxy::dispatchSignal(const RequestType &requestType, const QVariantList ¶ms) {
@@
-994,12
+1005,10
@@
void SignalProxy::sync_call__(const SyncableObject *obj, SignalProxy::ProxyMode
ExtendedMetaObject *eMeta = extendedMetaObject(obj);
QVariantList params;
ExtendedMetaObject *eMeta = extendedMetaObject(obj);
QVariantList params;
-
params << eMeta->metaObject()->className()
<< obj->objectName()
<< QByteArray(funcname);
params << eMeta->metaObject()->className()
<< obj->objectName()
<< QByteArray(funcname);
-
const QList<int> &argTypes = eMeta->argTypes(eMeta->methodId(QByteArray(funcname)));
for(int i = 0; i < argTypes.size(); i++) {
const QList<int> &argTypes = eMeta->argTypes(eMeta->methodId(QByteArray(funcname)));
for(int i = 0; i < argTypes.size(); i++) {
@@
-1014,6
+1023,8
@@
void SignalProxy::sync_call__(const SyncableObject *obj, SignalProxy::ProxyMode
dispatchSignal(Sync, params);
}
dispatchSignal(Sync, params);
}
+
+
void SignalProxy::disconnectDevice(QIODevice *dev, const QString &reason) {
if(!reason.isEmpty())
qWarning() << qPrintable(reason);
void SignalProxy::disconnectDevice(QIODevice *dev, const QString &reason) {
if(!reason.isEmpty())
qWarning() << qPrintable(reason);
@@
-1065,7
+1076,7
@@
void SignalProxy::updateSecureState() {
// ==================================================
// ExtendedMetaObject
// ==================================================
// ==================================================
// ExtendedMetaObject
// ==================================================
-SignalProxy::ExtendedMetaObject::ExtendedMetaObject(const QMetaObject *meta)
+SignalProxy::ExtendedMetaObject::ExtendedMetaObject(const QMetaObject *meta
, bool checkConflicts
)
: _meta(meta),
_updatedRemotelyId(_meta->indexOfSignal("updatedRemotely()"))
{
: _meta(meta),
_updatedRemotelyId(_meta->indexOfSignal("updatedRemotely()"))
{
@@
-1099,8
+1110,10
@@
SignalProxy::ExtendedMetaObject::ExtendedMetaObject(const QMetaObject *meta)
continue;
}
}
continue;
}
}
- qWarning() << "class" << meta->className() << "contains overloaded methods which is currently not supported!";
- qWarning() << " - " << _meta->method(i).signature() << "conflicts with" << _meta->method(_methodIds[method]).signature();
+ if(checkConflicts) {
+ qWarning() << "class" << meta->className() << "contains overloaded methods which is currently not supported!";
+ qWarning() << " - " << _meta->method(i).signature() << "conflicts with" << _meta->method(_methodIds[method]).signature();
+ }
continue;
}
_methodIds[method] = i;
continue;
}
_methodIds[method] = i;
diff --git
a/src/common/signalproxy.h
b/src/common/signalproxy.h
index
9bae636
..
357c29b
100644
(file)
--- a/
src/common/signalproxy.h
+++ b/
src/common/signalproxy.h
@@
-85,6
+85,7
@@
public:
bool attachSlot(const QByteArray& sigName, QObject *recv, const char *slot);
void synchronize(SyncableObject *obj);
bool attachSlot(const QByteArray& sigName, QObject *recv, const char *slot);
void synchronize(SyncableObject *obj);
+ void stopSynchronize(SyncableObject *obj);
//! Writes a QVariant to a device.
/** The data item is prefixed with the resulting blocksize,
//! Writes a QVariant to a device.
/** The data item is prefixed with the resulting blocksize,
@@
-101,9
+102,9
@@
public:
class ExtendedMetaObject;
ExtendedMetaObject *extendedMetaObject(const QMetaObject *meta) const;
class ExtendedMetaObject;
ExtendedMetaObject *extendedMetaObject(const QMetaObject *meta) const;
- ExtendedMetaObject *createExtendedMetaObject(const QMetaObject *meta);
+ ExtendedMetaObject *createExtendedMetaObject(const QMetaObject *meta
, bool checkConflicts = false
);
inline ExtendedMetaObject *extendedMetaObject(const QObject *obj) const { return extendedMetaObject(metaObject(obj)); }
inline ExtendedMetaObject *extendedMetaObject(const QObject *obj) const { return extendedMetaObject(metaObject(obj)); }
- inline ExtendedMetaObject *createExtendedMetaObject(const QObject *obj
) { return createExtendedMetaObject(metaObject(obj)
); }
+ inline ExtendedMetaObject *createExtendedMetaObject(const QObject *obj
, bool checkConflicts = false) { return createExtendedMetaObject(metaObject(obj), checkConflicts
); }
bool isSecure() const { return _secure; }
void dumpProxyStats();
bool isSecure() const { return _secure; }
void dumpProxyStats();
@@
-112,16
+113,15
@@
public slots:
void detachObject(QObject *obj);
void detachSignals(QObject *sender);
void detachSlots(QObject *receiver);
void detachObject(QObject *obj);
void detachSignals(QObject *sender);
void detachSlots(QObject *receiver);
- void stopSync(QObject *obj);
protected:
void customEvent(QEvent *event);
void sync_call__(const SyncableObject *obj, ProxyMode modeType, const char *funcname, va_list ap);
protected:
void customEvent(QEvent *event);
void sync_call__(const SyncableObject *obj, ProxyMode modeType, const char *funcname, va_list ap);
+ void renameObject(const SyncableObject *obj, const QString &newname, const QString &oldname);
private slots:
void dataAvailable();
void removePeerBySender();
private slots:
void dataAvailable();
void removePeerBySender();
- void objectRenamed(const QString &newname, const QString &oldname);
void objectRenamed(const QByteArray &classname, const QString &newname, const QString &oldname);
void sendHeartBeat();
void receiveHeartBeat(AbstractPeer *peer, const QVariantList ¶ms);
void objectRenamed(const QByteArray &classname, const QString &newname, const QString &oldname);
void sendHeartBeat();
void receiveHeartBeat(AbstractPeer *peer, const QVariantList ¶ms);
@@
-227,7
+227,7
@@
class SignalProxy::ExtendedMetaObject {
};
public:
};
public:
- ExtendedMetaObject(const QMetaObject *meta);
+ ExtendedMetaObject(const QMetaObject *meta
, bool checkConflicts
);
inline const QByteArray &methodName(int methodId) { return methodDescriptor(methodId).methodName(); }
inline const QList<int> &argTypes(int methodId) { return methodDescriptor(methodId).argTypes(); }
inline const QByteArray &methodName(int methodId) { return methodDescriptor(methodId).methodName(); }
inline const QList<int> &argTypes(int methodId) { return methodDescriptor(methodId).argTypes(); }
diff --git
a/src/common/syncableobject.cpp
b/src/common/syncableobject.cpp
index
5b158ab
..
b8c8d5b
100644
(file)
--- a/
src/common/syncableobject.cpp
+++ b/
src/common/syncableobject.cpp
@@
-49,6
+49,14
@@
SyncableObject::SyncableObject(const SyncableObject &other, QObject *parent)
{
}
{
}
+SyncableObject::~SyncableObject() {
+ QList<SignalProxy *> proxies = _signalProxies;
+ _signalProxies.clear();
+ for(int i = 0; i < proxies.count(); i++) {
+ proxies[i]->stopSynchronize(this);
+ }
+}
+
SyncableObject &SyncableObject::operator=(const SyncableObject &other) {
if(this == &other)
return *this;
SyncableObject &SyncableObject::operator=(const SyncableObject &other) {
if(this == &other)
return *this;
@@
-140,7
+148,9
@@
void SyncableObject::renameObject(const QString &newName) {
const QString oldName = objectName();
if(oldName != newName) {
setObjectName(newName);
const QString oldName = objectName();
if(oldName != newName) {
setObjectName(newName);
- emit objectRenamed(newName, oldName);
+ foreach(SignalProxy *proxy, _signalProxies) {
+ proxy->renameObject(this, newName, oldName);
+ }
}
}
}
}
@@
-171,3
+181,12
@@
void SyncableObject::synchronize(SignalProxy *proxy) {
return;
_signalProxies << proxy;
}
return;
_signalProxies << proxy;
}
+
+void SyncableObject::stopSynchronize(SignalProxy *proxy) {
+ for(int i = 0; i < _signalProxies.count(); i++) {
+ if(_signalProxies[i] == proxy) {
+ _signalProxies.removeAt(i);
+ break;
+ }
+ }
+}
diff --git
a/src/common/syncableobject.h
b/src/common/syncableobject.h
index
65f575e
..
d0d7a8b
100644
(file)
--- a/
src/common/syncableobject.h
+++ b/
src/common/syncableobject.h
@@
-35,6
+35,7
@@
public:
SyncableObject(QObject *parent = 0);
SyncableObject(const QString &objectName, QObject *parent = 0);
SyncableObject(const SyncableObject &other, QObject *parent = 0);
SyncableObject(QObject *parent = 0);
SyncableObject(const QString &objectName, QObject *parent = 0);
SyncableObject(const SyncableObject &other, QObject *parent = 0);
+ ~SyncableObject();
//! Stores the object's state into a QVariantMap.
/** The default implementation takes dynamic properties as well as getters that have
//! Stores the object's state into a QVariantMap.
/** The default implementation takes dynamic properties as well as getters that have
@@
-77,10
+78,10
@@
signals:
void updatedRemotely();
void updated(const QVariantMap &properties);
void updateRequested(const QVariantMap &properties);
void updatedRemotely();
void updated(const QVariantMap &properties);
void updateRequested(const QVariantMap &properties);
- void objectRenamed(QString newName, QString oldName);
private:
void synchronize(SignalProxy *proxy);
private:
void synchronize(SignalProxy *proxy);
+ void stopSynchronize(SignalProxy *proxy);
bool setInitValue(const QString &property, const QVariant &value);
bool setInitValue(const QString &property, const QVariant &value);