summaryrefslogtreecommitdiff
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
parent4230ec13757892520a2971dacbb82b55fda7a76e (diff)
parent246744179fc337ac588206c03bc2260938c7c7f1 (diff)
downloadtelepathy-logger-945c4ec3bc883d9ed11fddd042240a0cc6602e82.tar.gz
Merge branch 'fix-insert-after'
-rw-r--r--telepathy-logger/log-manager.c53
-rw-r--r--telepathy-logger/log-store-xml.c38
-rw-r--r--telepathy-logger/util-internal.h5
-rw-r--r--telepathy-logger/util.c37
-rw-r--r--tests/dbus/test-log-manager.c2
-rw-r--r--tests/dbus/test-tpl-log-store-xml.c63
-rw-r--r--tests/logs/TpLogger/logs/gabble_jabber_user_40collabora_2eco_2euk/user5@collabora.co.uk/20100113.call.log5
-rw-r--r--tests/logs/TpLogger/logs/gabble_jabber_user_40collabora_2eco_2euk/user5@collabora.co.uk/20100113.log5
8 files changed, 119 insertions, 89 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;
}
diff --git a/telepathy-logger/log-store-xml.c b/telepathy-logger/log-store-xml.c
index a27e0cf..bd748d2 100644
--- a/telepathy-logger/log-store-xml.c
+++ b/telepathy-logger/log-store-xml.c
@@ -122,6 +122,7 @@ G_DEFINE_TYPE_WITH_CODE (TplLogStoreXml, _tpl_log_store_xml,
G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (TPL_TYPE_LOG_STORE, log_store_iface_init))
+
static void
log_store_xml_dispose (GObject *object)
{
@@ -351,6 +352,7 @@ log_store_xml_get_dir (TplLogStoreXml *self,
return basedir;
}
+
static const gchar *
log_store_xml_get_file_suffix (GType type)
{
@@ -362,6 +364,7 @@ log_store_xml_get_file_suffix (GType type)
g_return_val_if_reached (NULL);
}
+
static gchar *
log_store_xml_get_timestamp_filename (GType type,
guint64 timestamp)
@@ -609,6 +612,7 @@ out:
return ret;
}
+
static gboolean
add_call_event (TplLogStoreXml *self,
TplCallEvent *event,
@@ -729,6 +733,7 @@ log_store_xml_add_event (TplLogStore *store,
return TRUE;
}
+
static gboolean
log_store_xml_exists_in_directory (const gchar *dirname,
GRegex *regex,
@@ -1278,27 +1283,6 @@ parse_call_node (TplLogStoreXml *self,
return event;
}
-static GList *
-event_queue_insert_sorted_after (GQueue *events,
- GList *index,
- TplEvent *event)
-{
- while (index != NULL &&
- tpl_event_get_timestamp (event) <
- tpl_event_get_timestamp (TPL_EVENT (index->data)))
- index = g_list_next (index);
-
- if (index != NULL)
- {
- g_queue_insert_after (events, index, event);
- return g_list_next (index);
- }
- else
- {
- g_queue_push_tail (events, event);
- return events->head;
- }
-}
static void
event_queue_replace_and_supersede (GQueue *events,
@@ -1313,6 +1297,7 @@ event_queue_replace_and_supersede (GQueue *events,
index->data = event;
}
+
static GList *
event_queue_add_text_event (GQueue *events,
GList *index,
@@ -1324,7 +1309,8 @@ event_queue_add_text_event (GQueue *events,
TplTextEvent *dummy_event;
if (supersedes_token == NULL)
- return event_queue_insert_sorted_after (events, index, TPL_EVENT (event));
+ return _tpl_event_queue_insert_sorted_after (events, index,
+ TPL_EVENT (event));
l = g_hash_table_lookup (superseded_links, supersedes_token);
if (l != NULL)
@@ -1362,12 +1348,13 @@ event_queue_add_text_event (GQueue *events,
"message-token", supersedes_token,
NULL);
- index = event_queue_insert_sorted_after (events, index,
+ index = _tpl_event_queue_insert_sorted_after (events, index,
TPL_EVENT (dummy_event));
event_queue_replace_and_supersede (events, index, superseded_links, event);
return index;
}
+
/* returns a Glist of TplEvent instances */
static void
log_store_xml_get_events_for_file (TplLogStoreXml *self,
@@ -1454,7 +1441,7 @@ log_store_xml_get_events_for_file (TplLogStoreXml *self,
supersedes_links = g_hash_table_new (g_str_hash, g_str_equal);
/* Now get the events. */
- index = events->head;
+ index = NULL;
for (node = log_node->children; node; node = node->next)
{
TplEvent *event = NULL;
@@ -1481,7 +1468,7 @@ log_store_xml_get_events_for_file (TplLogStoreXml *self,
if (event == NULL)
continue;
- index = event_queue_insert_sorted_after (events, index, event);
+ index = _tpl_event_queue_insert_sorted_after (events, index, event);
num_events++;
}
}
@@ -1653,6 +1640,7 @@ log_store_xml_search_new (TplLogStore *store,
return _log_store_xml_search_in_files (self, text, files, type_mask);
}
+
/* Returns: (GList *) of (TplLogSearchHit *) */
static GList *
log_store_xml_get_entities_for_dir (TplLogStoreXml *self,
diff --git a/telepathy-logger/util-internal.h b/telepathy-logger/util-internal.h
index 3aa2fa5..eabcaa1 100644
--- a/telepathy-logger/util-internal.h
+++ b/telepathy-logger/util-internal.h
@@ -26,11 +26,16 @@
#include <glib-object.h>
#include <gio/gio.h>
+#include "event.h"
+
#define TPL_STR_EMPTY(x) ((x) == NULL || (x)[0] == '\0')
void _tpl_rmdir_recursively (const gchar *dir_name);
gint64 _tpl_time_parse (const gchar * str);
+GList *_tpl_event_queue_insert_sorted_after (GQueue *events,
+ GList *index,
+ TplEvent *event);
#endif // __TPL_UTIL_H__
diff --git a/telepathy-logger/util.c b/telepathy-logger/util.c
index 03b9269..ba14704 100644
--- a/telepathy-logger/util.c
+++ b/telepathy-logger/util.c
@@ -22,8 +22,6 @@
#include "util-internal.h"
-#include "log-store-sqlite-internal.h"
-
#include <errno.h>
#include <glib.h>
#include <glib/gstdio.h>
@@ -98,3 +96,38 @@ _tpl_time_parse (const gchar *str)
return ts;
}
+
+
+GList *
+_tpl_event_queue_insert_sorted_after (GQueue *events,
+ GList *index,
+ TplEvent *event)
+{
+ if (g_queue_is_empty (events))
+ {
+ g_queue_push_tail (events, event);
+ return events->tail;
+ }
+
+ /* The initial index might go before the first one */
+ if (index == NULL)
+ {
+ index = events->head;
+
+ if (tpl_event_get_timestamp (event) <
+ tpl_event_get_timestamp (TPL_EVENT (index->data)))
+ {
+ g_queue_insert_before (events, index, event);
+ return events->head;
+ }
+ }
+
+ /* Find the last event that this event can go after */
+ while (g_list_next (index) != NULL &&
+ tpl_event_get_timestamp (event) >=
+ tpl_event_get_timestamp (TPL_EVENT (g_list_next (index)->data)))
+ index = g_list_next (index);
+
+ g_queue_insert_after (events, index, event);
+ return g_list_next (index);
+}
diff --git a/tests/dbus/test-log-manager.c b/tests/dbus/test-log-manager.c
index 5deb349..c3a91a6 100644
--- a/tests/dbus/test-log-manager.c
+++ b/tests/dbus/test-log-manager.c
@@ -455,7 +455,7 @@ test_get_entities (TestCaseFixture *fixture,
get_entities_cb, fixture);
g_main_loop_run (fixture->main_loop);
- g_assert_cmpint (g_list_length (fixture->ret), ==, 4);
+ g_assert_cmpint (g_list_length (fixture->ret), ==, 5);
/* we do not want duplicates */
fixture->ret = g_list_sort (fixture->ret, (GCompareFunc) _tpl_entity_compare);
diff --git a/tests/dbus/test-tpl-log-store-xml.c b/tests/dbus/test-tpl-log-store-xml.c
index d049cf8..fd70ee9 100644
--- a/tests/dbus/test-tpl-log-store-xml.c
+++ b/tests/dbus/test-tpl-log-store-xml.c
@@ -469,7 +469,7 @@ test_add_superseding_event (XmlTestCaseFixture *fixture,
gconstpointer user_data)
{
TpAccount *account;
- TplEntity *me, *contact, *room;
+ TplEntity *me, *contact;
TplEvent *event;
TplTextEvent *new_event;
TplTextEvent *new_new_event;
@@ -489,8 +489,6 @@ test_add_superseding_event (XmlTestCaseFixture *fixture,
me = tpl_entity_new ("me", TPL_ENTITY_SELF, "my-alias", "my-avatar");
contact = tpl_entity_new ("contact", TPL_ENTITY_CONTACT, "contact-alias",
"contact-token");
- room = tpl_entity_new_from_room_id ("room");
-
/* 1. Outgoing message to a contact. */
event = g_object_new (TPL_TYPE_TEXT_EVENT,
@@ -918,10 +916,11 @@ test_get_events_for_date (XmlTestCaseFixture *fixture,
gconstpointer user_data)
{
TpAccount *account;
- TplEntity *user2, *user3, *user4;
+ TplEntity *user2, *user3, *user4, *user5;
GList *events;
GDate *date;
GError *error = NULL;
+ gint idx;
account = tp_account_new (fixture->bus,
TP_ACCOUNT_OBJECT_PATH_BASE "gabble/jabber/user_40collabora_2eco_2euk",
@@ -940,44 +939,71 @@ test_get_events_for_date (XmlTestCaseFixture *fixture,
user4 = tpl_entity_new ("user4@collabora.co.uk", TPL_ENTITY_CONTACT,
"User4", "");
+ user5 = tpl_entity_new ("user5@collabora.co.uk", TPL_ENTITY_CONTACT,
+ "User5", "");
+
+ /* Check that text event and call event are merged properly, call events
+ * should come after any older or same timestamp event. */
events = _tpl_log_store_get_events_for_date (fixture->store, account, user4,
TPL_EVENT_MASK_ANY, date);
g_assert_cmpint (g_list_length (events), ==, 6);
+ idx = -1;
- g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, 0)));
+ g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, ++idx)));
g_assert_cmpstr (
- tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, 0))),
+ tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, idx))),
==, "7");
- g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, 1)));
+ g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, ++idx)));
+ g_assert_cmpstr (
+ tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, idx))),
+ ==, "8");
+
+ g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, ++idx)));
g_assert_cmpint (
- tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, 1))),
+ tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, idx))),
==, 1);
- g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, 2)));
+ g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, ++idx)));
g_assert_cmpint (
- tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, 2))),
+ tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, idx))),
==, 2);
- g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, 3)));
+ g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, ++idx)));
g_assert_cmpint (
- tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, 3))),
+ tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, idx))),
==, 3);
- g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, 4)));
+ g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, ++idx)));
g_assert_cmpstr (
- tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, 4))),
- ==, "8");
+ tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, idx))),
+ ==, "9");
+
+ g_list_foreach (events, (GFunc) g_object_unref, NULL);
+ g_list_free (events);
+
+ /* Check that a call older then any text event is sorted first */
+ events = _tpl_log_store_get_events_for_date (fixture->store, account, user5,
+ TPL_EVENT_MASK_ANY, date);
+
+ g_assert_cmpint (g_list_length (events), ==, 2);
+ idx = -1;
+
+ g_assert (TPL_IS_CALL_EVENT (g_list_nth_data (events, ++idx)));
+ g_assert_cmpint (
+ tpl_call_event_get_duration (TPL_CALL_EVENT (g_list_nth_data (events, idx))),
+ ==, 1);
- g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, 5)));
+ g_assert (TPL_IS_TEXT_EVENT (g_list_nth_data (events, ++idx)));
g_assert_cmpstr (
- tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, 5))),
+ tpl_text_event_get_message (TPL_TEXT_EVENT (g_list_nth_data (events, idx))),
==, "9");
g_list_foreach (events, (GFunc) g_object_unref, NULL);
g_list_free (events);
+ /* Check that call mask work */
events = _tpl_log_store_get_events_for_date (fixture->store, account, user4,
TPL_EVENT_MASK_CALL, date);
@@ -990,6 +1016,7 @@ test_get_events_for_date (XmlTestCaseFixture *fixture,
g_list_foreach (events, (GFunc) g_object_unref, NULL);
g_list_free (events);
+ /* Check that text mask work */
events = _tpl_log_store_get_events_for_date (fixture->store, account, user4,
TPL_EVENT_MASK_TEXT, date);
@@ -1003,6 +1030,7 @@ test_get_events_for_date (XmlTestCaseFixture *fixture,
g_list_foreach (events, (GFunc) g_object_unref, NULL);
g_list_free (events);
+ /* Check that getting empty list is working */
events = _tpl_log_store_get_events_for_date (fixture->store, account, user2,
TPL_EVENT_MASK_CALL, date);
g_assert_cmpint (g_list_length (events), ==, 0);
@@ -1015,6 +1043,7 @@ test_get_events_for_date (XmlTestCaseFixture *fixture,
g_object_unref (user2);
g_object_unref (user3);
g_object_unref (user4);
+ g_object_unref (user5);
g_date_free (date);
}
diff --git a/tests/logs/TpLogger/logs/gabble_jabber_user_40collabora_2eco_2euk/user5@collabora.co.uk/20100113.call.log b/tests/logs/TpLogger/logs/gabble_jabber_user_40collabora_2eco_2euk/user5@collabora.co.uk/20100113.call.log
new file mode 100644
index 0000000..50b4e34
--- /dev/null
+++ b/tests/logs/TpLogger/logs/gabble_jabber_user_40collabora_2eco_2euk/user5@collabora.co.uk/20100113.call.log
@@ -0,0 +1,5 @@
+<?xml version='1.0' encoding='utf-8'?>
+<?xml-stylesheet type="text/xsl" href="empathy-log.xsl"?>
+<log>
+<call time='20100113T17:48:01' id='user@collabora.co.uk' name='Nicolas1' isuser='false' token='' duration='1' actor='user@collabora.co.uk' actortype='contact' actorname='User1' actortoken='' reason='user-requested' detail='org.freedesktop.Telepathy.Error.Cancelled' />
+</log>
diff --git a/tests/logs/TpLogger/logs/gabble_jabber_user_40collabora_2eco_2euk/user5@collabora.co.uk/20100113.log b/tests/logs/TpLogger/logs/gabble_jabber_user_40collabora_2eco_2euk/user5@collabora.co.uk/20100113.log
new file mode 100644
index 0000000..23d6859
--- /dev/null
+++ b/tests/logs/TpLogger/logs/gabble_jabber_user_40collabora_2eco_2euk/user5@collabora.co.uk/20100113.log
@@ -0,0 +1,5 @@
+<?xml version='1.0' encoding='utf-8'?>
+<?xml-stylesheet type="text/xsl" href="empathy-log.xsl"?>
+<log>
+<message time='20100113T17:49:10' cm_id='456' id='user1@collabora.co.uk' name='User1' token='' isuser='false' type='normal'>9</message>
+</log>