[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