You have to be in a channel with the query partner though (this is an IRC limitation).
Closing BR #92
_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)));
+ connect(bufferSyncer(), SIGNAL(bufferRenamed(BufferId, QString)), this, SLOT(bufferRenamed(BufferId, QString)));
signalProxy()->synchronize(bufferSyncer());
_syncedToCore = true;
buff->deleteLater();
}
}
+
+void Client::bufferRenamed(BufferId bufferId, const QString &newName) {
+ QModelIndex bufferIndex = networkModel()->bufferIndex(bufferId);
+ if(bufferIndex.isValid()) {
+ networkModel()->setData(bufferIndex, newName, Qt::DisplayRole);
+ }
+}
void setCoreConfiguration(const QVariantMap &settings);
void bufferRemoved(BufferId bufferId);
+ void bufferRenamed(BufferId bufferId, const QString &newName);
private slots:
//void coreSocketError(QAbstractSocket::SocketError);
BufferItem::BufferItem(BufferInfo bufferInfo, AbstractTreeItem *parent)
: PropertyMapItem(QStringList() << "bufferName" << "topic" << "nickCount", parent),
_bufferInfo(bufferInfo),
+ _bufferName(bufferInfo.bufferName()),
_activity(Buffer::NoActivity)
{
Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled;
if(bufferType() == BufferInfo::StatusBuffer)
return tr("Status Buffer");
else
- return bufferInfo().bufferName();
+ return _bufferName;
+}
+
+void BufferItem::setBufferName(const QString &name) {
+ _bufferName = name;
+ // as long as we need those bufferInfos, we have to update that one aswell.
+ // pretty ugly though :/
+ _bufferInfo = BufferInfo(_bufferInfo.bufferId(), _bufferInfo.networkId(), _bufferInfo.type(), _bufferInfo.groupId(), _bufferInfo.bufferName());
+ emit dataChanged(0);
}
QString BufferItem::topic() const {
*****************************************/
class BufferItem : public PropertyMapItem {
Q_OBJECT
- Q_PROPERTY(QString bufferName READ bufferName)
+ Q_PROPERTY(QString bufferName READ bufferName WRITE setBufferName)
Q_PROPERTY(QString topic READ topic)
Q_PROPERTY(int nickCount READ nickCount)
void attachIrcChannel(IrcChannel *ircChannel);
QString bufferName() const;
+ void setBufferName(const QString &name);
QString topic() const;
int nickCount() const;
private:
BufferInfo _bufferInfo;
+ QString _bufferName;
Buffer::ActivityLevel _activity;
QPointer<IrcChannel> _ircChannel;
_lastSeen.remove(buffer);
emit bufferRemoved(buffer);
}
+
+void BufferSyncer::renameBuffer(BufferId buffer, QString newName) {
+ emit bufferRenamed(buffer, newName);
+}
void requestSetLastSeen(BufferId buffer, const QDateTime &time);
void requestRemoveBuffer(BufferId buffer);
void removeBuffer(BufferId buffer);
+ void renameBuffer(BufferId buffer, QString newName);
signals:
void lastSeenSet(BufferId buffer, const QDateTime &time);
void setLastSeenRequested(BufferId buffer, const QDateTime &time);
void removeBufferRequested(BufferId buffer);
void bufferRemoved(BufferId buffer);
+ void bufferRenamed(BufferId buffer, QString newName);
private slots:
bool setLastSeen(BufferId buffer, const QDateTime &time);
--- /dev/null
+UPDATE buffer
+SET buffername = :buffername, buffercname = :buffercname
+WHERE bufferid = :bufferid
return instance()->storage->removeBuffer(user, bufferId);
}
+BufferId Core::renameBuffer(const UserId &user, const NetworkId &networkId, const QString &newName, const QString &oldName) {
+ QMutexLocker locker(&mutex);
+ return instance()->storage->renameBuffer(user, networkId, newName, oldName);
+}
+
void Core::setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate) {
QMutexLocker locker(&mutex);
return instance()->storage->setBufferLastSeen(user, bufferId, seenDate);
*/
static bool removeBuffer(const UserId &user, const BufferId &bufferId);
+ //! Rename a Buffer
+ /** \note This method is threadsafe.
+ * \param user The id of the buffer owner
+ * \param networkId The id of the network the buffer belongs to
+ * \param newName The new name of the buffer
+ * \param oldName The previous name of the buffer
+ * \return the BufferId of the affected buffer or an invalid BufferId if not successfull
+ */
+ static BufferId renameBuffer(const UserId &user, const NetworkId &networkId, const QString &newName, const QString &oldName);
+
//! Update the LastSeenDate for a Buffer
/** This Method is used to make the LastSeenDate of a Buffer persistent
* \note This method is threadsafe.
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)));
+ connect(this, SIGNAL(bufferRenamed(BufferId, QString)), _bufferSyncer, SLOT(renameBuffer(BufferId, QString)));
p->synchronize(_bufferSyncer);
// Restore session state
this, SLOT(recvMessageFromServer(Message::Type, BufferInfo::Type, QString, QString, QString, quint8)));
connect(conn, SIGNAL(displayStatusMsg(QString)), this, SLOT(recvStatusMsgFromServer(QString)));
+ connect(conn, SIGNAL(nickChanged(const NetworkId &, const QString &, const QString &)),
+ this, SLOT(renameBuffer(const NetworkId &, const QString &, const QString &)));
}
void CoreSession::disconnectFromNetwork(NetworkId id) {
if(Core::removeBuffer(user(), bufferId))
emit bufferRemoved(bufferId);
}
+
+void CoreSession::renameBuffer(const NetworkId &networkId, const QString &newName, const QString &oldName) {
+ BufferId bufferId = Core::renameBuffer(user(), networkId, newName, oldName);
+ if(bufferId.isValid()) {
+ emit bufferRenamed(bufferId, newName);
+ }
+}
* emits bufferRemoved(bufferId) on success.
*/
void removeBufferRequested(BufferId bufferId);
-
+
+ //! Rename a Buffer for a given network
+ /* \param networkId The id of the network the buffer belongs to
+ * \param newName The new name of the buffer
+ * \param oldName The old name of the buffer
+ * emits bufferRenamed(bufferId, newName) on success.
+ */
+ void renameBuffer(const NetworkId &networkId, const QString &newName, const QString &oldName);
+
signals:
void initialized();
void networkCreated(NetworkId);
void networkRemoved(NetworkId);
void bufferRemoved(BufferId);
+ void bufferRenamed(BufferId, QString);
private slots:
void recvStatusMsgFromServer(QString msg);
? newnick
: prefix;
+
+ emit nickChanged(newnick, oldnick);
foreach(QString channel, ircuser->channels())
emit displayMsg(Message::Nick, BufferInfo::ChannelBuffer, channel, newnick, sender);
void defaultHandler(QString cmd, const QString &prefix, const QList<QByteArray> ¶ms);
+signals:
+ void nickChanged(const QString &newNick, const QString &oldNick); // this signal is inteded to rename query buffers in the storage backend
+
private:
void tryNextNick(const QString &errnick);
bool _whois;
connect(&socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(socketStateChanged(QAbstractSocket::SocketState)));
connect(&socket, SIGNAL(readyRead()), this, SLOT(socketHasData()));
+ connect(_ircServerHandler, SIGNAL(nickChanged(const QString &, const QString &)),
+ this, SLOT(nickChanged(const QString &, const QString &)));
}
NetworkConnection::~NetworkConnection() {
putRawLine(msg);
}
+void NetworkConnection::nickChanged(const QString &newNick, const QString &oldNick) {
+ emit nickChanged(_network->networkId(), newNick, oldNick);
+}
+
/* Exception classes for message handling */
NetworkConnection::ParseError::ParseError(QString cmd, QString prefix, QStringList params) {
Q_UNUSED(prefix);
Q_UNUSED(prefix);
_msg = QString("Unknown Command: ") + cmd + params.join(" ");
}
+
void sendPerform();
void autoReconnectSettingsChanged();
void doAutoReconnect();
+ void nickChanged(const QString &newNick, const QString &oldNick); // this signal is inteded to rename query buffers in the storage backend
signals:
// #void networkState(QString net, QVariantMap data);
void quitRequested(NetworkId networkId);
//void queryRequested(QString network, QString nick);
-
+ void nickChanged(const NetworkId &networkId, const QString &newNick, const QString &oldNick); // this signal is inteded to rename query buffers in the storage backend
private slots:
void socketHasData();
<file>./SQL/SQLite/7/setup_080_ircservers.sql</file>
<file>./SQL/SQLite/7/setup_999_version.sql</file>
<file>./SQL/SQLite/7/update_buffer_lastseen.sql</file>
+ <file>./SQL/SQLite/7/update_buffer_name.sql</file>
<file>./SQL/SQLite/7/update_network.sql</file>
<file>./SQL/SQLite/7/update_username.sql</file>
<file>./SQL/SQLite/7/update_userpassword.sql</file>
return true;
}
+BufferId SqliteStorage::renameBuffer(const UserId &user, const NetworkId &networkId, const QString &newName, const QString &oldName) {
+ // check if such a buffer exists...
+ QSqlQuery existsQuery(logDb());
+ existsQuery.prepare(queryString("select_bufferByName"));
+ existsQuery.bindValue(":networkid", networkId.toInt());
+ existsQuery.bindValue(":userid", user.toInt());
+ existsQuery.bindValue(":buffercname", oldName.toLower());
+ existsQuery.exec();
+ if(!watchQuery(&existsQuery))
+ return false;
+
+ if(!existsQuery.first())
+ return false;
+
+ const int bufferid = existsQuery.value(0).toInt();
+
+ Q_ASSERT(!existsQuery.next());
+
+ // ... and if the new name is still free.
+ existsQuery.bindValue(":networkid", networkId.toInt());
+ existsQuery.bindValue(":userid", user.toInt());
+ existsQuery.bindValue(":buffercname", newName.toLower());
+ existsQuery.exec();
+ if(!watchQuery(&existsQuery))
+ return false;
+
+ if(existsQuery.first())
+ return false;
+
+ QSqlQuery renameBufferQuery(logDb());
+ renameBufferQuery.prepare(queryString("update_buffer_name"));
+ renameBufferQuery.bindValue(":buffername", newName);
+ renameBufferQuery.bindValue(":buffercname", newName.toLower());
+ renameBufferQuery.bindValue(":bufferid", bufferid);
+ renameBufferQuery.exec();
+ if(watchQuery(&existsQuery))
+ return BufferId(bufferid);
+ else
+ return BufferId();
+}
+
void SqliteStorage::setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate) {
QSqlQuery *query = cachedQuery("update_buffer_lastseen");
query->bindValue(":userid", user.toInt());
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 BufferId renameBuffer(const UserId &user, const NetworkId &networkId, const QString &newName, const QString &oldName);
virtual void setBufferLastSeen(UserId user, const BufferId &bufferId, const QDateTime &seenDate);
virtual QHash<BufferId, QDateTime> bufferLastSeenDates(UserId user);
* \return true if successfull
*/
virtual bool removeBuffer(const UserId &user, const BufferId &bufferId) = 0;
+
+ //! Rename a Buffer
+ /** \param user The id of the buffer owner
+ * \param networkId The id of the network the buffer belongs to
+ * \param newName The new name of the buffer
+ * \param oldName The previous name of the buffer
+ * \return the BufferId of the affected buffer or an invalid BufferId if not successfull
+ */
+ virtual BufferId renameBuffer(const UserId &user, const NetworkId &networkId, const QString &newName, const QString &oldName) = 0;
//! Update the LastSeenDate for a Buffer
/** This Method is used to make the LastSeenDate of a Buffer persistent
signals:
//! Sent when a new BufferInfo is created, or an existing one changed somehow.
void bufferInfoUpdated(UserId user, const BufferInfo &);
+ //! Sent when a Buffer was renamed
+ void bufferRenamed(const QString &newName, const QString &oldName);
//! Sent when a new user has been added
void userAdded(UserId, const QString &username);
//! Sent when a user has been renamed
quasselVersion = "0.2.0-pre";
quasselDate = "2008-02-19";
- quasselBuild = 555;
+ quasselBuild = 557;
//! Minimum client build number the core needs
clientBuildNeeded = 526;