Mercurial > pidgin
comparison src/log.c @ 8898:de87e510ff9a
[gaim-migrate @ 9667]
This makes the history plugin work in chats and not just conversations.
To do this I had to change some functions in log.c to pass around the
GaimLogType (GAIM_LOG_IM, GAIM_LOG_CHAT, or GAIM_LOG_SYSTEM). I hope
that's not a problem...
Here's how I see it:
When creating a new GaimLog you need 3 things, the type, your account
and the name of the other person/chat.
It only makes sense that you would need those same 3 things to find a
log. Or to calculate log size.
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Fri, 07 May 2004 02:30:02 +0000 |
| parents | 4aee5a47937d |
| children | db95a6641ec1 |
comparison
equal
deleted
inserted
replaced
| 8897:8ffd1679df93 | 8898:de87e510ff9a |
|---|---|
| 130 { | 130 { |
| 131 g_free(lu->name); | 131 g_free(lu->name); |
| 132 g_free(lu); | 132 g_free(lu); |
| 133 } | 133 } |
| 134 | 134 |
| 135 int gaim_log_get_total_size(const char *name, GaimAccount *account) | 135 int gaim_log_get_total_size(GaimLogType type, const char *name, GaimAccount *account) |
| 136 { | 136 { |
| 137 int size; | 137 int size; |
| 138 GSList *n; | 138 GSList *n; |
| 139 struct _gaim_logsize_user *lu; | 139 struct _gaim_logsize_user *lu; |
| 140 | 140 |
| 148 } else { | 148 } else { |
| 149 for (n = loggers; n; n = n->next) { | 149 for (n = loggers; n; n = n->next) { |
| 150 GaimLogLogger *logger = n->data; | 150 GaimLogLogger *logger = n->data; |
| 151 | 151 |
| 152 if(logger->total_size){ | 152 if(logger->total_size){ |
| 153 size += (logger->total_size)(name, account); | 153 size += (logger->total_size)(type, name, account); |
| 154 } else if(logger->list) { | 154 } else if(logger->list) { |
| 155 GList *logs = (logger->list)(name, account); | 155 GList *logs = (logger->list)(type, name, account); |
| 156 int this_size = 0; | 156 int this_size = 0; |
| 157 | 157 |
| 158 while (logs) { | 158 while (logs) { |
| 159 GList *logs2 = logs->next; | 159 GList *logs2 = logs->next; |
| 160 GaimLog *log = (GaimLog*)(logs->data); | 160 GaimLog *log = (GaimLog*)(logs->data); |
| 194 } | 194 } |
| 195 gaim_log_logger_set(&txt_logger); | 195 gaim_log_logger_set(&txt_logger); |
| 196 } | 196 } |
| 197 | 197 |
| 198 | 198 |
| 199 GaimLogLogger *gaim_log_logger_new(void(*create)(GaimLog *), | 199 GaimLogLogger *gaim_log_logger_new( |
| 200 void(*write)(GaimLog *, GaimMessageFlags, const char *, | 200 void(*create)(GaimLog *), |
| 201 time_t, const char *), | 201 void(*write)(GaimLog *, GaimMessageFlags, const char *, time_t, const char *), |
| 202 void(*finalize)(GaimLog *), GList*(*list)(const char*, GaimAccount*), | 202 void(*finalize)(GaimLog *), |
| 203 char*(*read)(GaimLog*, GaimLogReadFlags*), | 203 GList*(*list)(GaimLogType type, const char*, GaimAccount*), |
| 204 int(*size)(GaimLog*)) | 204 char*(*read)(GaimLog*, GaimLogReadFlags*), |
| 205 int(*size)(GaimLog*)) | |
| 205 { | 206 { |
| 206 GaimLogLogger *logger = g_new0(GaimLogLogger, 1); | 207 GaimLogLogger *logger = g_new0(GaimLogLogger, 1); |
| 207 logger->create = create; | 208 logger->create = create; |
| 208 logger->write = write; | 209 logger->write = write; |
| 209 logger->finalize = finalize; | 210 logger->finalize = finalize; |
| 266 const GaimLog *b = z; | 267 const GaimLog *b = z; |
| 267 | 268 |
| 268 return b->time - a->time; | 269 return b->time - a->time; |
| 269 } | 270 } |
| 270 | 271 |
| 271 GList *gaim_log_get_logs(const char *name, GaimAccount *account) | 272 GList *gaim_log_get_logs(GaimLogType type, const char *name, GaimAccount *account) |
| 272 { | 273 { |
| 273 GList *logs = NULL; | 274 GList *logs = NULL; |
| 274 GSList *n; | 275 GSList *n; |
| 275 for (n = loggers; n; n = n->next) { | 276 for (n = loggers; n; n = n->next) { |
| 276 GaimLogLogger *logger = n->data; | 277 GaimLogLogger *logger = n->data; |
| 277 if (!logger->list) | 278 if (!logger->list) |
| 278 continue; | 279 continue; |
| 279 logs = g_list_concat(logs, logger->list(name, account)); | 280 logs = g_list_concat(logs, logger->list(type, name, account)); |
| 280 } | 281 } |
| 281 | 282 |
| 282 return g_list_sort(logs, gaim_log_compare); | 283 return g_list_sort(logs, gaim_log_compare); |
| 283 } | 284 } |
| 284 | 285 |
| 327 struct generic_logger_data { | 328 struct generic_logger_data { |
| 328 char *path; | 329 char *path; |
| 329 FILE *file; | 330 FILE *file; |
| 330 }; | 331 }; |
| 331 | 332 |
| 332 static GList *log_lister_common(const char *screenname, GaimAccount *account, const char *ext, GaimLogLogger *logger) | 333 static GList *log_lister_common(GaimLogType type, const char *name, GaimAccount *account, const char *ext, GaimLogLogger *logger) |
| 333 { | 334 { |
| 334 GDir *dir; | 335 GDir *dir; |
| 335 GList *list = NULL; | 336 GList *list = NULL; |
| 336 const char *filename; | 337 const char *filename; |
| 337 char *me; | 338 char *me; |
| 338 | |
| 339 const char *prpl; | 339 const char *prpl; |
| 340 char *path; | 340 char *path; |
| 341 | 341 |
| 342 if(!account) | 342 if(!account) |
| 343 return NULL; | 343 return NULL; |
| 344 | 344 |
| 345 me = g_strdup(gaim_normalize(account, gaim_account_get_username(account))); | 345 if (type == GAIM_LOG_CHAT) |
| 346 me = g_strdup_printf("%s.chat", gaim_normalize(account, gaim_account_get_username(account))); | |
| 347 else | |
| 348 me = g_strdup(gaim_normalize(account, gaim_account_get_username(account))); | |
| 346 | 349 |
| 347 /* does this seem like a bad way to get this component of the path to anyone else? --Nathan */ | 350 /* does this seem like a bad way to get this component of the path to anyone else? --Nathan */ |
| 348 prpl = GAIM_PLUGIN_PROTOCOL_INFO | 351 prpl = GAIM_PLUGIN_PROTOCOL_INFO |
| 349 (gaim_find_prpl(gaim_account_get_protocol_id(account)))->list_icon(account, NULL); | 352 (gaim_find_prpl(gaim_account_get_protocol_id(account)))->list_icon(account, NULL); |
| 350 path = g_build_filename(gaim_user_dir(), "logs", prpl, me, gaim_normalize(account, screenname), NULL); | 353 path = g_build_filename(gaim_user_dir(), "logs", prpl, me, gaim_normalize(account, name), NULL); |
| 351 g_free(me); | 354 g_free(me); |
| 352 | 355 |
| 353 if (!(dir = g_dir_open(path, 0, NULL))) { | 356 if (!(dir = g_dir_open(path, 0, NULL))) { |
| 354 g_free(path); | 357 g_free(path); |
| 355 return NULL; | 358 return NULL; |
| 356 } | 359 } |
| 360 | |
| 357 while ((filename = g_dir_read_name(dir))) { | 361 while ((filename = g_dir_read_name(dir))) { |
| 358 if (gaim_str_has_suffix(filename, ext) && | 362 if (gaim_str_has_suffix(filename, ext) && |
| 359 strlen(filename) == 17 + strlen(ext)) { | 363 strlen(filename) == 17 + strlen(ext)) { |
| 360 GaimLog *log; | 364 GaimLog *log; |
| 361 struct generic_logger_data *data; | 365 struct generic_logger_data *data; |
| 362 time_t stamp = gaim_str_to_time(filename, FALSE); | 366 time_t stamp = gaim_str_to_time(filename, FALSE); |
| 363 | 367 |
| 364 log = gaim_log_new(GAIM_LOG_IM, screenname, account, stamp); | 368 log = gaim_log_new(type, name, account, stamp); |
| 365 log->logger = logger; | 369 log->logger = logger; |
| 366 log->logger_data = data = g_new0(struct generic_logger_data, 1); | 370 log->logger_data = data = g_new0(struct generic_logger_data, 1); |
| 367 data->path = g_build_filename(path, filename, NULL); | 371 data->path = g_build_filename(path, filename, NULL); |
| 368 list = g_list_append(list, log); | 372 list = g_list_append(list, log); |
| 369 } | 373 } |
| 412 char *guy = g_strdup(gaim_normalize(log->account, gaim_account_get_username(log->account))); | 416 char *guy = g_strdup(gaim_normalize(log->account, gaim_account_get_username(log->account))); |
| 413 const char *prpl = GAIM_PLUGIN_PROTOCOL_INFO | 417 const char *prpl = GAIM_PLUGIN_PROTOCOL_INFO |
| 414 (gaim_find_prpl(gaim_account_get_protocol(log->account)))->list_icon(log->account, NULL); | 418 (gaim_find_prpl(gaim_account_get_protocol(log->account)))->list_icon(log->account, NULL); |
| 415 char *dir; | 419 char *dir; |
| 416 FILE *file; | 420 FILE *file; |
| 421 | |
| 422 if (log->type == GAIM_LOG_CHAT) { | |
| 423 char *chat = g_strdup_printf("%s.chat", guy); | |
| 424 g_free(guy); | |
| 425 guy = chat; | |
| 426 } | |
| 417 | 427 |
| 418 strftime(date, sizeof(date), "%Y-%m-%d.%H%M%S.xml", localtime(&log->time)); | 428 strftime(date, sizeof(date), "%Y-%m-%d.%H%M%S.xml", localtime(&log->time)); |
| 419 | 429 |
| 420 dir = g_build_filename(ud, "logs", | 430 dir = g_build_filename(ud, "logs", |
| 421 prpl, guy, gaim_normalize(log->account, log->name), NULL); | 431 prpl, guy, gaim_normalize(log->account, log->name), NULL); |
| 465 fclose(log->logger_data); | 475 fclose(log->logger_data); |
| 466 log->logger_data = NULL; | 476 log->logger_data = NULL; |
| 467 } | 477 } |
| 468 } | 478 } |
| 469 | 479 |
| 470 static GList *xml_logger_list(const char *sn, GaimAccount *account) | 480 static GList *xml_logger_list(GaimLogType type, const char *sn, GaimAccount *account) |
| 471 { | 481 { |
| 472 return log_lister_common(sn, account, ".xml", &xml_logger); | 482 return log_lister_common(type, sn, account, ".xml", &xml_logger); |
| 473 } | 483 } |
| 474 | 484 |
| 475 static GaimLogLogger xml_logger = { | 485 static GaimLogLogger xml_logger = { |
| 476 N_("XML"), "xml", | 486 N_("XML"), "xml", |
| 477 NULL, | 487 NULL, |
| 593 g_free(data->path); | 603 g_free(data->path); |
| 594 g_free(data); | 604 g_free(data); |
| 595 } | 605 } |
| 596 } | 606 } |
| 597 | 607 |
| 598 static GList *html_logger_list(const char *sn, GaimAccount *account) | 608 static GList *html_logger_list(GaimLogType type, const char *sn, GaimAccount *account) |
| 599 { | 609 { |
| 600 return log_lister_common(sn, account, ".html", &html_logger); | 610 return log_lister_common(type, sn, account, ".html", &html_logger); |
| 601 } | 611 } |
| 602 | 612 |
| 603 static GList *html_logger_list_syslog(GaimAccount *account) | 613 static GList *html_logger_list_syslog(GaimAccount *account) |
| 604 { | 614 { |
| 605 return log_lister_common(".system", account, ".html", &html_logger); | 615 return log_lister_common(GAIM_LOG_SYSTEM, ".system", account, ".html", &html_logger); |
| 606 } | 616 } |
| 607 | 617 |
| 608 static char *html_logger_read(GaimLog *log, GaimLogReadFlags *flags) | 618 static char *html_logger_read(GaimLog *log, GaimLogReadFlags *flags) |
| 609 { | 619 { |
| 610 char *read, *minus_header; | 620 char *read, *minus_header; |
| 686 if (!data) { | 696 if (!data) { |
| 687 /* This log is new. We could use the loggers 'new' function, but | 697 /* This log is new. We could use the loggers 'new' function, but |
| 688 * creating a new file there would result in empty files in the case | 698 * creating a new file there would result in empty files in the case |
| 689 * that you open a convo with someone, but don't say anything. | 699 * that you open a convo with someone, but don't say anything. |
| 690 * | 700 * |
| 691 * The log is also not system log. Because if it is, data would be | 701 * The log is also not a system log. Because if it is, data would |
| 692 * created in txt_logger_create | 702 * be created in txt_logger_create |
| 693 */ | 703 */ |
| 694 char *ud = gaim_user_dir(); | 704 char *ud = gaim_user_dir(); |
| 695 char *filename; | |
| 696 char *guy = g_strdup(gaim_normalize(log->account, gaim_account_get_username(log->account))); | 705 char *guy = g_strdup(gaim_normalize(log->account, gaim_account_get_username(log->account))); |
| 697 char *chat; | 706 char *chat; |
| 698 const char *prpl = GAIM_PLUGIN_PROTOCOL_INFO | 707 const char *prpl = GAIM_PLUGIN_PROTOCOL_INFO |
| 699 (gaim_find_prpl(gaim_account_get_protocol_id(log->account)))->list_icon(log->account, NULL); | 708 (gaim_find_prpl(gaim_account_get_protocol_id(log->account)))->list_icon(log->account, NULL); |
| 700 char *dir; | 709 char *dir; |
| 710 char *filename; | |
| 701 | 711 |
| 702 if (log->type == GAIM_LOG_CHAT) { | 712 if (log->type == GAIM_LOG_CHAT) { |
| 703 chat = g_strdup_printf("%s.chat", guy); | 713 chat = g_strdup_printf("%s.chat", guy); |
| 704 g_free(guy); | 714 g_free(guy); |
| 705 guy = chat; | 715 guy = chat; |
| 706 } | 716 } |
| 717 | |
| 707 strftime(date, sizeof(date), "%Y-%m-%d.%H%M%S.txt", localtime(&log->time)); | 718 strftime(date, sizeof(date), "%Y-%m-%d.%H%M%S.txt", localtime(&log->time)); |
| 708 | 719 |
| 709 dir = g_build_filename(ud, "logs", | 720 dir = g_build_filename(ud, "logs", |
| 710 prpl, guy, gaim_normalize(log->account, log->name), NULL); | 721 prpl, guy, gaim_normalize(log->account, log->name), NULL); |
| 711 gaim_build_dir (dir, S_IRUSR | S_IWUSR | S_IXUSR); | 722 gaim_build_dir (dir, S_IRUSR | S_IWUSR | S_IXUSR); |
| 779 g_free(data->path); | 790 g_free(data->path); |
| 780 g_free(data); | 791 g_free(data); |
| 781 } | 792 } |
| 782 } | 793 } |
| 783 | 794 |
| 784 static GList *txt_logger_list(const char *sn, GaimAccount *account) | 795 static GList *txt_logger_list(GaimLogType type, const char *sn, GaimAccount *account) |
| 785 { | 796 { |
| 786 return log_lister_common(sn, account, ".txt", &txt_logger); | 797 return log_lister_common(type, sn, account, ".txt", &txt_logger); |
| 787 } | 798 } |
| 788 | 799 |
| 789 static GList *txt_logger_list_syslog(GaimAccount *account) | 800 static GList *txt_logger_list_syslog(GaimAccount *account) |
| 790 { | 801 { |
| 791 return log_lister_common(".system", account, ".txt", &txt_logger); | 802 return log_lister_common(GAIM_LOG_SYSTEM, ".system", account, ".txt", &txt_logger); |
| 792 } | 803 } |
| 793 | 804 |
| 794 static char *txt_logger_read(GaimLog *log, GaimLogReadFlags *flags) | 805 static char *txt_logger_read(GaimLog *log, GaimLogReadFlags *flags) |
| 795 { | 806 { |
| 796 char *read, *minus_header, *minus_header2; | 807 char *read, *minus_header, *minus_header2; |
| 865 GaimStringref *pathref; | 876 GaimStringref *pathref; |
| 866 int offset; | 877 int offset; |
| 867 int length; | 878 int length; |
| 868 }; | 879 }; |
| 869 | 880 |
| 870 static GList *old_logger_list(const char *sn, GaimAccount *account) | 881 static GList *old_logger_list(GaimLogType type, const char *sn, GaimAccount *account) |
| 871 { | 882 { |
| 872 FILE *file; | 883 FILE *file; |
| 873 char buf[BUF_LONG]; | 884 char buf[BUF_LONG]; |
| 874 struct tm tm; | 885 struct tm tm; |
| 875 char month[4]; | 886 char month[4]; |
| 991 gaim_stringref_unref(pathref); | 1002 gaim_stringref_unref(pathref); |
| 992 fclose(file); | 1003 fclose(file); |
| 993 return list; | 1004 return list; |
| 994 } | 1005 } |
| 995 | 1006 |
| 996 static int old_logger_total_size(const char *name, GaimAccount *account) | 1007 static int old_logger_total_size(GaimLogType type, const char *name, GaimAccount *account) |
| 997 { | 1008 { |
| 998 char *logfile = g_strdup_printf("%s.log", gaim_normalize(account, name)); | 1009 char *logfile = g_strdup_printf("%s.log", gaim_normalize(account, name)); |
| 999 char *pathstr = g_build_filename(gaim_user_dir(), "logs", logfile, NULL); | 1010 char *pathstr = g_build_filename(gaim_user_dir(), "logs", logfile, NULL); |
| 1000 int size; | 1011 int size; |
| 1001 struct stat st; | 1012 struct stat st; |
