disco.c
author Myhailo Danylenko <isbear@ukrpost.net>
Sat, 12 Dec 2009 01:24:18 +0200
changeset 13 339e8bf46039
parent 12 4d2ac929e61a
child 14 f43622080b3a
permissions -rw-r--r--
Fix for jid parsing.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
/*
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
 * disco.c         -- Service discovery requests
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
 *
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
 * Copyrigth (C) 2009      Myhailo Danylenko <isbear@ukrpost.net>
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
 *
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or modify
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
 * the Free Software Foundation; either version 2 of the License, or (at
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
 * your option) any later version.
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
 *
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful, but
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
 * WITHOUT ANY WARRANTY; without even the implied warranty of
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
 * General Public License for more details.
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
 *
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
 * along with this program; if not, write to the Free Software
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
 * USA
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
 */
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
#include <glib.h>
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
#include <gmodule.h>
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
#include <loudmouth/loudmouth.h>
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    25
#include <string.h>
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    26
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    27
#include "commands.h"
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
#include "logprint.h"
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
#include "utils.h"
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    30
#include "xmpp.h"
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    31
#include "compl.h"
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    32
#include "xmpp_defines.h"
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    33
#include "screen.h"
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    34
#include "hbuf.h"
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    35
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    36
static guint             disco_cid                 = 0;
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    37
static LmMessageHandler *disco_info_reply_handler  = NULL;
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    38
static LmMessageHandler *disco_items_reply_handler = NULL;
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    39
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    40
static LmHandlerResult disco_handler (LmMessage *message, gboolean info_request)
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
{
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
	switch (lm_message_get_sub_type (message)) {
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
	case LM_MESSAGE_SUB_TYPE_RESULT:
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
		{
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    46
			LmMessageNode *node  = lm_message_get_node (message);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    47
			const gchar   *from  = lm_message_node_get_attribute (node, "from");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    48
			GString       *info;
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    49
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    50
			node = lm_message_node_get_child (node, "query");
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    51
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    52
			// check xmlns
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    53
			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
    54
				break;
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    55
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    56
			{ // header for user message
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    57
				const gchar *rnode = lm_message_node_get_attribute (node, "node");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    58
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    59
				// create user message string
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    60
				info = g_string_new (NULL);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    61
				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
    62
				if (rnode)
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    63
					g_string_append_printf (info, " (%s):", rnode);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    64
				else
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    65
					g_string_append (info, ":");
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
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    68
			if (node->children) {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    69
				// parse request results
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    70
				if (info_request) { // info
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    71
					GString *identities = g_string_new (NULL);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    72
					GString *features   = g_string_new (NULL);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    73
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    74
					for (node = node->children; node; node = node->next) {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    75
						if (!strcasecmp (node->name, "identity")) {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    76
							const gchar *category = lm_message_node_get_attribute (node, "category");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    77
							const gchar *type     = lm_message_node_get_attribute (node, "type");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    78
							const gchar *name     = lm_message_node_get_attribute (node, "name");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    79
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    80
							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
    81
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    82
						} else if (!strcasecmp (node->name, "feature")) {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    83
							const gchar *var = lm_message_node_get_attribute (node, "var");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    84
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    85
							g_string_append_printf (features, "\n    [%s]", var ? var : "none");
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
					}
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    88
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    89
					if (identities->len)
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    90
						g_string_append_printf (info, "\n  Identities:%s", identities->str);
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    91
					if (features->len)
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    92
						g_string_append_printf (info, "\n  Features:%s", features->str);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    93
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    94
					g_string_free (identities, TRUE);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    95
					g_string_free (features, TRUE);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    96
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    97
				} else { // items
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    98
					for (node = node->children; node; node = node->next) {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    99
						const gchar *name  = lm_message_node_get_attribute (node, "name");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   100
						const gchar *jid   = lm_message_node_get_attribute (node, "jid");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   101
						const gchar *inode = lm_message_node_get_attribute (node, "node");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   102
	
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   103
						if (inode)
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   104
							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
   105
						else
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   106
							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
   107
					}
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   108
				}
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   109
			} else
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   110
				g_string_append (info, "\n  Empty result.");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   111
			
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   112
			{ // print to buddy's buffer
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   113
				gchar *jid = jidtodisp (from);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   114
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   115
				// 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
   116
				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
   117
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   118
				g_free (jid);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   119
			}
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   120
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   121
			g_string_free (info, TRUE);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   122
		}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   123
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   124
		break;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   125
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   126
	case LM_MESSAGE_SUB_TYPE_ERROR:
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   127
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   128
		{
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   129
			LmMessageNode *node   = lm_message_get_node (message);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   130
			const gchar   *from   = lm_message_node_get_attribute (node, "from");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   131
			const gchar   *type;
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   132
			const gchar   *reason;
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   133
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   134
			node = lm_message_node_get_child (node, "error");
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   135
			type = lm_message_node_get_attribute (node, "type");
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   136
			if (node->children)
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   137
				reason = node->children->name;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   138
			else
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   139
				reason = "undefined";
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   140
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   141
			{ // print to buddy's buffer
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   142
				gchar *jid  = jidtodisp (from);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   143
				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
   144
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   145
				scr_WriteIncomingMessage (jid, mesg, 0, HBB_PREFIX_INFO, 0);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   146
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   147
				g_free (mesg);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   148
				g_free (jid);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   149
			}
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   150
		}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   151
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   152
		break;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   153
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   154
	default:
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   155
		return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   156
		break;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   157
	}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   158
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   159
	return LM_HANDLER_RESULT_REMOVE_MESSAGE;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   160
}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   161
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   162
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
   163
{
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   164
		return disco_handler (message, TRUE);
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
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   167
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
   168
{
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   169
		return disco_handler (message, FALSE);
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   170
}
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   171
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   172
static void do_disco (char *arg)
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   173
{
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   174
	char **args = split_arg (arg, 3, 0);
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   175
	int    info = -1;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   176
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   177
	if (!args[0] || !strcmp (args[0], "info"))
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   178
		info = 1;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   179
	else if (!strcmp (args[0], "items"))
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   180
		info = 0;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   181
	else
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   182
		scr_LogPrint (LPRINT_NORMAL, "Unknown subcomand.");
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   183
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   184
	if (info != -1) {
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   185
		LmMessageHandler *handler;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   186
		LmMessage        *request;
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   187
		char             *to      = NULL;
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   188
		char             *dnode   = NULL;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   189
		
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   190
		if (args[0] && args[1]) {
13
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   191
			char *p = args[1];
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   192
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   193
			if (*p == '.') {
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   194
				if (*(p + 1) == JID_RESOURCE_SEPARATOR) {
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   195
					char *rest = to_utf8 (p + 1);
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   196
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   197
					to = g_strdup_printf ("%s%s", CURRENT_JID, rest);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   198
					g_free (rest);
13
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   199
				} else if (*(p + 1))
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   200
					to = to_utf8 (p);
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   201
			} else
13
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   202
				to = to_utf8 (p);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   203
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   204
			if (args[2])
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   205
				dnode = to_utf8 (args[2]);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   206
		}
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   207
			// XXX send to all resources/current resource?
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   208
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   209
		{ // create message
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   210
			LmMessageNode *node;
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   211
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   212
			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
   213
			node    = lm_message_get_node (request);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   214
			node    = lm_message_node_add_child (node, "query", NULL);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   215
			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
   216
			if (dnode)
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   217
				lm_message_node_set_attribute (node, "node", dnode);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   218
		}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   219
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   220
		lm_connection_send_with_reply (lconnection, request, info ? disco_info_reply_handler : disco_items_reply_handler, NULL);
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
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   235
	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
   236
	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
   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: */