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>
22 * Jonny Lamb <jonny.lamb@collabora.co.uk>
30 #include <glib/gstdio.h>
32 #include "empathy-log-manager.h"
33 #include "empathy-log-source-empathy.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)
42 } EmpathyLogManagerPriv;
44 G_DEFINE_TYPE (EmpathyLogManager, empathy_log_manager, G_TYPE_OBJECT);
46 static EmpathyLogManager * manager_singleton = NULL;
49 empathy_log_manager_init (EmpathyLogManager *manager)
51 EmpathyLogManagerPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (manager,
52 EMPATHY_TYPE_LOG_MANAGER, EmpathyLogManagerPriv);
57 log_manager_finalize (GObject *object)
59 EmpathyLogManagerPriv *priv;
62 priv = GET_PRIV (object);
64 for (l = priv->sources; l; l = l->next) {
65 g_slice_free (EmpathyLogSource, l->data);
68 g_list_free (priv->sources);
72 log_manager_constructor (GType type,
74 GObjectConstructParam *props)
78 if (manager_singleton) {
79 retval = g_object_ref (manager_singleton);
81 retval = G_OBJECT_CLASS (empathy_log_manager_parent_class)->constructor
82 (type, n_props, props);
84 manager_singleton = EMPATHY_LOG_MANAGER (retval);
85 g_object_add_weak_pointer (retval, (gpointer) &manager_singleton);
92 empathy_log_manager_class_init (EmpathyLogManagerClass *klass)
94 GObjectClass *object_class = G_OBJECT_CLASS (klass);
96 object_class->finalize = log_manager_finalize;
97 object_class->constructor = log_manager_constructor;
99 g_type_class_add_private (object_class, sizeof (EmpathyLogManagerPriv));
103 empathy_log_manager_dup_singleton (void)
105 return g_object_new (EMPATHY_TYPE_LOG_MANAGER, NULL);
109 empathy_log_manager_add_message (EmpathyLogManager *manager,
110 const gchar *chat_id,
112 EmpathyMessage *message)
114 EmpathyLogManagerPriv *priv;
117 g_return_if_fail (EMPATHY_IS_LOG_MANAGER (manager));
118 g_return_if_fail (chat_id != NULL);
119 g_return_if_fail (EMPATHY_IS_MESSAGE (message));
121 priv = GET_PRIV (manager);
123 for (l = priv->sources; l; l = l->next) {
124 EmpathyLogSource *source = (EmpathyLogSource *) l->data;
126 if (!source->add_message)
129 source->add_message (manager, chat_id, chatroom, message);
134 empathy_log_manager_exists (EmpathyLogManager *manager,
136 const gchar *chat_id,
140 EmpathyLogManagerPriv *priv;
142 g_return_val_if_fail (EMPATHY_IS_LOG_MANAGER (manager), FALSE);
143 g_return_val_if_fail (MC_IS_ACCOUNT (account), FALSE);
144 g_return_val_if_fail (chat_id != NULL, FALSE);
146 priv = GET_PRIV (manager);
148 for (l = priv->sources; l; l = l->next) {
149 EmpathyLogSource *source = (EmpathyLogSource *) l->data;
154 if (source->exists (manager, account, chat_id, chatroom)) {
163 empathy_log_manager_get_dates (EmpathyLogManager *manager,
165 const gchar *chat_id,
168 GList *l, *out = NULL;
169 EmpathyLogManagerPriv *priv;
171 g_return_val_if_fail (EMPATHY_IS_LOG_MANAGER (manager), NULL);
172 g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
173 g_return_val_if_fail (chat_id != NULL, NULL);
175 priv = GET_PRIV (manager);
177 for (l = priv->sources; l; l = l->next) {
178 EmpathyLogSource *source = (EmpathyLogSource *) l->data;
180 if (!source->get_dates)
184 out = source->get_dates (manager, account, chat_id, chatroom);
187 out = g_list_concat (out, source->get_dates (manager, account, chat_id, chatroom));
195 empathy_log_manager_get_messages_for_date (EmpathyLogManager *manager,
197 const gchar *chat_id,
201 GList *l, *out = NULL;
202 EmpathyLogManagerPriv *priv;
204 g_return_val_if_fail (EMPATHY_IS_LOG_MANAGER (manager), NULL);
205 g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
206 g_return_val_if_fail (chat_id != NULL, NULL);
208 priv = GET_PRIV (manager);
210 for (l = priv->sources; l; l = l->next) {
211 EmpathyLogSource *source = (EmpathyLogSource *) l->data;
213 if (!source->get_messages_for_date)
217 out = source->get_messages_for_date (manager, account, chat_id, chatroom, date);
219 out = g_list_concat (out, source->get_messages_for_date (manager, account, chat_id, chatroom, date));
227 empathy_log_manager_get_last_messages (EmpathyLogManager *manager,
229 const gchar *chat_id,
232 GList *l, *out = NULL;
233 EmpathyLogManagerPriv *priv;
235 g_return_val_if_fail (EMPATHY_IS_LOG_MANAGER (manager), NULL);
236 g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
237 g_return_val_if_fail (chat_id != NULL, NULL);
239 priv = GET_PRIV (manager);
241 for (l = priv->sources; l; l = l->next) {
242 EmpathyLogSource *source = (EmpathyLogSource *) l->data;
244 if (!source->get_last_messages)
248 out = source->get_last_messages (manager, account, chat_id, chatroom);
250 out = g_list_concat (out, source->get_last_messages (manager, account, chat_id, chatroom));
258 empathy_log_manager_get_chats (EmpathyLogManager *manager,
261 GList *l, *out = NULL;
262 EmpathyLogManagerPriv *priv;
264 g_return_val_if_fail (EMPATHY_IS_LOG_MANAGER (manager), NULL);
265 g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
267 priv = GET_PRIV (manager);
269 DEBUG ("size of sources is %i", g_list_length (priv->sources));
271 for (l = priv->sources; l; l = l->next) {
272 EmpathyLogSource *source = (EmpathyLogSource *) l->data;
274 if (!source->get_chats)
278 out = source->get_chats (manager, account);
280 out = g_list_concat (out, source->get_chats (manager, account));
288 empathy_log_manager_search_new (EmpathyLogManager *manager,
291 GList *l, *out = NULL;
292 EmpathyLogManagerPriv *priv;
294 g_return_val_if_fail (EMPATHY_IS_LOG_MANAGER (manager), NULL);
295 g_return_val_if_fail (!EMP_STR_EMPTY (text), NULL);
297 priv = GET_PRIV (manager);
299 for (l = priv->sources; l; l = l->next) {
300 EmpathyLogSource *source = (EmpathyLogSource *) l->data;
302 if (!source->search_new)
306 out = source->search_new (manager, text);
308 out = g_list_concat (out, source->search_new (manager, text));
316 empathy_log_manager_search_hit_free (EmpathyLogSearchHit *hit)
319 g_object_unref (hit->account);
323 g_free (hit->filename);
324 g_free (hit->chat_id);
326 g_slice_free (EmpathyLogSearchHit, hit);
330 empathy_log_manager_search_free (GList *hits)
334 for (l = hits; l; l = l->next) {
335 empathy_log_manager_search_hit_free (l->data);
341 /* Format is just date, 20061201. */
343 empathy_log_manager_get_date_readable (const gchar *date)
347 t = empathy_time_parse (date);
349 return empathy_time_to_string_local (t, "%a %d %b %Y");