[telepathy-mission-control/master] McdChannel: keep the most recent time of a group of requests; McdDispatcher: use it

Simon McVittie simon.mcvittie at collabora.co.uk
Tue Oct 20 14:48:19 PDT 2009


---
 src/mcd-channel-priv.h       |    3 ++-
 src/mcd-channel.c            |   15 ++++++++++++++-
 src/mcd-dispatch-operation.c |   16 ++++++++--------
 src/mcd-dispatcher.c         |    6 +++---
 4 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/src/mcd-channel-priv.h b/src/mcd-channel-priv.h
index cfe6cb6..97f682f 100644
--- a/src/mcd-channel-priv.h
+++ b/src/mcd-channel-priv.h
@@ -58,7 +58,8 @@ GHashTable *_mcd_channel_get_requested_properties (McdChannel *channel);
 G_GNUC_INTERNAL
 const gchar *_mcd_channel_get_request_path (McdChannel *channel);
 G_GNUC_INTERNAL
-const GList *_mcd_channel_get_satisfied_requests (McdChannel *channel);
+const GList *_mcd_channel_get_satisfied_requests (McdChannel *channel,
+                                                  gint64 *get_latest_time);
 G_GNUC_INTERNAL
 guint64 _mcd_channel_get_request_user_action_time (McdChannel *channel);
 G_GNUC_INTERNAL
diff --git a/src/mcd-channel.c b/src/mcd-channel.c
index ea1ec65..95c8eef 100644
--- a/src/mcd-channel.c
+++ b/src/mcd-channel.c
@@ -79,6 +79,7 @@ struct _McdChannelPrivate
 
     McdChannelRequestData *request_data;
     GList *satisfied_requests;
+    gint64 latest_request_time;
 };
 
 struct _McdChannelRequestData
@@ -1230,6 +1231,7 @@ mcd_channel_new_request (McdAccount *account,
     channel->priv->request_data = crd;
     channel->priv->satisfied_requests = g_list_prepend (NULL,
                                                         g_strdup (crd->path));
+    channel->priv->latest_request_time = user_time;
 
     _mcd_channel_set_status (channel, MCD_CHANNEL_STATUS_REQUEST);
 
@@ -1279,15 +1281,22 @@ _mcd_channel_get_request_path (McdChannel *channel)
 /*
  * _mcd_channel_get_satisfied_requests:
  * @channel: the #McdChannel.
+ * @get_latest_time: if not %NULL, the most recent request time will be copied
+ *  through this pointer
  *
  * Returns: a list of the object paths of the channel requests satisfied by
  * this channel, if the channel status is not yet MCD_CHANNEL_STATUS_DISPATCHED
  * or MCD_CHANNEL_STATUS_FAILED.
  */
 const GList *
-_mcd_channel_get_satisfied_requests (McdChannel *channel)
+_mcd_channel_get_satisfied_requests (McdChannel *channel,
+                                     gint64 *get_latest_time)
 {
     g_return_val_if_fail (MCD_IS_CHANNEL (channel), NULL);
+
+    if (get_latest_time != NULL)
+        *get_latest_time = channel->priv->latest_request_time;
+
     return channel->priv->satisfied_requests;
 }
 
@@ -1438,6 +1447,10 @@ _mcd_channel_set_request_proxy (McdChannel *channel, McdChannel *source)
     request_path = _mcd_channel_get_request_path (channel);
     if (G_LIKELY (request_path))
     {
+        source->priv->latest_request_time =
+            MAX (source->priv->latest_request_time,
+                 channel->priv->latest_request_time);
+
         source->priv->satisfied_requests =
             g_list_prepend (source->priv->satisfied_requests,
                             g_strdup (request_path));
diff --git a/src/mcd-dispatch-operation.c b/src/mcd-dispatch-operation.c
index bab4fb8..bf138dc 100644
--- a/src/mcd-dispatch-operation.c
+++ b/src/mcd-dispatch-operation.c
@@ -1415,7 +1415,8 @@ collect_satisfied_requests (GList *channels)
     /* collect object paths into a hash table, to drop duplicates */
     for (c = channels; c != NULL; c = c->next)
     {
-        const GList *reqs = _mcd_channel_get_satisfied_requests (c->data);
+        const GList *reqs = _mcd_channel_get_satisfied_requests (c->data,
+                                                                 NULL);
 
         for (r = reqs; r != NULL; r = r->next)
         {
@@ -1657,7 +1658,7 @@ static void
 mcd_dispatch_operation_handle_channels (McdDispatchOperation *self,
                                         McdClientProxy *handler)
 {
-    guint64 user_action_time;
+    gint64 user_action_time;
     const gchar *account_path;
     GPtrArray *satisfied_requests;
     GHashTable *handler_info;
@@ -1672,19 +1673,18 @@ mcd_dispatch_operation_handle_channels (McdDispatchOperation *self,
     {
         McdChannel *channel = MCD_CHANNEL (cl->data);
         const GList *requests;
-        guint64 user_time;
+        gint64 req_time;
 
-        requests = _mcd_channel_get_satisfied_requests (channel);
+        requests = _mcd_channel_get_satisfied_requests (channel,
+                                                        &req_time);
         while (requests)
         {
             g_ptr_array_add (satisfied_requests, requests->data);
             requests = requests->next;
         }
 
-        /* FIXME: what if we have more than one request? */
-        user_time = _mcd_channel_get_request_user_action_time (channel);
-        if (user_time)
-            user_action_time = user_time;
+        if (req_time > user_action_time)
+            user_action_time = req_time;
 
         _mcd_channel_set_status (channel,
                                  MCD_CHANNEL_STATUS_HANDLER_INVOKED);
diff --git a/src/mcd-dispatcher.c b/src/mcd-dispatcher.c
index 21b5cb4..b68a949 100644
--- a/src/mcd-dispatcher.c
+++ b/src/mcd-dispatcher.c
@@ -1764,7 +1764,7 @@ _mcd_dispatcher_reinvoke_handler (McdDispatcher *dispatcher,
     McdAccount *account;
     const gchar *account_path;
     const GList *requests;
-    guint64 user_action_time;
+    gint64 user_action_time;
     McdClientProxy *handler;
 
     request_as_list = g_list_append (NULL, request);
@@ -1820,14 +1820,14 @@ _mcd_dispatcher_reinvoke_handler (McdDispatcher *dispatcher,
 
     satisfied_requests = g_ptr_array_new ();
 
-    for (requests = _mcd_channel_get_satisfied_requests (request);
+    for (requests = _mcd_channel_get_satisfied_requests (request,
+                                                         &user_action_time);
          requests != NULL;
          requests = requests->next)
     {
         g_ptr_array_add (satisfied_requests, requests->data);
     }
 
-    user_action_time = _mcd_channel_get_request_user_action_time (request);
     handler_info = g_hash_table_new (g_str_hash, g_str_equal);
 
     _mcd_channel_set_status (request, MCD_CHANNEL_STATUS_HANDLER_INVOKED);
-- 
1.5.6.5




More information about the telepathy-commits mailing list