mirror of
https://git.jabber.space/devs/cproof.git
synced 2026-07-25 23:46:21 +00:00
@@ -21,6 +21,7 @@
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <glib.h>
|
||||
@@ -55,12 +56,26 @@ static GHashTable *contacts;
|
||||
// nickname to jid map
|
||||
static GHashTable *name_to_barejid;
|
||||
|
||||
// callback data for group commands
|
||||
typedef struct _group_data {
|
||||
char *name;
|
||||
char *group;
|
||||
} GroupData;
|
||||
|
||||
// event handlers
|
||||
static int _roster_handle_push(xmpp_conn_t * const conn,
|
||||
xmpp_stanza_t * const stanza, void * const userdata);
|
||||
static int _roster_handle_result(xmpp_conn_t * const conn,
|
||||
xmpp_stanza_t * const stanza, void * const userdata);
|
||||
|
||||
// id handlers
|
||||
static int
|
||||
_group_add_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
|
||||
void * const userdata);
|
||||
static int
|
||||
_group_remove_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
|
||||
void * const userdata);
|
||||
|
||||
// helper functions
|
||||
static void _add_name_and_barejid(const char * const name,
|
||||
const char * const barejid);
|
||||
@@ -141,7 +156,7 @@ roster_add_new(const char * const barejid, const char * const name)
|
||||
{
|
||||
xmpp_conn_t * const conn = connection_get_conn();
|
||||
xmpp_ctx_t * const ctx = connection_get_ctx();
|
||||
xmpp_stanza_t *iq = stanza_create_roster_set(ctx, barejid, name, NULL);
|
||||
xmpp_stanza_t *iq = stanza_create_roster_set(ctx, NULL, barejid, name, NULL);
|
||||
xmpp_send(conn, iq);
|
||||
xmpp_stanza_release(iq);
|
||||
}
|
||||
@@ -279,7 +294,7 @@ roster_change_name(const char * const barejid, const char * const new_name)
|
||||
|
||||
xmpp_conn_t * const conn = connection_get_conn();
|
||||
xmpp_ctx_t * const ctx = connection_get_ctx();
|
||||
xmpp_stanza_t *iq = stanza_create_roster_set(ctx, barejid, new_name,
|
||||
xmpp_stanza_t *iq = stanza_create_roster_set(ctx, NULL, barejid, new_name,
|
||||
groups);
|
||||
xmpp_send(conn, iq);
|
||||
xmpp_stanza_release(iq);
|
||||
@@ -312,13 +327,40 @@ roster_add_to_group(const char * const group, const char * const barejid)
|
||||
|
||||
xmpp_conn_t * const conn = connection_get_conn();
|
||||
xmpp_ctx_t * const ctx = connection_get_ctx();
|
||||
xmpp_stanza_t *iq = stanza_create_roster_set(ctx, barejid,
|
||||
|
||||
// add an id handler to handle the response
|
||||
char *unique_id = get_unique_id();
|
||||
GroupData *data = malloc(sizeof(GroupData));
|
||||
data->group = strdup(group);
|
||||
if (p_contact_name(contact) != NULL) {
|
||||
data->name = strdup(p_contact_name(contact));
|
||||
} else {
|
||||
data->name = strdup(p_contact_barejid(contact));
|
||||
}
|
||||
|
||||
xmpp_id_handler_add(conn, _group_add_handler, unique_id, data);
|
||||
xmpp_stanza_t *iq = stanza_create_roster_set(ctx, unique_id, barejid,
|
||||
p_contact_name(contact), new_groups);
|
||||
xmpp_send(conn, iq);
|
||||
xmpp_stanza_release(iq);
|
||||
free(unique_id);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
_group_add_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
|
||||
void * const userdata)
|
||||
{
|
||||
if (userdata != NULL) {
|
||||
GroupData *data = userdata;
|
||||
prof_handle_group_add(data->name, data->group);
|
||||
free(data->name);
|
||||
free(data->group);
|
||||
free(userdata);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
roster_remove_from_group(const char * const group, const char * const barejid)
|
||||
{
|
||||
@@ -345,14 +387,41 @@ roster_remove_from_group(const char * const group, const char * const barejid)
|
||||
|
||||
xmpp_conn_t * const conn = connection_get_conn();
|
||||
xmpp_ctx_t * const ctx = connection_get_ctx();
|
||||
xmpp_stanza_t *iq = stanza_create_roster_set(ctx, barejid,
|
||||
|
||||
// add an id handler to handle the response
|
||||
char *unique_id = get_unique_id();
|
||||
GroupData *data = malloc(sizeof(GroupData));
|
||||
data->group = strdup(group);
|
||||
if (p_contact_name(contact) != NULL) {
|
||||
data->name = strdup(p_contact_name(contact));
|
||||
} else {
|
||||
data->name = strdup(p_contact_barejid(contact));
|
||||
}
|
||||
|
||||
xmpp_id_handler_add(conn, _group_remove_handler, unique_id, data);
|
||||
xmpp_stanza_t *iq = stanza_create_roster_set(ctx, unique_id, barejid,
|
||||
p_contact_name(contact), new_groups);
|
||||
xmpp_send(conn, iq);
|
||||
xmpp_stanza_release(iq);
|
||||
free(unique_id);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static int
|
||||
_group_remove_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
|
||||
void * const userdata)
|
||||
{
|
||||
if (userdata != NULL) {
|
||||
GroupData *data = userdata;
|
||||
prof_handle_group_remove(data->name, data->group);
|
||||
free(data->name);
|
||||
free(data->group);
|
||||
free(userdata);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
gboolean
|
||||
roster_has_pending_subscriptions(void)
|
||||
{
|
||||
|
||||
@@ -119,12 +119,15 @@ stanza_create_roster_remove_set(xmpp_ctx_t *ctx, const char * const barejid)
|
||||
}
|
||||
|
||||
xmpp_stanza_t *
|
||||
stanza_create_roster_set(xmpp_ctx_t *ctx, const char * const jid,
|
||||
const char * const handle, GSList *groups)
|
||||
stanza_create_roster_set(xmpp_ctx_t *ctx, const char * const id,
|
||||
const char * const jid, const char * const handle, GSList *groups)
|
||||
{
|
||||
xmpp_stanza_t *iq = xmpp_stanza_new(ctx);
|
||||
xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
|
||||
xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
|
||||
if (id != NULL) {
|
||||
xmpp_stanza_set_id(iq, id);
|
||||
}
|
||||
|
||||
xmpp_stanza_t *query = xmpp_stanza_new(ctx);
|
||||
xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
|
||||
|
||||
@@ -179,8 +179,8 @@ xmpp_stanza_t * stanza_create_disco_items_iq(xmpp_ctx_t *ctx, const char * const
|
||||
char * stanza_get_status(xmpp_stanza_t *stanza, char *def);
|
||||
char * stanza_get_show(xmpp_stanza_t *stanza, char *def);
|
||||
|
||||
xmpp_stanza_t * stanza_create_roster_set(xmpp_ctx_t *ctx, const char * const jid,
|
||||
const char * const handle, GSList *groups);
|
||||
xmpp_stanza_t * stanza_create_roster_set(xmpp_ctx_t *ctx, const char * const id,
|
||||
const char * const jid, const char * const handle, GSList *groups);
|
||||
xmpp_stanza_t * stanza_create_roster_remove_set(xmpp_ctx_t *ctx,
|
||||
const char * const barejid);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user