changeset 1706:a5263e93c5d7

Fix pinging oneself
author Mikael Berthe <mikael@lilotux.net>
date Mon, 08 Feb 2010 21:49:52 +0100
parents ac881b5f9248
children 184de76b5b18
files mcabber/mcabber/xmpp_iqrequest.c
diffstat 1 files changed, 22 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- 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;
 }