From 106e1e4bf32d6f48db7347ea12b3468e7a7ca941 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Mon, 16 Mar 2009 15:26:47 +0000 Subject: Make document loading async. --- diff --git a/browser-plugin/plugin.cpp b/browser-plugin/plugin.cpp index 295c0f7..7f3d6d9 100644 --- a/browser-plugin/plugin.cpp +++ b/browser-plugin/plugin.cpp @@ -24,7 +24,8 @@ Plugin::Plugin (NPP instance) : mInstance (instance), mWindow (0), - mScriptableObject (0) + mScriptableObject (0), + mLoadJob (0) { mScrolledWindow = gtk_scrolled_window_new (NULL, NULL); @@ -46,6 +47,7 @@ Plugin::Plugin (NPP instance) : mInstance (instance), Plugin::~Plugin () { + ClearLoadJob (); } void @@ -89,37 +91,42 @@ Plugin::SetWindow (GdkNativeWindow window) } void -Plugin::ShowLoadingError() +Plugin::ShowLoadingError () { /* FIXME display loading error in the UI */ } void -Plugin::Load (const char *fname) +Plugin::ClearLoadJob () { - GError *error = NULL; + if (mLoadJob != NULL) { + if (!ev_job_is_finished (mLoadJob)) + ev_job_cancel (mLoadJob); + + g_signal_handlers_disconnect_by_func ( + mLoadJob, + (gpointer)LoadJobFinishedCallback, + reinterpret_cast(this)); + + g_object_unref (mLoadJob); + mLoadJob = NULL; + } +} +void +Plugin::Load (const char *fname) +{ GFile *file = g_file_new_for_path (fname); char *uri = g_file_get_uri (file); g_object_unref (file); - EvDocument *document = ev_document_factory_get_document (uri, &error); - if (error) { - ShowLoadingError (); - g_error_free (error); - return; - } - - ev_view_set_document (EV_VIEW (mView), document); - g_object_unref (G_OBJECT (document)); - - ev_document_load (document, uri, &error); - if (error) { - ShowLoadingError (); - g_error_free (error); - return; - } + ClearLoadJob (); + mLoadJob = ev_job_load_new (uri); + ev_job_scheduler_push_job (mLoadJob, EV_JOB_PRIORITY_NONE); + g_signal_connect (mLoadJob, "finished", + G_CALLBACK (LoadJobFinishedCallback), + reinterpret_cast(this)); g_free (uri); } @@ -181,3 +188,18 @@ Plugin::SizingModeCallback (EvView *view, GParamSpec *pspec, gpointer data) Plugin *plugin = reinterpret_cast (data); plugin->UpdateSizingMode (); } + +void +Plugin::LoadJobFinishedCallback (EvJob *job, gpointer data) +{ + Plugin *plugin = reinterpret_cast (data); + + if (!ev_job_is_failed (job)) { + ev_view_set_document (EV_VIEW(plugin->mView), + EV_JOB (job)->document); + } else { + plugin->ShowLoadingError (); + } + + plugin->ClearLoadJob (); +} diff --git a/browser-plugin/plugin.h b/browser-plugin/plugin.h index a46e07b..c44e937 100644 --- a/browser-plugin/plugin.h +++ b/browser-plugin/plugin.h @@ -42,16 +42,20 @@ class Plugin { private: void UpdateSizingMode (); + void ClearLoadJob (); static void SizingModeCallback (EvView *view, GParamSpec *pspec, gpointer data); + static void LoadJobFinishedCallback (EvJob *job, + gpointer data); NPP mInstance; NPObject *mScriptableObject; GdkNativeWindow mWindow; GtkWidget *mScrolledWindow; GtkWidget *mView; + EvJob *mLoadJob; }; #endif // __PLUGIN_H__ -- cgit v0.9.1