2 * Telepathy debug interface implementation
3 * Copyright (C) 2009 Collabora Ltd.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 #include "empathy-debugger.h"
23 #include <telepathy-glib/dbus.h>
25 #include "extensions/extensions.h"
27 static EmpathyDebugger
*singleton
= NULL
;
30 debug_iface_init (gpointer g_iface
, gpointer iface_data
);
32 G_DEFINE_TYPE_WITH_CODE (EmpathyDebugger
, empathy_debugger
, G_TYPE_OBJECT
,
33 G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_DBUS_PROPERTIES
,
34 tp_dbus_properties_mixin_iface_init
);
35 G_IMPLEMENT_INTERFACE (EMP_TYPE_SVC_DEBUG
, debug_iface_init
));
45 log_level_flags_to_debug_level (GLogLevelFlags level
)
47 if (level
& G_LOG_LEVEL_ERROR
)
48 return EMP_DEBUG_LEVEL_ERROR
;
49 else if (level
& G_LOG_LEVEL_CRITICAL
)
50 return EMP_DEBUG_LEVEL_CRITICAL
;
51 else if (level
& G_LOG_LEVEL_WARNING
)
52 return EMP_DEBUG_LEVEL_WARNING
;
53 else if (level
& G_LOG_LEVEL_MESSAGE
)
54 return EMP_DEBUG_LEVEL_MESSAGE
;
55 else if (level
& G_LOG_LEVEL_INFO
)
56 return EMP_DEBUG_LEVEL_INFO
;
57 else if (level
& G_LOG_LEVEL_DEBUG
)
58 return EMP_DEBUG_LEVEL_DEBUG
;
60 /* Fall back to DEBUG if all else fails */
61 return EMP_DEBUG_LEVEL_DEBUG
;
64 static EmpathyDebugMessage
*
65 debug_message_new (GTimeVal
*timestamp
,
70 EmpathyDebugMessage
*msg
;
72 msg
= g_slice_new0 (EmpathyDebugMessage
);
73 msg
->timestamp
= timestamp
->tv_sec
+ timestamp
->tv_usec
/ 1e6
;
74 msg
->domain
= g_strdup (domain
);
75 msg
->level
= log_level_flags_to_debug_level (level
);
76 msg
->string
= g_strdup (string
);
81 debug_message_free (EmpathyDebugMessage
*msg
)
85 g_slice_free (EmpathyDebugMessage
, msg
);
89 empathy_debugger_get_property (GObject
*object
,
94 EmpathyDebugger
*self
= EMPATHY_DEBUGGER (object
);
99 g_value_set_boolean (value
, self
->enabled
);
103 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, property_id
, pspec
);
108 empathy_debugger_set_property (GObject
*object
,
113 EmpathyDebugger
*self
= EMPATHY_DEBUGGER (object
);
118 self
->enabled
= g_value_get_boolean (value
);
122 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, property_id
, pspec
);
127 empathy_debugger_finalize (GObject
*object
)
129 EmpathyDebugger
*self
= EMPATHY_DEBUGGER (object
);
131 g_queue_foreach (self
->messages
, (GFunc
) debug_message_free
, NULL
);
132 g_queue_free (self
->messages
);
133 self
->messages
= NULL
;
135 G_OBJECT_CLASS (empathy_debugger_parent_class
)->finalize (object
);
139 empathy_debugger_class_init (EmpathyDebuggerClass
*klass
)
141 GObjectClass
*object_class
= G_OBJECT_CLASS (klass
);
142 static TpDBusPropertiesMixinPropImpl debug_props
[] = {
143 { "Enabled", "enabled", "enabled" },
146 static TpDBusPropertiesMixinIfaceImpl prop_interfaces
[] = {
148 tp_dbus_properties_mixin_getter_gobject_properties
,
149 tp_dbus_properties_mixin_setter_gobject_properties
,
155 object_class
->get_property
= empathy_debugger_get_property
;
156 object_class
->set_property
= empathy_debugger_set_property
;
157 object_class
->finalize
= empathy_debugger_finalize
;
159 g_object_class_install_property (object_class
, PROP_ENABLED
,
160 g_param_spec_boolean ("enabled", "Enabled?",
161 "True if the new-debug-message signal is enabled.",
163 G_PARAM_READWRITE
| G_PARAM_STATIC_STRINGS
));
165 klass
->dbus_props_class
.interfaces
= prop_interfaces
;
166 tp_dbus_properties_mixin_class_init (object_class
,
167 G_STRUCT_OFFSET (EmpathyDebuggerClass
, dbus_props_class
));
171 get_messages (EmpSvcDebug
*self
,
172 DBusGMethodInvocation
*context
)
174 EmpathyDebugger
*dbg
= EMPATHY_DEBUGGER (self
);
176 static GType struct_type
= 0;
180 if (G_UNLIKELY (struct_type
== 0))
182 struct_type
= dbus_g_type_get_struct (
183 "GValueArray", G_TYPE_DOUBLE
, G_TYPE_STRING
, G_TYPE_UINT
,
184 G_TYPE_STRING
, G_TYPE_INVALID
);
187 messages
= g_ptr_array_sized_new (g_queue_get_length (dbg
->messages
));
189 for (i
= dbg
->messages
->head
; i
; i
= i
->next
)
191 GValue gvalue
= { 0 };
192 EmpathyDebugMessage
*message
= (EmpathyDebugMessage
*) i
->data
;
194 g_value_init (&gvalue
, struct_type
);
195 g_value_take_boxed (&gvalue
,
196 dbus_g_type_specialized_construct (struct_type
));
197 dbus_g_type_struct_set (&gvalue
,
198 0, message
->timestamp
,
203 g_ptr_array_add (messages
, g_value_get_boxed (&gvalue
));
206 emp_svc_debug_return_from_get_messages (context
, messages
);
208 for (j
= 0; j
< messages
->len
; j
++)
209 g_boxed_free (struct_type
, messages
->pdata
[j
]);
211 g_ptr_array_free (messages
, TRUE
);
215 debug_iface_init (gpointer g_iface
,
218 EmpSvcDebugClass
*klass
= (EmpSvcDebugClass
*) g_iface
;
220 emp_svc_debug_implement_get_messages (klass
, get_messages
);
224 empathy_debugger_init (EmpathyDebugger
*self
)
226 self
->messages
= g_queue_new ();
230 empathy_debugger_get_singleton (void)
232 if (G_UNLIKELY (singleton
== NULL
))
234 DBusGConnection
*bus
;
236 singleton
= g_object_new (EMPATHY_TYPE_DEBUGGER
, NULL
);
238 dbus_g_connection_register_g_object (bus
,
239 "/org/freedesktop/Telepathy/debug", (GObject
*) singleton
);
246 empathy_debugger_add_message (EmpathyDebugger
*self
,
249 GLogLevelFlags level
,
252 EmpathyDebugMessage
*new_msg
;
254 if (g_queue_get_length (self
->messages
) >= DEBUG_MESSAGE_LIMIT
)
256 EmpathyDebugMessage
*old_head
=
257 (EmpathyDebugMessage
*) g_queue_pop_head (self
->messages
);
259 debug_message_free (old_head
);
262 new_msg
= debug_message_new (timestamp
, domain
, level
, string
);
263 g_queue_push_tail (self
->messages
, new_msg
);
267 emp_svc_debug_emit_new_debug_message (self
, new_msg
->timestamp
,
268 domain
, new_msg
->level
, string
);