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 **