[vala] D-Bus: Do not crash when calling methods after disconnecting from bus



commit 9859ee1913ffa63b6a3346edd0028cce97a6b9dd
Author: Jürg Billeter <j bitron ch>
Date:   Sat May 30 20:15:50 2009 +0200

    D-Bus: Do not crash when calling methods after disconnecting from bus
    
    Throw error instead.
---
 codegen/valadbusclientmodule.vala |   33 ++++++++++++++++++++++++++++++++-
 1 files changed, 32 insertions(+), 1 deletions(-)

diff --git a/codegen/valadbusclientmodule.vala b/codegen/valadbusclientmodule.vala
index 1b62246..36a460d 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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]