diff options
-rw-r--r-- | protocols/JabberG/src/jabber_api.cpp | 1 | ||||
-rw-r--r-- | protocols/JabberG/src/jabber_list.cpp | 10 | ||||
-rw-r--r-- | protocols/JabberG/src/jabber_proto.h | 1 | ||||
-rw-r--r-- | protocols/JabberG/src/jabber_voip.cpp | 15 |
4 files changed, 23 insertions, 4 deletions
diff --git a/protocols/JabberG/src/jabber_api.cpp b/protocols/JabberG/src/jabber_api.cpp index 775102599e..70c94ead16 100644 --- a/protocols/JabberG/src/jabber_api.cpp +++ b/protocols/JabberG/src/jabber_api.cpp @@ -64,6 +64,7 @@ char* CJabberProto::GetBestResourceName(const char *jid) {
if (jid == nullptr)
return nullptr;
+
const char *p = strchr(jid, '/');
if (p == nullptr) {
mir_cslock lck(m_csLists);
diff --git a/protocols/JabberG/src/jabber_list.cpp b/protocols/JabberG/src/jabber_list.cpp index da6cfb955d..12c56fc6cb 100644 --- a/protocols/JabberG/src/jabber_list.cpp +++ b/protocols/JabberG/src/jabber_list.cpp @@ -371,6 +371,16 @@ JABBER_RESOURCE_STATUS* JABBER_LIST_ITEM::getTemp() return m_pItemResource;
}
+pResourceStatus CJabberProto::ListGetBestResource(const char *jid)
+{
+ mir_cslock lck(m_csLists);
+ JABBER_LIST_ITEM *LI = ListGetItemPtr(LIST_ROSTER, jid);
+ if (LI == nullptr)
+ return nullptr;
+
+ return pResourceStatus(LI->getBestResource());
+}
+
char* CJabberProto::ListGetBestClientResourceNamePtr(const char *jid)
{
mir_cslock lck(m_csLists);
diff --git a/protocols/JabberG/src/jabber_proto.h b/protocols/JabberG/src/jabber_proto.h index f10a4866ba..50415aef70 100644 --- a/protocols/JabberG/src/jabber_proto.h +++ b/protocols/JabberG/src/jabber_proto.h @@ -649,6 +649,7 @@ struct CJabberProto : public PROTO<CJabberProto>, public IJabberInterface int ListFindNext(JABBER_LIST list, int fromOffset);
pResourceStatus ListFindResource(JABBER_LIST list, const char *jid);
+ pResourceStatus ListGetBestResource(const char *jid);
bool ListAddResource(JABBER_LIST list, const char *jid, int status, const char *statusMessage, int priority = 0, const char *nick = nullptr);
void ListRemoveResource(JABBER_LIST list, const char *jid);
diff --git a/protocols/JabberG/src/jabber_voip.cpp b/protocols/JabberG/src/jabber_voip.cpp index 27147af5f0..85d8ad3f12 100644 --- a/protocols/JabberG/src/jabber_voip.cpp +++ b/protocols/JabberG/src/jabber_voip.cpp @@ -484,12 +484,19 @@ bool CJabberProto::VOIPCallIinitiate(MCONTACT hContact) if (!hasJingle()) return false; - CMStringA jid(ptrA(getUStringA(hContact, "jid"))); + CMStringA jid(getMStringA(hContact, "jid")); if (jid.IsEmpty()) return false; - ptrA szResource(GetBestResourceName(jid)); - if (szResource) - jid = MakeJid(jid, szResource); + + auto r = ListGetBestResource(jid); + if (r) { + if (!(r->m_pCaps->GetCaps() & JABBER_CAPS_JINGLE)) { + MsgPopup(hContact, TranslateT("Client's program does not support voice calls"), TranslateT("Error")); + return false; + } + + jid = MakeJid(jid, r->m_szResourceName); + } unsigned char tmp[16]; Utils_GetRandom(tmp, sizeof(tmp)); |