Mercurial > ~mikael > mcabber > hg
comparison mcabber/mcabber/commands.c @ 2346:7921c8d671c8
Implemented another helper function jid_get_resource_name
author | franky |
---|---|
date | Tue, 14 May 2019 22:19:33 +0200 |
parents | 8ecc28068748 |
children | 73916eeef3cb |
comparison
equal
deleted
inserted
replaced
2345:462f4359391c | 2346:7921c8d671c8 |
---|---|
624 if (current_buddy) | 624 if (current_buddy) |
625 bud = BUDDATA(current_buddy); | 625 bud = BUDDATA(current_buddy); |
626 if (jidres[1] == JID_RESOURCE_SEPARATOR) | 626 if (jidres[1] == JID_RESOURCE_SEPARATOR) |
627 resource = jidres+2; | 627 resource = jidres+2; |
628 } else { | 628 } else { |
629 char *tmp; | |
630 if (!check_jid_syntax(jidres) && | 629 if (!check_jid_syntax(jidres) && |
631 (tmp = strchr(jidres, JID_RESOURCE_SEPARATOR))) { | 630 jid_get_resource_name(jidres)) { |
632 //Any other valid full jid | 631 //Any other valid full jid |
633 *tmp = '\0'; // for roster search by bare jid; | 632 char * bare_jid = jidtodisp(jidres); |
634 resource = tmp+1; | |
635 GSList *roster_elt; | 633 GSList *roster_elt; |
636 roster_elt = roster_find(jidres, jidsearch, | 634 roster_elt = roster_find(bare_jid, jidsearch, |
637 ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); | 635 ROSTER_TYPE_USER|ROSTER_TYPE_AGENT); |
638 if (roster_elt) | 636 if (roster_elt) |
639 bud = roster_elt->data; | 637 bud = roster_elt->data; |
640 *tmp = JID_RESOURCE_SEPARATOR; | 638 g_free(bare_jid); |
641 } | 639 } |
642 if (!bud) { | 640 if (!bud) { |
643 //Resource for current buddy | 641 //Resource for current buddy |
644 if (current_buddy) | 642 if (current_buddy) |
645 bud = BUDDATA(current_buddy); | 643 bud = BUDDATA(current_buddy); |
1254 } | 1252 } |
1255 | 1253 |
1256 static int send_message_to(const char *fjid, const char *msg, const char *subj, | 1254 static int send_message_to(const char *fjid, const char *msg, const char *subj, |
1257 LmMessageSubType type_overwrite, bool quiet) | 1255 LmMessageSubType type_overwrite, bool quiet) |
1258 { | 1256 { |
1259 char *bare_jid, *rp; | 1257 char *bare_jid; |
1258 const char *muc_nick; | |
1260 char *hmsg; | 1259 char *hmsg; |
1261 gint crypted; | 1260 gint crypted; |
1262 gint retval = 0; | 1261 gint retval = 0; |
1263 int isroom; | 1262 int isroom; |
1264 gpointer xep184 = NULL; | 1263 gpointer xep184 = NULL; |
1280 "<%s> is not a valid Jabber ID.", fjid); | 1279 "<%s> is not a valid Jabber ID.", fjid); |
1281 return 1; | 1280 return 1; |
1282 } | 1281 } |
1283 | 1282 |
1284 // We must use the bare jid in hk_message_out() | 1283 // We must use the bare jid in hk_message_out() |
1285 rp = strchr(fjid, JID_RESOURCE_SEPARATOR); | 1284 bare_jid = jidtodisp(fjid); |
1286 if (rp) | |
1287 bare_jid = g_strndup(fjid, rp - fjid); | |
1288 else | |
1289 bare_jid = (char*)fjid; | |
1290 | 1285 |
1291 if (!quiet) { | 1286 if (!quiet) { |
1292 // Jump to window, create one if needed | 1287 // Jump to window, create one if needed |
1293 scr_roster_jump_jid(bare_jid); | 1288 scr_roster_jump_jid(bare_jid); |
1294 } | 1289 } |
1295 | 1290 |
1296 // Check if we're sending a message to a conference room | 1291 // Check if we're sending a message to a conference room |
1297 // If not, we must make sure rp is NULL, for hk_message_out() | |
1298 isroom = !!roster_find(bare_jid, jidsearch, ROSTER_TYPE_ROOM); | 1292 isroom = !!roster_find(bare_jid, jidsearch, ROSTER_TYPE_ROOM); |
1299 if (rp) { | 1293 muc_nick = jid_get_resource_name(fjid); |
1300 if (isroom) rp++; | 1294 isroom = isroom && !muc_nick; |
1301 else rp = NULL; | |
1302 } | |
1303 isroom = isroom && (!rp || !*rp); | |
1304 | 1295 |
1305 // local part (UI, logging, etc.) | 1296 // local part (UI, logging, etc.) |
1306 if (subj) | 1297 if (subj) |
1307 hmsg = g_strdup_printf("[%s]\n%s", subj, msg); | 1298 hmsg = g_strdup_printf("[%s]\n%s", subj, msg); |
1308 else | 1299 else |
1318 goto send_message_to_return; | 1309 goto send_message_to_return; |
1319 } | 1310 } |
1320 | 1311 |
1321 // Hook | 1312 // Hook |
1322 if (!isroom) | 1313 if (!isroom) |
1323 hk_message_out(bare_jid, rp, 0, hmsg, crypted, FALSE, xep184); | 1314 hk_message_out(bare_jid, muc_nick, 0, hmsg, crypted, FALSE, xep184); |
1324 | 1315 |
1325 send_message_to_return: | 1316 send_message_to_return: |
1326 if (hmsg != msg) g_free(hmsg); | 1317 if (hmsg != msg) g_free(hmsg); |
1327 if (rp) g_free(bare_jid); | 1318 g_free(bare_jid); |
1328 return retval; | 1319 return retval; |
1329 } | 1320 } |
1330 | 1321 |
1331 // send_message(msg, subj, type_overwrite) | 1322 // send_message(msg, subj, type_overwrite) |
1332 // Write the message in the buddy's window and send the message on | 1323 // Write the message in the buddy's window and send the message on |
1703 } | 1694 } |
1704 | 1695 |
1705 if (!strchr(fjid, JID_DOMAIN_SEPARATOR)) { | 1696 if (!strchr(fjid, JID_DOMAIN_SEPARATOR)) { |
1706 const gchar *append_server = settings_opt_get("default_server"); | 1697 const gchar *append_server = settings_opt_get("default_server"); |
1707 if (append_server) { | 1698 if (append_server) { |
1708 gchar *res = strchr(fjid, JID_RESOURCE_SEPARATOR); | 1699 const char *res = jid_get_resource_name(fjid); |
1709 uncompletedfjid = fjid; | 1700 uncompletedfjid = jidtodisp(fjid); |
1701 g_free(fjid); | |
1710 if (res) { | 1702 if (res) { |
1711 *res++ = '\0'; | 1703 fjid = g_strdup_printf("%s%c%s%c%s", uncompletedfjid, JID_DOMAIN_SEPARATOR, |
1712 fjid = g_strdup_printf("%s%c%s%c%s", fjid, JID_DOMAIN_SEPARATOR, | |
1713 append_server, JID_RESOURCE_SEPARATOR, res); | 1704 append_server, JID_RESOURCE_SEPARATOR, res); |
1714 } else { | 1705 } else { |
1715 fjid = g_strdup_printf("%s%c%s", fjid, JID_DOMAIN_SEPARATOR, | 1706 fjid = g_strdup_printf("%s%c%s", uncompletedfjid, JID_DOMAIN_SEPARATOR, |
1716 append_server); | 1707 append_server); |
1717 } | 1708 } |
1718 } | 1709 } |
1719 } | 1710 } |
1720 | 1711 |
3591 if (!fjid) | 3582 if (!fjid) |
3592 scr_LogPrint(LPRINT_NORMAL, "Please specify a Jabber ID."); | 3583 scr_LogPrint(LPRINT_NORMAL, "Please specify a Jabber ID."); |
3593 } | 3584 } |
3594 | 3585 |
3595 if (fjid) { | 3586 if (fjid) { |
3596 switch (numtype) { | 3587 if (iqreq_vcard == numtype) { |
3597 case iqreq_vcard: | 3588 // vCards requests are sent to the bare jid, except in MUC rooms |
3598 { // vCards requests are sent to the bare jid, except in MUC rooms | 3589 const char *resource_name = jid_get_resource_name(fjid); |
3599 gchar *tmp = strchr(fjid, JID_RESOURCE_SEPARATOR); | 3590 if (resource_name) { |
3600 if (tmp) { | 3591 char *bare_jid = jidtodisp(fjid); |
3601 gchar *bjid = jidtodisp(fjid); | 3592 if (!roster_find(bare_jid, jidsearch, ROSTER_TYPE_ROOM)) { |
3602 if (!roster_find(bjid, jidsearch, ROSTER_TYPE_ROOM)) | 3593 g_free(jid_utf8); |
3603 *tmp = '\0'; | 3594 fjid = jid_utf8 = bare_jid; |
3604 g_free(bjid); | 3595 } else { |
3605 } | 3596 g_free(bare_jid); |
3606 } | 3597 } |
3607 /* FALLTHRU */ | 3598 } |
3608 case iqreq_version: | 3599 } |
3609 case iqreq_time: | 3600 xmpp_request(fjid, numtype); |
3610 case iqreq_last: | |
3611 case iqreq_ping: | |
3612 xmpp_request(fjid, numtype); | |
3613 break; | |
3614 default: | |
3615 break; | |
3616 } | |
3617 } | 3601 } |
3618 g_free(jid_utf8); | 3602 g_free(jid_utf8); |
3619 free_arg_lst(paramlst); | 3603 free_arg_lst(paramlst); |
3620 } | 3604 } |
3621 | 3605 |