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;
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();
+ }
+}
void setCoreConfiguration(const QVariantMap &settings);
+ void bufferRemoved(BufferId bufferId);
+
private slots:
//void coreSocketError(QAbstractSocket::SocketError);
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());
public slots:
void bufferUpdated(BufferInfo bufferInfo);
+ void removeBuffer(BufferId bufferId);
void setBufferActivity(const BufferInfo &buffer, Buffer::ActivityLevel activity);
void networkRemoved(const NetworkId &networkId);
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; }
if(setLastSeen(buffer, time)) emit setLastSeenRequested(buffer, time);
}
+
+void BufferSyncer::requestRemoveBuffer(BufferId buffer) {
+ emit removeBufferRequested(buffer);
+}
+
+void BufferSyncer::removeBuffer(BufferId buffer) {
+ emit bufferRemoved(buffer);
+}
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);
--- /dev/null
+SELECT bufferid, networkid, buffertype, groupid, buffername
+FROM buffer
+WHERE bufferid = :bufferid
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);
*/
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.
*
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
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);
+}
*/
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();
void networkCreated(NetworkId);
void networkRemoved(NetworkId);
+ void bufferRemoved(BufferId);
private slots:
void recvStatusMsgFromServer(QString msg);
<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>
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())
/* 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);
* \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