From: Marcus Eggenberger Date: Sat, 1 Mar 2008 18:12:43 +0000 (+0000) Subject: Breaking protocol with alpha2.... and it won't be the last one... X-Git-Tag: 0.2.0-alpha3~36 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=1ed8c48b0e7d309e1a92c905a19fcb7128b73d3d Breaking protocol with alpha2.... and it won't be the last one... - Minor improvements to the SignalProxy (renaming of objects) - IrcUser objects are now killed, as soon as the user leaves our scope (no common channel) --- diff --git a/src/common/ircuser.cpp b/src/common/ircuser.cpp index c3c2d0cd..efa75415 100644 --- a/src/common/ircuser.cpp +++ b/src/common/ircuser.cpp @@ -226,12 +226,7 @@ void IrcUser::setNick(const QString &nick) { } void IrcUser::updateObjectName() { - QString newName = QString::number(network()->networkId().toInt()) + "/" + _nick; - QString oldName = objectName(); - if(oldName != newName) { - setObjectName(newName); - emit renameObject(oldName, newName); - } + renameObject(QString::number(network()->networkId().toInt()) + "/" + _nick); } void IrcUser::updateHostmask(const QString &mask) { @@ -264,6 +259,8 @@ void IrcUser::partChannel(IrcChannel *channel) { disconnect(channel, 0, this, 0); channel->part(this); emit channelParted(channel->name()); + if(_channels.isEmpty()) + deleteLater(); } } diff --git a/src/common/ircuser.h b/src/common/ircuser.h index 077cc6d4..3235158d 100644 --- a/src/common/ircuser.h +++ b/src/common/ircuser.h @@ -129,8 +129,6 @@ signals: void userModeAdded(QString mode); void userModeRemoved(QString mode); - void renameObject(QString oldname, QString newname); - // void setUsermodes(const QSet &usermodes); // QSet usermodes() const; diff --git a/src/common/network.cpp b/src/common/network.cpp index c0de22e7..c7343ca3 100644 --- a/src/common/network.cpp +++ b/src/common/network.cpp @@ -301,6 +301,21 @@ IrcUser *Network::newIrcUser(const QByteArray &hostmask) { return newIrcUser(decodeServerString(hostmask)); } +void Network::ircUserDestroyed() { + IrcUser *ircUser = static_cast(sender()); + if(!ircUser) + return; + + QHash::iterator ircUserIter = _ircUsers.begin(); + while(ircUserIter != _ircUsers.end()) { + if(ircUser == *ircUserIter) { + ircUserIter = _ircUsers.erase(ircUserIter); + break; + } + ircUserIter++; + } +} + void Network::removeIrcUser(IrcUser *ircuser) { QString nick = _ircUsers.key(ircuser); if(nick.isNull()) @@ -313,6 +328,12 @@ void Network::removeIrcUser(IrcUser *ircuser) { ircuser->deleteLater(); } +void Network::removeIrcUser(const QString &nick) { + IrcUser *ircuser; + if((ircuser = ircUser(nick)) != 0) + removeIrcUser(ircuser); +} + void Network::removeChansAndUsers() { QList users = ircUsers(); foreach(IrcUser *user, users) { @@ -324,12 +345,6 @@ void Network::removeChansAndUsers() { } } -void Network::removeIrcUser(const QString &nick) { - IrcUser *ircuser; - if((ircuser = ircUser(nick)) != 0) - removeIrcUser(ircuser); -} - IrcUser *Network::ircUser(QString nickname) const { nickname = nickname.toLower(); if(_ircUsers.contains(nickname)) diff --git a/src/common/network.h b/src/common/network.h index 29d57492..2bdda21c 100644 --- a/src/common/network.h +++ b/src/common/network.h @@ -208,6 +208,7 @@ public slots: void emitConnectionError(const QString &); private slots: + void ircUserDestroyed(); void channelDestroyed(); void removeIrcUser(IrcUser *ircuser); void removeIrcChannel(IrcChannel *ircChannel); diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index f4fe0fb3..794e878a 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -269,38 +269,9 @@ bool SignalProxy::addPeer(QIODevice* iodev) { return true; } -void SignalProxy::removePeerBySender() { - // OK we're brutal here... but since it's a private slot we know what we've got connected to it... - QIODevice *ioDev = (QIODevice *)(sender()); - removePeer(ioDev); - qDebug() << "Client disconnected."; -} - -void SignalProxy::objectRenamed(QString oldname, QString newname) { - const QMetaObject *meta = sender()->metaObject(); - const QByteArray className(meta->className()); - objectRenamed(className, oldname, newname); - - if(proxyMode() == Client) - return; - - QVariantList params; - params << "__objectRenamed__" << className << oldname << newname; - dispatchSignal(RpcCall, params); -} - -void SignalProxy::objectRenamed(QByteArray classname, QString oldname, QString newname) { - if(_syncSlave.contains(classname) && _syncSlave[classname].contains(oldname) && oldname != newname) { - SyncableObject *obj = _syncSlave[classname][newname] = _syncSlave[classname].take(oldname); - if(!obj->isInitialized()) - requestInit(obj); - } -} - - void SignalProxy::removePeer(QIODevice* iodev) { if(_peerByteCount.isEmpty()) { - qWarning() << "SignalProxy: No peers in use!"; + qWarning() << "SignalProxy::removePeer(): No peers in use!"; return; } @@ -321,14 +292,6 @@ void SignalProxy::removePeer(QIODevice* iodev) { return; } - // take a last gasp - while(true) { - QVariant var; - if(readDataFromDevice(iodev, _peerByteCount[iodev], var)) - receivePeerSignal(iodev, var); - else - break; - } _peerByteCount.remove(iodev); disconnect(iodev, 0, this, 0); @@ -338,6 +301,33 @@ void SignalProxy::removePeer(QIODevice* iodev) { emit disconnected(); } +void SignalProxy::removePeerBySender() { + // OK we're brutal here... but since it's a private slot we know what we've got connected to it... + QIODevice *ioDev = (QIODevice *)(sender()); + removePeer(ioDev); + qDebug() << "Client disconnected."; +} + +void SignalProxy::objectRenamed(const QString &newname, const QString &oldname) { + const QMetaObject *meta = sender()->metaObject(); + const QByteArray className(meta->className()); + objectRenamed(className, oldname, newname); + + if(proxyMode() == Client) + return; + + QVariantList params; + params << "__objectRenamed__" << className << newname << oldname; + dispatchSignal(RpcCall, params); +} + +void SignalProxy::objectRenamed(const QByteArray &classname, const QString &newname, const QString &oldname) { + if(_syncSlave.contains(classname) && _syncSlave[classname].contains(oldname) && oldname != newname) { + SyncableObject *obj = _syncSlave[classname][newname] = _syncSlave[classname].take(oldname); + requestInit(obj); + } +} + void SignalProxy::setArgTypes(QObject* obj, int methodId) { const QMetaObject *meta = obj->metaObject(); QList p = meta->method(methodId).parameterTypes(); @@ -507,9 +497,7 @@ void SignalProxy::synchronize(SyncableObject *obj) { _syncSlave[className][obj->objectName()] = obj; if(proxyMode() == Server) { - if(obj->metaObject()->indexOfSignal(QMetaObject::normalizedSignature("renameObject(QString, QString)")) != -1) - connect(obj, SIGNAL(renameObject(QString, QString)), this, SLOT(objectRenamed(QString, QString))); - + connect(obj, SIGNAL(objectRenamed(QString, QString)), this, SLOT(objectRenamed(QString, QString))); setInitialized(obj); } else { requestInit(obj); diff --git a/src/common/signalproxy.h b/src/common/signalproxy.h index e5bd0f6c..f4d61668 100644 --- a/src/common/signalproxy.h +++ b/src/common/signalproxy.h @@ -113,8 +113,8 @@ private slots: void dataAvailable(); void detachSender(); void removePeerBySender(); - void objectRenamed(QString oldname, QString newname); - void objectRenamed(QByteArray classname, QString oldname, QString newname); + void objectRenamed(const QString &newname, const QString &oldname); + void objectRenamed(const QByteArray &classname, const QString &newname, const QString &oldname); void sendHeartBeat(); signals: diff --git a/src/common/syncableobject.cpp b/src/common/syncableobject.cpp index 668f61c6..ee871b8f 100644 --- a/src/common/syncableobject.cpp +++ b/src/common/syncableobject.cpp @@ -96,3 +96,11 @@ bool SyncableObject::setInitValue(const QString &property, const QVariant &value QGenericArgument param(value.typeName(), value.constData()); return QMetaObject::invokeMethod(this, handlername.toAscii(), param); } + +void SyncableObject::renameObject(const QString &newName) { + const QString oldName = objectName(); + if(oldName != newName) { + setObjectName(newName); + emit objectRenamed(newName, oldName); + } +} diff --git a/src/common/syncableobject.h b/src/common/syncableobject.h index 04ba44ba..1eb8ed48 100644 --- a/src/common/syncableobject.h +++ b/src/common/syncableobject.h @@ -29,41 +29,45 @@ class SyncableObject : public QObject { Q_OBJECT - public: - SyncableObject(QObject *parent = 0); - SyncableObject(const SyncableObject &other, QObject *parent = 0); +public: + SyncableObject(QObject *parent = 0); + SyncableObject(const SyncableObject &other, QObject *parent = 0); - //! Stores the object's state into a QVariantMap. - /** The default implementation takes dynamic properties as well as getters that have - * names starting with "init" and stores them in a QVariantMap. Override this method in - * derived classes in order to store the object state in a custom form. - * \note This is used by SignalProxy to transmit the state of the object to clients - * that request the initial object state. Later updates use a different mechanism - * and assume that the state is completely covered by properties and init* getters. - * DO NOT OVERRIDE THIS unless you know exactly what you do! - * - * \return The object's state in a QVariantMap - */ - virtual QVariantMap toVariantMap(); + //! Stores the object's state into a QVariantMap. + /** The default implementation takes dynamic properties as well as getters that have + * names starting with "init" and stores them in a QVariantMap. Override this method in + * derived classes in order to store the object state in a custom form. + * \note This is used by SignalProxy to transmit the state of the object to clients + * that request the initial object state. Later updates use a different mechanism + * and assume that the state is completely covered by properties and init* getters. + * DO NOT OVERRIDE THIS unless you know exactly what you do! + * + * \return The object's state in a QVariantMap + */ + virtual QVariantMap toVariantMap(); + + //! Initialize the object's state from a given QVariantMap. + /** \see toVariantMap() for important information concerning this method. + */ + virtual void fromVariantMap(const QVariantMap &map); - //! Initialize the object's state from a given QVariantMap. - /** \see toVariantMap() for important information concerning this method. - */ - virtual void fromVariantMap(const QVariantMap &map); + virtual bool isInitialized() const; - virtual bool isInitialized() const; +public slots: + virtual void setInitialized(); - public slots: - virtual void setInitialized(); +protected: + void renameObject(const QString &newName); + +signals: + void initDone(); + void updatedRemotely(); + void objectRenamed(QString newName, QString oldName); - signals: - void initDone(); - void updatedRemotely(); - - private: - bool setInitValue(const QString &property, const QVariant &value); - - bool _initialized; +private: + bool setInitValue(const QString &property, const QVariant &value); + + bool _initialized; }; diff --git a/version.inc b/version.inc index 51126030..a8db9df6 100644 --- a/version.inc +++ b/version.inc @@ -3,16 +3,16 @@ { using namespace Global; - quasselVersion = "0.2.0-alpha2"; + quasselVersion = "0.2.0-alpha3-pre"; quasselDate = "2008-03-01"; - quasselBuild = 603; + quasselBuild = 605; //! Minimum client build number the core needs - clientBuildNeeded = 563; + clientBuildNeeded = 605; clientVersionNeeded = quasselVersion; //! Minimum core build number the client needs - coreBuildNeeded = 563; + coreBuildNeeded = 605; coreVersionNeeded = quasselVersion; }