disco.c
author Myhailo Danylenko <isbear@ukrpost.net>
Thu, 13 Nov 2014 18:50:18 +0200
changeset 63 d644c08bbc27
parent 60 db0a96df96b5
permissions -rw-r--r--
[avv] Update avv description, minor cosmetics
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
32
14534d171215 Update copyright data and API version
Mikael Berthe <mikael@lilotux.net>
parents: 30
diff changeset
     2
/* Copyright 2009,2010 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 <loudmouth/loudmouth.h>
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
    23
#include <string.h>
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
63
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
    25
//#include <mcabber/caps.h>
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
    26
#include <mcabber/commands.h>      // cmd_add (), cmd_del ()
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
    27
#include <mcabber/compl.h>         // compl_new_category (), compl_del_category (), compl_add_category_word ()
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
    28
#include <mcabber/hbuf.h>          // HBB_PREFIX_INFO
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
    29
#include <mcabber/hooks.h>         // hk_add_handler (), hk_del_handler (), HOOK_PRE_DISCONNECT, HOOK_HANDLER_RESULT_*
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
    30
#include <mcabber/logprint.h>      // scr_log_print ()
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
    31
#include <mcabber/modules.h>       // module_info_t
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
    32
#include <mcabber/roster.h>        // buddy_getjid (), buddy_gettype (), current_buddy, BUDDATA ()
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
    33
#include <mcabber/screen.h>        // scr_write_incoming_message ()
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
    34
#include <mcabber/utils.h>         // to_utf8 (), free_arg_lst (), jidtodisp ()
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
    35
#include <mcabber/xmpp.h>          // xmpp_is_online (), lconnection
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
    36
#include <mcabber/xmpp_defines.h>  // NS_DISCO_INFO, NS_DISCO_ITEMS
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
    37
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    38
#include "disco.h"
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    39
23
63a8b60efcb2 Forgot to actually include config.h
Myhailo Danylenko <isbear@ukrpost.net>
parents: 22
diff changeset
    40
#include "config.h"
63a8b60efcb2 Forgot to actually include config.h
Myhailo Danylenko <isbear@ukrpost.net>
parents: 22
diff changeset
    41
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    42
//
27
0539bca09f11 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
    43
// module description
0539bca09f11 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
    44
//
0539bca09f11 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
    45
49
a9c3cc3626ca Update versions & add AVV description
Myhailo Danylenko <isbear@ukrpost.net>
parents: 37
diff changeset
    46
void disco_init   (void);
a9c3cc3626ca Update versions & add AVV description
Myhailo Danylenko <isbear@ukrpost.net>
parents: 37
diff changeset
    47
void disco_uninit (void);
27
0539bca09f11 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
    48
28
ff36ae7e2b1e Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    49
#define DESCRIPTION ( "Service discovery requests\nProvides command /disco" )
ff36ae7e2b1e Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    50
54
170801fe3bdf Use gslices and build-time api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 53
diff changeset
    51
module_info_t info_disco = {
170801fe3bdf Use gslices and build-time api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 53
diff changeset
    52
	.branch      = MCABBER_BRANCH,
170801fe3bdf Use gslices and build-time api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 53
diff changeset
    53
	.api         = MCABBER_API_VERSION,
28
ff36ae7e2b1e Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    54
	.version     = PROJECT_VERSION,
ff36ae7e2b1e Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    55
	.description = DESCRIPTION,
ff36ae7e2b1e Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    56
	.requires    = NULL,
ff36ae7e2b1e Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    57
	.init        = disco_init,
ff36ae7e2b1e Use new module struct with api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 27
diff changeset
    58
	.uninit      = disco_uninit,
49
a9c3cc3626ca Update versions & add AVV description
Myhailo Danylenko <isbear@ukrpost.net>
parents: 37
diff changeset
    59
	.next        = NULL,
27
0539bca09f11 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
    60
};
0539bca09f11 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
    61
0539bca09f11 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
    62
//
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    63
// private types
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    64
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    65
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
    66
#define DISCO_INFO_REQUEST  ( 0 )
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
    67
#define DISCO_ITEMS_REQUEST ( 1 )
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    68
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    69
// lm message handler userdata
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    70
typedef struct {
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
    71
	LmMessageHandler *   reply_handler;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
    72
	gpointer             data;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
    73
	GDestroyNotify       notify;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
    74
	guint                type;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
    75
	union {
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
    76
		disco_info_handler_t  info;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
    77
		disco_items_handler_t items;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
    78
	} handler;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
    79
} disco_request_t;
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    80
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    81
// user request disco handler userdata (common for info and items)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    82
typedef struct {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    83
	gchar *jid;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    84
	gchar *node;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    85
} disco_handler_t;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    86
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    87
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    88
// globals
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    89
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    90
63
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
    91
#ifdef HAVE_MCABBER_CMD_ID
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
    92
static gpointer disco_cmid     = NULL;
36
2910a8ca0d92 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 35
diff changeset
    93
#endif
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
    94
static guint    disco_cid      = 0;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
    95
static guint    disco_hid      = 0;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
    96
static GSList * disco_requests = NULL;
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    97
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    98
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
    99
// destroyers
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   100
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   101
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   102
static void disco_request_free ( disco_request_t * cb )
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   103
{
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   104
	disco_requests = g_slist_remove ( disco_requests, cb );
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   105
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   106
	if ( cb -> reply_handler ) {
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   107
		lm_message_handler_invalidate ( cb -> reply_handler );
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   108
#ifdef HAVE_LM_CONNECTION_UNREGISTER_REPLY_HANDLER
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   109
		if ( lconnection )
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   110
			lm_connection_unregister_reply_handler ( lconnection, cb -> reply_handler );
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   111
#endif
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   112
	}
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   113
	if ( cb -> notify )
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   114
		cb -> notify ( cb -> data );
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   115
	g_slice_free ( disco_request_t, cb );
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   116
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   117
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   118
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   119
static void disco_handler_destroy_notify ( gpointer data )
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   120
{
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   121
	disco_handler_t * cb = data;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   122
	g_free ( cb -> jid );
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   123
	g_free ( cb -> node );
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   124
	g_slice_free ( disco_handler_t, cb );
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   125
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   126
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   127
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   128
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   129
// lm reply handlers
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   130
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   131
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   132
static LmHandlerResult disco_reply_handler (LmMessageHandler *handler, LmConnection *connection, LmMessage *message, gpointer udata)
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   133
{
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   134
	disco_request_t * cb     = udata;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   135
	LmHandlerResult   result = LM_HANDLER_RESULT_REMOVE_MESSAGE;
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   136
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   137
	switch (lm_message_get_sub_type (message)) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   138
	case LM_MESSAGE_SUB_TYPE_RESULT:
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   139
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   140
		{
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   141
			LmMessageNode *node = lm_message_get_node (message);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   142
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   143
			node = lm_message_node_get_child (node, "query");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   144
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   145
			if ( cb -> type == DISCO_INFO_REQUEST ) {
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   146
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   147
				GSList * identities = NULL;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   148
				GSList * features   = NULL;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   149
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   150
				// check xmlns
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   151
				if (!node || g_strcmp0 (lm_message_node_get_attribute (node, "xmlns"), NS_DISCO_INFO))
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   152
					break;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   153
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   154
				// parse request results
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   155
				if (node->children)
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   156
					for (node = node->children; node; node = node->next)
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   157
						if (!strcasecmp (node->name, "identity")) {
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   158
							disco_identity_t *identity = g_slice_new (disco_identity_t);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   159
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   160
							identity -> category = lm_message_node_get_attribute (node, "category");
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   161
							identity -> type     = lm_message_node_get_attribute (node, "type");
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   162
							identity -> name     = lm_message_node_get_attribute (node, "name");
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   163
							identity -> reserved = NULL;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   164
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   165
							identities = g_slist_append (identities, identity);
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   166
						} else if (!strcasecmp (node->name, "feature"))
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   167
							features = g_slist_insert_sorted (features, (gpointer) lm_message_node_get_attribute (node, "var"), (GCompareFunc) g_strcmp0);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   168
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   169
				// call handler
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   170
				cb -> handler.info (identities, features, cb -> data);
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   171
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   172
				{ // free resources
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   173
					GSList *iel;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   174
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   175
					for (iel = identities; iel; iel = iel -> next)
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   176
						g_slice_free (disco_identity_t, iel -> data);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   177
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   178
					g_slist_free (identities);
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   179
					g_slist_free (features);
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   180
				}
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   181
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   182
			} else { // items request
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   183
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   184
				GSList * items = NULL;
33
104ecab6a1d5 Remove trailing space characters
Mikael Berthe <mikael@lilotux.net>
parents: 32
diff changeset
   185
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   186
				// check xmlns
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   187
				if (!node || g_strcmp0 (lm_message_node_get_attribute (node, "xmlns"), NS_DISCO_ITEMS))
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   188
					break;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   189
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   190
				// parse request results
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   191
				if (node->children)
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   192
					for (node = node->children; node; node = node->next)
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   193
						if (!strcasecmp (node->name, "item")) {
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   194
							disco_item_t *item = g_slice_new (disco_item_t);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   195
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   196
							item -> name = lm_message_node_get_attribute (node, "name");
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   197
							item -> jid  = lm_message_node_get_attribute (node, "jid");
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   198
							item -> node = lm_message_node_get_attribute (node, "node");
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   199
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   200
							items = g_slist_append (items, item);
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   201
						}
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   202
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   203
				// call handler
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   204
				cb -> handler.items (items, cb -> data);
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   205
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   206
				{ // free resources
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   207
					GSList *iel;
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   208
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   209
					for (iel = items; iel; iel = iel -> next)
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   210
						g_slice_free (disco_item_t, iel -> data);
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   211
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   212
					g_slist_free (items);
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   213
				}
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   214
			}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   215
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   216
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   217
		break;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   218
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   219
	case LM_MESSAGE_SUB_TYPE_ERROR:
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   220
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   221
		{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   222
			LmMessageNode *node   = lm_message_get_node (message);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   223
			const gchar   *from   = lm_message_node_get_attribute (node, "from");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   224
			const gchar   *type;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   225
			const gchar   *reason;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   226
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   227
			node = lm_message_node_get_child (node, "error");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   228
			type = lm_message_node_get_attribute (node, "type");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   229
			if (node->children)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   230
				reason = node->children->name;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   231
			else
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   232
				reason = "undefined";
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   233
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   234
			// XXX: we need to inform user, but do we really need to print this on every possible error?
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   235
			if ( cb -> type == DISCO_INFO_REQUEST ) {
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   236
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   237
				scr_log_print (LPRINT_LOGNORM, "disco: Service info discovery for %s failed: %s - %s", from, type, reason);
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   238
				cb -> handler.info (NULL, NULL, cb -> data);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   239
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   240
			} else {
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   241
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   242
				scr_log_print (LPRINT_LOGNORM, "disco: Service items discovery for %s failed: %s - %s", from, type, reason);
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   243
				cb -> handler.items (NULL, cb -> data);
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   244
			}
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   245
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   246
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   247
		break;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   248
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   249
	default:
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   250
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   251
		result = LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   252
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   253
		break;
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   254
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   255
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   256
	disco_request_free ( cb );
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   257
	
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   258
	return result;
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   259
}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   260
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   261
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   262
// disco requests sending
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   263
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   264
30
060c59f6f3de Fix compilation warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 29
diff changeset
   265
#if 0
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   266
static void disco_features_cb (gconstpointer data, gpointer userdata)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   267
{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   268
	const gchar  *feature  = data;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   269
	GSList      **features = userdata;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   270
	*features = g_slist_insert_sorted (*features, (gpointer) feature, (GCompareFunc) g_strcmp0);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   271
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   272
}
30
060c59f6f3de Fix compilation warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 29
diff changeset
   273
#endif
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   274
25
05469ec9c2e0 Add disco_cancel_request
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
   275
gpointer disco_info_request (const gchar *jid, const gchar *dnode, disco_info_handler_t handler, gpointer userdata, GDestroyNotify notify)
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   276
{
22
6d0d6bbf98d0 Use xmpp_is_online and unregiste_reply_handler
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
   277
	if (!handler || !xmpp_is_online ()) {
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   278
		if ( handler )
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   279
			handler ( NULL, NULL, userdata ); // XXX
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   280
		if ( notify )
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   281
			notify ( userdata );
25
05469ec9c2e0 Add disco_cancel_request
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
   282
		return NULL;
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   283
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   284
30
060c59f6f3de Fix compilation warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 29
diff changeset
   285
#if 0
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   286
	if (0 && !dnode) { // FIXME: no way to get identity(ies) from caps
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   287
		gchar       *bjid     = jidtodisp (jid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   288
		GSList      *buddy    = roster_find (bjid, jidsearch, ROSTER_TYPE_USER | ROSTER_TYPE_ROOM | ROSTER_TYPE_AGENT);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   289
		const gchar *resource = strchr (jid, JID_RESOURCE_SEPARATOR);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   290
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   291
		g_free (bjid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   292
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   293
		if (buddy) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   294
			const gchar *hash = buddy_resource_getcaps (BUDDATA(buddy), resource); // ?? will it all work?
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   295
			if (hash) { // cached result
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   296
				GSList *identities = NULL;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   297
				GSList *features   = NULL;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   298
				caps_foreach_feature (hash, disco_features_cb, &features);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   299
				handler (identities, features, userdata);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   300
				if (notify)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   301
					notify (userdata);
25
05469ec9c2e0 Add disco_cancel_request
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
   302
				return NULL;
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   303
			}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   304
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   305
	}
30
060c59f6f3de Fix compilation warnings
Myhailo Danylenko <isbear@ukrpost.net>
parents: 29
diff changeset
   306
#endif
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   307
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   308
	{ // send request
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   309
		LmMessage *        request;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   310
		LmMessageNode *    node;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   311
		LmMessageHandler * lhandler;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   312
		GError *           error    = NULL;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   313
		disco_request_t *  cb       = g_slice_new ( disco_request_t );
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   314
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   315
		request = lm_message_new_with_sub_type (jid, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_GET);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   316
		node    = lm_message_get_node (request);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   317
		node    = lm_message_node_add_child (node, "query", NULL);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   318
		lm_message_node_set_attribute (node, "xmlns", NS_DISCO_INFO);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   319
		if (dnode)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   320
			lm_message_node_set_attribute (node, "node", dnode);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   321
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   322
		lhandler = lm_message_handler_new (disco_reply_handler, cb, NULL);
33
104ecab6a1d5 Remove trailing space characters
Mikael Berthe <mikael@lilotux.net>
parents: 32
diff changeset
   323
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   324
		cb -> reply_handler = lhandler;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   325
		cb -> type          = DISCO_INFO_REQUEST;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   326
		cb -> handler.info  = handler;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   327
		cb -> data          = userdata;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   328
		cb -> notify        = notify;
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   329
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   330
		disco_requests = g_slist_append ( disco_requests, cb );
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   331
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   332
		lm_connection_send_with_reply (lconnection, request, lhandler, &error);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   333
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   334
		if (error) {
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   335
			scr_log_print (LPRINT_DEBUG, "disco: Error sending disco request: %s.", error -> message);
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   336
			g_error_free (error);
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   337
			handler ( NULL, NULL, userdata ); // XXX
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   338
			disco_request_free ( cb );
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   339
			cb = NULL;
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   340
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   341
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   342
		lm_message_handler_unref (lhandler);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   343
		lm_message_unref (request);
25
05469ec9c2e0 Add disco_cancel_request
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
   344
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   345
		return cb;
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   346
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   347
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   348
25
05469ec9c2e0 Add disco_cancel_request
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
   349
gpointer disco_items_request (const gchar *jid, const gchar *dnode, disco_items_handler_t handler, gpointer userdata, GDestroyNotify notify)
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   350
{
22
6d0d6bbf98d0 Use xmpp_is_online and unregiste_reply_handler
Myhailo Danylenko <isbear@ukrpost.net>
parents: 21
diff changeset
   351
	if (!handler || !xmpp_is_online ()) {
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   352
		if ( handler )
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   353
			handler ( NULL, userdata ); // XXX
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   354
		if ( notify )
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   355
			notify ( userdata );
25
05469ec9c2e0 Add disco_cancel_request
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
   356
		return NULL;
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   357
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   358
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   359
	{ // send request
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   360
		LmMessage *        request;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   361
		LmMessageNode *    node;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   362
		LmMessageHandler * lhandler;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   363
		GError *           error    = NULL;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   364
		disco_request_t *  cb       = g_slice_new (disco_request_t);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   365
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   366
		request = lm_message_new_with_sub_type (jid, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_GET);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   367
		node    = lm_message_get_node (request);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   368
		node    = lm_message_node_add_child (node, "query", NULL);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   369
		lm_message_node_set_attribute (node, "xmlns", NS_DISCO_ITEMS);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   370
		if (dnode)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   371
			lm_message_node_set_attribute (node, "node", dnode);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   372
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   373
		lhandler = lm_message_handler_new (disco_reply_handler, cb, NULL);
33
104ecab6a1d5 Remove trailing space characters
Mikael Berthe <mikael@lilotux.net>
parents: 32
diff changeset
   374
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   375
		cb -> reply_handler = lhandler;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   376
		cb -> type          = DISCO_ITEMS_REQUEST;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   377
		cb -> handler.items = handler;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   378
		cb -> data          = userdata;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   379
		cb -> notify        = notify;
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   380
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   381
		disco_requests = g_slist_append ( disco_requests, cb );
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   382
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   383
		lm_connection_send_with_reply (lconnection, request, lhandler, &error);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   384
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   385
		if (error) {
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   386
			scr_log_print (LPRINT_DEBUG, "disco: Error sending disco request: %s.", error -> message);
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   387
			g_error_free (error);
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   388
			handler ( NULL, userdata );
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   389
			disco_request_free ( cb );
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   390
			cb = NULL;
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   391
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   392
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   393
		lm_message_handler_unref (lhandler);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   394
		lm_message_unref (request);
25
05469ec9c2e0 Add disco_cancel_request
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
   395
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   396
		return cb;
25
05469ec9c2e0 Add disco_cancel_request
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
   397
	}
05469ec9c2e0 Add disco_cancel_request
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
   398
}
05469ec9c2e0 Add disco_cancel_request
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
   399
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   400
void disco_cancel_request ( gpointer id )
25
05469ec9c2e0 Add disco_cancel_request
Myhailo Danylenko <isbear@ukrpost.net>
parents: 23
diff changeset
   401
{
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   402
	if ( g_slist_find ( disco_requests, id ) ) {
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   403
		disco_request_t * cb = id;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   404
		disco_request_free ( cb );
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   405
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   406
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   407
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   408
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   409
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   410
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   411
// user requests handlers (print results)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   412
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   413
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   414
static void disco_info_handler (GSList *identities, GSList *features, gpointer udata)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   415
{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   416
	disco_handler_t *cb   = udata;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   417
	GString         *info = g_string_new ("Service discovery info results for ");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   418
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   419
	g_string_append (info, cb -> jid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   420
	if (cb -> node)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   421
		g_string_append_printf (info, " (%s):", cb -> node);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   422
	else
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   423
		g_string_append_c (info, ':');
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   424
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   425
	{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   426
		GString *tmp = g_string_new (NULL);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   427
		GSList  *el;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   428
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   429
		// compose identities part
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   430
		for (el = identities; el; el = el -> next) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   431
			disco_identity_t *identity = el -> data;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   432
			g_string_append_printf (tmp, "\n    [%s (%s)] %s",
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   433
			                        identity -> category ? identity -> category : "none",
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   434
			                        identity -> type ? identity -> type : "none",
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   435
									identity -> name ? identity -> name : "");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   436
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   437
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   438
		if (tmp -> len) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   439
			g_string_append_printf (info, "\n  Identities:%s", tmp -> str);
17
2780d5e74400 Fix identities displaying
Myhailo Danylenko <isbear@ukrpost.net>
parents: 16
diff changeset
   440
			g_string_truncate (tmp, 0);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   441
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   442
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   443
		// compose features part
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   444
		for (el = features; el; el = el -> next) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   445
			gchar *feature = el -> data;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   446
			g_string_append_printf (tmp, "\n    [%s]", feature ? feature : "none");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   447
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   448
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   449
		if (tmp -> len)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   450
			g_string_append_printf (info, "\n  Features:%s", tmp -> str);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   451
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   452
		g_string_free (tmp, TRUE);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   453
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   454
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   455
	{ // print to buddy's buffer
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   456
		gchar *bjid = jidtodisp (cb -> jid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   457
29
58001297bb7b Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
   458
		scr_write_incoming_message (bjid, info -> str, 0, HBB_PREFIX_INFO, 0); // NO conversion from utf-8
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   459
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   460
		g_free (bjid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   461
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   462
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   463
	g_string_free (info, TRUE);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   464
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   465
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   466
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   467
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   468
static void disco_items_handler (GSList *items, gpointer udata)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   469
{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   470
	disco_handler_t *cb   = udata;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   471
	GString         *info = g_string_new ("Service discovery items results for ");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   472
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   473
	g_string_append (info, cb -> jid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   474
	if (cb -> node)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   475
		g_string_append_printf (info, " (%s):", cb -> node);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   476
	else
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   477
		g_string_append_c (info, ':');
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   478
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   479
	{
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   480
		GSList  *el;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   481
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   482
		// add items info
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   483
		for (el = items; el; el = el -> next) {
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   484
			disco_item_t *item = el -> data;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   485
			if (item -> node)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   486
				g_string_append_printf (info, "\n  [%s (%s)] %s",
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   487
				                        item -> jid ? item -> jid : "none", item -> node,
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   488
										item -> name ? item -> name : "");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   489
			else
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   490
				g_string_append_printf (info, "\n  [%s] %s",
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   491
				                        item -> jid ? item -> jid : "none",
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   492
										item -> name ? item -> name : "");
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   493
		}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   494
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   495
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   496
	{ // print to buddy's buffer
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   497
		gchar *bjid = jidtodisp (cb -> jid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   498
29
58001297bb7b Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
   499
		scr_write_incoming_message (bjid, info -> str, 0, HBB_PREFIX_INFO, 0); // NO conversion from utf-8
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   500
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   501
		g_free (bjid);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   502
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   503
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   504
	g_string_free (info, TRUE);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   505
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   506
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   507
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   508
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   509
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   510
// command
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   511
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   512
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   513
static void do_disco (char *arg)
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   514
{
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   515
	char **args = split_arg (arg, 3, 0);
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   516
	int    info = -1;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   517
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   518
	if (!args[0] || !strcmp (args[0], "info"))
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   519
		info = 1;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   520
	else if (!strcmp (args[0], "items"))
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   521
		info = 0;
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   522
	else
29
58001297bb7b Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
   523
		scr_log_print (LPRINT_NORMAL, "Unknown subcomand.");
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   524
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   525
	if (info != -1) {
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   526
		char *to    = NULL;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   527
		char *dnode = NULL;
33
104ecab6a1d5 Remove trailing space characters
Mikael Berthe <mikael@lilotux.net>
parents: 32
diff changeset
   528
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   529
		if (args[0] && args[1]) {
13
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   530
			char *p = args[1];
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   531
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   532
			if (*p == '.') {
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   533
				if (*(p + 1) == JID_RESOURCE_SEPARATOR) {
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   534
					char *rest = to_utf8 (p + 1);
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   535
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   536
					to = g_strdup_printf ("%s%s", CURRENT_JID, rest);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   537
					g_free (rest);
13
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   538
				} else if (*(p + 1))
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   539
					to = to_utf8 (p);
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   540
			} else
13
339e8bf46039 Fix for jid parsing.
Myhailo Danylenko <isbear@ukrpost.net>
parents: 12
diff changeset
   541
				to = to_utf8 (p);
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   542
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   543
			if (args[2])
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   544
				dnode = to_utf8 (args[2]);
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   545
		}
34
1a62a570e66b Fix a segfault when the selected item is not a valid disco target
Mikael Berthe <mikael@lilotux.net>
parents: 33
diff changeset
   546
39
ab9dad1e6d66 Merge with an updated copy of isbear repository
Mikael Berthe <mikael@lilotux.net>
parents: 37 34
diff changeset
   547
		if (!to) {
ab9dad1e6d66 Merge with an updated copy of isbear repository
Mikael Berthe <mikael@lilotux.net>
parents: 37 34
diff changeset
   548
			// Use currently selected item, if possible
34
1a62a570e66b Fix a segfault when the selected item is not a valid disco target
Mikael Berthe <mikael@lilotux.net>
parents: 33
diff changeset
   549
			if (current_buddy) {
39
ab9dad1e6d66 Merge with an updated copy of isbear repository
Mikael Berthe <mikael@lilotux.net>
parents: 37 34
diff changeset
   550
				gpointer bud = BUDDATA(current_buddy);
34
1a62a570e66b Fix a segfault when the selected item is not a valid disco target
Mikael Berthe <mikael@lilotux.net>
parents: 33
diff changeset
   551
				if (bud) {
1a62a570e66b Fix a segfault when the selected item is not a valid disco target
Mikael Berthe <mikael@lilotux.net>
parents: 33
diff changeset
   552
					guint type = buddy_gettype (bud);
1a62a570e66b Fix a segfault when the selected item is not a valid disco target
Mikael Berthe <mikael@lilotux.net>
parents: 33
diff changeset
   553
					if (type != ROSTER_TYPE_GROUP && type != ROSTER_TYPE_SPECIAL)
63
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
   554
						to = g_strdup (buddy_getjid (bud));
39
ab9dad1e6d66 Merge with an updated copy of isbear repository
Mikael Berthe <mikael@lilotux.net>
parents: 37 34
diff changeset
   555
				}
34
1a62a570e66b Fix a segfault when the selected item is not a valid disco target
Mikael Berthe <mikael@lilotux.net>
parents: 33
diff changeset
   556
			}
39
ab9dad1e6d66 Merge with an updated copy of isbear repository
Mikael Berthe <mikael@lilotux.net>
parents: 37 34
diff changeset
   557
		}
34
1a62a570e66b Fix a segfault when the selected item is not a valid disco target
Mikael Berthe <mikael@lilotux.net>
parents: 33
diff changeset
   558
1a62a570e66b Fix a segfault when the selected item is not a valid disco target
Mikael Berthe <mikael@lilotux.net>
parents: 33
diff changeset
   559
		if (!to) {
39
ab9dad1e6d66 Merge with an updated copy of isbear repository
Mikael Berthe <mikael@lilotux.net>
parents: 37 34
diff changeset
   560
			scr_log_print (LPRINT_NORMAL, "Invalid disco target.");
ab9dad1e6d66 Merge with an updated copy of isbear repository
Mikael Berthe <mikael@lilotux.net>
parents: 37 34
diff changeset
   561
			free_arg_lst (args);
ab9dad1e6d66 Merge with an updated copy of isbear repository
Mikael Berthe <mikael@lilotux.net>
parents: 37 34
diff changeset
   562
			return;
34
1a62a570e66b Fix a segfault when the selected item is not a valid disco target
Mikael Berthe <mikael@lilotux.net>
parents: 33
diff changeset
   563
		}
1a62a570e66b Fix a segfault when the selected item is not a valid disco target
Mikael Berthe <mikael@lilotux.net>
parents: 33
diff changeset
   564
1a62a570e66b Fix a segfault when the selected item is not a valid disco target
Mikael Berthe <mikael@lilotux.net>
parents: 33
diff changeset
   565
		// XXX send to all resources/current resource?
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   566
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   567
		{
54
170801fe3bdf Use gslices and build-time api
Myhailo Danylenko <isbear@ukrpost.net>
parents: 53
diff changeset
   568
			disco_handler_t *cb = g_slice_new (disco_handler_t);
1
434f4b4ff37b Did most of //TODO
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   569
34
1a62a570e66b Fix a segfault when the selected item is not a valid disco target
Mikael Berthe <mikael@lilotux.net>
parents: 33
diff changeset
   570
			cb -> jid  = to;
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   571
			cb -> node = dnode;
14
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   572
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   573
			if (info)
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   574
				disco_info_request (cb -> jid, cb -> node, disco_info_handler, cb, disco_handler_destroy_notify);
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   575
			else
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   576
				disco_items_request (cb -> jid, cb -> node, disco_items_handler, cb, disco_handler_destroy_notify);
14
f43622080b3a Check for request sending error
Myhailo Danylenko <isbear@ukrpost.net>
parents: 13
diff changeset
   577
		}
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   578
	}
7
c9ae7744e2f7 Free command args
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   579
c9ae7744e2f7 Free command args
Myhailo Danylenko <isbear@ukrpost.net>
parents: 6
diff changeset
   580
	free_arg_lst (args);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   581
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   582
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   583
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   584
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   585
// module mechanics
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   586
//
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   587
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   588
static void disco_cancel_requests (void)
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   589
{
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   590
	GSList * rel = disco_requests;
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   591
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   592
	while ( rel ) {
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   593
		disco_request_t * cb = rel -> data;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   594
		rel = rel -> next;
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   595
		if ( cb -> type == DISCO_INFO_REQUEST )
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   596
			cb -> handler.info ( NULL, NULL, cb -> data );
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   597
		else
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   598
			cb -> handler.items ( NULL, cb -> data );
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   599
		disco_request_free ( cb );
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   600
	}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   601
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   602
	return;
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   603
}
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   604
29
58001297bb7b Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
   605
static guint disco_hh (const gchar *htype, hk_arg_t *args, gpointer ignore)
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   606
{
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   607
	disco_cancel_requests ();
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   608
	
29
58001297bb7b Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
   609
	return HOOK_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   610
}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   611
49
a9c3cc3626ca Update versions & add AVV description
Myhailo Danylenko <isbear@ukrpost.net>
parents: 37
diff changeset
   612
void disco_init (void)
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   613
{
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   614
	// completion
63
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
   615
#ifdef HAVE_MCABBER_COMPLETION_FLAGS
59
50173578fddc Comply with dev:24
Myhailo Danylenko <isbear@ukrpost.net>
parents: 54
diff changeset
   616
	disco_cid = compl_new_category (COMPL_FLAGS_SORT);
50173578fddc Comply with dev:24
Myhailo Danylenko <isbear@ukrpost.net>
parents: 54
diff changeset
   617
#else
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   618
	disco_cid = compl_new_category ();
59
50173578fddc Comply with dev:24
Myhailo Danylenko <isbear@ukrpost.net>
parents: 54
diff changeset
   619
#endif
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   620
	if (disco_cid) {
5
6411dbdd32be Fixes of sleepyhead
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   621
		compl_add_category_word (disco_cid, "info");
6411dbdd32be Fixes of sleepyhead
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   622
		compl_add_category_word (disco_cid, "items");
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   623
	}
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   624
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   625
	// hook handler
29
58001297bb7b Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
   626
	disco_hid = hk_add_handler (disco_hh, HOOK_PRE_DISCONNECT, G_PRIORITY_DEFAULT, NULL);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   627
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   628
	// command
63
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
   629
#ifndef HAVE_MCABBER_CMD_ID
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   630
	cmd_add ("disco", "", disco_cid, COMPL_JID, do_disco, NULL);
36
2910a8ca0d92 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 35
diff changeset
   631
#else
2910a8ca0d92 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 35
diff changeset
   632
	disco_cmid = cmd_add ("disco", "", disco_cid, COMPL_JID, do_disco, NULL);
2910a8ca0d92 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 35
diff changeset
   633
#endif
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   634
27
0539bca09f11 New module loading scheme
Myhailo Danylenko <isbear@ukrpost.net>
parents: 26
diff changeset
   635
	return;
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   636
}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   637
49
a9c3cc3626ca Update versions & add AVV description
Myhailo Danylenko <isbear@ukrpost.net>
parents: 37
diff changeset
   638
void disco_uninit (void)
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   639
{
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   640
	// command
63
d644c08bbc27 [avv] Update avv description, minor cosmetics
Myhailo Danylenko <isbear@ukrpost.net>
parents: 60
diff changeset
   641
#ifndef HAVE_MCABBER_CMD_ID
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   642
	cmd_del ("disco");
36
2910a8ca0d92 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 35
diff changeset
   643
#else
2910a8ca0d92 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 35
diff changeset
   644
	if (disco_cmid)
2910a8ca0d92 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 35
diff changeset
   645
		cmd_del (disco_cmid);
2910a8ca0d92 Use id to delete command
Myhailo Danylenko <isbear@ukrpost.net>
parents: 35
diff changeset
   646
#endif
3
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   647
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   648
	// completion
c409300aa352 Free resources
Myhailo Danylenko <isbear@ukrpost.net>
parents: 1
diff changeset
   649
	if (disco_cid)
5
6411dbdd32be Fixes of sleepyhead
Myhailo Danylenko <isbear@ukrpost.net>
parents: 4
diff changeset
   650
		compl_del_category (disco_cid);
33
104ecab6a1d5 Remove trailing space characters
Mikael Berthe <mikael@lilotux.net>
parents: 32
diff changeset
   651
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   652
	// hook handler
29
58001297bb7b Update hooks
Myhailo Danylenko <isbear@ukrpost.net>
parents: 28
diff changeset
   653
	hk_del_handler (HOOK_PRE_DISCONNECT, disco_hid);
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   654
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   655
	// unregister handlers
60
db0a96df96b5 Notify user when cancelling requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 59
diff changeset
   656
	disco_cancel_requests ();
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   657
16
e903da874e63 Provide public interface to disco requests
Myhailo Danylenko <isbear@ukrpost.net>
parents: 15
diff changeset
   658
	return;
0
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   659
}
1f40c28a4cc8 Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   660
12
4d2ac929e61a Use persistant reply handlers
Myhailo Danylenko <isbear@ukrpost.net>
parents: 9
diff changeset
   661
/* vim: se ts=4 sw=4: */