1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright (C) 2003-2007 Imendio AB
4 * Copyright (C) 2007-2008 Collabora Ltd.
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public
17 * License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
21 * Authors: Xavier Claessens <xclaesse@gmail.com>
29 #include <glib/gstdio.h>
31 #include "empathy-log-manager.h"
32 #include "empathy-contact.h"
33 #include "empathy-time.h"
34 #include "empathy-utils.h"
36 #define DEBUG_FLAG EMPATHY_DEBUG_OTHER
37 #include "empathy-debug.h"
39 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyLogManager)
43 } EmpathyLogManagerPriv;
45 G_DEFINE_TYPE (EmpathyLogManager, empathy_log_manager, G_TYPE_OBJECT);
47 static EmpathyLogManager * manager_singleton = NULL;
50 empathy_log_manager_init (EmpathyLogManager *manager)
52 EmpathyLogManagerPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (manager,
53 EMPATHY_TYPE_LOG_MANAGER, EmpathyLogManagerPriv);
58 log_manager_finalize (GObject *object)
60 EmpathyLogManagerPriv *priv;
63 priv = GET_PRIV (object);
65 for (l = priv->sources; l; l = l->next)
67 g_slice_free (EmpathyLogSource, l->data);
70 g_list_free (priv->sources);
74 log_manager_constructor (GType type,
76 GObjectConstructParam *props)
80 if (manager_singleton)
82 retval = g_object_ref (manager_singleton);
86 retval = G_OBJECT_CLASS (empathy_log_manager_parent_class)->constructor
87 (type, n_props, props);
89 manager_singleton = EMPATHY_LOG_MANAGER (retval);
90 g_object_add_weak_pointer (retval, (gpointer *) &manager_singleton);
92 priv = GET_PRIV (manager_singleton);
94 manager_singleton = EMPATHY_LOG_MANAGER (retval);
95 g_object_add_weak_pointer (retval, (gpointer), &manager_singleton);
97 priv->sources = g_list_append (priv->sources,
98 empathy_log_source_empathy_get_source ());
105 empathy_log_manager_class_init (EmpathyLogManagerClass *klass)
107 GObjectClass *object_class = G_OBJECT_CLASS (klass);
109 object_class->finalize = log_manager_finalize;
110 object_class->constructor = log_manager_constructor;
112 g_type_class_add_private (object_class, sizeof (EmpathyLogManagerPriv));
116 empathy_log_manager_dup_singleton (void)
118 return g_object_new (EMPATHY_TYPE_LOG_MANAGER, NULL);
122 empathy_log_manager_add_message (EmpathyLogManager *manager,
123 const gchar *chat_id,
125 EmpathyMessage *message)
127 EmpathyLogManagerPriv *priv;
130 g_return_if_fail (EMPATHY_IS_LOG_MANAGER (manager));
131 g_return_if_fail (chat_id != NULL);
132 g_return_if_fail (EMPATHY_IS_MESSAGE (message));
134 priv = GET_PRIV (manager);
136 for (l = priv->sources; l; l = l->next)
138 EmpathyLogSource *source = (EmpathyLogSource *) l->data;
140 if (!source->add_message)
143 source->add_message (manager, chat_id, chatroom, message);
148 empathy_log_manager_exists (EmpathyLogManager *manager,
150 const gchar *chat_id,
154 EmpathyLogManagerPriv *priv;
156 g_return_val_if_fail (EMPATHY_IS_LOG_MANAGER (manager), FALSE);
157 g_return_val_if_fail (MC_IS_ACCOUNT (account), FALSE);
158 g_return_val_if_fail (chat_id != NULL, FALSE);
160 priv = GET_PRIV (manager);
162 for (l = priv->sources; l; l = l->next)
164 EmpathyLogSource *source = (EmpathyLogSource *) l->data;
169 if (source->exists (manager, account, chat_id, chatroom))
177 log_manager_get_dates_foreach (gpointer data,
180 /* g_list_first is needed in case an older date was last inserted */
181 GList *orig = g_list_first (user_data);
183 if (g_list_find_custom (orig, data, (GCompareFunc) strcmp))
184 orig = g_list_insert_sorted (orig, g_strdup (data), (GCompareFunc) strcmp);
188 empathy_log_manager_get_dates (EmpathyLogManager *manager,
190 const gchar *chat_id,
193 GList *l, *out = NULL;
194 EmpathyLogManagerPriv *priv;
196 g_return_val_if_fail (EMPATHY_IS_LOG_MANAGER (manager), NULL);
197 g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
198 g_return_val_if_fail (chat_id != NULL, NULL);
200 priv = GET_PRIV (manager);
202 for (l = priv->sources; l; l = l->next)
204 EmpathyLogSource *source = (EmpathyLogSource *) l->data;
206 if (!source->get_dates)
210 out = source->get_dates (manager, account, chat_id, chatroom);
213 GList *new = source->get_dates (manager, account, chat_id, chatroom);
214 g_list_foreach (new, log_manager_get_dates_foreach, out);
216 g_list_foreach (new, (GFunc) g_free, NULL);
219 /* Similar reason for using g_list_first here as before */
220 out = g_list_first (out);
228 empathy_log_manager_get_messages_for_date (EmpathyLogManager *manager,
230 const gchar *chat_id,
234 GList *l, *out = NULL;
235 EmpathyLogManagerPriv *priv;
237 g_return_val_if_fail (EMPATHY_IS_LOG_MANAGER (manager), NULL);
238 g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
239 g_return_val_if_fail (chat_id != NULL, NULL);
241 priv = GET_PRIV (manager);
243 for (l = priv->sources; l; l = l->next)
245 EmpathyLogSource *source = (EmpathyLogSource *) l->data;
247 if (!source->get_messages_for_date)
251 out = source->get_messages_for_date (manager, account, chat_id,
254 out = g_list_concat (out, source->get_messages_for_date (manager,
255 account, chat_id, chatroom, date));
262 empathy_log_manager_get_last_messages (EmpathyLogManager *manager,
264 const gchar *chat_id,
267 GList *messages = NULL;
271 g_return_val_if_fail (EMPATHY_IS_LOG_MANAGER (manager), NULL);
272 g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
273 g_return_val_if_fail (chat_id != NULL, NULL);
275 dates = empathy_log_manager_get_dates (manager, account, chat_id, chatroom);
277 l = g_list_last (dates);
279 messages = empathy_log_manager_get_messages_for_date (manager, account,
280 chat_id, chatroom, l->data);
282 g_list_foreach (dates, (GFunc) g_free, NULL);
289 empathy_log_manager_get_chats (EmpathyLogManager *manager,
292 GList *l, *out = NULL;
293 EmpathyLogManagerPriv *priv;
295 g_return_val_if_fail (EMPATHY_IS_LOG_MANAGER (manager), NULL);
296 g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
298 priv = GET_PRIV (manager);
300 for (l = priv->sources; l; l = l->next)
302 EmpathyLogSource *source = (EmpathyLogSource *) l->data;
304 if (!source->get_chats)
308 out = source->get_chats (manager, account);
310 out = g_list_concat (out, source->get_chats (manager, account));
317 empathy_log_manager_search_new (EmpathyLogManager *manager,
320 GList *l, *out = NULL;
321 EmpathyLogManagerPriv *priv;
323 g_return_val_if_fail (EMPATHY_IS_LOG_MANAGER (manager), NULL);
324 g_return_val_if_fail (!EMP_STR_EMPTY (text), NULL);
326 priv = GET_PRIV (manager);
328 for (l = priv->sources; l; l = l->next)
330 EmpathyLogSource *source = (EmpathyLogSource *) l->data;
332 if (!source->search_new)
336 out = source->search_new (manager, text);
338 out = g_list_concat (out, source->search_new (manager, text));
345 empathy_log_manager_search_hit_free (EmpathyLogSearchHit *hit)
348 g_object_unref (hit->account);
351 g_free (hit->filename);
352 g_free (hit->chat_id);
354 g_slice_free (EmpathyLogSearchHit, hit);
358 empathy_log_manager_search_free (GList *hits)
362 for (l = hits; l; l = l->next)
364 empathy_log_manager_search_hit_free (l->data);
370 /* Format is just date, 20061201. */
372 empathy_log_manager_get_date_readable (const gchar *date)
376 t = empathy_time_parse (date);
378 return empathy_time_to_string_local (t, "%a %d %b %Y");