libpurple/smiley.c

changeset 35749
d71c41a54bb3
parent 35709
0d7a84931572
child 35755
d91c44b4a8e6
--- a/libpurple/smiley.c	Fri Apr 04 15:28:34 2014 +0200
+++ b/libpurple/smiley.c	Fri Apr 04 16:02:13 2014 +0200
@@ -34,6 +34,7 @@
 typedef struct {
 	gchar *shortcut;
 	gchar *path;
+	PurpleStoredImage *image;
 	gboolean is_ready;
 } PurpleSmileyPrivate;
 
@@ -103,6 +104,46 @@
 	return priv->path;
 }
 
+static PurpleStoredImage *
+purple_smiley_get_image_impl(PurpleSmiley *smiley)
+{
+	PurpleSmileyPrivate *priv = PURPLE_SMILEY_GET_PRIVATE(smiley);
+	const gchar *path;
+
+	g_return_val_if_fail(priv != NULL, FALSE);
+
+	if (priv->image)
+		return priv->image;
+
+	path = purple_smiley_get_path(smiley);
+
+	if (!path) {
+		purple_debug_error("smiley", "Can't get smiley data "
+			"without a path");
+		return NULL;
+	}
+
+	priv->image = purple_imgstore_new_from_file(path);
+	if (!priv->image) {
+		purple_debug_error("smiley", "Couldn't load smiley data ");
+		return NULL;
+	}
+	return priv->image;
+}
+
+PurpleStoredImage *
+purple_smiley_get_image(PurpleSmiley *smiley)
+{
+	PurpleSmileyClass *klass;
+
+	g_return_val_if_fail(PURPLE_IS_SMILEY(smiley), NULL);
+	klass = PURPLE_SMILEY_GET_CLASS(smiley);
+	g_return_val_if_fail(klass != NULL, NULL);
+	g_return_val_if_fail(klass->get_image != NULL, NULL);
+
+	return klass->get_image(smiley);
+}
+
 
 /*******************************************************************************
  * Object stuff
@@ -124,6 +165,9 @@
 	g_free(priv->shortcut);
 	g_free(priv->path);
 
+	if (priv->image)
+		purple_imgstore_unref(priv->image);
+
 	PURPLE_DBUS_UNREGISTER_POINTER(smiley);
 }
 
@@ -179,6 +223,7 @@
 purple_smiley_class_init(PurpleSmileyClass *klass)
 {
 	GObjectClass *gobj_class = G_OBJECT_CLASS(klass);
+	PurpleSmileyClass *ps_class = PURPLE_SMILEY_CLASS(klass);
 
 	parent_class = g_type_class_peek_parent(klass);
 
@@ -188,6 +233,8 @@
 	gobj_class->set_property = purple_smiley_set_property;
 	gobj_class->finalize = purple_smiley_finalize;
 
+	ps_class->get_image = purple_smiley_get_image_impl;
+
 	properties[PROP_SHORTCUT] = g_param_spec_string("shortcut", "Shortcut",
 		"The text-shortcut for the smiley", NULL,
 		G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);

mercurial