]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
D-Bus: Do not crash when calling methods after disconnecting from bus
authorJürg Billeter <j@bitron.ch>
Sat, 30 May 2009 18:15:50 +0000 (20:15 +0200)
committerJürg Billeter <j@bitron.ch>
Sun, 31 May 2009 11:39:53 +0000 (13:39 +0200)
Throw error instead.

codegen/valadbusclientmodule.vala

index 1b62246ee819957431e1e77a471fe99de60cd284..36a460d5ba87d29e83f3e3eded94b936b7c71da9 100644 (file)
@@ -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);