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