From 0e4a45eff4dd8ab29f8dd79e419d33a89a808939 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 23 Mar 2023 21:52:25 +0300 Subject: group chats unserialization --- src/mir_app/src/chat.h | 2 ++ src/mir_app/src/chat_manager.cpp | 2 +- src/mir_app/src/chat_svc.cpp | 12 +++++++-- src/mir_app/src/chat_tools.cpp | 55 +++++++++++++++++++++++++++++++++++++++- 4 files changed, 67 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/mir_app/src/chat.h b/src/mir_app/src/chat.h index c41c5344a8..04fa195b9c 100644 --- a/src/mir_app/src/chat.h +++ b/src/mir_app/src/chat.h @@ -84,6 +84,7 @@ SESSION_INFO* SM_FindSessionByIndex(const char *pszModule, int iItem); STATUSINFO* TM_AddStatus(STATUSINFO **ppStatusList, const wchar_t *pszStatus, int *iCount); uint16_t TM_StringToWord(STATUSINFO *pStatusList, const wchar_t *pszStatus); +USERINFO* UM_AddUser(SESSION_INFO *si, const wchar_t *pszUID, const wchar_t *pszNick, uint16_t wStatus); USERINFO* UM_FindUserFromIndex(SESSION_INFO *si, int index); BOOL UM_RemoveAll(SESSION_INFO *si); BOOL UM_SetStatusEx(SESSION_INFO *si, const wchar_t* pszText, int flags); @@ -132,5 +133,6 @@ void Chat_RemoveContact(MCONTACT hContact); CMStringW Chat_GetFolderName(SESSION_INFO *si = nullptr); void Chat_Serialize(SESSION_INFO *si); +bool Chat_Unserialize(SESSION_INFO *si); #pragma comment(lib,"comctl32.lib") diff --git a/src/mir_app/src/chat_manager.cpp b/src/mir_app/src/chat_manager.cpp index a448c77be0..23984f3601 100644 --- a/src/mir_app/src/chat_manager.cpp +++ b/src/mir_app/src/chat_manager.cpp @@ -570,7 +570,7 @@ STATUSINFO* TM_AddStatus(STATUSINFO **ppStatusList, const wchar_t *pszStatus, in return node; } - return FALSE; + return nullptr; } static STATUSINFO* TM_FindStatus(STATUSINFO *pStatusList, const wchar_t *pszStatus) diff --git a/src/mir_app/src/chat_svc.cpp b/src/mir_app/src/chat_svc.cpp index 9fd2d559ba..64132cdde5 100644 --- a/src/mir_app/src/chat_svc.cpp +++ b/src/mir_app/src/chat_svc.cpp @@ -255,10 +255,18 @@ MIR_APP_DLL(SESSION_INFO*) Chat_NewSession( mir_snwprintf(szTemp, L"Server: %s", si->ptszName); else wcsncpy_s(szTemp, si->ptszName, _TRUNCATE); + si->hContact = AddRoom(pszModule, ptszID, szTemp, si->iType); si->iPopupFlags = Chat::iPopupFlags; si->iTrayFlags = Chat::iTrayIconFlags; - db_set_s(si->hContact, si->pszModule, "Topic", ""); + + bool bRestored = false; + if (mi->bPersistent) + bRestored = Chat_Unserialize(si); + + if (!bRestored) + db_set_s(si->hContact, si->pszModule, "Topic", ""); + db_unset(si->hContact, "CList", "StatusMsg"); if (si->ptszStatusbarText) db_set_ws(si->hContact, si->pszModule, "StatusBar", si->ptszStatusbarText); @@ -423,7 +431,7 @@ static void AddUser(SESSION_INFO *si, GCEVENT &gce) { uint16_t status = TM_StringToWord(si->pStatuses, gce.pszStatus.w); - USERINFO *ui = g_chatApi.UM_AddUser(si, gce.pszUID.w, gce.pszNick.w, status); + USERINFO *ui = UM_AddUser(si, gce.pszUID.w, gce.pszNick.w, status); if (ui == nullptr) return; diff --git a/src/mir_app/src/chat_tools.cpp b/src/mir_app/src/chat_tools.cpp index 744797f205..ee13b56e43 100644 --- a/src/mir_app/src/chat_tools.cpp +++ b/src/mir_app/src/chat_tools.cpp @@ -867,7 +867,8 @@ void Chat_Serialize(SESSION_INFO *si) JSONNode pUserList(JSON_ARRAY); pUserList.set_name("users"); for (auto &it : si->arUsers) { JSONNode user; - user << JSONNode("id", T2Utf(it->pszUID).get()) << JSONNode("nick", T2Utf(it->pszNick).get()) << JSONNode("role", it->Status); + user << JSONNode("id", T2Utf(it->pszUID).get()) << JSONNode("nick", T2Utf(it->pszNick).get()) + << JSONNode("role", it->Status) << JSONNode("isMe", it == si->pMe); pUserList << user; } @@ -886,3 +887,55 @@ void Chat_Serialize(SESSION_INFO *si) } } } + +bool Chat_Unserialize(SESSION_INFO *si) +{ + FILE *in = _wfopen(Chat_GetFolderName(si), L"r"); + if (in == nullptr) + return false; + + CMStringA szJson; + unsigned iFileLength = filelength(fileno(in)); + szJson.Truncate(iFileLength); + fread(szJson.GetBuffer(), 1, iFileLength, in); + fclose(in); + + JSONNode root = JSONNode::parse(szJson); + if (!root) + return false; + + CMStringW str = root["name"].as_mstring(); + if (!str.IsEmpty()) + si->ptszName = str.Detach(); + + str = root["topic"].as_mstring(); + if (!str.IsEmpty()) + si->ptszTopic = str.Detach(); + + for (auto &it : root["roles"]) + if (auto *pStatus = TM_AddStatus(&si->pStatuses, it["name"].as_mstring(), &si->iStatusCount)) + si->iStatusCount++; + + for (auto &it : root["users"]) { + int iStatus = it["role"].as_int(); + USERINFO *ui = UM_AddUser(si, it["id"].as_mstring(), it["nick"].as_mstring(), iStatus); + if (ui == nullptr) + continue; + + if (g_chatApi.OnAddUser) + g_chatApi.OnAddUser(si, ui); + + if (it["isMe"].as_bool()) + si->pMe = ui; + ui->Status = iStatus; + ui->Status |= si->pStatuses->iStatus; + + if (g_chatApi.OnNewUser) + g_chatApi.OnNewUser(si, ui); + } + + if (si->pDlg) + si->pDlg->UpdateNickList(); + + return true; +} -- cgit v1.2.3