summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2023-02-09 18:21:23 +0300
committerGeorge Hazan <ghazan@miranda.im>2023-02-09 18:22:12 +0300
commit5ef0585dbd3bfbc09093bc8f24f41e4ae2349c59 (patch)
treeb76db3dc8173189591d65cc9a1a4e181331ca8f8 /plugins
parent6ef65121fed3c38c467238a08bf96bf98a23d7d8 (diff)
SRMM: better support for group chats in database
Diffstat (limited to 'plugins')
-rw-r--r--plugins/Dbx_sqlite/src/dbevents.cpp22
-rw-r--r--plugins/Dbx_sqlite/src/dbintf.cpp5
-rw-r--r--plugins/Dbx_sqlite/src/dbsettings.cpp12
-rw-r--r--plugins/Scriver/src/msgdialog.cpp12
-rw-r--r--plugins/Scriver/src/msgs.cpp1
-rw-r--r--plugins/Scriver/src/msgs.h4
-rw-r--r--plugins/Scriver/src/msgutils.cpp2
-rw-r--r--plugins/TabSRMM/src/generic_msghandlers.cpp2
-rw-r--r--plugins/TabSRMM/src/mim.cpp2
-rw-r--r--plugins/TabSRMM/src/msgdialog.cpp10
-rw-r--r--plugins/TabSRMM/src/msgdlgother.cpp3
-rw-r--r--plugins/TabSRMM/src/msgs.h3
12 files changed, 45 insertions, 33 deletions
diff --git a/plugins/Dbx_sqlite/src/dbevents.cpp b/plugins/Dbx_sqlite/src/dbevents.cpp
index 605090c2eb..0dadafa834 100644
--- a/plugins/Dbx_sqlite/src/dbevents.cpp
+++ b/plugins/Dbx_sqlite/src/dbevents.cpp
@@ -104,7 +104,9 @@ MEVENT CDbxSQLite::AddEvent(MCONTACT hContact, const DBEVENTINFO *dbei)
}
mir_cslockfull lock(m_csDbAccess);
- sqlite3_stmt *stmt = InitQuery("INSERT INTO events(contact_id, module, timestamp, type, flags, data, server_id, is_read) VALUES (?, ?, ?, ?, ?, ?, ?, ?);", qEvAdd);
+ sqlite3_stmt *stmt = InitQuery(
+ "INSERT INTO events(contact_id, module, timestamp, type, flags, data, server_id, user_id, is_read) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);", qEvAdd);
sqlite3_bind_int64(stmt, 1, hContact);
sqlite3_bind_text(stmt, 2, tmp.szModule, (int)mir_strlen(tmp.szModule), nullptr);
sqlite3_bind_int64(stmt, 3, tmp.timestamp);
@@ -112,7 +114,8 @@ MEVENT CDbxSQLite::AddEvent(MCONTACT hContact, const DBEVENTINFO *dbei)
sqlite3_bind_int64(stmt, 5, tmp.flags);
sqlite3_bind_blob(stmt, 6, tmp.pBlob, tmp.cbBlob, nullptr);
sqlite3_bind_text(stmt, 7, szEventId, (int)mir_strlen(szEventId), nullptr);
- sqlite3_bind_int(stmt, 8, tmp.markedRead());
+ sqlite3_bind_text(stmt, 8, tmp.szUserId, (int)mir_strlen(tmp.szUserId), nullptr);
+ sqlite3_bind_int(stmt, 9, tmp.markedRead());
int rc = sqlite3_step(stmt);
logError(rc, __FILE__, __LINE__);
sqlite3_reset(stmt);
@@ -287,7 +290,7 @@ int CDbxSQLite::GetBlobSize(MEVENT hDbEvent)
return res;
}
-static char g_szId[100];
+static char g_szId[100], g_szUserId[100];
BOOL CDbxSQLite::GetEvent(MEVENT hDbEvent, DBEVENTINFO *dbei)
{
@@ -303,7 +306,7 @@ BOOL CDbxSQLite::GetEvent(MEVENT hDbEvent, DBEVENTINFO *dbei)
}
mir_cslock lock(m_csDbAccess);
- sqlite3_stmt *stmt = InitQuery("SELECT module, timestamp, type, flags, server_id, length(data), data FROM events WHERE id = ? LIMIT 1;", qEvGet);
+ sqlite3_stmt *stmt = InitQuery("SELECT module, timestamp, type, flags, server_id, user_id, length(data), data FROM events WHERE id = ? LIMIT 1;", qEvGet);
sqlite3_bind_int64(stmt, 1, hDbEvent);
int rc = sqlite3_step(stmt);
logError(rc, __FILE__, __LINE__);
@@ -328,7 +331,14 @@ BOOL CDbxSQLite::GetEvent(MEVENT hDbEvent, DBEVENTINFO *dbei)
}
else dbei->szId = nullptr;
- int32_t cbBlob = sqlite3_column_int64(stmt, 5);
+ char *pszUserId = (char *)sqlite3_column_text(stmt, 5);
+ if (mir_strlen(pszUserId)) {
+ mir_strncpy(g_szUserId, pszUserId, sizeof(g_szUserId));
+ dbei->szUserId = g_szUserId;
+ }
+ else dbei->szUserId = nullptr;
+
+ int32_t cbBlob = sqlite3_column_int64(stmt, 6);
size_t bytesToCopy = cbBlob;
if (dbei->cbBlob == -1)
dbei->pBlob = (uint8_t*)mir_calloc(cbBlob + 2);
@@ -337,7 +347,7 @@ BOOL CDbxSQLite::GetEvent(MEVENT hDbEvent, DBEVENTINFO *dbei)
dbei->cbBlob = cbBlob;
if (bytesToCopy && dbei->pBlob) {
- uint8_t *data = (uint8_t *)sqlite3_column_blob(stmt, 6);
+ uint8_t *data = (uint8_t *)sqlite3_column_blob(stmt, 7);
if (dbei->flags & DBEF_ENCRYPTED) {
dbei->flags &= ~DBEF_ENCRYPTED;
diff --git a/plugins/Dbx_sqlite/src/dbintf.cpp b/plugins/Dbx_sqlite/src/dbintf.cpp
index 035a651ccf..95855925f5 100644
--- a/plugins/Dbx_sqlite/src/dbintf.cpp
+++ b/plugins/Dbx_sqlite/src/dbintf.cpp
@@ -46,7 +46,7 @@ int CDbxSQLite::Create()
logError(rc, __FILE__, __LINE__);
rc = sqlite3_exec(m_db, "CREATE TABLE events (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, contact_id INTEGER NOT NULL, module TEXT NOT NULL,"
- "timestamp INTEGER NOT NULL, type INTEGER NOT NULL, flags INTEGER NOT NULL, data BLOB, server_id TEXT, is_read INTEGER NOT NULL DEFAULT 0);", nullptr, nullptr, nullptr);
+ "timestamp INTEGER NOT NULL, type INTEGER NOT NULL, flags INTEGER NOT NULL, data BLOB, server_id TEXT NULL, user_id TEXT NULL, is_read INTEGER NOT NULL DEFAULT 0);", nullptr, nullptr, nullptr);
logError(rc, __FILE__, __LINE__);
rc = sqlite3_exec(m_db, "CREATE INDEX idx_events_contactid_timestamp ON events(contact_id, timestamp);", nullptr, nullptr, nullptr);
@@ -67,6 +67,9 @@ int CDbxSQLite::Create()
rc = sqlite3_exec(m_db, "CREATE INDEX idx_settings_module ON settings(module);", nullptr, nullptr, nullptr);
logError(rc, __FILE__, __LINE__);
+
+ DBVARIANT dbv = { DBVT_BYTE, 2 };
+ WriteContactSetting(0, "Compatibility", "Sqlite", &dbv);
return 0;
}
diff --git a/plugins/Dbx_sqlite/src/dbsettings.cpp b/plugins/Dbx_sqlite/src/dbsettings.cpp
index c4bd196cb4..249a8bc059 100644
--- a/plugins/Dbx_sqlite/src/dbsettings.cpp
+++ b/plugins/Dbx_sqlite/src/dbsettings.cpp
@@ -59,7 +59,7 @@ void CDbxSQLite::InitSettings()
FillContactSettings();
- DBVARIANT dbv; dbv.type = DBVT_BYTE;
+ DBVARIANT dbv = { DBVT_BYTE };
if (GetContactSetting(0, "Compatibility", "Sqlite", &dbv))
dbv.bVal = 0;
@@ -73,8 +73,14 @@ void CDbxSQLite::InitSettings()
rc = sqlite3_exec(m_db, "UPDATE events SET is_read=1 WHERE (flags & 6) <> 0;", nullptr, nullptr, nullptr);
logError(rc, __FILE__, __LINE__);
- dbv.type = DBVT_BYTE;
- dbv.dVal = 1;
+ dbv.bVal = 1;
+ }
+
+ if (dbv.bVal < 2) {
+ int rc = sqlite3_exec(m_db, "ALTER TABLE events ADD COLUMN user_id TEXT NULL;", 0, 0, 0);
+ logError(rc, __FILE__, __LINE__);
+
+ dbv.bVal = 2;
WriteContactSetting(0, "Compatibility", "Sqlite", &dbv);
}
}
diff --git a/plugins/Scriver/src/msgdialog.cpp b/plugins/Scriver/src/msgdialog.cpp
index 3618b9a1aa..8f7a405723 100644
--- a/plugins/Scriver/src/msgdialog.cpp
+++ b/plugins/Scriver/src/msgdialog.cpp
@@ -236,20 +236,16 @@ bool CMsgDialog::OnInitDialog()
UpdateStatusBar();
UpdateTitle();
UpdateNickList();
+ UpdateChatLog();
m_pParent->AddChild(this);
PopupWindow(false);
-
- if (m_si->pMI->bDatabase) {
- FindFirstEvent();
- SendMessage(m_hwnd, DM_REMAKELOG, 0, 0);
- }
}
else {
m_nickList.Hide();
m_splitterX.Hide();
- bool notifyUnread = FindFirstEvent();
+ bool notifyUnread = GetFirstEvent();
m_pParent->AddChild(this);
@@ -1170,7 +1166,7 @@ INT_PTR CMsgDialog::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam)
break;
case HM_DBEVENTADDED:
- if (wParam == m_hContact) {
+ if (wParam == m_hContact && !isChat()) {
MEVENT hDbEvent = lParam;
DBEVENTINFO dbei = {};
db_event_get(hDbEvent, &dbei);
@@ -1194,7 +1190,7 @@ INT_PTR CMsgDialog::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam)
PopupWindow(true);
}
- if (isChat() || (hDbEvent != m_hDbEventFirst && db_event_next(m_hContact, hDbEvent) == 0))
+ if (hDbEvent != m_hDbEventFirst && db_event_next(m_hContact, hDbEvent) == 0)
m_pLog->LogEvents(hDbEvent, 1, 1);
else
SendMessage(m_hwnd, DM_REMAKELOG, 0, 0);
diff --git a/plugins/Scriver/src/msgs.cpp b/plugins/Scriver/src/msgs.cpp
index ffb08f4e3c..01ffec8586 100644
--- a/plugins/Scriver/src/msgs.cpp
+++ b/plugins/Scriver/src/msgs.cpp
@@ -109,6 +109,7 @@ static int MessageEventAdded(WPARAM hContact, LPARAM lParam)
return 0;
}
}
+
if (hwnd == nullptr || !IsWindowVisible(GetParent(hwnd))) {
wchar_t toolTip[256];
mir_snwprintf(toolTip, TranslateT("Message from %s"), Clist_GetContactDisplayName(hContact));
diff --git a/plugins/Scriver/src/msgs.h b/plugins/Scriver/src/msgs.h
index 0a2d30257e..7b92e8ce24 100644
--- a/plugins/Scriver/src/msgs.h
+++ b/plugins/Scriver/src/msgs.h
@@ -88,7 +88,6 @@ class CMsgDialog : public CSrmmBaseDialog
friend INT_PTR CALLBACK InfobarWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
void ClearLog(void);
- bool FindFirstEvent(void);
HICON GetTabIcon(void);
void GetTitlebarIcon(struct TitleBarData *tbd);
void Init(void);
@@ -110,7 +109,7 @@ class CMsgDialog : public CSrmmBaseDialog
bool m_bIncoming, m_bWindowCascaded;
- MEVENT m_hDbEventFirst, m_hDbEventLast, m_hDbUnreadEventFirst;
+ MEVENT m_hDbUnreadEventFirst;
int m_minLogBoxHeight, m_minEditBoxHeight;
int m_iShowUnread;
uint16_t m_wStatus;
@@ -173,6 +172,7 @@ public:
void onType(CTimer *);
void CloseTab() override;
+ bool GetFirstEvent() override;
void LoadSettings() override;
void SetStatusText(const wchar_t *, HICON) override;
void ShowFilterMenu() override;
diff --git a/plugins/Scriver/src/msgutils.cpp b/plugins/Scriver/src/msgutils.cpp
index 68eaf56b40..01210cdcbd 100644
--- a/plugins/Scriver/src/msgutils.cpp
+++ b/plugins/Scriver/src/msgutils.cpp
@@ -36,7 +36,7 @@ void CMsgDialog::CloseTab()
Close();
}
-bool CMsgDialog::FindFirstEvent()
+bool CMsgDialog::GetFirstEvent()
{
bool notifyUnread = false;
diff --git a/plugins/TabSRMM/src/generic_msghandlers.cpp b/plugins/TabSRMM/src/generic_msghandlers.cpp
index f704717da6..ad5df5726d 100644
--- a/plugins/TabSRMM/src/generic_msghandlers.cpp
+++ b/plugins/TabSRMM/src/generic_msghandlers.cpp
@@ -1081,7 +1081,7 @@ void CMsgDialog::DM_EventAdded(WPARAM, LPARAM lParam)
}
m_cache->updateStats(TSessionStats::UPDATE_WITH_LAST_RCV, 0);
- if (hDbEvent != m_hDbEventFirst || isChat())
+ if (hDbEvent != m_hDbEventFirst)
StreamEvents(hDbEvent, 1, 1);
else
RemakeLog();
diff --git a/plugins/TabSRMM/src/mim.cpp b/plugins/TabSRMM/src/mim.cpp
index ca1e9c3272..9b776b88ab 100644
--- a/plugins/TabSRMM/src/mim.cpp
+++ b/plugins/TabSRMM/src/mim.cpp
@@ -416,7 +416,7 @@ int CMimAPI::MessageEventAdded(WPARAM hContact, LPARAM hDbEvent)
if (pTargetContainer == nullptr || !g_plugin.bHideOnClose || IsWindowVisible(pTargetContainer->m_hwnd))
return 0;
- WINDOWPLACEMENT wp = { 0 };
+ WINDOWPLACEMENT wp = {};
wp.length = sizeof(wp);
GetWindowPlacement(pTargetContainer->m_hwnd, &wp);
diff --git a/plugins/TabSRMM/src/msgdialog.cpp b/plugins/TabSRMM/src/msgdialog.cpp
index 0ea8c25470..67d48d5545 100644
--- a/plugins/TabSRMM/src/msgdialog.cpp
+++ b/plugins/TabSRMM/src/msgdialog.cpp
@@ -573,14 +573,10 @@ bool CMsgDialog::OnInitDialog()
m_hTabIcon = m_hTabStatusIcon;
UpdateNickList();
-
- if (m_si->pMI->bDatabase) {
- FindFirstEvent();
- RemakeLog();
- }
+ UpdateChatLog();
}
else {
- FindFirstEvent();
+ GetFirstEvent();
DM_OptionsApplied();
@@ -2494,7 +2490,7 @@ INT_PTR CMsgDialog::DlgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
case HM_DBEVENTADDED:
// this is called whenever a new event has been added to the database.
// this CAN be posted (some sanity checks required).
- if (this)
+ if (this && !isChat())
DM_EventAdded(m_hContact, lParam);
return 0;
diff --git a/plugins/TabSRMM/src/msgdlgother.cpp b/plugins/TabSRMM/src/msgdlgother.cpp
index f2045b77df..06501884f7 100644
--- a/plugins/TabSRMM/src/msgdlgother.cpp
+++ b/plugins/TabSRMM/src/msgdlgother.cpp
@@ -452,7 +452,7 @@ void CMsgDialog::EnableSending(bool bMode) const
/////////////////////////////////////////////////////////////////////////////////////////
-void CMsgDialog::FindFirstEvent()
+bool CMsgDialog::GetFirstEvent()
{
int historyMode = g_plugin.getByte(m_hContact, SRMSGSET_LOADHISTORY, -1);
if (historyMode == -1)
@@ -506,6 +506,7 @@ void CMsgDialog::FindFirstEvent()
}
break;
}
+ return true;
}
/////////////////////////////////////////////////////////////////////////////////////////
diff --git a/plugins/TabSRMM/src/msgs.h b/plugins/TabSRMM/src/msgs.h
index 382ad1f54d..01ad889666 100644
--- a/plugins/TabSRMM/src/msgs.h
+++ b/plugins/TabSRMM/src/msgs.h
@@ -456,7 +456,6 @@ class CMsgDialog : public CSrmmBaseDialog
void CalcDynamicAvatarSize(BITMAP *bminfo);
void DetermineMinHeight(void);
BOOL DoRtfToTags(CMStringW &pszText) const;
- void FindFirstEvent(void);
int FindRTLLocale(void);
void FlashOnClist(MEVENT hEvent, DBEVENTINFO *dbei);
void FlashTab(bool bInvertMode);
@@ -558,7 +557,6 @@ public:
uint32_t m_dwUnread;
HANDLE m_hTheme, m_hThemeIP, m_hThemeToolbar;
HICON m_hXStatusIcon, m_hTabStatusIcon, m_hTabIcon, m_iFlashIcon, m_hTaskbarIcon, m_hClientIcon;
- MEVENT m_hDbEventFirst, m_hDbEventLast;
HANDLE m_hTimeZone;
MEVENT* m_hHistoryEvents;
time_t m_lastEventTime;
@@ -635,6 +633,7 @@ public:
void AddLog() override;
void CloseTab() override;
+ bool GetFirstEvent() override;
bool IsActive() const override;
void LoadSettings() override;
void SetStatusText(const wchar_t *, HICON) override;