if (!g_file_test (filename, G_FILE_TEST_EXISTS))
{
file = g_fopen (filename, "w+");
- if (file)
+ if (file != NULL)
g_fprintf (file, LOG_HEADER);
g_chmod (filename, LOG_FILE_CREATE_MODE);
else
{
file = g_fopen (filename, "r+");
- if (file)
+ if (file != NULL)
fseek (file, - strlen (LOG_FOOTER), SEEK_END);
}
contact_id = g_markup_escape_text (str, -1);
avatar = empathy_contact_get_avatar (sender);
- if (avatar)
+ if (avatar != NULL)
avatar_token = g_markup_escape_text (avatar->token, -1);
g_fprintf (file,
- "<message time='%s' id='%s' name='%s' token='%s' isuser='%s' type='%s'>"
- "%s</message>\n" LOG_FOOTER, timestamp, contact_id, contact_name,
+ "<message time='%s' cm_id='%d' id='%s' name='%s' token='%s' isuser='%s' type='%s'>"
+ "%s</message>\n" LOG_FOOTER, timestamp,
+ empathy_message_get_id (message),
+ contact_id, contact_name,
avatar_token ? avatar_token : "",
empathy_contact_is_user (sender) ? "true" : "false",
empathy_message_type_to_str (msg_type), body);
gchar *is_user_str;
gboolean is_user = FALSE;
gchar *msg_type_str;
+ gchar *cm_id_str;
+ guint cm_id;
TpChannelTextMessageType msg_type = TP_CHANNEL_TEXT_MESSAGE_TYPE_NORMAL;
if (strcmp (node->name, "message") != 0)
sender_avatar_token = xmlGetProp (node, "token");
is_user_str = xmlGetProp (node, "isuser");
msg_type_str = xmlGetProp (node, "type");
+ cm_id_str = xmlGetProp (node, "cm_id");
if (is_user_str)
is_user = strcmp (is_user_str, "true") == 0;
if (msg_type_str)
msg_type = empathy_message_type_from_str (msg_type_str);
+ if (cm_id_str)
+ cm_id = atoi (cm_id_str);
+
t = empathy_time_parse (time);
- sender = empathy_contact_new_full (account, sender_id, sender_name);
- empathy_contact_set_is_user (sender, is_user);
+ sender = empathy_contact_new_for_log (account, sender_id, sender_name,
+ is_user);
+
if (!EMP_STR_EMPTY (sender_avatar_token))
empathy_contact_load_avatar_cache (sender,
sender_avatar_token);
empathy_message_set_timestamp (message, t);
empathy_message_set_tptype (message, msg_type);
+ if (cm_id_str)
+ empathy_message_set_id (message, cm_id);
+
messages = g_list_append (messages, message);
g_object_unref (sender);
xmlFree (body);
xmlFree (is_user_str);
xmlFree (msg_type_str);
+ xmlFree (cm_id_str);
+ xmlFree (sender_avatar_token);
}
DEBUG ("Parsed %d messages", g_list_length (messages));
files = log_store_empathy_get_all_files (self, NULL);
DEBUG ("Found %d log files in total", g_list_length (files));
- for (l = files; l; l = l->next)
+ for (l = files; l; l = g_list_next (l))
{
gchar *filename;
GMappedFile *file;
GDir *gdir;
GList *hits = NULL;
const gchar *name;
+ GError *error = NULL;
- gdir = g_dir_open (dir, 0, NULL);
+ gdir = g_dir_open (dir, 0, &error);
if (!gdir)
- return NULL;
+ {
+ DEBUG ("Failed to open directory: %s, error: %s", dir, error->message);
+ g_error_free (error);
+ return NULL;
+ }
while ((name = g_dir_read_name (gdir)) != NULL)
{
EmpathyLogSearchHit *hit;
- gchar *filename;
- filename = g_build_filename (dir, name, NULL);
- if (strcmp (name, LOG_DIR_CHATROOMS) == 0)
+ if (!is_chatroom && strcmp (name, LOG_DIR_CHATROOMS) == 0)
{
+ gchar *filename = g_build_filename (dir, name, NULL);
hits = g_list_concat (hits, log_store_empathy_get_chats_for_dir (
- self, dir, TRUE));
+ self, filename, TRUE));
g_free (filename);
continue;
}
-
hit = g_slice_new0 (EmpathyLogSearchHit);
hit->chat_id = g_strdup (name);
hit->is_chatroom = is_chatroom;
return priv->name;
}
+static GList *
+log_store_empathy_get_filtered_messages (EmpathyLogStore *self,
+ McAccount *account,
+ const gchar *chat_id,
+ gboolean chatroom,
+ guint num_messages,
+ EmpathyLogMessageFilter filter,
+ gpointer user_data)
+{
+ GList *dates, *l, *messages = NULL;
+ guint i = 0;
+
+ dates = log_store_empathy_get_dates (self, account, chat_id, chatroom);
+
+ for (l = g_list_last (dates); l && i < num_messages; l = g_list_previous (l))
+ {
+ GList *new_messages, *n, *next;
+
+ /* FIXME: We should really restrict the message parsing to get only
+ * the newest num_messages. */
+ new_messages = log_store_empathy_get_messages_for_date (self, account,
+ chat_id, chatroom, l->data);
+
+ n = new_messages;
+ while (n != NULL)
+ {
+ next = g_list_next (n);
+ if (!filter (n->data, user_data))
+ {
+ g_object_unref (n->data);
+ new_messages = g_list_delete_link (new_messages, n);
+ }
+ else
+ {
+ i++;
+ }
+ n = next;
+ }
+ messages = g_list_concat (messages, new_messages);
+ }
+
+ g_list_foreach (dates, (GFunc) g_free, NULL);
+ g_list_free (dates);
+
+ return messages;
+}
+
static void
log_store_iface_init (gpointer g_iface,
gpointer iface_data)
iface->get_chats = log_store_empathy_get_chats;
iface->search_new = log_store_empathy_search_new;
iface->ack_message = NULL;
+ iface->get_filtered_messages = log_store_empathy_get_filtered_messages;
}