[telepathy-mission-control/master] McdDispatchOperation: replace the "approved" boolean with a list of reasons for approval

Simon McVittie simon.mcvittie at collabora.co.uk
Tue Oct 27 13:41:07 PDT 2009


Eventually this list can contain dbus-glib contexts, etc.
---
 src/mcd-dispatch-operation.c |   62 ++++++++++++++++++++++++++++++++---------
 1 files changed, 48 insertions(+), 14 deletions(-)

diff --git a/src/mcd-dispatch-operation.c b/src/mcd-dispatch-operation.c
index 55671a9..ba2b08d 100644
--- a/src/mcd-dispatch-operation.c
+++ b/src/mcd-dispatch-operation.c
@@ -75,6 +75,32 @@ G_DEFINE_TYPE_WITH_CODE (McdDispatchOperation, _mcd_dispatch_operation,
     G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_DBUS_PROPERTIES, properties_iface_init);
     )
 
+typedef enum {
+    APPROVAL_TYPE_REQUESTED,
+    APPROVAL_TYPE_FINISHED,
+    APPROVAL_TYPE_NO_APPROVERS
+} ApprovalType;
+
+typedef struct {
+    ApprovalType type;
+    /* will later include DBusGMethodInvocation etc. */
+} Approval;
+
+static Approval *
+approval_new (ApprovalType type)
+{
+    Approval *approval = g_slice_new (Approval);
+
+    approval->type = type;
+    return approval;
+}
+
+static void
+approval_free (Approval *approval)
+{
+    g_slice_free (Approval, approval);
+}
+
 struct _McdDispatchOperationPrivate
 {
     const gchar *unique_name;   /* borrowed from object_path */
@@ -97,6 +123,9 @@ struct _McdDispatchOperationPrivate
     gchar *claimer;
     DBusGMethodInvocation *claim_context;
 
+    /* queue of Approval */
+    GQueue *approvals;
+
     /* Reference to a global handler map */
     McdHandlerMap *handler_map;
 
@@ -236,7 +265,8 @@ _mcd_dispatch_operation_dec_ado_pending (McdDispatchOperation *self)
     {
         DEBUG ("No approver accepted the channels; considering them to be "
                "approved");
-        self->priv->approved = TRUE;
+        g_queue_push_tail (self->priv->approvals,
+                           approval_new (APPROVAL_TYPE_NO_APPROVERS));
     }
 
     _mcd_dispatch_operation_check_client_locks (self);
@@ -254,7 +284,8 @@ _mcd_dispatch_operation_get_cancelled (McdDispatchOperation *self)
 static inline gboolean
 _mcd_dispatch_operation_is_approved (McdDispatchOperation *self)
 {
-    return (self->priv->approved || !self->priv->needs_approval);
+    return (!self->priv->needs_approval ||
+            !g_queue_is_empty (self->priv->approvals));
 }
 
 static gboolean _mcd_dispatch_operation_try_next_handler (
@@ -468,8 +499,6 @@ mcd_dispatch_operation_set_channel_handled_by (McdDispatchOperation *self,
                                           tp_channel, unique_name);
 }
 
-static void _mcd_dispatch_operation_set_approved (McdDispatchOperation *self);
-
 static void
 mcd_dispatch_operation_actually_finish (McdDispatchOperation *self)
 {
@@ -505,7 +534,9 @@ mcd_dispatch_operation_actually_finish (McdDispatchOperation *self)
     if (self->priv->awaiting_approval)
     {
         self->priv->awaiting_approval = FALSE;
-        _mcd_dispatch_operation_set_approved (self);
+        g_queue_push_tail (self->priv->approvals,
+                           approval_new (APPROVAL_TYPE_FINISHED));
+        _mcd_dispatch_operation_check_client_locks (self);
     }
 
     if (self->priv->claim_context != NULL)
@@ -945,6 +976,14 @@ mcd_dispatch_operation_dispose (GObject *object)
         g_object_unref (priv->client_registry);
         priv->client_registry = NULL;
     }
+
+    if (priv->approvals != NULL)
+    {
+        g_queue_foreach (priv->approvals, (GFunc) approval_free, NULL);
+        g_queue_free (priv->approvals);
+        priv->approvals = NULL;
+    }
+
     G_OBJECT_CLASS (_mcd_dispatch_operation_parent_class)->dispose (object);
 }
 
@@ -1011,6 +1050,7 @@ _mcd_dispatch_operation_init (McdDispatchOperation *operation)
                                         MCD_TYPE_DISPATCH_OPERATION,
                                         McdDispatchOperationPrivate);
     operation->priv = priv;
+    operation->priv->approvals = g_queue_new ();
 
     /* initializes the interfaces */
     mcd_dbus_init_interfaces_instances (operation);
@@ -1218,7 +1258,9 @@ _mcd_dispatch_operation_approve (McdDispatchOperation *self,
     }
     else
     {
-        _mcd_dispatch_operation_set_approved (self);
+        g_queue_push_tail (self->priv->approvals,
+                           approval_new (APPROVAL_TYPE_REQUESTED));
+        _mcd_dispatch_operation_check_client_locks (self);
     }
 }
 
@@ -1394,14 +1436,6 @@ _mcd_dispatch_operation_handlers_can_bypass_approval (
     return FALSE;
 }
 
-static void
-_mcd_dispatch_operation_set_approved (McdDispatchOperation *self)
-{
-    g_return_if_fail (MCD_IS_DISPATCH_OPERATION (self));
-    self->priv->approved = TRUE;
-    _mcd_dispatch_operation_check_client_locks (self);
-}
-
 gboolean
 _mcd_dispatch_operation_has_channel (McdDispatchOperation *self,
                                      McdChannel *channel)
-- 
1.5.6.5




More information about the telepathy-commits mailing list