added core and client handlers for buffer removal
authorMarcus Eggenberger <egs@quassel-irc.org>
Mon, 18 Feb 2008 21:01:49 +0000 (21:01 +0000)
committerMarcus Eggenberger <egs@quassel-irc.org>
Mon, 18 Feb 2008 21:01:49 +0000 (21:01 +0000)
16 files changed:
src/client/client.cpp
src/client/client.h
src/client/networkmodel.cpp
src/client/networkmodel.h
src/common/bufferinfo.h
src/common/buffersyncer.cpp
src/common/buffersyncer.h
src/core/SQL/SQLite/7/select_buffer_by_id.sql [new file with mode: 0644]
src/core/core.cpp
src/core/core.h
src/core/coresession.cpp
src/core/coresession.h
src/core/sql.qrc
src/core/sqlitestorage.cpp
src/core/sqlitestorage.h
src/core/storage.h

index a2473b1..e3a9281 100644 (file)
@@ -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 &)));
   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;
   signalProxy()->synchronize(bufferSyncer());
 
   _syncedToCore = true;
@@ -457,4 +458,11 @@ void Client::setBufferLastSeen(BufferId id, const QDateTime &lastSeen) {
   bufferSyncer()->requestSetLastSeen(id, 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();
+  }
+}
index feb9f16..c7e3ae1 100644 (file)
@@ -157,6 +157,8 @@ public slots:
 
   void setCoreConfiguration(const QVariantMap &settings);
 
 
   void setCoreConfiguration(const QVariantMap &settings);
 
+  void bufferRemoved(BufferId bufferId);
+
 private slots:
   //void coreSocketError(QAbstractSocket::SocketError);
 
 private slots:
   //void coreSocketError(QAbstractSocket::SocketError);
 
index 3e380d4..b10afd0 100644 (file)
@@ -743,6 +743,17 @@ void NetworkModel::bufferUpdated(BufferInfo bufferInfo) {
   emit dataChanged(itemindex, itemindex);
 }
 
   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());
 /*
 void NetworkModel::updateBufferActivity(const Message &msg) {
   BufferItem *buff = bufferItem(msg.bufferInfo());
index 41e5f1d..1fd5767 100644 (file)
@@ -236,6 +236,7 @@ public:
 
 public slots:
   void bufferUpdated(BufferInfo bufferInfo);
 
 public slots:
   void bufferUpdated(BufferInfo bufferInfo);
+  void removeBuffer(BufferId bufferId);
   void setBufferActivity(const BufferInfo &buffer, Buffer::ActivityLevel activity);
   void networkRemoved(const NetworkId &networkId);
   
   void setBufferActivity(const BufferInfo &buffer, Buffer::ActivityLevel activity);
   void networkRemoved(const NetworkId &networkId);
   
index 6fb3de4..4eec164 100644 (file)
@@ -38,7 +38,8 @@ public:
   
   BufferInfo();
   BufferInfo(BufferId id, NetworkId networkid, Type type, uint gid = 0, QString buf = QString());
   
   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; }
   inline BufferId bufferId() const { return _bufferId; }
   inline NetworkId networkId() const { return _netid; }
   inline Type type() const { return _type; }
index cf16d8d..64c3bb6 100644 (file)
@@ -60,3 +60,11 @@ void BufferSyncer::requestSetLastSeen(BufferId buffer, const QDateTime &time) {
   if(setLastSeen(buffer, time)) emit setLastSeenRequested(buffer, 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);
+}
index 785c2be..a7e7886 100644 (file)
@@ -39,10 +39,14 @@ class BufferSyncer : public SyncableObject {
     void initSetLastSeen(const QVariantList &);
 
     void requestSetLastSeen(BufferId buffer, const QDateTime &time);
     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);
 
   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);
 
   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 (file)
index 0000000..09f202e
--- /dev/null
@@ -0,0 +1,3 @@
+SELECT bufferid, networkid, buffertype, groupid, buffername
+FROM buffer
+WHERE bufferid = :bufferid
index add0e90..5ebc4c6 100644 (file)
@@ -240,6 +240,11 @@ BufferInfo Core::bufferInfo(UserId user, const NetworkId &networkId, BufferInfo:
   return instance()->storage->getBufferInfo(user, networkId, type, buffer);
 }
 
   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);
 MsgId Core::storeMessage(const Message &message) {
   QMutexLocker locker(&mutex);
   return instance()->storage->logMessage(message);
index 97725dd..fb26028 100644 (file)
@@ -108,6 +108,15 @@ class Core : public QObject {
      */
     static BufferInfo bufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type, const QString &buffer = "");
 
      */
     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.
      *
     //! Store a Message in the backlog.
     /** \note This method is threadsafe.
      *
index 4a798ea..c9891d2 100644 (file)
@@ -73,6 +73,8 @@ CoreSession::CoreSession(UserId uid, bool restoreState, QObject *parent) : QObje
   QHash<BufferId, QDateTime> 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 &)));
   QHash<BufferId, QDateTime> 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
   p->synchronize(_bufferSyncer);
 
   // Restore session state
@@ -473,3 +475,28 @@ void CoreSession::destroyNetwork(NetworkId id) {
     net->deleteLater();
   }
 }
     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);
+}
index 640ea99..545bf9c 100644 (file)
@@ -101,6 +101,12 @@ public slots:
    */
   void removeNetwork(NetworkId network);
 
    */
   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();
 
 signals:
   void initialized();
 
@@ -131,6 +137,7 @@ signals:
 
   void networkCreated(NetworkId);
   void networkRemoved(NetworkId);
 
   void networkCreated(NetworkId);
   void networkRemoved(NetworkId);
+  void bufferRemoved(BufferId);
 
 private slots:
   void recvStatusMsgFromServer(QString msg);
 
 private slots:
   void recvStatusMsgFromServer(QString msg);
index 69be2c9..3474dd7 100644 (file)
@@ -55,6 +55,7 @@
     <file>./SQL/SQLite/7/insert_sender.sql</file>
     <file>./SQL/SQLite/7/insert_server.sql</file>
     <file>./SQL/SQLite/7/select_authuser.sql</file>
     <file>./SQL/SQLite/7/insert_sender.sql</file>
     <file>./SQL/SQLite/7/insert_server.sql</file>
     <file>./SQL/SQLite/7/select_authuser.sql</file>
+    <file>./SQL/SQLite/7/select_buffer_by_id.sql</file>
     <file>./SQL/SQLite/7/select_buffer_lastseen_dates.sql</file>
     <file>./SQL/SQLite/7/select_bufferByName.sql</file>
     <file>./SQL/SQLite/7/select_bufferExists.sql</file>
     <file>./SQL/SQLite/7/select_buffer_lastseen_dates.sql</file>
     <file>./SQL/SQLite/7/select_bufferByName.sql</file>
     <file>./SQL/SQLite/7/select_bufferExists.sql</file>
index 0e3ea63..ed705a8 100644 (file)
@@ -405,6 +405,24 @@ BufferInfo SqliteStorage::getBufferInfo(UserId user, const NetworkId &networkId,
   return bufferInfo;
 }
 
   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<BufferInfo> SqliteStorage::requestBuffers(UserId user, QDateTime since) {
   uint time = 0;
   if(since.isValid())
 QList<BufferInfo> SqliteStorage::requestBuffers(UserId user, QDateTime since) {
   uint time = 0;
   if(since.isValid())
index c553bdc..71fe392 100644 (file)
@@ -59,6 +59,7 @@ public slots:
   
   /* Buffer handling */
   virtual BufferInfo getBufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer = "");
   
   /* 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<BufferInfo> 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);
   virtual QList<BufferInfo> 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);
index 8b264f4..3915d09 100644 (file)
@@ -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)
      *  \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;
 
      */
     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
     //! 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