]> git.0d.be Git - empathy.git/blobdiff - libempathy/empathy-log-store-empathy.c
Merge branch 'master' into tp-tube
[empathy.git] / libempathy / empathy-log-store-empathy.c
index 2930aceb5af6bb55783bfeae39d16686dfc2fb55..b74b5e177dbb7fb2b41bf07e791c0ec245812448 100644 (file)
@@ -220,7 +220,7 @@ log_store_empathy_add_message (EmpathyLogStore *self,
   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);
@@ -228,7 +228,7 @@ log_store_empathy_add_message (EmpathyLogStore *self,
   else
     {
       file = g_fopen (filename, "r+");
-      if (file)
+      if (file != NULL)
         fseek (file, - strlen (LOG_FOOTER), SEEK_END);
     }
 
@@ -242,12 +242,14 @@ log_store_empathy_add_message (EmpathyLogStore *self,
   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);
@@ -452,6 +454,8 @@ log_store_empathy_get_messages_for_file (EmpathyLogStore *self,
       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)
@@ -464,6 +468,7 @@ log_store_empathy_get_messages_for_file (EmpathyLogStore *self,
       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;
@@ -471,10 +476,14 @@ log_store_empathy_get_messages_for_file (EmpathyLogStore *self,
       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);
@@ -484,6 +493,9 @@ log_store_empathy_get_messages_for_file (EmpathyLogStore *self,
       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);
@@ -493,6 +505,8 @@ log_store_empathy_get_messages_for_file (EmpathyLogStore *self,
       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));
@@ -563,7 +577,7 @@ log_store_empathy_search_new (EmpathyLogStore *self,
   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;
@@ -615,25 +629,28 @@ log_store_empathy_get_chats_for_dir (EmpathyLogStore *self,
   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;
@@ -697,6 +714,53 @@ log_store_empathy_get_name (EmpathyLogStore *self)
   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)
@@ -711,4 +775,5 @@ log_store_iface_init (gpointer g_iface,
   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;
 }