From b078dfb78c89aea87cd422eae52694738e473cf3 Mon Sep 17 00:00:00 2001 From: dartraiden Date: Sun, 21 Jul 2019 19:59:18 +0300 Subject: Restore "Free for chat" status support (fixes #1963) --- protocols/JabberG/proto_jabber/res/FFC.ico | Bin 0 -> 5430 bytes protocols/JabberG/proto_jabber/res/Proto_Jabber.rc | 1 + protocols/JabberG/proto_jabber/src/resource.h | 1 + protocols/JabberG/src/jabber_chat.cpp | 5 ++++- protocols/JabberG/src/jabber_groupchat.cpp | 1 + protocols/JabberG/src/jabber_icolib.cpp | 3 ++- protocols/JabberG/src/jabber_list.cpp | 12 ++++++++---- protocols/JabberG/src/jabber_menu.cpp | 1 + protocols/JabberG/src/jabber_misc.cpp | 1 + protocols/JabberG/src/jabber_proto.cpp | 9 +++++++-- protocols/JabberG/src/jabber_rc.cpp | 5 +++++ protocols/JabberG/src/jabber_svc.cpp | 3 +++ protocols/JabberG/src/jabber_thread.cpp | 1 + protocols/JabberG/src/jabber_util.cpp | 7 +++++++ protocols/JabberG/src/stdafx.h | 1 + 15 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 protocols/JabberG/proto_jabber/res/FFC.ico (limited to 'protocols/JabberG') diff --git a/protocols/JabberG/proto_jabber/res/FFC.ico b/protocols/JabberG/proto_jabber/res/FFC.ico new file mode 100644 index 0000000000..dbc899c02a Binary files /dev/null and b/protocols/JabberG/proto_jabber/res/FFC.ico differ diff --git a/protocols/JabberG/proto_jabber/res/Proto_Jabber.rc b/protocols/JabberG/proto_jabber/res/Proto_Jabber.rc index f6a19debab..3a9e85cae0 100644 --- a/protocols/JabberG/proto_jabber/res/Proto_Jabber.rc +++ b/protocols/JabberG/proto_jabber/res/Proto_Jabber.rc @@ -57,6 +57,7 @@ IDI_ICON3 ICON "Away.ico" IDI_ICON4 ICON "Invisible.ico" IDI_ICON5 ICON "NA.ico" IDI_ICON6 ICON "DND.ico" +IDI_ICON7 ICON "FFC.ico" #endif // Russian (Russia) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/protocols/JabberG/proto_jabber/src/resource.h b/protocols/JabberG/proto_jabber/src/resource.h index f59e3ec356..e1031b138e 100644 --- a/protocols/JabberG/proto_jabber/src/resource.h +++ b/protocols/JabberG/proto_jabber/src/resource.h @@ -8,6 +8,7 @@ #define IDI_ICON4 130 #define IDI_ICON5 131 #define IDI_ICON6 158 +#define IDI_ICON7 129 // Next default values for new objects // diff --git a/protocols/JabberG/src/jabber_chat.cpp b/protocols/JabberG/src/jabber_chat.cpp index 99556d85b7..c0e3fa6923 100644 --- a/protocols/JabberG/src/jabber_chat.cpp +++ b/protocols/JabberG/src/jabber_chat.cpp @@ -49,7 +49,8 @@ enum { IDM_PRESENCE_ONLINE = ID_STATUS_ONLINE, IDM_PRESENCE_AWAY = ID_STATUS_AWAY, IDM_PRESENCE_NA = ID_STATUS_NA, - IDM_PRESENCE_DND = ID_STATUS_DND + IDM_PRESENCE_DND = ID_STATUS_DND, + IDM_PRESENCE_FREE4CHAT = ID_STATUS_FREECHAT }; struct TRoleOrAffiliationInfo @@ -425,6 +426,7 @@ static gc_item sttLogListItems[] = { LPGENW("Away"), IDM_PRESENCE_AWAY, MENU_POPUPITEM }, { LPGENW("Not available"), IDM_PRESENCE_NA, MENU_POPUPITEM }, { LPGENW("Do not disturb"), IDM_PRESENCE_DND, MENU_POPUPITEM }, + { LPGENW("Free for chat"), IDM_PRESENCE_FREE4CHAT, MENU_POPUPITEM }, { LPGENW("&Leave chat session"), IDM_LEAVE, MENU_ITEM } }; @@ -1294,6 +1296,7 @@ static void sttLogListHook(CJabberProto *ppro, JABBER_LIST_ITEM *item, GCHOOK* g case IDM_PRESENCE_AWAY: case IDM_PRESENCE_NA: case IDM_PRESENCE_DND: + case IDM_PRESENCE_FREE4CHAT: if (MCONTACT h = ppro->HContactFromJID(item->jid)) ppro->OnMenuHandleDirectPresence((WPARAM)h, 0, gch->dwData); break; diff --git a/protocols/JabberG/src/jabber_groupchat.cpp b/protocols/JabberG/src/jabber_groupchat.cpp index 67b3d17568..7e18ceae1b 100644 --- a/protocols/JabberG/src/jabber_groupchat.cpp +++ b/protocols/JabberG/src/jabber_groupchat.cpp @@ -844,6 +844,7 @@ void CJabberProto::GroupchatProcessPresence(const TiXmlElement *node) if (!mir_strcmp(pszStatus, "away")) status = ID_STATUS_AWAY; else if (!mir_strcmp(pszStatus, "xa")) status = ID_STATUS_NA; else if (!mir_strcmp(pszStatus, "dnd")) status = ID_STATUS_DND; + else if (!mir_strcmp(pszStatus, "chat")) status = ID_STATUS_FREECHAT; } // process custom nick change diff --git a/protocols/JabberG/src/jabber_icolib.cpp b/protocols/JabberG/src/jabber_icolib.cpp index 6a81703261..feedbec77a 100644 --- a/protocols/JabberG/src/jabber_icolib.cpp +++ b/protocols/JabberG/src/jabber_icolib.cpp @@ -29,6 +29,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define IDI_ONLINE 104 #define IDI_OFFLINE 105 #define IDI_AWAY 128 +#define IDI_FREE4CHAT 129 #define IDI_INVISIBLE 130 #define IDI_NA 131 #define IDI_DND 158 @@ -72,7 +73,7 @@ static CTransportProtoTableItem TransportProtoTable[] = { "meinvz*", "MeinVZ" }, }; -static int skinIconStatusToResourceId[] = { IDI_OFFLINE, IDI_ONLINE, IDI_AWAY, IDI_DND, IDI_NA, IDI_NA, IDI_OCCUPIED, IDI_INVISIBLE }; +static int skinIconStatusToResourceId[] = { IDI_OFFLINE, IDI_ONLINE, IDI_AWAY, IDI_DND, IDI_NA, IDI_NA, IDI_OCCUPIED, IDI_FREE4CHAT, IDI_INVISIBLE }; /////////////////////////////////////////////////////////////////////////////// // CIconPool class diff --git a/protocols/JabberG/src/jabber_list.cpp b/protocols/JabberG/src/jabber_list.cpp index 8582963ebe..08e7eb0cff 100644 --- a/protocols/JabberG/src/jabber_list.cpp +++ b/protocols/JabberG/src/jabber_list.cpp @@ -394,19 +394,23 @@ char* CJabberProto::ListGetBestClientResourceNamePtr(const char *jid) for (auto &it : LI->arResources) { bool foundBetter = false; switch (it->m_iStatus) { - case ID_STATUS_ONLINE: + case ID_STATUS_FREECHAT: foundBetter = true; break; + case ID_STATUS_ONLINE: + if (status != ID_STATUS_FREECHAT) + foundBetter = true; + break; case ID_STATUS_DND: - if (status != ID_STATUS_ONLINE) + if (status != ID_STATUS_FREECHAT && status != ID_STATUS_ONLINE) foundBetter = true; break; case ID_STATUS_AWAY: - if (status != ID_STATUS_ONLINE && status != ID_STATUS_DND) + if (status != ID_STATUS_FREECHAT && status != ID_STATUS_ONLINE && status != ID_STATUS_DND) foundBetter = true; break; case ID_STATUS_NA: - if (status != ID_STATUS_ONLINE && status != ID_STATUS_DND && status != ID_STATUS_AWAY) + if (status != ID_STATUS_FREECHAT && status != ID_STATUS_ONLINE && status != ID_STATUS_DND && status != ID_STATUS_AWAY) foundBetter = true; break; } diff --git a/protocols/JabberG/src/jabber_menu.cpp b/protocols/JabberG/src/jabber_menu.cpp index 0f7fcf3409..bdd1684ca2 100644 --- a/protocols/JabberG/src/jabber_menu.cpp +++ b/protocols/JabberG/src/jabber_menu.cpp @@ -61,6 +61,7 @@ static PresenceModeArray[] = { SKINICON_STATUS_AWAY, ID_STATUS_AWAY }, { SKINICON_STATUS_NA, ID_STATUS_NA }, { SKINICON_STATUS_DND, ID_STATUS_DND }, + { SKINICON_STATUS_FREE4CHAT, ID_STATUS_FREECHAT }, }; static HGENMENU g_hMenuDirectPresence[_countof(PresenceModeArray) + 1]; diff --git a/protocols/JabberG/src/jabber_misc.cpp b/protocols/JabberG/src/jabber_misc.cpp index 9395d2b6a5..b6ef4735d9 100755 --- a/protocols/JabberG/src/jabber_misc.cpp +++ b/protocols/JabberG/src/jabber_misc.cpp @@ -215,6 +215,7 @@ void CJabberProto::SetServerStatus(int iNewStatus) switch (iNewStatus) { case ID_STATUS_ONLINE: case ID_STATUS_NA: + case ID_STATUS_FREECHAT: case ID_STATUS_INVISIBLE: m_iStatus = iNewStatus; break; diff --git a/protocols/JabberG/src/jabber_proto.cpp b/protocols/JabberG/src/jabber_proto.cpp index 296f12e516..2803329e83 100755 --- a/protocols/JabberG/src/jabber_proto.cpp +++ b/protocols/JabberG/src/jabber_proto.cpp @@ -240,6 +240,7 @@ CJabberProto::~CJabberProto() mir_free(m_modeMsgs.szAway); mir_free(m_modeMsgs.szNa); mir_free(m_modeMsgs.szDnd); + mir_free(m_modeMsgs.szFreechat); mir_free(m_transportProtoTableStartIndex); @@ -579,9 +580,9 @@ INT_PTR CJabberProto::GetCaps(int type, MCONTACT hContact) case PFLAGNUM_1: return PF1_IM | PF1_AUTHREQ | PF1_CHAT | PF1_SERVERCLIST | PF1_MODEMSG | PF1_BASICSEARCH | PF1_EXTSEARCH | PF1_FILE | PF1_CONTACT; case PFLAGNUM_2: - return PF2_ONLINE | PF2_INVISIBLE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_HEAVYDND; + return PF2_ONLINE | PF2_INVISIBLE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_HEAVYDND | PF2_FREECHAT; case PFLAGNUM_3: - return PF2_ONLINE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_HEAVYDND; + return PF2_ONLINE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_HEAVYDND | PF2_FREECHAT; case PFLAGNUM_4: return PF4_FORCEAUTH | PF4_NOCUSTOMAUTH | PF4_NOAUTHDENYREASON | PF4_SUPPORTTYPING | PF4_AVATARS; case PFLAG_UNIQUEIDTEXT: @@ -1198,6 +1199,10 @@ int CJabberProto::SetAwayMsg(int status, const wchar_t *msg) szMsg = &m_modeMsgs.szDnd; status = ID_STATUS_DND; break; + + case ID_STATUS_FREECHAT: + szMsg = &m_modeMsgs.szFreechat; + break; default: return 1; diff --git a/protocols/JabberG/src/jabber_rc.cpp b/protocols/JabberG/src/jabber_rc.cpp index e880fb9f60..3f19deda87 100644 --- a/protocols/JabberG/src/jabber_rc.cpp +++ b/protocols/JabberG/src/jabber_rc.cpp @@ -238,6 +238,7 @@ static char *StatusModeToDbSetting(int status, const char *suffix) case ID_STATUS_NA: prefix = "Na"; break; case ID_STATUS_DND: prefix = "Dnd"; break; case ID_STATUS_OCCUPIED: prefix = "Occupied"; break; + case ID_STATUS_FREECHAT: prefix = "FreeChat"; break; case ID_STATUS_ONLINE: prefix = "On"; break; case ID_STATUS_OFFLINE: prefix = "Off"; break; case ID_STATUS_INVISIBLE: prefix = "Inv"; break; @@ -286,6 +287,9 @@ int CJabberProto::AdhocSetStatusHandler(const TiXmlElement*, CJabberIqInfo *pInf case ID_STATUS_OCCUPIED: fieldNode << XCHILD("value", "dnd"); break; + case ID_STATUS_FREECHAT: + fieldNode << XCHILD("value", "chat"); + break; case ID_STATUS_ONLINE: default: fieldNode << XCHILD("value", "online"); @@ -342,6 +346,7 @@ int CJabberProto::AdhocSetStatusHandler(const TiXmlElement*, CJabberIqInfo *pInf if (!mir_strcmp(pszValue, "away")) status = ID_STATUS_AWAY; else if (!mir_strcmp(pszValue, "xa")) status = ID_STATUS_NA; else if (!mir_strcmp(pszValue, "dnd")) status = ID_STATUS_DND; + else if (!mir_strcmp(pszValue, "chat")) status = ID_STATUS_FREECHAT; else if (!mir_strcmp(pszValue, "online")) status = ID_STATUS_ONLINE; else if (!mir_strcmp(pszValue, "invisible")) status = ID_STATUS_INVISIBLE; else if (!mir_strcmp(pszValue, "offline")) status = ID_STATUS_OFFLINE; diff --git a/protocols/JabberG/src/jabber_svc.cpp b/protocols/JabberG/src/jabber_svc.cpp index d1119b6bbf..ad263039bd 100644 --- a/protocols/JabberG/src/jabber_svc.cpp +++ b/protocols/JabberG/src/jabber_svc.cpp @@ -54,6 +54,9 @@ INT_PTR __cdecl CJabberProto::GetMyAwayMsg(WPARAM wParam, LPARAM lParam) case ID_STATUS_OCCUPIED: szStatus = m_modeMsgs.szDnd; break; + case ID_STATUS_FREECHAT: + szStatus = m_modeMsgs.szFreechat; + break; default: // Should not reach here break; } diff --git a/protocols/JabberG/src/jabber_thread.cpp b/protocols/JabberG/src/jabber_thread.cpp index 64ea91d5b4..bd146d967a 100755 --- a/protocols/JabberG/src/jabber_thread.cpp +++ b/protocols/JabberG/src/jabber_thread.cpp @@ -1614,6 +1614,7 @@ void CJabberProto::OnProcessPresence(const TiXmlElement *node, ThreadData *info) if (!mir_strcmp(show, "away")) status = ID_STATUS_AWAY; else if (!mir_strcmp(show, "xa")) status = ID_STATUS_NA; else if (!mir_strcmp(show, "dnd")) status = ID_STATUS_DND; + else if (!mir_strcmp(show, "chat")) status = ID_STATUS_FREECHAT; } int priority = XmlGetChildInt(node, "priority"); diff --git a/protocols/JabberG/src/jabber_util.cpp b/protocols/JabberG/src/jabber_util.cpp index db99565983..87b69204e7 100755 --- a/protocols/JabberG/src/jabber_util.cpp +++ b/protocols/JabberG/src/jabber_util.cpp @@ -197,6 +197,7 @@ void JabberHttpUrlDecode(wchar_t *str) int JabberCombineStatus(int status1, int status2) { // Combine according to the following priority (high to low) + // ID_STATUS_FREECHAT // ID_STATUS_ONLINE // ID_STATUS_DND // ID_STATUS_AWAY @@ -204,6 +205,8 @@ int JabberCombineStatus(int status1, int status2) // ID_STATUS_INVISIBLE (valid only for TLEN_PLUGIN) // ID_STATUS_OFFLINE // other ID_STATUS in random order (actually return status1) + if (status1 == ID_STATUS_FREECHAT || status2 == ID_STATUS_FREECHAT) + return ID_STATUS_FREECHAT; if (status1 == ID_STATUS_ONLINE || status2 == ID_STATUS_ONLINE) return ID_STATUS_ONLINE; if (status1 == ID_STATUS_DND || status2 == ID_STATUS_DND) @@ -475,6 +478,10 @@ void CJabberProto::SendPresenceTo(int status, const char *to, const TiXmlElement p << XCHILD("show", "dnd"); if (!msg) msg = m_modeMsgs.szDnd; break; + case ID_STATUS_FREECHAT: + p << XCHILD("show", "chat"); + if (!msg) msg = m_modeMsgs.szFreechat; + break; default: // Should not reach here break; } diff --git a/protocols/JabberG/src/stdafx.h b/protocols/JabberG/src/stdafx.h index 71067a498c..d7710f32a6 100755 --- a/protocols/JabberG/src/stdafx.h +++ b/protocols/JabberG/src/stdafx.h @@ -401,6 +401,7 @@ struct JABBER_MODEMSGS char *szAway; char *szNa; char *szDnd; + char *szFreechat; }; typedef enum { FT_SI, FT_OOB, FT_BYTESTREAM, FT_IBB } JABBER_FT_TYPE; -- cgit v1.2.3