From 45bf5f51cc788cb8f19e1b8fcd5b8818dc7a2e00 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Mon, 25 Feb 2019 21:02:11 +0300 Subject: GCEVENT::GCEF_UTF8 - flag for direct communication with utf8-encoded chat events (UTF16LE by default) --- protocols/JabberG/src/jabber_chat.cpp | 77 ++++++++++++++---------------- protocols/JabberG/src/jabber_groupchat.cpp | 41 ++++++++-------- 2 files changed, 57 insertions(+), 61 deletions(-) (limited to 'protocols/JabberG') diff --git a/protocols/JabberG/src/jabber_chat.cpp b/protocols/JabberG/src/jabber_chat.cpp index 70dd3e66cc..e29c2a9d75 100644 --- a/protocols/JabberG/src/jabber_chat.cpp +++ b/protocols/JabberG/src/jabber_chat.cpp @@ -97,7 +97,7 @@ static TRoleOrAffiliationInfo sttRoleItems[] = ///////////////////////////////////////////////////////////////////////////////////////// // JabberGcInit - initializes the new chat -static const wchar_t *sttStatuses[] = { LPGENW("Visitors"), LPGENW("Participants"), LPGENW("Moderators"), LPGENW("Owners") }; +static const char *sttStatuses[] = { LPGEN("Owners"), LPGEN("Moderators"), LPGEN("Participants"), LPGEN("Visitors") }; int JabberGcGetStatus(JABBER_GC_AFFILIATION a, JABBER_GC_ROLE r) { @@ -162,7 +162,7 @@ int CJabberProto::GcInit(JABBER_LIST_ITEM *item) item->bChatActive = true; for (int i = _countof(sttStatuses) - 1; i >= 0; i--) - Chat_AddGroup(si, TranslateW(sttStatuses[i])); + Chat_AddGroup(si, TranslateW(Utf2T(sttStatuses[i]))); Chat_Control(m_szModuleName, wszJid, (item->bAutoJoin && m_bAutoJoinHidden) ? WINDOW_HIDDEN : SESSION_INITDONE); Chat_Control(m_szModuleName, wszJid, SESSION_ONLINE); @@ -173,69 +173,67 @@ void CJabberProto::GcLogShowInformation(JABBER_LIST_ITEM *item, pResourceStatus { if (!item || !user || (item->bChatActive != 2)) return; - CMStringW buf; - Utf2T wszRoomJid(item->jid), wszUserId(user->m_szResourceName); + CMStringA buf; switch (type) { case INFO_BAN: if (m_bGcLogBans) - buf.Format(TranslateT("User %s is now banned."), wszUserId.get()); + buf.Format(TranslateU("User %s is now banned."), user->m_szResourceName); break; case INFO_STATUS: if (m_bGcLogStatuses) { wchar_t *ptszDescr = Clist_GetStatusModeDescription(user->m_iStatus, 0); if (user->m_szStatusMessage) - buf.Format(TranslateT("User %s changed status to %s with message: %s"), wszUserId.get(), ptszDescr, user->m_szStatusMessage); + buf.Format(TranslateU("User %s changed status to %s with message: %s"), user->m_szResourceName, ptszDescr, user->m_szStatusMessage); else - buf.Format(TranslateT("User %s changed status to %s"), wszUserId.get(), ptszDescr); + buf.Format(TranslateU("User %s changed status to %s"), user->m_szResourceName, ptszDescr); } break; case INFO_CONFIG: if (m_bGcLogConfig) - buf.Format(TranslateT("Room configuration was changed.")); + buf.Append(TranslateU("Room configuration was changed.")); break; case INFO_AFFILIATION: if (m_bGcLogAffiliations) { - wchar_t *name = nullptr; + const char *name = nullptr; switch (user->m_affiliation) { - case AFFILIATION_NONE: name = TranslateT("None"); break; - case AFFILIATION_MEMBER: name = TranslateT("Member"); break; - case AFFILIATION_ADMIN: name = TranslateT("Admin"); break; - case AFFILIATION_OWNER: name = TranslateT("Owner"); break; - case AFFILIATION_OUTCAST: name = TranslateT("Outcast"); break; + case AFFILIATION_NONE: name = TranslateU("None"); break; + case AFFILIATION_MEMBER: name = TranslateU("Member"); break; + case AFFILIATION_ADMIN: name = TranslateU("Admin"); break; + case AFFILIATION_OWNER: name = TranslateU("Owner"); break; + case AFFILIATION_OUTCAST: name = TranslateU("Outcast"); break; } if (name) - buf.Format(TranslateT("Affiliation of %s was changed to '%s'."), wszUserId.get(), name); + buf.Format(TranslateU("Affiliation of %s was changed to '%s'."), user->m_szResourceName, name); } break; case INFO_ROLE: if (m_bGcLogRoles) { - wchar_t *name = nullptr; + const char *name = nullptr; switch (user->m_role) { - case ROLE_NONE: name = TranslateT("None"); break; - case ROLE_VISITOR: name = TranslateT("Visitor"); break; - case ROLE_PARTICIPANT: name = TranslateT("Participant"); break; - case ROLE_MODERATOR: name = TranslateT("Moderator"); break; + case ROLE_NONE: name = TranslateU("None"); break; + case ROLE_VISITOR: name = TranslateU("Visitor"); break; + case ROLE_PARTICIPANT: name = TranslateU("Participant"); break; + case ROLE_MODERATOR: name = TranslateU("Moderator"); break; } if (name) - buf.Format(TranslateT("Role of %s was changed to '%s'."), wszUserId.get(), name); + buf.Format(Translate("Role of %s was changed to '%s'."), user->m_szResourceName, name); } break; } if (!buf.IsEmpty()) { - buf.Replace(L"%", L"%%"); + buf.Replace("%", "%%"); - GCEVENT gce = { m_szModuleName, wszRoomJid, GC_EVENT_INFORMATION }; - gce.ptszNick = wszUserId; - gce.ptszUID = wszUserId; - gce.ptszText = buf; - gce.dwFlags = GCEF_ADDTOLOG; + GCEVENT gce = { m_szModuleName, item->jid, GC_EVENT_INFORMATION }; + gce.dwFlags = GCEF_UTF8 + GCEF_ADDTOLOG; + gce.pszNick.a = gce.pszUID.a = user->m_szResourceName; + gce.pszText.a = buf; gce.time = time(0); Chat_Event(&gce); } @@ -257,12 +255,12 @@ void CJabberProto::GcLogUpdateMemberStatus(JABBER_LIST_ITEM *item, const char *r if (myNick == nullptr) myNick = JabberNickFromJID(m_szJabberJID); - Utf2T wszRoomJid(item->jid), wszNick(nick), wszUserId(resource), wszText(szReason), wszUserInfo(jid); - GCEVENT gce = { m_szModuleName, wszRoomJid }; - gce.ptszNick = wszNick; - gce.ptszUID = wszUserId; - gce.ptszUserInfo = wszUserInfo; - gce.ptszText = wszText; + GCEVENT gce = { m_szModuleName, item->jid, 0 }; + gce.dwFlags = GCEF_UTF8; + gce.pszNick.a = nick; + gce.pszUID.a = resource; + gce.pszUserInfo.a = jid; + gce.pszText.a = szReason; if (item->bChatActive == 2) { gce.dwFlags |= GCEF_ADDTOLOG; gce.time = time(0); @@ -271,7 +269,7 @@ void CJabberProto::GcLogUpdateMemberStatus(JABBER_LIST_ITEM *item, const char *r switch (gce.iType = action) { case GC_EVENT_PART: break; case GC_EVENT_KICK: - gce.ptszStatus = TranslateT("Moderator"); + gce.pszStatus.a = TranslateU("Moderator"); break; default: @@ -285,27 +283,26 @@ void CJabberProto::GcLogUpdateMemberStatus(JABBER_LIST_ITEM *item, const char *r case GC_EVENT_REMOVESTATUS: gce.dwFlags &= ~GCEF_ADDTOLOG; } - gce.ptszText = TranslateT("Moderator"); + gce.pszText.a = TranslateU("Moderator"); } - gce.ptszStatus = TranslateW(sttStatuses[JabberGcGetStatus(JS)]); + gce.pszStatus.a = TranslateU(sttStatuses[JabberGcGetStatus(JS)]); gce.bIsMe = (mir_strcmp(nick, myNick) == 0); statusToSet = JS->m_iStatus; break; } } } - Chat_Event(&gce); if (statusToSet != 0) { int flags = GC_SSE_ONLYLISTED; if (statusToSet == ID_STATUS_AWAY || statusToSet == ID_STATUS_NA || statusToSet == ID_STATUS_DND) flags += GC_SSE_ONLINE; - Chat_SetStatusEx(m_szModuleName, wszRoomJid, flags, wszNick); + Chat_SetStatusEx(m_szModuleName, Utf2T(item->jid), flags, Utf2T(nick)); gce.iType = GC_EVENT_SETCONTACTSTATUS; - gce.ptszText = wszNick; - gce.ptszUID = wszUserId; + gce.pszText.a = nick; + gce.pszUID.a = resource; gce.dwItemData = statusToSet; Chat_Event(&gce); } diff --git a/protocols/JabberG/src/jabber_groupchat.cpp b/protocols/JabberG/src/jabber_groupchat.cpp index 682de9e84a..2719ba4690 100644 --- a/protocols/JabberG/src/jabber_groupchat.cpp +++ b/protocols/JabberG/src/jabber_groupchat.cpp @@ -788,15 +788,16 @@ void CJabberProto::RenameParticipantNick(JABBER_LIST_ITEM *item, const char *old setUString(hContact, "MyNick", newNick); } - Utf2T wszRoomId(item->jid), wszOld(oldNick), wszNew(newNick), wszInfo(jid); - Chat_ChangeUserId(m_szModuleName, wszRoomId, wszOld, wszNew); + Chat_ChangeUserId(m_szModuleName, Utf2T(item->jid), Utf2T(oldNick), Utf2T(newNick)); - GCEVENT gce = { m_szModuleName, wszRoomId, GC_EVENT_NICK }; - gce.ptszUserInfo = wszInfo; + GCEVENT gce = { m_szModuleName, item->jid, GC_EVENT_NICK }; + gce.dwFlags = GCEF_UTF8; + gce.pszID.a = item->jid; + gce.pszUserInfo.a = jid; gce.time = time(0); - gce.ptszNick = wszOld; - gce.ptszUID = wszNew; - gce.ptszText = wszNew; + gce.pszNick.a = oldNick; + gce.pszUID.a = newNick; + gce.pszText.a = newNick; Chat_Event(&gce); } @@ -1010,7 +1011,7 @@ void CJabberProto::GroupchatProcessPresence(const TiXmlElement *node) void CJabberProto::GroupchatProcessMessage(const TiXmlElement *node) { const TiXmlElement *n, *m; - const char *from, *type, *p, *nick, *resource; + const char *from, *type, *p, *nick; JABBER_LIST_ITEM *item; CMStringW imgLink; @@ -1022,12 +1023,10 @@ void CJabberProto::GroupchatProcessMessage(const TiXmlElement *node) if (!mir_strcmp(type, "error")) return; - Utf2T roomJid(item->jid); - GCEVENT gce = { m_szModuleName, roomJid, 0 }; + GCEVENT gce = { m_szModuleName, item->jid, 0 }; + gce.dwFlags = GCEF_UTF8; - const char *msgText = nullptr; - - resource = strchr(from, '/'); + const char *resource = strchr(from, '/'), *msgText; if (resource != nullptr && *++resource == '\0') resource = nullptr; @@ -1051,6 +1050,7 @@ void CJabberProto::GroupchatProcessMessage(const TiXmlElement *node) resource = tmpnick; } } + item->getTemp()->m_szStatusMessage = mir_strdup(msgText); } else { @@ -1093,15 +1093,14 @@ void CJabberProto::GroupchatProcessMessage(const TiXmlElement *node) } else nick = nullptr; - CMStringW tszText(Utf2T(msgText).get()); - tszText.Replace(L"%", L"%%"); - tszText += imgLink; + CMStringA szText(msgText); + szText.Replace("%", "%%"); + szText += imgLink; - Utf2T wszUserId(resource), wszNick(nick); - gce.ptszUID = wszUserId; - gce.ptszNick = wszNick; + gce.pszUID.a = resource; + gce.pszNick.a = nick; gce.time = msgTime; - gce.ptszText = tszText; + gce.pszText.a = szText; gce.bIsMe = nick == nullptr ? FALSE : (mir_strcmp(resource, item->nick) == 0); if (!isHistory) @@ -1115,7 +1114,7 @@ void CJabberProto::GroupchatProcessMessage(const TiXmlElement *node) item->bChatActive = 2; if (gce.iType == GC_EVENT_TOPIC) - Chat_SetStatusbarText(m_szModuleName, roomJid, tszText); + Chat_SetStatusbarText(m_szModuleName, Utf2T(item->jid), Utf2T(szText)); } ///////////////////////////////////////////////////////////////////////////////////////// -- cgit v1.2.3