Mercurial > pidgin.yaz
comparison src/log.c @ 8635:4aee5a47937d
[gaim-migrate @ 9387]
this is some stuff. i think there's logsize caching or something. it hasn't
crashed on me yet, and we can rip it out if it sucks. enjoy!
committer: Tailor Script <tailor@pidgin.im>
author | Nathan Walp <nwalp@pidgin.im> |
---|---|
date | Mon, 12 Apr 2004 01:11:45 +0000 |
parents | d4f6b9aa4cc8 |
children | de87e510ff9a |
comparison
equal
deleted
inserted
replaced
8634:bcb09cc97b63 | 8635:4aee5a47937d |
---|---|
35 | 35 |
36 static GaimLogLogger html_logger; | 36 static GaimLogLogger html_logger; |
37 static GaimLogLogger txt_logger; | 37 static GaimLogLogger txt_logger; |
38 static GaimLogLogger old_logger; | 38 static GaimLogLogger old_logger; |
39 | 39 |
40 struct _gaim_logsize_user { | |
41 char *name; | |
42 GaimAccount *account; | |
43 }; | |
44 static GHashTable *logsize_users = NULL; | |
45 | |
46 | |
40 /************************************************************************** | 47 /************************************************************************** |
41 * PUBLIC LOGGING FUNCTIONS *********************************************** | 48 * PUBLIC LOGGING FUNCTIONS *********************************************** |
42 **************************************************************************/ | 49 **************************************************************************/ |
43 | 50 |
44 GaimLog *gaim_log_new(GaimLogType type, const char *name, GaimAccount *account, time_t time) | 51 GaimLog *gaim_log_new(GaimLogType type, const char *name, GaimAccount *account, time_t time) |
45 { | 52 { |
46 GaimLog *log = g_new0(GaimLog, 1); | 53 GaimLog *log = g_new0(GaimLog, 1); |
47 log->name = g_strdup(name); | 54 log->name = g_strdup(gaim_normalize(account, name)); |
48 log->account = account; | 55 log->account = account; |
49 log->time = time; | 56 log->time = time; |
50 log->type = type; | 57 log->type = type; |
51 log->logger_data = NULL; | 58 log->logger_data = NULL; |
52 log->logger = gaim_log_logger_get(); | 59 log->logger = gaim_log_logger_get(); |
65 } | 72 } |
66 | 73 |
67 void gaim_log_write(GaimLog *log, GaimMessageFlags type, | 74 void gaim_log_write(GaimLog *log, GaimMessageFlags type, |
68 const char *from, time_t time, const char *message) | 75 const char *from, time_t time, const char *message) |
69 { | 76 { |
77 struct _gaim_logsize_user lu; | |
78 | |
70 g_return_if_fail(log); | 79 g_return_if_fail(log); |
71 g_return_if_fail(log->logger); | 80 g_return_if_fail(log->logger); |
72 g_return_if_fail(log->logger->write); | 81 g_return_if_fail(log->logger->write); |
73 | 82 |
74 if ((log->type == GAIM_LOG_IM && gaim_prefs_get_bool("/core/logging/log_ims")) || | 83 if ((log->type == GAIM_LOG_IM && |
75 (log->type == GAIM_LOG_CHAT && gaim_prefs_get_bool("/core/logging/log_chats")) || | 84 gaim_prefs_get_bool("/core/logging/log_ims")) || |
76 + (log->type == GAIM_LOG_SYSTEM && gaim_prefs_get_bool("/core/logging/log_system"))) | 85 (log->type == GAIM_LOG_CHAT && |
86 gaim_prefs_get_bool("/core/logging/log_chats")) || | |
87 (log->type == GAIM_LOG_SYSTEM && | |
88 gaim_prefs_get_bool("/core/logging/log_system"))) { | |
77 (log->logger->write)(log, type, from, time, message); | 89 (log->logger->write)(log, type, from, time, message); |
90 lu.name = g_strdup(gaim_normalize(log->account, log->name)); | |
91 lu.account = log->account; | |
92 g_hash_table_remove(logsize_users, &lu); | |
93 g_free(lu.name); | |
94 } | |
78 } | 95 } |
79 | 96 |
80 char *gaim_log_read(GaimLog *log, GaimLogReadFlags *flags) | 97 char *gaim_log_read(GaimLog *log, GaimLogReadFlags *flags) |
81 { | 98 { |
82 GaimLogReadFlags mflags; | 99 GaimLogReadFlags mflags; |
96 if (log->logger->size) | 113 if (log->logger->size) |
97 return log->logger->size(log); | 114 return log->logger->size(log); |
98 return 0; | 115 return 0; |
99 } | 116 } |
100 | 117 |
118 static guint _gaim_logsize_user_hash(struct _gaim_logsize_user *lu) | |
119 { | |
120 return g_str_hash(lu->name); | |
121 } | |
122 | |
123 static guint _gaim_logsize_user_equal(struct _gaim_logsize_user *lu1, | |
124 struct _gaim_logsize_user *lu2) | |
125 { | |
126 return ((!strcmp(lu1->name, lu2->name)) && lu1->account == lu2->account); | |
127 } | |
128 | |
129 static void _gaim_logsize_user_free_key(struct _gaim_logsize_user *lu) | |
130 { | |
131 g_free(lu->name); | |
132 g_free(lu); | |
133 } | |
134 | |
101 int gaim_log_get_total_size(const char *name, GaimAccount *account) | 135 int gaim_log_get_total_size(const char *name, GaimAccount *account) |
102 { | 136 { |
103 int size = 0; | 137 int size; |
104 GSList *n; | 138 GSList *n; |
105 | 139 struct _gaim_logsize_user *lu; |
106 for (n = loggers; n; n = n->next) { | 140 |
107 GaimLogLogger *logger = n->data; | 141 lu = g_new(struct _gaim_logsize_user, 1); |
108 | 142 lu->name = g_strdup(gaim_normalize(account, name)); |
109 if(logger->total_size){ | 143 lu->account = account; |
110 size += (logger->total_size)(name, account); | 144 |
111 } else if(logger->list) { | 145 if((size = GPOINTER_TO_INT(g_hash_table_lookup(logsize_users, lu)))) { |
112 GList *logs = (logger->list)(name, account); | 146 g_free(lu->name); |
113 int this_size = 0; | 147 g_free(lu); |
114 | 148 } else { |
115 while (logs) { | 149 for (n = loggers; n; n = n->next) { |
116 GList *logs2 = logs->next; | 150 GaimLogLogger *logger = n->data; |
117 GaimLog *log = (GaimLog*)(logs->data); | 151 |
118 this_size += gaim_log_get_size(log); | 152 if(logger->total_size){ |
119 gaim_log_free(log); | 153 size += (logger->total_size)(name, account); |
120 g_list_free_1(logs); | 154 } else if(logger->list) { |
121 logs = logs2; | 155 GList *logs = (logger->list)(name, account); |
156 int this_size = 0; | |
157 | |
158 while (logs) { | |
159 GList *logs2 = logs->next; | |
160 GaimLog *log = (GaimLog*)(logs->data); | |
161 this_size += gaim_log_get_size(log); | |
162 gaim_log_free(log); | |
163 g_list_free_1(logs); | |
164 logs = logs2; | |
165 } | |
166 | |
167 size += this_size; | |
122 } | 168 } |
123 | 169 } |
124 size += this_size; | 170 |
125 } | 171 g_hash_table_replace(logsize_users, lu, GINT_TO_POINTER(size)); |
126 } | 172 } |
127 | |
128 return size; | 173 return size; |
129 } | 174 } |
130 | 175 |
131 /**************************************************************************** | 176 /**************************************************************************** |
132 * LOGGER FUNCTIONS ********************************************************* | 177 * LOGGER FUNCTIONS ********************************************************* |
267 gaim_log_logger_add(&txt_logger); | 312 gaim_log_logger_add(&txt_logger); |
268 gaim_log_logger_add(&old_logger); | 313 gaim_log_logger_add(&old_logger); |
269 gaim_prefs_connect_callback("/core/logging/format", | 314 gaim_prefs_connect_callback("/core/logging/format", |
270 logger_pref_cb, NULL); | 315 logger_pref_cb, NULL); |
271 gaim_prefs_trigger_callback("/core/logging/format"); | 316 gaim_prefs_trigger_callback("/core/logging/format"); |
317 | |
318 logsize_users = g_hash_table_new_full((GHashFunc)_gaim_logsize_user_hash, | |
319 (GEqualFunc)_gaim_logsize_user_equal, | |
320 (GDestroyNotify)_gaim_logsize_user_free_key, NULL); | |
272 } | 321 } |
273 | 322 |
274 /**************************************************************************** | 323 /**************************************************************************** |
275 * LOGGERS ****************************************************************** | 324 * LOGGERS ****************************************************************** |
276 ****************************************************************************/ | 325 ****************************************************************************/ |