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); }