From: Jürg Billeter Date: Sat, 30 May 2009 18:15:50 +0000 (+0200) Subject: D-Bus: Do not crash when calling methods after disconnecting from bus X-Git-Tag: 0.7.4~79 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9859ee1913ffa63b6a3346edd0028cce97a6b9dd;p=thirdparty%2Fvala.git D-Bus: Do not crash when calling methods after disconnecting from bus Throw error instead. --- diff --git a/codegen/valadbusclientmodule.vala b/codegen/valadbusclientmodule.vala index 1b62246ee..36a460d5b 100644 --- a/codegen/valadbusclientmodule.vala +++ b/codegen/valadbusclientmodule.vala @@ -854,9 +854,15 @@ internal class Vala.DBusClientModule : DBusModule { dbus_glib_h_needed = true; } - source_declarations.add_type_declaration (new CCodeTypeDefinition ("DBusGProxy", new CCodeVariableDeclarator (cname))); + source_declarations.add_type_declaration (new CCodeTypeDefinition ("struct _%s".printf (cname), new CCodeVariableDeclarator (cname))); source_declarations.add_type_declaration (new CCodeTypeDefinition ("DBusGProxyClass", new CCodeVariableDeclarator (cname + "Class"))); + var instance_struct = new CCodeStruct ("_%s".printf (cname)); + instance_struct.add_field ("DBusGProxy", "parent_instance"); + instance_struct.add_field ("gboolean", "disposed"); + + source_declarations.add_type_definition (instance_struct); + var implement = new CCodeFunctionCall (new CCodeIdentifier ("G_IMPLEMENT_INTERFACE")); implement.add_argument (new CCodeIdentifier (iface.get_upper_case_cname ("TYPE_"))); implement.add_argument (new CCodeIdentifier (lower_cname + "_interface_init")); @@ -943,6 +949,14 @@ internal class Vala.DBusClientModule : DBusModule { cdecl.add_declarator (new CCodeVariableDeclarator ("*connection")); proxy_dispose.block.add_statement (cdecl); + // return if proxy is already disposed + var dispose_return_block = new CCodeBlock (); + dispose_return_block.add_statement (new CCodeReturnStatement ()); + proxy_dispose.block.add_statement (new CCodeIfStatement (new CCodeMemberAccess.pointer (new CCodeCastExpression (new CCodeIdentifier ("self"), cname + "*"), "disposed"), dispose_return_block)); + + // mark proxy as disposed + proxy_dispose.block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeCastExpression (new CCodeIdentifier ("self"), cname + "*"), "disposed"), new CCodeConstant ("TRUE")))); + var gconnection = new CCodeFunctionCall (new CCodeIdentifier ("g_object_get")); gconnection.add_argument (new CCodeIdentifier ("self")); gconnection.add_argument (new CCodeConstant ("\"connection\"")); @@ -1283,6 +1297,23 @@ internal class Vala.DBusClientModule : DBusModule { var prefragment = new CCodeFragment (); var postfragment = new CCodeFragment (); + // throw error and return if proxy is disposed + var dispose_return_block = new CCodeBlock (); + if (m.get_error_types ().size > 0) { + var set_error_call = new CCodeFunctionCall (new CCodeIdentifier ("g_set_error_literal")); + set_error_call.add_argument (new CCodeIdentifier ("error")); + set_error_call.add_argument (new CCodeIdentifier ("DBUS_GERROR")); + set_error_call.add_argument (new CCodeIdentifier ("DBUS_GERROR_DISCONNECTED")); + set_error_call.add_argument (new CCodeConstant ("\"Connection is closed\"")); + dispose_return_block.add_statement (new CCodeExpressionStatement (set_error_call)); + } + if (m.return_type is VoidType) { + dispose_return_block.add_statement (new CCodeReturnStatement ()); + } else { + dispose_return_block.add_statement (new CCodeReturnStatement (default_value_for_type (m.return_type, false))); + } + block.add_statement (new CCodeIfStatement (new CCodeMemberAccess.pointer (new CCodeCastExpression (new CCodeIdentifier ("self"), iface.get_cname () + "DBusProxy*"), "disposed"), dispose_return_block)); + cdecl = new CCodeDeclaration ("DBusGConnection"); cdecl.add_declarator (new CCodeVariableDeclarator ("*_connection")); block.add_statement (cdecl);