disco.c
author Myhailo Danylenko <isbear@ukrpost.net>
Sat, 31 Oct 2009 14:08:09 +0200
changeset 1 434f4b4ff37b
parent 0 1f40c28a4cc8
child 3 c409300aa352
permissions -rw-r--r--
Did most of //TODO
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>
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
#include <strings.h>
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"
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    35
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    36
static LmHandlerResult disco_handler (LmMessageHandler *handler, LmConnection *connection, LmMessage *message, gpointer udata)
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    37
{
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    38
	int info_request = (int) udata;
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    39
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    40
	switch (lm_message_get_sub_type (message)) {
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
	case LM_MESSAGE_SUB_TYPE_RESULT:
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
		{
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    44
			LmMessageNode *node  = lm_message_get_node (message);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    45
			const gchar   *from  = lm_message_node_get_attribute (node, "from");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    46
			GString       *info;
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    47
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    48
			node = lm_message_node_get_child (node, "query");
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    49
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    50
			// check xmlns
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    51
			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
    52
				break;
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    53
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    54
			{ // header for user message
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    55
				const gchar *rnode = lm_message_node_get_attribute (node, "node");
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
				// create user message string
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    58
				info = g_string_new (NULL);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    59
				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
    60
				if (rnode)
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    61
					g_string_append_printf (info, " (%s):", rnode);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    62
				else
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    63
					g_string_append (info, ":");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    64
			}
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
			if (node->children) {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    67
				// parse request results
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    68
				if (info_request) { // info
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    69
					GString *identities = g_string_new (NULL);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    70
					GString *features   = g_string_new (NULL);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    71
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    72
					for (node = node->children; node; node = node->next) {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    73
						if (!strcasecmp (node->name, "identity")) {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    74
							const gchar *category = lm_message_node_get_attribute (node, "category");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    75
							const gchar *type     = lm_message_node_get_attribute (node, "type");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    76
							const gchar *name     = lm_message_node_get_attribute (node, "name");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    77
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    78
							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
    79
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    80
						} else if (!strcasecmp (node->name, "feature")) {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    81
							const gchar *var = lm_message_node_get_attribute (node, "var");
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
							g_string_append_printf (features, "\n    [%s]", var ? var : "none");
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
					}
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
					if (identities->str)
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    88
						g_string_append_printf (info, "\n  Identities:%s", identities->str);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    89
					if (features->str)
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    90
						g_string_append_printf (info, "\n  Features:%s", features->str);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    91
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    92
					g_string_free (identities, TRUE);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    93
					g_string_free (features, TRUE);
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
				} else { // items
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    96
					for (node = node->children; node; node = node->next) {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    97
						const gchar *name  = lm_message_node_get_attribute (node, "name");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    98
						const gchar *jid   = lm_message_node_get_attribute (node, "jid");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    99
						const gchar *inode = lm_message_node_get_attribute (node, "node");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   100
	
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   101
						if (inode)
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   102
							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
   103
						else
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   104
							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
   105
					}
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   106
				}
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   107
			} else
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   108
				g_string_append (info, "\n  Empty result.");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   109
			
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   110
			{ // print to buddy's buffer
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   111
				gchar *jid = jidtodisp (from);
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
				// 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
   114
				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
   115
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   116
				g_free (jid);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   117
			}
1
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_string_free (info, TRUE);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   120
		}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   121
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   122
		break;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   123
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   124
	case LM_MESSAGE_SUB_TYPE_ERROR:
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   125
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   126
		{
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   127
			LmMessageNode *node   = lm_message_get_node (message);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   128
			const gchar   *from   = lm_message_node_get_attribute (node, "from");
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   129
			const gchar   *type;
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   130
			const gchar   *reason;
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   131
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   132
			node = lm_message_node_get_child (node, "error");
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   133
			type = lm_message_node_get_attribute (node, "type");
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   134
			if (node->children)
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   135
				reason = node->children->name;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   136
			else
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   137
				reason = "undefined";
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   138
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   139
			{ // print to buddy's buffer
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   140
				gchar *jid  = jidtodisp (from);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   141
				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
   142
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   143
				scr_WriteIncomingMessage (jid, mesg, 0, HBB_PREFIX_INFO, 0);
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
				g_free (mesg);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   146
				g_free (jid);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   147
			}
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   148
		}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   149
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   150
		break;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   151
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   152
	default:
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   153
		return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   154
		break;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   155
	}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   156
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   157
	return LM_HANDLER_RESULT_REMOVE_MESSAGE;
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
static void do_disco (char *arg)
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   161
{
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   162
	char **args = split_arg (arg, 3, 0);
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   163
	int    info = -1;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   164
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   165
	if (!args[0] || !strcmp (args[0], "info"))
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   166
		info = 1;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   167
	else if (!strcmp (args[0], "items"))
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   168
		info = 0;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   169
	else
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   170
		scr_LogPrint (LPRINT_NORMAL, "Unknown subcomand.");
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   171
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   172
	if (info != -1) {
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   173
		LmMessageHandler *handler;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   174
		LmMessage        *request;
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   175
		char             *to      = NULL;
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   176
		char             *dnode   = NULL;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   177
		
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   178
		if (args[0] && args[1]) {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   179
			if (*args[1] == '.') {
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   180
				if (*(args[1] + 1) == JID_RESOURCE_SEPARATOR) { // allow "./resource" notation
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   181
					char *rest = to_utf8 (args[1] + 1);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   182
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   183
					to = g_strdup_printf ("%s%s", CURRENT_JID, rest);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   184
					g_free (rest);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   185
				}
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   186
			} else
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   187
				to = to_utf8 (args[1]);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   188
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   189
			if (args[2])
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   190
				dnode = to_utf8 (args[2]);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   191
		}
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   192
			// XXX send to all resources/current resource?
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   193
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   194
		handler = lm_message_handler_new (disco_handler, (gpointer) info, NULL);
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
		{ // create message
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   197
			LmMessageNode *node;
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   198
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   199
			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
   200
			node    = lm_message_get_node (request);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   201
			node    = lm_message_node_add_child (node, "query", NULL);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   202
			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
   203
			if (dnode)
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   204
				lm_message_node_set_attribute (node, "node", dnode);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   205
		}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   206
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   207
		lm_connection_send_with_reply (lconnection, request, handler, NULL);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   208
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   209
		g_free (to);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   210
		g_free (dnode);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   211
	}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   212
}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   213
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   214
const gchar *g_module_check_init(GModule *module)
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   215
{
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   216
	// TODO completion
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   217
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   218
	cmd_add ("disco", "", 0, COMPL_JID, do_disco, NULL);
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   219
	return NULL;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   220
}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   221
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   222
void g_module_unload(GModule *module)
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   223
{
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   224
	cmd_del ("disco");
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   225
}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   226
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   227
/* vim: se ts=4: */