mcabber/src/jab_iq.c
author Mikael Berthe <mikael@lilotux.net>
Tue, 07 Nov 2006 22:43:17 +0100
changeset 1003 c8b1a52b2fd6
parent 1002 dd9e7eb5f8a8
child 1004 b57a01ffeed6
permissions -rw-r--r--
Initial VCard retrieval support
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
     1
/*
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
     2
 * jab_iq.c     -- Jabber protocol IQ-related fonctions
393
f8f3c7493457 Whitespace cleanup
Mikael Berthe <mikael@lilotux.net>
parents: 387
diff changeset
     3
 *
699
ee03b56b93ee Update Copyright (2006)
Mikael Berthe <mikael@lilotux.net>
parents: 698
diff changeset
     4
 * Copyright (C) 2005, 2006 Mikael Berthe <bmikael@lists.lilotux.net>
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
     5
 * Some parts initially came from the centericq project:
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
     6
 * Copyright (C) 2002-2005 by Konstantin Klyagin <konst@konst.org.ua>
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
     7
 * Some small parts come from the Gaim project <http://gaim.sourceforge.net/>
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
     8
 *
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
     9
 * This program is free software; you can redistribute it and/or modify
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    10
 * it under the terms of the GNU General Public License as published by
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    11
 * the Free Software Foundation; either version 2 of the License, or (at
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    12
 * your option) any later version.
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    13
 *
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    14
 * This program is distributed in the hope that it will be useful, but
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    15
 * WITHOUT ANY WARRANTY; without even the implied warranty of
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    17
 * General Public License for more details.
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    18
 *
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    19
 * You should have received a copy of the GNU General Public License
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    20
 * along with this program; if not, write to the Free Software
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    21
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    22
 * USA
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    23
 */
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    24
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
    25
#include <sys/utsname.h>
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
    26
#include <glib.h>
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
    27
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    28
#include "jabglue.h"
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
    29
#include "jab_priv.h"
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 52
diff changeset
    30
#include "roster.h"
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
    31
#include "utils.h"
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
    32
#include "screen.h"
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
    33
#include "settings.h"
704
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
    34
#include "hbuf.h"
164
faf534be8ff0 [/trunk] Changeset 176 by mikael
mikael
parents: 159
diff changeset
    35
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    36
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    37
static GSList *iqs_list;
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    38
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    39
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    40
//  iqs_new(type, namespace, prefix, timeout)
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    41
// Create a query (GET, SET) IQ structure.  This function should not be used
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    42
// for RESULT packets.
745
413e95f3051a Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents: 705
diff changeset
    43
eviqs *iqs_new(guint8 type, const char *ns, const char *prefix, time_t timeout)
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    44
{
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    45
  static guint iqs_idn;
745
413e95f3051a Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents: 705
diff changeset
    46
  eviqs *new_iqs;
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    47
  time_t now_t;
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    48
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    49
  iqs_idn++;
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    50
745
413e95f3051a Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents: 705
diff changeset
    51
  new_iqs = g_new0(eviqs, 1);
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    52
  time(&now_t);
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    53
  new_iqs->ts_create = now_t;
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    54
  if (timeout)
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    55
    new_iqs->ts_expire = now_t + timeout;
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    56
  new_iqs->type = type;
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    57
  new_iqs->xmldata = jutil_iqnew(type, (char*)ns);
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    58
  if (prefix)
687
426145046b93 Minor format change in IQ id string
Mikael Berthe <mikael@lilotux.net>
parents: 686
diff changeset
    59
    new_iqs->id = g_strdup_printf("%s_%d", prefix, iqs_idn);
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    60
  else
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    61
    new_iqs->id = g_strdup_printf("%d", iqs_idn);
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    62
  xmlnode_put_attrib(new_iqs->xmldata, "id", new_iqs->id);
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    63
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    64
  iqs_list = g_slist_append(iqs_list, new_iqs);
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    65
  return new_iqs;
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    66
}
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    67
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    68
int iqs_del(const char *iqid)
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    69
{
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    70
  GSList *p;
745
413e95f3051a Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents: 705
diff changeset
    71
  eviqs *i;
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    72
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    73
  if (!iqid) return 1;
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    74
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    75
  for (p = iqs_list; p; p = g_slist_next(p)) {
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    76
    i = p->data;
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    77
    if (!strcmp(iqid, i->id))
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    78
      break;
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    79
  }
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    80
  if (p) {
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    81
    g_free(i->id);
774
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
    82
    xmlnode_free(i->xmldata);
46304b773a44 Remove useless checks before g_free() calls
Mikael Berthe <mikael@lilotux.net>
parents: 772
diff changeset
    83
    g_free(i->data);
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    84
    g_free(i);
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    85
    iqs_list = g_slist_remove(iqs_list, p->data);
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    86
    return 0; // Ok, deleted
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    87
  }
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    88
  return -1;  // Not found
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    89
}
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    90
745
413e95f3051a Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents: 705
diff changeset
    91
static eviqs *iqs_find(const char *iqid)
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    92
{
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    93
  GSList *p;
745
413e95f3051a Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents: 705
diff changeset
    94
  eviqs *i;
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    95
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    96
  if (!iqid) return NULL;
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    97
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    98
  for (p = iqs_list; p; p = g_slist_next(p)) {
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
    99
    i = p->data;
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   100
    if (!strcmp(iqid, i->id))
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   101
      return i;
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   102
  }
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   103
  return NULL;
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   104
}
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   105
698
60522cf6d325 Propagate context to IQ callback functions
Mikael Berthe <mikael@lilotux.net>
parents: 692
diff changeset
   106
//  iqs_callback(iqid, xml_result, iqcontext)
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   107
// Callback processing for the iqid message.
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   108
// If we've received an answer, xml_result should point to the xmldata packet.
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   109
// If this is a timeout, xml_result should be NULL.
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   110
// Return 0 in case of success, -1 if the iqid hasn't been found.
698
60522cf6d325 Propagate context to IQ callback functions
Mikael Berthe <mikael@lilotux.net>
parents: 692
diff changeset
   111
int iqs_callback(const char *iqid, xmlnode xml_result, guint iqcontext)
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   112
{
745
413e95f3051a Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents: 705
diff changeset
   113
  eviqs *i;
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   114
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   115
  i = iqs_find(iqid);
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   116
  if (!i) return -1;
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   117
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   118
  // IQ processing
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   119
  // Note: If xml_result is NULL, this is a timeout
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   120
  if (i->callback)
698
60522cf6d325 Propagate context to IQ callback functions
Mikael Berthe <mikael@lilotux.net>
parents: 692
diff changeset
   121
    (*i->callback)(i, xml_result, iqcontext);
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   122
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   123
  iqs_del(iqid);
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   124
  return 0;
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   125
}
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   126
705
603b43e4f56a Fix a bug in iqs_check_timeout()
Mikael Berthe <mikael@lilotux.net>
parents: 704
diff changeset
   127
void iqs_check_timeout(time_t now_t)
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   128
{
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   129
  GSList *p;
745
413e95f3051a Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents: 705
diff changeset
   130
  eviqs *i;
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   131
705
603b43e4f56a Fix a bug in iqs_check_timeout()
Mikael Berthe <mikael@lilotux.net>
parents: 704
diff changeset
   132
  p = iqs_list;
603b43e4f56a Fix a bug in iqs_check_timeout()
Mikael Berthe <mikael@lilotux.net>
parents: 704
diff changeset
   133
  while (p) {
603b43e4f56a Fix a bug in iqs_check_timeout()
Mikael Berthe <mikael@lilotux.net>
parents: 704
diff changeset
   134
    i = p->data;
745
413e95f3051a Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents: 705
diff changeset
   135
    // We must get next IQ eviqs element now because the current one
705
603b43e4f56a Fix a bug in iqs_check_timeout()
Mikael Berthe <mikael@lilotux.net>
parents: 704
diff changeset
   136
    // could be freed.
603b43e4f56a Fix a bug in iqs_check_timeout()
Mikael Berthe <mikael@lilotux.net>
parents: 704
diff changeset
   137
    p = g_slist_next(p);
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   138
965
1bdf0f1b16c0 Use U suffix for unsigned defines
Mikael Berthe <mikael@lilotux.net>
parents: 959
diff changeset
   139
    if ((!i->ts_expire && now_t > i->ts_create + (time_t)IQS_MAX_TIMEOUT) ||
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   140
        (i->ts_expire && now_t > i->ts_expire)) {
698
60522cf6d325 Propagate context to IQ callback functions
Mikael Berthe <mikael@lilotux.net>
parents: 692
diff changeset
   141
      iqs_callback(i->id, NULL, IQS_CONTEXT_TIMEOUT);
683
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   142
    }
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   143
  }
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   144
}
c5e0d8c3f00c Introduce new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 619
diff changeset
   145
689
281aab5aef50 Introduce jb_iqs_display_list() helper function for debugging
Mikael Berthe <mikael@lilotux.net>
parents: 688
diff changeset
   146
void jb_iqs_display_list(void)
281aab5aef50 Introduce jb_iqs_display_list() helper function for debugging
Mikael Berthe <mikael@lilotux.net>
parents: 688
diff changeset
   147
{
281aab5aef50 Introduce jb_iqs_display_list() helper function for debugging
Mikael Berthe <mikael@lilotux.net>
parents: 688
diff changeset
   148
  GSList *p;
745
413e95f3051a Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents: 705
diff changeset
   149
  eviqs *i;
689
281aab5aef50 Introduce jb_iqs_display_list() helper function for debugging
Mikael Berthe <mikael@lilotux.net>
parents: 688
diff changeset
   150
281aab5aef50 Introduce jb_iqs_display_list() helper function for debugging
Mikael Berthe <mikael@lilotux.net>
parents: 688
diff changeset
   151
  scr_LogPrint(LPRINT_LOGNORM, "IQ list:");
281aab5aef50 Introduce jb_iqs_display_list() helper function for debugging
Mikael Berthe <mikael@lilotux.net>
parents: 688
diff changeset
   152
  for (p = iqs_list; p; p = g_slist_next(p)) {
281aab5aef50 Introduce jb_iqs_display_list() helper function for debugging
Mikael Berthe <mikael@lilotux.net>
parents: 688
diff changeset
   153
    i = p->data;
281aab5aef50 Introduce jb_iqs_display_list() helper function for debugging
Mikael Berthe <mikael@lilotux.net>
parents: 688
diff changeset
   154
    scr_LogPrint(LPRINT_LOGNORM, "Id [%s]", i->id);
281aab5aef50 Introduce jb_iqs_display_list() helper function for debugging
Mikael Berthe <mikael@lilotux.net>
parents: 688
diff changeset
   155
  }
281aab5aef50 Introduce jb_iqs_display_list() helper function for debugging
Mikael Berthe <mikael@lilotux.net>
parents: 688
diff changeset
   156
  scr_LogPrint(LPRINT_LOGNORM, "End of IQ list.");
281aab5aef50 Introduce jb_iqs_display_list() helper function for debugging
Mikael Berthe <mikael@lilotux.net>
parents: 688
diff changeset
   157
}
281aab5aef50 Introduce jb_iqs_display_list() helper function for debugging
Mikael Berthe <mikael@lilotux.net>
parents: 688
diff changeset
   158
606
0b4ed231ebc2 Code cleanup + remove deprecated Agents list IQ request
Mikael Berthe <mikael@lilotux.net>
parents: 605
diff changeset
   159
static void request_roster(void)
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   160
{
745
413e95f3051a Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents: 705
diff changeset
   161
  eviqs *iqn = iqs_new(JPACKET__GET, NS_ROSTER, "Roster", IQS_DEFAULT_TIMEOUT);
684
3282276e7413 Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 683
diff changeset
   162
  jab_send(jc, iqn->xmldata);
3282276e7413 Switch IQ packet creation to the new IQ system
Mikael Berthe <mikael@lilotux.net>
parents: 683
diff changeset
   163
  iqs_del(iqn->id); // XXX
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   164
}
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   165
606
0b4ed231ebc2 Code cleanup + remove deprecated Agents list IQ request
Mikael Berthe <mikael@lilotux.net>
parents: 605
diff changeset
   166
static void handle_iq_roster(xmlnode x)
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   167
{
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   168
  xmlnode y;
605
2a4fefb98511 Set the subscription pending flag
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
   169
  const char *jid, *name, *group, *sub, *ask;
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   170
  char *cleanalias;
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   171
  enum subscr esub;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   172
  int need_refresh = FALSE;
613
a6b8b373e4de Try to guess if a roster item is an agent
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
   173
  guint roster_type;
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   174
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   175
  for (y = xmlnode_get_tag(x, "item"); y; y = xmlnode_get_nextsibling(y)) {
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   176
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   177
    jid = xmlnode_get_attrib(y, "jid");
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   178
    name = xmlnode_get_attrib(y, "name");
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   179
    sub = xmlnode_get_attrib(y, "subscription");
605
2a4fefb98511 Set the subscription pending flag
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
   180
    ask = xmlnode_get_attrib(y, "ask");
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   181
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   182
    group = xmlnode_get_tag_data(y, "group");
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   183
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   184
    if (!jid)
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   185
      continue;
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   186
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 746
diff changeset
   187
    cleanalias = jidtodisp(jid);
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   188
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   189
    esub = sub_none;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   190
    if (sub) {
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   191
      if (!strcmp(sub, "to"))          esub = sub_to;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   192
      else if (!strcmp(sub, "from"))   esub = sub_from;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   193
      else if (!strcmp(sub, "both"))   esub = sub_both;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   194
      else if (!strcmp(sub, "remove")) esub = sub_remove;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   195
    }
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   196
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   197
    if (esub == sub_remove) {
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   198
      roster_del_user(cleanalias);
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   199
      scr_LogPrint(LPRINT_LOGNORM, "Buddy <%s> has been removed "
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   200
                   "from the roster", cleanalias);
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   201
      g_free(cleanalias);
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   202
      need_refresh = TRUE;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   203
      continue;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   204
    }
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   205
605
2a4fefb98511 Set the subscription pending flag
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
   206
    if (ask && !strcmp(ask, "subscribe"))
2a4fefb98511 Set the subscription pending flag
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
   207
      esub |= sub_pending;
2a4fefb98511 Set the subscription pending flag
Mikael Berthe <mikael@lilotux.net>
parents: 603
diff changeset
   208
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 746
diff changeset
   209
    if (!name)
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 746
diff changeset
   210
      name = cleanalias;
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   211
977
5b01de4ac5e1 Cosmetic changes
Alexis Hildebrandt <afh [at] 2drop [dot] net>
parents: 965
diff changeset
   212
    // Tricky... :-\  My guess is that if there is no JID_DOMAIN_SEPARATOR,
5b01de4ac5e1 Cosmetic changes
Alexis Hildebrandt <afh [at] 2drop [dot] net>
parents: 965
diff changeset
   213
    // this is an agent.
5b01de4ac5e1 Cosmetic changes
Alexis Hildebrandt <afh [at] 2drop [dot] net>
parents: 965
diff changeset
   214
    if (strchr(cleanalias, JID_DOMAIN_SEPARATOR))
613
a6b8b373e4de Try to guess if a roster item is an agent
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
   215
      roster_type = ROSTER_TYPE_USER;
a6b8b373e4de Try to guess if a roster item is an agent
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
   216
    else
a6b8b373e4de Try to guess if a roster item is an agent
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
   217
      roster_type = ROSTER_TYPE_AGENT;
a6b8b373e4de Try to guess if a roster item is an agent
Mikael Berthe <mikael@lilotux.net>
parents: 607
diff changeset
   218
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 746
diff changeset
   219
    roster_add_user(cleanalias, name, group, roster_type, esub);
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   220
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   221
    g_free(cleanalias);
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   222
  }
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   223
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   224
  buddylist_build();
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   225
  update_roster = TRUE;
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   226
  if (need_refresh)
959
8bf36cef8aa6 Do not enter chat mode after command "/del"
Mikael Berthe <mikael@lilotux.net>
parents: 871
diff changeset
   227
    scr_UpdateBuddyWindow();
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   228
}
29
86837ff0554c [/trunk] Changeset 45 by mikael
mikael
parents:
diff changeset
   229
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 746
diff changeset
   230
static void iqscallback_version(eviqs *iqp, xmlnode xml_result, guint iqcontext)
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   231
{
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   232
  xmlnode ansqry;
1002
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   233
  char *p;
704
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   234
  char *bjid;
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   235
  char *buf;
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   236
698
60522cf6d325 Propagate context to IQ callback functions
Mikael Berthe <mikael@lilotux.net>
parents: 692
diff changeset
   237
  // Leave now if we cannot process xml_result
60522cf6d325 Propagate context to IQ callback functions
Mikael Berthe <mikael@lilotux.net>
parents: 692
diff changeset
   238
  if (!xml_result || iqcontext) return;
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   239
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   240
  ansqry = xmlnode_get_tag(xml_result, "query");
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   241
  if (!ansqry) {
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   242
    scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:version result!");
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   243
    return;
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   244
  }
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   245
  // Display IQ result sender...
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   246
  p = xmlnode_get_attrib(xml_result, "from");
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   247
  if (!p) {
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   248
    scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:version result (no sender name).");
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   249
    return;
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   250
  }
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 746
diff changeset
   251
  bjid = p;
704
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   252
782
19121d9f4aa2 Nicer message when receiving IQ result packet
Mikael Berthe <mikael@lilotux.net>
parents: 776
diff changeset
   253
  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
   254
  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
   255
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   256
  // bjid should now really be the "bare JID", let's strip the resource
977
5b01de4ac5e1 Cosmetic changes
Alexis Hildebrandt <afh [at] 2drop [dot] net>
parents: 965
diff changeset
   257
  p = strchr(bjid, JID_RESOURCE_SEPARATOR);
704
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   258
  if (p) *p = '\0';
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   259
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   260
  scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO);
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   261
  g_free(buf);
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   262
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   263
  // Get result data...
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   264
  p = xmlnode_get_tag_data(ansqry, "name");
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   265
  if (p) {
1002
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   266
    buf = g_strdup_printf("Name:    %s", p);
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   267
    scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_NONE);
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   268
    g_free(buf);
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   269
  }
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   270
  p = xmlnode_get_tag_data(ansqry, "version");
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   271
  if (p) {
1002
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   272
    buf = g_strdup_printf("Version: %s", p);
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   273
    scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_NONE);
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   274
    g_free(buf);
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   275
  }
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   276
  p = xmlnode_get_tag_data(ansqry, "os");
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   277
  if (p) {
1002
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   278
    buf = g_strdup_printf("OS:      %s", p);
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   279
    scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_NONE);
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   280
    g_free(buf);
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   281
  }
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   282
}
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   283
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   284
void request_version(const char *fulljid)
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   285
{
745
413e95f3051a Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents: 705
diff changeset
   286
  eviqs *iqn;
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   287
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   288
  iqn = iqs_new(JPACKET__GET, NS_VERSION, "version", IQS_DEFAULT_TIMEOUT);
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 746
diff changeset
   289
  xmlnode_put_attrib(iqn->xmldata, "to", fulljid);
690
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   290
  iqn->callback = &iqscallback_version;
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   291
  jab_send(jc, iqn->xmldata);
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   292
}
3e965a1186c7 Implement IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 689
diff changeset
   293
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 746
diff changeset
   294
static void iqscallback_time(eviqs *iqp, xmlnode xml_result, guint iqcontext)
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   295
{
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   296
  xmlnode ansqry;
1002
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   297
  char *p;
704
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   298
  char *bjid;
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   299
  char *buf;
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   300
698
60522cf6d325 Propagate context to IQ callback functions
Mikael Berthe <mikael@lilotux.net>
parents: 692
diff changeset
   301
  // Leave now if we cannot process xml_result
60522cf6d325 Propagate context to IQ callback functions
Mikael Berthe <mikael@lilotux.net>
parents: 692
diff changeset
   302
  if (!xml_result || iqcontext) return;
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   303
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   304
  ansqry = xmlnode_get_tag(xml_result, "query");
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   305
  if (!ansqry) {
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   306
    scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:time result!");
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   307
    return;
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   308
  }
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   309
  // Display IQ result sender...
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   310
  p = xmlnode_get_attrib(xml_result, "from");
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   311
  if (!p) {
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   312
    scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:time result (no sender name).");
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   313
    return;
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   314
  }
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 746
diff changeset
   315
  bjid = p;
704
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   316
782
19121d9f4aa2 Nicer message when receiving IQ result packet
Mikael Berthe <mikael@lilotux.net>
parents: 776
diff changeset
   317
  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
   318
  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
   319
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   320
  // bjid should now really be the "bare JID", let's strip the resource
977
5b01de4ac5e1 Cosmetic changes
Alexis Hildebrandt <afh [at] 2drop [dot] net>
parents: 965
diff changeset
   321
  p = strchr(bjid, JID_RESOURCE_SEPARATOR);
704
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   322
  if (p) *p = '\0';
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   323
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   324
  scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO);
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   325
  g_free(buf);
4118a66f2c02 Display IQ results (time, version) in the chat window
Mikael Berthe <mikael@lilotux.net>
parents: 703
diff changeset
   326
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   327
  // Get result data...
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   328
  p = xmlnode_get_tag_data(ansqry, "utc");
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   329
  if (p) {
1002
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   330
    buf = g_strdup_printf("UTC:  %s", p);
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   331
    scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_NONE);
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   332
    g_free(buf);
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   333
  }
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   334
  p = xmlnode_get_tag_data(ansqry, "tz");
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   335
  if (p) {
1002
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   336
    buf = g_strdup_printf("TZ:   %s", p);
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   337
    scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_NONE);
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   338
    g_free(buf);
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   339
  }
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   340
  p = xmlnode_get_tag_data(ansqry, "display");
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   341
  if (p) {
1002
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   342
    buf = g_strdup_printf("Time: %s", p);
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   343
    scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_NONE);
dd9e7eb5f8a8 Remove old UTF-8 conversions
Mikael Berthe <mikael@lilotux.net>
parents: 995
diff changeset
   344
    g_free(buf);
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   345
  }
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   346
}
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   347
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   348
void request_time(const char *fulljid)
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   349
{
745
413e95f3051a Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents: 705
diff changeset
   350
  eviqs *iqn;
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   351
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   352
  iqn = iqs_new(JPACKET__GET, NS_TIME, "time", IQS_DEFAULT_TIMEOUT);
772
464be13343a9 Store most data in UTF-8 internally
Mikael Berthe <mikael@lilotux.net>
parents: 746
diff changeset
   353
  xmlnode_put_attrib(iqn->xmldata, "to", fulljid);
691
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   354
  iqn->callback = &iqscallback_time;
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   355
  jab_send(jc, iqn->xmldata);
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   356
}
3c0a0a993de8 Implement IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 690
diff changeset
   357
1003
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   358
static void handle_vcard_node(const char *barejid, xmlnode vcardnode)
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   359
{
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   360
  xmlnode x;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   361
  const char *p;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   362
  char *buf;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   363
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   364
  x = xmlnode_get_firstchild(vcardnode);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   365
  for ( ; x; x = xmlnode_get_nextsibling(x)) {
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   366
    const char *title, *data;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   367
    p = xmlnode_get_name(x);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   368
    data = xmlnode_get_data(x);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   369
    if (p && data) {
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   370
      title = NULL;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   371
      if (!strcmp(p, "FN"))
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   372
        title = "Name";
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   373
      else if (!strcmp(p, "NICKNAME"))
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   374
        title = "Nickname";
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   375
      else if (!strcmp(p, "URL"))
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   376
        title = "URL";
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   377
      else if (!strcmp(p, "BDAY"))
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   378
        title = "Birthday";
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   379
      else if (!strcmp(p, "TZ"))
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   380
        title = "Timezone";
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   381
      else if (!strcmp(p, "TITLE"))
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   382
        title = "Title";
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   383
      else if (!strcmp(p, "ROLE"))
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   384
        title = "Role";
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   385
      else if (!strcmp(p, "DESC"))
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   386
        title = "Comment";
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   387
      else if (!strcmp(p, "N")) {
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   388
        data = xmlnode_get_tag_data(x, "FAMILY");
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   389
        if (data) {
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   390
          buf = g_strdup_printf("Family Name: %s", data);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   391
          scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   392
          g_free(buf);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   393
        }
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   394
        data = xmlnode_get_tag_data(x, "GIVEN");
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   395
        if (data) {
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   396
          buf = g_strdup_printf("Given Name: %s", data);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   397
          scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   398
          g_free(buf);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   399
        }
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   400
        data = xmlnode_get_tag_data(x, "MIDDLE");
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   401
        if (data) {
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   402
          buf = g_strdup_printf("Middle Name: %s", data);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   403
          scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   404
          g_free(buf);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   405
        }
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   406
      } else if (!strcmp(p, "ADR")) {   // TODO
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   407
      } else if (!strcmp(p, "TEL")) {   // TODO
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   408
      } else if (!strcmp(p, "EMAIL")) {
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   409
        data = xmlnode_get_tag_data(x, "USERID");
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   410
        if (data)
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   411
          title = "Email"; // XXX
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   412
      } else if (!strcmp(p, "ORG")) {   // TODO
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   413
      }
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   414
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   415
      if (title) {
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   416
        buf = g_strdup_printf("%s: %s", title, data);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   417
        scr_WriteIncomingMessage(barejid, buf, 0, HBB_PREFIX_NONE);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   418
        g_free(buf);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   419
      }
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   420
    }
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   421
  }
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   422
}
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   423
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   424
static void iqscallback_vcard(eviqs *iqp, xmlnode xml_result, guint iqcontext)
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   425
{
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   426
  xmlnode ansqry;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   427
  char *p;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   428
  char *bjid;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   429
  char *buf;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   430
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   431
  // Leave now if we cannot process xml_result
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   432
  if (!xml_result || iqcontext) return;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   433
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   434
  // Display IQ result sender...
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   435
  p = xmlnode_get_attrib(xml_result, "from");
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   436
  if (!p) {
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   437
    scr_LogPrint(LPRINT_LOGNORM, "Invalid IQ:vCard result (no sender name).");
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   438
    return;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   439
  }
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   440
  bjid = p;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   441
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   442
  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
   443
  scr_LogPrint(LPRINT_LOGNORM, "%s", buf);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   444
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   445
  // Get the vCard node
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   446
  ansqry = xmlnode_get_tag(xml_result, "vCard");
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   447
  if (!ansqry) {
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   448
    scr_LogPrint(LPRINT_LOGNORM, "Empty IQ:vCard result!");
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   449
    return;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   450
  }
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   451
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   452
  // bjid should really be the "bare JID", let's strip the resource
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   453
  p = strchr(bjid, JID_RESOURCE_SEPARATOR);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   454
  if (p) *p = '\0';
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   455
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   456
  scr_WriteIncomingMessage(bjid, buf, 0, HBB_PREFIX_INFO);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   457
  g_free(buf);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   458
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   459
  // Get result data...
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   460
  handle_vcard_node(bjid, ansqry);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   461
}
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   462
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   463
void request_vcard(const char *jid)
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   464
{
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   465
  eviqs *iqn;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   466
  char *barejid;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   467
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   468
  barejid = jidtodisp(jid);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   469
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   470
  // Create a new IQ structure.  We use NULL for the namespace because
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   471
  // we'll have to use a special tag, not the usual "query" one.
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   472
  iqn = iqs_new(JPACKET__GET, NULL, "vcard", IQS_DEFAULT_TIMEOUT);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   473
  xmlnode_put_attrib(iqn->xmldata, "to", barejid);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   474
  // Remove the useless <query/> tag, and insert a vCard one.
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   475
  xmlnode_hide(xmlnode_get_tag(iqn->xmldata, "query"));
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   476
  xmlnode_put_attrib(xmlnode_insert_tag(iqn->xmldata, "vCard"),
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   477
                     "xmlns", NS_VCARD);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   478
  iqn->callback = &iqscallback_vcard;
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   479
  jab_send(jc, iqn->xmldata);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   480
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   481
  g_free(barejid);
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   482
}
c8b1a52b2fd6 Initial VCard retrieval support
Mikael Berthe <mikael@lilotux.net>
parents: 1002
diff changeset
   483
745
413e95f3051a Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents: 705
diff changeset
   484
void iqscallback_auth(eviqs *iqp, xmlnode xml_result)
686
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   485
{
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   486
  if (jstate == STATE_GETAUTH) {
745
413e95f3051a Introduce user "events" list
Mikael Berthe <mikael@lilotux.net>
parents: 705
diff changeset
   487
    eviqs *iqn;
686
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   488
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   489
    if (xml_result) {
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   490
      xmlnode x = xmlnode_get_tag(xml_result, "query");
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   491
      if (x && !xmlnode_get_tag(x, "digest"))
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   492
        jc->sid = 0;
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   493
    }
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   494
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   495
    iqn = iqs_new(JPACKET__SET, NS_AUTH, "auth", IQS_DEFAULT_TIMEOUT);
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   496
    iqn->callback = &iqscallback_auth;
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   497
    jab_auth_mcabber(jc, iqn->xmldata);
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   498
    jab_send(jc, iqn->xmldata);
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   499
    jstate = STATE_SENDAUTH;
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   500
  } else if (jstate == STATE_SENDAUTH) {
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   501
    request_roster();
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   502
    jstate = STATE_LOGGED;
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   503
  }
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   504
}
98de2d166a11 Use the new IQ system for authentication
Mikael Berthe <mikael@lilotux.net>
parents: 685
diff changeset
   505
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   506
static void handle_iq_result(jconn conn, char *from, xmlnode xmldata)
426
2706ef3e25a7 Better handling of server error codes/messages
Mikael Berthe <mikael@lilotux.net>
parents: 421
diff changeset
   507
{
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   508
  xmlnode x;
685
f033345d1315 Call IQ callback function when receiving a RESULT packet
Mikael Berthe <mikael@lilotux.net>
parents: 684
diff changeset
   509
  char *id;
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   510
  char *ns;
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   511
685
f033345d1315 Call IQ callback function when receiving a RESULT packet
Mikael Berthe <mikael@lilotux.net>
parents: 684
diff changeset
   512
  id = xmlnode_get_attrib(xmldata, "id");
f033345d1315 Call IQ callback function when receiving a RESULT packet
Mikael Berthe <mikael@lilotux.net>
parents: 684
diff changeset
   513
  if (!id) {
596
6c7fd289648f Clean up handle_iq_result()
Mikael Berthe <mikael@lilotux.net>
parents: 595
diff changeset
   514
    scr_LogPrint(LPRINT_LOG, "IQ result stanza with no ID, ignored.");
6c7fd289648f Clean up handle_iq_result()
Mikael Berthe <mikael@lilotux.net>
parents: 595
diff changeset
   515
    return;
6c7fd289648f Clean up handle_iq_result()
Mikael Berthe <mikael@lilotux.net>
parents: 595
diff changeset
   516
  }
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   517
698
60522cf6d325 Propagate context to IQ callback functions
Mikael Berthe <mikael@lilotux.net>
parents: 692
diff changeset
   518
  if (!iqs_callback(id, xmldata, IQS_CONTEXT_RESULT))
685
f033345d1315 Call IQ callback function when receiving a RESULT packet
Mikael Berthe <mikael@lilotux.net>
parents: 684
diff changeset
   519
    return;
f033345d1315 Call IQ callback function when receiving a RESULT packet
Mikael Berthe <mikael@lilotux.net>
parents: 684
diff changeset
   520
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   521
  x = xmlnode_get_tag(xmldata, "query");
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   522
  if (!x) return;
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   523
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   524
  ns = xmlnode_get_attrib(x, "xmlns");
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   525
  if (!ns) return;
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   526
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   527
  if (!strcmp(ns, NS_ROSTER)) {
606
0b4ed231ebc2 Code cleanup + remove deprecated Agents list IQ request
Mikael Berthe <mikael@lilotux.net>
parents: 605
diff changeset
   528
    handle_iq_roster(x);
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   529
607
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   530
    // Post-login stuff
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   531
    // Usually we request the roster only at connection time
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   532
    // so we should be there only once.  (That's ugly, however)
603
9516db839e08 Store subscription data
Mikael Berthe <mikael@lilotux.net>
parents: 597
diff changeset
   533
    jb_setstatus(available, NULL, NULL);
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   534
  }
426
2706ef3e25a7 Better handling of server error codes/messages
Mikael Berthe <mikael@lilotux.net>
parents: 421
diff changeset
   535
}
2706ef3e25a7 Better handling of server error codes/messages
Mikael Berthe <mikael@lilotux.net>
parents: 421
diff changeset
   536
995
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   537
static void handle_iq_disco_info(jconn conn, char *from, const char *id,
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   538
                                 xmlnode xmldata)
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   539
{
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   540
  xmlnode x, y;
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   541
  xmlnode myquery;
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   542
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   543
  x = jutil_iqnew(JPACKET__RESULT, NS_DISCO_INFO);
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   544
  xmlnode_put_attrib(x, "id", id);
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   545
  xmlnode_put_attrib(x, "to", xmlnode_get_attrib(xmldata, "from"));
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   546
  myquery = xmlnode_get_tag(x, "query");
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   547
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   548
  y = xmlnode_insert_tag(myquery, "identity");
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   549
  xmlnode_put_attrib(y, "category", "client");
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   550
  xmlnode_put_attrib(y, "type", "pc");
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   551
  xmlnode_put_attrib(y, "name", PACKAGE_NAME);
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   552
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   553
  xmlnode_put_attrib(xmlnode_insert_tag(myquery, "feature"),
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   554
                     "var", NS_DISCO_INFO);
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   555
  xmlnode_put_attrib(xmlnode_insert_tag(myquery, "feature"),
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   556
                     "var", NS_MUC);
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   557
  xmlnode_put_attrib(xmlnode_insert_tag(myquery, "feature"),
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   558
                     "var", NS_CHATSTATES);
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   559
  xmlnode_put_attrib(xmlnode_insert_tag(myquery, "feature"),
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   560
                     "var", NS_TIME);
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   561
  xmlnode_put_attrib(xmlnode_insert_tag(myquery, "feature"),
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   562
                     "var", NS_VERSION);
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   563
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   564
  jab_send(jc, x);
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   565
  xmlnode_free(x);
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   566
}
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   567
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   568
static void handle_iq_version(jconn conn, char *from, const char *id,
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   569
                              xmlnode xmldata)
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   570
{
995
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   571
  xmlnode x;
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   572
  xmlnode myquery;
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   573
  char *os = NULL;
814
109dcf5fc111 Use hgcset (if available) when answering to IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 782
diff changeset
   574
  char *ver = mcabber_version();
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   575
692
d3511f846d47 Cosmetics (line wrapping)
Mikael Berthe <mikael@lilotux.net>
parents: 691
diff changeset
   576
  scr_LogPrint(LPRINT_LOGNORM, "Received an IQ version request from <%s>",
d3511f846d47 Cosmetics (line wrapping)
Mikael Berthe <mikael@lilotux.net>
parents: 691
diff changeset
   577
               from);
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   578
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   579
  if (!settings_opt_get_int("iq_version_hide_os")) {
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   580
    struct utsname osinfo;
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   581
    uname(&osinfo);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   582
    os = g_strdup_printf("%s %s %s", osinfo.sysname, osinfo.release,
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   583
                         osinfo.machine);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   584
  }
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   585
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   586
  x = jutil_iqnew(JPACKET__RESULT, NS_VERSION);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   587
  xmlnode_put_attrib(x, "id", id);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   588
  xmlnode_put_attrib(x, "to", xmlnode_get_attrib(xmldata, "from"));
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   589
  myquery = xmlnode_get_tag(x, "query");
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   590
814
109dcf5fc111 Use hgcset (if available) when answering to IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 782
diff changeset
   591
  xmlnode_insert_cdata(xmlnode_insert_tag(myquery, "name"), PACKAGE_NAME, -1);
109dcf5fc111 Use hgcset (if available) when answering to IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 782
diff changeset
   592
  xmlnode_insert_cdata(xmlnode_insert_tag(myquery, "version"), ver, -1);
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   593
  if (os) {
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   594
    xmlnode_insert_cdata(xmlnode_insert_tag(myquery, "os"), os, -1);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   595
    g_free(os);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   596
  }
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   597
814
109dcf5fc111 Use hgcset (if available) when answering to IQ:version requests
Mikael Berthe <mikael@lilotux.net>
parents: 782
diff changeset
   598
  g_free(ver);
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   599
  jab_send(jc, x);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   600
  xmlnode_free(x);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   601
}
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   602
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   603
// This function borrows some code from the Gaim project
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   604
static void handle_iq_time(jconn conn, char *from, const char *id,
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   605
                              xmlnode xmldata)
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   606
{
995
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   607
  xmlnode x;
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   608
  xmlnode myquery;
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   609
  char *buf, *utf8_buf;
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   610
  time_t now_t;
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   611
  struct tm *now;
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   612
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   613
  time(&now_t);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   614
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   615
  scr_LogPrint(LPRINT_LOGNORM, "Received an IQ time request from <%s>", from);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   616
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   617
  buf = g_new0(char, 512);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   618
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   619
  x = jutil_iqnew(JPACKET__RESULT, NS_TIME);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   620
  xmlnode_put_attrib(x, "id", id);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   621
  xmlnode_put_attrib(x, "to", xmlnode_get_attrib(xmldata, "from"));
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   622
  myquery = xmlnode_get_tag(x, "query");
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   623
703
8cbcbff8de7d Fix UTC time in IQ:version queries
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
   624
  now = gmtime(&now_t);
8cbcbff8de7d Fix UTC time in IQ:version queries
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
   625
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   626
  strftime(buf, 512, "%Y%m%dT%T", now);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   627
  xmlnode_insert_cdata(xmlnode_insert_tag(myquery, "utc"), buf, -1);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   628
703
8cbcbff8de7d Fix UTC time in IQ:version queries
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
   629
  now = localtime(&now_t);
8cbcbff8de7d Fix UTC time in IQ:version queries
Mikael Berthe <mikael@lilotux.net>
parents: 699
diff changeset
   630
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   631
  strftime(buf, 512, "%Z", now);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   632
  if ((utf8_buf = to_utf8(buf))) {
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   633
    xmlnode_insert_cdata(xmlnode_insert_tag(myquery, "tz"), utf8_buf, -1);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   634
    g_free(utf8_buf);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   635
  }
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   636
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   637
  strftime(buf, 512, "%d %b %Y %T", now);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   638
  if ((utf8_buf = to_utf8(buf))) {
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   639
    xmlnode_insert_cdata(xmlnode_insert_tag(myquery, "display"), utf8_buf, -1);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   640
    g_free(utf8_buf);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   641
  }
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   642
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   643
  jab_send(jc, x);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   644
  xmlnode_free(x);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   645
  g_free(buf);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   646
}
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   647
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   648
// This function borrows some code from the Gaim project
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   649
static void handle_iq_get(jconn conn, char *from, xmlnode xmldata)
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
   650
{
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   651
  const char *id, *ns;
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   652
  xmlnode x, y, z;
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   653
  guint iq_not_implemented = FALSE;
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
   654
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   655
  id = xmlnode_get_attrib(xmldata, "id");
607
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   656
  if (!id) {
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   657
    scr_LogPrint(LPRINT_LOG, "IQ get stanza with no ID, ignored.");
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   658
    return;
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   659
  }
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
   660
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   661
  x = xmlnode_get_tag(xmldata, "query");
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   662
  ns = xmlnode_get_attrib(x, "xmlns");
995
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   663
  if (ns && !strcmp(ns, NS_DISCO_INFO)) {
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   664
    handle_iq_disco_info(conn, from, id, xmldata);
c89e7993c4d9 Answer IQ disco#info queries
Mikael Berthe <mikael@lilotux.net>
parents: 977
diff changeset
   665
  } else if (ns && !strcmp(ns, NS_VERSION)) {
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   666
    handle_iq_version(conn, from, id, xmldata);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   667
  } else if (ns && !strcmp(ns, NS_TIME)) {
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   668
    handle_iq_time(conn, from, id, xmldata);
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   669
  } else {
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   670
    iq_not_implemented = TRUE;
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   671
  }
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   672
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   673
  if (!iq_not_implemented)
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   674
    return;
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   675
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   676
  // Not implemented.
607
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   677
  x = xmlnode_dup(xmldata);
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   678
  xmlnode_put_attrib(x, "to", xmlnode_get_attrib(xmldata, "from"));
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   679
  xmlnode_hide_attrib(x, "from");
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   680
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   681
  xmlnode_put_attrib(x, "type", TMSG_ERROR);
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   682
  y = xmlnode_insert_tag(x, TMSG_ERROR);
595
0c1d37300862 IQ: send feature-not-implemented error stanzas
Mikael Berthe <mikael@lilotux.net>
parents: 582
diff changeset
   683
  xmlnode_put_attrib(y, "code", "501");
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   684
  xmlnode_put_attrib(y, "type", "cancel");
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   685
  z = xmlnode_insert_tag(y, "feature-not-implemented");
595
0c1d37300862 IQ: send feature-not-implemented error stanzas
Mikael Berthe <mikael@lilotux.net>
parents: 582
diff changeset
   686
  xmlnode_put_attrib(z, "xmlns", NS_XMPP_STANZAS);
596
6c7fd289648f Clean up handle_iq_result()
Mikael Berthe <mikael@lilotux.net>
parents: 595
diff changeset
   687
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   688
  jab_send(conn, x);
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   689
  xmlnode_free(x);
31
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
   690
}
0f0fbd0c4a7f [/trunk] Changeset 47 by mikael
mikael
parents: 29
diff changeset
   691
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   692
static void handle_iq_set(jconn conn, char *from, xmlnode xmldata)
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
   693
{
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   694
  const char *id, *ns;
595
0c1d37300862 IQ: send feature-not-implemented error stanzas
Mikael Berthe <mikael@lilotux.net>
parents: 582
diff changeset
   695
  xmlnode x, y, z;
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   696
  guint iq_not_implemented = FALSE;
595
0c1d37300862 IQ: send feature-not-implemented error stanzas
Mikael Berthe <mikael@lilotux.net>
parents: 582
diff changeset
   697
0c1d37300862 IQ: send feature-not-implemented error stanzas
Mikael Berthe <mikael@lilotux.net>
parents: 582
diff changeset
   698
  id = xmlnode_get_attrib(xmldata, "id");
607
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   699
  if (!id)
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   700
    scr_LogPrint(LPRINT_LOG, "IQ set stanza with no ID...");
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   701
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   702
  x = xmlnode_get_tag(xmldata, "query");
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   703
  ns = xmlnode_get_attrib(x, "xmlns");
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   704
  if (ns && !strcmp(ns, NS_ROSTER)) {
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   705
    handle_iq_roster(x);
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   706
  } else {
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   707
    iq_not_implemented = TRUE;
607
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   708
  }
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   709
595
0c1d37300862 IQ: send feature-not-implemented error stanzas
Mikael Berthe <mikael@lilotux.net>
parents: 582
diff changeset
   710
  if (!id) return;
0c1d37300862 IQ: send feature-not-implemented error stanzas
Mikael Berthe <mikael@lilotux.net>
parents: 582
diff changeset
   711
619
44ddf9bec3a5 Answer IQ:version & IQ:time requests
Mikael Berthe <mikael@lilotux.net>
parents: 613
diff changeset
   712
  if (!iq_not_implemented) {
607
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   713
    x = xmlnode_new_tag("iq");
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   714
    xmlnode_put_attrib(x, "to", xmlnode_get_attrib(xmldata, "from"));
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   715
    xmlnode_put_attrib(x, "type", "result");
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   716
    xmlnode_put_attrib(x, "id", id);
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   717
  } else {
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   718
    /* Not implemented yet: send an error stanza */
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   719
    x = xmlnode_dup(xmldata);
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   720
    xmlnode_put_attrib(x, "to", xmlnode_get_attrib(xmldata, "from"));
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   721
    xmlnode_hide_attrib(x, "from");
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   722
    xmlnode_put_attrib(x, "type", "result");
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   723
    xmlnode_put_attrib(x, "type", TMSG_ERROR);
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   724
    y = xmlnode_insert_tag(x, TMSG_ERROR);
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   725
    xmlnode_put_attrib(y, "code", "501");
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   726
    xmlnode_put_attrib(y, "type", "cancel");
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   727
    z = xmlnode_insert_tag(y, "feature-not-implemented");
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   728
    xmlnode_put_attrib(z, "xmlns", NS_XMPP_STANZAS);
cf722bff6579 Improve IQ management
Mikael Berthe <mikael@lilotux.net>
parents: 606
diff changeset
   729
  }
595
0c1d37300862 IQ: send feature-not-implemented error stanzas
Mikael Berthe <mikael@lilotux.net>
parents: 582
diff changeset
   730
0c1d37300862 IQ: send feature-not-implemented error stanzas
Mikael Berthe <mikael@lilotux.net>
parents: 582
diff changeset
   731
  jab_send(conn, x);
0c1d37300862 IQ: send feature-not-implemented error stanzas
Mikael Berthe <mikael@lilotux.net>
parents: 582
diff changeset
   732
  xmlnode_free(x);
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   733
}
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
   734
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   735
void handle_packet_iq(jconn conn, char *type, char *from, xmlnode xmldata)
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   736
{
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
   737
  if (!type)
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
   738
    return;
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
   739
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
   740
  if (!strcmp(type, "result")) {
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   741
    handle_iq_result(conn, from, xmldata);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
   742
  } else if (!strcmp(type, "get")) {
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   743
    handle_iq_get(conn, from, xmldata);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
   744
  } else if (!strcmp(type, "set")) {
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   745
    handle_iq_set(conn, from, xmldata);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
   746
  } else if (!strcmp(type, TMSG_ERROR)) {
577
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   747
    xmlnode x = xmlnode_get_tag(xmldata, TMSG_ERROR);
5c6d364130ee Move IQ Jabber stuff to a separate file
Mikael Berthe <mikael@lilotux.net>
parents: 576
diff changeset
   748
    if (x)
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
   749
      display_server_error(x);
698
60522cf6d325 Propagate context to IQ callback functions
Mikael Berthe <mikael@lilotux.net>
parents: 692
diff changeset
   750
    iqs_callback(xmlnode_get_attrib(xmldata, "id"), NULL, IQS_CONTEXT_ERROR);
547
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
   751
  }
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
   752
}
1df26ff0ed8c Break packethandler() out
Mikael Berthe <mikael@lilotux.net>
parents: 539
diff changeset
   753
580
fed6d1e4d7a9 Fix modelines
Mikael Berthe <mikael@lilotux.net>
parents: 578
diff changeset
   754
/* vim: set expandtab cindent cinoptions=>2\:2(0:  For Vim users... */