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