[empathy: 6/80] TplActionChain: add _tpl_action_chain_start()



commit 8d3f7406c2055e4483cdc9639f8463e48b521621
Author: Emilio Pozuelo Monfort <emilio pozuelo collabora co uk>
Date:   Wed Apr 20 09:23:05 2011 +0100

    TplActionChain: add _tpl_action_chain_start()

 libempathy/action-chain-internal.h |    3 +++
 libempathy/action-chain.c          |   18 +++++++++++++++++-
 2 files changed, 20 insertions(+), 1 deletions(-)
---
diff --git a/libempathy/action-chain-internal.h b/libempathy/action-chain-internal.h
index 674cc2b..d2395d1 100644
--- a/libempathy/action-chain-internal.h
+++ b/libempathy/action-chain-internal.h
@@ -27,6 +27,7 @@
 typedef struct {
     GQueue *chain;
     GSimpleAsyncResult *simple;
+    gboolean running;
 } TplActionChain;
 
 TplActionChain *_tpl_action_chain_new_async (GObject *obj,
@@ -38,8 +39,10 @@ void _tpl_action_chain_append (TplActionChain *self, TplPendingAction func,
     gpointer user_data);
 void _tpl_action_chain_prepend (TplActionChain *self, TplPendingAction func,
     gpointer user_data);
+void _tpl_action_chain_start (TplActionChain *self);
 void _tpl_action_chain_continue (TplActionChain *self);
 void _tpl_action_chain_terminate (TplActionChain *self, const GError *error);
+
 gpointer _tpl_action_chain_get_object (TplActionChain *self);
 gboolean _tpl_action_chain_new_finish (GObject *source,
     GAsyncResult *result, GError **error);
diff --git a/libempathy/action-chain.c b/libempathy/action-chain.c
index df792e5..30217dd 100644
--- a/libempathy/action-chain.c
+++ b/libempathy/action-chain.c
@@ -104,18 +104,34 @@ _tpl_action_chain_append (TplActionChain *self,
   g_queue_push_tail (self->chain, l);
 }
 
+void
+_tpl_action_chain_start (TplActionChain *self)
+{
+  g_return_if_fail (!g_queue_is_empty (self->chain));
+
+  if (self->running)
+    return;
+
+  _tpl_action_chain_continue (self);
+}
 
 void
 _tpl_action_chain_continue (TplActionChain *self)
 {
   if (g_queue_is_empty (self->chain))
-    g_simple_async_result_complete (self->simple);
+    {
+      self->running = FALSE;
+      g_simple_async_result_complete (self->simple);
+    }
   else
     {
       TplActionLink *l = g_queue_pop_head (self->chain);
 
+      self->running = TRUE;
       l->action (self, l->user_data);
       link_free (l);
+      if (g_queue_is_empty (self->chain))
+        self->running = FALSE;
     }
 }
 



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