From 5ef0585dbd3bfbc09093bc8f24f41e4ae2349c59 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 9 Feb 2023 18:21:23 +0300 Subject: SRMM: better support for group chats in database --- plugins/Dbx_sqlite/src/dbevents.cpp | 22 ++++++++++++++++------ plugins/Dbx_sqlite/src/dbintf.cpp | 5 ++++- plugins/Dbx_sqlite/src/dbsettings.cpp | 12 +++++++++--- plugins/Scriver/src/msgdialog.cpp | 12 ++++-------- plugins/Scriver/src/msgs.cpp | 1 + plugins/Scriver/src/msgs.h | 4 ++-- plugins/Scriver/src/msgutils.cpp | 2 +- plugins/TabSRMM/src/generic_msghandlers.cpp | 2 +- plugins/TabSRMM/src/mim.cpp | 2 +- plugins/TabSRMM/src/msgdialog.cpp | 10 +++------- plugins/TabSRMM/src/msgdlgother.cpp | 3 ++- plugins/TabSRMM/src/msgs.h | 3 +-- 12 files changed, 45 insertions(+), 33 deletions(-) (limited to 'plugins') 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; -- cgit v1.2.3