Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/browser-plugin/plugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'browser-plugin/plugin.cpp')
-rw-r--r--browser-plugin/plugin.cpp62
1 files changed, 42 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 ();
+}