static xt_status jabber_iq_version_response( struct im_connection *ic, struct xt_node *node, struct xt_node *orig ) { struct xt_node *query; GString *rets; char *s; char *ret[2] = {}; bee_user_t *bu; struct jabber_buddy *bud = NULL; if( ( s = xt_find_attr( node, "from" ) ) && ( bud = jabber_buddy_by_jid( ic, s, 0 ) ) && ( query = xt_find_node( node->children, "query" ) ) && ( bu = bee_user_by_handle( ic->bee, ic, bud->bare_jid ) ) ) { rets = g_string_new( "Resource " ); g_string_append( rets, bud->resource ); } else return XT_HANDLED; for( query = query->children; query; query = query->next ) if( query->text_len > 0 ) g_string_append_printf( rets, " %s: %s,", query->name, query->text ); g_string_truncate( rets, rets->len - 1 ); ret[0] = rets->str; imcb_buddy_action_response( bu, "VERSION", ret, NULL ); g_string_free( rets, TRUE ); return XT_HANDLED; }
static void torchat_parse_latency(struct im_connection *ic, char *address, char* line) { bee_user_t *bu = bee_user_by_handle(ic->bee, ic, address); int size = 1; char** argv = g_realloc_n(NULL, size, sizeof(char*)); char **pieces, **pieceptr, *piece; pieceptr = pieces = g_strsplit(line, " ", 0); while ((piece = *pieceptr++) && strlen(piece)) { argv = g_realloc_n(argv, ++size, sizeof(char*)); argv[size - 2] = piece; } argv[size - 1] = 0; imcb_buddy_action_response(bu, "PING", argv, NULL); g_free(argv); g_strfreev(pieces); }