Mercurial > pidgin
diff libpurple/log.c @ 15528:f61ad08739fc
This is the core code to support log deletion. It's untested.
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Sat, 03 Feb 2007 21:43:29 +0000 |
parents | b15cc37605c4 |
children | 443915ab77a1 |
line wrap: on
line diff
--- a/libpurple/log.c Sat Feb 03 21:16:07 2007 +0000 +++ b/libpurple/log.c Sat Feb 03 21:43:29 2007 +0000 @@ -248,6 +248,31 @@ return size; } +gboolean gaim_log_is_deletable(GaimLog *log) +{ + g_return_val_if_fail(log != NULL, FALSE); + g_return_val_if_fail(log->logger != NULL, FALSE); + + if (log->logger->delete == NULL) + return FALSE; + + if (log->logger->is_deletable != NULL) + return log->logger->is_deletable(log); + + return TRUE; +} + +gboolean gaim_log_delete(GaimLog *log) +{ + g_return_val_if_fail(log != NULL, FALSE); + g_return_val_if_fail(log->logger != NULL, FALSE); + + if (log->logger->delete != NULL) + return log->logger->delete(log); + + return FALSE; +} + char * gaim_log_get_log_dir(GaimLogType type, const char *name, GaimAccount *account) { @@ -318,7 +343,9 @@ int(*size)(GaimLog*), int(*total_size)(GaimLogType type, const char *name, GaimAccount *account), GList*(*list_syslog)(GaimAccount *account), - void(*get_log_sets)(GaimLogSetCallback cb, GHashTable *sets)) + void(*get_log_sets)(GaimLogSetCallback cb, GHashTable *sets), + gboolean(*delete)(GaimLog *log), + gboolean(*is_deletable)(GaimLog *log)) { #endif GaimLogLogger *logger; @@ -352,8 +379,12 @@ logger->list_syslog = va_arg(args, void *); if (functions >= 9) logger->get_log_sets = va_arg(args, void *); + if (functions >= 10) + logger->delete = va_arg(args, void *); + if (functions >= 11) + logger->is_deletable = va_arg(args, void *); - if (functions > 9) + if (functions >= 12) gaim_debug_info("log", "Dropping new functions for logger: %s (%s)\n", name, id); va_end(args); @@ -567,7 +598,10 @@ html_logger_read, gaim_log_common_sizer, html_logger_total_size, - html_logger_list_syslog); + html_logger_list_syslog, + NULL, + gaim_log_common_deleter, + gaim_log_common_is_deletable); gaim_log_logger_add(html_logger); txt_logger = gaim_log_logger_new("txt", _("Plain text"), 8, @@ -578,7 +612,10 @@ txt_logger_read, gaim_log_common_sizer, txt_logger_total_size, - txt_logger_list_syslog); + txt_logger_list_syslog, + NULL, + gaim_log_common_deleter, + gaim_log_common_is_deletable); gaim_log_logger_add(txt_logger); old_logger = gaim_log_logger_new("old", _("Old flat format"), 9, @@ -817,6 +854,8 @@ struct stat st; GaimLogCommonLoggerData *data = log->logger_data; + g_return_val_if_fail(data != NULL, 0); + if (!data->path || g_stat(data->path, &st)) st.st_size = 0; @@ -943,6 +982,62 @@ g_dir_close(log_dir); } +gboolean gaim_log_common_deleter(GaimLog *log) +{ + GaimLogCommonLoggerData *data; + int ret; + + g_return_val_if_fail(log != NULL, FALSE); + + data = log->logger_data; + if (data == NULL) + return FALSE; + + if (data->path == NULL) + return FALSE; + + ret = g_unlink(data->path); + if (ret == 0) + return TRUE; + else if (ret == -1) + { + gaim_debug_error("log", "Failed to delete: %s - %s\n", data->path, strerror(errno)); + } + else + { + /* I'm not sure that g_unlink() will ever return + * something other than 0 or -1. -- rlaager */ + gaim_debug_error("log", "Failed to delete: %s\n", data->path); + } + + return FALSE; +} + +gboolean gaim_log_common_is_deletable(GaimLog *log) +{ + GaimLogCommonLoggerData *data; + gchar *dirname; + + g_return_val_if_fail(log != NULL, FALSE); + + data = log->logger_data; + if (data == NULL) + return FALSE; + + if (data->path == NULL) + return FALSE; + + dirname = g_path_get_dirname(data->path); + if (g_access(dirname, W_OK) == 0) + { + g_free(dirname); + return TRUE; + } + g_free(dirname); + + return FALSE; +} + #if 0 /* Maybe some other time. */ /**************** ** XML LOGGER **