Mercurial > pidgin
comparison src/log.c @ 13059:1b71ad2eccdb
[gaim-migrate @ 15421]
At work, my home directory and all my logs live on a network share. Talking with someone wtih a lot of log files has gotten incredibly painful with sort-by-log turned on. This keeps us from constantly re-scanning 80 gazillion log files to find out if they're the same size.
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Sat, 28 Jan 2006 05:42:38 +0000 |
parents | b98a28bf29d9 |
children | 78fa9502715b |
comparison
equal
deleted
inserted
replaced
13058:256abf4dd912 | 13059:1b71ad2eccdb |
---|---|
43 }; | 43 }; |
44 static GHashTable *logsize_users = NULL; | 44 static GHashTable *logsize_users = NULL; |
45 | 45 |
46 static void log_get_log_sets_common(GHashTable *sets); | 46 static void log_get_log_sets_common(GHashTable *sets); |
47 | 47 |
48 static void html_logger_write(GaimLog *log, GaimMessageFlags type, | 48 static gsize html_logger_write(GaimLog *log, GaimMessageFlags type, |
49 const char *from, time_t time, const char *message); | 49 const char *from, time_t time, const char *message); |
50 static void html_logger_finalize(GaimLog *log); | 50 static void html_logger_finalize(GaimLog *log); |
51 static GList *html_logger_list(GaimLogType type, const char *sn, GaimAccount *account); | 51 static GList *html_logger_list(GaimLogType type, const char *sn, GaimAccount *account); |
52 static GList *html_logger_list_syslog(GaimAccount *account); | 52 static GList *html_logger_list_syslog(GaimAccount *account); |
53 static char *html_logger_read(GaimLog *log, GaimLogReadFlags *flags); | 53 static char *html_logger_read(GaimLog *log, GaimLogReadFlags *flags); |
57 static char * old_logger_read (GaimLog *log, GaimLogReadFlags *flags); | 57 static char * old_logger_read (GaimLog *log, GaimLogReadFlags *flags); |
58 static int old_logger_size (GaimLog *log); | 58 static int old_logger_size (GaimLog *log); |
59 static void old_logger_get_log_sets(GaimLogSetCallback cb, GHashTable *sets); | 59 static void old_logger_get_log_sets(GaimLogSetCallback cb, GHashTable *sets); |
60 static void old_logger_finalize(GaimLog *log); | 60 static void old_logger_finalize(GaimLog *log); |
61 | 61 |
62 static void txt_logger_write(GaimLog *log, | 62 static gsize txt_logger_write(GaimLog *log, |
63 GaimMessageFlags type, | 63 GaimMessageFlags type, |
64 const char *from, time_t time, const char *message); | 64 const char *from, time_t time, const char *message); |
65 static void txt_logger_finalize(GaimLog *log); | 65 static void txt_logger_finalize(GaimLog *log); |
66 static GList *txt_logger_list(GaimLogType type, const char *sn, GaimAccount *account); | 66 static GList *txt_logger_list(GaimLogType type, const char *sn, GaimAccount *account); |
67 static GList *txt_logger_list_syslog(GaimAccount *account); | 67 static GList *txt_logger_list_syslog(GaimAccount *account); |
98 | 98 |
99 void gaim_log_write(GaimLog *log, GaimMessageFlags type, | 99 void gaim_log_write(GaimLog *log, GaimMessageFlags type, |
100 const char *from, time_t time, const char *message) | 100 const char *from, time_t time, const char *message) |
101 { | 101 { |
102 struct _gaim_logsize_user *lu; | 102 struct _gaim_logsize_user *lu; |
103 gsize written, total = 0; | |
104 gpointer ptrsize; | |
103 | 105 |
104 g_return_if_fail(log); | 106 g_return_if_fail(log); |
105 g_return_if_fail(log->logger); | 107 g_return_if_fail(log->logger); |
106 g_return_if_fail(log->logger->write); | 108 g_return_if_fail(log->logger->write); |
107 | 109 |
108 (log->logger->write)(log, type, from, time, message); | 110 written = (log->logger->write)(log, type, from, time, message); |
109 | 111 |
110 lu = g_new(struct _gaim_logsize_user, 1); | 112 lu = g_new(struct _gaim_logsize_user, 1); |
111 | 113 |
112 lu->name = g_strdup(gaim_normalize(log->account, log->name)); | 114 lu->name = g_strdup(gaim_normalize(log->account, log->name)); |
113 lu->account = log->account; | 115 lu->account = log->account; |
114 g_hash_table_remove(logsize_users, lu); | 116 |
117 if(g_hash_table_lookup_extended(logsize_users, lu, NULL, &ptrsize)) { | |
118 total = GPOINTER_TO_INT(ptrsize); | |
119 total += written; | |
120 g_hash_table_replace(logsize_users, lu, GINT_TO_POINTER(total)); | |
121 } | |
122 | |
115 g_free(lu->name); | 123 g_free(lu->name); |
116 g_free(lu); | 124 g_free(lu); |
117 | 125 |
118 } | 126 } |
119 | 127 |
906 | 914 |
907 /**************************** | 915 /**************************** |
908 ** HTML LOGGER ************* | 916 ** HTML LOGGER ************* |
909 ****************************/ | 917 ****************************/ |
910 | 918 |
911 static void html_logger_write(GaimLog *log, GaimMessageFlags type, | 919 static gsize html_logger_write(GaimLog *log, GaimMessageFlags type, |
912 const char *from, time_t time, const char *message) | 920 const char *from, time_t time, const char *message) |
913 { | 921 { |
914 char *msg_fixed; | 922 char *msg_fixed; |
915 char *date; | 923 char *date; |
916 GaimPlugin *plugin = gaim_find_prpl(gaim_account_get_protocol_id(log->account)); | 924 GaimPlugin *plugin = gaim_find_prpl(gaim_account_get_protocol_id(log->account)); |
917 GaimLogCommonLoggerData *data = log->logger_data; | 925 GaimLogCommonLoggerData *data = log->logger_data; |
926 gsize written = 0; | |
918 | 927 |
919 if(!data) { | 928 if(!data) { |
920 char buf[64]; | 929 char buf[64]; |
921 const char *prpl = | 930 const char *prpl = |
922 GAIM_PLUGIN_PROTOCOL_INFO(plugin)->list_icon(log->account, NULL); | 931 GAIM_PLUGIN_PROTOCOL_INFO(plugin)->list_icon(log->account, NULL); |
924 | 933 |
925 data = log->logger_data; | 934 data = log->logger_data; |
926 | 935 |
927 /* if we can't write to the file, give up before we hurt ourselves */ | 936 /* if we can't write to the file, give up before we hurt ourselves */ |
928 if(!data->file) | 937 if(!data->file) |
929 return; | 938 return 0; |
930 | 939 |
931 strftime(buf, sizeof(buf), "%c", localtime(&log->time)); | 940 strftime(buf, sizeof(buf), "%c", localtime(&log->time)); |
932 fprintf(data->file, "<html><head>"); | 941 written += fprintf(data->file, "<html><head>"); |
933 fprintf(data->file, "<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">"); | 942 written += fprintf(data->file, "<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">"); |
934 fprintf(data->file, "<title>"); | 943 written += fprintf(data->file, "<title>"); |
935 fprintf(data->file, "Conversation with %s at %s on %s (%s)", | 944 written += fprintf(data->file, "Conversation with %s at %s on %s (%s)", |
936 log->name, buf, gaim_account_get_username(log->account), prpl); | 945 log->name, buf, gaim_account_get_username(log->account), prpl); |
937 fprintf(data->file, "</title></head><body>"); | 946 written += fprintf(data->file, "</title></head><body>"); |
938 fprintf(data->file, | 947 written += fprintf(data->file, |
939 "<h3>Conversation with %s at %s on %s (%s)</h3>\n", | 948 "<h3>Conversation with %s at %s on %s (%s)</h3>\n", |
940 log->name, buf, gaim_account_get_username(log->account), prpl); | 949 log->name, buf, gaim_account_get_username(log->account), prpl); |
941 } | 950 } |
942 | 951 |
943 /* if we can't write to the file, give up before we hurt ourselves */ | 952 /* if we can't write to the file, give up before we hurt ourselves */ |
944 if(!data->file) | 953 if(!data->file) |
945 return; | 954 return 0; |
946 | 955 |
947 gaim_markup_html_to_xhtml(message, &msg_fixed, NULL); | 956 gaim_markup_html_to_xhtml(message, &msg_fixed, NULL); |
948 date = log_get_timestamp(log, time); | 957 date = log_get_timestamp(log, time); |
949 | 958 |
950 if(log->type == GAIM_LOG_SYSTEM){ | 959 if(log->type == GAIM_LOG_SYSTEM){ |
951 fprintf(data->file, "---- %s @ %s ----<br/>\n", msg_fixed, date); | 960 written += fprintf(data->file, "---- %s @ %s ----<br/>\n", msg_fixed, date); |
952 } else { | 961 } else { |
953 if (type & GAIM_MESSAGE_SYSTEM) | 962 if (type & GAIM_MESSAGE_SYSTEM) |
954 fprintf(data->file, "<font size=\"2\">(%s)</font><b> %s</b><br/>\n", date, msg_fixed); | 963 written += fprintf(data->file, "<font size=\"2\">(%s)</font><b> %s</b><br/>\n", date, msg_fixed); |
955 else if (type & GAIM_MESSAGE_WHISPER) | 964 else if (type & GAIM_MESSAGE_WHISPER) |
956 fprintf(data->file, "<font color=\"#6C2585\"><font size=\"2\">(%s)</font><b> %s:</b></font> %s<br/>\n", | 965 written += fprintf(data->file, "<font color=\"#6C2585\"><font size=\"2\">(%s)</font><b> %s:</b></font> %s<br/>\n", |
957 date, from, msg_fixed); | 966 date, from, msg_fixed); |
958 else if (type & GAIM_MESSAGE_AUTO_RESP) { | 967 else if (type & GAIM_MESSAGE_AUTO_RESP) { |
959 if (type & GAIM_MESSAGE_SEND) | 968 if (type & GAIM_MESSAGE_SEND) |
960 fprintf(data->file, _("<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s <AUTO-REPLY>:</b></font> %s<br/>\n"), date, from, msg_fixed); | 969 written += fprintf(data->file, _("<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s <AUTO-REPLY>:</b></font> %s<br/>\n"), date, from, msg_fixed); |
961 else if (type & GAIM_MESSAGE_RECV) | 970 else if (type & GAIM_MESSAGE_RECV) |
962 fprintf(data->file, _("<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s <AUTO-REPLY>:</b></font> %s<br/>\n"), date, from, msg_fixed); | 971 written += fprintf(data->file, _("<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s <AUTO-REPLY>:</b></font> %s<br/>\n"), date, from, msg_fixed); |
963 } else if (type & GAIM_MESSAGE_RECV) { | 972 } else if (type & GAIM_MESSAGE_RECV) { |
964 if(gaim_message_meify(msg_fixed, -1)) | 973 if(gaim_message_meify(msg_fixed, -1)) |
965 fprintf(data->file, "<font color=\"#062585\"><font size=\"2\">(%s)</font> <b>***%s</b></font> %s<br/>\n", | 974 written += fprintf(data->file, "<font color=\"#062585\"><font size=\"2\">(%s)</font> <b>***%s</b></font> %s<br/>\n", |
966 date, from, msg_fixed); | 975 date, from, msg_fixed); |
967 else | 976 else |
968 fprintf(data->file, "<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s:</b></font> %s<br/>\n", | 977 written += fprintf(data->file, "<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s:</b></font> %s<br/>\n", |
969 date, from, msg_fixed); | 978 date, from, msg_fixed); |
970 } else if (type & GAIM_MESSAGE_SEND) { | 979 } else if (type & GAIM_MESSAGE_SEND) { |
971 if(gaim_message_meify(msg_fixed, -1)) | 980 if(gaim_message_meify(msg_fixed, -1)) |
972 fprintf(data->file, "<font color=\"#062585\"><font size=\"2\">(%s)</font> <b>***%s</b></font> %s<br/>\n", | 981 written += fprintf(data->file, "<font color=\"#062585\"><font size=\"2\">(%s)</font> <b>***%s</b></font> %s<br/>\n", |
973 date, from, msg_fixed); | 982 date, from, msg_fixed); |
974 else | 983 else |
975 fprintf(data->file, "<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s:</b></font> %s<br/>\n", | 984 written += fprintf(data->file, "<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s:</b></font> %s<br/>\n", |
976 date, from, msg_fixed); | 985 date, from, msg_fixed); |
977 } | 986 } |
978 } | 987 } |
979 g_free(date); | 988 g_free(date); |
980 g_free(msg_fixed); | 989 g_free(msg_fixed); |
981 fflush(data->file); | 990 fflush(data->file); |
991 | |
992 return written; | |
982 } | 993 } |
983 | 994 |
984 static void html_logger_finalize(GaimLog *log) | 995 static void html_logger_finalize(GaimLog *log) |
985 { | 996 { |
986 GaimLogCommonLoggerData *data = log->logger_data; | 997 GaimLogCommonLoggerData *data = log->logger_data; |
1029 | 1040 |
1030 /**************************** | 1041 /**************************** |
1031 ** PLAIN TEXT LOGGER ******* | 1042 ** PLAIN TEXT LOGGER ******* |
1032 ****************************/ | 1043 ****************************/ |
1033 | 1044 |
1034 static void txt_logger_write(GaimLog *log, | 1045 static gsize txt_logger_write(GaimLog *log, |
1035 GaimMessageFlags type, | 1046 GaimMessageFlags type, |
1036 const char *from, time_t time, const char *message) | 1047 const char *from, time_t time, const char *message) |
1037 { | 1048 { |
1038 char *date; | 1049 char *date; |
1039 GaimPlugin *plugin = gaim_find_prpl(gaim_account_get_protocol_id(log->account)); | 1050 GaimPlugin *plugin = gaim_find_prpl(gaim_account_get_protocol_id(log->account)); |
1040 GaimLogCommonLoggerData *data = log->logger_data; | 1051 GaimLogCommonLoggerData *data = log->logger_data; |
1041 char *stripped = NULL; | 1052 char *stripped = NULL; |
1053 | |
1054 gsize written = 0; | |
1042 | 1055 |
1043 if (data == NULL) { | 1056 if (data == NULL) { |
1044 /* This log is new. We could use the loggers 'new' function, but | 1057 /* This log is new. We could use the loggers 'new' function, but |
1045 * creating a new file there would result in empty files in the case | 1058 * creating a new file there would result in empty files in the case |
1046 * that you open a convo with someone, but don't say anything. | 1059 * that you open a convo with someone, but don't say anything. |
1052 | 1065 |
1053 data = log->logger_data; | 1066 data = log->logger_data; |
1054 | 1067 |
1055 /* if we can't write to the file, give up before we hurt ourselves */ | 1068 /* if we can't write to the file, give up before we hurt ourselves */ |
1056 if(!data->file) | 1069 if(!data->file) |
1057 return; | 1070 return 0; |
1058 | 1071 |
1059 strftime(buf, sizeof(buf), "%c", localtime(&log->time)); | 1072 strftime(buf, sizeof(buf), "%c", localtime(&log->time)); |
1060 fprintf(data->file, "Conversation with %s at %s on %s (%s)\n", | 1073 written += fprintf(data->file, "Conversation with %s at %s on %s (%s)\n", |
1061 log->name, buf, gaim_account_get_username(log->account), prpl); | 1074 log->name, buf, gaim_account_get_username(log->account), prpl); |
1062 } | 1075 } |
1063 | 1076 |
1064 /* if we can't write to the file, give up before we hurt ourselves */ | 1077 /* if we can't write to the file, give up before we hurt ourselves */ |
1065 if(!data->file) | 1078 if(!data->file) |
1066 return; | 1079 return 0; |
1067 | 1080 |
1068 stripped = gaim_markup_strip_html(message); | 1081 stripped = gaim_markup_strip_html(message); |
1069 date = log_get_timestamp(log, time); | 1082 date = log_get_timestamp(log, time); |
1070 | 1083 |
1071 if(log->type == GAIM_LOG_SYSTEM){ | 1084 if(log->type == GAIM_LOG_SYSTEM){ |
1072 fprintf(data->file, "---- %s @ %s ----\n", stripped, date); | 1085 written += fprintf(data->file, "---- %s @ %s ----\n", stripped, date); |
1073 } else { | 1086 } else { |
1074 if (type & GAIM_MESSAGE_SEND || | 1087 if (type & GAIM_MESSAGE_SEND || |
1075 type & GAIM_MESSAGE_RECV) { | 1088 type & GAIM_MESSAGE_RECV) { |
1076 if (type & GAIM_MESSAGE_AUTO_RESP) { | 1089 if (type & GAIM_MESSAGE_AUTO_RESP) { |
1077 fprintf(data->file, _("(%s) %s <AUTO-REPLY>: %s\n"), date, | 1090 written += fprintf(data->file, _("(%s) %s <AUTO-REPLY>: %s\n"), date, |
1078 from, stripped); | 1091 from, stripped); |
1079 } else { | 1092 } else { |
1080 if(gaim_message_meify(stripped, -1)) | 1093 if(gaim_message_meify(stripped, -1)) |
1081 fprintf(data->file, "(%s) ***%s %s\n", date, from, | 1094 written += fprintf(data->file, "(%s) ***%s %s\n", date, from, |
1082 stripped); | 1095 stripped); |
1083 else | 1096 else |
1084 fprintf(data->file, "(%s) %s: %s\n", date, from, | 1097 written += fprintf(data->file, "(%s) %s: %s\n", date, from, |
1085 stripped); | 1098 stripped); |
1086 } | 1099 } |
1087 } else if (type & GAIM_MESSAGE_SYSTEM) | 1100 } else if (type & GAIM_MESSAGE_SYSTEM) |
1088 fprintf(data->file, "(%s) %s\n", date, stripped); | 1101 written += fprintf(data->file, "(%s) %s\n", date, stripped); |
1089 else if (type & GAIM_MESSAGE_NO_LOG) { | 1102 else if (type & GAIM_MESSAGE_NO_LOG) { |
1090 /* This shouldn't happen */ | 1103 /* This shouldn't happen */ |
1091 g_free(stripped); | 1104 g_free(stripped); |
1092 return; | 1105 return written; |
1093 } else if (type & GAIM_MESSAGE_WHISPER) | 1106 } else if (type & GAIM_MESSAGE_WHISPER) |
1094 fprintf(data->file, "(%s) *%s* %s", date, from, stripped); | 1107 written += fprintf(data->file, "(%s) *%s* %s", date, from, stripped); |
1095 else | 1108 else |
1096 fprintf(data->file, "(%s) %s%s %s\n", date, from ? from : "", | 1109 written += fprintf(data->file, "(%s) %s%s %s\n", date, from ? from : "", |
1097 from ? ":" : "", stripped); | 1110 from ? ":" : "", stripped); |
1098 } | 1111 } |
1099 g_free(date); | 1112 g_free(date); |
1100 g_free(stripped); | 1113 g_free(stripped); |
1101 fflush(data->file); | 1114 fflush(data->file); |
1115 | |
1116 return written; | |
1102 } | 1117 } |
1103 | 1118 |
1104 static void txt_logger_finalize(GaimLog *log) | 1119 static void txt_logger_finalize(GaimLog *log) |
1105 { | 1120 { |
1106 GaimLogCommonLoggerData *data = log->logger_data; | 1121 GaimLogCommonLoggerData *data = log->logger_data; |