Show messages on /group add and /group remove

closes #189
closes #190
This commit is contained in:
James Booth
2013-06-23 17:38:30 +01:00
parent dace47e5d3
commit d5e9ca649d
9 changed files with 130 additions and 8 deletions

View File

@@ -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)
{

View File

@@ -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);

View File

@@ -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);