All pastes #1442240 Raw Edit

Anonym

public text v1 · immutable
#1442240 ·published 2009-05-31 12:56 UTC
rendered paste body
diff --git a/codegen/valadbusclientmodule.vala b/codegen/valadbusclientmodule.vala
index 58b1dca..c3d9833 100644
--- a/codegen/valadbusclientmodule.vala
+++ b/codegen/valadbusclientmodule.vala
@@ -1,4 +1,4 @@
-/* valadbusclientmodule.vala
+    /* valadbusclientmodule.vala
  *
  * Copyright (C) 2007-2009  Jrg Billeter
 *  Copyright (C) 2008  Philip Van Hoof
@@ -857,9 +857,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"));
@@ -992,6 +998,15 @@ 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"))));
+
 		gconnection = new CCodeFunctionCall (new CCodeIdentifier ("g_object_get"));
 		gconnection.add_argument (new CCodeIdentifier ("self"));
 		gconnection.add_argument (new CCodeConstant ("\"connection\""));
@@ -1390,6 +1405,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 ("DBusError");
 		cdecl.add_declarator (new CCodeVariableDeclarator ("_dbus_error"));
 		block.add_statement (cdecl);