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

Added retrieval of caps string from presence

This commit is contained in:
James Booth 2013-01-19 23:52:50 +00:00
parent f3fcc892c3
commit 79c92656f9
9 changed files with 86 additions and 65 deletions

View File

@ -25,6 +25,7 @@
#include <glib.h>
#include "common.h"
#include "contact.h"
struct p_contact_t {
@ -33,6 +34,7 @@ struct p_contact_t {
char *presence;
char *status;
char *subscription;
char *caps_str;
gboolean pending_out;
GDateTime *last_activity;
};
@ -67,8 +69,8 @@ p_contact_new(const char * const jid, const char * const name,
contact->subscription = strdup("none");;
contact->pending_out = pending_out;
contact->last_activity = NULL;
contact->caps_str = NULL;
return contact;
}
@ -76,37 +78,18 @@ p_contact_new(const char * const jid, const char * const name,
void
p_contact_free(PContact contact)
{
if (contact->jid != NULL) {
free(contact->jid);
contact->jid = NULL;
}
if (contact->name != NULL) {
free(contact->name);
contact->name = NULL;
}
if (contact->presence != NULL) {
free(contact->presence);
contact->presence = NULL;
}
if (contact->status != NULL) {
free(contact->status);
contact->status = NULL;
}
if (contact->subscription != NULL) {
free(contact->subscription);
contact->subscription = NULL;
}
FREE_SET_NULL(contact->jid);
FREE_SET_NULL(contact->name);
FREE_SET_NULL(contact->presence);
FREE_SET_NULL(contact->status);
FREE_SET_NULL(contact->subscription);
FREE_SET_NULL(contact->caps_str);
if (contact->last_activity != NULL) {
g_date_time_unref(contact->last_activity);
}
free(contact);
contact = NULL;
FREE_SET_NULL(contact);
}
const char *
@ -151,17 +134,17 @@ p_contact_last_activity(const PContact contact)
return contact->last_activity;
}
const char *
p_contact_caps_str(const PContact contact)
{
return contact->caps_str;
}
void
p_contact_set_presence(const PContact contact, const char * const presence)
{
if (contact->presence != NULL) {
free(contact->presence);
contact->presence = NULL;
}
if (presence == NULL) {
contact->presence = NULL;
} else {
FREE_SET_NULL(contact->presence);
if (presence != NULL) {
contact->presence = strdup(presence);
}
}
@ -169,14 +152,8 @@ p_contact_set_presence(const PContact contact, const char * const presence)
void
p_contact_set_status(const PContact contact, const char * const status)
{
if (contact->status != NULL) {
free(contact->status);
contact->status = NULL;
}
if (status == NULL) {
contact->status = NULL;
} else {
FREE_SET_NULL(contact->status);
if (status != NULL) {
contact->status = strdup(status);
}
}
@ -184,14 +161,8 @@ p_contact_set_status(const PContact contact, const char * const status)
void
p_contact_set_subscription(const PContact contact, const char * const subscription)
{
if (contact->subscription != NULL) {
free(contact->subscription);
contact->subscription = NULL;
}
if (subscription == NULL) {
contact->subscription = strdup("none");
} else {
FREE_SET_NULL(contact->subscription);
if (subscription != NULL) {
contact->subscription = strdup(subscription);
}
}
@ -214,3 +185,12 @@ p_contact_set_last_activity(const PContact contact, GDateTime *last_activity)
contact->last_activity = g_date_time_ref(last_activity);
}
}
void
p_contact_set_caps_str(const PContact contact, const char * const caps_str)
{
FREE_SET_NULL(contact->caps_str);
if (caps_str != NULL) {
contact->caps_str = strdup(caps_str);
}
}

View File

@ -34,11 +34,13 @@ const char* p_contact_name(PContact contact);
const char* p_contact_presence(PContact contact);
const char* p_contact_status(PContact contact);
const char* p_contact_subscription(const PContact contact);
const char* p_contact_caps_str(const PContact contact);
GDateTime* p_contact_last_activity(const PContact contact);
gboolean p_contact_pending_out(const PContact contact);
void p_contact_set_presence(const PContact contact, const char * const presence);
void p_contact_set_status(const PContact contact, const char * const status);
void p_contact_set_subscription(const PContact contact, const char * const subscription);
void p_contact_set_caps_str(const PContact contact, const char * const caps_str);
void p_contact_set_pending_out(const PContact contact, gboolean pending_out);
void p_contact_set_last_activity(const PContact contact, GDateTime *last_activity);

View File

@ -87,9 +87,9 @@ contact_list_remove(const char * const jid)
gboolean
contact_list_update_contact(const char * const jid, const char * const presence,
const char * const status, GDateTime *last_activity)
const char * const status, GDateTime *last_activity, const char * const caps_str)
{
gboolean changed = FALSE;
gboolean presence_changed = FALSE;
PContact contact = g_hash_table_lookup(contacts, jid);
if (contact == NULL) {
@ -98,20 +98,24 @@ contact_list_update_contact(const char * const jid, const char * const presence,
if (g_strcmp0(p_contact_presence(contact), presence) != 0) {
p_contact_set_presence(contact, presence);
changed = TRUE;
presence_changed = TRUE;
}
if (g_strcmp0(p_contact_status(contact), status) != 0) {
p_contact_set_status(contact, status);
changed = TRUE;
presence_changed = TRUE;
}
if (!_datetimes_equal(p_contact_last_activity(contact), last_activity)) {
p_contact_set_last_activity(contact, last_activity);
changed = TRUE;
presence_changed = TRUE;
}
return changed;
if (g_strcmp0(p_contact_caps_str(contact), caps_str) != 0) {
p_contact_set_caps_str(contact, caps_str);
}
return presence_changed;
}
void

View File

@ -36,7 +36,7 @@ gboolean contact_list_add(const char * const jid, const char * const name,
const char * const presence, const char * const status,
const char * const subscription, gboolean pending_out);
gboolean contact_list_update_contact(const char * const jid, const char * const presence,
const char * const status, GDateTime *last_activity);
const char * const status, GDateTime *last_activity, const char * const caps_str);
void contact_list_update_subscription(const char * const jid,
const char * const subscription, gboolean pending_out);
gboolean contact_list_has_pending_subscriptions(void);

View File

@ -1055,6 +1055,20 @@ _presence_handler(xmpp_conn_t * const conn,
g_date_time_unref(now);
}
char *caps_str = NULL;
xmpp_stanza_t *caps = stanza_get_caps(stanza);
if (caps != NULL) {
char *node = xmpp_stanza_get_attribute(caps, STANZA_ATTR_NODE);
char *ver = xmpp_stanza_get_attribute(caps, STANZA_ATTR_VER);
if ((node != NULL) && (ver != NULL)) {
GString *caps_gstr = g_string_new(node);
g_string_append(caps_gstr, ver);
caps_str = caps_gstr->str;
g_string_free(caps_gstr, FALSE);
}
}
xmpp_stanza_t *status = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_STATUS);
if (status != NULL)
status_str = xmpp_stanza_get_text(status);
@ -1069,7 +1083,7 @@ _presence_handler(xmpp_conn_t * const conn,
show_str = "online";
if (strcmp(my_jid->barejid, from_jid->barejid) !=0) {
prof_handle_contact_online(from_jid->barejid, show_str, status_str, last_activity);
prof_handle_contact_online(from_jid->barejid, show_str, status_str, last_activity, caps_str);
}
} else if (strcmp(type, STANZA_TYPE_UNAVAILABLE) == 0) {
if (strcmp(my_jid->barejid, from_jid->barejid) !=0) {

View File

@ -347,11 +347,11 @@ prof_handle_leave_room(const char * const room)
void
prof_handle_contact_online(char *contact, char *show, char *status,
GDateTime *last_activity)
GDateTime *last_activity, char *caps_str)
{
gboolean updated = contact_list_update_contact(contact, show, status, last_activity);
gboolean presence_changed = contact_list_update_contact(contact, show, status, last_activity, caps_str);
if (updated) {
if (presence_changed) {
PContact result = contact_list_get_contact(contact);
if (p_contact_subscription(result) != NULL) {
if (strcmp(p_contact_subscription(result), "none") != 0) {
@ -365,9 +365,9 @@ prof_handle_contact_online(char *contact, char *show, char *status,
void
prof_handle_contact_offline(char *contact, char *show, char *status)
{
gboolean updated = contact_list_update_contact(contact, "offline", status, NULL);
gboolean presence_changed = contact_list_update_contact(contact, "offline", status, NULL, NULL);
if (updated) {
if (presence_changed) {
PContact result = contact_list_get_contact(contact);
if (p_contact_subscription(result) != NULL) {
if (strcmp(p_contact_subscription(result), "none") != 0) {

View File

@ -34,7 +34,7 @@ void prof_handle_disconnect(const char * const jid);
void prof_handle_failed_login(void);
void prof_handle_typing(char *from);
void prof_handle_contact_online(char *contact, char *show, char *status,
GDateTime *last_activity);
GDateTime *last_activity, char *caps_str);
void prof_handle_contact_offline(char *contact, char *show, char *status);
void prof_handle_incoming_message(char *from, char *message, gboolean priv);
void prof_handle_delayed_message(char *from, char *message, GTimeVal tv_stamp,

View File

@ -391,3 +391,19 @@ stanza_get_idle_time(xmpp_stanza_t * const stanza)
return result;
}
}
xmpp_stanza_t *
stanza_get_caps(xmpp_stanza_t * const stanza)
{
xmpp_stanza_t *caps = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_C);
if (caps == NULL) {
return NULL;
}
if (strcmp(xmpp_stanza_get_ns(caps), STANZA_NS_CAPS) != 0) {
return NULL;
}
return caps;
}

View File

@ -47,6 +47,7 @@
#define STANZA_NAME_TEXT "text"
#define STANZA_NAME_SUBJECT "subject"
#define STANZA_NAME_ITEM "item"
#define STANZA_NAME_C "c"
#define STANZA_TYPE_CHAT "chat"
#define STANZA_TYPE_GROUPCHAT "groupchat"
@ -72,6 +73,8 @@
#define STANZA_ATTR_ASK "ask"
#define STANZA_ATTR_ID "id"
#define STANZA_ATTR_SECONDS "seconds"
#define STANZA_ATTR_NODE "node"
#define STANZA_ATTR_VER "ver"
#define STANZA_TEXT_AWAY "away"
#define STANZA_TEXT_DND "dnd"
@ -82,6 +85,7 @@
#define STANZA_NS_CHATSTATES "http://jabber.org/protocol/chatstates"
#define STANZA_NS_MUC "http://jabber.org/protocol/muc"
#define STANZA_NS_MUC_USER "http://jabber.org/protocol/muc#user"
#define STANZA_NS_CAPS "http://jabber.org/protocol/caps"
#define STANZA_NS_PING "urn:xmpp:ping"
#define STANZA_NS_LASTACTIVITY "jabber:iq:last"
@ -118,5 +122,6 @@ gboolean stanza_is_room_nick_change(xmpp_stanza_t * const stanza);
char* stanza_get_new_nick(xmpp_stanza_t * const stanza);
int stanza_get_idle_time(xmpp_stanza_t * const stanza);
xmpp_stanza_t * stanza_get_caps(xmpp_stanza_t * const stanza);
#endif