Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/browser-plugin
diff options
context:
space:
mode:
authorMarco Pesenti Gritti <marcopg@litl.com>2009-03-16 15:26:47 (GMT)
committer Marco Pesenti Gritti <marcopg@litl.com>2010-07-27 22:04:20 (GMT)
commit106e1e4bf32d6f48db7347ea12b3468e7a7ca941 (patch)
treefdda0699501e4e8de1981fcfa47c02b6e813eca0 /browser-plugin
parenta528c5b40534b666dfdf1bcd4736786d4034fc2e (diff)
Make document loading async.
Diffstat (limited to 'browser-plugin')
-rw-r--r--browser-plugin/plugin.cpp62
-rw-r--r--browser-plugin/plugin.h4
2 files changed, 46 insertions, 20 deletions
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<void*>(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<void*>(this));
g_free (uri);
}
@@ -181,3 +188,18 @@ Plugin::SizingModeCallback (EvView *view, GParamSpec *pspec, gpointer data)
Plugin *plugin = reinterpret_cast<Plugin*> (data);
plugin->UpdateSizingMode ();
}
+
+void
+Plugin::LoadJobFinishedCallback (EvJob *job, gpointer data)
+{
+ Plugin *plugin = reinterpret_cast<Plugin*> (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__