summaryrefslogtreecommitdiff
path: root/telepathy-logger/log-manager.c
diff options
context:
space:
mode:
authorNicolas Dufresne <nicolas.dufresne@collabora.com>2011-05-26 18:18:44 -0400
committerNicolas Dufresne <nicolas.dufresne@collabora.com>2011-05-26 18:18:44 -0400
commit945c4ec3bc883d9ed11fddd042240a0cc6602e82 (patch)
tree12f074691c3554aaaa385bec20ce84acca313585 /telepathy-logger/log-manager.c
parent4230ec13757892520a2971dacbb82b55fda7a76e (diff)
parent246744179fc337ac588206c03bc2260938c7c7f1 (diff)
downloadtelepathy-logger-945c4ec3bc883d9ed11fddd042240a0cc6602e82.tar.gz
Merge branch 'fix-insert-after'
Diffstat (limited to 'telepathy-logger/log-manager.c')
-rw-r--r--telepathy-logger/log-manager.c53
1 files changed, 9 insertions, 44 deletions
diff --git a/telepathy-logger/log-manager.c b/telepathy-logger/log-manager.c
index a94ee72..4f1ed9e 100644
--- a/telepathy-logger/log-manager.c
+++ b/telepathy-logger/log-manager.c
@@ -559,26 +559,6 @@ _tpl_log_manager_get_events_for_date (TplLogManager *manager,
}
-static gint
-log_manager_event_date_cmp (gconstpointer a,
- gconstpointer b)
-{
- TplEvent *one = (TplEvent *) a;
- TplEvent *two = (TplEvent *) b;
- gint64 one_time, two_time;
-
- g_assert (TPL_IS_EVENT (one));
- g_assert (TPL_IS_EVENT (two));
-
- one_time = tpl_event_get_timestamp (one);
- two_time = tpl_event_get_timestamp (two);
-
- /* return -1, 0 or 1 depending on event1 being newer, the same or older
- * than event2 */
- return CLAMP (one_time - two_time, -1, 1);
-}
-
-
GList *
_tpl_log_manager_get_filtered_events (TplLogManager *manager,
TpAccount *account,
@@ -589,9 +569,8 @@ _tpl_log_manager_get_filtered_events (TplLogManager *manager,
gpointer user_data)
{
TplLogManagerPriv *priv;
- GList *out = NULL;
+ GQueue out = G_QUEUE_INIT;
GList *l;
- guint i = 0;
g_return_val_if_fail (TPL_IS_LOG_MANAGER (manager), NULL);
g_return_val_if_fail (TPL_IS_ENTITY (target), NULL);
@@ -603,40 +582,26 @@ _tpl_log_manager_get_filtered_events (TplLogManager *manager,
for (l = priv->readable_stores; l != NULL; l = g_list_next (l))
{
TplLogStore *store = TPL_LOG_STORE (l->data);
- GList *new;
+ GList *new, *index = NULL;
new = _tpl_log_store_get_filtered_events (store, account, target,
type_mask, num_events, filter, user_data);
+
while (new != NULL)
{
- if (i < num_events)
- {
- /* We have less events than needed so far. Keep this event. */
- out = g_list_insert_sorted (out, new->data,
- (GCompareFunc) log_manager_event_date_cmp);
- i++;
- }
- else if (log_manager_event_date_cmp (new->data, out->data) > 0)
- {
- /* This event is newer than the oldest event we have in out
- * list. Remove the head of out list and insert this event. */
- g_object_unref (out->data);
- out = g_list_delete_link (out, out);
- out = g_list_insert_sorted (out, new->data,
- (GCompareFunc) log_manager_event_date_cmp);
- }
- else
+ index = _tpl_event_queue_insert_sorted_after (&out, index, new->data);
+
+ if (out.length > num_events)
{
- /* This event is older than the oldest event we have in out
- * list. Drop it. */
- g_object_unref (new->data);
+ /* We have too many elements. Remove the oldest event. */
+ g_object_unref (g_queue_pop_head (&out));
}
new = g_list_delete_link (new, new);
}
}
- return out;
+ return out.head;
}