[vala] D-Bus: Do not crash when calling methods after disconnecting from bus
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Subject: [vala] D-Bus: Do not crash when calling methods after disconnecting from bus
- Date: Sun, 31 May 2009 07:55:44 -0400 (EDT)
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]