Mercurial > pidgin.yaz
annotate src/log.c @ 12767:53218d758ba9
[gaim-migrate @ 15114]
Make the dns lookup for udp connecting asynchronous. Thomas pointed out that it should be instantaneous anyway because the SRV lookup that has just been done, but this'll avoid blocking if the SRV lookup failed or something.
committer: Tailor Script <tailor@pidgin.im>
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Sun, 08 Jan 2006 22:09:28 +0000 |
parents | 4152c8f14a02 |
children | ff267281e882 |
rev | line source |
---|---|
7431 | 1 /** |
2 * @file log.c Logging API | |
3 * @ingroup core | |
4 * | |
5 * gaim | |
6 * | |
8046 | 7 * Gaim is the legal property of its developers, whose names are too numerous |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
7436 | 10 * |
7431 | 11 * This program is free software; you can redistribute it and/or modify |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
4184 | 24 */ |
4195 | 25 |
7431 | 26 #include "account.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5839
diff
changeset
|
27 #include "debug.h" |
7431 | 28 #include "internal.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5839
diff
changeset
|
29 #include "log.h" |
5548 | 30 #include "prefs.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5839
diff
changeset
|
31 #include "util.h" |
7764 | 32 #include "stringref.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5839
diff
changeset
|
33 |
8096 | 34 static GSList *loggers = NULL; |
35 | |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
36 static GaimLogLogger *html_logger; |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
37 static GaimLogLogger *txt_logger; |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
38 static GaimLogLogger *old_logger; |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5839
diff
changeset
|
39 |
8635 | 40 struct _gaim_logsize_user { |
41 char *name; | |
42 GaimAccount *account; | |
43 }; | |
44 static GHashTable *logsize_users = NULL; | |
45 | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
46 static void log_get_log_sets_common(GHashTable *sets); |
8635 | 47 |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
48 static void html_logger_write(GaimLog *log, GaimMessageFlags type, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
49 const char *from, time_t time, const char *message); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
50 static void html_logger_finalize(GaimLog *log); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
51 static GList *html_logger_list(GaimLogType type, const char *sn, GaimAccount *account); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
52 static GList *html_logger_list_syslog(GaimAccount *account); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
53 static char *html_logger_read(GaimLog *log, GaimLogReadFlags *flags); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
54 |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
55 static GList *old_logger_list(GaimLogType type, const char *sn, GaimAccount *account); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
56 static int old_logger_total_size(GaimLogType type, const char *name, GaimAccount *account); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
57 static char * old_logger_read (GaimLog *log, GaimLogReadFlags *flags); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
58 static int old_logger_size (GaimLog *log); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
59 static void old_logger_get_log_sets(GaimLogSetCallback cb, GHashTable *sets); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
60 static void old_logger_finalize(GaimLog *log); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
61 |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
62 static void txt_logger_write(GaimLog *log, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
63 GaimMessageFlags type, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
64 const char *from, time_t time, const char *message); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
65 static void txt_logger_finalize(GaimLog *log); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
66 static GList *txt_logger_list(GaimLogType type, const char *sn, GaimAccount *account); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
67 static GList *txt_logger_list_syslog(GaimAccount *account); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
68 static char *txt_logger_read(GaimLog *log, GaimLogReadFlags *flags); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
69 |
7431 | 70 /************************************************************************** |
71 * PUBLIC LOGGING FUNCTIONS *********************************************** | |
72 **************************************************************************/ | |
4184 | 73 |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
74 GaimLog *gaim_log_new(GaimLogType type, const char *name, GaimAccount *account, |
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
75 GaimConversation *conv, time_t time) |
7431 | 76 { |
77 GaimLog *log = g_new0(GaimLog, 1); | |
8635 | 78 log->name = g_strdup(gaim_normalize(account, name)); |
7431 | 79 log->account = account; |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
80 log->conv = conv; |
7431 | 81 log->time = time; |
8573 | 82 log->type = type; |
8096 | 83 log->logger_data = NULL; |
7431 | 84 log->logger = gaim_log_logger_get(); |
7440 | 85 if (log->logger && log->logger->create) |
86 log->logger->create(log); | |
7431 | 87 return log; |
4184 | 88 } |
89 | |
7431 | 90 void gaim_log_free(GaimLog *log) |
4184 | 91 { |
7431 | 92 g_return_if_fail(log); |
93 if (log->logger && log->logger->finalize) | |
94 log->logger->finalize(log); | |
95 g_free(log->name); | |
96 g_free(log); | |
97 } | |
7436 | 98 |
99 void gaim_log_write(GaimLog *log, GaimMessageFlags type, | |
7431 | 100 const char *from, time_t time, const char *message) |
101 { | |
10173 | 102 struct _gaim_logsize_user *lu; |
103 | |
7431 | 104 g_return_if_fail(log); |
105 g_return_if_fail(log->logger); | |
7442 | 106 g_return_if_fail(log->logger->write); |
7431 | 107 |
10171
829a569993e0
[gaim-migrate @ 11263]
Luke Schierer <lschiere@pidgin.im>
parents:
10087
diff
changeset
|
108 (log->logger->write)(log, type, from, time, message); |
829a569993e0
[gaim-migrate @ 11263]
Luke Schierer <lschiere@pidgin.im>
parents:
10087
diff
changeset
|
109 |
829a569993e0
[gaim-migrate @ 11263]
Luke Schierer <lschiere@pidgin.im>
parents:
10087
diff
changeset
|
110 lu = g_new(struct _gaim_logsize_user, 1); |
9892 | 111 |
10171
829a569993e0
[gaim-migrate @ 11263]
Luke Schierer <lschiere@pidgin.im>
parents:
10087
diff
changeset
|
112 lu->name = g_strdup(gaim_normalize(log->account, log->name)); |
829a569993e0
[gaim-migrate @ 11263]
Luke Schierer <lschiere@pidgin.im>
parents:
10087
diff
changeset
|
113 lu->account = log->account; |
829a569993e0
[gaim-migrate @ 11263]
Luke Schierer <lschiere@pidgin.im>
parents:
10087
diff
changeset
|
114 g_hash_table_remove(logsize_users, lu); |
829a569993e0
[gaim-migrate @ 11263]
Luke Schierer <lschiere@pidgin.im>
parents:
10087
diff
changeset
|
115 g_free(lu->name); |
829a569993e0
[gaim-migrate @ 11263]
Luke Schierer <lschiere@pidgin.im>
parents:
10087
diff
changeset
|
116 g_free(lu); |
9892 | 117 |
4184 | 118 } |
119 | |
7431 | 120 char *gaim_log_read(GaimLog *log, GaimLogReadFlags *flags) |
4184 | 121 { |
7542 | 122 GaimLogReadFlags mflags; |
7431 | 123 g_return_val_if_fail(log && log->logger, NULL); |
7462 | 124 if (log->logger->read) { |
7535 | 125 char *ret = (log->logger->read)(log, flags ? flags : &mflags); |
11920 | 126 gaim_str_strip_char(ret, '\r'); |
7462 | 127 return ret; |
128 } | |
7470 | 129 return (_("<b><font color=\"red\">The logger has no read function</font></b>")); |
4184 | 130 } |
7616 | 131 |
7556 | 132 int gaim_log_get_size(GaimLog *log) |
133 { | |
134 g_return_val_if_fail(log && log->logger, 0); | |
8096 | 135 |
7556 | 136 if (log->logger->size) |
137 return log->logger->size(log); | |
138 return 0; | |
139 } | |
140 | |
8635 | 141 static guint _gaim_logsize_user_hash(struct _gaim_logsize_user *lu) |
142 { | |
143 return g_str_hash(lu->name); | |
144 } | |
145 | |
146 static guint _gaim_logsize_user_equal(struct _gaim_logsize_user *lu1, | |
147 struct _gaim_logsize_user *lu2) | |
148 { | |
149 return ((!strcmp(lu1->name, lu2->name)) && lu1->account == lu2->account); | |
150 } | |
151 | |
152 static void _gaim_logsize_user_free_key(struct _gaim_logsize_user *lu) | |
153 { | |
154 g_free(lu->name); | |
155 g_free(lu); | |
156 } | |
157 | |
8898 | 158 int gaim_log_get_total_size(GaimLogType type, const char *name, GaimAccount *account) |
7556 | 159 { |
9677 | 160 gpointer ptrsize; |
161 int size = 0; | |
8096 | 162 GSList *n; |
8635 | 163 struct _gaim_logsize_user *lu; |
8096 | 164 |
8635 | 165 lu = g_new(struct _gaim_logsize_user, 1); |
166 lu->name = g_strdup(gaim_normalize(account, name)); | |
167 lu->account = account; | |
168 | |
9677 | 169 if(g_hash_table_lookup_extended(logsize_users, lu, NULL, &ptrsize)) { |
170 size = GPOINTER_TO_INT(ptrsize); | |
8635 | 171 g_free(lu->name); |
172 g_free(lu); | |
173 } else { | |
174 for (n = loggers; n; n = n->next) { | |
175 GaimLogLogger *logger = n->data; | |
7616 | 176 |
8635 | 177 if(logger->total_size){ |
8898 | 178 size += (logger->total_size)(type, name, account); |
8635 | 179 } else if(logger->list) { |
8898 | 180 GList *logs = (logger->list)(type, name, account); |
8635 | 181 int this_size = 0; |
182 | |
183 while (logs) { | |
184 GList *logs2 = logs->next; | |
185 GaimLog *log = (GaimLog*)(logs->data); | |
186 this_size += gaim_log_get_size(log); | |
187 gaim_log_free(log); | |
188 g_list_free_1(logs); | |
189 logs = logs2; | |
190 } | |
191 | |
192 size += this_size; | |
8096 | 193 } |
8635 | 194 } |
8096 | 195 |
8635 | 196 g_hash_table_replace(logsize_users, lu, GINT_TO_POINTER(size)); |
7556 | 197 } |
198 return size; | |
199 } | |
4184 | 200 |
10822 | 201 char * |
10577 | 202 gaim_log_get_log_dir(GaimLogType type, const char *name, GaimAccount *account) |
203 { | |
204 GaimPlugin *prpl; | |
205 GaimPluginProtocolInfo *prpl_info; | |
206 const char *prpl_name; | |
207 char *acct_name; | |
9926 | 208 const char *target; |
10577 | 209 char *dir; |
9926 | 210 |
10577 | 211 prpl = gaim_find_prpl(gaim_account_get_protocol_id(account)); |
212 if (!prpl) | |
213 return NULL; | |
214 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
215 prpl_name = prpl_info->list_icon(account, NULL); | |
216 | |
217 acct_name = g_strdup(gaim_escape_filename(gaim_normalize(account, | |
218 gaim_account_get_username(account)))); | |
9923 | 219 |
220 if (type == GAIM_LOG_CHAT) { | |
221 char *temp = g_strdup_printf("%s.chat", gaim_normalize(account, name)); | |
9926 | 222 target = gaim_escape_filename(temp); |
9923 | 223 g_free(temp); |
224 } else if(type == GAIM_LOG_SYSTEM) { | |
9926 | 225 target = ".system"; |
9923 | 226 } else { |
9926 | 227 target = gaim_escape_filename(gaim_normalize(account, name)); |
9923 | 228 } |
229 | |
10577 | 230 dir = g_build_filename(gaim_user_dir(), "logs", prpl_name, acct_name, target, NULL); |
9926 | 231 |
9923 | 232 g_free(acct_name); |
10577 | 233 |
9923 | 234 return dir; |
235 } | |
236 | |
7431 | 237 /**************************************************************************** |
238 * LOGGER FUNCTIONS ********************************************************* | |
239 ****************************************************************************/ | |
4184 | 240 |
7431 | 241 static GaimLogLogger *current_logger = NULL; |
7436 | 242 |
7431 | 243 static void logger_pref_cb(const char *name, GaimPrefType type, |
244 gpointer value, gpointer data) | |
245 { | |
246 GaimLogLogger *logger; | |
247 GSList *l = loggers; | |
248 while (l) { | |
249 logger = l->data; | |
250 if (!strcmp(logger->id, value)) { | |
251 gaim_log_logger_set(logger); | |
252 return; | |
4184 | 253 } |
7431 | 254 l = l->next; |
255 } | |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
256 gaim_log_logger_set(txt_logger); |
7431 | 257 } |
4184 | 258 |
259 | |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
260 GaimLogLogger *gaim_log_logger_new(const char *id, const char *name, int functions, ...) |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
261 { |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
262 #if 0 |
8898 | 263 void(*create)(GaimLog *), |
264 void(*write)(GaimLog *, GaimMessageFlags, const char *, time_t, const char *), | |
265 void(*finalize)(GaimLog *), | |
266 GList*(*list)(GaimLogType type, const char*, GaimAccount*), | |
267 char*(*read)(GaimLog*, GaimLogReadFlags*), | |
11025 | 268 int(*size)(GaimLog*), |
269 int(*total_size)(GaimLogType type, const char *name, GaimAccount *account), | |
270 GList*(*list_syslog)(GaimAccount *account), | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
271 void(*get_log_sets)(GaimLogSetCallback cb, GHashTable *sets)) |
7431 | 272 { |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
273 #endif |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
274 GaimLogLogger *logger; |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
275 va_list args; |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
276 |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
277 g_return_val_if_fail(id != NULL, NULL); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
278 g_return_val_if_fail(name != NULL, NULL); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
279 g_return_val_if_fail(functions >= 1, NULL); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
280 |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
281 logger = g_new0(GaimLogLogger, 1); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
282 logger->id = g_strdup(id); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
283 logger->name = g_strdup(name); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
284 |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
285 va_start(args, functions); |
11025 | 286 |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
287 if (functions >= 1) |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
288 logger->create = va_arg(args, void *); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
289 if (functions >= 2) |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
290 logger->write = va_arg(args, void *); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
291 if (functions >= 3) |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
292 logger->finalize = va_arg(args, void *); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
293 if (functions >= 4) |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
294 logger->list = va_arg(args, void *); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
295 if (functions >= 5) |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
296 logger->read = va_arg(args, void *); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
297 if (functions >= 6) |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
298 logger->size = va_arg(args, void *); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
299 if (functions >= 7) |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
300 logger->total_size = va_arg(args, void *); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
301 if (functions >= 8) |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
302 logger->list_syslog = va_arg(args, void *); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
303 if (functions >= 9) |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
304 logger->get_log_sets = va_arg(args, void *); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
305 |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
306 if (functions > 9) |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
307 gaim_debug_info("log", "Dropping new functions for logger: %s (%s)\n", name, id); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
308 |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
309 va_end(args); |
11025 | 310 |
7431 | 311 return logger; |
4184 | 312 } |
313 | |
7431 | 314 void gaim_log_logger_free(GaimLogLogger *logger) |
4184 | 315 { |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
316 g_free(logger->name); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
317 g_free(logger->id); |
7431 | 318 g_free(logger); |
319 } | |
4184 | 320 |
7431 | 321 void gaim_log_logger_add (GaimLogLogger *logger) |
322 { | |
323 g_return_if_fail(logger); | |
324 if (g_slist_find(loggers, logger)) | |
325 return; | |
326 loggers = g_slist_append(loggers, logger); | |
327 } | |
328 | |
329 void gaim_log_logger_remove (GaimLogLogger *logger) | |
330 { | |
331 g_return_if_fail(logger); | |
12574 | 332 loggers = g_slist_remove(loggers, logger); |
4184 | 333 } |
334 | |
7431 | 335 void gaim_log_logger_set (GaimLogLogger *logger) |
4184 | 336 { |
7431 | 337 g_return_if_fail(logger); |
338 current_logger = logger; | |
7436 | 339 } |
4184 | 340 |
7431 | 341 GaimLogLogger *gaim_log_logger_get() |
342 { | |
343 return current_logger; | |
344 } | |
4184 | 345 |
7431 | 346 GList *gaim_log_logger_get_options(void) |
347 { | |
348 GSList *n; | |
349 GList *list = NULL; | |
350 GaimLogLogger *data; | |
4184 | 351 |
7431 | 352 for (n = loggers; n; n = n->next) { |
353 data = n->data; | |
354 if (!data->write) | |
355 continue; | |
12241
4777c5912068
[gaim-migrate @ 14543]
Richard Laager <rlaager@wiktel.com>
parents:
12240
diff
changeset
|
356 list = g_list_append(list, data->name); |
7431 | 357 list = g_list_append(list, data->id); |
4184 | 358 } |
359 | |
7431 | 360 return list; |
361 } | |
362 | |
8573 | 363 gint gaim_log_compare(gconstpointer y, gconstpointer z) |
7431 | 364 { |
7436 | 365 const GaimLog *a = y; |
366 const GaimLog *b = z; | |
367 | |
7431 | 368 return b->time - a->time; |
369 } | |
370 | |
8898 | 371 GList *gaim_log_get_logs(GaimLogType type, const char *name, GaimAccount *account) |
7431 | 372 { |
373 GList *logs = NULL; | |
374 GSList *n; | |
375 for (n = loggers; n; n = n->next) { | |
376 GaimLogLogger *logger = n->data; | |
377 if (!logger->list) | |
378 continue; | |
11703
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11698
diff
changeset
|
379 logs = g_list_concat(logger->list(type, name, account), logs); |
7431 | 380 } |
7436 | 381 |
8573 | 382 return g_list_sort(logs, gaim_log_compare); |
383 } | |
384 | |
11025 | 385 gint gaim_log_set_compare(gconstpointer y, gconstpointer z) |
386 { | |
387 const GaimLogSet *a = y; | |
388 const GaimLogSet *b = z; | |
389 gint ret = 0; | |
390 | |
391 /* This logic seems weird at first... | |
392 * If either account is NULL, we pretend the accounts are | |
393 * equal. This allows us to detect duplicates that will | |
394 * exist if one logger knows the account and another | |
395 * doesn't. */ | |
396 if (a->account != NULL && b->account != NULL) { | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
397 ret = strcmp(gaim_account_get_username(a->account), gaim_account_get_username(b->account)); |
11025 | 398 if (ret != 0) |
399 return ret; | |
400 } | |
401 | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
402 ret = strcmp(a->normalized_name, b->normalized_name); |
11025 | 403 if (ret != 0) |
404 return ret; | |
405 | |
406 return (gint)b->type - (gint)a->type; | |
407 } | |
408 | |
11677 | 409 static guint |
410 log_set_hash(gconstpointer key) | |
11025 | 411 { |
412 const GaimLogSet *set = key; | |
413 | |
414 /* The account isn't hashed because we need GaimLogSets with NULL accounts | |
415 * to be found when we search by a GaimLogSet that has a non-NULL account | |
416 * but the same type and name. */ | |
417 return g_int_hash((gint *)&set->type) + g_str_hash(set->name); | |
418 } | |
419 | |
11677 | 420 static gboolean |
421 log_set_equal(gconstpointer a, gconstpointer b) | |
11025 | 422 { |
423 /* I realize that the choices made for GList and GHashTable | |
424 * make sense for those data types, but I wish the comparison | |
425 * functions were compatible. */ | |
426 return !gaim_log_set_compare(a, b); | |
427 } | |
428 | |
11677 | 429 static void |
430 log_add_log_set_to_hash(GHashTable *sets, GaimLogSet *set) | |
11025 | 431 { |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
432 GaimLogSet *existing_set = g_hash_table_lookup(sets, set); |
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
433 |
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
434 if (existing_set == NULL) |
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
435 g_hash_table_insert(sets, set, set); |
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
436 else if (existing_set->account == NULL && set->account != NULL) |
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
437 g_hash_table_replace(sets, set, set); |
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
438 else |
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
439 gaim_log_set_free(set); |
11025 | 440 } |
441 | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
442 GHashTable *gaim_log_get_log_sets(void) |
11025 | 443 { |
444 GSList *n; | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
445 GHashTable *sets = g_hash_table_new_full(log_set_hash, log_set_equal, |
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
446 (GDestroyNotify)gaim_log_set_free, NULL); |
11025 | 447 |
448 /* Get the log sets from all the loggers. */ | |
449 for (n = loggers; n; n = n->next) { | |
450 GaimLogLogger *logger = n->data; | |
451 | |
452 if (!logger->get_log_sets) | |
453 continue; | |
454 | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
455 logger->get_log_sets(log_add_log_set_to_hash, sets); |
11025 | 456 } |
457 | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
458 log_get_log_sets_common(sets); |
11025 | 459 |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
460 /* Return the GHashTable of unique GaimLogSets. */ |
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
461 return sets; |
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
462 } |
11025 | 463 |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
464 void gaim_log_set_free(GaimLogSet *set) |
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
465 { |
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
466 g_return_if_fail(set != NULL); |
11025 | 467 |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
468 g_free(set->name); |
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
469 if (set->normalized_name != set->name) |
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
470 g_free(set->normalized_name); |
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
471 g_free(set); |
11025 | 472 } |
473 | |
8573 | 474 GList *gaim_log_get_system_logs(GaimAccount *account) |
475 { | |
476 GList *logs = NULL; | |
477 GSList *n; | |
478 for (n = loggers; n; n = n->next) { | |
479 GaimLogLogger *logger = n->data; | |
480 if (!logger->list_syslog) | |
481 continue; | |
11703
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11698
diff
changeset
|
482 logs = g_list_concat(logger->list_syslog(account), logs); |
8573 | 483 } |
484 | |
485 return g_list_sort(logs, gaim_log_compare); | |
7431 | 486 } |
487 | |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
488 /**************************************************************************** |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
489 * LOG SUBSYSTEM ************************************************************ |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
490 ****************************************************************************/ |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
491 |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
492 void * |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
493 gaim_log_get_handle(void) |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
494 { |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
495 static int handle; |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
496 |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
497 return &handle; |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
498 } |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
499 |
7431 | 500 void gaim_log_init(void) |
7436 | 501 { |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
502 void *handle = gaim_log_get_handle(); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
503 |
7431 | 504 gaim_prefs_add_none("/core/logging"); |
7555 | 505 gaim_prefs_add_bool("/core/logging/log_ims", FALSE); |
506 gaim_prefs_add_bool("/core/logging/log_chats", FALSE); | |
8573 | 507 gaim_prefs_add_bool("/core/logging/log_system", FALSE); |
508 | |
7431 | 509 gaim_prefs_add_string("/core/logging/format", "txt"); |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
510 |
12240 | 511 html_logger = gaim_log_logger_new("html", _("HTML"), 8, |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
512 NULL, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
513 html_logger_write, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
514 html_logger_finalize, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
515 html_logger_list, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
516 html_logger_read, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
517 gaim_log_common_sizer, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
518 NULL, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
519 html_logger_list_syslog); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
520 gaim_log_logger_add(html_logger); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
521 |
12240 | 522 txt_logger = gaim_log_logger_new("txt", _("Plain text"), 8, |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
523 NULL, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
524 txt_logger_write, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
525 txt_logger_finalize, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
526 txt_logger_list, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
527 txt_logger_read, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
528 gaim_log_common_sizer, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
529 NULL, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
530 txt_logger_list_syslog); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
531 gaim_log_logger_add(txt_logger); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
532 |
12240 | 533 old_logger = gaim_log_logger_new("old", _("Old Gaim"), 9, |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
534 NULL, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
535 NULL, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
536 old_logger_finalize, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
537 old_logger_list, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
538 old_logger_read, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
539 old_logger_size, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
540 old_logger_total_size, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
541 NULL, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
542 old_logger_get_log_sets); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
543 gaim_log_logger_add(old_logger); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
544 |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
545 gaim_signal_register(handle, "log-timestamp", |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
546 gaim_marshal_POINTER__POINTER_POINTER, |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
547 gaim_value_new(GAIM_TYPE_POINTER), 2, |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
548 gaim_value_new(GAIM_TYPE_SUBTYPE, |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
549 GAIM_SUBTYPE_LOG), |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
550 gaim_value_new(GAIM_TYPE_POINTER)); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
551 |
10087 | 552 gaim_prefs_connect_callback(NULL, "/core/logging/format", |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
553 logger_pref_cb, NULL); |
7431 | 554 gaim_prefs_trigger_callback("/core/logging/format"); |
8635 | 555 |
556 logsize_users = g_hash_table_new_full((GHashFunc)_gaim_logsize_user_hash, | |
557 (GEqualFunc)_gaim_logsize_user_equal, | |
558 (GDestroyNotify)_gaim_logsize_user_free_key, NULL); | |
7431 | 559 } |
560 | |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
561 void |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
562 gaim_log_uninit(void) |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
563 { |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
564 gaim_signals_unregister_by_instance(gaim_log_get_handle()); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
565 } |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
566 |
7431 | 567 /**************************************************************************** |
568 * LOGGERS ****************************************************************** | |
569 ****************************************************************************/ | |
570 | |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
571 static char *log_get_timestamp(GaimLog *log, time_t when) |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
572 { |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
573 char *date; |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
574 struct tm tm = *(localtime(&when)); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
575 |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
576 date = gaim_signal_emit_return_1(gaim_log_get_handle(), |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
577 "log-timestamp", |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
578 log, &tm); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
579 if (date == NULL) |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
580 { |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
581 char buf[64]; |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
582 |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
583 if (log->type == GAIM_LOG_SYSTEM || time(NULL) > when + 20*60) |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
584 strftime(buf, sizeof(buf), "%x %X", &tm); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
585 else |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
586 strftime(buf, sizeof(buf), "%X", &tm); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
587 |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
588 date = g_strdup(buf); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
589 } |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
590 |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
591 return date; |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
592 } |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
593 |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
594 void gaim_log_common_writer(GaimLog *log, const char *ext) |
9763 | 595 { |
596 char date[64]; | |
10822 | 597 GaimLogCommonLoggerData *data = log->logger_data; |
9763 | 598 |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
599 if (data == NULL) |
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
600 { |
9763 | 601 /* This log is new */ |
9923 | 602 char *dir, *filename, *path; |
10577 | 603 |
9923 | 604 dir = gaim_log_get_log_dir(log->type, log->name, log->account); |
10577 | 605 if (dir == NULL) |
606 return; | |
607 | |
9923 | 608 gaim_build_dir (dir, S_IRUSR | S_IWUSR | S_IXUSR); |
9763 | 609 |
610 strftime(date, sizeof(date), "%Y-%m-%d.%H%M%S", localtime(&log->time)); | |
611 | |
612 filename = g_strdup_printf("%s%s", date, ext ? ext : ""); | |
613 | |
614 path = g_build_filename(dir, filename, NULL); | |
615 g_free(dir); | |
616 g_free(filename); | |
617 | |
10822 | 618 log->logger_data = data = g_new0(GaimLogCommonLoggerData, 1); |
9763 | 619 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10577
diff
changeset
|
620 data->file = g_fopen(path, "a"); |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
621 if (data->file == NULL) |
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
622 { |
9763 | 623 gaim_debug(GAIM_DEBUG_ERROR, "log", |
9892 | 624 "Could not create log file %s\n", path); |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
625 |
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
626 if (log->conv != NULL) |
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
627 gaim_conversation_write(log->conv, NULL, _("Logging of this conversation failed."), |
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
628 GAIM_MESSAGE_ERROR, time(NULL)); |
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
629 |
9763 | 630 g_free(path); |
631 return; | |
632 } | |
633 g_free(path); | |
10577 | 634 } |
9763 | 635 } |
636 | |
10822 | 637 GList *gaim_log_common_lister(GaimLogType type, const char *name, GaimAccount *account, const char *ext, GaimLogLogger *logger) |
7431 | 638 { |
639 GDir *dir; | |
640 GList *list = NULL; | |
7628 | 641 const char *filename; |
8111 | 642 char *path; |
643 | |
644 if(!account) | |
645 return NULL; | |
646 | |
9923 | 647 path = gaim_log_get_log_dir(type, name, account); |
10577 | 648 if (path == NULL) |
649 return NULL; | |
7447 | 650 |
7431 | 651 if (!(dir = g_dir_open(path, 0, NULL))) { |
652 g_free(path); | |
653 return NULL; | |
654 } | |
8898 | 655 |
7431 | 656 while ((filename = g_dir_read_name(dir))) { |
8577 | 657 if (gaim_str_has_suffix(filename, ext) && |
658 strlen(filename) == 17 + strlen(ext)) { | |
7431 | 659 GaimLog *log; |
10822 | 660 GaimLogCommonLoggerData *data; |
8577 | 661 time_t stamp = gaim_str_to_time(filename, FALSE); |
7431 | 662 |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
663 log = gaim_log_new(type, name, account, NULL, stamp); |
7431 | 664 log->logger = logger; |
10822 | 665 log->logger_data = data = g_new0(GaimLogCommonLoggerData, 1); |
7616 | 666 data->path = g_build_filename(path, filename, NULL); |
11703
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11698
diff
changeset
|
667 list = g_list_prepend(list, log); |
4184 | 668 } |
669 } | |
7431 | 670 g_dir_close(dir); |
7447 | 671 g_free(path); |
7431 | 672 return list; |
673 } | |
4184 | 674 |
10822 | 675 int gaim_log_common_sizer(GaimLog *log) |
7556 | 676 { |
677 struct stat st; | |
10822 | 678 GaimLogCommonLoggerData *data = log->logger_data; |
7556 | 679 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10577
diff
changeset
|
680 if (!data->path || g_stat(data->path, &st)) |
7556 | 681 st.st_size = 0; |
682 | |
683 return st.st_size; | |
684 } | |
685 | |
11025 | 686 /* This will build log sets for all loggers that use the common logger |
687 * functions because they use the same directory structure. */ | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
688 static void log_get_log_sets_common(GHashTable *sets) |
11025 | 689 { |
690 gchar *log_path = g_build_filename(gaim_user_dir(), "logs", NULL); | |
691 GDir *log_dir = g_dir_open(log_path, 0, NULL); | |
692 const gchar *protocol; | |
693 | |
694 if (log_dir == NULL) { | |
695 g_free(log_path); | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
696 return; |
11025 | 697 } |
698 | |
699 while ((protocol = g_dir_read_name(log_dir)) != NULL) { | |
700 gchar *protocol_path = g_build_filename(log_path, protocol, NULL); | |
701 GDir *protocol_dir; | |
702 const gchar *username; | |
703 gchar *protocol_unescaped; | |
704 GList *account_iter; | |
705 GList *accounts = NULL; | |
706 | |
707 if ((protocol_dir = g_dir_open(protocol_path, 0, NULL)) == NULL) { | |
708 g_free(protocol_path); | |
709 continue; | |
710 } | |
711 | |
712 /* Using g_strdup() to cover the one-in-a-million chance that a | |
713 * prpl's list_icon function uses gaim_unescape_filename(). */ | |
714 protocol_unescaped = g_strdup(gaim_unescape_filename(protocol)); | |
715 | |
716 /* Find all the accounts for protocol. */ | |
717 for (account_iter = gaim_accounts_get_all() ; account_iter != NULL ; account_iter = account_iter->next) { | |
718 GaimPlugin *prpl; | |
719 GaimPluginProtocolInfo *prpl_info; | |
720 | |
721 prpl = gaim_find_prpl(gaim_account_get_protocol_id((GaimAccount *)account_iter->data)); | |
722 if (!prpl) | |
723 continue; | |
724 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
725 | |
726 if (!strcmp(protocol_unescaped, prpl_info->list_icon((GaimAccount *)account_iter->data, NULL))) | |
11703
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11698
diff
changeset
|
727 accounts = g_list_prepend(accounts, account_iter->data); |
11025 | 728 } |
729 g_free(protocol_unescaped); | |
730 | |
731 while ((username = g_dir_read_name(protocol_dir)) != NULL) { | |
732 gchar *username_path = g_build_filename(protocol_path, username, NULL); | |
733 GDir *username_dir; | |
734 const gchar *username_unescaped; | |
735 GaimAccount *account = NULL; | |
736 gchar *name; | |
737 | |
738 if ((username_dir = g_dir_open(username_path, 0, NULL)) == NULL) { | |
739 g_free(username_path); | |
740 continue; | |
741 } | |
742 | |
743 /* Find the account for username in the list of accounts for protocol. */ | |
744 username_unescaped = gaim_unescape_filename(username); | |
745 for (account_iter = g_list_first(accounts) ; account_iter != NULL ; account_iter = account_iter->next) { | |
746 if (!strcmp(((GaimAccount *)account_iter->data)->username, username_unescaped)) { | |
747 account = account_iter->data; | |
748 break; | |
749 } | |
750 } | |
751 | |
752 /* Don't worry about the cast, name will point to dynamically allocated memory shortly. */ | |
753 while ((name = (gchar *)g_dir_read_name(username_dir)) != NULL) { | |
754 size_t len; | |
755 GaimLogSet *set = g_new0(GaimLogSet, 1); | |
756 | |
757 /* Unescape the filename. */ | |
758 name = g_strdup(gaim_unescape_filename(name)); | |
759 | |
760 /* Get the (possibly new) length of name. */ | |
761 len = strlen(name); | |
762 | |
763 set->account = account; | |
764 set->name = name; | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
765 set->normalized_name = g_strdup(gaim_normalize(account, name)); |
11025 | 766 |
767 /* Chat for .chat or .system at the end of the name to determine the type. */ | |
768 set->type = GAIM_LOG_IM; | |
769 if (len > 7) { | |
770 gchar *tmp = &name[len - 7]; | |
771 if (!strcmp(tmp, ".system")) { | |
772 set->type = GAIM_LOG_SYSTEM; | |
773 *tmp = '\0'; | |
774 } | |
775 } | |
776 if (len > 5) { | |
777 gchar *tmp = &name[len - 5]; | |
778 if (!strcmp(tmp, ".chat")) { | |
779 set->type = GAIM_LOG_CHAT; | |
780 *tmp = '\0'; | |
781 } | |
782 } | |
783 | |
784 /* Determine if this (account, name) combination exists as a buddy. */ | |
11458
4db38b374d3f
[gaim-migrate @ 13697]
Richard Laager <rlaager@wiktel.com>
parents:
11292
diff
changeset
|
785 if (account != NULL) |
4db38b374d3f
[gaim-migrate @ 13697]
Richard Laager <rlaager@wiktel.com>
parents:
11292
diff
changeset
|
786 set->buddy = (gaim_find_buddy(account, name) != NULL); |
11025 | 787 |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
788 log_add_log_set_to_hash(sets, set); |
11025 | 789 } |
790 g_free(username_path); | |
791 g_dir_close(username_dir); | |
792 } | |
793 g_free(protocol_path); | |
794 g_dir_close(protocol_dir); | |
795 } | |
796 g_free(log_path); | |
797 g_dir_close(log_dir); | |
798 } | |
799 | |
7431 | 800 #if 0 /* Maybe some other time. */ |
7443 | 801 /**************** |
7431 | 802 ** XML LOGGER ** |
803 ****************/ | |
804 | |
805 static const char *str_from_msg_type (GaimMessageFlags type) | |
806 { | |
7443 | 807 |
7431 | 808 return ""; |
7443 | 809 |
7431 | 810 } |
811 | |
7443 | 812 static void xml_logger_write(GaimLog *log, |
813 GaimMessageFlags type, | |
7431 | 814 const char *from, time_t time, const char *message) |
815 { | |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
816 char *date; |
7431 | 817 char *xhtml = NULL; |
10577 | 818 |
7431 | 819 if (!log->logger_data) { |
820 /* This log is new. We could use the loggers 'new' function, but | |
821 * creating a new file there would result in empty files in the case | |
822 * that you open a convo with someone, but don't say anything. | |
823 */ | |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
824 char buf[64]; |
9923 | 825 char *dir = gaim_log_get_log_dir(log->type, log->name, log->account); |
7431 | 826 FILE *file; |
10577 | 827 |
828 if (dir == NULL) | |
829 return; | |
830 | |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
831 strftime(buf, sizeof(buf), "%Y-%m-%d.%H%M%S.xml", localtime(&log->time)); |
7443 | 832 |
7612 | 833 gaim_build_dir (dir, S_IRUSR | S_IWUSR | S_IXUSR); |
7443 | 834 |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
835 char *filename = g_build_filename(dir, buf, NULL); |
7431 | 836 g_free(dir); |
7443 | 837 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10577
diff
changeset
|
838 log->logger_data = g_fopen(filename, "a"); |
7431 | 839 if (!log->logger_data) { |
840 gaim_debug(GAIM_DEBUG_ERROR, "log", "Could not create log file %s\n", filename); | |
7564 | 841 g_free(filename); |
7431 | 842 return; |
843 } | |
7564 | 844 g_free(filename); |
7431 | 845 fprintf(log->logger_data, "<?xml version='1.0' encoding='UTF-8' ?>\n" |
846 "<?xml-stylesheet href='file:///usr/src/web/htdocs/log-stylesheet.xsl' type='text/xml' ?>\n"); | |
7443 | 847 |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
848 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", localtime(&log->time)); |
7431 | 849 fprintf(log->logger_data, "<conversation time='%s' screenname='%s' protocol='%s'>\n", |
850 date, log->name, prpl); | |
851 } | |
7443 | 852 |
9923 | 853 /* if we can't write to the file, give up before we hurt ourselves */ |
854 if(!data->file) | |
855 return; | |
856 | |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
857 date = log_get_timestamp(log, time); |
12692
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
858 |
7431 | 859 gaim_markup_html_to_xhtml(message, &xhtml, NULL); |
860 if (from) | |
7443 | 861 fprintf(log->logger_data, "<message %s %s from='%s' time='%s'>%s</message>\n", |
862 str_from_msg_type(type), | |
7431 | 863 type & GAIM_MESSAGE_SEND ? "direction='sent'" : |
864 type & GAIM_MESSAGE_RECV ? "direction='received'" : "", | |
865 from, date, xhtml); | |
866 else | |
7443 | 867 fprintf(log->logger_data, "<message %s %s time='%s'>%s</message>\n", |
868 str_from_msg_type(type), | |
7431 | 869 type & GAIM_MESSAGE_SEND ? "direction='sent'" : |
870 type & GAIM_MESSAGE_RECV ? "direction='received'" : "", | |
7443 | 871 date, xhtml): |
7431 | 872 fflush(log->logger_data); |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
873 g_free(date); |
7431 | 874 g_free(xhtml); |
7443 | 875 } |
876 | |
7431 | 877 static void xml_logger_finalize(GaimLog *log) |
878 { | |
879 if (log->logger_data) { | |
880 fprintf(log->logger_data, "</conversation>\n"); | |
881 fclose(log->logger_data); | |
882 log->logger_data = NULL; | |
883 } | |
884 } | |
7443 | 885 |
8898 | 886 static GList *xml_logger_list(GaimLogType type, const char *sn, GaimAccount *account) |
7431 | 887 { |
10822 | 888 return gaim_log_common_lister(type, sn, account, ".xml", &xml_logger); |
4184 | 889 } |
890 | |
7431 | 891 static GaimLogLogger xml_logger = { |
892 N_("XML"), "xml", | |
893 NULL, | |
894 xml_logger_write, | |
895 xml_logger_finalize, | |
896 xml_logger_list, | |
8096 | 897 NULL, |
11025 | 898 NULL, |
7431 | 899 NULL |
900 }; | |
901 #endif | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
902 |
7431 | 903 /**************************** |
7457 | 904 ** HTML LOGGER ************* |
905 ****************************/ | |
906 | |
907 static void html_logger_write(GaimLog *log, GaimMessageFlags type, | |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
908 const char *from, time_t time, const char *message) |
7457 | 909 { |
9763 | 910 char *msg_fixed; |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
911 char *date; |
9613 | 912 GaimPlugin *plugin = gaim_find_prpl(gaim_account_get_protocol_id(log->account)); |
10822 | 913 GaimLogCommonLoggerData *data = log->logger_data; |
9613 | 914 |
7618 | 915 if(!data) { |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
916 char buf[64]; |
9763 | 917 const char *prpl = |
918 GAIM_PLUGIN_PROTOCOL_INFO(plugin)->list_icon(log->account, NULL); | |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
919 gaim_log_common_writer(log, ".html"); |
7457 | 920 |
9763 | 921 data = log->logger_data; |
7457 | 922 |
9763 | 923 /* if we can't write to the file, give up before we hurt ourselves */ |
924 if(!data->file) | |
925 return; | |
7616 | 926 |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
927 strftime(buf, sizeof(buf), "%c", localtime(&log->time)); |
11092
68652f4ad6a7
[gaim-migrate @ 13115]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
928 fprintf(data->file, "<html><head>"); |
11094
59a1ff5a4bae
[gaim-migrate @ 13119]
Richard Laager <rlaager@wiktel.com>
parents:
11092
diff
changeset
|
929 fprintf(data->file, "<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">"); |
11092
68652f4ad6a7
[gaim-migrate @ 13115]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
930 fprintf(data->file, "<title>"); |
7616 | 931 fprintf(data->file, "Conversation with %s at %s on %s (%s)", |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
932 log->name, buf, gaim_account_get_username(log->account), prpl); |
7616 | 933 fprintf(data->file, "</title></head><body>"); |
934 fprintf(data->file, | |
7457 | 935 "<h3>Conversation with %s at %s on %s (%s)</h3>\n", |
12738
4152c8f14a02
[gaim-migrate @ 15083]
Richard Laager <rlaager@wiktel.com>
parents:
12737
diff
changeset
|
936 log->name, buf, gaim_account_get_username(log->account), prpl); |
7457 | 937 } |
7623 | 938 |
9892 | 939 /* if we can't write to the file, give up before we hurt ourselves */ |
940 if(!data->file) | |
941 return; | |
942 | |
7882 | 943 gaim_markup_html_to_xhtml(message, &msg_fixed, NULL); |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
944 date = log_get_timestamp(log, time); |
7882 | 945 |
8577 | 946 if(log->type == GAIM_LOG_SYSTEM){ |
947 fprintf(data->file, "---- %s @ %s ----<br/>\n", msg_fixed, date); | |
948 } else { | |
949 if (type & GAIM_MESSAGE_SYSTEM) | |
950 fprintf(data->file, "<font size=\"2\">(%s)</font><b> %s</b><br/>\n", date, msg_fixed); | |
951 else if (type & GAIM_MESSAGE_WHISPER) | |
952 fprintf(data->file, "<font color=\"#6C2585\"><font size=\"2\">(%s)</font><b> %s:</b></font> %s<br/>\n", | |
953 date, from, msg_fixed); | |
954 else if (type & GAIM_MESSAGE_AUTO_RESP) { | |
955 if (type & GAIM_MESSAGE_SEND) | |
956 fprintf(data->file, _("<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s <AUTO-REPLY>:</b></font> %s<br/>\n"), date, from, msg_fixed); | |
957 else if (type & GAIM_MESSAGE_RECV) | |
958 fprintf(data->file, _("<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s <AUTO-REPLY>:</b></font> %s<br/>\n"), date, from, msg_fixed); | |
959 } else if (type & GAIM_MESSAGE_RECV) { | |
960 if(gaim_message_meify(msg_fixed, -1)) | |
10735
a0edd89ddb83
[gaim-migrate @ 12337]
Luke Schierer <lschiere@pidgin.im>
parents:
10732
diff
changeset
|
961 fprintf(data->file, "<font color=\"#062585\"><font size=\"2\">(%s)</font> <b>***%s</b></font> %s<br/>\n", |
10645 | 962 date, from, msg_fixed); |
8577 | 963 else |
10645 | 964 fprintf(data->file, "<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s:</b></font> %s<br/>\n", |
965 date, from, msg_fixed); | |
8577 | 966 } else if (type & GAIM_MESSAGE_SEND) { |
967 if(gaim_message_meify(msg_fixed, -1)) | |
10735
a0edd89ddb83
[gaim-migrate @ 12337]
Luke Schierer <lschiere@pidgin.im>
parents:
10732
diff
changeset
|
968 fprintf(data->file, "<font color=\"#062585\"><font size=\"2\">(%s)</font> <b>***%s</b></font> %s<br/>\n", |
10645 | 969 date, from, msg_fixed); |
8577 | 970 else |
10645 | 971 fprintf(data->file, "<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s:</b></font> %s<br/>\n", |
972 date, from, msg_fixed); | |
8577 | 973 } |
7564 | 974 } |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
975 g_free(date); |
7882 | 976 g_free(msg_fixed); |
7616 | 977 fflush(data->file); |
7457 | 978 } |
979 | |
980 static void html_logger_finalize(GaimLog *log) | |
981 { | |
10822 | 982 GaimLogCommonLoggerData *data = log->logger_data; |
7616 | 983 if (data) { |
984 if(data->file) { | |
985 fprintf(data->file, "</body></html>"); | |
986 fclose(data->file); | |
987 } | |
988 g_free(data->path); | |
7752 | 989 g_free(data); |
7463 | 990 } |
7457 | 991 } |
992 | |
8898 | 993 static GList *html_logger_list(GaimLogType type, const char *sn, GaimAccount *account) |
7457 | 994 { |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
995 return gaim_log_common_lister(type, sn, account, ".html", html_logger); |
7457 | 996 } |
997 | |
8573 | 998 static GList *html_logger_list_syslog(GaimAccount *account) |
999 { | |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
1000 return gaim_log_common_lister(GAIM_LOG_SYSTEM, ".system", account, ".html", html_logger); |
8573 | 1001 } |
1002 | |
7457 | 1003 static char *html_logger_read(GaimLog *log, GaimLogReadFlags *flags) |
1004 { | |
1005 char *read, *minus_header; | |
10822 | 1006 GaimLogCommonLoggerData *data = log->logger_data; |
7457 | 1007 *flags = GAIM_LOG_READ_NO_NEWLINE; |
7616 | 1008 if (!data || !data->path) |
1009 return g_strdup(_("<font color=\"red\"><b>Unable to find log path!</b></font>")); | |
1010 if (g_file_get_contents(data->path, &read, NULL, NULL)) { | |
7457 | 1011 minus_header = strchr(read, '\n'); |
1012 if (!minus_header) | |
1013 minus_header = g_strdup(read); | |
1014 else | |
1015 minus_header = g_strdup(minus_header + 1); | |
1016 g_free(read); | |
1017 return minus_header; | |
1018 } | |
8578 | 1019 return g_strdup_printf(_("<font color=\"red\"><b>Could not read file: %s</b></font>"), data->path); |
7457 | 1020 } |
1021 | |
1022 | |
1023 | |
1024 /**************************** | |
7431 | 1025 ** PLAIN TEXT LOGGER ******* |
1026 ****************************/ | |
4184 | 1027 |
7436 | 1028 static void txt_logger_write(GaimLog *log, |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
1029 GaimMessageFlags type, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
1030 const char *from, time_t time, const char *message) |
7431 | 1031 { |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1032 char *date; |
9763 | 1033 GaimPlugin *plugin = gaim_find_prpl(gaim_account_get_protocol_id(log->account)); |
10822 | 1034 GaimLogCommonLoggerData *data = log->logger_data; |
9763 | 1035 char *stripped = NULL; |
1036 | |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
1037 if (data == NULL) { |
7431 | 1038 /* This log is new. We could use the loggers 'new' function, but |
1039 * creating a new file there would result in empty files in the case | |
1040 * that you open a convo with someone, but don't say anything. | |
1041 */ | |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1042 char buf[64]; |
9763 | 1043 const char *prpl = |
1044 GAIM_PLUGIN_PROTOCOL_INFO(plugin)->list_icon(log->account, NULL); | |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
1045 gaim_log_common_writer(log, ".txt"); |
8898 | 1046 |
9763 | 1047 data = log->logger_data; |
7436 | 1048 |
9763 | 1049 /* if we can't write to the file, give up before we hurt ourselves */ |
1050 if(!data->file) | |
1051 return; | |
7616 | 1052 |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1053 strftime(buf, sizeof(buf), "%c", localtime(&log->time)); |
7616 | 1054 fprintf(data->file, "Conversation with %s at %s on %s (%s)\n", |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1055 log->name, buf, gaim_account_get_username(log->account), prpl); |
7431 | 1056 } |
7436 | 1057 |
7623 | 1058 /* if we can't write to the file, give up before we hurt ourselves */ |
1059 if(!data->file) | |
1060 return; | |
1061 | |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1062 stripped = gaim_markup_strip_html(message); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1063 date = log_get_timestamp(log, time); |
12692
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
1064 |
12737
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1065 if(log->type == GAIM_LOG_SYSTEM){ |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1066 fprintf(data->file, "---- %s @ %s ----\n", stripped, date); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1067 } else { |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1068 if (type & GAIM_MESSAGE_SEND || |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1069 type & GAIM_MESSAGE_RECV) { |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1070 if (type & GAIM_MESSAGE_AUTO_RESP) { |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1071 fprintf(data->file, _("(%s) %s <AUTO-REPLY>: %s\n"), date, |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1072 from, stripped); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1073 } else { |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1074 if(gaim_message_meify(stripped, -1)) |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1075 fprintf(data->file, "(%s) ***%s %s\n", date, from, |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1076 stripped); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1077 else |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1078 fprintf(data->file, "(%s) %s: %s\n", date, from, |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1079 stripped); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1080 } |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1081 } else if (type & GAIM_MESSAGE_SYSTEM) |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1082 fprintf(data->file, "(%s) %s\n", date, stripped); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1083 else if (type & GAIM_MESSAGE_NO_LOG) { |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1084 /* This shouldn't happen */ |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1085 g_free(stripped); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1086 return; |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1087 } else if (type & GAIM_MESSAGE_WHISPER) |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1088 fprintf(data->file, "(%s) *%s* %s", date, from, stripped); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1089 else |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1090 fprintf(data->file, "(%s) %s%s %s\n", date, from ? from : "", |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1091 from ? ":" : "", stripped); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1092 } |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1093 g_free(date); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1094 g_free(stripped); |
a1e241dd50b6
[gaim-migrate @ 15082]
Richard Laager <rlaager@wiktel.com>
parents:
12692
diff
changeset
|
1095 fflush(data->file); |
7431 | 1096 } |
1097 | |
1098 static void txt_logger_finalize(GaimLog *log) | |
1099 { | |
10822 | 1100 GaimLogCommonLoggerData *data = log->logger_data; |
7616 | 1101 if (data) { |
1102 if(data->file) | |
1103 fclose(data->file); | |
1104 if(data->path) | |
1105 g_free(data->path); | |
7752 | 1106 g_free(data); |
7616 | 1107 } |
7431 | 1108 } |
1109 | |
8898 | 1110 static GList *txt_logger_list(GaimLogType type, const char *sn, GaimAccount *account) |
7431 | 1111 { |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
1112 return gaim_log_common_lister(type, sn, account, ".txt", txt_logger); |
7431 | 1113 } |
1114 | |
8573 | 1115 static GList *txt_logger_list_syslog(GaimAccount *account) |
1116 { | |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
1117 return gaim_log_common_lister(GAIM_LOG_SYSTEM, ".system", account, ".txt", txt_logger); |
8573 | 1118 } |
1119 | |
7431 | 1120 static char *txt_logger_read(GaimLog *log, GaimLogReadFlags *flags) |
1121 { | |
8517 | 1122 char *read, *minus_header, *minus_header2; |
10822 | 1123 GaimLogCommonLoggerData *data = log->logger_data; |
7457 | 1124 *flags = 0; |
7616 | 1125 if (!data || !data->path) |
1126 return g_strdup(_("<font color=\"red\"><b>Unable to find log path!</b></font>")); | |
1127 if (g_file_get_contents(data->path, &read, NULL, NULL)) { | |
7431 | 1128 minus_header = strchr(read, '\n'); |
1129 if (!minus_header) | |
1130 minus_header = g_strdup(read); | |
7436 | 1131 else |
7431 | 1132 minus_header = g_strdup(minus_header + 1); |
1133 g_free(read); | |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10645
diff
changeset
|
1134 minus_header2 = g_markup_escape_text(minus_header, -1); |
8517 | 1135 g_free(minus_header); |
1136 return minus_header2; | |
7431 | 1137 } |
8578 | 1138 return g_strdup_printf(_("<font color=\"red\"><b>Could not read file: %s</b></font>"), data->path); |
7436 | 1139 } |
7431 | 1140 |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
1141 |
7431 | 1142 |
1143 /**************** | |
1144 * OLD LOGGER *** | |
1145 ****************/ | |
1146 | |
1147 /* The old logger doesn't write logs, only reads them. This is to include | |
1148 * old logs in the log viewer transparently. | |
1149 */ | |
1150 | |
1151 struct old_logger_data { | |
7764 | 1152 GaimStringref *pathref; |
7431 | 1153 int offset; |
1154 int length; | |
1155 }; | |
1156 | |
8898 | 1157 static GList *old_logger_list(GaimLogType type, const char *sn, GaimAccount *account) |
7431 | 1158 { |
1159 FILE *file; | |
1160 char buf[BUF_LONG]; | |
1161 struct tm tm; | |
7761 | 1162 char month[4]; |
7431 | 1163 struct old_logger_data *data = NULL; |
1164 char *logfile = g_strdup_printf("%s.log", gaim_normalize(account, sn)); | |
7764 | 1165 char *pathstr = g_build_filename(gaim_user_dir(), "logs", logfile, NULL); |
1166 GaimStringref *pathref = gaim_stringref_new(pathstr); | |
7431 | 1167 char *newlog; |
7761 | 1168 int logfound = 0; |
1169 int lastoff = 0; | |
1170 int newlen; | |
7791 | 1171 time_t lasttime = 0; |
7431 | 1172 |
1173 GaimLog *log = NULL; | |
1174 GList *list = NULL; | |
1175 | |
7473 | 1176 g_free(logfile); |
7764 | 1177 g_free(pathstr); |
7473 | 1178 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10577
diff
changeset
|
1179 if (!(file = g_fopen(gaim_stringref_value(pathref), "rb"))) { |
7764 | 1180 gaim_stringref_unref(pathref); |
7431 | 1181 return NULL; |
7447 | 1182 } |
7436 | 1183 |
7431 | 1184 while (fgets(buf, BUF_LONG, file)) { |
1185 if ((newlog = strstr(buf, "---- New C"))) { | |
1186 int length; | |
1187 int offset; | |
1188 char convostart[32]; | |
1189 char *temp = strchr(buf, '@'); | |
7436 | 1190 |
7431 | 1191 if (temp == NULL || strlen(temp) < 2) |
1192 continue; | |
7436 | 1193 |
7431 | 1194 temp++; |
1195 length = strcspn(temp, "-"); | |
1196 if (length > 31) length = 31; | |
7436 | 1197 |
7431 | 1198 offset = ftell(file); |
7436 | 1199 |
7761 | 1200 if (logfound) { |
1201 newlen = offset - lastoff - length; | |
7436 | 1202 if(strstr(buf, "----</H3><BR>")) { |
7761 | 1203 newlen -= |
1204 sizeof("<HR><BR><H3 Align=Center> ---- New Conversation @ ") + | |
1205 sizeof("----</H3><BR>") - 2; | |
7436 | 1206 } else { |
7761 | 1207 newlen -= |
1208 sizeof("---- New Conversation @ ") + sizeof("----") - 2; | |
7436 | 1209 } |
1210 | |
7461 | 1211 if(strchr(buf, '\r')) |
7770 | 1212 newlen--; |
7461 | 1213 |
7761 | 1214 if (newlen != 0) { |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
1215 log = gaim_log_new(GAIM_LOG_IM, sn, account, NULL, -1); |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
1216 log->logger = old_logger; |
7761 | 1217 log->time = lasttime; |
1218 data = g_new0(struct old_logger_data, 1); | |
1219 data->offset = lastoff; | |
1220 data->length = newlen; | |
7764 | 1221 data->pathref = gaim_stringref_ref(pathref); |
7761 | 1222 log->logger_data = data; |
11703
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11698
diff
changeset
|
1223 list = g_list_prepend(list, log); |
7761 | 1224 } |
7431 | 1225 } |
1226 | |
7761 | 1227 logfound = 1; |
1228 lastoff = offset; | |
7436 | 1229 |
7431 | 1230 g_snprintf(convostart, length, "%s", temp); |
7676 | 1231 sscanf(convostart, "%*s %s %d %d:%d:%d %d", |
1232 month, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &tm.tm_year); | |
1233 /* Ugly hack, in case current locale is not English */ | |
1234 if (strcmp(month, "Jan") == 0) { | |
1235 tm.tm_mon= 0; | |
1236 } else if (strcmp(month, "Feb") == 0) { | |
1237 tm.tm_mon = 1; | |
1238 } else if (strcmp(month, "Mar") == 0) { | |
1239 tm.tm_mon = 2; | |
1240 } else if (strcmp(month, "Apr") == 0) { | |
1241 tm.tm_mon = 3; | |
1242 } else if (strcmp(month, "May") == 0) { | |
1243 tm.tm_mon = 4; | |
1244 } else if (strcmp(month, "Jun") == 0) { | |
1245 tm.tm_mon = 5; | |
1246 } else if (strcmp(month, "Jul") == 0) { | |
1247 tm.tm_mon = 6; | |
1248 } else if (strcmp(month, "Aug") == 0) { | |
1249 tm.tm_mon = 7; | |
1250 } else if (strcmp(month, "Sep") == 0) { | |
1251 tm.tm_mon = 8; | |
1252 } else if (strcmp(month, "Oct") == 0) { | |
1253 tm.tm_mon = 9; | |
1254 } else if (strcmp(month, "Nov") == 0) { | |
1255 tm.tm_mon = 10; | |
1256 } else if (strcmp(month, "Dec") == 0) { | |
1257 tm.tm_mon = 11; | |
1258 } | |
1259 tm.tm_year -= 1900; | |
7761 | 1260 lasttime = mktime(&tm); |
4184 | 1261 } |
1262 } | |
7613 | 1263 |
7761 | 1264 if (logfound) { |
1265 if ((newlen = ftell(file) - lastoff) != 0) { | |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
1266 log = gaim_log_new(GAIM_LOG_IM, sn, account, NULL, -1); |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
1267 log->logger = old_logger; |
7761 | 1268 log->time = lasttime; |
1269 data = g_new0(struct old_logger_data, 1); | |
1270 data->offset = lastoff; | |
1271 data->length = newlen; | |
7764 | 1272 data->pathref = gaim_stringref_ref(pathref); |
7761 | 1273 log->logger_data = data; |
11703
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11698
diff
changeset
|
1274 list = g_list_prepend(list, log); |
7761 | 1275 } |
7613 | 1276 } |
1277 | |
7764 | 1278 gaim_stringref_unref(pathref); |
7431 | 1279 fclose(file); |
1280 return list; | |
4184 | 1281 } |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4227
diff
changeset
|
1282 |
8898 | 1283 static int old_logger_total_size(GaimLogType type, const char *name, GaimAccount *account) |
8096 | 1284 { |
1285 char *logfile = g_strdup_printf("%s.log", gaim_normalize(account, name)); | |
1286 char *pathstr = g_build_filename(gaim_user_dir(), "logs", logfile, NULL); | |
1287 int size; | |
1288 struct stat st; | |
1289 | |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10577
diff
changeset
|
1290 if (g_stat(pathstr, &st)) |
8096 | 1291 size = 0; |
1292 else | |
1293 size = st.st_size; | |
1294 | |
1295 g_free(logfile); | |
1296 g_free(pathstr); | |
1297 | |
1298 return size; | |
1299 } | |
1300 | |
7616 | 1301 static char * old_logger_read (GaimLog *log, GaimLogReadFlags *flags) |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4227
diff
changeset
|
1302 { |
7431 | 1303 struct old_logger_data *data = log->logger_data; |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10577
diff
changeset
|
1304 FILE *file = g_fopen(gaim_stringref_value(data->pathref), "rb"); |
10906 | 1305 char *tmp, *read = g_malloc(data->length + 1); |
7431 | 1306 fseek(file, data->offset, SEEK_SET); |
1307 fread(read, data->length, 1, file); | |
8370 | 1308 fclose(file); |
7431 | 1309 read[data->length] = '\0'; |
7436 | 1310 *flags = 0; |
1311 if(strstr(read, "<BR>")) | |
1312 *flags |= GAIM_LOG_READ_NO_NEWLINE; | |
10906 | 1313 else { |
1314 tmp = g_markup_escape_text(read, -1); | |
1315 g_free(read); | |
1316 read = tmp; | |
1317 } | |
7431 | 1318 return read; |
1319 } | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4227
diff
changeset
|
1320 |
7616 | 1321 static int old_logger_size (GaimLog *log) |
7556 | 1322 { |
1323 struct old_logger_data *data = log->logger_data; | |
7616 | 1324 return data ? data->length : 0; |
1325 } | |
1326 | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
1327 static void old_logger_get_log_sets(GaimLogSetCallback cb, GHashTable *sets) |
11025 | 1328 { |
1329 char *log_path = g_build_filename(gaim_user_dir(), "logs", NULL); | |
1330 GDir *log_dir = g_dir_open(log_path, 0, NULL); | |
1331 gchar *name; | |
1332 GaimBlistNode *gnode, *cnode, *bnode; | |
1333 | |
1334 g_free(log_path); | |
1335 if (log_dir == NULL) | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
1336 return; |
11025 | 1337 |
1338 /* Don't worry about the cast, name will be filled with a dynamically allocated data shortly. */ | |
1339 while ((name = (gchar *)g_dir_read_name(log_dir)) != NULL) { | |
1340 size_t len; | |
1341 gchar *ext; | |
1342 GaimLogSet *set; | |
1343 gboolean found = FALSE; | |
1344 | |
1345 /* Unescape the filename. */ | |
1346 name = g_strdup(gaim_unescape_filename(name)); | |
1347 | |
1348 /* Get the (possibly new) length of name. */ | |
1349 len = strlen(name); | |
1350 | |
1351 if (len < 5) { | |
1352 g_free(name); | |
1353 continue; | |
1354 } | |
1355 | |
1356 /* Make sure we're dealing with a log file. */ | |
1357 ext = &name[len - 4]; | |
1358 if (strcmp(ext, ".log")) { | |
1359 g_free(name); | |
1360 continue; | |
1361 } | |
1362 | |
1363 set = g_new0(GaimLogSet, 1); | |
1364 | |
1365 /* Chat for .chat at the end of the name to determine the type. */ | |
1366 *ext = '\0'; | |
1367 set->type = GAIM_LOG_IM; | |
1368 if (len > 9) { | |
1369 char *tmp = &name[len - 9]; | |
1370 if (!strcmp(tmp, ".chat")) { | |
1371 set->type = GAIM_LOG_CHAT; | |
1372 *tmp = '\0'; | |
1373 } | |
1374 } | |
1375 | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
1376 set->name = set->normalized_name = name; |
11025 | 1377 |
1378 /* Search the buddy list to find the account and to determine if this is a buddy. */ | |
1379 for (gnode = gaim_get_blist()->root; !found && gnode != NULL; gnode = gnode->next) | |
1380 { | |
1381 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
1382 continue; | |
1383 | |
1384 for (cnode = gnode->child; !found && cnode != NULL; cnode = cnode->next) | |
1385 { | |
1386 if (!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
1387 continue; | |
1388 | |
1389 for (bnode = cnode->child; !found && bnode != NULL; bnode = bnode->next) | |
1390 { | |
1391 GaimBuddy *buddy = (GaimBuddy *)bnode; | |
1392 | |
1393 if (!strcmp(buddy->name, name)) { | |
1394 set->account = buddy->account; | |
1395 set->buddy = TRUE; | |
1396 found = TRUE; | |
1397 } | |
1398 } | |
1399 } | |
1400 } | |
1401 | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
1402 cb(sets, set); |
11025 | 1403 } |
1404 g_dir_close(log_dir); | |
1405 } | |
1406 | |
7616 | 1407 static void old_logger_finalize(GaimLog *log) |
1408 { | |
1409 struct old_logger_data *data = log->logger_data; | |
7764 | 1410 gaim_stringref_unref(data->pathref); |
7616 | 1411 g_free(data); |
7556 | 1412 } |