}
-BufferSyncer::BufferSyncer(const QHash<BufferId, MsgId> &lastSeenMsg, const QHash<BufferId, MsgId> &markerLines, QObject *parent)
+BufferSyncer::BufferSyncer(const QHash<BufferId, MsgId> &lastSeenMsg, const QHash<BufferId, MsgId> &markerLines, const QHash<BufferId, Message::Types> &activities, QObject *parent)
: SyncableObject(parent),
_lastSeenMsg(lastSeenMsg),
- _markerLines(markerLines)
+ _markerLines(markerLines),
+ _bufferActivities(activities)
{
}
}
+QVariantList BufferSyncer::initActivities() const
+{
+ QVariantList list;
+ QHash<BufferId, Message::Types>::const_iterator iter = _bufferActivities.constBegin();
+ while (iter != _bufferActivities.constEnd()) {
+ list << QVariant::fromValue<BufferId>(iter.key())
+ << QVariant::fromValue<int>((int) iter.value());
+ ++iter;
+ }
+ return list;
+}
+
+
+void BufferSyncer::initSetActivities(const QVariantList &list)
+{
+ _bufferActivities.clear();
+ Q_ASSERT(list.count() % 2 == 0);
+ for (int i = 0; i < list.count(); i += 2) {
+ setBufferActivity(list.at(i).value<BufferId>(), list.at(i+1).value<int>());
+ }
+}
+
+
+Message::Types BufferSyncer::activity(BufferId buffer) const
+{
+ return _bufferActivities.value(buffer, Message::Types());
+}
+
+
void BufferSyncer::removeBuffer(BufferId buffer)
{
if (_lastSeenMsg.contains(buffer))
#include "syncableobject.h"
#include "types.h"
+#include "message.h"
class BufferSyncer : public SyncableObject
{
public:
explicit BufferSyncer(QObject *parent);
- explicit BufferSyncer(const QHash<BufferId, MsgId> &lastSeenMsg, const QHash<BufferId, MsgId> &markerLines, QObject *parent);
+ explicit BufferSyncer(const QHash<BufferId, MsgId> &lastSeenMsg, const QHash<BufferId, MsgId> &markerLines, const QHash<BufferId, Message::Types> &activities, QObject *parent);
inline virtual const QMetaObject *syncMetaObject() const { return &staticMetaObject; }
MsgId lastSeenMsg(BufferId buffer) const;
MsgId markerLine(BufferId buffer) const;
+ Message::Types activity(BufferId buffer) const;
public slots:
QVariantList initLastSeenMsg() const;
QVariantList initMarkerLines() const;
void initSetMarkerLines(const QVariantList &);
+ QVariantList initActivities() const;
+ void initSetActivities(const QVariantList &);
+
virtual inline void requestSetLastSeenMsg(BufferId buffer, const MsgId &msgId) { REQUEST(ARG(buffer), ARG(msgId)) }
virtual inline void requestSetMarkerLine(BufferId buffer, const MsgId &msgId) { REQUEST(ARG(buffer), ARG(msgId)) setMarkerLine(buffer, msgId); }
+ virtual inline void setBufferActivity(BufferId buffer, const int &activity) {
+ SYNC(ARG(buffer), ARG(activity));
+ _bufferActivities[buffer] = Message::Types(activity);
+ }
+
virtual inline void requestRemoveBuffer(BufferId buffer) { REQUEST(ARG(buffer)) }
virtual void removeBuffer(BufferId buffer);
private:
QHash<BufferId, MsgId> _lastSeenMsg;
QHash<BufferId, MsgId> _markerLines;
+ QHash<BufferId, Message::Types> _bufferActivities;
};
--- /dev/null
+SELECT bufferid, bufferactivity
+FROM buffer
+WHERE userid = :userid
\ No newline at end of file
--- /dev/null
+UPDATE buffer
+SET bufferactivity = :bufferactivity
+WHERE userid = :userid AND bufferid = :bufferid
\ No newline at end of file
INIT_SYNCABLE_OBJECT(CoreBufferSyncer)
CoreBufferSyncer::CoreBufferSyncer(CoreSession *parent)
- : BufferSyncer(Core::bufferLastSeenMsgIds(parent->user()), Core::bufferMarkerLineMsgIds(parent->user()), parent),
+ : BufferSyncer(Core::bufferLastSeenMsgIds(parent->user()), Core::bufferMarkerLineMsgIds(parent->user()), Core::bufferActivities(parent->user()), parent),
_coreSession(parent),
_purgeBuffers(false)
{
+ connect(parent, SIGNAL(displayMsg(Message)), SLOT(addBufferActivity(Message)));
}
void CoreBufferSyncer::requestSetLastSeenMsg(BufferId buffer, const MsgId &msgId)
{
- if (setLastSeenMsg(buffer, msgId))
+ if (setLastSeenMsg(buffer, msgId)) {
+ setBufferActivity(buffer, (int) Core::bufferActivity(buffer, msgId));
dirtyLastSeenBuffers << buffer;
+ }
}
Core::setBufferMarkerLineMsg(userId, bufferId, msgId);
}
+ foreach(BufferId bufferId, dirtyActivities) {
+ Core::setBufferActivity(userId, bufferId, activity(bufferId));
+ }
+
dirtyLastSeenBuffers.clear();
dirtyMarkerLineBuffers.clear();
+ dirtyActivities.clear();
}
}
}
}
+
+void CoreBufferSyncer::setBufferActivity(BufferId buffer, const int &activity) {
+ BufferSyncer::setBufferActivity(buffer, activity);
+ dirtyActivities << buffer;
+}
virtual inline void requestRemoveBuffer(BufferId buffer) { removeBuffer(buffer); }
virtual void removeBuffer(BufferId bufferId);
+ void addBufferActivity(Message message) {
+ auto oldActivity = activity(message.bufferId());
+ if (!oldActivity.testFlag(message.type())) {
+ setBufferActivity(message.bufferId(), (int) (oldActivity | message.type()));
+ }
+ }
+
+ void setBufferActivity(BufferId buffer, const int &activity) override;
+
virtual inline void requestRenameBuffer(BufferId buffer, QString newName) { renameBuffer(buffer, newName); }
virtual void renameBuffer(BufferId buffer, QString newName);
virtual void requestPurgeBufferIds();
- virtual inline void requestMarkBufferAsRead(BufferId buffer) { markBufferAsRead(buffer); }
+ virtual inline void requestMarkBufferAsRead(BufferId buffer) {
+ setLastSeenMsg(buffer, (int) Message::Types());
+ markBufferAsRead(buffer);
+ }
void storeDirtyIds();
QSet<BufferId> dirtyLastSeenBuffers;
QSet<BufferId> dirtyMarkerLineBuffers;
+ QSet<BufferId> dirtyActivities;
void purgeBufferIds();
};
return bufferActivityHash;
}
-Message::Types PostgreSqlStorage::bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId)
+Message::Types PostgreSqlStorage::bufferActivity(BufferId &bufferId, const MsgId &lastSeenMsgId)
{
QSqlQuery query(logDb());
query.prepare(queryString("select_buffer_bufferactivity"));
virtual QHash<BufferId, MsgId> bufferMarkerLineMsgIds(UserId user);
virtual void setBufferActivity(UserId id, const BufferId &bufferId, const Message::Types &type);
virtual QHash<BufferId, Message::Types> bufferActivities(UserId id);
- virtual Message::Types bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId);
+ virtual Message::Types bufferActivity(BufferId &bufferId, const MsgId &lastSeenMsgId);
/* Message handling */
virtual bool logMessage(Message &msg);
<file>./SQL/SQLite/select_authuser.sql</file>
<file>./SQL/SQLite/select_bufferByName.sql</file>
<file>./SQL/SQLite/select_bufferExists.sql</file>
+ <file>./SQL/SQLite/select_buffer_bufferactivities.sql</file>
<file>./SQL/SQLite/select_buffer_bufferactivity.sql</file>
<file>./SQL/SQLite/select_buffer_by_id.sql</file>
<file>./SQL/SQLite/select_buffer_lastseen_messages.sql</file>
<file>./SQL/SQLite/setup_130_identity.sql</file>
<file>./SQL/SQLite/setup_140_identity_nick.sql</file>
<file>./SQL/SQLite/update_backlog_bufferid.sql</file>
+ <file>./SQL/SQLite/update_buffer_bufferactivity.sql</file>
<file>./SQL/SQLite/update_buffer_lastseen.sql</file>
<file>./SQL/SQLite/update_buffer_markerlinemsgid.sql</file>
<file>./SQL/SQLite/update_buffer_name.sql</file>
}
-Message::Types SqliteStorage::bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId)
+Message::Types SqliteStorage::bufferActivity(BufferId &bufferId, const MsgId &lastSeenMsgId)
{
QSqlDatabase db = logDb();
db.transaction();
virtual QHash<BufferId, MsgId> bufferMarkerLineMsgIds(UserId user);
virtual void setBufferActivity(UserId id, const BufferId &bufferId, const Message::Types &type);
virtual QHash<BufferId, Message::Types> bufferActivities(UserId id);
- virtual Message::Types bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId);
+ virtual Message::Types bufferActivity(BufferId &bufferId, const MsgId &lastSeenMsgId);
/* Message handling */
virtual bool logMessage(Message &msg);
* \param bufferId The buffer
* \param lastSeenMsgId The last seen message
*/
- virtual Message::Types bufferActivity(BufferId &bufferId, MsgId &lastSeenMsgId) = 0;
+ virtual Message::Types bufferActivity(BufferId &bufferId, const MsgId &lastSeenMsgId) = 0;
/* Message handling */