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 |