disco.c
author Myhailo Danylenko <isbear@ukrpost.net>
Sat, 26 Dec 2009 05:28:52 +0200
changeset 15 2aa6a333b0af
parent 14 f43622080b3a
child 16 e903da874e63
permissions -rw-r--r--
Use handler object for request type indication
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
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
#include "commands.h"
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
#include "logprint.h"
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
#include "utils.h"
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
#include "xmpp.h"
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    30
#include "compl.h"
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    31
#include "xmpp_defines.h"
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    32
#include "screen.h"
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    33
#include "hbuf.h"
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    34
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    35
static guint             disco_cid                 = 0;
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    36
static LmMessageHandler *disco_info_reply_handler  = NULL;
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    37
static LmMessageHandler *disco_items_reply_handler = NULL;
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    38
15
2aa6a333b0af Use handler object for request type indication
Myhailo Danylenko <isbear@ukrpost.net>
parents: 14
diff changeset
    39
static LmHandlerResult disco_handler (LmMessageHandler *handler, LmConnection *connection, LmMessage *message, gpointer udata)
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    40
{
15
2aa6a333b0af Use handler object for request type indication
Myhailo Danylenko <isbear@ukrpost.net>
parents: 14
diff changeset
    41
	gboolean info_request = handler == disco_info_reply_handler ? TRUE : FALSE;
2aa6a333b0af Use handler object for request type indication
Myhailo Danylenko <isbear@ukrpost.net>
parents: 14
diff changeset
    42
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
	switch (lm_message_get_sub_type (message)) {
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
	case LM_MESSAGE_SUB_TYPE_RESULT:
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    46
		{
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    47
			LmMessageNode *node  = lm_message_get_node (message);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    48
			const gchar   *from  = lm_message_node_get_attribute (node, "from");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    49
			GString       *info;
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    50
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    51
			node = lm_message_node_get_child (node, "query");
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    52
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    53
			// check xmlns
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    54
			if (!node || strcmp (lm_message_node_get_attribute (node, "xmlns"), info_request ? NS_DISCO_INFO : NS_DISCO_ITEMS))
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    55
				break;
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    56
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    57
			{ // header for user message
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    58
				const gchar *rnode = lm_message_node_get_attribute (node, "node");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    59
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    60
				// create user message string
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    61
				info = g_string_new (NULL);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    62
				g_string_printf (info, "Service discovery %s results for %s", info_request ? "info" : "items", from);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    63
				if (rnode)
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    64
					g_string_append_printf (info, " (%s):", rnode);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    65
				else
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    66
					g_string_append (info, ":");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    67
			}
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    68
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    69
			if (node->children) {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    70
				// parse request results
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    71
				if (info_request) { // info
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    72
					GString *identities = g_string_new (NULL);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    73
					GString *features   = g_string_new (NULL);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    74
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    75
					for (node = node->children; node; node = node->next) {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    76
						if (!strcasecmp (node->name, "identity")) {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    77
							const gchar *category = lm_message_node_get_attribute (node, "category");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    78
							const gchar *type     = lm_message_node_get_attribute (node, "type");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    79
							const gchar *name     = lm_message_node_get_attribute (node, "name");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    80
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    81
							g_string_append_printf (identities, "\n    [%s (%s)] %s", category ? category : "none", type ? type : "none", name ? name : "");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    82
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    83
						} else if (!strcasecmp (node->name, "feature")) {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    84
							const gchar *var = lm_message_node_get_attribute (node, "var");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    85
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    86
							g_string_append_printf (features, "\n    [%s]", var ? var : "none");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    87
						}
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    88
					}
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    89
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    90
					if (identities->len)
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    91
						g_string_append_printf (info, "\n  Identities:%s", identities->str);
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    92
					if (features->len)
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    93
						g_string_append_printf (info, "\n  Features:%s", features->str);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    94
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    95
					g_string_free (identities, TRUE);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    96
					g_string_free (features, TRUE);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    97
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    98
				} else { // items
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    99
					for (node = node->children; node; node = node->next) {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   100
						const gchar *name  = lm_message_node_get_attribute (node, "name");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   101
						const gchar *jid   = lm_message_node_get_attribute (node, "jid");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   102
						const gchar *inode = lm_message_node_get_attribute (node, "node");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   103
	
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   104
						if (inode)
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   105
							g_string_append_printf (info, "\n  [%s (%s)] %s", jid ? jid : "none", inode, name ? name : "");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   106
						else
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   107
							g_string_append_printf (info, "\n  [%s] %s", jid ? jid : "none", name ? name : "");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   108
					}
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   109
				}
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   110
			} else
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   111
				g_string_append (info, "\n  Empty result.");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   112
			
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   113
			{ // print to buddy's buffer
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   114
				gchar *jid = jidtodisp (from);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   115
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   116
				// XXX check for message size? conference server lists may be huge...
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   117
				scr_WriteIncomingMessage (jid, info->str, 0, HBB_PREFIX_INFO, 0); // NO conversion from utf-8
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   118
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   119
				g_free (jid);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   120
			}
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   121
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   122
			g_string_free (info, TRUE);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   123
		}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   124
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   125
		break;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   126
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   127
	case LM_MESSAGE_SUB_TYPE_ERROR:
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   128
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   129
		{
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   130
			LmMessageNode *node   = lm_message_get_node (message);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   131
			const gchar   *from   = lm_message_node_get_attribute (node, "from");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   132
			const gchar   *type;
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   133
			const gchar   *reason;
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   134
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   135
			node = lm_message_node_get_child (node, "error");
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   136
			type = lm_message_node_get_attribute (node, "type");
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   137
			if (node->children)
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   138
				reason = node->children->name;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   139
			else
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   140
				reason = "undefined";
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   141
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   142
			{ // print to buddy's buffer
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   143
				gchar *jid  = jidtodisp (from);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   144
				gchar *mesg = g_strdup_printf ("Service %s discovery for %s failed: %s - %s", info_request ? "info" : "items", from, type, reason);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   145
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   146
				scr_WriteIncomingMessage (jid, mesg, 0, HBB_PREFIX_INFO, 0);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   147
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   148
				g_free (mesg);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   149
				g_free (jid);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   150
			}
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   151
		}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   152
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   153
		break;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   154
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   155
	default:
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   156
		return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   157
		break;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   158
	}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   159
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   160
	return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   161
}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   162
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   163
static void do_disco (char *arg)
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   164
{
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   165
	char **args = split_arg (arg, 3, 0);
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   166
	int    info = -1;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   167
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   168
	if (!args[0] || !strcmp (args[0], "info"))
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   169
		info = 1;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   170
	else if (!strcmp (args[0], "items"))
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   171
		info = 0;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   172
	else
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   173
		scr_LogPrint (LPRINT_NORMAL, "Unknown subcomand.");
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   174
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   175
	if (info != -1) {
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   176
		LmMessageHandler *handler;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   177
		LmMessage        *request;
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   178
		char             *to      = NULL;
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   179
		char             *dnode   = NULL;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   180
		
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   181
		if (args[0] && args[1]) {
13
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   182
			char *p = args[1];
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   183
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   184
			if (*p == '.') {
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   185
				if (*(p + 1) == JID_RESOURCE_SEPARATOR) {
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   186
					char *rest = to_utf8 (p + 1);
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   187
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   188
					to = g_strdup_printf ("%s%s", CURRENT_JID, rest);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   189
					g_free (rest);
13
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   190
				} else if (*(p + 1))
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   191
					to = to_utf8 (p);
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   192
			} else
13
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   193
				to = to_utf8 (p);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   194
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   195
			if (args[2])
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   196
				dnode = to_utf8 (args[2]);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   197
		}
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   198
			// XXX send to all resources/current resource?
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   199
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   200
		{ // create message
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   201
			LmMessageNode *node;
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   202
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   203
			request = lm_message_new_with_sub_type (to ? to : CURRENT_JID, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_GET);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   204
			node    = lm_message_get_node (request);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   205
			node    = lm_message_node_add_child (node, "query", NULL);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   206
			lm_message_node_set_attribute (node, "xmlns", info ? NS_DISCO_INFO : NS_DISCO_ITEMS);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   207
			if (dnode)
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   208
				lm_message_node_set_attribute (node, "node", dnode);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   209
		}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   210
14
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   211
		{
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   212
			GError *error = NULL;
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   213
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   214
			lm_connection_send_with_reply (lconnection, request, info ? disco_info_reply_handler : disco_items_reply_handler, &error);
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   215
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   216
			if (error) {
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   217
				scr_LogPrint (LPRINT_DEBUG, "disco: Error sending disco request: %s.", error -> message);
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   218
				g_error_free (error);
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   219
			}
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   220
		}
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   221
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   222
		lm_message_unref (request);
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   223
		if (dnode)
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   224
			g_free (dnode);
13
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   225
		if (to)
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   226
			g_free (to);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   227
	}
7
c9ae7744e2f7 Free command args
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   228
c9ae7744e2f7 Free command args
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   229
	free_arg_lst (args);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   230
}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   231
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   232
const gchar *g_module_check_init(GModule *module)
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   233
{
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   234
	// create handlers
15
2aa6a333b0af Use handler object for request type indication
Myhailo Danylenko <isbear@ukrpost.net>
parents: 14
diff changeset
   235
	disco_info_reply_handler  = lm_message_handler_new (disco_handler, NULL, NULL);
2aa6a333b0af Use handler object for request type indication
Myhailo Danylenko <isbear@ukrpost.net>
parents: 14
diff changeset
   236
	disco_items_reply_handler = lm_message_handler_new (disco_handler, NULL, NULL);
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   237
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   238
	// completion
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   239
	disco_cid = compl_new_category ();
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   240
	if (disco_cid) {
5
6411dbdd32be Fixes of sleepyhead
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   241
		compl_add_category_word (disco_cid, "info");
6411dbdd32be Fixes of sleepyhead
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   242
		compl_add_category_word (disco_cid, "items");
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   243
	}
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   244
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   245
	// command
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   246
	cmd_add ("disco", "", disco_cid, COMPL_JID, do_disco, NULL);
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   247
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   248
	return NULL;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   249
}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   250
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   251
void g_module_unload(GModule *module)
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   252
{
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   253
	// command
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   254
	cmd_del ("disco");
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   255
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   256
	// completion
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   257
	if (disco_cid)
5
6411dbdd32be Fixes of sleepyhead
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   258
		compl_del_category (disco_cid);
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   259
	
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   260
	// unregister handlers
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   261
	if (disco_info_reply_handler) {
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   262
		lm_message_handler_invalidate (disco_info_reply_handler);
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   263
		lm_message_handler_unref (disco_info_reply_handler);
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   264
	}
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   265
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   266
	if (disco_items_reply_handler) {
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   267
		lm_message_handler_invalidate (disco_items_reply_handler);
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   268
		lm_message_handler_unref (disco_items_reply_handler);
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   269
	}
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   270
}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   271
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   272
/* vim: se ts=4 sw=4: */