mcabber/mcabber/xmpp_iqrequest.c
author Jan Zachorowski <quantifier666@gmail.com>
Sun, 27 Mar 2011 10:43:13 +0200
changeset 1983 45e0b13a39e2
parent 1979 6febc7d1f760
child 2003 10cec229b41a
permissions -rw-r--r--
Refresh the roster when MUC bookmarks are received If the bookmarks are received after the roster contents we need to make sure that the roster window is redrawn.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1599
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
     1
/*
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
     2
 * xmpp_iqrequest.c -- Jabber IQ request handling
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
     3
 *
1729
e6e89b1d7831 Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents: 1719
diff changeset
     4
 * Copyright (C) 2008-2010 Frank Zschockelt <mcabber@freakysoft.de>
e6e89b1d7831 Minor style and header updates
Mikael Berthe <mikael@lilotux.net>
parents: 1719
diff changeset
     5
 * Copyright (C) 2005-2010 Mikael Berthe <mikael@lilotux.net>
1599
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
     6
 *
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
     7
 * This program is free software; you can redistribute it and/or modify
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
     8
 * it under the terms of the GNU General Public License as published by
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
     9
 * the Free Software Foundation; either version 2 of the License, or (at
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
    10
 * your option) any later version.
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
    11
 *
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
    12
 * This program is distributed in the hope that it will be useful, but
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
    13
 * WITHOUT ANY WARRANTY; without even the implied warranty of
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
    14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
    15
 * General Public License for more details.
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
    16
 *
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
    17
 * You should have received a copy of the GNU General Public License
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
    18
 * along with this program; if not, write to the Free Software
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
    19
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
    20
 * USA
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
    21
 */
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    22
1604
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1599
diff changeset
    23
#include <string.h>
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1599
diff changeset
    24
#include <stdlib.h>
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    25
#include <sys/time.h>
1604
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1599
diff changeset
    26
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1599
diff changeset
    27
#include "xmpp_helper.h"
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1599
diff changeset
    28
#include "xmpp_iq.h"
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1599
diff changeset
    29
#include "screen.h"
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1599
diff changeset
    30
#include "utils.h"
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1599
diff changeset
    31
#include "settings.h"
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1599
diff changeset
    32
#include "hooks.h"
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1599
diff changeset
    33
#include "hbuf.h"
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1599
diff changeset
    34
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1599
diff changeset
    35
extern LmMessageNode *bookmarks;
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1599
diff changeset
    36
extern LmMessageNode *rosternotes;
351427ef0b4b Remove #include's of C files
Mikael Berthe <mikael@lilotux.net>
parents: 1599
diff changeset
    37
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    38
static LmHandlerResult cb_roster(LmMessageHandler *h, LmConnection *c,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    39
                                 LmMessage *m, gpointer user_data);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    40
static LmHandlerResult cb_version(LmMessageHandler *h, LmConnection *c,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    41
                                  LmMessage *m, gpointer user_data);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    42
static LmHandlerResult cb_time(LmMessageHandler *h, LmConnection *c,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    43
                               LmMessage *m, gpointer user_data);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    44
static LmHandlerResult cb_last(LmMessageHandler *h, LmConnection *c,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    45
                               LmMessage *m, gpointer user_data);
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    46
static LmHandlerResult cb_ping(LmMessageHandler *h, LmConnection *c,
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    47
                               LmMessage *m, gpointer user_data);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    48
static LmHandlerResult cb_vcard(LmMessageHandler *h, LmConnection *c,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    49
                               LmMessage *m, gpointer user_data);
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    50
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    51
static struct IqRequestHandlers
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    52
{
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    53
  const gchar *xmlns;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    54
  const gchar *querytag;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    55
  LmHandleMessageFunction handler;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    56
} iq_request_handlers[] = {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    57
  {NS_ROSTER, "query", &cb_roster},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    58
  {NS_VERSION,"query", &cb_version},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    59
  {NS_TIME,   "query", &cb_time},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    60
  {NS_LAST,   "query", &cb_last},
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    61
  {NS_PING,   "ping",  &cb_ping},
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    62
  {NS_VCARD,  "vCard", &cb_vcard},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    63
  {NULL, NULL, NULL}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
    64
};
1254
401639413340 More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents: 1224
diff changeset
    65
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
    66
// Enum for vCard attributes
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
    67
enum vcard_attr {
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
    68
  vcard_home    = 1<<0,
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
    69
  vcard_work    = 1<<1,
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
    70
  vcard_postal  = 1<<2,
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
    71
  vcard_voice   = 1<<3,
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
    72
  vcard_fax     = 1<<4,
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
    73
  vcard_cell    = 1<<5,
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
    74
  vcard_inet    = 1<<6,
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
    75
  vcard_pref    = 1<<7,
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
    76
};
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    77
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    78
static LmHandlerResult cb_ping(LmMessageHandler *h, LmConnection *c,
1706
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
    79
                               LmMessage *m, gpointer user_data)
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    80
{
1706
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
    81
  struct timeval *timestamp = (struct timeval *)user_data;
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    82
  struct timeval now;
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    83
  time_t         dsec;
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    84
  suseconds_t    dusec;
1706
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
    85
  const gchar    *fjid;
1707
184de76b5b18 Refactor some code
Mikael Berthe <mikael@lilotux.net>
parents: 1706
diff changeset
    86
  gchar          *bjid, *mesg = NULL;
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    87
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    88
  gettimeofday(&now, NULL);
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    89
  dsec = now.tv_sec - timestamp->tv_sec;
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    90
  if (now.tv_usec < timestamp->tv_usec) {
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    91
    dusec = now.tv_usec + 1000000 - timestamp->tv_usec;
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    92
    --dsec;
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    93
  } else
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    94
    dusec = now.tv_usec - timestamp->tv_usec;
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
    95
1706
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
    96
  // Check IQ result sender
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
    97
  fjid = lm_message_get_from(m);
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
    98
  if (!fjid)
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
    99
    fjid = lm_connection_get_jid(lconnection); // No from means our JID...
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
   100
  if (!fjid) {
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
   101
    scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:version result (no sender name).");
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
   102
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
   103
  }
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
   104
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
   105
  bjid  = jidtodisp(fjid);
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
   106
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
   107
  switch (lm_message_get_sub_type(m)) {
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   108
    case LM_MESSAGE_SUB_TYPE_RESULT:
1707
184de76b5b18 Refactor some code
Mikael Berthe <mikael@lilotux.net>
parents: 1706
diff changeset
   109
        mesg = g_strdup_printf("Pong from <%s>: %d second%s %d ms.", fjid,
184de76b5b18 Refactor some code
Mikael Berthe <mikael@lilotux.net>
parents: 1706
diff changeset
   110
                               (int)dsec, dsec > 1 ? "s" : "",
184de76b5b18 Refactor some code
Mikael Berthe <mikael@lilotux.net>
parents: 1706
diff changeset
   111
                               (int)(dusec/1000L));
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   112
        break;
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   113
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   114
    case LM_MESSAGE_SUB_TYPE_ERROR:
1800
d2747442918a When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents: 1729
diff changeset
   115
        display_server_error(lm_message_node_get_child(m->node, "error"),
d2747442918a When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents: 1729
diff changeset
   116
                             fjid);
1707
184de76b5b18 Refactor some code
Mikael Berthe <mikael@lilotux.net>
parents: 1706
diff changeset
   117
        mesg = g_strdup_printf("Ping to <%s> failed.  "
184de76b5b18 Refactor some code
Mikael Berthe <mikael@lilotux.net>
parents: 1706
diff changeset
   118
                               "Response time: %d second%s %d ms.",
184de76b5b18 Refactor some code
Mikael Berthe <mikael@lilotux.net>
parents: 1706
diff changeset
   119
                               fjid, (int)dsec, dsec > 1 ? "s" : "",
184de76b5b18 Refactor some code
Mikael Berthe <mikael@lilotux.net>
parents: 1706
diff changeset
   120
                               (int)(dusec/1000L));
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   121
        break;
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   122
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   123
    default:
1706
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
   124
        g_free(bjid);
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   125
        return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   126
        break;
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   127
  }
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   128
1707
184de76b5b18 Refactor some code
Mikael Berthe <mikael@lilotux.net>
parents: 1706
diff changeset
   129
  if (mesg)
184de76b5b18 Refactor some code
Mikael Berthe <mikael@lilotux.net>
parents: 1706
diff changeset
   130
    scr_WriteIncomingMessage(bjid, mesg, 0, HBB_PREFIX_INFO, 0);
184de76b5b18 Refactor some code
Mikael Berthe <mikael@lilotux.net>
parents: 1706
diff changeset
   131
  g_free(mesg);
1706
a5263e93c5d7 Fix pinging oneself
Mikael Berthe <mikael@lilotux.net>
parents: 1705
diff changeset
   132
  g_free(bjid);
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   133
  return LM_HANDLER_RESULT_REMOVE_MESSAGE;
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   134
}
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   135
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   136
// Warning!! xmlns has to be a namespace from iq_request_handlers[].xmlns
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   137
void xmpp_iq_request(const char *fulljid, const char *xmlns)
1215
80c095886fb5 Entity Capabilities support (XEP-0115)
Mikael Berthe <mikael@lilotux.net>
parents: 1213
diff changeset
   138
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   139
  LmMessage *iq;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   140
  LmMessageNode *query;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   141
  LmMessageHandler *handler;
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   142
  gpointer data = NULL;
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   143
  GDestroyNotify notifier = NULL;
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   144
  GError *error = NULL;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   145
  int i;
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   146
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   147
  iq = lm_message_new_with_sub_type(fulljid, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   148
                                    LM_MESSAGE_SUB_TYPE_GET);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   149
  for (i = 0; strcmp(iq_request_handlers[i].xmlns, xmlns) != 0 ; ++i)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   150
       ;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   151
  query = lm_message_node_add_child(iq->node,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   152
                                    iq_request_handlers[i].querytag,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   153
                                    NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   154
  lm_message_node_set_attribute(query, "xmlns", xmlns);
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   155
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   156
  if (!g_strcmp0(xmlns, NS_PING)) {     // Create handler for ping queries
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   157
    struct timeval *now = g_new(struct timeval, 1);
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   158
    gettimeofday(now, NULL);
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   159
    data = (gpointer)now;
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   160
    notifier = g_free;
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   161
  }
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   162
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   163
  handler = lm_message_handler_new(iq_request_handlers[i].handler,
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   164
                                   data, notifier);
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   165
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   166
  lm_connection_send_with_reply(lconnection, iq, handler, &error);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   167
  lm_message_handler_unref(handler);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   168
  lm_message_unref(iq);
1705
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   169
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   170
  if (error) {
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   171
    scr_LogPrint(LPRINT_LOGNORM, "Error sending IQ request: %s.", error->message);
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   172
    g_error_free(error);
ac881b5f9248 Add /request ping (XEP-0199), by merging isbear's module
Mikael Berthe <mikael@lilotux.net>
parents: 1703
diff changeset
   173
  }
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   174
}
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   175
1353
7caedca15e50 Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents: 1348
diff changeset
   176
//  This callback is reached when mcabber receives the first roster update
7caedca15e50 Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents: 1348
diff changeset
   177
// after the connection.
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   178
static LmHandlerResult cb_roster(LmMessageHandler *h, LmConnection *c,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   179
                                 LmMessage *m, gpointer user_data)
1353
7caedca15e50 Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents: 1348
diff changeset
   180
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   181
  LmMessageNode *x;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   182
  const char *ns;
1353
7caedca15e50 Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents: 1348
diff changeset
   183
7caedca15e50 Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents: 1348
diff changeset
   184
  // Only execute the hook if the roster has been successfully retrieved
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   185
  if (lm_message_get_sub_type(m) != LM_MESSAGE_SUB_TYPE_RESULT)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   186
    return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
1353
7caedca15e50 Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents: 1348
diff changeset
   187
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   188
  x = lm_message_node_find_child(m->node, "query");
1353
7caedca15e50 Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents: 1348
diff changeset
   189
  if (!x)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   190
    return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
1365
c7e709719c43 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1361
diff changeset
   191
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   192
  ns = lm_message_node_get_attribute(x, "xmlns");
1365
c7e709719c43 Small code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1361
diff changeset
   193
  if (ns && !strcmp(ns, NS_ROSTER))
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   194
    handle_iq_roster(NULL, c, m, user_data);
1353
7caedca15e50 Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents: 1348
diff changeset
   195
7caedca15e50 Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents: 1348
diff changeset
   196
  // Post-login stuff
1683
b09f82f61745 Split HOOK_INTERNAL
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1668
diff changeset
   197
  hk_postconnect();
1353
7caedca15e50 Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents: 1348
diff changeset
   198
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   199
  return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1353
7caedca15e50 Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents: 1348
diff changeset
   200
}
7caedca15e50 Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents: 1348
diff changeset
   201
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   202
static LmHandlerResult cb_version(LmMessageHandler *h, LmConnection *c,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   203
                                  LmMessage *m, gpointer user_data)
1353
7caedca15e50 Add post-connect internal hook
Mikael Berthe <mikael@lilotux.net>
parents: 1348
diff changeset
   204
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   205
  LmMessageNode *ansqry;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   206
  const char *p, *bjid;
1703
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   207
  char *buf, *tmp;
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   208
1703
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   209
  // Check IQ result sender
1698
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   210
  bjid = lm_message_get_from(m);
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   211
  if (!bjid)
1699
527c965b45c5 Add small comment in previous change
Mikael Berthe <mikael@lilotux.net>
parents: 1698
diff changeset
   212
    bjid = lm_connection_get_jid(lconnection); // No from means our JID...
1698
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   213
  if (!bjid) {
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   214
    scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:version result (no sender name).");
1698
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   215
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   216
  }
704
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   217
1703
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   218
  // Check for error message
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   219
  if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_ERROR) {
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   220
    scr_LogPrint(LPRINT_LOGNORM, "Received error IQ message (%s)", bjid);
1800
d2747442918a When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents: 1729
diff changeset
   221
    display_server_error(lm_message_node_get_child(m->node, "error"), NULL);
1703
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   222
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   223
  }
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   224
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   225
  // Check message contents
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   226
  ansqry = lm_message_node_get_child(m->node, "query");
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   227
  if (!ansqry) {
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   228
    scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:version result from <%s>!", bjid);
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   229
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   230
  }
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   231
782
19121d9f4aa2 Nicer message when receiving IQ result packet
Mikael Berthe <mikael@lilotux.net>
parents: 776
diff changeset
   232
  buf = g_strdup_printf("Received IQ:version result from <%s>", bjid);
704
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   233
  scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   234
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   235
  // bjid should now really be the "bare JID", let's strip the resource
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   236
  tmp = strchr(bjid, JID_RESOURCE_SEPARATOR);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   237
  if (tmp) *tmp = '\0';
704
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   238
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1283
diff changeset
   239
  scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO, 0);
704
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   240
  g_free(buf);
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   241
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   242
  // Get result data...
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   243
  p = lm_message_node_get_child_value(ansqry, "name");
1899
decf94827efe More lm_message_node_get_child_value() return value checks
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
   244
  if (p && *p) {
1030
923cf5a92b44 [BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 965
diff changeset
   245
    buf = g_strdup_printf("Name:    %s", p);
1333
e30a9d907105 Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents: 1310
diff changeset
   246
    scr_WriteIncomingMessage(bjid, buf,
e30a9d907105 Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents: 1310
diff changeset
   247
                             0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
1030
923cf5a92b44 [BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 965
diff changeset
   248
    g_free(buf);
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   249
  }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   250
  p = lm_message_node_get_child_value(ansqry, "version");
1899
decf94827efe More lm_message_node_get_child_value() return value checks
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
   251
  if (p && *p) {
1030
923cf5a92b44 [BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 965
diff changeset
   252
    buf = g_strdup_printf("Version: %s", p);
1333
e30a9d907105 Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents: 1310
diff changeset
   253
    scr_WriteIncomingMessage(bjid, buf,
e30a9d907105 Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents: 1310
diff changeset
   254
                             0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
1030
923cf5a92b44 [BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 965
diff changeset
   255
    g_free(buf);
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   256
  }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   257
  p = lm_message_node_get_child_value(ansqry, "os");
1899
decf94827efe More lm_message_node_get_child_value() return value checks
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
   258
  if (p && *p) {
1030
923cf5a92b44 [BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 965
diff changeset
   259
    buf = g_strdup_printf("OS:      %s", p);
1333
e30a9d907105 Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents: 1310
diff changeset
   260
    scr_WriteIncomingMessage(bjid, buf,
e30a9d907105 Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents: 1310
diff changeset
   261
                             0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
1030
923cf5a92b44 [BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 965
diff changeset
   262
    g_free(buf);
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   263
  }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   264
  return LM_HANDLER_RESULT_REMOVE_MESSAGE;
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   265
}
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   266
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   267
static LmHandlerResult cb_time(LmMessageHandler *h, LmConnection *c,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   268
                               LmMessage *m, gpointer user_data)
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   269
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   270
  LmMessageNode *ansqry;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   271
  const char *p, *bjid;
1703
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   272
  char *buf, *tmp;
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   273
1703
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   274
  // Check IQ result sender
1698
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   275
  bjid = lm_message_get_from(m);
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   276
  if (!bjid)
1699
527c965b45c5 Add small comment in previous change
Mikael Berthe <mikael@lilotux.net>
parents: 1698
diff changeset
   277
    bjid = lm_connection_get_jid(lconnection); // No from means our JID...
1698
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   278
  if (!bjid) {
1703
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   279
    scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:time result (no sender name).");
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   280
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   281
  }
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   282
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   283
  // Check for error message
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   284
  if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_ERROR) {
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   285
    scr_LogPrint(LPRINT_LOGNORM, "Received error IQ message (%s)", bjid);
1800
d2747442918a When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents: 1729
diff changeset
   286
    display_server_error(lm_message_node_get_child(m->node, "error"), NULL);
1703
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   287
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   288
  }
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   289
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   290
  // Check message contents
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   291
  ansqry = lm_message_node_get_child(m->node, "query");
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   292
  if (!ansqry) {
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   293
    scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:time result from <%s>!", bjid);
1698
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   294
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   295
  }
704
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   296
782
19121d9f4aa2 Nicer message when receiving IQ result packet
Mikael Berthe <mikael@lilotux.net>
parents: 776
diff changeset
   297
  buf = g_strdup_printf("Received IQ:time result from <%s>", bjid);
704
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   298
  scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   299
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   300
  // bjid should now really be the "bare JID", let's strip the resource
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   301
  tmp = strchr(bjid, JID_RESOURCE_SEPARATOR);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   302
  if (tmp) *tmp = '\0';
704
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   303
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1283
diff changeset
   304
  scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO, 0);
704
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   305
  g_free(buf);
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   306
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   307
  // Get result data...
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   308
  p = lm_message_node_get_child_value(ansqry, "utc");
1899
decf94827efe More lm_message_node_get_child_value() return value checks
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
   309
  if (p && *p) {
1030
923cf5a92b44 [BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 965
diff changeset
   310
    buf = g_strdup_printf("UTC:  %s", p);
1333
e30a9d907105 Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents: 1310
diff changeset
   311
    scr_WriteIncomingMessage(bjid, buf,
e30a9d907105 Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents: 1310
diff changeset
   312
                             0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
1030
923cf5a92b44 [BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 965
diff changeset
   313
    g_free(buf);
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   314
  }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   315
  p = lm_message_node_get_child_value(ansqry, "tz");
1899
decf94827efe More lm_message_node_get_child_value() return value checks
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
   316
  if (p && *p) {
1030
923cf5a92b44 [BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 965
diff changeset
   317
    buf = g_strdup_printf("TZ:   %s", p);
1333
e30a9d907105 Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents: 1310
diff changeset
   318
    scr_WriteIncomingMessage(bjid, buf,
e30a9d907105 Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents: 1310
diff changeset
   319
                             0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
1030
923cf5a92b44 [BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 965
diff changeset
   320
    g_free(buf);
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   321
  }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   322
  p = lm_message_node_get_child_value(ansqry, "display");
1899
decf94827efe More lm_message_node_get_child_value() return value checks
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
   323
  if (p && *p) {
1030
923cf5a92b44 [BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 965
diff changeset
   324
    buf = g_strdup_printf("Time: %s", p);
1333
e30a9d907105 Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents: 1310
diff changeset
   325
    scr_WriteIncomingMessage(bjid, buf,
e30a9d907105 Minor coding style adjustments
Mikael Berthe <mikael@lilotux.net>
parents: 1310
diff changeset
   326
                             0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
1030
923cf5a92b44 [BP-dd9e7eb5f8a8] Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 965
diff changeset
   327
    g_free(buf);
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   328
  }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   329
  return LM_HANDLER_RESULT_REMOVE_MESSAGE;
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   330
}
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   331
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   332
static LmHandlerResult cb_last(LmMessageHandler *h, LmConnection *c,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   333
                               LmMessage *m, gpointer user_data)
1015
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   334
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   335
  LmMessageNode *ansqry;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   336
  const char *p, *bjid;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   337
  char *buf, *tmp;
1015
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   338
1703
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   339
  // Check IQ result sender
1698
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   340
  bjid = lm_message_get_from(m);
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   341
  if (!bjid)
1699
527c965b45c5 Add small comment in previous change
Mikael Berthe <mikael@lilotux.net>
parents: 1698
diff changeset
   342
    bjid = lm_connection_get_jid(lconnection); // No from means our JID...
1698
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   343
  if (!bjid) {
1703
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   344
    scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:last result (no sender name).");
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   345
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   346
  }
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   347
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   348
  // Check for error message
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   349
  if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_ERROR) {
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   350
    scr_LogPrint(LPRINT_LOGNORM, "Received error IQ message (%s)", bjid);
1800
d2747442918a When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents: 1729
diff changeset
   351
    display_server_error(lm_message_node_get_child(m->node, "error"), NULL);
1703
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   352
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   353
  }
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   354
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   355
  // Check message contents
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   356
  ansqry = lm_message_node_get_child(m->node, "query");
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   357
  if (!ansqry) {
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   358
    scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:version result from <%s>!", bjid);
1698
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   359
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1015
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   360
  }
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   361
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   362
  buf = g_strdup_printf("Received IQ:last result from <%s>", bjid);
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   363
  scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   364
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   365
  // bjid should now really be the "bare JID", let's strip the resource
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   366
  tmp = strchr(bjid, JID_RESOURCE_SEPARATOR);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   367
  if (tmp) *tmp = '\0';
1015
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   368
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1283
diff changeset
   369
  scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO, 0);
1015
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   370
  g_free(buf);
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   371
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   372
  // Get result data...
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   373
  p = lm_message_node_get_attribute(ansqry, "seconds");
1015
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   374
  if (p) {
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   375
    long int s;
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   376
    GString *sbuf;
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   377
    sbuf = g_string_new("Idle time: ");
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   378
    s = atol(p);
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   379
    // Days
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   380
    if (s > 86400L) {
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   381
      g_string_append_printf(sbuf, "%ldd ", s/86400L);
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   382
      s %= 86400L;
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   383
    }
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   384
    // hh:mm:ss
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   385
    g_string_append_printf(sbuf, "%02ld:", s/3600L);
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   386
    s %= 3600L;
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   387
    g_string_append_printf(sbuf, "%02ld:%02ld", s/60L, s%60L);
1268
dbc907b2d92f Add configurable colors for info and incoming messages (Michal 'vorner' Vaner)
Mikael Berthe <mikael@lilotux.net>
parents: 1261
diff changeset
   388
    scr_WriteIncomingMessage(bjid, sbuf->str,
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1283
diff changeset
   389
                             0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
1015
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   390
    g_string_free(sbuf, TRUE);
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   391
  } else {
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   392
    scr_WriteIncomingMessage(bjid, "No idle time reported.",
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1283
diff changeset
   393
                             0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
1015
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   394
  }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   395
  p = lm_message_node_get_value(ansqry);
1015
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   396
  if (p) {
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   397
    buf = g_strdup_printf("Status message: %s", p);
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1283
diff changeset
   398
    scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO, 0);
1015
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   399
    g_free(buf);
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   400
  }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   401
  return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1015
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   402
}
579299b1c9b2 Add /request last
Mikael Berthe <mikael@lilotux.net>
parents: 1014
diff changeset
   403
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   404
static void display_vcard_item(const char *bjid, const char *label,
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   405
                               enum vcard_attr vcard_attrib, const char *text)
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   406
{
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   407
  char *buf;
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   408
1899
decf94827efe More lm_message_node_get_child_value() return value checks
Mikael Berthe <mikael@lilotux.net>
parents: 1811
diff changeset
   409
  if (!text || !*text || !bjid || !label)
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   410
    return;
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   411
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   412
  buf = g_strdup_printf("%s: %s%s%s%s%s%s%s%s%s%s", label,
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   413
                        (vcard_attrib & vcard_home ? "[home]" : ""),
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   414
                        (vcard_attrib & vcard_work ? "[work]" : ""),
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   415
                        (vcard_attrib & vcard_postal ? "[postal]" : ""),
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   416
                        (vcard_attrib & vcard_voice ? "[voice]" : ""),
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   417
                        (vcard_attrib & vcard_fax  ? "[fax]"  : ""),
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   418
                        (vcard_attrib & vcard_cell ? "[cell]" : ""),
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   419
                        (vcard_attrib & vcard_inet ? "[inet]" : ""),
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   420
                        (vcard_attrib & vcard_pref ? "[pref]" : ""),
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   421
                        (vcard_attrib ? " " : ""),
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   422
                        text);
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1283
diff changeset
   423
  scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO | HBB_PREFIX_CONT, 0);
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   424
  g_free(buf);
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   425
}
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   426
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   427
static void handle_vcard_node(const char *barejid, LmMessageNode *vcardnode)
1003
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   428
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   429
  LmMessageNode *x;
1003
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   430
  const char *p;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   431
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   432
  for (x = vcardnode->children ; x; x = x->next) {
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   433
    const char *data;
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   434
    enum vcard_attr vcard_attrib = 0;
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   435
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   436
    p = x->name;
1719
f3c5e1175b22 Remove buggy check in handle_vcard_node() (Reported by Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1707
diff changeset
   437
    if (!p)
f3c5e1175b22 Remove buggy check in handle_vcard_node() (Reported by Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1707
diff changeset
   438
      continue;
f3c5e1175b22 Remove buggy check in handle_vcard_node() (Reported by Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1707
diff changeset
   439
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   440
    data = lm_message_node_get_value(x);
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   441
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   442
    if (!strcmp(p, "FN"))
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   443
      display_vcard_item(barejid, "Name", vcard_attrib, data);
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   444
    else if (!strcmp(p, "NICKNAME"))
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   445
      display_vcard_item(barejid, "Nickname", vcard_attrib, data);
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   446
    else if (!strcmp(p, "URL"))
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   447
      display_vcard_item(barejid, "URL", vcard_attrib, data);
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   448
    else if (!strcmp(p, "BDAY"))
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   449
      display_vcard_item(barejid, "Birthday", vcard_attrib, data);
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   450
    else if (!strcmp(p, "TZ"))
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   451
      display_vcard_item(barejid, "Timezone", vcard_attrib, data);
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   452
    else if (!strcmp(p, "TITLE"))
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   453
      display_vcard_item(barejid, "Title", vcard_attrib, data);
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   454
    else if (!strcmp(p, "ROLE"))
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   455
      display_vcard_item(barejid, "Role", vcard_attrib, data);
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   456
    else if (!strcmp(p, "DESC"))
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   457
      display_vcard_item(barejid, "Comment", vcard_attrib, data);
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   458
    else if (!strcmp(p, "N")) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   459
      data = lm_message_node_get_child_value(x, "FAMILY");
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   460
      display_vcard_item(barejid, "Family Name", vcard_attrib, data);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   461
      data = lm_message_node_get_child_value(x, "GIVEN");
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   462
      display_vcard_item(barejid, "Given Name", vcard_attrib, data);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   463
      data = lm_message_node_get_child_value(x, "MIDDLE");
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   464
      display_vcard_item(barejid, "Middle Name", vcard_attrib, data);
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   465
    } else if (!strcmp(p, "ORG")) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   466
      data = lm_message_node_get_child_value(x, "ORGNAME");
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   467
      display_vcard_item(barejid, "Organisation name", vcard_attrib, data);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   468
      data = lm_message_node_get_child_value(x, "ORGUNIT");
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   469
      display_vcard_item(barejid, "Organisation unit", vcard_attrib, data);
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   470
    } else {
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   471
      // The HOME, WORK and PREF attributes are common to the remaining fields
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   472
      // (ADR, TEL & EMAIL)
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   473
      if (lm_message_node_get_child(x, "HOME"))
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   474
        vcard_attrib |= vcard_home;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   475
      if (lm_message_node_get_child(x, "WORK"))
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   476
        vcard_attrib |= vcard_work;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   477
      if (lm_message_node_get_child(x, "PREF"))
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   478
        vcard_attrib |= vcard_pref;
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   479
      if (!strcmp(p, "ADR")) {          // Address
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   480
        if (lm_message_node_get_child(x, "POSTAL"))
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   481
          vcard_attrib |= vcard_postal;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   482
        data = lm_message_node_get_child_value(x, "EXTADD");
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   483
        display_vcard_item(barejid, "Addr (ext)", vcard_attrib, data);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   484
        data = lm_message_node_get_child_value(x, "STREET");
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   485
        display_vcard_item(barejid, "Street", vcard_attrib, data);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   486
        data = lm_message_node_get_child_value(x, "LOCALITY");
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   487
        display_vcard_item(barejid, "Locality", vcard_attrib, data);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   488
        data = lm_message_node_get_child_value(x, "REGION");
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   489
        display_vcard_item(barejid, "Region", vcard_attrib, data);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   490
        data = lm_message_node_get_child_value(x, "PCODE");
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   491
        display_vcard_item(barejid, "Postal code", vcard_attrib, data);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   492
        data = lm_message_node_get_child_value(x, "CTRY");
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   493
        display_vcard_item(barejid, "Country", vcard_attrib, data);
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   494
      } else if (!strcmp(p, "TEL")) {   // Telephone
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   495
        data = lm_message_node_get_child_value(x, "NUMBER");
1005
e5c10cc29660 Improve vcard support
Mikael Berthe <mikael@lilotux.net>
parents: 1004
diff changeset
   496
        if (data) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   497
          if (lm_message_node_get_child(x, "VOICE"))
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   498
            vcard_attrib |= vcard_voice;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   499
          if (lm_message_node_get_child(x, "FAX"))
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   500
            vcard_attrib |= vcard_fax;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   501
          if (lm_message_node_get_child(x, "CELL"))
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   502
            vcard_attrib |= vcard_cell;
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   503
          display_vcard_item(barejid, "Phone", vcard_attrib, data);
1005
e5c10cc29660 Improve vcard support
Mikael Berthe <mikael@lilotux.net>
parents: 1004
diff changeset
   504
        }
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   505
      } else if (!strcmp(p, "EMAIL")) { // Email
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   506
        if (lm_message_node_get_child(x, "INTERNET"))
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   507
          vcard_attrib |= vcard_inet;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   508
        data = lm_message_node_get_child_value(x, "USERID");
1006
f61131cd86a0 Clean up vcard code
Mikael Berthe <mikael@lilotux.net>
parents: 1005
diff changeset
   509
        display_vcard_item(barejid, "Email", vcard_attrib, data);
1003
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   510
      }
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   511
    }
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   512
  }
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   513
}
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   514
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   515
static LmHandlerResult cb_vcard(LmMessageHandler *h, LmConnection *c,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   516
                               LmMessage *m, gpointer user_data)
1003
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   517
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   518
  LmMessageNode *ansqry;
1698
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   519
  const char *bjid;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   520
  char *buf, *tmp;
1003
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   521
1703
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   522
  // Check IQ result sender
1698
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   523
  bjid = lm_message_get_from(m);
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   524
  if (!bjid)
1699
527c965b45c5 Add small comment in previous change
Mikael Berthe <mikael@lilotux.net>
parents: 1698
diff changeset
   525
    bjid = lm_connection_get_jid(lconnection); // No from means our JID...
1698
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   526
  if (!bjid) {
1703
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   527
    scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:vCard result (no sender name).");
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   528
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   529
  }
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   530
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   531
  // Check for error message
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   532
  if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_ERROR) {
65ba89949252 Improve error checks in received IQ responses
Mikael Berthe <mikael@lilotux.net>
parents: 1699
diff changeset
   533
    scr_LogPrint(LPRINT_LOGNORM, "Received error IQ message (%s)", bjid);
1800
d2747442918a When displaying a server error, show the sender JID
Mikael Berthe <mikael@lilotux.net>
parents: 1729
diff changeset
   534
    display_server_error(lm_message_node_get_child(m->node, "error"), NULL);
1698
e67bdd863638 Handle IQ responses with no "from"
Mikael Berthe <mikael@lilotux.net>
parents: 1683
diff changeset
   535
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1003
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   536
  }
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   537
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   538
  buf = g_strdup_printf("Received IQ:vCard result from <%s>", bjid);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   539
  scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   540
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   541
  // Get the vCard node
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   542
  ansqry = lm_message_node_get_child(m->node, "vCard");
1003
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   543
  if (!ansqry) {
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   544
    scr_LogPrint(LPRINT_LOGNORM, "Empty IQ:vCard result!");
1340
2031f4b2cced Fix a small memory leak
Mikael Berthe <mikael@lilotux.net>
parents: 1334
diff changeset
   545
    g_free(buf);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   546
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1003
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   547
  }
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   548
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   549
  // bjid should really be the "bare JID", let's strip the resource
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   550
  tmp = strchr(bjid, JID_RESOURCE_SEPARATOR);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   551
  if (tmp) *tmp = '\0';
1003
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   552
1290
e42f48103609 Drawing the MUC nicks by a different color
Michal 'vorner' Vaner <vorner@ucw.cz>
parents: 1283
diff changeset
   553
  scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO, 0);
1003
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   554
  g_free(buf);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   555
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   556
  // Get result data...
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   557
  handle_vcard_node(bjid, ansqry);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   558
  return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1003
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   559
}
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   560
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   561
static void storage_bookmarks_parse_conference(LmMessageNode *node)
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   562
{
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1037
diff changeset
   563
  const char *fjid, *name, *autojoin;
1979
6febc7d1f760 Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1976
diff changeset
   564
  const char *pstatus, *awhois, *fjoins, *group;
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   565
  char *bjid;
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   566
  GSList *room_elt;
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   567
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   568
  fjid = lm_message_node_get_attribute(node, "jid");
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1037
diff changeset
   569
  if (!fjid)
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   570
    return;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   571
  name = lm_message_node_get_attribute(node, "name");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   572
  autojoin = lm_message_node_get_attribute(node, "autojoin");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   573
  awhois = lm_message_node_get_attribute(node, "autowhois");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   574
  pstatus = lm_message_node_get_child_value(node, "print_status");
1979
6febc7d1f760 Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1976
diff changeset
   575
  fjoins = lm_message_node_get_child_value(node, "flag_joins");
1976
e6beab22099b Do not add items to roster with commands /move and /rename (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1899
diff changeset
   576
  group = lm_message_node_get_child_value(node, "group");
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   577
1058
c0d44a9a99bc Code cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 1037
diff changeset
   578
  bjid = jidtodisp(fjid); // Bare jid
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   579
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   580
  // Make sure this is a room (it can be a conversion user->room)
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   581
  room_elt = roster_find(bjid, jidsearch, 0);
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   582
  if (!room_elt) {
1976
e6beab22099b Do not add items to roster with commands /move and /rename (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1899
diff changeset
   583
    room_elt = roster_add_user(bjid, name, group, ROSTER_TYPE_ROOM,
1355
9716cf8a0726 Add on_server flag
Mikael Berthe <mikael@lilotux.net>
parents: 1353
diff changeset
   584
                               sub_none, -1);
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   585
  } else {
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   586
    buddy_settype(room_elt->data, ROSTER_TYPE_ROOM);
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   587
    /*
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   588
    // If the name is available, should we use it?
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   589
    // I don't think so, it would be confusing because this item is already
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   590
    // in the roster.
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   591
    if (name)
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   592
      buddy_setname(room_elt->data, name);
1976
e6beab22099b Do not add items to roster with commands /move and /rename (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1899
diff changeset
   593
e6beab22099b Do not add items to roster with commands /move and /rename (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1899
diff changeset
   594
    // The same question for roster group.
e6beab22099b Do not add items to roster with commands /move and /rename (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1899
diff changeset
   595
    if (group)
e6beab22099b Do not add items to roster with commands /move and /rename (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1899
diff changeset
   596
      buddy_setgroup(room_elt->data, group);
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   597
    */
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   598
  }
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   599
1379
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   600
  // Set the print_status and auto_whois values
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   601
  if (pstatus) {
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   602
    enum room_printstatus i;
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   603
    for (i = status_none; i <= status_all; i++)
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   604
      if (!strcasecmp(pstatus, strprintstatus[i]))
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   605
        break;
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   606
    if (i <= status_all)
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   607
      buddy_setprintstatus(room_elt->data, i);
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   608
  }
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   609
  if (awhois) {
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   610
    enum room_autowhois i = autowhois_default;
1976
e6beab22099b Do not add items to roster with commands /move and /rename (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1899
diff changeset
   611
    if (!strcmp(awhois, "1") || !(strcmp(awhois, "true")))
1379
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   612
      i = autowhois_on;
1976
e6beab22099b Do not add items to roster with commands /move and /rename (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1899
diff changeset
   613
    else if (!strcmp(awhois, "0") || !(strcmp(awhois, "false")))
1379
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   614
      i = autowhois_off;
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   615
    if (i != autowhois_default)
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   616
      buddy_setautowhois(room_elt->data, i);
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   617
  }
1979
6febc7d1f760 Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1976
diff changeset
   618
  if (fjoins) {
6febc7d1f760 Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1976
diff changeset
   619
    enum room_flagjoins i;
6febc7d1f760 Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1976
diff changeset
   620
    for (i = flagjoins_none; i <= flagjoins_all; i++)
6febc7d1f760 Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1976
diff changeset
   621
      if (!strcasecmp(fjoins, strflagjoins[i]))
6febc7d1f760 Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1976
diff changeset
   622
        break;
6febc7d1f760 Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1976
diff changeset
   623
    if (i <= flagjoins_all)
6febc7d1f760 Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1976
diff changeset
   624
      buddy_setflagjoins(room_elt->data, i);
6febc7d1f760 Add /room setopt flag_joins (Hermitifier)
Mikael Berthe <mikael@lilotux.net>
parents: 1976
diff changeset
   625
  }
1379
74b7621537d7 MUC: Store room settings (print_status, auto_whois) in private storage
Mikael Berthe <mikael@lilotux.net>
parents: 1365
diff changeset
   626
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   627
  // Is autojoin set?
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   628
  // If it is, we'll look up for more information (nick? password?) and
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   629
  // try to join the room.
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   630
  if (autojoin && !strcmp(autojoin, "1")) {
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   631
    const char *nick, *passwd;
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   632
    char *tmpnick = NULL;
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   633
    nick = lm_message_node_get_child_value(node, "nick");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   634
    passwd = lm_message_node_get_child_value(node, "password");
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   635
    if (!nick || !*nick)
1395
d431cd75eb53 Use bookmarked nickname when manually joining a room
Mikael Berthe <mikael@lilotux.net>
parents: 1393
diff changeset
   636
      nick = tmpnick = default_muc_nickname(NULL);
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   637
    // Let's join now
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   638
    scr_LogPrint(LPRINT_LOGNORM, "Auto-join bookmark <%s>", bjid);
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   639
    xmpp_room_join(bjid, nick, passwd);
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   640
    g_free(tmpnick);
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   641
  }
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   642
  g_free(bjid);
1983
45e0b13a39e2 Refresh the roster when MUC bookmarks are received
Jan Zachorowski <quantifier666@gmail.com>
parents: 1979
diff changeset
   643
45e0b13a39e2 Refresh the roster when MUC bookmarks are received
Jan Zachorowski <quantifier666@gmail.com>
parents: 1979
diff changeset
   644
  buddylist_build();
45e0b13a39e2 Refresh the roster when MUC bookmarks are received
Jan Zachorowski <quantifier666@gmail.com>
parents: 1979
diff changeset
   645
  update_roster = TRUE;
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   646
}
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   647
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   648
static LmHandlerResult cb_storage_bookmarks(LmMessageHandler *h,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   649
                                            LmConnection *c,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   650
                                            LmMessage *m, gpointer user_data)
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   651
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   652
  LmMessageNode *x, *ansqry;
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   653
  char *p;
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   654
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   655
  if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_ERROR) {
1213
4a7db2870685 Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
   656
    // No server support, or no bookmarks?
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   657
    p = m->node->children->name;
1213
4a7db2870685 Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
   658
    if (p && !strcmp(p, "item-not-found")) {
4a7db2870685 Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
   659
      // item-no-found means the server has Private Storage, but it's
4a7db2870685 Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
   660
      // currently empty.
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   661
      if (bookmarks)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   662
        lm_message_node_unref(bookmarks);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   663
      bookmarks = lm_message_node_new("storage", "storage:bookmarks");
1213
4a7db2870685 Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
   664
      // We return 0 so that the IQ error message be
4a7db2870685 Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
   665
      // not displayed, as it isn't a real error.
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   666
      return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1213
4a7db2870685 Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
   667
    }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   668
    return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; // Unhandled error
1213
4a7db2870685 Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
   669
  }
4a7db2870685 Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
   670
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   671
  ansqry = lm_message_node_get_child(m->node, "query");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   672
  ansqry = lm_message_node_get_child(ansqry, "storage");
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   673
  if (!ansqry) {
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   674
    scr_LogPrint(LPRINT_LOG, "Invalid IQ:private result! (storage:bookmarks)");
1213
4a7db2870685 Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
   675
    return 0;
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   676
  }
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   677
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   678
  // Walk through the storage tags
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   679
  for (x = ansqry->children ; x; x = x->next) {
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   680
    // If the current node is a conference item, parse it and update the roster
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   681
    if (x->name && !strcmp(x->name, "conference"))
1004
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   682
      storage_bookmarks_parse_conference(x);
b57a01ffeed6 Use existing conference bookmarks
Mikael Berthe <mikael@lilotux.net>
parents: 1003
diff changeset
   683
  }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   684
  // "Copy" the bookmarks node
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   685
  if (bookmarks)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   686
    lm_message_node_unref(bookmarks);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   687
  lm_message_node_deep_ref(ansqry);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   688
  bookmarks = ansqry;
1213
4a7db2870685 Improve Private Storage detection.
Mikael Berthe <mikael@lilotux.net>
parents: 1205
diff changeset
   689
  return 0;
686
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   690
}
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   691
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   692
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   693
static LmHandlerResult cb_storage_rosternotes(LmMessageHandler *h,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   694
                                              LmConnection *c,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   695
                                              LmMessage *m, gpointer user_data)
1261
704adf4df2d0 Send service-unavailable when Last Activity is disabled
Mikael Berthe <mikael@lilotux.net>
parents: 1255
diff changeset
   696
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   697
  LmMessageNode *ansqry;
1158
c30c315dc447 XEP-0146 support (Remote Controlling Clients)
misc@mandriva.org
parents: 1134
diff changeset
   698
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   699
  if (lm_message_get_sub_type(m) == LM_MESSAGE_SUB_TYPE_ERROR) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   700
    const char *p;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   701
    // No server support, or no roster notes?
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   702
    p = m->node->children->name;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   703
    if (p && !strcmp(p, "item-not-found")) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   704
      // item-no-found means the server has Private Storage, but it's
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   705
      // currently empty.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   706
      if (rosternotes)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   707
        lm_message_node_unref(rosternotes);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   708
      rosternotes = lm_message_node_new("storage", "storage:rosternotes");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   709
      // We return 0 so that the IQ error message be
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   710
      // not displayed, as it isn't a real error.
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   711
      return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1158
c30c315dc447 XEP-0146 support (Remote Controlling Clients)
misc@mandriva.org
parents: 1134
diff changeset
   712
    }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   713
    return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; // Unhandled error
1158
c30c315dc447 XEP-0146 support (Remote Controlling Clients)
misc@mandriva.org
parents: 1134
diff changeset
   714
  }
c30c315dc447 XEP-0146 support (Remote Controlling Clients)
misc@mandriva.org
parents: 1134
diff changeset
   715
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   716
  ansqry = lm_message_node_get_child(m->node, "query");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   717
  ansqry = lm_message_node_get_child(ansqry, "storage");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   718
  if (!ansqry) {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   719
    scr_LogPrint(LPRINT_LOG, "Invalid IQ:private result! "
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   720
                 "(storage:rosternotes)");
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   721
    return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1158
c30c315dc447 XEP-0146 support (Remote Controlling Clients)
misc@mandriva.org
parents: 1134
diff changeset
   722
  }
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   723
  // Copy the rosternotes node
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   724
  if (rosternotes)
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   725
    lm_message_node_unref(rosternotes);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   726
  lm_message_node_deep_ref(ansqry);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   727
  rosternotes = ansqry;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   728
  return 0;
1158
c30c315dc447 XEP-0146 support (Remote Controlling Clients)
misc@mandriva.org
parents: 1134
diff changeset
   729
}
c30c315dc447 XEP-0146 support (Remote Controlling Clients)
misc@mandriva.org
parents: 1134
diff changeset
   730
995
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   731
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   732
static struct IqRequestStorageHandlers
1254
401639413340 More jabber:iq:last support... (misc)
Mikael Berthe <mikael@lilotux.net>
parents: 1224
diff changeset
   733
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   734
  const gchar *storagens;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   735
  LmHandleMessageFunction handler;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   736
} iq_request_storage_handlers[] = {
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   737
  {"storage:rosternotes", &cb_storage_rosternotes},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   738
  {"storage:bookmarks", &cb_storage_bookmarks},
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   739
  {NULL, NULL}
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   740
};
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   741
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   742
void xmpp_request_storage(const gchar *storage)
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   743
{
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   744
  LmMessage *iq;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   745
  LmMessageNode *query;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   746
  LmMessageHandler *handler;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   747
  int i;
703
8cbcbff8de7d Fix UTC time in IQ:version queries
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
   748
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   749
  iq = lm_message_new_with_sub_type(NULL, LM_MESSAGE_TYPE_IQ,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   750
                                    LM_MESSAGE_SUB_TYPE_GET);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   751
  query = lm_message_node_add_child(iq->node, "query", NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   752
  lm_message_node_set_attribute(query, "xmlns", NS_PRIVATE);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   753
  lm_message_node_set_attribute(lm_message_node_add_child
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   754
                                (query, "storage", NULL),
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   755
                                "xmlns", storage);
1283
2faf179166f3 Implement XEP-0202 (Entity Time)
Mikael Berthe <mikael@lilotux.net>
parents: 1268
diff changeset
   756
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   757
  for (i = 0;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   758
       strcmp(iq_request_storage_handlers[i].storagens, storage) != 0;
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   759
       ++i) ;
595
0c1d37300862 IQ: send feature-not-implemented error stanzas
Mikael Berthe <mikael@lilotux.net>
parents: 582
diff changeset
   760
1598
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   761
  handler = lm_message_handler_new(iq_request_storage_handlers[i].handler,
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   762
                                   NULL, FALSE);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   763
  lm_connection_send_with_reply(lconnection, iq, handler, NULL);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   764
  lm_message_handler_unref(handler);
a087125d8fc8 Replace libjabber with loudmouth
franky
parents: 1566
diff changeset
   765
  lm_message_unref(iq);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
   766
}
1599
dcd5d4c75199 Update/Add headers
Mikael Berthe <mikael@lilotux.net>
parents: 1598
diff changeset
   767
1811
e6d355e50d7a Update Vim modelines
Mikael Berthe <mikael@lilotux.net>
parents: 1800
diff changeset
   768
/* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2:  For Vim users... */