mcabber/mcabber/commands.c
changeset 2346 7921c8d671c8
parent 2327 8ecc28068748
child 2353 73916eeef3cb
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