[kazehakase-svn] [3717] * src/kz-downloader.[ch]: Use GIO.

Back to archive index

svnno****@sourc***** svnno****@sourc*****
Mon Feb 16 16:02:02 JST 2009


Revision: 3717
          http://svn.sourceforge.jp/view?root=kazehakase&view=rev&rev=3717
Author:   ikezoe
Date:     2009-02-16 16:02:02 +0900 (Mon, 16 Feb 2009)

Log Message:
-----------
	* src/kz-downloader.[ch]: Use GIO.

Modified Paths:
--------------
    kazehakase/trunk/ChangeLog
    kazehakase/trunk/src/kz-download-box.c
    kazehakase/trunk/src/kz-downloader.c
    kazehakase/trunk/src/kz-downloader.h
    kazehakase/trunk/src/kz-favicon.c
    kazehakase/trunk/src/sidebar/kz-downloader-sidebar.c

Modified: kazehakase/trunk/ChangeLog
===================================================================
--- kazehakase/trunk/ChangeLog	2009-02-16 05:51:38 UTC (rev 3716)
+++ kazehakase/trunk/ChangeLog	2009-02-16 07:02:02 UTC (rev 3717)
@@ -15,6 +15,7 @@
 	catched by KzWindow and then invoking kz_notebook_close_tab.
 	* src/kz-root-bookmark.c: Remove needless codes.
 	* src/bookmarks/kz-bookmark-file.c: Use GIO.
+	* src/kz-downloader.[ch]: Use GIO.
 
 2009-02-15  Hiroyuki Ikezoe  <poinc****@ikezo*****>
 

Modified: kazehakase/trunk/src/kz-download-box.c
===================================================================
--- kazehakase/trunk/src/kz-download-box.c	2009-02-16 05:51:38 UTC (rev 3716)
+++ kazehakase/trunk/src/kz-download-box.c	2009-02-16 07:02:02 UTC (rev 3717)
@@ -507,7 +507,7 @@
 			g_free(direction);
 	}
 	percent_str = g_strdup_printf("%s:%02d%%",
-				      dl->filename,
+				      kz_downloader_get_filename(dl),
 				      percent);
 	gtk_widget_set_tooltip_text(icon->event_box, percent_str);
 	g_free(percent_str);

Modified: kazehakase/trunk/src/kz-downloader.c
===================================================================
--- kazehakase/trunk/src/kz-downloader.c	2009-02-16 05:51:38 UTC (rev 3716)
+++ kazehakase/trunk/src/kz-downloader.c	2009-02-16 07:02:02 UTC (rev 3717)
@@ -20,6 +20,7 @@
 
 #include <stdio.h>
 #include <glib/gi18n.h>
+#include <gio/gio.h>
 
 #include "kz-downloader.h"
 
@@ -37,10 +38,27 @@
 	PROP_FILENAME
 };
 
+#define BUFFER_SIZE 4096
+
+typedef struct _KzDownloaderPrivate	KzDownloaderPrivate;
+struct _KzDownloaderPrivate
+{
+	GFile *g_file;
+	GCancellable *cancellable;
+	GFileInputStream *input_stream;
+	GString *contents;
+	goffset contents_size;
+	gchar buffer[BUFFER_SIZE];
+	gchar  *uri;
+	gchar  *file_name;
+
+	GFile *local_file;
+	GFileOutputStream *output_stream;
+	gboolean to_file;
+};
+#define KZ_DOWNLOADER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), KZ_TYPE_DOWNLOADER, KzDownloaderPrivate))
+
 static void     dispose      (GObject *object);
-static GObject *constructor  (GType type,
-                              guint n_props,
-                              GObjectConstructParam *props);
 static void     set_property (GObject *object,
                               guint prop_id,
                               const GValue *value,
@@ -50,20 +68,9 @@
                               GValue *value,
                               GParamSpec *pspec);
 
-static void kz_downloader_connect_signals    (KzDownloader *downloader);
-static void kz_downloader_disconnect_signals (KzDownloader *downloader);
-
 static void kz_downloader_real_cancel      (KzDownloader *downloader);
 static gint kz_downloader_real_get_percent (KzDownloader *downloader);
 
-static void cb_completed                   (KzIO *io,
-					    GError *error,
-					    KzDownloader *downloader);
-static void cb_io_in                       (KzIO *io,
-					    guint len,
-					    const gchar *buf,
-					    KzDownloader *downloader);
-
 static gint kz_downloader_signals[LAST_SIGNAL] = {0};
 
 G_DEFINE_TYPE(KzDownloader, kz_downloader, G_TYPE_OBJECT)
@@ -75,7 +82,6 @@
 
 	object_class = G_OBJECT_CLASS(klass);
 
-	object_class->constructor  = constructor;
 	object_class->dispose      = dispose;
 	object_class->set_property = set_property;
 	object_class->get_property = get_property;
@@ -102,7 +108,7 @@
 		object_class,
 		 PROP_FILENAME,
 		 g_param_spec_string(
-			 "filename",
+			 "file-name",
 			 _("Filename"),
 			 _("The Local Filename"),
 			 NULL,
@@ -140,57 +146,65 @@
 				NULL, NULL,
 				g_cclosure_marshal_VOID__VOID,
 				G_TYPE_NONE, 0);
+	g_type_class_add_private(object_class, sizeof(KzDownloaderPrivate));
 }
 
 static void
 kz_downloader_init (KzDownloader *downloader)
 {
-	downloader->io       = NULL;
-	downloader->uri      = NULL;
-	downloader->filename = NULL;
-}
+	KzDownloaderPrivate *priv = KZ_DOWNLOADER_GET_PRIVATE(downloader);
 
+	priv->uri = NULL;
+	priv->file_name = NULL;
+	priv->g_file = NULL;
+	priv->cancellable = g_cancellable_new();
+	priv->input_stream = NULL;
 
-static GObject*
-constructor (GType                  type,
-             guint                  n_props,
-             GObjectConstructParam *props)
-{
-	KzDownloader *dl;
-	KzIO *io;
-	GObject *object;
-	GObjectClass *klass = G_OBJECT_CLASS(kz_downloader_parent_class);
+	priv->contents = g_string_new(NULL);
+	priv->contents_size = 0;
 
-	object = klass->constructor(type, n_props, props);
-
-	dl = KZ_DOWNLOADER(object);
-
-	io = kz_io_new(dl->uri);
-
-	if(!io)
-		return object;
-	
-	dl->io = io;
-
-	return object;
+	priv->to_file = FALSE;
 }
 
 static void
 dispose (GObject *object)
 {
-	KzDownloader *downloader;
+	KzDownloaderPrivate *priv = KZ_DOWNLOADER_GET_PRIVATE(object);
 
-	downloader = KZ_DOWNLOADER(object);
-	if (downloader->io)
-		g_object_unref(downloader->io);
-	if (downloader->uri)
-		g_free(downloader->uri);
-	if (downloader->filename)
-		g_free(downloader->filename);
-	downloader->io       = NULL;
-	downloader->uri      = NULL;
-	downloader->filename = NULL;
+	g_free(priv->uri);
+	g_free(priv->file_name);
 
+	if (priv->g_file)
+	{
+		g_object_unref(priv->g_file);
+		priv->g_file = NULL;
+	}
+	if (priv->cancellable)
+	{
+		g_object_unref(priv->cancellable);
+		priv->cancellable = NULL;
+        }
+	if (priv->input_stream)
+	{
+		g_object_unref(priv->input_stream);
+		priv->input_stream = NULL;
+        }
+	if (priv->contents)
+	{
+		g_string_free(priv->contents, TRUE);
+		priv->contents = NULL;
+	}
+	if (priv->local_file)
+	{
+		g_object_unref(priv->local_file);
+		priv->local_file = NULL;
+        }
+	if (priv->output_stream)
+	{
+		g_object_unref(priv->output_stream);
+		priv->output_stream = NULL;
+        }
+
 	if (G_OBJECT_CLASS (kz_downloader_parent_class)->dispose)
 		G_OBJECT_CLASS (kz_downloader_parent_class)->dispose(object);
 }
@@ -202,17 +216,17 @@
               const GValue *value,
               GParamSpec *pspec)
 {
-	KzDownloader *downloader = KZ_DOWNLOADER(object);
+	KzDownloaderPrivate *priv = KZ_DOWNLOADER_GET_PRIVATE(object);
 
 	switch (prop_id)
 	{
 	case PROP_URI:
-		downloader->uri = g_value_dup_string(value);
+		priv->uri = g_value_dup_string(value);
 		break;
 	case PROP_FILENAME:
-		if (downloader->filename)
-			g_free(downloader->filename);
-		downloader->filename = g_value_dup_string(value);
+		if (priv->file_name)
+			g_free(priv->file_name);
+		priv->file_name = g_value_dup_string(value);
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
@@ -227,15 +241,15 @@
               GValue *value,
               GParamSpec *pspec)
 {
-	KzDownloader *downloader = KZ_DOWNLOADER(object);
+	KzDownloaderPrivate *priv = KZ_DOWNLOADER_GET_PRIVATE(object);
 
 	switch (prop_id)
 	{
 	case PROP_URI:
-		g_value_set_string(value, downloader->uri);
+		g_value_set_string(value, priv->uri);
 		break;
 	case PROP_FILENAME:
-		g_value_set_string(value, downloader->filename);
+		g_value_set_string(value, priv->file_name);
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
@@ -247,105 +261,117 @@
 KzDownloader *
 kz_downloader_new (const gchar *uri)
 {
-	KzDownloader *dl;
-	
-	dl = g_object_new(KZ_TYPE_DOWNLOADER,
-		 	  "uri", uri,
-			  NULL);
-	
-	/* FIXME! */
-	if (!dl->io)
-	{
-		g_object_unref(dl);
-		return NULL;
-	}
-
-	return dl;
+	return g_object_new(KZ_TYPE_DOWNLOADER,
+		 	    "uri", uri,
+			    NULL);
 }
 
 
 KzDownloader *
-kz_downloader_new_with_filename (const gchar *uri, const gchar *filename)
+kz_downloader_new_with_filename (const gchar *uri, const gchar *file_name)
 {
-	KzDownloader *dl;
+	return g_object_new(KZ_TYPE_DOWNLOADER,
+			    "uri",      uri,
+			    "file-name", file_name,
+			    NULL);
+}
 
-	dl = g_object_new(KZ_TYPE_DOWNLOADER,
-			  "uri",      uri,
-			  "filename", filename,
-			  NULL);
+static void
+cb_input_stream_read_async (GObject *source_object, GAsyncResult *result, gpointer user_data)
+{
+	GError *error = NULL;
+	gssize bytes_read;
+	KzDownloaderPrivate *priv;
 
-	/* FIXME! */
-	if (!dl->io)
+	bytes_read = g_input_stream_read_finish(G_INPUT_STREAM(source_object),
+						result, &error);
+	if (bytes_read == -1)
 	{
-		g_object_unref(dl);
-		return NULL;
+                g_warning("%s", error->message);
+		g_signal_emit(user_data,
+			      kz_downloader_signals[ERROR_SIGNAL],
+			      0);
+		g_error_free(error);
+		return;
 	}
+	else if (bytes_read == 0)
+	{
+		g_signal_emit(user_data,
+			      kz_downloader_signals[COMPLETED_SIGNAL],
+			      0);
+		return;
+	}
 
-	return dl;
-}
+	priv = KZ_DOWNLOADER_GET_PRIVATE(user_data);
 
+	if (priv->to_file && priv->local_file && priv->output_stream)
+	{
+		gsize bytes_written;
+		g_output_stream_write_all(G_OUTPUT_STREAM(priv->output_stream),
+					  priv->buffer, bytes_read,
+					  &bytes_written,
+					  NULL, NULL);
+	}
+	else
+	{
+		g_string_append_len(priv->contents, priv->buffer, bytes_read);
+	}
 
-static void
-kz_downloader_connect_signals (KzDownloader *downloader)
-{
-	g_signal_connect(downloader->io, "io_completed",
-			 G_CALLBACK(cb_completed), downloader);
-	g_signal_connect(downloader->io, "io_progress",
-			 G_CALLBACK(cb_io_in), downloader);
+	g_signal_emit(user_data,
+		      kz_downloader_signals[IO_IN_SIGNAL],
+		      0);	
+	g_input_stream_read_async(G_INPUT_STREAM(priv->input_stream),
+				  priv->buffer,
+				  sizeof(priv->buffer),
+				  G_PRIORITY_DEFAULT,
+				  priv->cancellable,
+				  cb_input_stream_read_async,
+				  user_data);
 }
 
-
 static void
-kz_downloader_disconnect_signals (KzDownloader *downloader)
+cb_async_read (GObject *source_object, GAsyncResult *result, gpointer user_data)
 {
-	g_signal_handlers_disconnect_by_func(downloader->io,
-					     G_CALLBACK(cb_completed),
-					     downloader);
-	g_signal_handlers_disconnect_by_func(downloader->io,
-					     G_CALLBACK(cb_io_in),
-					     downloader);
-}
+	GError *error = NULL;
+	KzDownloaderPrivate *priv = KZ_DOWNLOADER_GET_PRIVATE(user_data);
 
-
-static void 
-cb_completed(KzIO *io, GError *error, KzDownloader *downloader)
-{
-	g_return_if_fail(KZ_IS_DOWNLOADER(downloader));
-
-	kz_downloader_disconnect_signals(downloader);
-	if (error)
+	priv->input_stream = g_file_read_finish(G_FILE(source_object), result, &error);
+	if (!priv->input_stream)
 	{
-		g_signal_emit(downloader,
+                g_warning("%s", error->message);
+		g_signal_emit(user_data,
 			      kz_downloader_signals[ERROR_SIGNAL],
 			      0);
+		g_error_free(error);
+		return;
 	}
-	else
+
+	if (priv->to_file && priv->file_name)
 	{
-		g_signal_emit(downloader,
-			      kz_downloader_signals[COMPLETED_SIGNAL],
-			      0);
+		priv->local_file = g_file_new_for_path(priv->file_name);
+		priv->output_stream = g_file_create(priv->local_file,
+						    G_FILE_CREATE_NONE,
+						    NULL, NULL);
 	}
-}
+	g_input_stream_read_async(G_INPUT_STREAM(priv->input_stream),
+				  priv->buffer,
+				  sizeof(priv->buffer),
+				  G_PRIORITY_DEFAULT,
+				  priv->cancellable,
+				  cb_input_stream_read_async,
+				  user_data);
 
-
-static void 
-cb_io_in(KzIO *io, guint len, const gchar *buf, KzDownloader *downloader)
-{
-	g_return_if_fail(KZ_IS_DOWNLOADER(downloader));
-
-	/* emit progress signal */
-	g_signal_emit(downloader,
-		      kz_downloader_signals[IO_IN_SIGNAL],
-		      0);	
 }
 
-
 static	void
 kz_downloader_real_cancel (KzDownloader *downloader)
 {
+	KzDownloaderPrivate *priv;
 	g_return_if_fail(KZ_IS_DOWNLOADER(downloader));
 
-	kz_io_stop(downloader->io); 
+	priv = KZ_DOWNLOADER_GET_PRIVATE(downloader);
+
+	g_cancellable_cancel(priv->cancellable);
 }
 
 
@@ -354,7 +380,6 @@
 {
 	glong total, current;
 	gint percent;
-	
 	g_return_val_if_fail(KZ_IS_DOWNLOADER(downloader), -1);
 
 	total   = kz_downloader_get_total_progress(downloader);
@@ -366,23 +391,36 @@
 	return percent;
 }
 
+const gchar *
+kz_downloader_get_uri (KzDownloader *downloader)
+{
+	g_return_val_if_fail(KZ_IS_DOWNLOADER(downloader), NULL);
+	
+	return KZ_DOWNLOADER_GET_PRIVATE(downloader)->uri;
+}
 
 const gchar *
-kz_downloader_get_string (KzDownloader *downloader)
+kz_downloader_get_filename (KzDownloader *downloader)
 {
 	g_return_val_if_fail(KZ_IS_DOWNLOADER(downloader), NULL);
-	g_return_val_if_fail(downloader->io, NULL);
 	
-	return kz_io_get_buffer(downloader->io);
+	return KZ_DOWNLOADER_GET_PRIVATE(downloader)->file_name;
 }
 
+const gchar *
+kz_downloader_get_buffer (KzDownloader *downloader)
+{
+	g_return_val_if_fail(KZ_IS_DOWNLOADER(downloader), NULL);
+
+	return KZ_DOWNLOADER_GET_PRIVATE(downloader)->contents->str;
+}
+
 gsize
 kz_downloader_get_size (KzDownloader *downloader)
 {
 	g_return_val_if_fail(KZ_IS_DOWNLOADER(downloader), 0);
-	g_return_val_if_fail(downloader->io, 0);
 	
-	return kz_io_get_file_size(downloader->io);
+	return KZ_DOWNLOADER_GET_PRIVATE(downloader)->contents_size;
 }
 
 
@@ -397,33 +435,71 @@
 kz_downloader_get_current_progress (KzDownloader *downloader)
 {
 	g_return_val_if_fail(KZ_IS_DOWNLOADER(downloader), -1);
-	return kz_io_get_loaded_size(downloader->io);
+	return KZ_DOWNLOADER_GET_PRIVATE(downloader)->contents->len;
 }
 
-
 gsize
 kz_downloader_get_total_progress (KzDownloader *downloader)
 {
 	g_return_val_if_fail(KZ_IS_DOWNLOADER(downloader), -1);
-	return kz_io_get_file_size(downloader->io);
+	return KZ_DOWNLOADER_GET_PRIVATE(downloader)->contents_size;
 }
 
+static GFile *
+create_g_file (const gchar *uri)
+{
+	GFile *g_file;
+        gchar *uri_scheme;
 
+	uri_scheme = g_uri_parse_scheme(uri);
+	if (uri_scheme)
+	{
+		g_file = g_file_new_for_uri(uri);
+		g_free(uri_scheme);
+	}
+	else
+	{
+		g_file = g_file_new_for_path(uri);
+	}
+
+	return g_file;
+}
+
+static void
+start (KzDownloader *downloader)
+{
+	KzDownloaderPrivate *priv;
+	
+	priv = KZ_DOWNLOADER_GET_PRIVATE(downloader);
+
+        g_signal_emit(downloader,
+                      kz_downloader_signals[START_SIGNAL],
+                      0);
+	priv->g_file = create_g_file(priv->uri);
+
+	g_file_read_async(priv->g_file,
+			  G_PRIORITY_DEFAULT,
+			  priv->cancellable,
+			  cb_async_read,
+			  downloader);
+}
+
 gboolean
 kz_downloader_to_file (KzDownloader *downloader)
 {
+	KzDownloaderPrivate *priv;
 	g_return_val_if_fail(KZ_IS_DOWNLOADER(downloader), FALSE);
 	
-	kz_downloader_connect_signals(downloader);
+	priv = KZ_DOWNLOADER_GET_PRIVATE(downloader);
 
-	/* create filename from uri if not exist */
-	if (!downloader->filename)
-	{
-		
-	}
-	else
-		kz_io_load_to_file(downloader->io, downloader->filename);
+	/* create file_name from uri if not exist */
+	if (!priv->file_name)
+		return FALSE;
 
+	priv->to_file = TRUE;
+
+        start(downloader);
+
 	return TRUE;
 }
 
@@ -432,10 +508,8 @@
 {
 	g_return_val_if_fail(KZ_IS_DOWNLOADER(downloader), FALSE);
 	
-	kz_downloader_connect_signals(downloader);
+        start(downloader);
 
-	kz_io_load_to_buffer(downloader->io);
-
 	return TRUE;
 }
 

Modified: kazehakase/trunk/src/kz-downloader.h
===================================================================
--- kazehakase/trunk/src/kz-downloader.h	2009-02-16 05:51:38 UTC (rev 3716)
+++ kazehakase/trunk/src/kz-downloader.h	2009-02-16 07:02:02 UTC (rev 3717)
@@ -22,7 +22,6 @@
 #define __KZ_DOWNLOADER_H__
 
 #include <glib-object.h>
-#include "kz-io.h"
 
 G_BEGIN_DECLS
 
@@ -39,11 +38,6 @@
 struct _KzDownloader
 {
 	GObject parent;
-	KzIO *io;
-
-	gchar  *uri;
-	gchar  *dir;
-	gchar  *filename;
 };
 
 struct _KzDownloaderClass
@@ -64,10 +58,12 @@
 KzDownloader *kz_downloader_new               (const gchar *uri);
 KzDownloader *kz_downloader_new_with_filename (const gchar *uri, const gchar *filename);
 
+const gchar  *kz_downloader_get_uri              (KzDownloader *downloader);
+const gchar  *kz_downloader_get_filename         (KzDownloader *downloader);
 void          kz_downloader_cancel               (KzDownloader *downloader);
 gboolean      kz_downloader_to_file              (KzDownloader *downloader);
 gboolean      kz_downloader_to_buffer            (KzDownloader *downloader);
-const gchar  *kz_downloader_get_string           (KzDownloader *downloader);
+const gchar  *kz_downloader_get_buffer           (KzDownloader *downloader);
 gsize         kz_downloader_get_size             (KzDownloader *downloader);
 gint          kz_downloader_get_percent          (KzDownloader *downloader);
 gsize         kz_downloader_get_current_progress (KzDownloader *downloader);

Modified: kazehakase/trunk/src/kz-favicon.c
===================================================================
--- kazehakase/trunk/src/kz-favicon.c	2009-02-16 05:51:38 UTC (rev 3716)
+++ kazehakase/trunk/src/kz-favicon.c	2009-02-16 07:02:02 UTC (rev 3717)
@@ -92,7 +92,7 @@
 				g_cclosure_marshal_VOID__STRING,
 				G_TYPE_NONE, 1,
 				G_TYPE_STRING);
-	g_type_class_add_private (object_class, sizeof(KzFaviconPrivate));
+	g_type_class_add_private(object_class, sizeof(KzFaviconPrivate));
 }
 
 static gchar *
@@ -272,7 +272,7 @@
 	kz_downloader_disconnect_signal(dl, info);
 
 	if (!g_file_set_contents(info->favicon_file_location,
-				 kz_downloader_get_string(dl),
+				 kz_downloader_get_buffer(dl),
 				 kz_downloader_get_size(dl),
 				 NULL) &&
 	    g_file_test(info->favicon_file_location, G_FILE_TEST_EXISTS))

Modified: kazehakase/trunk/src/sidebar/kz-downloader-sidebar.c
===================================================================
--- kazehakase/trunk/src/sidebar/kz-downloader-sidebar.c	2009-02-16 05:51:38 UTC (rev 3716)
+++ kazehakase/trunk/src/sidebar/kz-downloader-sidebar.c	2009-02-16 07:02:02 UTC (rev 3717)
@@ -117,8 +117,8 @@
 
 		gtk_list_store_append(store, &iter);
 		gtk_list_store_set(store, &iter,
-				   COLUMN_URI,        downloader->uri,
-				   COLUMN_LOCAL_FILE, downloader->filename,
+				   COLUMN_URI,        kz_downloader_get_uri(downloader),
+				   COLUMN_LOCAL_FILE, kz_downloader_get_filename(downloader),
 				   COLUMN_PROGRESS,   0.0,
 				   COLUMN_DOWNLOADER, downloader,
 				   TERMINATOR);
@@ -143,8 +143,8 @@
 
 	gtk_list_store_append(store, &iter);
 	gtk_list_store_set(store, &iter,
-			   COLUMN_URI,        downloader->uri,
-			   COLUMN_LOCAL_FILE, downloader->filename,
+			   COLUMN_URI,        kz_downloader_get_uri(downloader),
+			   COLUMN_LOCAL_FILE, kz_downloader_get_filename(downloader),
 			   COLUMN_DOWNLOADER, downloader,
 			   TERMINATOR);
 }




More information about the Kazehakase-cvs mailing list
Back to archive index