}
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) {
disconnect(channel, 0, this, 0);
channel->part(this);
emit channelParted(channel->name());
+ if(_channels.isEmpty())
+ deleteLater();
}
}
void userModeAdded(QString mode);
void userModeRemoved(QString mode);
- void renameObject(QString oldname, QString newname);
-
// void setUsermodes(const QSet<QString> &usermodes);
// QSet<QString> usermodes() const;
return newIrcUser(decodeServerString(hostmask));
}
+void Network::ircUserDestroyed() {
+ IrcUser *ircUser = static_cast<IrcUser *>(sender());
+ if(!ircUser)
+ return;
+
+ QHash<QString, IrcUser *>::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())
ircuser->deleteLater();
}
+void Network::removeIrcUser(const QString &nick) {
+ IrcUser *ircuser;
+ if((ircuser = ircUser(nick)) != 0)
+ removeIrcUser(ircuser);
+}
+
void Network::removeChansAndUsers() {
QList<IrcUser *> users = ircUsers();
foreach(IrcUser *user, users) {
}
}
-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))
void emitConnectionError(const QString &);
private slots:
+ void ircUserDestroyed();
void channelDestroyed();
void removeIrcUser(IrcUser *ircuser);
void removeIrcChannel(IrcChannel *ircChannel);
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;
}
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);
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<QByteArray> p = meta->method(methodId).parameterTypes();
_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);
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:
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);
+ }
+}
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;
};
{ 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;
}