comparison src/log.c @ 7436:7cdbd2eb7546

[gaim-migrate @ 8041] clean up whitespace, and make it not crash on old logs w/o HTML committer: Tailor Script <tailor@pidgin.im>
author Nathan Walp <nwalp@pidgin.im>
date Wed, 05 Nov 2003 22:12:55 +0000
parents 643cbc9a6035
children 8c0527c91a92
comparison
equal deleted inserted replaced
7435:be5a715b71c8 7436:7cdbd2eb7546
3 * @ingroup core 3 * @ingroup core
4 * 4 *
5 * gaim 5 * gaim
6 * 6 *
7 * Copyright (C) 2003 Buzz Lightyear 7 * Copyright (C) 2003 Buzz Lightyear
8 * 8 *
9 * This program is free software; you can redistribute it and/or modify 9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by 10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or 11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version. 12 * (at your option) any later version.
13 * 13 *
53 if (log->logger && log->logger->finalize) 53 if (log->logger && log->logger->finalize)
54 log->logger->finalize(log); 54 log->logger->finalize(log);
55 g_free(log->name); 55 g_free(log->name);
56 g_free(log); 56 g_free(log);
57 } 57 }
58 58
59 59
60 void gaim_log_write(GaimLog *log, GaimMessageFlags type, 60 void gaim_log_write(GaimLog *log, GaimMessageFlags type,
61 const char *from, time_t time, const char *message) 61 const char *from, time_t time, const char *message)
62 { 62 {
63 g_return_if_fail(log); 63 g_return_if_fail(log);
64 g_return_if_fail(log->logger); 64 g_return_if_fail(log->logger);
65 g_return_if_fail(log->logger->write); 65 g_return_if_fail(log->logger->write);
79 * LOGGER FUNCTIONS ********************************************************* 79 * LOGGER FUNCTIONS *********************************************************
80 ****************************************************************************/ 80 ****************************************************************************/
81 81
82 static GaimLogLogger *current_logger = NULL; 82 static GaimLogLogger *current_logger = NULL;
83 static GSList *loggers = NULL; 83 static GSList *loggers = NULL;
84 84
85 static void logger_pref_cb(const char *name, GaimPrefType type, 85 static void logger_pref_cb(const char *name, GaimPrefType type,
86 gpointer value, gpointer data) 86 gpointer value, gpointer data)
87 { 87 {
88 GaimLogLogger *logger; 88 GaimLogLogger *logger;
89 GSList *l = loggers; 89 GSList *l = loggers;
98 gaim_log_logger_set(&txt_logger); 98 gaim_log_logger_set(&txt_logger);
99 } 99 }
100 100
101 101
102 GaimLogLogger *gaim_log_logger_new(void(*new)(GaimLog *), 102 GaimLogLogger *gaim_log_logger_new(void(*new)(GaimLog *),
103 void(*write)(GaimLog *, GaimMessageFlags, const char *, 103 void(*write)(GaimLog *, GaimMessageFlags, const char *,
104 time_t, const char *), 104 time_t, const char *),
105 void(*finalize)(GaimLog *), GList*(*list)(const char*, GaimAccount*), 105 void(*finalize)(GaimLog *), GList*(*list)(const char*, GaimAccount*),
106 char*(*read)(GaimLog*, GaimLogReadFlags*)) 106 char*(*read)(GaimLog*, GaimLogReadFlags*))
107 { 107 {
108 GaimLogLogger *logger = g_new0(GaimLogLogger, 1); 108 GaimLogLogger *logger = g_new0(GaimLogLogger, 1);
135 135
136 void gaim_log_logger_set (GaimLogLogger *logger) 136 void gaim_log_logger_set (GaimLogLogger *logger)
137 { 137 {
138 g_return_if_fail(logger); 138 g_return_if_fail(logger);
139 current_logger = logger; 139 current_logger = logger;
140 } 140 }
141 141
142 GaimLogLogger *gaim_log_logger_get() 142 GaimLogLogger *gaim_log_logger_get()
143 { 143 {
144 return current_logger; 144 return current_logger;
145 } 145 }
159 } 159 }
160 160
161 return list; 161 return list;
162 } 162 }
163 163
164 static gint log_compare(GaimLog *a, GaimLog *b) 164 static gint log_compare(gconstpointer y, gconstpointer z)
165 { 165 {
166 const GaimLog *a = y;
167 const GaimLog *b = z;
168
166 return b->time - a->time; 169 return b->time - a->time;
167 } 170 }
168 171
169 GList *gaim_log_get_logs(const char *name, GaimAccount *account) 172 GList *gaim_log_get_logs(const char *name, GaimAccount *account)
170 { 173 {
174 GaimLogLogger *logger = n->data; 177 GaimLogLogger *logger = n->data;
175 if (!logger->list) 178 if (!logger->list)
176 continue; 179 continue;
177 logs = g_list_concat(logs, logger->list(name, account)); 180 logs = g_list_concat(logs, logger->list(name, account));
178 } 181 }
179 182
180 return g_list_sort(logs, log_compare); 183 return g_list_sort(logs, log_compare);
181 } 184 }
182 185
183 void gaim_log_init(void) 186 void gaim_log_init(void)
184 { 187 {
185 gaim_prefs_add_none("/core/logging"); 188 gaim_prefs_add_none("/core/logging");
186 gaim_prefs_add_string("/core/logging/format", "txt"); 189 gaim_prefs_add_string("/core/logging/format", "txt");
187 gaim_log_logger_add(&txt_logger); 190 gaim_log_logger_add(&txt_logger);
188 gaim_log_logger_add(&old_logger); 191 gaim_log_logger_add(&old_logger);
189 gaim_prefs_connect_callback("/core/logging/format", 192 gaim_prefs_connect_callback("/core/logging/format",
215 if (g_str_has_suffix(filename, ext)) { 218 if (g_str_has_suffix(filename, ext)) {
216 const char *l = filename; 219 const char *l = filename;
217 struct tm time; 220 struct tm time;
218 GaimLog *log; 221 GaimLog *log;
219 char d[5]; 222 char d[5];
220 223
221 strncpy(d, l, 4); 224 strncpy(d, l, 4);
222 d[4] = '\0'; 225 d[4] = '\0';
223 time.tm_year = atoi(d) - 1900; 226 time.tm_year = atoi(d) - 1900;
224 l = l + 5; 227 l = l + 5;
225 228
233 l = l + 3; 236 l = l + 3;
234 237
235 strncpy(d, l, 2); 238 strncpy(d, l, 2);
236 time.tm_hour = atoi(d); 239 time.tm_hour = atoi(d);
237 l = l + 2; 240 l = l + 2;
238 241
239 strncpy(d, l, 2); 242 strncpy(d, l, 2);
240 time.tm_min = atoi(d); 243 time.tm_min = atoi(d);
241 l = l + 2; 244 l = l + 2;
242 245
243 strncpy(d, l, 2); 246 strncpy(d, l, 2);
366 369
367 /**************************** 370 /****************************
368 ** PLAIN TEXT LOGGER ******* 371 ** PLAIN TEXT LOGGER *******
369 ****************************/ 372 ****************************/
370 373
371 static void txt_logger_write(GaimLog *log, 374 static void txt_logger_write(GaimLog *log,
372 GaimMessageFlags type, 375 GaimMessageFlags type,
373 const char *from, time_t time, const char *message) 376 const char *from, time_t time, const char *message)
374 { 377 {
375 char date[64]; 378 char date[64];
376 char *stripped = NULL; 379 char *stripped = NULL;
377 if (!log->logger_data) { 380 if (!log->logger_data) {
383 char *guy = g_strdup(gaim_normalize(log->account, gaim_account_get_username(log->account))); 386 char *guy = g_strdup(gaim_normalize(log->account, gaim_account_get_username(log->account)));
384 const char *prpl = GAIM_PLUGIN_PROTOCOL_INFO 387 const char *prpl = GAIM_PLUGIN_PROTOCOL_INFO
385 (gaim_find_prpl(gaim_account_get_protocol(log->account)))->list_icon(log->account, NULL); 388 (gaim_find_prpl(gaim_account_get_protocol(log->account)))->list_icon(log->account, NULL);
386 char *dir; 389 char *dir;
387 FILE *file; 390 FILE *file;
388 391
389 strftime(date, sizeof(date), "%F.%H%M%S.txt", localtime(&log->time)); 392 strftime(date, sizeof(date), "%F.%H%M%S.txt", localtime(&log->time));
390 393
391 dir = g_build_filename(ud, "logs", NULL); 394 dir = g_build_filename(ud, "logs", NULL);
392 mkdir (dir, S_IRUSR | S_IWUSR | S_IXUSR); 395 mkdir (dir, S_IRUSR | S_IWUSR | S_IXUSR);
393 g_free(dir); 396 g_free(dir);
394 dir = g_build_filename(ud, "logs", 397 dir = g_build_filename(ud, "logs",
395 prpl, NULL); 398 prpl, NULL);
396 mkdir (dir, S_IRUSR | S_IWUSR | S_IXUSR); 399 mkdir (dir, S_IRUSR | S_IWUSR | S_IXUSR);
397 g_free(dir); 400 g_free(dir);
398 dir = g_build_filename(ud, "logs", 401 dir = g_build_filename(ud, "logs",
399 prpl, guy, NULL); 402 prpl, guy, NULL);
400 mkdir (dir, S_IRUSR | S_IWUSR | S_IXUSR); 403 mkdir (dir, S_IRUSR | S_IWUSR | S_IXUSR);
401 g_free(dir); 404 g_free(dir);
402 dir = g_build_filename(ud, "logs", 405 dir = g_build_filename(ud, "logs",
403 prpl, guy, gaim_normalize(log->account, log->name), NULL); 406 prpl, guy, gaim_normalize(log->account, log->name), NULL);
404 mkdir (dir, S_IRUSR | S_IWUSR | S_IXUSR); 407 mkdir (dir, S_IRUSR | S_IWUSR | S_IXUSR);
405 408
406 char *filename = g_build_filename(dir, date, NULL); 409 char *filename = g_build_filename(dir, date, NULL);
407 g_free(dir); 410 g_free(dir);
408 411
409 file = fopen(dir, "r"); 412 file = fopen(dir, "r");
410 if(!file) 413 if(!file)
411 mkdir(dir, S_IRUSR | S_IWUSR | S_IXUSR); 414 mkdir(dir, S_IRUSR | S_IWUSR | S_IXUSR);
412 else 415 else
413 fclose(file); 416 fclose(file);
414 417
415 log->logger_data = fopen(filename, "a"); 418 log->logger_data = fopen(filename, "a");
416 if (!log->logger_data) { 419 if (!log->logger_data) {
417 gaim_debug(GAIM_DEBUG_ERROR, "log", "Could not create log file %s\n", filename); 420 gaim_debug(GAIM_DEBUG_ERROR, "log", "Could not create log file %s\n", filename);
418 return; 421 return;
419 } 422 }
420 strftime(date, sizeof(date), "%F %T", localtime(&log->time)); 423 strftime(date, sizeof(date), "%F %T", localtime(&log->time));
421 fprintf(log->logger_data, "Conversation with %s at %s on %s (%s)\n", 424 fprintf(log->logger_data, "Conversation with %s at %s on %s (%s)\n",
422 log->name, date, gaim_account_get_username(log->account), prpl); 425 log->name, date, gaim_account_get_username(log->account), prpl);
423 } 426 }
424 427
425 strftime(date, sizeof(date), "%T", localtime(&time)); 428 strftime(date, sizeof(date), "%T", localtime(&time));
426 stripped = gaim_markup_strip_html(message); 429 stripped = gaim_markup_strip_html(message);
427 fprintf(log->logger_data, "(%s) %s%s %s\n", date, from ? from : "", from ? ":" : "", stripped); 430 fprintf(log->logger_data, "(%s) %s%s %s\n", date, from ? from : "", from ? ":" : "", stripped);
428 fflush(log->logger_data); 431 fflush(log->logger_data);
429 g_free(stripped); 432 g_free(stripped);
447 return g_strdup("<font color='red'><b>log->logger_data was NULL!</b></font>"); 450 return g_strdup("<font color='red'><b>log->logger_data was NULL!</b></font>");
448 if (g_file_get_contents((char *)log->logger_data, &read, NULL, NULL)) { 451 if (g_file_get_contents((char *)log->logger_data, &read, NULL, NULL)) {
449 minus_header = strchr(read, '\n'); 452 minus_header = strchr(read, '\n');
450 if (!minus_header) 453 if (!minus_header)
451 minus_header = g_strdup(read); 454 minus_header = g_strdup(read);
452 else 455 else
453 minus_header = g_strdup(minus_header + 1); 456 minus_header = g_strdup(minus_header + 1);
454 g_free(read); 457 g_free(read);
455 return minus_header; 458 return minus_header;
456 } 459 }
457 return g_strdup(_("<font color='red'><b>Could not read file: %s</b></font>")); 460 return g_strdup(_("<font color='red'><b>Could not read file: %s</b></font>"));
458 } 461 }
459 462
460 static GaimLogLogger txt_logger = { 463 static GaimLogLogger txt_logger = {
461 N_("Plain text"), "txt", 464 N_("Plain text"), "txt",
462 NULL, 465 NULL,
463 txt_logger_write, 466 txt_logger_write,
478 char *path; 481 char *path;
479 int offset; 482 int offset;
480 int length; 483 int length;
481 }; 484 };
482 485
483 static GList *old_logger_list(const char *sn, GaimAccount *account) 486 static GList *old_logger_list(const char *sn, GaimAccount *account)
484 { 487 {
485 FILE *file; 488 FILE *file;
486 char buf[BUF_LONG]; 489 char buf[BUF_LONG];
487 struct tm tm; 490 struct tm tm;
488 struct old_logger_data *data = NULL; 491 struct old_logger_data *data = NULL;
495 GaimLog *log = NULL; 498 GaimLog *log = NULL;
496 GList *list = NULL; 499 GList *list = NULL;
497 500
498 if (!(file = fopen(path, "r"))) 501 if (!(file = fopen(path, "r")))
499 return NULL; 502 return NULL;
500 503
501 while (fgets(buf, BUF_LONG, file)) { 504 while (fgets(buf, BUF_LONG, file)) {
502 if ((newlog = strstr(buf, "---- New C"))) { 505 if ((newlog = strstr(buf, "---- New C"))) {
503 int length; 506 int length;
504 int offset; 507 int offset;
505 GDate gdate; 508 GDate gdate;
506 char convostart[32]; 509 char convostart[32];
507 char *temp = strchr(buf, '@'); 510 char *temp = strchr(buf, '@');
508 511
509 if (temp == NULL || strlen(temp) < 2) 512 if (temp == NULL || strlen(temp) < 2)
510 continue; 513 continue;
511 514
512 temp++; 515 temp++;
513 length = strcspn(temp, "-"); 516 length = strcspn(temp, "-");
514 if (length > 31) length = 31; 517 if (length > 31) length = 31;
515 518
516 offset = ftell(file); 519 offset = ftell(file);
517 520
518 if (data) { 521 if (data) {
519 data->length = offset - data->offset - length - 522 data->length = offset - data->offset - length;
520 strlen("<HR><BR><H3 Align=Center> ---- New Conversation @ ") - 523 if(strstr(buf, "----</H3><BR>")) {
521 strlen("----</H3><BR>"); 524 data->length -=
525 strlen("<HR><BR><H3 Align=Center> ---- New Conversation @ ") +
526 strlen("----</H3><BR>");
527 } else {
528 data->length -=
529 strlen("---- New Conversation @ ") + strlen("----");
530 }
531
522 if (data->length != 0) 532 if (data->length != 0)
523 list = g_list_append(list, log); 533 list = g_list_append(list, log);
524 else 534 else
525 gaim_log_free(log); 535 gaim_log_free(log);
526 } 536 }
527 537
528 log = gaim_log_new(GAIM_LOG_IM, sn, account, -1); 538 log = gaim_log_new(GAIM_LOG_IM, sn, account, -1);
529 log->logger = &old_logger; 539 log->logger = &old_logger;
530 540
531 data = g_malloc(sizeof(struct old_logger_data)); 541 data = g_new0(struct old_logger_data, 1);
532 data->offset = offset; 542 data->offset = offset;
533 data->path = path; 543 data->path = path;
534 log->logger_data = data; 544 log->logger_data = data;
535 545
536 546
537 g_snprintf(convostart, length, "%s", temp); 547 g_snprintf(convostart, length, "%s", temp);
538 sscanf(convostart, "%*s %s %s %d:%d:%d %s", 548 sscanf(convostart, "%*s %s %s %d:%d:%d %s",
539 month, day, &tm.tm_hour, &tm.tm_min, &tm.tm_sec, year); 549 month, day, &tm.tm_hour, &tm.tm_min, &tm.tm_sec, year);
540 date = g_strdup_printf("%s %s %s", month, day, year); 550 date = g_strdup_printf("%s %s %s", month, day, year);
541 g_date_set_parse(&gdate, date); 551 g_date_set_parse(&gdate, date);
550 return list; 560 return list;
551 } 561 }
552 562
553 char * old_logger_read (GaimLog *log, GaimLogReadFlags *flags) 563 char * old_logger_read (GaimLog *log, GaimLogReadFlags *flags)
554 { 564 {
555 *flags = GAIM_LOG_READ_NO_NEWLINE;
556 struct old_logger_data *data = log->logger_data; 565 struct old_logger_data *data = log->logger_data;
557 FILE *file = fopen(data->path, "r"); 566 FILE *file = fopen(data->path, "r");
558 char *read = g_malloc(data->length + 1); 567 char *read = g_malloc(data->length + 1);
559 fseek(file, data->offset, SEEK_SET); 568 fseek(file, data->offset, SEEK_SET);
560 fread(read, data->length, 1, file); 569 fread(read, data->length, 1, file);
561 read[data->length] = '\0'; 570 read[data->length] = '\0';
571 *flags = 0;
572 if(strstr(read, "<BR>"))
573 *flags |= GAIM_LOG_READ_NO_NEWLINE;
562 return read; 574 return read;
563 } 575 }
564 576
565 static GaimLogLogger old_logger = { 577 static GaimLogLogger old_logger = {
566 "old logger", "old", 578 "old logger", "old",