static void purple_smiley_set_data_impl(PurpleSmiley *smiley, guchar *smiley_data, size_t smiley_data_len) { PurpleSmileyPrivate *priv = NULL; PurpleStoredImage *old_img, *new_img; const char *old_filename = NULL; const char *new_filename = NULL; g_return_if_fail(smiley != NULL); g_return_if_fail(smiley_data != NULL); g_return_if_fail(smiley_data_len > 0); priv = PURPLE_SMILEY_GET_PRIVATE(smiley); old_img = priv->img; new_img = purple_smiley_data_new(smiley_data, smiley_data_len); g_object_set(G_OBJECT(smiley), "image", new_img, NULL); /* If the old and new image files have different names we need * to unstore old image file. */ if (!old_img) return; old_filename = purple_imgstore_get_filename(old_img); new_filename = purple_imgstore_get_filename(priv->img); if (g_ascii_strcasecmp(old_filename, new_filename)) purple_smiley_data_unstore(old_filename); purple_imgstore_unref(old_img); }
const gchar * purple_smiley_get_shortcut(const PurpleSmiley *smiley) { PurpleSmileyPrivate *priv = PURPLE_SMILEY_GET_PRIVATE(smiley); g_return_val_if_fail(priv != NULL, NULL); return priv->shortcut; }
const char * purple_smiley_get_checksum(const PurpleSmiley *smiley) { PurpleSmileyPrivate *priv = NULL; g_return_val_if_fail(smiley != NULL, NULL); priv = PURPLE_SMILEY_GET_PRIVATE(smiley); return priv->checksum; }
PurpleImage * purple_smiley_get_image(PurpleSmiley *smiley) { PurpleSmileyPrivate *priv = PURPLE_SMILEY_GET_PRIVATE(smiley); g_return_val_if_fail(priv != NULL, NULL); g_return_val_if_fail(priv->image != NULL, NULL); return priv->image; }
const char * purple_smiley_get_extension(const PurpleSmiley *smiley) { PurpleSmileyPrivate *priv = PURPLE_SMILEY_GET_PRIVATE(smiley); if (priv->img != NULL) return purple_imgstore_get_extension(priv->img); return NULL; }
char *purple_smiley_get_full_path(PurpleSmiley *smiley) { PurpleSmileyPrivate *priv = NULL; g_return_val_if_fail(smiley != NULL, NULL); priv = PURPLE_SMILEY_GET_PRIVATE(smiley); if (priv->img == NULL) return NULL; return get_file_full_path(purple_imgstore_get_filename(priv->img)); }
static void purple_smiley_finalize(GObject *obj) { PurpleSmiley *smiley = PURPLE_SMILEY(obj); PurpleSmileyPrivate *priv = PURPLE_SMILEY_GET_PRIVATE(smiley); g_free(priv->shortcut); if (priv->image) g_object_unref(priv->image); PURPLE_DBUS_UNREGISTER_POINTER(smiley); G_OBJECT_CLASS(parent_class)->finalize(obj); }
static void purple_smiley_get_property(GObject *object, guint par_id, GValue *value, GParamSpec *pspec) { PurpleSmiley *smiley = PURPLE_SMILEY(object); PurpleSmileyPrivate *priv = PURPLE_SMILEY_GET_PRIVATE(smiley); switch (par_id) { case PROP_SHORTCUT: g_value_set_string(value, priv->shortcut); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, par_id, pspec); break; } }
PurpleSmiley * purple_smiley_new_remote(const gchar *shortcut) { PurpleSmiley *smiley; PurpleSmileyPrivate *priv; g_return_val_if_fail(shortcut != NULL, NULL); smiley = g_object_new(PURPLE_TYPE_SMILEY, "shortcut", shortcut, NULL); priv = PURPLE_SMILEY_GET_PRIVATE(smiley); priv->image = purple_image_transfer_new(); return smiley; }
gconstpointer purple_smiley_get_data(const PurpleSmiley *smiley, size_t *len) { PurpleSmileyPrivate *priv = NULL; g_return_val_if_fail(smiley != NULL, NULL); priv = PURPLE_SMILEY_GET_PRIVATE(smiley); if (priv->img) { if (len != NULL) *len = purple_imgstore_get_size(priv->img); return purple_imgstore_get_data(priv->img); } return NULL; }
static void purple_smiley_finalize(GObject *obj) { PurpleSmiley *smiley = PURPLE_SMILEY(obj); PurpleSmileyPrivate *priv = PURPLE_SMILEY_GET_PRIVATE(smiley); if (g_hash_table_lookup(smiley_shortcut_index, priv->shortcut)) { g_hash_table_remove(smiley_shortcut_index, priv->shortcut); g_hash_table_remove(smiley_checksum_index, priv->checksum); } g_free(priv->shortcut); g_free(priv->checksum); if (priv->img) purple_smiley_data_unstore(purple_imgstore_get_filename(priv->img)); purple_imgstore_unref(priv->img); PURPLE_DBUS_UNREGISTER_POINTER(smiley); purple_smileys_save(); }
static void purple_smiley_load_file(const char *shortcut, const char *checksum, const char *filename) { PurpleSmiley *smiley = NULL; PurpleSmileyPrivate *priv = NULL; guchar *smiley_data; size_t smiley_data_len; char *fullpath = NULL; g_return_if_fail(shortcut != NULL); g_return_if_fail(checksum != NULL); g_return_if_fail(filename != NULL); fullpath = get_file_full_path(filename); if (!fullpath) { purple_debug_error(SMILEYS_LOG_ID, "Path for filename %s doesn't exist\n", filename); return; } smiley = purple_smiley_create(shortcut); if (!smiley) { g_free(fullpath); return; } priv = PURPLE_SMILEY_GET_PRIVATE(smiley); priv->checksum = g_strdup(checksum); if (read_smiley_file(fullpath, &smiley_data, &smiley_data_len)) purple_smiley_set_data_impl(smiley, smiley_data, smiley_data_len); else purple_smiley_delete(smiley); g_free(fullpath); }
static void purple_smiley_set_property(GObject *object, guint param_id, const GValue *value, GParamSpec *spec) { PurpleSmiley *smiley = PURPLE_SMILEY(object); PurpleSmileyPrivate *priv = PURPLE_SMILEY_GET_PRIVATE(smiley); switch (param_id) { case PROP_SHORTCUT: { const char *shortcut = g_value_get_string(value); purple_smiley_set_shortcut(smiley, shortcut); } break; case PROP_IMGSTORE: { PurpleStoredImage *img = g_value_get_pointer(value); purple_imgstore_unref(priv->img); g_free(priv->checksum); priv->img = img; if (img) { priv->checksum = g_compute_checksum_for_data( G_CHECKSUM_SHA1, purple_imgstore_get_data(img), purple_imgstore_get_size(img)); purple_smiley_data_store(img); } else { priv->checksum = NULL; } } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, param_id, spec); break; } }
PurpleSmiley * purple_smiley_new(const gchar *shortcut, const gchar *path) { PurpleSmiley *smiley; PurpleSmileyPrivate *priv; g_return_val_if_fail(shortcut != NULL, NULL); g_return_val_if_fail(path != NULL, NULL); smiley = g_object_new(PURPLE_TYPE_SMILEY, "shortcut", shortcut, NULL); priv = PURPLE_SMILEY_GET_PRIVATE(smiley); priv->image = purple_image_new_from_file(path, FALSE); if (!priv->image) { purple_debug_error("smiley", "Couldn't load smiley data "); g_object_unref(smiley); return NULL; } return smiley; }
void purple_smiley_set_data(PurpleSmiley *smiley, guchar *smiley_data, size_t smiley_data_len) { PurpleSmileyPrivate *priv = NULL; g_return_if_fail(smiley != NULL); g_return_if_fail(smiley_data != NULL); g_return_if_fail(smiley_data_len > 0); priv = PURPLE_SMILEY_GET_PRIVATE(smiley); /* Remove the previous entry */ g_hash_table_remove(smiley_checksum_index, priv->checksum); /* Update the file data. This also updates the checksum. */ purple_smiley_set_data_impl(smiley, smiley_data, smiley_data_len); /* Reinsert the index item. */ g_hash_table_insert(smiley_checksum_index, g_strdup(priv->checksum), smiley); purple_smileys_save(); }
static PurpleXmlNode * smiley_to_xmlnode(PurpleSmiley *smiley) { PurpleSmileyPrivate *priv = NULL; PurpleXmlNode *smiley_node = NULL; smiley_node = purple_xmlnode_new(XML_SMILEY_TAG); if (!smiley_node) return NULL; priv = PURPLE_SMILEY_GET_PRIVATE(smiley); purple_xmlnode_set_attrib(smiley_node, XML_SHORTCUT_ATTRIB_TAG, priv->shortcut); purple_xmlnode_set_attrib(smiley_node, XML_CHECKSUM_ATRIB_TAG, priv->checksum); purple_xmlnode_set_attrib(smiley_node, XML_FILENAME_ATRIB_TAG, purple_imgstore_get_filename(priv->img)); return smiley_node; }
PurpleStoredImage * purple_smiley_get_stored_image(const PurpleSmiley *smiley) { PurpleSmileyPrivate *priv = PURPLE_SMILEY_GET_PRIVATE(smiley); return purple_imgstore_ref(priv->img); }