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