[latexila/wip/build-tools-revamp] BuildJob: basic run operation



commit 6607dfd876cf5d892d22fc412c81ad09bf4a864d
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Thu May 8 22:08:47 2014 +0200

    BuildJob: basic run operation

 src/liblatexila/latexila-build-job.c |   99 ++++++++++++++++++++++++++++++++++
 src/liblatexila/latexila-build-job.h |   13 ++++-
 2 files changed, 111 insertions(+), 1 deletions(-)
---
diff --git a/src/liblatexila/latexila-build-job.c b/src/liblatexila/latexila-build-job.c
index f6d458b..4885d8c 100644
--- a/src/liblatexila/latexila-build-job.c
+++ b/src/liblatexila/latexila-build-job.c
@@ -26,12 +26,15 @@
  */
 
 #include "latexila-build-job.h"
+#include "latexila-build-view.h"
 #include "latexila-enum-types.h"
 
 struct _LatexilaBuildJobPrivate
 {
   gchar *command;
   LatexilaPostProcessorType post_processor_type;
+
+  GNode *build_messages;
 };
 
 enum
@@ -43,6 +46,30 @@ enum
 
 G_DEFINE_TYPE_WITH_PRIVATE (LatexilaBuildJob, latexila_build_job, G_TYPE_OBJECT)
 
+static gboolean
+free_build_msg (GNode    *node,
+                gpointer  user_data)
+{
+  latexila_build_msg_free (node->data);
+  return FALSE;
+}
+
+static void
+free_build_messages (GNode *build_messages)
+{
+  if (build_messages != NULL)
+    {
+      g_node_traverse (build_messages,
+                       G_POST_ORDER,
+                       G_TRAVERSE_ALL,
+                       -1,
+                       free_build_msg,
+                       NULL);
+
+      g_node_destroy (build_messages);
+    }
+}
+
 static void
 latexila_build_job_get_property (GObject    *object,
                                  guint       prop_id,
@@ -105,6 +132,7 @@ latexila_build_job_finalize (GObject *object)
   LatexilaBuildJob *build_job = LATEXILA_BUILD_JOB (object);
 
   g_free (build_job->priv->command);
+  free_build_messages (build_job->priv->build_messages);
 
   G_OBJECT_CLASS (latexila_build_job_parent_class)->finalize (object);
 }
@@ -192,3 +220,74 @@ latexila_build_job_to_xml (LatexilaBuildJob *build_job)
                                   latexila_post_processor_get_name_from_type 
(build_job->priv->post_processor_type),
                                   build_job->priv->command != NULL ? build_job->priv->command : "");
 }
+
+/**
+ * latexila_build_job_run_async:
+ * @build_job: a build job.
+ * @file: a file.
+ * @cancellable: a #GCancellable object.
+ * @callback: the callback to call when the operation is finished.
+ * @user_data: the data to pass to the callback function.
+ *
+ * Runs asynchronously the build job on a file. When the operation is finished,
+ * @callback will be called. You can then call latexila_build_job_run_finish()
+ * and get the build messages with latexila_build_job_get_messages().
+ */
+void
+latexila_build_job_run_async (LatexilaBuildJob    *build_job,
+                              GFile               *file,
+                              GCancellable        *cancellable,
+                              GAsyncReadyCallback  callback,
+                              gpointer             user_data)
+{
+  GTask *task;
+  LatexilaBuildMsg *msg;
+
+  g_return_if_fail (LATEXILA_IS_BUILD_JOB (build_job));
+  g_return_if_fail (G_IS_FILE (file));
+
+  task = g_task_new (build_job, cancellable, callback, user_data);
+
+  free_build_messages (build_job->priv->build_messages);
+
+  msg = latexila_build_msg_new ();
+  msg->text = g_strdup ("build job!");
+
+  build_job->priv->build_messages = g_node_new (msg);
+
+  g_task_return_boolean (task, TRUE);
+  g_object_unref (task);
+}
+
+/**
+ * latexila_build_job_run_finish:
+ * @build_job: a build job.
+ * @result: a #GAsyncResult.
+ *
+ * Finishes the operation started with latexila_build_job_run_async().
+ */
+void
+latexila_build_job_run_finish (LatexilaBuildJob *build_job,
+                               GAsyncResult     *result)
+{
+  g_return_if_fail (g_task_is_valid (result, build_job));
+
+  g_task_propagate_boolean (G_TASK (result), NULL);
+}
+
+/**
+ * latexila_build_job_get_messages:
+ * @build_job: a build job.
+ *
+ * Gets the last build messages. Call this function only when the run operation
+ * is finished, i.e. after calling latexila_build_job_run_finish().
+ *
+ * Returns: the last build messages.
+ */
+const GNode *
+latexila_build_job_get_messages (LatexilaBuildJob *build_job)
+{
+  g_return_val_if_fail (LATEXILA_IS_BUILD_JOB (build_job), NULL);
+
+  return build_job->priv->build_messages;
+}
diff --git a/src/liblatexila/latexila-build-job.h b/src/liblatexila/latexila-build-job.h
index d09da3d..8caa2ab 100644
--- a/src/liblatexila/latexila-build-job.h
+++ b/src/liblatexila/latexila-build-job.h
@@ -20,7 +20,7 @@
 #ifndef __LATEXILA_BUILD_JOB_H__
 #define __LATEXILA_BUILD_JOB_H__
 
-#include <glib-object.h>
+#include <gio/gio.h>
 #include "latexila-types.h"
 #include "latexila-post-processor.h"
 
@@ -56,6 +56,17 @@ LatexilaBuildJob *  latexila_build_job_clone                      (LatexilaBuild
 
 gchar *             latexila_build_job_to_xml                     (LatexilaBuildJob *build_job);
 
+void                latexila_build_job_run_async                  (LatexilaBuildJob    *build_job,
+                                                                   GFile               *file,
+                                                                   GCancellable        *cancellable,
+                                                                   GAsyncReadyCallback  callback,
+                                                                   gpointer             user_data);
+
+void                latexila_build_job_run_finish                 (LatexilaBuildJob *build_job,
+                                                                   GAsyncResult     *result);
+
+const GNode *       latexila_build_job_get_messages               (LatexilaBuildJob *build_job);
+
 G_END_DECLS
 
 #endif /* __LATEXILA_BUILD_JOB_H__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]