grim/guifications3
Clone
Summary
Browse
Changes
Graph
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
;
}