grim/guifications3

moved gflib-gtk to the new cmake module
cmake
2010-12-15, Gary Kramlich
b6418db658c1
moved gflib-gtk to the new cmake module
/*
* Guifications - The end-all, be-all notification framework
* Copyright (C) 2003-2009 Gary Kramlich <grim@reaperworld.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, either version 3 of the License, or
* (at your option) any later version.
*
* 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, see <http://www.gnu.org/licenses/>.
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif /* HAVE_CONFIG_H */
#include <stdio.h>
#include <time.h>
#include <gflib/gf_intl.h>
#include <gflib/gf_file_logger.h>
#define GF_FILE_LOGGER_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE((obj), GF_TYPE_FILE_LOGGER, GfFileLoggerPrivate))
/******************************************************************************
* Structs
*****************************************************************************/
typedef struct {
FILE *fp;
gchar *filename;
} GfFileLoggerPrivate;
/******************************************************************************
* Globals
*****************************************************************************/
static GfLoggerClass *parent_class = NULL;
/******************************************************************************
* Enums
*****************************************************************************/
enum {
PROP_ZERO = 0,
PROP_FILENAME,
PROP_LAST
};
/******************************************************************************
* Helpers
*****************************************************************************/
static inline void
gf_file_logger_set_filename(GfFileLogger *logger, const gchar *filename) {
GfFileLoggerPrivate *priv = GF_FILE_LOGGER_GET_PRIVATE(logger);
g_free(priv->filename);
priv->filename = (filename) ? g_strdup(filename) : NULL;
}
/******************************************************************************
* Log Stuff
*****************************************************************************/
static void
gf_file_logger_open(GfLogger *logger) {
GfFileLoggerPrivate *priv = GF_FILE_LOGGER_GET_PRIVATE(logger);
g_return_if_fail(priv->filename);
if(priv->fp)
return;
priv->fp = fopen(priv->filename, "a");
#if 0
/* do we really want a logger to be able to log errors? */
if(!file_logger->priv->fp) {
gf_log_warning("GfFileLogger", "Failed to open file '%s'\n",
file_logger->priv->filename);
}
#endif
}
static void
gf_file_logger_write(GfLogger *logger, GfLogLevel level,
const gchar *category, const gchar *format, va_list args)
{
GfFileLoggerPrivate *priv = GF_FILE_LOGGER_GET_PRIVATE(logger);
if(!priv->fp)
return;
if(gf_logger_show_timestamps(logger)) {
const gchar *format;
if((format = gf_logger_get_timestamp_format(logger))) {
gchar t_buff[64];
time_t t;
t = time(NULL);
strftime(t_buff, sizeof(t_buff), format, localtime(&t));
fprintf(priv->fp, "[%s] ", t_buff);
}
}
fprintf(priv->fp, "(%s) ",
gf_log_level_to_string(level, FALSE));
if(category)
fprintf(priv->fp, "%s: ", category);
vfprintf(priv->fp, format, args);
}
static void
gf_file_logger_close(GfLogger *logger) {
GfFileLoggerPrivate *priv = GF_FILE_LOGGER_GET_PRIVATE(logger);
if(!priv->fp)
return;
if(fclose(priv->fp) != 0) {
#if 0
/* should loggers log errors? */
gf_log_critical(GF_LOG_DEFAULT, "GfFileLogger", "failed to close %s\n",
file_logger->priv->filename);
#endif
return;
}
priv->fp = NULL;
}
/******************************************************************************
* Object Stuff
*****************************************************************************/
static void
gf_file_logger_get_property(GObject *obj, guint param_id, GValue *value,
GParamSpec *psec)
{
GfFileLogger *log = GF_FILE_LOGGER(obj);
switch(param_id) {
case PROP_FILENAME:
g_value_set_string(value, gf_file_logger_get_filename(log));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, psec);
break;
}
}
static void
gf_file_logger_set_property(GObject *obj, guint param_id, const GValue *value,
GParamSpec *psec)
{
GfFileLogger *log = GF_FILE_LOGGER(obj);
switch(param_id) {
case PROP_FILENAME:
gf_file_logger_set_filename(log, g_value_get_string(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, psec);
break;
}
}
static void
gf_file_logger_finalize(GObject *obj) {
GfFileLoggerPrivate *priv = GF_FILE_LOGGER_GET_PRIVATE(obj);
g_free(priv->filename);
G_OBJECT_CLASS(parent_class)->finalize(obj);
}
static void
gf_file_logger_class_init(GfLoggerClass *klass) {
GfLoggerClass *logger_class = GF_LOGGER_CLASS(klass);
GObjectClass *obj_class = G_OBJECT_CLASS(klass);
parent_class = g_type_class_peek_parent(klass);
g_type_class_add_private(klass, sizeof(GfFileLoggerPrivate));
obj_class->finalize = gf_file_logger_finalize;
obj_class->get_property = gf_file_logger_get_property;
obj_class->set_property = gf_file_logger_set_property;
logger_class->open = gf_file_logger_open;
logger_class->write = gf_file_logger_write;
logger_class->close = gf_file_logger_close;
g_object_class_install_property(
obj_class,
PROP_FILENAME,
g_param_spec_string(
"filename",
P_("filename"),
P_("The filename for the log."),
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
}
/******************************************************************************
* GfLog API
*****************************************************************************/
GType
gf_file_logger_get_type(void) {
static GType type = 0;
if(type == 0) {
static const GTypeInfo info = {
sizeof(GfFileLoggerClass),
NULL, /* base_init */
NULL, /* base_finalize */
(GClassInitFunc)gf_file_logger_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof(GfFileLogger),
0, /* n_preallocs */
NULL, /* instance_init */
};
type = g_type_register_static(GF_TYPE_LOGGER,
"GfFileLogger",
&info, 0);
}
return type;
}
/**
* gf_file_logger_new:
* @filename : The name of the file to log to.
*
* Creates a new #GfFileLogger instance.
*
* Return Value: The new #GfFileLogger instance.
*/
GfLogger *
gf_file_logger_new(const gchar *filename) {
return g_object_new(GF_TYPE_FILE_LOGGER, "filename", filename, NULL);
}
/**
* gf_file_logger_get_filename:
* @log : The #GfFileLogger instance.
*
* Gets the name of the file used for storing the log.
*
* Return Value: The name of the file used for storing the log.
*/
const gchar *
gf_file_logger_get_filename(const GfFileLogger *log) {
GfFileLoggerPrivate *priv = NULL;
g_return_val_if_fail(GF_IS_FILE_LOGGER(log), NULL);
priv = GF_FILE_LOGGER_GET_PRIVATE(log);
return priv->filename;
}