From: Sebastian Pölsterl Date: Sun, 29 Mar 2009 06:50:22 +0000 (+0200) Subject: D-Bus: Unregister path on object destruction X-Git-Tag: 0.6.0~35 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7e43af186264fb92994c363a31dcd03b89e25b6d;p=thirdparty%2Fvala.git D-Bus: Unregister path on object destruction Fixes bug 576874. --- diff --git a/gobject/valaccodebasemodule.vala b/gobject/valaccodebasemodule.vala index 822c8417e..0b05134d0 100644 --- a/gobject/valaccodebasemodule.vala +++ b/gobject/valaccodebasemodule.vala @@ -444,6 +444,37 @@ internal class Vala.CCodeBaseModule : CCodeModule { block.add_statement (new CCodeIfStatement (new CCodeIdentifier ("vtable"), ifblock, elseblock)); source_type_member_definition.append (cfunc); + + // unregister function + cfunc = new CCodeFunction ("_vala_dbus_unregister_object", "void"); + cfunc.add_parameter (new CCodeFormalParameter ("connection", "gpointer")); + cfunc.add_parameter (new CCodeFormalParameter ("object", "GObject*")); + + cfunc.modifiers |= CCodeModifiers.STATIC; + source_declarations.add_type_member_declaration (cfunc.copy ()); + + block = new CCodeBlock (); + cfunc.block = block; + + cdecl = new CCodeDeclaration ("char*"); + cdecl.add_declarator (new CCodeVariableDeclarator ("path")); + block.add_statement (cdecl); + + var path = new CCodeFunctionCall (new CCodeIdentifier ("g_object_steal_data")); + path.add_argument (new CCodeCastExpression (new CCodeIdentifier ("object"), "GObject*")); + path.add_argument (new CCodeConstant ("\"dbus_object_path\"")); + block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("path"), path))); + + var unregister_call = new CCodeFunctionCall (new CCodeIdentifier ("dbus_connection_unregister_object_path")); + unregister_call.add_argument (new CCodeIdentifier ("connection")); + unregister_call.add_argument (new CCodeIdentifier ("path")); + block.add_statement (new CCodeExpressionStatement (unregister_call)); + + var path_free = new CCodeFunctionCall (new CCodeIdentifier ("g_free")); + path_free.add_argument (new CCodeIdentifier ("path")); + block.add_statement (new CCodeExpressionStatement (path_free)); + + source_type_member_definition.append (cfunc); } CCodeComment comment = null; diff --git a/gobject/valadbusservermodule.vala b/gobject/valadbusservermodule.vala index d13e8e167..26d032b61 100644 --- a/gobject/valadbusservermodule.vala +++ b/gobject/valadbusservermodule.vala @@ -359,6 +359,12 @@ internal class Vala.DBusServerModule : DBusClientModule { cregister.add_argument (new CCodeIdentifier ("object")); register_block.add_statement (new CCodeExpressionStatement (cregister)); + var weak_unregister = new CCodeFunctionCall (new CCodeIdentifier ("g_object_weak_ref")); + weak_unregister.add_argument (new CCodeIdentifier ("object")); + weak_unregister.add_argument (new CCodeIdentifier ("_vala_dbus_unregister_object")); + weak_unregister.add_argument (new CCodeIdentifier ("connection")); + register_block.add_statement (new CCodeExpressionStatement (weak_unregister)); + block.add_statement (new CCodeIfStatement (register_check, register_block)); handle_signals (object_type.type_symbol, block);