disco.c
author Myhailo Danylenko <isbear@ukrpost.net>
Wed, 20 Jan 2010 20:04:13 +0200
changeset 23 63a8b60efcb2
parent 22 6d0d6bbf98d0
child 25 05469ec9c2e0
permissions -rw-r--r--
Forgot to actually include config.h
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
     1
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
     2
/* Copyright 2009 Myhailo Danylenko
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
 *
14
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
     4
 * Service discovery requests
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
 *
14
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
     6
 * This file is part of mcabber-disco
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
     7
 *
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
     8
 * mcabber-disco is free software: you can redistribute it and/or modify
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
 * it under the terms of the GNU General Public License as published by
14
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
    10
 * the Free Software Foundation, either version 2 of the License, or
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
    11
 * (at your option) any later version.
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
 *
14
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
    13
 * This program is distributed in the hope that it will be useful,
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
    14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
    15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
    16
 * GNU General Public License for more details.
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
 *
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
 * You should have received a copy of the GNU General Public License
14
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
    19
 * along with this program.  If not, see <http://www.gnu.org/licenses/>. */
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
#include <glib.h>
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
#include <gmodule.h>
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
#include <loudmouth/loudmouth.h>
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    24
#include <string.h>
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
18
47dc571eb408 Change mcabber headers naming covention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 17
diff changeset
    26
#include <mcabber/commands.h>
47dc571eb408 Change mcabber headers naming covention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 17
diff changeset
    27
#include <mcabber/logprint.h>
47dc571eb408 Change mcabber headers naming covention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 17
diff changeset
    28
#include <mcabber/utils.h>
47dc571eb408 Change mcabber headers naming covention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 17
diff changeset
    29
#include <mcabber/hooks.h>
47dc571eb408 Change mcabber headers naming covention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 17
diff changeset
    30
#include <mcabber/xmpp.h>
47dc571eb408 Change mcabber headers naming covention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 17
diff changeset
    31
#include <mcabber/compl.h>
47dc571eb408 Change mcabber headers naming covention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 17
diff changeset
    32
#include <mcabber/xmpp_defines.h>
47dc571eb408 Change mcabber headers naming covention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 17
diff changeset
    33
#include <mcabber/screen.h>
47dc571eb408 Change mcabber headers naming covention
Myhailo Danylenko <isbear@ukrpost.net>
parents: 17
diff changeset
    34
#include <mcabber/hbuf.h>
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    35
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    36
#include "disco.h"
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    37
23
63a8b60efcb2 Forgot to actually include config.h
Myhailo Danylenko <isbear@ukrpost.net>
parents: 22
diff changeset
    38
#include "config.h"
63a8b60efcb2 Forgot to actually include config.h
Myhailo Danylenko <isbear@ukrpost.net>
parents: 22
diff changeset
    39
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    40
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    41
// private types
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    42
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    43
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    44
// lm message handler userdata
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    45
typedef struct {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    46
	disco_info_handler_t handler;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    47
	gpointer             data;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    48
	GDestroyNotify       notify;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    49
} disco_info_reply_handler_t;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    50
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    51
// lm message handler userdata
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    52
typedef struct {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    53
	disco_items_handler_t handler;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    54
	gpointer              data;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    55
	GDestroyNotify        notify;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    56
} disco_items_reply_handler_t;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    57
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    58
// user request disco handler userdata (common for info and items)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    59
typedef struct {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    60
	gchar *jid;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    61
	gchar *node;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    62
} disco_handler_t;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    63
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    64
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    65
// globals
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    66
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    67
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    68
static guint   disco_cid      = 0;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    69
static GSList *reply_handlers = NULL;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    70
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    71
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    72
// destroyers
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    73
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    74
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    75
static void disco_info_reply_handler_destroy_notify (gpointer data)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    76
{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    77
	disco_info_reply_handler_t *cb = data;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    78
	if (cb -> notify)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    79
		cb -> notify (cb -> data);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    80
	g_free (cb);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    81
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    82
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    83
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    84
static void disco_items_reply_handler_destroy_notify (gpointer data)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    85
{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    86
	disco_items_reply_handler_t *cb = data;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    87
	if (cb -> notify)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    88
		cb -> notify (cb -> data);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    89
	g_free (cb);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    90
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    91
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    92
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    93
static void disco_handler_destroy_notify (gpointer data)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    94
{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    95
	disco_handler_t *cb = data;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    96
	g_free (cb -> jid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    97
	g_free (cb -> node);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    98
	g_free (cb);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    99
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   100
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   101
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   102
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   103
// lm reply handlers
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   104
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   105
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   106
static LmHandlerResult disco_info_reply_handler (LmMessageHandler *handler, LmConnection *connection, LmMessage *message, gpointer udata)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   107
{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   108
	disco_info_reply_handler_t *cb = udata;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   109
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   110
	reply_handlers = g_slist_remove (reply_handlers, handler);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   111
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   112
	switch (lm_message_get_sub_type (message)) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   113
	case LM_MESSAGE_SUB_TYPE_RESULT:
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   114
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   115
		{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   116
			LmMessageNode *node       = lm_message_get_node (message);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   117
			const gchar   *from       = lm_message_node_get_attribute (node, "from");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   118
			GSList        *identities = NULL;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   119
			GSList        *features   = NULL;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   120
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   121
			node = lm_message_node_get_child (node, "query");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   122
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   123
			// check xmlns
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   124
			if (!node || g_strcmp0 (lm_message_node_get_attribute (node, "xmlns"), NS_DISCO_INFO))
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   125
				break;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   126
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   127
			// parse request results
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   128
			if (node->children)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   129
				for (node = node->children; node; node = node->next)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   130
					if (!strcasecmp (node->name, "identity")) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   131
						disco_identity_t *identity = g_new (disco_identity_t, 1);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   132
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   133
						identity -> category = lm_message_node_get_attribute (node, "category");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   134
						identity -> type     = lm_message_node_get_attribute (node, "type");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   135
						identity -> name     = lm_message_node_get_attribute (node, "name");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   136
						identity -> reserved = NULL;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   137
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   138
						identities = g_slist_append (identities, identity);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   139
					} else if (!strcasecmp (node->name, "feature"))
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   140
						features = g_slist_insert_sorted (features, (gpointer) lm_message_node_get_attribute (node, "var"), (GCompareFunc) g_strcmp0);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   141
			
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   142
			// call handler
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   143
			cb -> handler (identities, features, cb -> data);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   144
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   145
			{ // free resources
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   146
				GSList *iel;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   147
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   148
				for (iel = identities; iel; iel = iel -> next)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   149
					g_free (iel -> data);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   150
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   151
				g_slist_free (identities);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   152
				g_slist_free (features);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   153
			}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   154
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   155
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   156
		break;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   157
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   158
	case LM_MESSAGE_SUB_TYPE_ERROR:
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   159
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   160
		{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   161
			LmMessageNode *node   = lm_message_get_node (message);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   162
			const gchar   *from   = lm_message_node_get_attribute (node, "from");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   163
			const gchar   *type;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   164
			const gchar   *reason;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   165
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   166
			node = lm_message_node_get_child (node, "error");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   167
			type = lm_message_node_get_attribute (node, "type");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   168
			if (node->children)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   169
				reason = node->children->name;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   170
			else
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   171
				reason = "undefined";
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   172
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   173
			// XXX: we need to inform user, but do we really need to print this on every possible error?
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   174
			scr_LogPrint (LPRINT_LOGNORM, "disco: Service info discovery for %s failed: %s - %s", from, type, reason);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   175
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   176
			cb -> handler (NULL, NULL, cb -> data);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   177
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   178
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   179
		break;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   180
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   181
	default:
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   182
		return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   183
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   184
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   185
	return LM_HANDLER_RESULT_REMOVE_MESSAGE;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   186
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   187
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   188
static LmHandlerResult disco_items_reply_handler (LmMessageHandler *handler, LmConnection *connection, LmMessage *message, gpointer udata)
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   189
{
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   190
	disco_items_reply_handler_t *cb = udata;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   191
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   192
	reply_handlers = g_slist_remove (reply_handlers, handler);
15
2aa6a333b0af Use handler object for request type indication
Myhailo Danylenko <isbear@ukrpost.net>
parents: 14
diff changeset
   193
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   194
	switch (lm_message_get_sub_type (message)) {
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   195
	case LM_MESSAGE_SUB_TYPE_RESULT:
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   196
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   197
		{
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   198
			LmMessageNode *node  = lm_message_get_node (message);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   199
			const gchar   *from  = lm_message_node_get_attribute (node, "from");
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   200
			GSList        *items = NULL;
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   201
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   202
			node = lm_message_node_get_child (node, "query");
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   203
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   204
			// check xmlns
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   205
			if (!node || g_strcmp0 (lm_message_node_get_attribute (node, "xmlns"), NS_DISCO_ITEMS))
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   206
				break;
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   207
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   208
			// parse request results
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   209
			if (node->children)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   210
				for (node = node->children; node; node = node->next)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   211
					if (!strcasecmp (node->name, "item")) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   212
						disco_item_t *item = g_new (disco_item_t, 1);
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   213
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   214
						item -> name = lm_message_node_get_attribute (node, "name");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   215
						item -> jid  = lm_message_node_get_attribute (node, "jid");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   216
						item -> node = lm_message_node_get_attribute (node, "node");
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   217
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   218
						items = g_slist_append (items, item);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   219
					}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   220
			
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   221
			// call handler
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   222
			cb -> handler (items, cb -> data);
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   223
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   224
			{ // free resources
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   225
				GSList *iel;
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   226
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   227
				for (iel = items; iel; iel = iel -> next)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   228
					g_free (iel -> data);
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   229
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   230
				g_slist_free (items);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   231
			}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   232
		}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   233
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   234
		break;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   235
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   236
	case LM_MESSAGE_SUB_TYPE_ERROR:
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   237
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   238
		{
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   239
			LmMessageNode *node   = lm_message_get_node (message);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   240
			const gchar   *from   = lm_message_node_get_attribute (node, "from");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   241
			const gchar   *type;
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   242
			const gchar   *reason;
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   243
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   244
			node = lm_message_node_get_child (node, "error");
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   245
			type = lm_message_node_get_attribute (node, "type");
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   246
			if (node->children)
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   247
				reason = node->children->name;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   248
			else
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   249
				reason = "undefined";
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   250
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   251
			// XXX: we need to inform user, but do we really need to print this on every possible error?
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   252
			scr_LogPrint (LPRINT_LOGNORM, "disco: Service items discovery for %s failed: %s - %s", from, type, reason);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   253
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   254
			cb -> handler (NULL, cb -> data);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   255
		}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   256
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   257
		break;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   258
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   259
	default:
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   260
		return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   261
	}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   262
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   263
	return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   264
}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   265
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   266
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   267
// disco requests sending
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   268
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   269
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   270
static void disco_features_cb (gconstpointer data, gpointer userdata)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   271
{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   272
	const gchar  *feature  = data;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   273
	GSList      **features = userdata;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   274
	*features = g_slist_insert_sorted (*features, (gpointer) feature, (GCompareFunc) g_strcmp0);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   275
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   276
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   277
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   278
void disco_info_request (const gchar *jid, const gchar *dnode, disco_info_handler_t handler, gpointer userdata, GDestroyNotify notify)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   279
{
22
6d0d6bbf98d0 Use xmpp_is_online and unregiste_reply_handler
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
   280
	if (!handler || !xmpp_is_online ()) {
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   281
		if (notify)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   282
			notify (userdata);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   283
		return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   284
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   285
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   286
	if (0 && !dnode) { // FIXME: no way to get identity(ies) from caps
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   287
		gchar       *bjid     = jidtodisp (jid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   288
		GSList      *buddy    = roster_find (bjid, jidsearch, ROSTER_TYPE_USER | ROSTER_TYPE_ROOM | ROSTER_TYPE_AGENT);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   289
		const gchar *resource = strchr (jid, JID_RESOURCE_SEPARATOR);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   290
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   291
		g_free (bjid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   292
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   293
		if (buddy) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   294
			const gchar *hash = buddy_resource_getcaps (BUDDATA(buddy), resource); // ?? will it all work?
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   295
			if (hash) { // cached result
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   296
				GSList *identities = NULL;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   297
				GSList *features   = NULL;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   298
				caps_foreach_feature (hash, disco_features_cb, &features);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   299
				handler (identities, features, userdata);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   300
				if (notify)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   301
					notify (userdata);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   302
				return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   303
			}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   304
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   305
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   306
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   307
	{ // send request
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   308
		LmMessage     *request;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   309
		LmMessageNode *node;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   310
		GError        *error   = NULL;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   311
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   312
		request = lm_message_new_with_sub_type (jid, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_GET);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   313
		node    = lm_message_get_node (request);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   314
		node    = lm_message_node_add_child (node, "query", NULL);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   315
		lm_message_node_set_attribute (node, "xmlns", NS_DISCO_INFO);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   316
		if (dnode)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   317
			lm_message_node_set_attribute (node, "node", dnode);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   318
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   319
		{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   320
			disco_info_reply_handler_t *cb       = g_new (disco_info_reply_handler_t, 1);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   321
			LmMessageHandler           *lhandler = lm_message_handler_new (disco_info_reply_handler, cb, disco_info_reply_handler_destroy_notify);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   322
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   323
			cb -> handler = handler;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   324
			cb -> data    = userdata;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   325
			cb -> notify  = notify;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   326
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   327
			reply_handlers = g_slist_append (reply_handlers, lhandler);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   328
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   329
			lm_connection_send_with_reply (lconnection, request, lhandler, &error);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   330
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   331
			if (error) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   332
				scr_LogPrint (LPRINT_DEBUG, "disco: Error sending disco request: %s.", error -> message);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   333
				g_error_free (error);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   334
			}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   335
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   336
			lm_message_handler_unref (lhandler);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   337
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   338
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   339
		lm_message_unref (request);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   340
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   341
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   342
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   343
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   344
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   345
void disco_items_request (const gchar *jid, const gchar *dnode, disco_items_handler_t handler, gpointer userdata, GDestroyNotify notify)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   346
{
22
6d0d6bbf98d0 Use xmpp_is_online and unregiste_reply_handler
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
   347
	if (!handler || !xmpp_is_online ()) {
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   348
		if (notify)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   349
			notify (userdata);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   350
		return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   351
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   352
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   353
	{ // send request
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   354
		LmMessage     *request;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   355
		LmMessageNode *node;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   356
		GError        *error   = NULL;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   357
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   358
		request = lm_message_new_with_sub_type (jid, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_GET);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   359
		node    = lm_message_get_node (request);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   360
		node    = lm_message_node_add_child (node, "query", NULL);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   361
		lm_message_node_set_attribute (node, "xmlns", NS_DISCO_ITEMS);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   362
		if (dnode)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   363
			lm_message_node_set_attribute (node, "node", dnode);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   364
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   365
		{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   366
			disco_items_reply_handler_t *cb       = g_new (disco_items_reply_handler_t, 1);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   367
			LmMessageHandler            *lhandler = lm_message_handler_new (disco_items_reply_handler, cb, disco_items_reply_handler_destroy_notify);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   368
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   369
			cb -> handler = handler;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   370
			cb -> data    = userdata;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   371
			cb -> notify  = notify;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   372
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   373
			reply_handlers = g_slist_append (reply_handlers, lhandler);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   374
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   375
			lm_connection_send_with_reply (lconnection, request, lhandler, &error);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   376
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   377
			if (error) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   378
				scr_LogPrint (LPRINT_DEBUG, "disco: Error sending disco request: %s.", error -> message);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   379
				g_error_free (error);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   380
			}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   381
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   382
			lm_message_handler_unref (lhandler);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   383
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   384
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   385
		lm_message_unref (request);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   386
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   387
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   388
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   389
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   390
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   391
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   392
// user requests handlers (print results)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   393
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   394
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   395
static void disco_info_handler (GSList *identities, GSList *features, gpointer udata)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   396
{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   397
	disco_handler_t *cb   = udata;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   398
	GString         *info = g_string_new ("Service discovery info results for ");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   399
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   400
	g_string_append (info, cb -> jid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   401
	if (cb -> node)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   402
		g_string_append_printf (info, " (%s):", cb -> node);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   403
	else
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   404
		g_string_append_c (info, ':');
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   405
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   406
	{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   407
		GString *tmp = g_string_new (NULL);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   408
		GSList  *el;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   409
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   410
		// compose identities part
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   411
		for (el = identities; el; el = el -> next) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   412
			disco_identity_t *identity = el -> data;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   413
			g_string_append_printf (tmp, "\n    [%s (%s)] %s",
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   414
			                        identity -> category ? identity -> category : "none",
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   415
			                        identity -> type ? identity -> type : "none",
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   416
									identity -> name ? identity -> name : "");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   417
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   418
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   419
		if (tmp -> len) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   420
			g_string_append_printf (info, "\n  Identities:%s", tmp -> str);
17
2780d5e74400 Fix identities displaying
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   421
			g_string_truncate (tmp, 0);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   422
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   423
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   424
		// compose features part
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   425
		for (el = features; el; el = el -> next) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   426
			gchar *feature = el -> data;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   427
			g_string_append_printf (tmp, "\n    [%s]", feature ? feature : "none");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   428
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   429
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   430
		if (tmp -> len)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   431
			g_string_append_printf (info, "\n  Features:%s", tmp -> str);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   432
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   433
		g_string_free (tmp, TRUE);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   434
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   435
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   436
	{ // print to buddy's buffer
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   437
		gchar *bjid = jidtodisp (cb -> jid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   438
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   439
		scr_WriteIncomingMessage (bjid, info -> str, 0, HBB_PREFIX_INFO, 0); // NO conversion from utf-8
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   440
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   441
		g_free (bjid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   442
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   443
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   444
	g_string_free (info, TRUE);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   445
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   446
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   447
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   448
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   449
static void disco_items_handler (GSList *items, gpointer udata)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   450
{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   451
	disco_handler_t *cb   = udata;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   452
	GString         *info = g_string_new ("Service discovery items results for ");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   453
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   454
	g_string_append (info, cb -> jid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   455
	if (cb -> node)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   456
		g_string_append_printf (info, " (%s):", cb -> node);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   457
	else
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   458
		g_string_append_c (info, ':');
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   459
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   460
	{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   461
		GSList  *el;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   462
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   463
		// add items info
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   464
		for (el = items; el; el = el -> next) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   465
			disco_item_t *item = el -> data;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   466
			if (item -> node)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   467
				g_string_append_printf (info, "\n  [%s (%s)] %s",
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   468
				                        item -> jid ? item -> jid : "none", item -> node,
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   469
										item -> name ? item -> name : "");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   470
			else
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   471
				g_string_append_printf (info, "\n  [%s] %s",
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   472
				                        item -> jid ? item -> jid : "none",
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   473
										item -> name ? item -> name : "");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   474
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   475
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   476
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   477
	{ // print to buddy's buffer
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   478
		gchar *bjid = jidtodisp (cb -> jid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   479
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   480
		scr_WriteIncomingMessage (bjid, info -> str, 0, HBB_PREFIX_INFO, 0); // NO conversion from utf-8
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   481
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   482
		g_free (bjid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   483
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   484
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   485
	g_string_free (info, TRUE);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   486
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   487
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   488
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   489
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   490
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   491
// command
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   492
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   493
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   494
static void do_disco (char *arg)
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   495
{
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   496
	char **args = split_arg (arg, 3, 0);
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   497
	int    info = -1;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   498
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   499
	if (!args[0] || !strcmp (args[0], "info"))
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   500
		info = 1;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   501
	else if (!strcmp (args[0], "items"))
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   502
		info = 0;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   503
	else
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   504
		scr_LogPrint (LPRINT_NORMAL, "Unknown subcomand.");
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   505
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   506
	if (info != -1) {
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   507
		char *to    = NULL;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   508
		char *dnode = NULL;
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   509
		
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   510
		if (args[0] && args[1]) {
13
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   511
			char *p = args[1];
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   512
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   513
			if (*p == '.') {
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   514
				if (*(p + 1) == JID_RESOURCE_SEPARATOR) {
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   515
					char *rest = to_utf8 (p + 1);
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   516
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   517
					to = g_strdup_printf ("%s%s", CURRENT_JID, rest);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   518
					g_free (rest);
13
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   519
				} else if (*(p + 1))
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   520
					to = to_utf8 (p);
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   521
			} else
13
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   522
				to = to_utf8 (p);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   523
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   524
			if (args[2])
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   525
				dnode = to_utf8 (args[2]);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   526
		}
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   527
			// XXX send to all resources/current resource?
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   528
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   529
		{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   530
			disco_handler_t *cb = g_new (disco_handler_t, 1);
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   531
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   532
			cb -> jid  = to ? to : g_strdup (CURRENT_JID);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   533
			cb -> node = dnode;
14
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   534
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   535
			if (info)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   536
				disco_info_request (cb -> jid, cb -> node, disco_info_handler, cb, disco_handler_destroy_notify);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   537
			else
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   538
				disco_items_request (cb -> jid, cb -> node, disco_items_handler, cb, disco_handler_destroy_notify);
14
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   539
		}
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   540
	}
7
c9ae7744e2f7 Free command args
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   541
c9ae7744e2f7 Free command args
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   542
	free_arg_lst (args);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   543
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   544
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   545
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   546
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   547
// module mechanics
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   548
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   549
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   550
static void disco_unregister_handlers (void)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   551
{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   552
	GSList *hel;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   553
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   554
	for (hel = reply_handlers; hel; hel = hel -> next) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   555
		LmMessageHandler *handler = hel -> data;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   556
		lm_message_handler_invalidate (handler);
22
6d0d6bbf98d0 Use xmpp_is_online and unregiste_reply_handler
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
   557
#ifdef HAVE_LM_CONNECTION_UNREGISTER_REPLY_HANDLER
6d0d6bbf98d0 Use xmpp_is_online and unregiste_reply_handler
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
   558
		if (lconnection)
23
63a8b60efcb2 Forgot to actually include config.h
Myhailo Danylenko <isbear@ukrpost.net>
parents: 22
diff changeset
   559
			lm_connection_unregister_reply_handler (lconnection, handler);
22
6d0d6bbf98d0 Use xmpp_is_online and unregiste_reply_handler
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
   560
#endif
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   561
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   562
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   563
	g_slist_free (reply_handlers);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   564
	reply_handlers = NULL;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   565
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   566
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   567
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   568
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   569
static void disco_hh (guint32 htype, hk_arg_t *args, gpointer ignore)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   570
{
21
299300f1dd31 Use split hooks if available
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   571
#ifdef HOOK_PRE_DISCONNECT
299300f1dd31 Use split hooks if available
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   572
	disco_unregister_handlers ();
299300f1dd31 Use split hooks if available
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   573
#else
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   574
	hk_arg_t *arg;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   575
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   576
	for (arg = args; arg->name; ++arg)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   577
		if (!strcmp (arg->name, "hook")) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   578
			if (!strcmp (arg->value, "hook-pre-disconnect"))
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   579
				disco_unregister_handlers ();
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   580
			return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   581
		}
21
299300f1dd31 Use split hooks if available
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   582
#endif
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   583
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   584
	return;
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   585
}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   586
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   587
const gchar *g_module_check_init(GModule *module)
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   588
{
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   589
	// completion
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   590
	disco_cid = compl_new_category ();
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   591
	if (disco_cid) {
5
6411dbdd32be Fixes of sleepyhead
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   592
		compl_add_category_word (disco_cid, "info");
6411dbdd32be Fixes of sleepyhead
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   593
		compl_add_category_word (disco_cid, "items");
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   594
	}
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   595
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   596
	// hook handler
21
299300f1dd31 Use split hooks if available
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   597
#ifdef HOOK_PRE_DISCONNECT
299300f1dd31 Use split hooks if available
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   598
	hk_add_handler (disco_hh, HOOK_PRE_DISCONNECT, NULL);
299300f1dd31 Use split hooks if available
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   599
#else
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   600
	hk_add_handler (disco_hh, HOOK_INTERNAL, NULL);
21
299300f1dd31 Use split hooks if available
Myhailo Danylenko <isbear@ukrpost.net>
parents: 18
diff changeset
   601
#endif
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   602
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   603
	// command
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   604
	cmd_add ("disco", "", disco_cid, COMPL_JID, do_disco, NULL);
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   605
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   606
	return NULL;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   607
}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   608
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   609
void g_module_unload(GModule *module)
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   610
{
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   611
	// command
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   612
	cmd_del ("disco");
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   613
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   614
	// completion
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   615
	if (disco_cid)
5
6411dbdd32be Fixes of sleepyhead
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   616
		compl_del_category (disco_cid);
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   617
	
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   618
	// hook handler
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   619
	hk_del_handler (disco_hh, NULL);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   620
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   621
	// unregister handlers
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   622
	disco_unregister_handlers ();
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   623
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   624
	return;
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   625
}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   626
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   627
/* vim: se ts=4 sw=4: */