Mercurial > pidgin.yaz
annotate src/log.c @ 12692:4da7062a06c2
[gaim-migrate @ 15035]
SF Patch #1277888 from Douglas Thrift
I modified this a bit, but the end result is: This patch adds a logging preference that defaults to off. When enabled, the date is included in messages' timestamps in logs (in addition to the time).
This can be useful if you leave conversations open for days (for me, that's chats). The original patch had this affect timestamps in the conversation window as well, but I didn't like that. I figured it probably wasn't necessary, and I was dreading adding another conversation pref. I welcome feedback on this issue.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Tue, 03 Jan 2006 06:33:00 +0000 |
parents | a4500bcbec08 |
children | a1e241dd50b6 |
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 | |
488 void gaim_log_init(void) | |
7436 | 489 { |
7431 | 490 gaim_prefs_add_none("/core/logging"); |
7555 | 491 gaim_prefs_add_bool("/core/logging/log_ims", FALSE); |
492 gaim_prefs_add_bool("/core/logging/log_chats", FALSE); | |
8573 | 493 gaim_prefs_add_bool("/core/logging/log_system", FALSE); |
494 | |
7431 | 495 gaim_prefs_add_string("/core/logging/format", "txt"); |
12692
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
496 gaim_prefs_add_bool("/core/logging/include_date_timestamps", FALSE); |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
497 |
12240 | 498 html_logger = gaim_log_logger_new("html", _("HTML"), 8, |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
499 NULL, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
500 html_logger_write, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
501 html_logger_finalize, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
502 html_logger_list, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
503 html_logger_read, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
504 gaim_log_common_sizer, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
505 NULL, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
506 html_logger_list_syslog); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
507 gaim_log_logger_add(html_logger); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
508 |
12240 | 509 txt_logger = gaim_log_logger_new("txt", _("Plain text"), 8, |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
510 NULL, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
511 txt_logger_write, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
512 txt_logger_finalize, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
513 txt_logger_list, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
514 txt_logger_read, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
515 gaim_log_common_sizer, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
516 NULL, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
517 txt_logger_list_syslog); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
518 gaim_log_logger_add(txt_logger); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
519 |
12240 | 520 old_logger = gaim_log_logger_new("old", _("Old Gaim"), 9, |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
521 NULL, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
522 NULL, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
523 old_logger_finalize, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
524 old_logger_list, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
525 old_logger_read, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
526 old_logger_size, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
527 old_logger_total_size, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
528 NULL, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
529 old_logger_get_log_sets); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
530 gaim_log_logger_add(old_logger); |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
531 |
10087 | 532 gaim_prefs_connect_callback(NULL, "/core/logging/format", |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
533 logger_pref_cb, NULL); |
7431 | 534 gaim_prefs_trigger_callback("/core/logging/format"); |
8635 | 535 |
536 logsize_users = g_hash_table_new_full((GHashFunc)_gaim_logsize_user_hash, | |
537 (GEqualFunc)_gaim_logsize_user_equal, | |
538 (GDestroyNotify)_gaim_logsize_user_free_key, NULL); | |
7431 | 539 } |
540 | |
541 /**************************************************************************** | |
542 * LOGGERS ****************************************************************** | |
543 ****************************************************************************/ | |
544 | |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
545 void gaim_log_common_writer(GaimLog *log, const char *ext) |
9763 | 546 { |
547 char date[64]; | |
10822 | 548 GaimLogCommonLoggerData *data = log->logger_data; |
9763 | 549 |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
550 if (data == NULL) |
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
551 { |
9763 | 552 /* This log is new */ |
9923 | 553 char *dir, *filename, *path; |
10577 | 554 |
9923 | 555 dir = gaim_log_get_log_dir(log->type, log->name, log->account); |
10577 | 556 if (dir == NULL) |
557 return; | |
558 | |
9923 | 559 gaim_build_dir (dir, S_IRUSR | S_IWUSR | S_IXUSR); |
9763 | 560 |
561 strftime(date, sizeof(date), "%Y-%m-%d.%H%M%S", localtime(&log->time)); | |
562 | |
563 filename = g_strdup_printf("%s%s", date, ext ? ext : ""); | |
564 | |
565 path = g_build_filename(dir, filename, NULL); | |
566 g_free(dir); | |
567 g_free(filename); | |
568 | |
10822 | 569 log->logger_data = data = g_new0(GaimLogCommonLoggerData, 1); |
9763 | 570 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10577
diff
changeset
|
571 data->file = g_fopen(path, "a"); |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
572 if (data->file == NULL) |
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
573 { |
9763 | 574 gaim_debug(GAIM_DEBUG_ERROR, "log", |
9892 | 575 "Could not create log file %s\n", path); |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
576 |
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
577 if (log->conv != NULL) |
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
578 gaim_conversation_write(log->conv, NULL, _("Logging of this conversation failed."), |
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
579 GAIM_MESSAGE_ERROR, time(NULL)); |
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
580 |
9763 | 581 g_free(path); |
582 return; | |
583 } | |
584 g_free(path); | |
10577 | 585 } |
9763 | 586 } |
587 | |
10822 | 588 GList *gaim_log_common_lister(GaimLogType type, const char *name, GaimAccount *account, const char *ext, GaimLogLogger *logger) |
7431 | 589 { |
590 GDir *dir; | |
591 GList *list = NULL; | |
7628 | 592 const char *filename; |
8111 | 593 char *path; |
594 | |
595 if(!account) | |
596 return NULL; | |
597 | |
9923 | 598 path = gaim_log_get_log_dir(type, name, account); |
10577 | 599 if (path == NULL) |
600 return NULL; | |
7447 | 601 |
7431 | 602 if (!(dir = g_dir_open(path, 0, NULL))) { |
603 g_free(path); | |
604 return NULL; | |
605 } | |
8898 | 606 |
7431 | 607 while ((filename = g_dir_read_name(dir))) { |
8577 | 608 if (gaim_str_has_suffix(filename, ext) && |
609 strlen(filename) == 17 + strlen(ext)) { | |
7431 | 610 GaimLog *log; |
10822 | 611 GaimLogCommonLoggerData *data; |
8577 | 612 time_t stamp = gaim_str_to_time(filename, FALSE); |
7431 | 613 |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
614 log = gaim_log_new(type, name, account, NULL, stamp); |
7431 | 615 log->logger = logger; |
10822 | 616 log->logger_data = data = g_new0(GaimLogCommonLoggerData, 1); |
7616 | 617 data->path = g_build_filename(path, filename, NULL); |
11703
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11698
diff
changeset
|
618 list = g_list_prepend(list, log); |
4184 | 619 } |
620 } | |
7431 | 621 g_dir_close(dir); |
7447 | 622 g_free(path); |
7431 | 623 return list; |
624 } | |
4184 | 625 |
10822 | 626 int gaim_log_common_sizer(GaimLog *log) |
7556 | 627 { |
628 struct stat st; | |
10822 | 629 GaimLogCommonLoggerData *data = log->logger_data; |
7556 | 630 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10577
diff
changeset
|
631 if (!data->path || g_stat(data->path, &st)) |
7556 | 632 st.st_size = 0; |
633 | |
634 return st.st_size; | |
635 } | |
636 | |
11025 | 637 /* This will build log sets for all loggers that use the common logger |
638 * functions because they use the same directory structure. */ | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
639 static void log_get_log_sets_common(GHashTable *sets) |
11025 | 640 { |
641 gchar *log_path = g_build_filename(gaim_user_dir(), "logs", NULL); | |
642 GDir *log_dir = g_dir_open(log_path, 0, NULL); | |
643 const gchar *protocol; | |
644 | |
645 if (log_dir == NULL) { | |
646 g_free(log_path); | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
647 return; |
11025 | 648 } |
649 | |
650 while ((protocol = g_dir_read_name(log_dir)) != NULL) { | |
651 gchar *protocol_path = g_build_filename(log_path, protocol, NULL); | |
652 GDir *protocol_dir; | |
653 const gchar *username; | |
654 gchar *protocol_unescaped; | |
655 GList *account_iter; | |
656 GList *accounts = NULL; | |
657 | |
658 if ((protocol_dir = g_dir_open(protocol_path, 0, NULL)) == NULL) { | |
659 g_free(protocol_path); | |
660 continue; | |
661 } | |
662 | |
663 /* Using g_strdup() to cover the one-in-a-million chance that a | |
664 * prpl's list_icon function uses gaim_unescape_filename(). */ | |
665 protocol_unescaped = g_strdup(gaim_unescape_filename(protocol)); | |
666 | |
667 /* Find all the accounts for protocol. */ | |
668 for (account_iter = gaim_accounts_get_all() ; account_iter != NULL ; account_iter = account_iter->next) { | |
669 GaimPlugin *prpl; | |
670 GaimPluginProtocolInfo *prpl_info; | |
671 | |
672 prpl = gaim_find_prpl(gaim_account_get_protocol_id((GaimAccount *)account_iter->data)); | |
673 if (!prpl) | |
674 continue; | |
675 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(prpl); | |
676 | |
677 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
|
678 accounts = g_list_prepend(accounts, account_iter->data); |
11025 | 679 } |
680 g_free(protocol_unescaped); | |
681 | |
682 while ((username = g_dir_read_name(protocol_dir)) != NULL) { | |
683 gchar *username_path = g_build_filename(protocol_path, username, NULL); | |
684 GDir *username_dir; | |
685 const gchar *username_unescaped; | |
686 GaimAccount *account = NULL; | |
687 gchar *name; | |
688 | |
689 if ((username_dir = g_dir_open(username_path, 0, NULL)) == NULL) { | |
690 g_free(username_path); | |
691 continue; | |
692 } | |
693 | |
694 /* Find the account for username in the list of accounts for protocol. */ | |
695 username_unescaped = gaim_unescape_filename(username); | |
696 for (account_iter = g_list_first(accounts) ; account_iter != NULL ; account_iter = account_iter->next) { | |
697 if (!strcmp(((GaimAccount *)account_iter->data)->username, username_unescaped)) { | |
698 account = account_iter->data; | |
699 break; | |
700 } | |
701 } | |
702 | |
703 /* Don't worry about the cast, name will point to dynamically allocated memory shortly. */ | |
704 while ((name = (gchar *)g_dir_read_name(username_dir)) != NULL) { | |
705 size_t len; | |
706 GaimLogSet *set = g_new0(GaimLogSet, 1); | |
707 | |
708 /* Unescape the filename. */ | |
709 name = g_strdup(gaim_unescape_filename(name)); | |
710 | |
711 /* Get the (possibly new) length of name. */ | |
712 len = strlen(name); | |
713 | |
714 set->account = account; | |
715 set->name = name; | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
716 set->normalized_name = g_strdup(gaim_normalize(account, name)); |
11025 | 717 |
718 /* Chat for .chat or .system at the end of the name to determine the type. */ | |
719 set->type = GAIM_LOG_IM; | |
720 if (len > 7) { | |
721 gchar *tmp = &name[len - 7]; | |
722 if (!strcmp(tmp, ".system")) { | |
723 set->type = GAIM_LOG_SYSTEM; | |
724 *tmp = '\0'; | |
725 } | |
726 } | |
727 if (len > 5) { | |
728 gchar *tmp = &name[len - 5]; | |
729 if (!strcmp(tmp, ".chat")) { | |
730 set->type = GAIM_LOG_CHAT; | |
731 *tmp = '\0'; | |
732 } | |
733 } | |
734 | |
735 /* Determine if this (account, name) combination exists as a buddy. */ | |
11458
4db38b374d3f
[gaim-migrate @ 13697]
Richard Laager <rlaager@wiktel.com>
parents:
11292
diff
changeset
|
736 if (account != NULL) |
4db38b374d3f
[gaim-migrate @ 13697]
Richard Laager <rlaager@wiktel.com>
parents:
11292
diff
changeset
|
737 set->buddy = (gaim_find_buddy(account, name) != NULL); |
11025 | 738 |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
739 log_add_log_set_to_hash(sets, set); |
11025 | 740 } |
741 g_free(username_path); | |
742 g_dir_close(username_dir); | |
743 } | |
744 g_free(protocol_path); | |
745 g_dir_close(protocol_dir); | |
746 } | |
747 g_free(log_path); | |
748 g_dir_close(log_dir); | |
749 } | |
750 | |
7431 | 751 #if 0 /* Maybe some other time. */ |
7443 | 752 /**************** |
7431 | 753 ** XML LOGGER ** |
754 ****************/ | |
755 | |
756 static const char *str_from_msg_type (GaimMessageFlags type) | |
757 { | |
7443 | 758 |
7431 | 759 return ""; |
7443 | 760 |
7431 | 761 } |
762 | |
7443 | 763 static void xml_logger_write(GaimLog *log, |
764 GaimMessageFlags type, | |
7431 | 765 const char *from, time_t time, const char *message) |
766 { | |
767 char date[64]; | |
768 char *xhtml = NULL; | |
10577 | 769 |
7431 | 770 if (!log->logger_data) { |
771 /* This log is new. We could use the loggers 'new' function, but | |
772 * creating a new file there would result in empty files in the case | |
773 * that you open a convo with someone, but don't say anything. | |
774 */ | |
9923 | 775 char *dir = gaim_log_get_log_dir(log->type, log->name, log->account); |
7431 | 776 FILE *file; |
10577 | 777 |
778 if (dir == NULL) | |
779 return; | |
780 | |
7453 | 781 strftime(date, sizeof(date), "%Y-%m-%d.%H%M%S.xml", localtime(&log->time)); |
7443 | 782 |
7612 | 783 gaim_build_dir (dir, S_IRUSR | S_IWUSR | S_IXUSR); |
7443 | 784 |
7431 | 785 char *filename = g_build_filename(dir, date, NULL); |
786 g_free(dir); | |
7443 | 787 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10577
diff
changeset
|
788 log->logger_data = g_fopen(filename, "a"); |
7431 | 789 if (!log->logger_data) { |
790 gaim_debug(GAIM_DEBUG_ERROR, "log", "Could not create log file %s\n", filename); | |
7564 | 791 g_free(filename); |
7431 | 792 return; |
793 } | |
7564 | 794 g_free(filename); |
7431 | 795 fprintf(log->logger_data, "<?xml version='1.0' encoding='UTF-8' ?>\n" |
796 "<?xml-stylesheet href='file:///usr/src/web/htdocs/log-stylesheet.xsl' type='text/xml' ?>\n"); | |
7443 | 797 |
7453 | 798 strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&log->time)); |
7431 | 799 fprintf(log->logger_data, "<conversation time='%s' screenname='%s' protocol='%s'>\n", |
800 date, log->name, prpl); | |
801 } | |
7443 | 802 |
9923 | 803 /* if we can't write to the file, give up before we hurt ourselves */ |
804 if(!data->file) | |
805 return; | |
806 | |
12692
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
807 if (gaim_prefs_get_bool("/core/logging/include_date_timestamps")) |
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
808 strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&time)); |
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
809 else |
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
810 strftime(date, sizeof(date), "%H:%M:%S", localtime(&time)); |
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
811 |
7431 | 812 gaim_markup_html_to_xhtml(message, &xhtml, NULL); |
813 if (from) | |
7443 | 814 fprintf(log->logger_data, "<message %s %s from='%s' time='%s'>%s</message>\n", |
815 str_from_msg_type(type), | |
7431 | 816 type & GAIM_MESSAGE_SEND ? "direction='sent'" : |
817 type & GAIM_MESSAGE_RECV ? "direction='received'" : "", | |
818 from, date, xhtml); | |
819 else | |
7443 | 820 fprintf(log->logger_data, "<message %s %s time='%s'>%s</message>\n", |
821 str_from_msg_type(type), | |
7431 | 822 type & GAIM_MESSAGE_SEND ? "direction='sent'" : |
823 type & GAIM_MESSAGE_RECV ? "direction='received'" : "", | |
7443 | 824 date, xhtml): |
7431 | 825 fflush(log->logger_data); |
826 g_free(xhtml); | |
7443 | 827 } |
828 | |
7431 | 829 static void xml_logger_finalize(GaimLog *log) |
830 { | |
831 if (log->logger_data) { | |
832 fprintf(log->logger_data, "</conversation>\n"); | |
833 fclose(log->logger_data); | |
834 log->logger_data = NULL; | |
835 } | |
836 } | |
7443 | 837 |
8898 | 838 static GList *xml_logger_list(GaimLogType type, const char *sn, GaimAccount *account) |
7431 | 839 { |
10822 | 840 return gaim_log_common_lister(type, sn, account, ".xml", &xml_logger); |
4184 | 841 } |
842 | |
7431 | 843 static GaimLogLogger xml_logger = { |
844 N_("XML"), "xml", | |
845 NULL, | |
846 xml_logger_write, | |
847 xml_logger_finalize, | |
848 xml_logger_list, | |
8096 | 849 NULL, |
11025 | 850 NULL, |
7431 | 851 NULL |
852 }; | |
853 #endif | |
5563
9eb5b13fd412
[gaim-migrate @ 5965]
Christian Hammond <chipx86@chipx86.com>
parents:
5560
diff
changeset
|
854 |
7431 | 855 /**************************** |
7457 | 856 ** HTML LOGGER ************* |
857 ****************************/ | |
858 | |
859 static void html_logger_write(GaimLog *log, GaimMessageFlags type, | |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
860 const char *from, time_t time, const char *message) |
7457 | 861 { |
9763 | 862 char *msg_fixed; |
7457 | 863 char date[64]; |
9613 | 864 GaimPlugin *plugin = gaim_find_prpl(gaim_account_get_protocol_id(log->account)); |
10822 | 865 GaimLogCommonLoggerData *data = log->logger_data; |
9613 | 866 |
7618 | 867 if(!data) { |
9763 | 868 const char *prpl = |
869 GAIM_PLUGIN_PROTOCOL_INFO(plugin)->list_icon(log->account, NULL); | |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
870 gaim_log_common_writer(log, ".html"); |
7457 | 871 |
9763 | 872 data = log->logger_data; |
7457 | 873 |
9763 | 874 /* if we can't write to the file, give up before we hurt ourselves */ |
875 if(!data->file) | |
876 return; | |
7616 | 877 |
7457 | 878 strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&log->time)); |
11092
68652f4ad6a7
[gaim-migrate @ 13115]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
879 fprintf(data->file, "<html><head>"); |
11094
59a1ff5a4bae
[gaim-migrate @ 13119]
Richard Laager <rlaager@wiktel.com>
parents:
11092
diff
changeset
|
880 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
|
881 fprintf(data->file, "<title>"); |
7616 | 882 fprintf(data->file, "Conversation with %s at %s on %s (%s)", |
7457 | 883 log->name, date, gaim_account_get_username(log->account), prpl); |
7616 | 884 fprintf(data->file, "</title></head><body>"); |
885 fprintf(data->file, | |
7457 | 886 "<h3>Conversation with %s at %s on %s (%s)</h3>\n", |
887 log->name, date, gaim_account_get_username(log->account), prpl); | |
9763 | 888 |
7457 | 889 } |
7623 | 890 |
9892 | 891 /* if we can't write to the file, give up before we hurt ourselves */ |
892 if(!data->file) | |
893 return; | |
894 | |
7882 | 895 gaim_markup_html_to_xhtml(message, &msg_fixed, NULL); |
896 | |
8577 | 897 if(log->type == GAIM_LOG_SYSTEM){ |
9592 | 898 strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&time)); |
8577 | 899 fprintf(data->file, "---- %s @ %s ----<br/>\n", msg_fixed, date); |
900 } else { | |
12692
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
901 if (gaim_prefs_get_bool("/core/logging/include_date_timestamps")) |
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
902 strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&time)); |
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
903 else |
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
904 strftime(date, sizeof(date), "%H:%M:%S", localtime(&time)); |
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
905 |
8577 | 906 if (type & GAIM_MESSAGE_SYSTEM) |
907 fprintf(data->file, "<font size=\"2\">(%s)</font><b> %s</b><br/>\n", date, msg_fixed); | |
908 else if (type & GAIM_MESSAGE_WHISPER) | |
909 fprintf(data->file, "<font color=\"#6C2585\"><font size=\"2\">(%s)</font><b> %s:</b></font> %s<br/>\n", | |
910 date, from, msg_fixed); | |
911 else if (type & GAIM_MESSAGE_AUTO_RESP) { | |
912 if (type & GAIM_MESSAGE_SEND) | |
913 fprintf(data->file, _("<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s <AUTO-REPLY>:</b></font> %s<br/>\n"), date, from, msg_fixed); | |
914 else if (type & GAIM_MESSAGE_RECV) | |
915 fprintf(data->file, _("<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s <AUTO-REPLY>:</b></font> %s<br/>\n"), date, from, msg_fixed); | |
916 } else if (type & GAIM_MESSAGE_RECV) { | |
917 if(gaim_message_meify(msg_fixed, -1)) | |
10735
a0edd89ddb83
[gaim-migrate @ 12337]
Luke Schierer <lschiere@pidgin.im>
parents:
10732
diff
changeset
|
918 fprintf(data->file, "<font color=\"#062585\"><font size=\"2\">(%s)</font> <b>***%s</b></font> %s<br/>\n", |
10645 | 919 date, from, msg_fixed); |
8577 | 920 else |
10645 | 921 fprintf(data->file, "<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s:</b></font> %s<br/>\n", |
922 date, from, msg_fixed); | |
8577 | 923 } else if (type & GAIM_MESSAGE_SEND) { |
924 if(gaim_message_meify(msg_fixed, -1)) | |
10735
a0edd89ddb83
[gaim-migrate @ 12337]
Luke Schierer <lschiere@pidgin.im>
parents:
10732
diff
changeset
|
925 fprintf(data->file, "<font color=\"#062585\"><font size=\"2\">(%s)</font> <b>***%s</b></font> %s<br/>\n", |
10645 | 926 date, from, msg_fixed); |
8577 | 927 else |
10645 | 928 fprintf(data->file, "<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s:</b></font> %s<br/>\n", |
929 date, from, msg_fixed); | |
8577 | 930 } |
7564 | 931 } |
8573 | 932 |
7882 | 933 g_free(msg_fixed); |
7616 | 934 fflush(data->file); |
7457 | 935 } |
936 | |
937 static void html_logger_finalize(GaimLog *log) | |
938 { | |
10822 | 939 GaimLogCommonLoggerData *data = log->logger_data; |
7616 | 940 if (data) { |
941 if(data->file) { | |
942 fprintf(data->file, "</body></html>"); | |
943 fclose(data->file); | |
944 } | |
945 g_free(data->path); | |
7752 | 946 g_free(data); |
7463 | 947 } |
7457 | 948 } |
949 | |
8898 | 950 static GList *html_logger_list(GaimLogType type, const char *sn, GaimAccount *account) |
7457 | 951 { |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
952 return gaim_log_common_lister(type, sn, account, ".html", html_logger); |
7457 | 953 } |
954 | |
8573 | 955 static GList *html_logger_list_syslog(GaimAccount *account) |
956 { | |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
957 return gaim_log_common_lister(GAIM_LOG_SYSTEM, ".system", account, ".html", html_logger); |
8573 | 958 } |
959 | |
7457 | 960 static char *html_logger_read(GaimLog *log, GaimLogReadFlags *flags) |
961 { | |
962 char *read, *minus_header; | |
10822 | 963 GaimLogCommonLoggerData *data = log->logger_data; |
7457 | 964 *flags = GAIM_LOG_READ_NO_NEWLINE; |
7616 | 965 if (!data || !data->path) |
966 return g_strdup(_("<font color=\"red\"><b>Unable to find log path!</b></font>")); | |
967 if (g_file_get_contents(data->path, &read, NULL, NULL)) { | |
7457 | 968 minus_header = strchr(read, '\n'); |
969 if (!minus_header) | |
970 minus_header = g_strdup(read); | |
971 else | |
972 minus_header = g_strdup(minus_header + 1); | |
973 g_free(read); | |
974 return minus_header; | |
975 } | |
8578 | 976 return g_strdup_printf(_("<font color=\"red\"><b>Could not read file: %s</b></font>"), data->path); |
7457 | 977 } |
978 | |
979 | |
980 | |
981 /**************************** | |
7431 | 982 ** PLAIN TEXT LOGGER ******* |
983 ****************************/ | |
4184 | 984 |
7436 | 985 static void txt_logger_write(GaimLog *log, |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
986 GaimMessageFlags type, |
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
987 const char *from, time_t time, const char *message) |
7431 | 988 { |
989 char date[64]; | |
9763 | 990 GaimPlugin *plugin = gaim_find_prpl(gaim_account_get_protocol_id(log->account)); |
10822 | 991 GaimLogCommonLoggerData *data = log->logger_data; |
9763 | 992 char *stripped = NULL; |
993 | |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
994 if (data == NULL) { |
7431 | 995 /* This log is new. We could use the loggers 'new' function, but |
996 * creating a new file there would result in empty files in the case | |
997 * that you open a convo with someone, but don't say anything. | |
998 */ | |
9763 | 999 const char *prpl = |
1000 GAIM_PLUGIN_PROTOCOL_INFO(plugin)->list_icon(log->account, NULL); | |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
1001 gaim_log_common_writer(log, ".txt"); |
8898 | 1002 |
9763 | 1003 data = log->logger_data; |
7436 | 1004 |
9763 | 1005 /* if we can't write to the file, give up before we hurt ourselves */ |
1006 if(!data->file) | |
1007 return; | |
7616 | 1008 |
7453 | 1009 strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&log->time)); |
7616 | 1010 fprintf(data->file, "Conversation with %s at %s on %s (%s)\n", |
7431 | 1011 log->name, date, gaim_account_get_username(log->account), prpl); |
1012 } | |
7436 | 1013 |
7623 | 1014 /* if we can't write to the file, give up before we hurt ourselves */ |
1015 if(!data->file) | |
1016 return; | |
1017 | |
8573 | 1018 stripped = gaim_markup_strip_html(message); |
1019 | |
1020 if(log->type == GAIM_LOG_SYSTEM){ | |
9592 | 1021 strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&time)); |
8573 | 1022 fprintf(data->file, "---- %s @ %s ----\n", stripped, date); |
1023 } else { | |
12692
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
1024 if (gaim_prefs_get_bool("/core/logging/include_date_timestamps")) |
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
1025 strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&time)); |
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
1026 else |
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
1027 strftime(date, sizeof(date), "%H:%M:%S", localtime(&time)); |
4da7062a06c2
[gaim-migrate @ 15035]
Richard Laager <rlaager@wiktel.com>
parents:
12574
diff
changeset
|
1028 |
8573 | 1029 if (type & GAIM_MESSAGE_SEND || |
1030 type & GAIM_MESSAGE_RECV) { | |
1031 if (type & GAIM_MESSAGE_AUTO_RESP) { | |
1032 fprintf(data->file, _("(%s) %s <AUTO-REPLY>: %s\n"), date, | |
1033 from, stripped); | |
1034 } else { | |
1035 if(gaim_message_meify(stripped, -1)) | |
1036 fprintf(data->file, "(%s) ***%s %s\n", date, from, | |
1037 stripped); | |
1038 else | |
1039 fprintf(data->file, "(%s) %s: %s\n", date, from, | |
1040 stripped); | |
1041 } | |
1042 } else if (type & GAIM_MESSAGE_SYSTEM) | |
1043 fprintf(data->file, "(%s) %s\n", date, stripped); | |
1044 else if (type & GAIM_MESSAGE_NO_LOG) { | |
1045 /* This shouldn't happen */ | |
1046 g_free(stripped); | |
1047 return; | |
1048 } else if (type & GAIM_MESSAGE_WHISPER) | |
1049 fprintf(data->file, "(%s) *%s* %s", date, from, stripped); | |
1050 else | |
1051 fprintf(data->file, "(%s) %s%s %s\n", date, from ? from : "", | |
1052 from ? ":" : "", stripped); | |
1053 } | |
1054 | |
1055 fflush(data->file); | |
1056 g_free(stripped); | |
7431 | 1057 } |
1058 | |
1059 static void txt_logger_finalize(GaimLog *log) | |
1060 { | |
10822 | 1061 GaimLogCommonLoggerData *data = log->logger_data; |
7616 | 1062 if (data) { |
1063 if(data->file) | |
1064 fclose(data->file); | |
1065 if(data->path) | |
1066 g_free(data->path); | |
7752 | 1067 g_free(data); |
7616 | 1068 } |
7431 | 1069 } |
1070 | |
8898 | 1071 static GList *txt_logger_list(GaimLogType type, const char *sn, GaimAccount *account) |
7431 | 1072 { |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
1073 return gaim_log_common_lister(type, sn, account, ".txt", txt_logger); |
7431 | 1074 } |
1075 | |
8573 | 1076 static GList *txt_logger_list_syslog(GaimAccount *account) |
1077 { | |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
1078 return gaim_log_common_lister(GAIM_LOG_SYSTEM, ".system", account, ".txt", txt_logger); |
8573 | 1079 } |
1080 | |
7431 | 1081 static char *txt_logger_read(GaimLog *log, GaimLogReadFlags *flags) |
1082 { | |
8517 | 1083 char *read, *minus_header, *minus_header2; |
10822 | 1084 GaimLogCommonLoggerData *data = log->logger_data; |
7457 | 1085 *flags = 0; |
7616 | 1086 if (!data || !data->path) |
1087 return g_strdup(_("<font color=\"red\"><b>Unable to find log path!</b></font>")); | |
1088 if (g_file_get_contents(data->path, &read, NULL, NULL)) { | |
7431 | 1089 minus_header = strchr(read, '\n'); |
1090 if (!minus_header) | |
1091 minus_header = g_strdup(read); | |
7436 | 1092 else |
7431 | 1093 minus_header = g_strdup(minus_header + 1); |
1094 g_free(read); | |
10732
c4cb90065e1d
[gaim-migrate @ 12334]
Luke Schierer <lschiere@pidgin.im>
parents:
10645
diff
changeset
|
1095 minus_header2 = g_markup_escape_text(minus_header, -1); |
8517 | 1096 g_free(minus_header); |
1097 return minus_header2; | |
7431 | 1098 } |
8578 | 1099 return g_strdup_printf(_("<font color=\"red\"><b>Could not read file: %s</b></font>"), data->path); |
7436 | 1100 } |
7431 | 1101 |
11503
cd0c8830d881
[gaim-migrate @ 13748]
Richard Laager <rlaager@wiktel.com>
parents:
11458
diff
changeset
|
1102 |
7431 | 1103 |
1104 /**************** | |
1105 * OLD LOGGER *** | |
1106 ****************/ | |
1107 | |
1108 /* The old logger doesn't write logs, only reads them. This is to include | |
1109 * old logs in the log viewer transparently. | |
1110 */ | |
1111 | |
1112 struct old_logger_data { | |
7764 | 1113 GaimStringref *pathref; |
7431 | 1114 int offset; |
1115 int length; | |
1116 }; | |
1117 | |
8898 | 1118 static GList *old_logger_list(GaimLogType type, const char *sn, GaimAccount *account) |
7431 | 1119 { |
1120 FILE *file; | |
1121 char buf[BUF_LONG]; | |
1122 struct tm tm; | |
7761 | 1123 char month[4]; |
7431 | 1124 struct old_logger_data *data = NULL; |
1125 char *logfile = g_strdup_printf("%s.log", gaim_normalize(account, sn)); | |
7764 | 1126 char *pathstr = g_build_filename(gaim_user_dir(), "logs", logfile, NULL); |
1127 GaimStringref *pathref = gaim_stringref_new(pathstr); | |
7431 | 1128 char *newlog; |
7761 | 1129 int logfound = 0; |
1130 int lastoff = 0; | |
1131 int newlen; | |
7791 | 1132 time_t lasttime = 0; |
7431 | 1133 |
1134 GaimLog *log = NULL; | |
1135 GList *list = NULL; | |
1136 | |
7473 | 1137 g_free(logfile); |
7764 | 1138 g_free(pathstr); |
7473 | 1139 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10577
diff
changeset
|
1140 if (!(file = g_fopen(gaim_stringref_value(pathref), "rb"))) { |
7764 | 1141 gaim_stringref_unref(pathref); |
7431 | 1142 return NULL; |
7447 | 1143 } |
7436 | 1144 |
7431 | 1145 while (fgets(buf, BUF_LONG, file)) { |
1146 if ((newlog = strstr(buf, "---- New C"))) { | |
1147 int length; | |
1148 int offset; | |
1149 char convostart[32]; | |
1150 char *temp = strchr(buf, '@'); | |
7436 | 1151 |
7431 | 1152 if (temp == NULL || strlen(temp) < 2) |
1153 continue; | |
7436 | 1154 |
7431 | 1155 temp++; |
1156 length = strcspn(temp, "-"); | |
1157 if (length > 31) length = 31; | |
7436 | 1158 |
7431 | 1159 offset = ftell(file); |
7436 | 1160 |
7761 | 1161 if (logfound) { |
1162 newlen = offset - lastoff - length; | |
7436 | 1163 if(strstr(buf, "----</H3><BR>")) { |
7761 | 1164 newlen -= |
1165 sizeof("<HR><BR><H3 Align=Center> ---- New Conversation @ ") + | |
1166 sizeof("----</H3><BR>") - 2; | |
7436 | 1167 } else { |
7761 | 1168 newlen -= |
1169 sizeof("---- New Conversation @ ") + sizeof("----") - 2; | |
7436 | 1170 } |
1171 | |
7461 | 1172 if(strchr(buf, '\r')) |
7770 | 1173 newlen--; |
7461 | 1174 |
7761 | 1175 if (newlen != 0) { |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
1176 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
|
1177 log->logger = old_logger; |
7761 | 1178 log->time = lasttime; |
1179 data = g_new0(struct old_logger_data, 1); | |
1180 data->offset = lastoff; | |
1181 data->length = newlen; | |
7764 | 1182 data->pathref = gaim_stringref_ref(pathref); |
7761 | 1183 log->logger_data = data; |
11703
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11698
diff
changeset
|
1184 list = g_list_prepend(list, log); |
7761 | 1185 } |
7431 | 1186 } |
1187 | |
7761 | 1188 logfound = 1; |
1189 lastoff = offset; | |
7436 | 1190 |
7431 | 1191 g_snprintf(convostart, length, "%s", temp); |
7676 | 1192 sscanf(convostart, "%*s %s %d %d:%d:%d %d", |
1193 month, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &tm.tm_year); | |
1194 /* Ugly hack, in case current locale is not English */ | |
1195 if (strcmp(month, "Jan") == 0) { | |
1196 tm.tm_mon= 0; | |
1197 } else if (strcmp(month, "Feb") == 0) { | |
1198 tm.tm_mon = 1; | |
1199 } else if (strcmp(month, "Mar") == 0) { | |
1200 tm.tm_mon = 2; | |
1201 } else if (strcmp(month, "Apr") == 0) { | |
1202 tm.tm_mon = 3; | |
1203 } else if (strcmp(month, "May") == 0) { | |
1204 tm.tm_mon = 4; | |
1205 } else if (strcmp(month, "Jun") == 0) { | |
1206 tm.tm_mon = 5; | |
1207 } else if (strcmp(month, "Jul") == 0) { | |
1208 tm.tm_mon = 6; | |
1209 } else if (strcmp(month, "Aug") == 0) { | |
1210 tm.tm_mon = 7; | |
1211 } else if (strcmp(month, "Sep") == 0) { | |
1212 tm.tm_mon = 8; | |
1213 } else if (strcmp(month, "Oct") == 0) { | |
1214 tm.tm_mon = 9; | |
1215 } else if (strcmp(month, "Nov") == 0) { | |
1216 tm.tm_mon = 10; | |
1217 } else if (strcmp(month, "Dec") == 0) { | |
1218 tm.tm_mon = 11; | |
1219 } | |
1220 tm.tm_year -= 1900; | |
7761 | 1221 lasttime = mktime(&tm); |
4184 | 1222 } |
1223 } | |
7613 | 1224 |
7761 | 1225 if (logfound) { |
1226 if ((newlen = ftell(file) - lastoff) != 0) { | |
11292
ef9280fdc511
[gaim-migrate @ 13492]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
1227 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
|
1228 log->logger = old_logger; |
7761 | 1229 log->time = lasttime; |
1230 data = g_new0(struct old_logger_data, 1); | |
1231 data->offset = lastoff; | |
1232 data->length = newlen; | |
7764 | 1233 data->pathref = gaim_stringref_ref(pathref); |
7761 | 1234 log->logger_data = data; |
11703
a53cef8bd22b
[gaim-migrate @ 13994]
Richard Laager <rlaager@wiktel.com>
parents:
11698
diff
changeset
|
1235 list = g_list_prepend(list, log); |
7761 | 1236 } |
7613 | 1237 } |
1238 | |
7764 | 1239 gaim_stringref_unref(pathref); |
7431 | 1240 fclose(file); |
1241 return list; | |
4184 | 1242 } |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4227
diff
changeset
|
1243 |
8898 | 1244 static int old_logger_total_size(GaimLogType type, const char *name, GaimAccount *account) |
8096 | 1245 { |
1246 char *logfile = g_strdup_printf("%s.log", gaim_normalize(account, name)); | |
1247 char *pathstr = g_build_filename(gaim_user_dir(), "logs", logfile, NULL); | |
1248 int size; | |
1249 struct stat st; | |
1250 | |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10577
diff
changeset
|
1251 if (g_stat(pathstr, &st)) |
8096 | 1252 size = 0; |
1253 else | |
1254 size = st.st_size; | |
1255 | |
1256 g_free(logfile); | |
1257 g_free(pathstr); | |
1258 | |
1259 return size; | |
1260 } | |
1261 | |
7616 | 1262 static char * old_logger_read (GaimLog *log, GaimLogReadFlags *flags) |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4227
diff
changeset
|
1263 { |
7431 | 1264 struct old_logger_data *data = log->logger_data; |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10577
diff
changeset
|
1265 FILE *file = g_fopen(gaim_stringref_value(data->pathref), "rb"); |
10906 | 1266 char *tmp, *read = g_malloc(data->length + 1); |
7431 | 1267 fseek(file, data->offset, SEEK_SET); |
1268 fread(read, data->length, 1, file); | |
8370 | 1269 fclose(file); |
7431 | 1270 read[data->length] = '\0'; |
7436 | 1271 *flags = 0; |
1272 if(strstr(read, "<BR>")) | |
1273 *flags |= GAIM_LOG_READ_NO_NEWLINE; | |
10906 | 1274 else { |
1275 tmp = g_markup_escape_text(read, -1); | |
1276 g_free(read); | |
1277 read = tmp; | |
1278 } | |
7431 | 1279 return read; |
1280 } | |
4359
5fb47ec9bfe4
[gaim-migrate @ 4625]
Christian Hammond <chipx86@chipx86.com>
parents:
4227
diff
changeset
|
1281 |
7616 | 1282 static int old_logger_size (GaimLog *log) |
7556 | 1283 { |
1284 struct old_logger_data *data = log->logger_data; | |
7616 | 1285 return data ? data->length : 0; |
1286 } | |
1287 | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
1288 static void old_logger_get_log_sets(GaimLogSetCallback cb, GHashTable *sets) |
11025 | 1289 { |
1290 char *log_path = g_build_filename(gaim_user_dir(), "logs", NULL); | |
1291 GDir *log_dir = g_dir_open(log_path, 0, NULL); | |
1292 gchar *name; | |
1293 GaimBlistNode *gnode, *cnode, *bnode; | |
1294 | |
1295 g_free(log_path); | |
1296 if (log_dir == NULL) | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
1297 return; |
11025 | 1298 |
1299 /* Don't worry about the cast, name will be filled with a dynamically allocated data shortly. */ | |
1300 while ((name = (gchar *)g_dir_read_name(log_dir)) != NULL) { | |
1301 size_t len; | |
1302 gchar *ext; | |
1303 GaimLogSet *set; | |
1304 gboolean found = FALSE; | |
1305 | |
1306 /* Unescape the filename. */ | |
1307 name = g_strdup(gaim_unescape_filename(name)); | |
1308 | |
1309 /* Get the (possibly new) length of name. */ | |
1310 len = strlen(name); | |
1311 | |
1312 if (len < 5) { | |
1313 g_free(name); | |
1314 continue; | |
1315 } | |
1316 | |
1317 /* Make sure we're dealing with a log file. */ | |
1318 ext = &name[len - 4]; | |
1319 if (strcmp(ext, ".log")) { | |
1320 g_free(name); | |
1321 continue; | |
1322 } | |
1323 | |
1324 set = g_new0(GaimLogSet, 1); | |
1325 | |
1326 /* Chat for .chat at the end of the name to determine the type. */ | |
1327 *ext = '\0'; | |
1328 set->type = GAIM_LOG_IM; | |
1329 if (len > 9) { | |
1330 char *tmp = &name[len - 9]; | |
1331 if (!strcmp(tmp, ".chat")) { | |
1332 set->type = GAIM_LOG_CHAT; | |
1333 *tmp = '\0'; | |
1334 } | |
1335 } | |
1336 | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
1337 set->name = set->normalized_name = name; |
11025 | 1338 |
1339 /* Search the buddy list to find the account and to determine if this is a buddy. */ | |
1340 for (gnode = gaim_get_blist()->root; !found && gnode != NULL; gnode = gnode->next) | |
1341 { | |
1342 if (!GAIM_BLIST_NODE_IS_GROUP(gnode)) | |
1343 continue; | |
1344 | |
1345 for (cnode = gnode->child; !found && cnode != NULL; cnode = cnode->next) | |
1346 { | |
1347 if (!GAIM_BLIST_NODE_IS_CONTACT(cnode)) | |
1348 continue; | |
1349 | |
1350 for (bnode = cnode->child; !found && bnode != NULL; bnode = bnode->next) | |
1351 { | |
1352 GaimBuddy *buddy = (GaimBuddy *)bnode; | |
1353 | |
1354 if (!strcmp(buddy->name, name)) { | |
1355 set->account = buddy->account; | |
1356 set->buddy = TRUE; | |
1357 found = TRUE; | |
1358 } | |
1359 } | |
1360 } | |
1361 } | |
1362 | |
11177
3924db2b1ca8
[gaim-migrate @ 13285]
Richard Laager <rlaager@wiktel.com>
parents:
11094
diff
changeset
|
1363 cb(sets, set); |
11025 | 1364 } |
1365 g_dir_close(log_dir); | |
1366 } | |
1367 | |
7616 | 1368 static void old_logger_finalize(GaimLog *log) |
1369 { | |
1370 struct old_logger_data *data = log->logger_data; | |
7764 | 1371 gaim_stringref_unref(data->pathref); |
7616 | 1372 g_free(data); |
7556 | 1373 } |