libpurple/image.c

changeset 35809
6dd40b244ce3
parent 35806
49018c6bf755
child 35819
cc375b914104
--- a/libpurple/image.c	Thu Apr 10 20:36:21 2014 +0200
+++ b/libpurple/image.c	Thu Apr 10 21:51:21 2014 +0200
@@ -34,6 +34,7 @@
 
 	const gchar *extension;
 	const gchar *mime;
+	gchar *gen_filename;
 
 	gboolean is_ready;
 	gboolean has_failed;
@@ -54,6 +55,7 @@
 	SIG_LAST
 };
 
+static GObjectClass *parent_class;
 static guint signals[SIG_LAST];
 static GParamSpec *properties[PROP_LAST];
 
@@ -153,18 +155,17 @@
 PurpleImage *
 purple_image_new_from_file(const gchar *path, gboolean be_eager)
 {
+	PurpleImagePrivate *priv;
 	PurpleImage *img;
 
 	g_return_val_if_fail(path != NULL, NULL);
 	g_return_val_if_fail(g_file_test(path, G_FILE_TEST_EXISTS), NULL);
 
-	img = g_object_new(PURPLE_TYPE_IMAGE,
-		"path", path,
-		NULL);
+	img = g_object_new(PURPLE_TYPE_IMAGE, NULL);
+	priv = PURPLE_IMAGE_GET_PRIVATE(img);
+	priv->path = g_strdup(path);
 
 	if (be_eager) {
-		PurpleImagePrivate *priv = PURPLE_IMAGE_GET_PRIVATE(img);
-
 		fill_data(img);
 		if (!priv->contents) {
 			g_object_unref(img);
@@ -194,6 +195,31 @@
 	return img;
 }
 
+gboolean
+purple_image_save(PurpleImage *image, const gchar *path)
+{
+	PurpleImagePrivate *priv = PURPLE_IMAGE_GET_PRIVATE(image);
+	gpointer data;
+	gsize len;
+	gboolean succ;
+
+	g_return_val_if_fail(priv != NULL, FALSE);
+	g_return_val_if_fail(path != NULL, FALSE);
+	g_return_val_if_fail(path[0] != '\0', FALSE);
+
+	data = purple_image_get_data(image);
+	len = purple_image_get_size(image);
+
+	g_return_val_if_fail(data != NULL, FALSE);
+	g_return_val_if_fail(len > 0, FALSE);
+
+	succ = purple_util_write_data_to_file_absolute(path, data, len);
+	if (succ && priv->path == NULL)
+		priv->path = g_strdup(path);
+
+	return succ;
+}
+
 const gchar *
 purple_image_get_path(PurpleImage *image)
 {
@@ -254,7 +280,7 @@
 }
 
 const gchar *
-purple_image_get_extenstion(PurpleImage *image)
+purple_image_get_extension(PurpleImage *image)
 {
 	PurpleImagePrivate *priv = PURPLE_IMAGE_GET_PRIVATE(image);
 	gpointer data;
@@ -292,7 +318,7 @@
 purple_image_get_mimetype(PurpleImage *image)
 {
 	PurpleImagePrivate *priv = PURPLE_IMAGE_GET_PRIVATE(image);
-	const gchar *ext = purple_image_get_extenstion(image);
+	const gchar *ext = purple_image_get_extension(image);
 
 	g_return_val_if_fail(priv != NULL, NULL);
 
@@ -317,6 +343,35 @@
 	return NULL;
 }
 
+const gchar *
+purple_image_generate_filename(PurpleImage *image)
+{
+	PurpleImagePrivate *priv = PURPLE_IMAGE_GET_PRIVATE(image);
+	gpointer data;
+	gsize len;
+	const gchar *ext;
+	gchar *checksum;
+
+	g_return_val_if_fail(priv != NULL, NULL);
+
+	if (priv->gen_filename)
+		return priv->gen_filename;
+
+	ext = purple_image_get_extension(image);
+	data = purple_image_get_data(image);
+	len = purple_image_get_size(image);
+
+	g_return_val_if_fail(ext != NULL, NULL);
+	g_return_val_if_fail(data != NULL, NULL);
+	g_return_val_if_fail(len > 0, NULL);
+
+	checksum = g_compute_checksum_for_data(G_CHECKSUM_SHA1, data, len);
+	priv->gen_filename = g_strdup_printf("%s.%s", checksum, ext);
+	g_free(checksum);
+
+	return priv->gen_filename;
+}
+
 PurpleImage *
 purple_image_transfer_new(void)
 {
@@ -410,6 +465,9 @@
 	if (priv->contents)
 		g_string_free(priv->contents, TRUE);
 	g_free(priv->path);
+	g_free(priv->gen_filename);
+
+	G_OBJECT_CLASS(parent_class)->finalize(obj);
 }
 
 static void
@@ -437,10 +495,11 @@
 {
 	GObjectClass *gobj_class = G_OBJECT_CLASS(klass);
 
+	parent_class = g_type_class_peek_parent(klass);
+
 	g_type_class_add_private(klass, sizeof(PurpleImagePrivate));
 
 	gobj_class->finalize = purple_image_finalize;
-
 	gobj_class->get_property = purple_image_get_property;
 
 	properties[PROP_IS_READY] = g_param_spec_boolean("is-ready",

mercurial