summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Aurich <darkrain42@pidgin.im>2009-05-07 23:46:11 +0000
committerPaul Aurich <darkrain42@pidgin.im>2009-05-07 23:46:11 +0000
commitf1ad85f1b22fd588271432a856dc4d924dcb9504 (patch)
tree668c786ff2cf07ae9b90555f3801da80f6f6cfe8
parenteea2222cc1de90074c4d69f0d1ca5783ee8eaefb (diff)
downloadpidgin-f1ad85f1b22fd588271432a856dc4d924dcb9504.tar.gz
Make the JabberCapsTuple (nee Key) available to the rest of the prpl
-rw-r--r--libpurple/protocols/jabber/caps.c48
-rw-r--r--libpurple/protocols/jabber/caps.h8
2 files changed, 27 insertions, 29 deletions
diff --git a/libpurple/protocols/jabber/caps.c b/libpurple/protocols/jabber/caps.c
index 0c0980a472..aff2535a17 100644
--- a/libpurple/protocols/jabber/caps.c
+++ b/libpurple/protocols/jabber/caps.c
@@ -35,13 +35,7 @@ typedef struct _JabberDataFormField {
GList *values;
} JabberDataFormField;
-typedef struct _JabberCapsKey {
- char *node;
- char *ver;
- char *hash;
-} JabberCapsKey;
-
-static GHashTable *capstable = NULL; /* JabberCapsKey -> JabberCapsClientInfo */
+static GHashTable *capstable = NULL; /* JabberCapsTuple -> JabberCapsClientInfo */
static GHashTable *nodetable = NULL; /* char *node -> JabberCapsNodeExts */
static guint save_timer = 0;
@@ -86,7 +80,7 @@ jabber_caps_node_exts_unref(JabberCapsNodeExts *exts)
}
static guint jabber_caps_hash(gconstpointer data) {
- const JabberCapsKey *key = data;
+ const JabberCapsTuple *key = data;
guint nodehash = g_str_hash(key->node);
guint verhash = g_str_hash(key->ver);
/*
@@ -99,22 +93,14 @@ static guint jabber_caps_hash(gconstpointer data) {
}
static gboolean jabber_caps_compare(gconstpointer v1, gconstpointer v2) {
- const JabberCapsKey *name1 = v1;
- const JabberCapsKey *name2 = v2;
+ const JabberCapsTuple *name1 = v1;
+ const JabberCapsTuple *name2 = v2;
return g_str_equal(name1->node, name2->node) &&
g_str_equal(name1->ver, name2->ver) &&
purple_strequal(name1->hash, name2->hash);
}
-void jabber_caps_destroy_key(gpointer data) {
- JabberCapsKey *key = data;
- g_free(key->node);
- g_free(key->ver);
- g_free(key->hash);
- g_free(key);
-}
-
static void
jabber_caps_client_info_destroy(JabberCapsClientInfo *info)
{
@@ -140,6 +126,10 @@ jabber_caps_client_info_destroy(JabberCapsClientInfo *info)
jabber_caps_node_exts_unref(info->exts);
+ g_free((char *)info->tuple.node);
+ g_free((char *)info->tuple.ver);
+ g_free((char *)info->tuple.hash);
+
g_free(info);
}
@@ -176,16 +166,16 @@ exts_to_xmlnode(gconstpointer key, gconstpointer value, gpointer user_data)
}
static void jabber_caps_store_client(gpointer key, gpointer value, gpointer user_data) {
- JabberCapsKey *clientinfo = key;
- JabberCapsClientInfo *props = value;
+ const JabberCapsTuple *tuple = key;
+ const JabberCapsClientInfo *props = value;
xmlnode *root = user_data;
xmlnode *client = xmlnode_new_child(root, "client");
GList *iter;
- xmlnode_set_attrib(client, "node", clientinfo->node);
- xmlnode_set_attrib(client, "ver", clientinfo->ver);
- if (clientinfo->hash)
- xmlnode_set_attrib(client, "hash", clientinfo->hash);
+ xmlnode_set_attrib(client, "node", tuple->node);
+ xmlnode_set_attrib(client, "ver", tuple->ver);
+ if (tuple->hash)
+ xmlnode_set_attrib(client, "hash", tuple->hash);
for(iter = props->identities; iter; iter = g_list_next(iter)) {
JabberIdentity *id = iter->data;
xmlnode *identity = xmlnode_new_child(client, "identity");
@@ -255,8 +245,8 @@ jabber_caps_load(void)
if(client->type != XMLNODE_TYPE_TAG)
continue;
if(!strcmp(client->name, "client")) {
- JabberCapsKey *key = g_new0(JabberCapsKey, 1);
JabberCapsClientInfo *value = g_new0(JabberCapsClientInfo, 1);
+ JabberCapsTuple *key = (JabberCapsTuple*)&value->tuple;
xmlnode *child;
JabberCapsNodeExts *exts = NULL;
key->node = g_strdup(xmlnode_get_attrib(client,"node"));
@@ -340,7 +330,7 @@ jabber_caps_load(void)
void jabber_caps_init(void)
{
nodetable = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)jabber_caps_node_exts_unref);
- capstable = g_hash_table_new_full(jabber_caps_hash, jabber_caps_compare, jabber_caps_destroy_key, (GDestroyNotify)jabber_caps_client_info_destroy);
+ capstable = g_hash_table_new_full(jabber_caps_hash, jabber_caps_compare, NULL, (GDestroyNotify)jabber_caps_client_info_destroy);
jabber_caps_load();
}
@@ -429,7 +419,7 @@ jabber_caps_client_iqcb(JabberStream *js, const char *from, JabberIqType type,
"http://jabber.org/protocol/disco#info");
jabber_caps_cbplususerdata *userdata = data;
JabberCapsClientInfo *info = NULL, *value;
- JabberCapsKey key;
+ JabberCapsTuple key;
if (!query || type == JABBER_IQ_ERROR) {
/* Any outstanding exts will be dealt with via ref-counting */
@@ -481,7 +471,7 @@ jabber_caps_client_iqcb(JabberStream *js, const char *from, JabberIqType type,
jabber_caps_client_info_destroy(info);
info = value;
} else {
- JabberCapsKey *n_key = g_new(JabberCapsKey, 1);
+ JabberCapsTuple *n_key = (JabberCapsTuple *)&info->tuple;
n_key->node = userdata->node;
n_key->ver = userdata->ver;
n_key->hash = userdata->hash;
@@ -553,7 +543,7 @@ void jabber_caps_get_info(JabberStream *js, const char *who, const char *node,
jabber_caps_get_info_cb cb, gpointer user_data)
{
JabberCapsClientInfo *info;
- JabberCapsKey key;
+ JabberCapsTuple key;
jabber_caps_cbplususerdata *userdata;
if (ext && *ext && hash)
diff --git a/libpurple/protocols/jabber/caps.h b/libpurple/protocols/jabber/caps.h
index ad0518a0ee..a2f0c16f5f 100644
--- a/libpurple/protocols/jabber/caps.h
+++ b/libpurple/protocols/jabber/caps.h
@@ -30,11 +30,19 @@ typedef struct _JabberCapsClientInfo JabberCapsClientInfo;
typedef struct _JabberCapsNodeExts JabberCapsNodeExts;
+typedef struct _JabberCapsTuple {
+ const char *node;
+ const char *ver;
+ const char *hash;
+} JabberCapsTuple;
+
struct _JabberCapsClientInfo {
GList *identities; /* JabberIdentity */
GList *features; /* char * */
GList *forms; /* xmlnode * */
JabberCapsNodeExts *exts;
+
+ const JabberCapsTuple tuple;
};
/*