1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-12-04 14:46:46 -05:00

Merge branch 'master' into caps

This commit is contained in:
James Booth 2016-08-13 00:17:23 +01:00
commit 5c6e75fa06

View File

@ -61,23 +61,22 @@
#include "xmpp/form.h" #include "xmpp/form.h"
#include "xmpp/muc.h" #include "xmpp/muc.h"
static void _stanza_add_unique_id(xmpp_stanza_t *stanza, char *prefix);
static char* _stanza_text_to_str(xmpp_stanza_t *stanza);
#if 0 #if 0
xmpp_stanza_t* xmpp_stanza_t*
stanza_create_bookmarks_pubsub_request(xmpp_ctx_t *ctx) stanza_create_bookmarks_pubsub_request(xmpp_ctx_t *ctx)
{ {
xmpp_stanza_t *iq, *pubsub, *items; xmpp_stanza_t *iq = xmpp_stanza_new(ctx);
/* TODO: check pointers for NULL */
iq = xmpp_stanza_new(ctx);
pubsub = xmpp_stanza_new(ctx);
items = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_GET); xmpp_stanza_set_type(iq, STANZA_TYPE_GET);
xmpp_stanza_t *pubsub = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(pubsub, STANZA_NAME_PUBSUB); xmpp_stanza_set_name(pubsub, STANZA_NAME_PUBSUB);
xmpp_stanza_set_ns(pubsub, STANZA_NS_PUBSUB); xmpp_stanza_set_ns(pubsub, STANZA_NS_PUBSUB);
xmpp_stanza_t *items = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(items, STANZA_NAME_ITEMS); xmpp_stanza_set_name(items, STANZA_NAME_ITEMS);
xmpp_stanza_set_attribute(items, "node", "storage:bookmarks"); xmpp_stanza_set_attribute(items, "node", "storage:bookmarks");
@ -93,20 +92,16 @@ stanza_create_bookmarks_pubsub_request(xmpp_ctx_t *ctx)
xmpp_stanza_t* xmpp_stanza_t*
stanza_create_bookmarks_storage_request(xmpp_ctx_t *ctx) stanza_create_bookmarks_storage_request(xmpp_ctx_t *ctx)
{ {
xmpp_stanza_t *iq, *query, *storage; xmpp_stanza_t *iq = xmpp_stanza_new(ctx);
/* TODO: check pointers for NULL */
iq = xmpp_stanza_new(ctx);
query = xmpp_stanza_new(ctx);
storage = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_GET); xmpp_stanza_set_type(iq, STANZA_TYPE_GET);
xmpp_stanza_set_ns(iq, "jabber:client"); xmpp_stanza_set_ns(iq, "jabber:client");
xmpp_stanza_t *query = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(query, STANZA_NAME_QUERY); xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
xmpp_stanza_set_ns(query, "jabber:iq:private"); xmpp_stanza_set_ns(query, "jabber:iq:private");
xmpp_stanza_t *storage = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(storage, STANZA_NAME_STORAGE); xmpp_stanza_set_name(storage, STANZA_NAME_STORAGE);
xmpp_stanza_set_ns(storage, "storage:bookmarks"); xmpp_stanza_set_ns(storage, "storage:bookmarks");
@ -121,14 +116,11 @@ stanza_create_bookmarks_storage_request(xmpp_ctx_t *ctx)
xmpp_stanza_t* xmpp_stanza_t*
stanza_create_blocked_list_request(xmpp_ctx_t *ctx) stanza_create_blocked_list_request(xmpp_ctx_t *ctx)
{ {
xmpp_stanza_t *iq, *blocklist; xmpp_stanza_t *iq = xmpp_stanza_new(ctx);
iq = xmpp_stanza_new(ctx);
blocklist = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_GET); xmpp_stanza_set_type(iq, STANZA_TYPE_GET);
xmpp_stanza_t *blocklist = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(blocklist, STANZA_NAME_BLOCKLIST); xmpp_stanza_set_name(blocklist, STANZA_NAME_BLOCKLIST);
xmpp_stanza_set_ns(blocklist, STANZA_NS_BLOCKING); xmpp_stanza_set_ns(blocklist, STANZA_NS_BLOCKING);
@ -145,9 +137,7 @@ stanza_create_bookmarks_pubsub_add(xmpp_ctx_t *ctx, const char *const jid,
{ {
xmpp_stanza_t *stanza = xmpp_stanza_new(ctx); xmpp_stanza_t *stanza = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(stanza, STANZA_NAME_IQ); xmpp_stanza_set_name(stanza, STANZA_NAME_IQ);
char *id = create_unique_id("bookmark_add"); _stanza_add_unique_id(stanza, "bookmark_add");
xmpp_stanza_set_id(stanza, id);
free(id);
xmpp_stanza_set_type(stanza, STANZA_TYPE_SET); xmpp_stanza_set_type(stanza, STANZA_TYPE_SET);
xmpp_stanza_t *pubsub = xmpp_stanza_new(ctx); xmpp_stanza_t *pubsub = xmpp_stanza_new(ctx);
@ -236,8 +226,6 @@ xmpp_stanza_t*
stanza_create_http_upload_request(xmpp_ctx_t *ctx, const char *const id, stanza_create_http_upload_request(xmpp_ctx_t *ctx, const char *const id,
const char *const jid, HTTPUpload *upload) const char *const jid, HTTPUpload *upload)
{ {
int i;
xmpp_stanza_t *iq = xmpp_stanza_new(ctx); xmpp_stanza_t *iq = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_GET); xmpp_stanza_set_type(iq, STANZA_TYPE_GET);
@ -253,6 +241,7 @@ stanza_create_http_upload_request(xmpp_ctx_t *ctx, const char *const id,
xmpp_stanza_t *filename_txt = xmpp_stanza_new(ctx); xmpp_stanza_t *filename_txt = xmpp_stanza_new(ctx);
char* filename_cpy = strdup(upload->filename); char* filename_cpy = strdup(upload->filename);
// strip spaces from filename (servers don't spaces) // strip spaces from filename (servers don't spaces)
int i;
for (i=0; i<strlen(filename_cpy); i++) { for (i=0; i<strlen(filename_cpy); i++) {
if (filename_cpy[i] == ' ') { if (filename_cpy[i] == ' ') {
filename_cpy[i] = '_'; filename_cpy[i] = '_';
@ -291,12 +280,9 @@ xmpp_stanza_t*
stanza_enable_carbons(xmpp_ctx_t *ctx) stanza_enable_carbons(xmpp_ctx_t *ctx)
{ {
xmpp_stanza_t *iq = xmpp_stanza_new(ctx); xmpp_stanza_t *iq = xmpp_stanza_new(ctx);
char *id = create_unique_id("carbons");
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_SET); xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
xmpp_stanza_set_id(iq, id); _stanza_add_unique_id(iq, "carbons");
free(id);
xmpp_stanza_t *carbons_enable = xmpp_stanza_new(ctx); xmpp_stanza_t *carbons_enable = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(carbons_enable, STANZA_NAME_ENABLE); xmpp_stanza_set_name(carbons_enable, STANZA_NAME_ENABLE);
@ -312,12 +298,9 @@ xmpp_stanza_t*
stanza_disable_carbons(xmpp_ctx_t *ctx) stanza_disable_carbons(xmpp_ctx_t *ctx)
{ {
xmpp_stanza_t *iq = xmpp_stanza_new(ctx); xmpp_stanza_t *iq = xmpp_stanza_new(ctx);
char *id = create_unique_id("carbons");
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_SET); xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
xmpp_stanza_set_id(iq, id); _stanza_add_unique_id(iq, "carbons");
free(id);
xmpp_stanza_t *carbons_disable = xmpp_stanza_new(ctx); xmpp_stanza_t *carbons_disable = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(carbons_disable, STANZA_NAME_DISABLE); xmpp_stanza_set_name(carbons_disable, STANZA_NAME_DISABLE);
@ -332,17 +315,14 @@ stanza_disable_carbons(xmpp_ctx_t *ctx)
xmpp_stanza_t* xmpp_stanza_t*
stanza_create_chat_state(xmpp_ctx_t *ctx, const char *const fulljid, const char *const state) stanza_create_chat_state(xmpp_ctx_t *ctx, const char *const fulljid, const char *const state)
{ {
xmpp_stanza_t *msg, *chat_state; xmpp_stanza_t *msg = xmpp_stanza_new(ctx);
msg = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(msg, STANZA_NAME_MESSAGE); xmpp_stanza_set_name(msg, STANZA_NAME_MESSAGE);
xmpp_stanza_set_type(msg, STANZA_TYPE_CHAT); xmpp_stanza_set_type(msg, STANZA_TYPE_CHAT);
xmpp_stanza_set_attribute(msg, STANZA_ATTR_TO, fulljid); xmpp_stanza_set_attribute(msg, STANZA_ATTR_TO, fulljid);
char *id = create_unique_id(NULL); _stanza_add_unique_id(msg, NULL);
xmpp_stanza_set_id(msg, id);
free(id);
chat_state = xmpp_stanza_new(ctx);
xmpp_stanza_t *chat_state = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(chat_state, state); xmpp_stanza_set_name(chat_state, state);
xmpp_stanza_set_ns(chat_state, STANZA_NS_CHATSTATES); xmpp_stanza_set_ns(chat_state, STANZA_NS_CHATSTATES);
xmpp_stanza_add_child(msg, chat_state); xmpp_stanza_add_child(msg, chat_state);
@ -462,18 +442,16 @@ xmpp_stanza_t*
stanza_create_message(xmpp_ctx_t *ctx, char *id, const char *const recipient, stanza_create_message(xmpp_ctx_t *ctx, char *id, const char *const recipient,
const char *const type, const char *const message) const char *const type, const char *const message)
{ {
xmpp_stanza_t *msg, *body, *text; xmpp_stanza_t *msg = xmpp_stanza_new(ctx);
msg = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(msg, STANZA_NAME_MESSAGE); xmpp_stanza_set_name(msg, STANZA_NAME_MESSAGE);
xmpp_stanza_set_type(msg, type); xmpp_stanza_set_type(msg, type);
xmpp_stanza_set_attribute(msg, STANZA_ATTR_TO, recipient); xmpp_stanza_set_attribute(msg, STANZA_ATTR_TO, recipient);
xmpp_stanza_set_id(msg, id); xmpp_stanza_set_id(msg, id);
body = xmpp_stanza_new(ctx); xmpp_stanza_t *body = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(body, STANZA_NAME_BODY); xmpp_stanza_set_name(body, STANZA_NAME_BODY);
text = xmpp_stanza_new(ctx); xmpp_stanza_t *text = xmpp_stanza_new(ctx);
xmpp_stanza_set_text(text, message); xmpp_stanza_set_text(text, message);
xmpp_stanza_add_child(body, text); xmpp_stanza_add_child(body, text);
xmpp_stanza_release(text); xmpp_stanza_release(text);
@ -489,10 +467,7 @@ stanza_create_roster_remove_set(xmpp_ctx_t *ctx, const char *const barejid)
xmpp_stanza_t *iq = xmpp_stanza_new(ctx); xmpp_stanza_t *iq = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_SET); xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
_stanza_add_unique_id(iq, "roster");
char *id = create_unique_id("roster");
xmpp_stanza_set_id(iq, id);
free(id);
xmpp_stanza_t *query = xmpp_stanza_new(ctx); xmpp_stanza_t *query = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(query, STANZA_NAME_QUERY); xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
@ -561,16 +536,12 @@ xmpp_stanza_t*
stanza_create_invite(xmpp_ctx_t *ctx, const char *const room, stanza_create_invite(xmpp_ctx_t *ctx, const char *const room,
const char *const contact, const char *const reason, const char *const password) const char *const contact, const char *const reason, const char *const password)
{ {
xmpp_stanza_t *message, *x; xmpp_stanza_t *message = xmpp_stanza_new(ctx);
message = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(message, STANZA_NAME_MESSAGE); xmpp_stanza_set_name(message, STANZA_NAME_MESSAGE);
xmpp_stanza_set_attribute(message, STANZA_ATTR_TO, contact); xmpp_stanza_set_attribute(message, STANZA_ATTR_TO, contact);
char *id = create_unique_id(NULL); _stanza_add_unique_id(message, NULL);
xmpp_stanza_set_id(message, id);
free(id);
x = xmpp_stanza_new(ctx); xmpp_stanza_t *x = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(x, STANZA_NAME_X); xmpp_stanza_set_name(x, STANZA_NAME_X);
xmpp_stanza_set_ns(x, STANZA_NS_CONFERENCE); xmpp_stanza_set_ns(x, STANZA_NS_CONFERENCE);
@ -592,20 +563,16 @@ xmpp_stanza_t*
stanza_create_mediated_invite(xmpp_ctx_t *ctx, const char *const room, stanza_create_mediated_invite(xmpp_ctx_t *ctx, const char *const room,
const char *const contact, const char *const reason) const char *const contact, const char *const reason)
{ {
xmpp_stanza_t *message, *x, *invite; xmpp_stanza_t *message = xmpp_stanza_new(ctx);
message = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(message, STANZA_NAME_MESSAGE); xmpp_stanza_set_name(message, STANZA_NAME_MESSAGE);
xmpp_stanza_set_attribute(message, STANZA_ATTR_TO, room); xmpp_stanza_set_attribute(message, STANZA_ATTR_TO, room);
char *id = create_unique_id(NULL); _stanza_add_unique_id(message, NULL);
xmpp_stanza_set_id(message, id);
free(id);
x = xmpp_stanza_new(ctx); xmpp_stanza_t *x = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(x, STANZA_NAME_X); xmpp_stanza_set_name(x, STANZA_NAME_X);
xmpp_stanza_set_ns(x, STANZA_NS_MUC_USER); xmpp_stanza_set_ns(x, STANZA_NS_MUC_USER);
invite = xmpp_stanza_new(ctx); xmpp_stanza_t *invite = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(invite, STANZA_NAME_INVITE); xmpp_stanza_set_name(invite, STANZA_NAME_INVITE);
xmpp_stanza_set_attribute(invite, STANZA_ATTR_TO, contact); xmpp_stanza_set_attribute(invite, STANZA_ATTR_TO, contact);
@ -635,15 +602,12 @@ stanza_create_room_join_presence(xmpp_ctx_t *const ctx,
xmpp_stanza_t *presence = xmpp_stanza_new(ctx); xmpp_stanza_t *presence = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(presence, STANZA_NAME_PRESENCE); xmpp_stanza_set_name(presence, STANZA_NAME_PRESENCE);
xmpp_stanza_set_attribute(presence, STANZA_ATTR_TO, full_room_jid); xmpp_stanza_set_attribute(presence, STANZA_ATTR_TO, full_room_jid);
char *id = create_unique_id("join"); _stanza_add_unique_id(presence, "join");
xmpp_stanza_set_id(presence, id);
free(id);
xmpp_stanza_t *x = xmpp_stanza_new(ctx); xmpp_stanza_t *x = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(x, STANZA_NAME_X); xmpp_stanza_set_name(x, STANZA_NAME_X);
xmpp_stanza_set_ns(x, STANZA_NS_MUC); xmpp_stanza_set_ns(x, STANZA_NS_MUC);
// if a password was given
if (passwd) { if (passwd) {
xmpp_stanza_t *pass = xmpp_stanza_new(ctx); xmpp_stanza_t *pass = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(pass, "password"); xmpp_stanza_set_name(pass, "password");
@ -666,9 +630,7 @@ stanza_create_room_newnick_presence(xmpp_ctx_t *ctx,
const char *const full_room_jid) const char *const full_room_jid)
{ {
xmpp_stanza_t *presence = xmpp_stanza_new(ctx); xmpp_stanza_t *presence = xmpp_stanza_new(ctx);
char *id = create_unique_id("sub"); _stanza_add_unique_id(presence, "sub");
xmpp_stanza_set_id(presence, id);
free(id);
xmpp_stanza_set_name(presence, STANZA_NAME_PRESENCE); xmpp_stanza_set_name(presence, STANZA_NAME_PRESENCE);
xmpp_stanza_set_attribute(presence, STANZA_ATTR_TO, full_room_jid); xmpp_stanza_set_attribute(presence, STANZA_ATTR_TO, full_room_jid);
@ -687,9 +649,7 @@ stanza_create_room_leave_presence(xmpp_ctx_t *ctx, const char *const room,
xmpp_stanza_set_name(presence, STANZA_NAME_PRESENCE); xmpp_stanza_set_name(presence, STANZA_NAME_PRESENCE);
xmpp_stanza_set_type(presence, STANZA_TYPE_UNAVAILABLE); xmpp_stanza_set_type(presence, STANZA_TYPE_UNAVAILABLE);
xmpp_stanza_set_attribute(presence, STANZA_ATTR_TO, full_jid->str); xmpp_stanza_set_attribute(presence, STANZA_ATTR_TO, full_jid->str);
char *id = create_unique_id("leave"); _stanza_add_unique_id(presence, "leave");
xmpp_stanza_set_id(presence, id);
free(id);
g_string_free(full_jid, TRUE); g_string_free(full_jid, TRUE);
@ -703,9 +663,7 @@ stanza_create_instant_room_request_iq(xmpp_ctx_t *ctx, const char *const room_ji
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_SET); xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room_jid); xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room_jid);
char *id = create_unique_id("room"); _stanza_add_unique_id(iq, "room");
xmpp_stanza_set_id(iq, id);
free(id);
xmpp_stanza_t *query = xmpp_stanza_new(ctx); xmpp_stanza_t *query = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(query, STANZA_NAME_QUERY); xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
@ -732,9 +690,7 @@ stanza_create_instant_room_destroy_iq(xmpp_ctx_t *ctx, const char *const room_ji
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_SET); xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room_jid); xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room_jid);
char *id = create_unique_id("room"); _stanza_add_unique_id(iq, "room");
xmpp_stanza_set_id(iq, id);
free(id);
xmpp_stanza_t *query = xmpp_stanza_new(ctx); xmpp_stanza_t *query = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(query, STANZA_NAME_QUERY); xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
@ -759,9 +715,7 @@ stanza_create_room_config_request_iq(xmpp_ctx_t *ctx, const char *const room_jid
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_GET); xmpp_stanza_set_type(iq, STANZA_TYPE_GET);
xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room_jid); xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room_jid);
char *id = create_unique_id("room"); _stanza_add_unique_id(iq, "room");
xmpp_stanza_set_id(iq, id);
free(id);
xmpp_stanza_t *query = xmpp_stanza_new(ctx); xmpp_stanza_t *query = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(query, STANZA_NAME_QUERY); xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
@ -780,9 +734,7 @@ stanza_create_room_config_cancel_iq(xmpp_ctx_t *ctx, const char *const room_jid)
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_SET); xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room_jid); xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room_jid);
char *id = create_unique_id("room"); _stanza_add_unique_id(iq, "room");
xmpp_stanza_set_id(iq, id);
free(id);
xmpp_stanza_t *query = xmpp_stanza_new(ctx); xmpp_stanza_t *query = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(query, STANZA_NAME_QUERY); xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
@ -809,9 +761,7 @@ stanza_create_room_affiliation_list_iq(xmpp_ctx_t *ctx, const char *const room,
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_GET); xmpp_stanza_set_type(iq, STANZA_TYPE_GET);
xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room); xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room);
char *id = create_unique_id("affiliation_get"); _stanza_add_unique_id(iq, "affiliation_get");
xmpp_stanza_set_id(iq, id);
free(id);
xmpp_stanza_t *query = xmpp_stanza_new(ctx); xmpp_stanza_t *query = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(query, STANZA_NAME_QUERY); xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
@ -836,9 +786,7 @@ stanza_create_room_role_list_iq(xmpp_ctx_t *ctx, const char *const room, const c
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_GET); xmpp_stanza_set_type(iq, STANZA_TYPE_GET);
xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room); xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room);
char *id = create_unique_id("role_get"); _stanza_add_unique_id(iq, "role_get");
xmpp_stanza_set_id(iq, id);
free(id);
xmpp_stanza_t *query = xmpp_stanza_new(ctx); xmpp_stanza_t *query = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(query, STANZA_NAME_QUERY); xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
@ -864,9 +812,7 @@ stanza_create_room_affiliation_set_iq(xmpp_ctx_t *ctx, const char *const room, c
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_SET); xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room); xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room);
char *id = create_unique_id("affiliation_set"); _stanza_add_unique_id(iq, "affiliation_set");
xmpp_stanza_set_id(iq, id);
free(id);
xmpp_stanza_t *query = xmpp_stanza_new(ctx); xmpp_stanza_t *query = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(query, STANZA_NAME_QUERY); xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
@ -905,9 +851,7 @@ stanza_create_room_role_set_iq(xmpp_ctx_t *const ctx, const char *const room, co
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_SET); xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room); xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room);
char *id = create_unique_id("role_set"); _stanza_add_unique_id(iq, "role_set");
xmpp_stanza_set_id(iq, id);
free(id);
xmpp_stanza_t *query = xmpp_stanza_new(ctx); xmpp_stanza_t *query = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(query, STANZA_NAME_QUERY); xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
@ -946,9 +890,7 @@ stanza_create_room_kick_iq(xmpp_ctx_t *const ctx, const char *const room, const
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_SET); xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room); xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room);
char *id = create_unique_id("room_kick"); _stanza_add_unique_id(iq, "room_kick");
xmpp_stanza_set_id(iq, id);
free(id);
xmpp_stanza_t *query = xmpp_stanza_new(ctx); xmpp_stanza_t *query = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(query, STANZA_NAME_QUERY); xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
@ -994,11 +936,7 @@ stanza_create_software_version_iq(xmpp_ctx_t *ctx, const char *const fulljid)
xmpp_stanza_t *iq = xmpp_stanza_new(ctx); xmpp_stanza_t *iq = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_GET); xmpp_stanza_set_type(iq, STANZA_TYPE_GET);
_stanza_add_unique_id(iq, "sv");
char *id = create_unique_id("sv");
xmpp_stanza_set_id(iq, id);
free(id);
xmpp_stanza_set_attribute(iq, "to", fulljid); xmpp_stanza_set_attribute(iq, "to", fulljid);
xmpp_stanza_t *query = xmpp_stanza_new(ctx); xmpp_stanza_t *query = xmpp_stanza_new(ctx);
@ -1098,9 +1036,7 @@ stanza_create_room_config_submit_iq(xmpp_ctx_t *ctx, const char *const room, Dat
xmpp_stanza_set_name(iq, STANZA_NAME_IQ); xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
xmpp_stanza_set_type(iq, STANZA_TYPE_SET); xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room); xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room);
char *id = create_unique_id("roomconf_submit"); _stanza_add_unique_id(iq, "roomconf_submit");
xmpp_stanza_set_id(iq, id);
free(id);
xmpp_stanza_t *query = xmpp_stanza_new(ctx); xmpp_stanza_t *query = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(query, STANZA_NAME_QUERY); xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
@ -1135,9 +1071,7 @@ stanza_create_ping_iq(xmpp_ctx_t *ctx, const char *const target)
if (target) { if (target) {
xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, target); xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, target);
} }
char *id = create_unique_id("ping"); _stanza_add_unique_id(iq, "ping");
xmpp_stanza_set_id(iq, id);
free(id);
xmpp_stanza_t *ping = xmpp_stanza_new(ctx); xmpp_stanza_t *ping = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(ping, STANZA_NAME_PING); xmpp_stanza_set_name(ping, STANZA_NAME_PING);
@ -1191,20 +1125,10 @@ stanza_get_delay(xmpp_stanza_t *const stanza)
char* char*
stanza_get_status(xmpp_stanza_t *stanza, char *def) stanza_get_status(xmpp_stanza_t *stanza, char *def)
{ {
xmpp_ctx_t *ctx = connection_get_ctx(); xmpp_stanza_t *status = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_STATUS);
xmpp_stanza_t *status =
xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_STATUS);
if (status) { if (status) {
// xmpp_free and free may be different functions so convert all to return _stanza_text_to_str(status);
// libc malloc
char *s1, *s2 = NULL;
s1 = xmpp_stanza_get_text(status);
if (s1) {
s2 = strdup(s1);
xmpp_free(ctx, s1);
}
return s2;
} else if (def) { } else if (def) {
return strdup(def); return strdup(def);
} else { } else {
@ -1215,20 +1139,10 @@ stanza_get_status(xmpp_stanza_t *stanza, char *def)
char* char*
stanza_get_show(xmpp_stanza_t *stanza, char *def) stanza_get_show(xmpp_stanza_t *stanza, char *def)
{ {
xmpp_ctx_t *ctx = connection_get_ctx(); xmpp_stanza_t *show = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_SHOW);
xmpp_stanza_t *show =
xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_SHOW);
if (show) { if (show) {
// xmpp_free and free may be different functions so convert all to return _stanza_text_to_str(show);
// libc malloc
char *s1, *s2 = NULL;
s1 = xmpp_stanza_get_text(show);
if (s1) {
s2 = strdup(s1);
xmpp_free(ctx, s1);
}
return s2;
} else if (def) { } else if (def) {
return strdup(def); return strdup(def);
} else { } else {
@ -1265,7 +1179,9 @@ stanza_muc_requires_config(xmpp_stanza_t *const stanza)
// muc user namespaced x element // muc user namespaced x element
xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER); xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
if (x) { if (x == NULL) {
return FALSE;
}
// check for item element with owner affiliation // check for item element with owner affiliation
xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(x, "item"); xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(x, "item");
@ -1288,7 +1204,7 @@ stanza_muc_requires_config(xmpp_stanza_t *const stanza)
} }
x_children = xmpp_stanza_get_next(x_children); x_children = xmpp_stanza_get_next(x_children);
} }
}
return FALSE; return FALSE;
} }
@ -1303,7 +1219,10 @@ stanza_is_muc_self_presence(xmpp_stanza_t *const stanza,
// muc user namespaced x element // muc user namespaced x element
xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER); xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
if (x) {
if (x == NULL) {
return FALSE;
}
// check for status child element with 110 code // check for status child element with 110 code
xmpp_stanza_t *x_children = xmpp_stanza_get_children(x); xmpp_stanza_t *x_children = xmpp_stanza_get_children(x);
@ -1355,7 +1274,6 @@ stanza_is_muc_self_presence(xmpp_stanza_t *const stanza,
jid_destroy(from_jid); jid_destroy(from_jid);
} }
}
// self presence not found // self presence not found
return FALSE; return FALSE;
@ -1364,9 +1282,12 @@ stanza_is_muc_self_presence(xmpp_stanza_t *const stanza,
GSList* GSList*
stanza_get_status_codes_by_ns(xmpp_stanza_t *const stanza, char *ns) stanza_get_status_codes_by_ns(xmpp_stanza_t *const stanza, char *ns)
{ {
GSList *codes = NULL;
xmpp_stanza_t *ns_child = xmpp_stanza_get_child_by_ns(stanza, ns); xmpp_stanza_t *ns_child = xmpp_stanza_get_child_by_ns(stanza, ns);
if (ns_child) { if (ns_child == NULL) {
return NULL;
}
GSList *codes = NULL;
xmpp_stanza_t *child = xmpp_stanza_get_children(ns_child); xmpp_stanza_t *child = xmpp_stanza_get_children(ns_child);
while (child) { while (child) {
const char *name = xmpp_stanza_get_name(child); const char *name = xmpp_stanza_get_name(child);
@ -1378,7 +1299,7 @@ stanza_get_status_codes_by_ns(xmpp_stanza_t *const stanza, char *ns)
} }
child = xmpp_stanza_get_next(child); child = xmpp_stanza_get_next(child);
} }
}
return codes; return codes;
} }
@ -1386,15 +1307,19 @@ gboolean
stanza_room_destroyed(xmpp_stanza_t *stanza) stanza_room_destroyed(xmpp_stanza_t *stanza)
{ {
const char *stanza_name = xmpp_stanza_get_name(stanza); const char *stanza_name = xmpp_stanza_get_name(stanza);
if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) == 0) { if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) != 0) {
return FALSE;
}
xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER); xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
if (x) { if (x == NULL) {
return FALSE;
}
xmpp_stanza_t *destroy = xmpp_stanza_get_child_by_name(x, STANZA_NAME_DESTROY); xmpp_stanza_t *destroy = xmpp_stanza_get_child_by_name(x, STANZA_NAME_DESTROY);
if (destroy) { if (destroy) {
return TRUE; return TRUE;
} }
}
}
return FALSE; return FALSE;
} }
@ -1403,18 +1328,24 @@ const char*
stanza_get_muc_destroy_alternative_room(xmpp_stanza_t *stanza) stanza_get_muc_destroy_alternative_room(xmpp_stanza_t *stanza)
{ {
const char *stanza_name = xmpp_stanza_get_name(stanza); const char *stanza_name = xmpp_stanza_get_name(stanza);
if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) == 0) { if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) != 0) {
return NULL;
}
xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER); xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
if (x) { if (x == NULL) {
return NULL;
}
xmpp_stanza_t *destroy = xmpp_stanza_get_child_by_name(x, STANZA_NAME_DESTROY); xmpp_stanza_t *destroy = xmpp_stanza_get_child_by_name(x, STANZA_NAME_DESTROY);
if (destroy) { if (destroy == NULL) {
return NULL;
}
const char *jid = xmpp_stanza_get_attribute(destroy, STANZA_ATTR_JID); const char *jid = xmpp_stanza_get_attribute(destroy, STANZA_ATTR_JID);
if (jid) { if (jid) {
return jid; return jid;
} }
}
}
}
return NULL; return NULL;
} }
@ -1423,69 +1354,87 @@ char*
stanza_get_muc_destroy_alternative_password(xmpp_stanza_t *stanza) stanza_get_muc_destroy_alternative_password(xmpp_stanza_t *stanza)
{ {
const char *stanza_name = xmpp_stanza_get_name(stanza); const char *stanza_name = xmpp_stanza_get_name(stanza);
if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) == 0) { if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) != 0) {
xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
if (x) {
xmpp_stanza_t *destroy = xmpp_stanza_get_child_by_name(x, STANZA_NAME_DESTROY);
if (destroy) {
xmpp_stanza_t *password_st = xmpp_stanza_get_child_by_name(destroy, STANZA_NAME_PASSWORD);
if (password_st) {
char *password = xmpp_stanza_get_text(password_st);
if (password) {
return password;
}
}
}
}
}
return NULL; return NULL;
} }
xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
if (x == NULL) {
return NULL;
}
xmpp_stanza_t *destroy = xmpp_stanza_get_child_by_name(x, STANZA_NAME_DESTROY);
if (destroy == NULL) {
return NULL;
}
xmpp_stanza_t *password_st = xmpp_stanza_get_child_by_name(destroy, STANZA_NAME_PASSWORD);
if (password_st == NULL) {
return NULL;
}
return _stanza_text_to_str(password_st);
}
char* char*
stanza_get_muc_destroy_reason(xmpp_stanza_t *stanza) stanza_get_muc_destroy_reason(xmpp_stanza_t *stanza)
{ {
const char *stanza_name = xmpp_stanza_get_name(stanza); const char *stanza_name = xmpp_stanza_get_name(stanza);
if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) == 0) { if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) != 0) {
xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
if (x) {
xmpp_stanza_t *destroy = xmpp_stanza_get_child_by_name(x, STANZA_NAME_DESTROY);
if (destroy) {
xmpp_stanza_t *reason_st = xmpp_stanza_get_child_by_name(destroy, STANZA_NAME_REASON);
if (reason_st) {
char *reason = xmpp_stanza_get_text(reason_st);
if (reason) {
return reason;
}
}
}
}
}
return NULL; return NULL;
} }
xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
if (x == NULL) {
return NULL;
}
xmpp_stanza_t *destroy = xmpp_stanza_get_child_by_name(x, STANZA_NAME_DESTROY);
if (destroy == NULL) {
return NULL;
}
xmpp_stanza_t *reason_st = xmpp_stanza_get_child_by_name(destroy, STANZA_NAME_REASON);
if (reason_st == NULL) {
return NULL;
}
return _stanza_text_to_str(reason_st);
}
const char* const char*
stanza_get_actor(xmpp_stanza_t *stanza) stanza_get_actor(xmpp_stanza_t *stanza)
{ {
const char *stanza_name = xmpp_stanza_get_name(stanza); const char *stanza_name = xmpp_stanza_get_name(stanza);
if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) == 0) { if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) != 0) {
return NULL;
}
xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER); xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
if (x) { if (x == NULL) {
return NULL;
}
xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(x, STANZA_NAME_ITEM); xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(x, STANZA_NAME_ITEM);
if (item) { if (item == NULL) {
return NULL;
}
xmpp_stanza_t *actor = xmpp_stanza_get_child_by_name(item, STANZA_NAME_ACTOR); xmpp_stanza_t *actor = xmpp_stanza_get_child_by_name(item, STANZA_NAME_ACTOR);
if (actor) { if (actor == NULL) {
return NULL;
}
const char *nick = xmpp_stanza_get_attribute(actor, STANZA_ATTR_NICK); const char *nick = xmpp_stanza_get_attribute(actor, STANZA_ATTR_NICK);
if (nick) { if (nick) {
return nick; return nick;
} }
const char *jid = xmpp_stanza_get_attribute(actor, STANZA_ATTR_JID); const char *jid = xmpp_stanza_get_attribute(actor, STANZA_ATTR_JID);
if (jid) { if (jid) {
return jid; return jid;
} }
}
}
}
}
return NULL; return NULL;
} }
@ -1493,27 +1442,28 @@ char*
stanza_get_reason(xmpp_stanza_t *stanza) stanza_get_reason(xmpp_stanza_t *stanza)
{ {
const char *stanza_name = xmpp_stanza_get_name(stanza); const char *stanza_name = xmpp_stanza_get_name(stanza);
if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) == 0) { if (g_strcmp0(stanza_name, STANZA_NAME_PRESENCE) != 0) {
xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
if (x) {
xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(x, STANZA_NAME_ITEM);
if (item) {
xmpp_stanza_t *reason_st = xmpp_stanza_get_child_by_name(item, STANZA_NAME_REASON);
if (reason_st) {
/* TODO don't return text generated by xmpp_stanza_get_text(),
* because it should be freed by xmpp_free(). Instead, return
* strdup(reason) and free the `reason'. Check similar places. */
char *reason = xmpp_stanza_get_text(reason_st);
if (reason) {
return reason;
}
}
}
}
}
return NULL; return NULL;
} }
xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
if (x == NULL) {
return NULL;
}
xmpp_stanza_t *item = xmpp_stanza_get_child_by_name(x, STANZA_NAME_ITEM);
if (item == NULL) {
return NULL;
}
xmpp_stanza_t *reason_st = xmpp_stanza_get_child_by_name(item, STANZA_NAME_REASON);
if (reason_st == NULL) {
return NULL;
}
return _stanza_text_to_str(reason_st);
}
gboolean gboolean
stanza_is_room_nick_change(xmpp_stanza_t *const stanza) stanza_is_room_nick_change(xmpp_stanza_t *const stanza)
{ {
@ -1524,7 +1474,9 @@ stanza_is_room_nick_change(xmpp_stanza_t *const stanza)
// muc user namespaced x element // muc user namespaced x element
xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER); xmpp_stanza_t *x = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
if (x) { if (x == NULL) {
return FALSE;
}
// check for status child element with 303 code // check for status child element with 303 code
xmpp_stanza_t *x_children = xmpp_stanza_get_children(x); xmpp_stanza_t *x_children = xmpp_stanza_get_children(x);
@ -1537,7 +1489,6 @@ stanza_is_room_nick_change(xmpp_stanza_t *const stanza)
} }
x_children = xmpp_stanza_get_next(x_children); x_children = xmpp_stanza_get_next(x_children);
} }
}
return FALSE; return FALSE;
} }
@ -1625,24 +1576,21 @@ stanza_parse_caps(xmpp_stanza_t *const stanza)
char* char*
stanza_get_error_message(xmpp_stanza_t *stanza) stanza_get_error_message(xmpp_stanza_t *stanza)
{ {
xmpp_ctx_t *ctx = connection_get_ctx();
xmpp_stanza_t *error_stanza = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_ERROR); xmpp_stanza_t *error_stanza = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_ERROR);
// return nothing if no error stanza // return nothing if no error stanza
if (error_stanza == NULL) { if (error_stanza == NULL) {
return strdup("unknown"); return strdup("unknown");
} else { }
// check for text child // check for text child
xmpp_stanza_t *text_stanza = xmpp_stanza_get_child_by_name(error_stanza, STANZA_NAME_TEXT); xmpp_stanza_t *text_stanza = xmpp_stanza_get_child_by_name(error_stanza, STANZA_NAME_TEXT);
// check for text // check for text
if (text_stanza) { if (text_stanza) {
gchar *err_msg = xmpp_stanza_get_text(text_stanza); char *err_msg = _stanza_text_to_str(text_stanza);
if (err_msg) { if (err_msg) {
char *result = strdup(err_msg); return err_msg;
xmpp_free(ctx, err_msg);
return result;
} }
// otherwise check each defined-condition RFC-6120 8.3.3 // otherwise check each defined-condition RFC-6120 8.3.3
@ -1679,8 +1627,6 @@ stanza_get_error_message(xmpp_stanza_t *stanza)
return result; return result;
} }
} }
}
} }
// if undefined-condition or no condition, return nothing // if undefined-condition or no condition, return nothing
@ -1688,30 +1634,36 @@ stanza_get_error_message(xmpp_stanza_t *stanza)
} }
void void
stanza_attach_priority(xmpp_ctx_t *const ctx, xmpp_stanza_t *const presence, stanza_attach_priority(xmpp_ctx_t *const ctx, xmpp_stanza_t *const presence, const int pri)
const int pri)
{ {
if (pri != 0) { if (pri == 0) {
xmpp_stanza_t *priority, *value; return;
char pri_str[10]; }
char pri_str[10];
snprintf(pri_str, sizeof(pri_str), "%d", pri); snprintf(pri_str, sizeof(pri_str), "%d", pri);
priority = xmpp_stanza_new(ctx);
value = xmpp_stanza_new(ctx); xmpp_stanza_t *priority = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(priority, STANZA_NAME_PRIORITY); xmpp_stanza_set_name(priority, STANZA_NAME_PRIORITY);
xmpp_stanza_t *value = xmpp_stanza_new(ctx);
xmpp_stanza_set_text(value, pri_str); xmpp_stanza_set_text(value, pri_str);
xmpp_stanza_add_child(priority, value); xmpp_stanza_add_child(priority, value);
xmpp_stanza_release(value); xmpp_stanza_release(value);
xmpp_stanza_add_child(presence, priority); xmpp_stanza_add_child(presence, priority);
xmpp_stanza_release(priority); xmpp_stanza_release(priority);
} }
}
void void
stanza_attach_show(xmpp_ctx_t *const ctx, xmpp_stanza_t *const presence, stanza_attach_show(xmpp_ctx_t *const ctx, xmpp_stanza_t *const presence,
const char *const show) const char *const show)
{ {
if (show) { if (show == NULL) {
return;
}
xmpp_stanza_t *show_stanza = xmpp_stanza_new(ctx); xmpp_stanza_t *show_stanza = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(show_stanza, STANZA_NAME_SHOW); xmpp_stanza_set_name(show_stanza, STANZA_NAME_SHOW);
xmpp_stanza_t *text = xmpp_stanza_new(ctx); xmpp_stanza_t *text = xmpp_stanza_new(ctx);
@ -1721,13 +1673,15 @@ stanza_attach_show(xmpp_ctx_t *const ctx, xmpp_stanza_t *const presence,
xmpp_stanza_release(text); xmpp_stanza_release(text);
xmpp_stanza_release(show_stanza); xmpp_stanza_release(show_stanza);
} }
}
void void
stanza_attach_status(xmpp_ctx_t *const ctx, xmpp_stanza_t *const presence, stanza_attach_status(xmpp_ctx_t *const ctx, xmpp_stanza_t *const presence,
const char *const status) const char *const status)
{ {
if (status) { if (status == NULL) {
return;
}
xmpp_stanza_t *status_stanza = xmpp_stanza_new(ctx); xmpp_stanza_t *status_stanza = xmpp_stanza_new(ctx);
xmpp_stanza_set_name(status_stanza, STANZA_NAME_STATUS); xmpp_stanza_set_name(status_stanza, STANZA_NAME_STATUS);
xmpp_stanza_t *text = xmpp_stanza_new(ctx); xmpp_stanza_t *text = xmpp_stanza_new(ctx);
@ -1737,7 +1691,6 @@ stanza_attach_status(xmpp_ctx_t *const ctx, xmpp_stanza_t *const presence,
xmpp_stanza_release(text); xmpp_stanza_release(text);
xmpp_stanza_release(status_stanza); xmpp_stanza_release(status_stanza);
} }
}
void void
stanza_attach_last_activity(xmpp_ctx_t *const ctx, stanza_attach_last_activity(xmpp_ctx_t *const ctx,
@ -1806,7 +1759,10 @@ stanza_resource_from_presence(XMPPPresence *presence)
void void
stanza_free_caps(XMPPCaps *caps) stanza_free_caps(XMPPCaps *caps)
{ {
if (caps) { if (caps == NULL) {
return;
}
if (caps->hash) { if (caps->hash) {
free(caps->hash); free(caps->hash);
} }
@ -1818,12 +1774,14 @@ stanza_free_caps(XMPPCaps *caps)
} }
FREE_SET_NULL(caps); FREE_SET_NULL(caps);
} }
}
void void
stanza_free_presence(XMPPPresence *presence) stanza_free_presence(XMPPPresence *presence)
{ {
if (presence) { if (presence == NULL) {
return;
}
if (presence->jid) { if (presence->jid) {
jid_destroy(presence->jid); jid_destroy(presence->jid);
} }
@ -1838,7 +1796,6 @@ stanza_free_presence(XMPPPresence *presence)
} }
FREE_SET_NULL(presence); FREE_SET_NULL(presence);
} }
}
XMPPPresence* XMPPPresence*
stanza_parse_presence(xmpp_stanza_t *stanza, int *err) stanza_parse_presence(xmpp_stanza_t *stanza, int *err)
@ -1877,8 +1834,32 @@ stanza_parse_presence(xmpp_stanza_t *stanza, int *err)
if (priority_str) { if (priority_str) {
result->priority = atoi(priority_str); result->priority = atoi(priority_str);
} }
free(priority_str); xmpp_ctx_t *ctx = connection_get_ctx();
xmpp_free(ctx, priority_str);
} }
return result; return result;
} }
static void
_stanza_add_unique_id(xmpp_stanza_t *stanza, char *prefix)
{
char *id = create_unique_id(prefix);
xmpp_stanza_set_id(stanza, id);
free(id);
}
static char*
_stanza_text_to_str(xmpp_stanza_t *stanza)
{
xmpp_ctx_t *ctx = connection_get_ctx();
char *string = NULL;
char *stanza_text = xmpp_stanza_get_text(stanza);
if (stanza_text) {
string = strdup(stanza_text);
xmpp_free(ctx, stanza_text);
}
return string;
}