# HG changeset patch # User Mikael Berthe # Date 1265662192 -3600 # Node ID a5263e93c5d710be361c9b0cc4391229214509ec # Parent ac881b5f9248590ebbf043c78bc70d26abc10558 Fix pinging oneself diff -r ac881b5f9248 -r a5263e93c5d7 mcabber/mcabber/xmpp_iqrequest.c --- a/mcabber/mcabber/xmpp_iqrequest.c Mon Feb 08 21:23:05 2010 +0100 +++ b/mcabber/mcabber/xmpp_iqrequest.c Mon Feb 08 21:49:52 2010 +0100 @@ -76,12 +76,14 @@ }; static LmHandlerResult cb_ping(LmMessageHandler *h, LmConnection *c, - LmMessage *message, gpointer udata) + LmMessage *m, gpointer user_data) { - struct timeval *timestamp = (struct timeval *) udata; + struct timeval *timestamp = (struct timeval *)user_data; struct timeval now; time_t dsec; suseconds_t dusec; + const gchar *fjid; + gchar *bjid; gettimeofday(&now, NULL); dsec = now.tv_sec - timestamp->tv_sec; @@ -91,27 +93,33 @@ } else dusec = now.tv_usec - timestamp->tv_usec; - switch (lm_message_get_sub_type(message)) { + // Check IQ result sender + fjid = lm_message_get_from(m); + if (!fjid) + fjid = lm_connection_get_jid(lconnection); // No from means our JID... + if (!fjid) { + scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:version result (no sender name)."); + return LM_HANDLER_RESULT_REMOVE_MESSAGE; + } + + bjid = jidtodisp(fjid); + + switch (lm_message_get_sub_type(m)) { case LM_MESSAGE_SUB_TYPE_RESULT: { // print to buddy's buffer - LmMessageNode *node = lm_message_get_node(message); - gchar *jid = jidtodisp(lm_message_node_get_attribute(node, "from")); gchar *mesg = g_strdup_printf("Pong: %d second%s %d ms.", (int)dsec, dsec > 1 ? "s" : "", (int)(dusec/1000L)); - scr_WriteIncomingMessage(jid, mesg, 0, HBB_PREFIX_INFO, 0); - + scr_WriteIncomingMessage(bjid, mesg, 0, HBB_PREFIX_INFO, 0); g_free(mesg); - g_free(jid); } break; case LM_MESSAGE_SUB_TYPE_ERROR: { - LmMessageNode *node = lm_message_get_node(message); - const gchar *from = lm_message_node_get_attribute(node, "from"); + LmMessageNode *node = lm_message_get_node(m); const gchar *type; const gchar *reason; @@ -123,26 +131,25 @@ reason = "undefined"; { // print to buddy's buffer - gchar *jid = jidtodisp(from); gchar *mesg = g_strdup_printf("Ping to %s failed: %s - %s (response time %d second%s %d microseconds)", - from, type, reason, + fjid, type, reason, (int)dsec, dsec > 1 ? "s" : "", (int)(dusec/1000L)); - scr_WriteIncomingMessage(jid, mesg, 0, HBB_PREFIX_INFO, 0); - + scr_WriteIncomingMessage(bjid, mesg, 0, HBB_PREFIX_INFO, 0); g_free(mesg); - g_free(jid); } } break; default: + g_free(bjid); return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; break; } + g_free(bjid); return LM_HANDLER_RESULT_REMOVE_MESSAGE; }