From 04754cf669dd295205226b744bc769b94693866a Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Mon, 18 Feb 2008 21:01:49 +0000 Subject: [PATCH] added core and client handlers for buffer removal --- src/client/client.cpp | 10 ++++++- src/client/client.h | 2 ++ src/client/networkmodel.cpp | 11 ++++++++ src/client/networkmodel.h | 1 + src/common/bufferinfo.h | 3 ++- src/common/buffersyncer.cpp | 8 ++++++ src/common/buffersyncer.h | 4 +++ src/core/SQL/SQLite/7/select_buffer_by_id.sql | 3 +++ src/core/core.cpp | 5 ++++ src/core/core.h | 9 +++++++ src/core/coresession.cpp | 27 +++++++++++++++++++ src/core/coresession.h | 7 +++++ src/core/sql.qrc | 1 + src/core/sqlitestorage.cpp | 18 +++++++++++++ src/core/sqlitestorage.h | 1 + src/core/storage.h | 9 ++++++- 16 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 src/core/SQL/SQLite/7/select_buffer_by_id.sql diff --git a/src/client/client.cpp b/src/client/client.cpp index a2473b17..e3a92819 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -284,6 +284,7 @@ void Client::setSyncedToCore() { Q_ASSERT(!_bufferSyncer); _bufferSyncer = new BufferSyncer(this); connect(bufferSyncer(), SIGNAL(lastSeenSet(BufferId, const QDateTime &)), this, SLOT(updateLastSeen(BufferId, const QDateTime &))); + connect(bufferSyncer(), SIGNAL(bufferRemoved(BufferId)), this, SLOT(bufferRemoved(BufferId))); signalProxy()->synchronize(bufferSyncer()); _syncedToCore = true; @@ -457,4 +458,11 @@ void Client::setBufferLastSeen(BufferId id, const QDateTime &lastSeen) { bufferSyncer()->requestSetLastSeen(id, lastSeen); } - +void Client::bufferRemoved(BufferId bufferId) { + networkModel()->removeBuffer(bufferId); + if(_buffers.contains(bufferId)) { + Buffer *buff = _buffers.take(bufferId); + disconnect(buff, 0, this, 0); + buff->deleteLater(); + } +} diff --git a/src/client/client.h b/src/client/client.h index feb9f16f..c7e3ae1e 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -157,6 +157,8 @@ public slots: void setCoreConfiguration(const QVariantMap &settings); + void bufferRemoved(BufferId bufferId); + private slots: //void coreSocketError(QAbstractSocket::SocketError); diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index 3e380d41..b10afd06 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -743,6 +743,17 @@ void NetworkModel::bufferUpdated(BufferInfo bufferInfo) { emit dataChanged(itemindex, itemindex); } +void NetworkModel::removeBuffer(BufferId bufferId) { + const int numNetworks = rootItem->childCount(); + if(numNetworks == 0) + return; + + for(int i = 0; i < numNetworks; i++) { + if(rootItem->child(i)->removeChildById(qHash(bufferId))) + break; + } +} + /* void NetworkModel::updateBufferActivity(const Message &msg) { BufferItem *buff = bufferItem(msg.bufferInfo()); diff --git a/src/client/networkmodel.h b/src/client/networkmodel.h index 41e5f1d7..1fd5767f 100644 --- a/src/client/networkmodel.h +++ b/src/client/networkmodel.h @@ -236,6 +236,7 @@ public: public slots: void bufferUpdated(BufferInfo bufferInfo); + void removeBuffer(BufferId bufferId); void setBufferActivity(const BufferInfo &buffer, Buffer::ActivityLevel activity); void networkRemoved(const NetworkId &networkId); diff --git a/src/common/bufferinfo.h b/src/common/bufferinfo.h index 6fb3de4b..4eec164e 100644 --- a/src/common/bufferinfo.h +++ b/src/common/bufferinfo.h @@ -38,7 +38,8 @@ public: BufferInfo(); BufferInfo(BufferId id, NetworkId networkid, Type type, uint gid = 0, QString buf = QString()); - + + inline bool isValid() const { return _bufferId != 0; } inline BufferId bufferId() const { return _bufferId; } inline NetworkId networkId() const { return _netid; } inline Type type() const { return _type; } diff --git a/src/common/buffersyncer.cpp b/src/common/buffersyncer.cpp index cf16d8d3..64c3bb63 100644 --- a/src/common/buffersyncer.cpp +++ b/src/common/buffersyncer.cpp @@ -60,3 +60,11 @@ void BufferSyncer::requestSetLastSeen(BufferId buffer, const QDateTime &time) { if(setLastSeen(buffer, time)) emit setLastSeenRequested(buffer, time); } + +void BufferSyncer::requestRemoveBuffer(BufferId buffer) { + emit removeBufferRequested(buffer); +} + +void BufferSyncer::removeBuffer(BufferId buffer) { + emit bufferRemoved(buffer); +} diff --git a/src/common/buffersyncer.h b/src/common/buffersyncer.h index 785c2be4..a7e78866 100644 --- a/src/common/buffersyncer.h +++ b/src/common/buffersyncer.h @@ -39,10 +39,14 @@ class BufferSyncer : public SyncableObject { void initSetLastSeen(const QVariantList &); void requestSetLastSeen(BufferId buffer, const QDateTime &time); + void requestRemoveBuffer(BufferId buffer); + void removeBuffer(BufferId buffer); signals: void lastSeenSet(BufferId buffer, const QDateTime &time); void setLastSeenRequested(BufferId buffer, const QDateTime &time); + void removeBufferRequested(BufferId buffer); + void bufferRemoved(BufferId buffer); private slots: bool setLastSeen(BufferId buffer, const QDateTime &time); diff --git a/src/core/SQL/SQLite/7/select_buffer_by_id.sql b/src/core/SQL/SQLite/7/select_buffer_by_id.sql new file mode 100644 index 00000000..09f202e8 --- /dev/null +++ b/src/core/SQL/SQLite/7/select_buffer_by_id.sql @@ -0,0 +1,3 @@ +SELECT bufferid, networkid, buffertype, groupid, buffername +FROM buffer +WHERE bufferid = :bufferid diff --git a/src/core/core.cpp b/src/core/core.cpp index add0e900..5ebc4c6c 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -240,6 +240,11 @@ BufferInfo Core::bufferInfo(UserId user, const NetworkId &networkId, BufferInfo: return instance()->storage->getBufferInfo(user, networkId, type, buffer); } +BufferInfo Core::getBufferInfo(UserId user, const BufferId &bufferId) { + QMutexLocker locker(&mutex); + return instance()->storage->getBufferInfo(user, bufferId); +} + MsgId Core::storeMessage(const Message &message) { QMutexLocker locker(&mutex); return instance()->storage->logMessage(message); diff --git a/src/core/core.h b/src/core/core.h index 97725ddc..fb260280 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -108,6 +108,15 @@ class Core : public QObject { */ static BufferInfo bufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type, const QString &buffer = ""); + //! Get the unique BufferInfo for a bufferId + /** \note This method is threadsafe + * \param user The core user who owns this buffername + * \param bufferId The id of the buffer + * \return The BufferInfo corresponding to the given buffer id, or an invalid BufferInfo if not found. + */ + static BufferInfo getBufferInfo(UserId user, const BufferId &bufferId); + + //! Store a Message in the backlog. /** \note This method is threadsafe. * diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 4a798eae..c9891d23 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -73,6 +73,8 @@ CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) : QObje QHash lastSeenHash = Core::bufferLastSeenDates(user()); foreach(BufferId id, lastSeenHash.keys()) _bufferSyncer->requestSetLastSeen(id, lastSeenHash[id]); connect(_bufferSyncer, SIGNAL(lastSeenSet(BufferId, const QDateTime &)), this, SLOT(storeBufferLastSeen(BufferId, const QDateTime &))); + connect(_bufferSyncer, SIGNAL(removeBufferRequested(BufferId)), this, SLOT(removeBufferRequested(BufferId))); + connect(this, SIGNAL(bufferRemoved(BufferId)), _bufferSyncer, SLOT(removeBuffer(BufferId))); p->synchronize(_bufferSyncer); // Restore session state @@ -473,3 +475,28 @@ void CoreSession::destroyNetwork(NetworkId id) { net->deleteLater(); } } + +void CoreSession::removeBufferRequested(BufferId bufferId) { + BufferInfo bufferInfo = Core::getBufferInfo(user(), bufferId); + if(!bufferInfo.isValid()) { + qWarning() << "CoreSession::removeBufferRequested(): invalid BufferId:" << bufferId << "for User:" << user(); + return; + } + + if(bufferInfo.type() == BufferInfo::StatusBuffer) { + qWarning() << "CoreSession::removeBufferRequested(): Status Buffers cannot be removed!"; + return; + } + + if(bufferInfo.type() == BufferInfo::ChannelBuffer) { + Network *net = network(bufferInfo.networkId()); + Q_ASSERT(net); + IrcChannel *chan = net->ircChannel(bufferInfo.bufferName()); + if(chan) { + qWarning() << "CoreSession::removeBufferRequested(): Unable to remove Buffer for joined Channel:" << bufferInfo.bufferName(); + return; + } + } + if(Core::removeBuffer(user(), bufferId)) + emit bufferRemoved(bufferId); +} diff --git a/src/core/coresession.h b/src/core/coresession.h index 640ea99b..545bf9c6 100644 --- a/src/core/coresession.h +++ b/src/core/coresession.h @@ -101,6 +101,12 @@ public slots: */ void removeNetwork(NetworkId network); + //! Remove a buffer and it's backlog permanently + /** \param bufferId The id of the buffer to be removed. + * emits bufferRemoved(bufferId) on success. + */ + void removeBufferRequested(BufferId bufferId); + signals: void initialized(); @@ -131,6 +137,7 @@ signals: void networkCreated(NetworkId); void networkRemoved(NetworkId); + void bufferRemoved(BufferId); private slots: void recvStatusMsgFromServer(QString msg); diff --git a/src/core/sql.qrc b/src/core/sql.qrc index 69be2c91..3474dd75 100644 --- a/src/core/sql.qrc +++ b/src/core/sql.qrc @@ -55,6 +55,7 @@ ./SQL/SQLite/7/insert_sender.sql ./SQL/SQLite/7/insert_server.sql ./SQL/SQLite/7/select_authuser.sql + ./SQL/SQLite/7/select_buffer_by_id.sql ./SQL/SQLite/7/select_buffer_lastseen_dates.sql ./SQL/SQLite/7/select_bufferByName.sql ./SQL/SQLite/7/select_bufferExists.sql diff --git a/src/core/sqlitestorage.cpp b/src/core/sqlitestorage.cpp index 0e3ea639..ed705a84 100644 --- a/src/core/sqlitestorage.cpp +++ b/src/core/sqlitestorage.cpp @@ -405,6 +405,24 @@ BufferInfo SqliteStorage::getBufferInfo(UserId user, const NetworkId &networkId, return bufferInfo; } +BufferInfo SqliteStorage::getBufferInfo(UserId user, const BufferId &bufferId) { + QSqlQuery query(logDb()); + query.prepare(queryString("select_buffer_by_id")); + query.bindValue(":userid", user.toInt()); + query.bindValue(":bufferid", bufferId.toInt()); + query.exec(); + if(!watchQuery(&query)) + return BufferInfo(); + + if(!query.first()) + return BufferInfo(); + + BufferInfo bufferInfo(query.value(0).toInt(), query.value(1).toInt(), (BufferInfo::Type)query.value(2).toInt(), 0, query.value(4).toString()); + Q_ASSERT(!query.next()); + + return bufferInfo; +} + QList SqliteStorage::requestBuffers(UserId user, QDateTime since) { uint time = 0; if(since.isValid()) diff --git a/src/core/sqlitestorage.h b/src/core/sqlitestorage.h index c553bdc7..71fe3922 100644 --- a/src/core/sqlitestorage.h +++ b/src/core/sqlitestorage.h @@ -59,6 +59,7 @@ public slots: /* Buffer handling */ virtual BufferInfo getBufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer = ""); + virtual BufferInfo getBufferInfo(UserId user, const BufferId &bufferId); virtual QList requestBuffers(UserId user, QDateTime since = QDateTime()); virtual bool removeBuffer(const UserId &user, const BufferId &bufferId); virtual void setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate); diff --git a/src/core/storage.h b/src/core/storage.h index 8b264f44..3915d090 100644 --- a/src/core/storage.h +++ b/src/core/storage.h @@ -155,10 +155,17 @@ class Storage : public QObject { * \param networkId The network id * \param type The type of the buffer (StatusBuffer, Channel, etc.) * \param buffer The buffer name (if empty, the net's status buffer is returned) - * \return The BufferInfo corresponding to the given network and buffer name, or 0 if not found + * \return The BufferInfo corresponding to the given network and buffer name, or an invalid BufferInfo if not found */ virtual BufferInfo getBufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer = "") = 0; + //! Get the unique BufferInfo for a bufferId + /** \param user The core user who owns this buffername + * \param bufferId The id of the buffer + * \return The BufferInfo corresponding to the given buffer id, or an invalid BufferInfo if not found. + */ + virtual BufferInfo getBufferInfo(UserId user, const BufferId &bufferId) = 0; + //! Request a list of all buffers known to a user since a certain point in time. /** This method is used to get a list of all buffers we have stored a backlog from. * Optionally, a QDateTime can be given, so that only buffers are listed that where active -- 2.20.1