diff options
| author | Keith Packard <keithp@keithp.com> | 2009-05-17 00:13:45 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2009-05-17 00:13:45 -0700 | 
| commit | be3f4fed7b863c8cdaabe32b61b65a8b3cd11355 (patch) | |
| tree | c60a999a6abc8061492b7cdddd141353e8768700 /aoview/aoview_log.c | |
| parent | 93d7ce8e054515ed7b166eb042ae7f47e564d21d (diff) | |
Add lots more aoview UI bits
Logs data to files, displays current state in window.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'aoview/aoview_log.c')
| -rw-r--r-- | aoview/aoview_log.c | 192 | 
1 files changed, 192 insertions, 0 deletions
| diff --git a/aoview/aoview_log.c b/aoview/aoview_log.c new file mode 100644 index 00000000..623c5aa6 --- /dev/null +++ b/aoview/aoview_log.c @@ -0,0 +1,192 @@ +/* + * Copyright © 2009 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include "aoview.h" + +#define LOG_DIR_PATH	"/apps/aoview/log_dir" +#define DEFAULT_LOG	"AltOS" + +static char *aoview_log_dir; +static FILE *aoview_log_file; +static int aoview_log_serial; +static int aoview_log_sequence; +static GtkMessageDialog *log_fail_dialog; +static int aoview_log_failed; + +static void +aoview_log_save_conf(void) +{ +	GConfClient	*gconf_client; + +	gconf_client = gconf_client_get_default(); +	if (gconf_client) +	{ +		gconf_client_set_string(gconf_client, +					LOG_DIR_PATH, +					aoview_log_dir, +					NULL); +		g_object_unref(G_OBJECT(gconf_client)); +	} +} + +static void +aoview_log_configure(GtkWidget *widget, gpointer data) +{ +	GtkFileChooser *chooser = data; +	aoview_log_dir = gtk_file_chooser_get_filename(chooser); +	aoview_log_save_conf(); +	gtk_widget_hide(GTK_WIDGET(chooser)); +} + +static void +aoview_log_new(void) +{ +	if (aoview_log_file) { +		fclose(aoview_log_file); +		aoview_log_file = NULL; +	} +	aoview_log_failed = 0; +} + +static void +aoview_log_new_item(GtkWidget *widget, gpointer data) +{ +	aoview_log_new(); +} + +void +aoview_log_set_serial(int serial) +{ +	aoview_log_serial = serial; +} + +int +aoview_log_get_serial(void) +{ +	return aoview_log_serial; +} + +static void +aoview_log_open_failed(char *name) +{ +	char	*utf8_file; +	utf8_file = g_filename_to_utf8(name, -1, NULL, NULL, NULL); +	if (!utf8_file) +		utf8_file = name; +	gtk_message_dialog_format_secondary_text(log_fail_dialog, +						 "\"%s\"", utf8_file); +	if (utf8_file != name) +		g_free(utf8_file); +	gtk_widget_show(GTK_WIDGET(log_fail_dialog)); +	aoview_log_failed = 1; +} + +static void +aoview_log_start(void) +{ +	if (!aoview_log_file) { +		char		base[50]; +		struct tm	tm; +		time_t		now; +		char		*full; +		int		r; + +		now = time(NULL); +		(void) localtime_r(&now, &tm); +		aoview_mkdir(aoview_log_dir); +		for (;;) { +			sprintf(base, "%04d-%02d-%02d-serial-%03d-flight-%03d.log", +				tm.tm_year + 1900, +				tm.tm_mon + 1, +				tm.tm_mday, +				aoview_log_serial, +				aoview_log_sequence); +			full = aoview_fullname(aoview_log_dir, base); +			r = access(full, F_OK); +			if (r < 0) { +				aoview_log_file = fopen(full, "w"); +				if (!aoview_log_file) +					aoview_log_open_failed(full); +				else +					setlinebuf(aoview_log_file); +				free(full); +				break; +			} +			free (full); +			aoview_log_sequence++; +		} +	} +} + +void +aoview_log_printf(char *format, ...) +{ +	va_list	ap; + +	if (aoview_log_failed) +		return; +	aoview_log_start(); +	va_start(ap, format); +	vfprintf(aoview_log_file, format, ap); +	va_end(ap); +} + +void +aoview_log_init(GladeXML *xml) +{ +	GConfClient	*gconf_client; +	char		*log_dir = NULL; +	GtkFileChooser	*log_chooser_dialog; +	GtkWidget	*log_configure_ok; +	GtkWidget	*log_new; + +	g_type_init(); +	gconf_client = gconf_client_get_default(); +	if (gconf_client) +	{ +		log_dir = gconf_client_get_string(gconf_client, +						  LOG_DIR_PATH, +						  NULL); +		g_object_unref(G_OBJECT(gconf_client)); +	} +	if (!log_dir) { +		aoview_log_dir = aoview_fullname(getenv("HOME"), DEFAULT_LOG); +		aoview_log_save_conf(); +	} else { +		aoview_log_dir = strdup(log_dir); +	} + +	log_chooser_dialog = GTK_FILE_CHOOSER(glade_xml_get_widget(xml, "log_chooser_dialog")); +	assert(log_chooser_dialog); +	gtk_file_chooser_set_filename(log_chooser_dialog, aoview_log_dir); + +	log_configure_ok = glade_xml_get_widget(xml, "log_configure_ok"); +	assert(log_configure_ok); + +	g_signal_connect(G_OBJECT(log_configure_ok), "clicked", +			 G_CALLBACK(aoview_log_configure), +			 log_chooser_dialog); + +	log_new = glade_xml_get_widget(xml, "ao_log_new"); +	assert(log_new); +	g_signal_connect(G_OBJECT(log_new), "activate", +			 G_CALLBACK(aoview_log_new_item), +			 NULL); + +	log_fail_dialog = GTK_MESSAGE_DIALOG(glade_xml_get_widget(xml, "log_fail_dialog")); +	assert(log_fail_dialog); +} | 
