]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - src/logger.c
Launchpad automatic translations update.
[sojka/lightdm.git] / src / logger.c
1 #include "logger.h"
2
3 G_DEFINE_INTERFACE (Logger, logger, G_TYPE_INVALID);
4
5 static void
6 logger_logv_default (Logger *self, GLogLevelFlags log_level, const gchar *format, va_list ap) __attribute__ ((format (printf, 3, 0)));
7
8 static void
9 logger_default_init (LoggerInterface *iface)
10 {
11     iface->logv = &logger_logv_default;
12 }
13
14 gint
15 logger_logprefix (Logger *self, gchar *buf, gulong buflen)
16 {
17     g_return_val_if_fail (IS_LOGGER (self), -1);
18     return LOGGER_GET_INTERFACE (self)->logprefix (self, buf, buflen);
19 }
20
21 void
22 logger_logv (Logger *self, GLogLevelFlags log_level, const gchar *format, va_list ap)
23 {
24     g_return_if_fail (IS_LOGGER (self));
25     LOGGER_GET_INTERFACE (self)->logv (self, log_level, format, ap);
26 }
27
28 void
29 logger_logv_default (Logger *self, GLogLevelFlags log_level, const gchar *format, va_list ap)
30 {
31     va_list ap_copy;
32     gint tmp;
33
34     /* figure out how long the prefix is */
35     tmp = logger_logprefix (self, NULL, 0);
36     if (tmp < 0)
37     {
38         g_error ("failed to get log prefix");
39         return;
40     }
41
42     /* print the prefix to a variable length array (to avoid malloc) */
43     gchar pfx[tmp + 1];
44     tmp = logger_logprefix (self, pfx, sizeof(pfx));
45     if (tmp < 0)
46     {
47         g_error ("failed to get log prefix");
48         return;
49     }
50
51     /* figure out how long the formatted message is */
52     va_copy (ap_copy, ap);
53     tmp = g_vsnprintf (NULL, 0, format, ap_copy);
54     va_end (ap_copy);
55     if (tmp < 0)
56     {
57         g_error ("failed to format log message");
58         return;
59     }
60
61     /* print the message to a variable length array (to avoid malloc) */
62     gchar msg[tmp+1];
63     tmp = g_vsnprintf (msg, sizeof(msg), format, ap);
64     if (tmp < 0)
65     {
66         g_error ("failed to format log message");
67         return;
68     }
69
70     /* log the message with the prefix */
71     g_log (G_LOG_DOMAIN, log_level, "%s%s", pfx, msg);
72 }
73
74 void
75 logger_log (Logger *self, GLogLevelFlags log_level, const gchar *format, ...)
76 {
77     va_list ap;
78     va_start (ap, format);
79     logger_logv (self, log_level, format, ap);
80     va_end (ap);
81 }