--- a/libpurple/protocols/jabber/data.c Tue Sep 01 17:44:35 2009 +0000 +++ b/libpurple/protocols/jabber/data.c Tue Sep 01 19:50:20 2009 +0000 @@ -35,7 +35,7 @@ JabberData * jabber_data_create_from_data(gconstpointer rawdata, gsize size, const char *type, - JabberStream *js) + gboolean ephemeral, JabberStream *js) { JabberData *data = g_new0(JabberData, 1); gchar *checksum = purple_util_get_image_checksum(rawdata, size); @@ -47,6 +47,7 @@ data->cid = g_strdup(cid); data->type = g_strdup(type); data->size = size; + data->ephemeral = ephemeral; data->data = g_memdup(rawdata, size); @@ -109,6 +110,12 @@ g_free(data); } +void +jabber_data_destroy(JabberData *data) +{ + jabber_data_delete(data); +} + const char * jabber_data_get_cid(const JabberData *data) { @@ -178,21 +185,21 @@ const JabberData * jabber_data_find_local_by_alt(const gchar *alt) { - purple_debug_info("jabber", "looking up local smiley with alt = %s\n", alt); + purple_debug_info("jabber", "looking up local data object with alt = %s\n", alt); return g_hash_table_lookup(local_data_by_alt, alt); } const JabberData * jabber_data_find_local_by_cid(const gchar *cid) { - purple_debug_info("jabber", "lookup local smiley with cid = %s\n", cid); + purple_debug_info("jabber", "lookup local data object with cid = %s\n", cid); return g_hash_table_lookup(local_data_by_cid, cid); } const JabberData * jabber_data_find_remote_by_cid(const gchar *cid) { - purple_debug_info("jabber", "lookup remote smiley with cid = %s\n", cid); + purple_debug_info("jabber", "lookup remote data object with cid = %s\n", cid); return g_hash_table_lookup(remote_data_by_cid, cid); } @@ -200,9 +207,10 @@ void jabber_data_associate_local(JabberData *data, const gchar *alt) { - purple_debug_info("jabber", "associating local smiley\n alt = %s, cid = %s\n", - alt, jabber_data_get_cid(data)); - g_hash_table_insert(local_data_by_alt, g_strdup(alt), data); + purple_debug_info("jabber", "associating local data object\n alt = %s, cid = %s\n", + alt , jabber_data_get_cid(data)); + if (alt) + g_hash_table_insert(local_data_by_alt, g_strdup(alt), data); g_hash_table_insert(local_data_by_cid, g_strdup(jabber_data_get_cid(data)), data); } @@ -210,7 +218,7 @@ void jabber_data_associate_remote(JabberData *data) { - purple_debug_info("jabber", "associating remote smiley, cid = %s\n", + purple_debug_info("jabber", "associating remote data object, cid = %s\n", jabber_data_get_cid(data)); g_hash_table_insert(remote_data_by_cid, g_strdup(jabber_data_get_cid(data)), data); @@ -239,6 +247,11 @@ xmlnode_set_attrib(result->node, "id", id); xmlnode_insert_child(result->node, jabber_data_get_xml_definition(data)); + /* if the data object is temporary, destroy it and remove the references + to it */ + if (data->ephemeral) { + g_hash_table_remove(local_data_by_cid, cid); + } } jabber_iq_send(result); }