1 
2 #include <stdarg.h>
3 
4 #include <glib.h>
5 
6 #include "gibber-debug.h"
7 
8 #ifdef ENABLE_DEBUG
9 
10 static DebugFlags flags = 0;
11 static gboolean initialized = FALSE;
12 
13 static GDebugKey keys[] = {
14   { "transport",         DEBUG_TRANSPORT         },
15   { "net",               DEBUG_NET               },
16   { "xmpp",              DEBUG_XMPP              },
17   { "xmpp-reader",       DEBUG_XMPP_READER       },
18   { "xmpp-writer",       DEBUG_XMPP_WRITER       },
19   { "sasl",              DEBUG_SASL              },
20   { "ssl",               DEBUG_SSL               },
21   { "rmulticast",        DEBUG_RMULTICAST        },
22   { "rmulticast-sender", DEBUG_RMULTICAST_SENDER },
23   { "muc-connection",    DEBUG_MUC_CONNECTION    },
24   { "bytestream",        DEBUG_BYTESTREAM        },
25   { "ft",                DEBUG_FILE_TRANSFER     },
26   { "all",               ~0                      },
27   { 0, },
28 };
29 
gibber_debug_set_flags_from_env()30 void gibber_debug_set_flags_from_env ()
31 {
32   guint nkeys;
33   const gchar *flags_string;
34 
35   for (nkeys = 0; keys[nkeys].value; nkeys++);
36 
37   flags_string = g_getenv ("GIBBER_DEBUG");
38 
39   if (flags_string)
40     gibber_debug_set_flags (g_parse_debug_string (flags_string, keys, nkeys));
41 
42   initialized = TRUE;
43 }
44 
gibber_debug_set_flags(DebugFlags new_flags)45 void gibber_debug_set_flags (DebugFlags new_flags)
46 {
47   flags |= new_flags;
48   initialized = TRUE;
49 }
50 
gibber_debug_flag_is_set(DebugFlags flag)51 gboolean gibber_debug_flag_is_set (DebugFlags flag)
52 {
53   return flag & flags;
54 }
55 
gibber_debug(DebugFlags flag,const gchar * format,...)56 void gibber_debug (DebugFlags flag,
57                    const gchar *format,
58                    ...)
59 {
60   if (G_UNLIKELY(!initialized))
61     gibber_debug_set_flags_from_env ();
62   if (flag & flags)
63     {
64       va_list args;
65       va_start (args, format);
66       g_logv (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format, args);
67       va_end (args);
68     }
69 }
70 
71 void
gibber_debug_stanza(DebugFlags flag,WockyStanza * stanza,const gchar * format,...)72 gibber_debug_stanza (DebugFlags flag,
73                      WockyStanza *stanza,
74                      const gchar *format,
75                      ...)
76 {
77   WockyNode *node = wocky_stanza_get_top_node (stanza);
78 
79   if (G_UNLIKELY(!initialized))
80     gibber_debug_set_flags_from_env ();
81   if (flag & flags)
82     {
83       va_list args;
84       gchar *msg, *node_str;
85 
86       va_start (args, format);
87       msg = g_strdup_vprintf (format, args);
88       va_end (args);
89 
90       node_str = wocky_node_to_string (node);
91 
92       g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "%s\n%s", msg, node_str);
93 
94       g_free (msg);
95       g_free (node_str);
96     }
97 }
98 
99 #endif
100