summaryrefslogtreecommitdiffstats
path: root/dbus-svn.patch
blob: 40c6d4945f2af0f124aa5af250734300482c1ebf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
--- pecl/dbus/trunk/dbus.c	2011/08/03 16:10:11	314193
+++ pecl/dbus/trunk/dbus.c	2011/08/03 16:21:30	314194
@@ -1031,7 +1031,7 @@
 	dbusobj->dbus = dbus;
 	dbusobj->destination = estrdup(destination);
 	dbusobj->path = estrdup(path);
-	dbusobj->interface = estrdup(interface);
+	dbusobj->interface = interface ? estrdup(interface) : NULL;
 
 	return 1;
 }
@@ -1099,7 +1099,7 @@
 	int   destination_len, path_len, interface_len;
 
 	dbus_set_error_handling(EH_THROW, NULL TSRMLS_CC);
-	if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Osss",
+	if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Osss!",
 		&object, dbus_ce_dbus,
 		&destination, &destination_len, &path, &path_len, 
 		&interface, &interface_len))
@@ -1127,7 +1127,7 @@
 	int   destination_len, path_len, interface_len;
 
 	dbus_set_error_handling(EH_THROW, NULL TSRMLS_CC);
-	if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss",
+	if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss!",
 		&destination, &destination_len, &path, &path_len, 
 		&interface, &interface_len))
 	{
@@ -1221,10 +1221,11 @@
 
 static void php_dbus_accept_incoming_method_call(php_dbus_obj *dbus, DBusMessage *msg, zval **return_value TSRMLS_DC)
 {
-	char *key, *class;
+	char *key, *class, *interface;
 
 	/* See if we can find a class mapping for this object */
-	spprintf(&key, 0, "%s:%s", dbus_message_get_path(msg), dbus_message_get_interface(msg));
+	interface = dbus_message_get_interface(msg);
+	spprintf(&key, 0, "%s:%s", dbus_message_get_path(msg), interface ? interface : "(null)");
 	if (zend_hash_find(&(dbus->objects), key, strlen(key) + 1, (void**) &class) == SUCCESS) {
 		zend_class_entry **pce;
 
@@ -1336,14 +1337,17 @@
 
 	dbus_set_error_handling(EH_THROW, NULL TSRMLS_CC);
 	if (FAILURE == zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(),
-		"Osss", &object, dbus_ce_dbus, &path, &path_len, &interface, &interface_len,
+		"Oss!s", &object, dbus_ce_dbus, &path, &path_len, &interface, &interface_len,
 		&class, &class_len)) {
 		RETURN_FALSE;
 	}
 	dbus = (php_dbus_obj *) zend_object_store_get_object(object TSRMLS_CC);
 
 	/* Create the key out of the path and interface */
-	spprintf(&key, 0, "%s:%s", path, interface);
+	spprintf(&key, 0, "%s:%s", path, interface ? interface : "(null)");
+	if (interface == NULL) {
+		interface_len = 6;
+	}
 
 	/* Add class name to hash */
 	zend_hash_add(&(dbus->objects), key, path_len + interface_len + 2, (void*) estrdup(class), strlen(class)+1, NULL);
--- pecl/dbus/trunk/dbus.c	2011/08/30 16:26:43	315793
+++ pecl/dbus/trunk/dbus.c	2011/08/30 16:29:53	315794
@@ -26,6 +26,7 @@
 #include "ext/standard/php_versioning.h"
 #include "php_dbus.h"
 #include "zend_extensions.h"
+#include "zend_exceptions.h"
 #include "zend_interfaces.h"
 #include "zend_hash.h"
 #include "dbus/dbus.h"
@@ -157,6 +158,7 @@
 zend_class_entry *dbus_ce_dbus_array, *dbus_ce_dbus_dict, *dbus_ce_dbus_variant;
 zend_class_entry *dbus_ce_dbus_variant, *dbus_ce_dbus_set, *dbus_ce_dbus_struct;
 zend_class_entry *dbus_ce_dbus_object_path;
+zend_class_entry *dbus_ce_dbus_exception, *dbus_ce_dbus_exception_service, *dbus_ce_dbus_exception_method;
 
 static zend_object_handlers dbus_object_handlers_dbus, dbus_object_handlers_dbus_object;
 static zend_object_handlers dbus_object_handlers_dbus_signal;
@@ -444,6 +446,7 @@
 	zend_class_entry ce_dbus, ce_dbus_object, ce_dbus_array, ce_dbus_dict;
 	zend_class_entry ce_dbus_variant, ce_dbus_signal, ce_dbus_set, ce_dbus_struct;
 	zend_class_entry ce_dbus_object_path;
+	zend_class_entry ce_dbus_exception, ce_dbus_exception_service, ce_dbus_exception_method;
 
 	INIT_CLASS_ENTRY(ce_dbus, "Dbus", dbus_funcs_dbus);
 	ce_dbus.create_object = dbus_object_new_dbus;
@@ -470,6 +473,18 @@
 	zend_declare_class_constant_long(dbus_ce_dbus, "BUS_SESSION", sizeof("BUS_SESSION")-1, DBUS_BUS_SESSION TSRMLS_CC);
 	zend_declare_class_constant_long(dbus_ce_dbus, "BUS_SYSTEM", sizeof("BUS_SYSTEM")-1, DBUS_BUS_SYSTEM TSRMLS_CC);
 
+	INIT_CLASS_ENTRY(ce_dbus_exception, "DbusException", NULL);
+	dbus_ce_dbus_exception = zend_register_internal_class_ex(&ce_dbus_exception, zend_exception_get_default(TSRMLS_C), NULL TSRMLS_CC);
+	dbus_ce_dbus_exception->ce_flags |= ZEND_ACC_FINAL;
+
+	INIT_CLASS_ENTRY(ce_dbus_exception_service, "DbusExceptionServiceUnknown", NULL);
+	dbus_ce_dbus_exception_service = zend_register_internal_class_ex(&ce_dbus_exception_service, zend_exception_get_default(TSRMLS_C), NULL TSRMLS_CC);
+	dbus_ce_dbus_exception_service->ce_flags |= ZEND_ACC_FINAL;
+
+	INIT_CLASS_ENTRY(ce_dbus_exception_method, "DbusExceptionUnknownMethod", NULL);
+	dbus_ce_dbus_exception_method = zend_register_internal_class_ex(&ce_dbus_exception_method, zend_exception_get_default(TSRMLS_C), NULL TSRMLS_CC);
+	dbus_ce_dbus_exception_method->ce_flags |= ZEND_ACC_FINAL;
+
 	INIT_CLASS_ENTRY(ce_dbus_object, "DbusObject", dbus_funcs_dbus_object);
 	ce_dbus_object.create_object = dbus_object_new_dbus_object;
 	dbus_ce_dbus_object = zend_register_internal_class_ex(&ce_dbus_object, NULL, NULL TSRMLS_CC);
@@ -1883,12 +1898,23 @@
 
 static int php_dbus_handle_reply(zval *return_value, DBusMessage *msg, int always_array TSRMLS_DC)
 {
-	DBusMessageIter args;
-	dbus_int64_t    stat;
-	zval           *val;
+	zend_class_entry *exception_ce = NULL;
+	DBusMessageIter   args;
+	dbus_int64_t      stat;
+	zval             *val;
 
 	if (dbus_message_get_type(msg) == DBUS_MESSAGE_TYPE_ERROR) {
-		dbus_set_error_handling(EH_THROW, NULL TSRMLS_CC);
+		const char* error_msg_str = dbus_message_get_error_name(msg);
+
+		if (!strcmp(error_msg_str, DBUS_ERROR_SERVICE_UNKNOWN)) {
+			exception_ce = dbus_ce_dbus_exception_service;
+		} else if (!strcmp(error_msg_str, DBUS_ERROR_UNKNOWN_METHOD)) {
+			exception_ce = dbus_ce_dbus_exception_method;
+		} else {
+			exception_ce = dbus_ce_dbus_exception;
+		}
+
+		dbus_set_error_handling(EH_THROW, exception_ce TSRMLS_CC);
 		if (!dbus_message_iter_init(msg, &args)) {
 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", dbus_message_get_error_name(msg));
 			return 0;
--- pecl/dbus/trunk/dbus.c	2013/11/03 14:09:33	332054
+++ pecl/dbus/trunk/dbus.c	2013/11/03 15:36:02	332055
@@ -2,7 +2,7 @@
    +----------------------------------------------------------------------+
    | PHP Version 5                                                        |
    +----------------------------------------------------------------------+
-   | Copyright (c) 1997-2008 The PHP Group                                |
+   | Copyright (c) 2008-2013 The PHP Group                                |
    +----------------------------------------------------------------------+
    | This source file is subject to version 3.01 of the PHP license,      |
    | that is bundled with this package in the file LICENSE, and is        |
@@ -39,7 +39,7 @@
 #endif
 
 #if PHP_MINOR_VERSION > 3
-# define INIT_OBJ_PROP	object_properties_init(&intern->std, class_type);
+# define INIT_OBJ_PROP	object_properties_init(&intern->std, class_type); if (!intern->std.properties) { rebuild_object_properties(&intern->std); };
 #else
 # define INIT_OBJ_PROP	zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
 #endif
@@ -348,9 +348,9 @@
 
 static int dbus_object_compare_dbus(zval *d1, zval *d2 TSRMLS_DC);
 
-/* This is need to ensure that session extension request shutdown occurs 1st, because it uses the dbus extension */ 
 static const zend_module_dep dbus_deps[] = {
-	{NULL, NULL, NULL}
+	ZEND_MOD_REQUIRED("libxml")
+	ZEND_MOD_END
 };
 
 #ifdef COMPILE_DL_DBUS
@@ -2208,8 +2208,8 @@
 		zend_hash_update(props, "signature", 10, (void*)&sig, sizeof(zval *), NULL);
 	}
 
-	zend_hash_update(props, "array", 6, (void*)&array_obj->elements, sizeof(zval *), NULL);
 	Z_ADDREF_P(array_obj->elements);
+	zend_hash_update(props, "array", 6, (void*)&array_obj->elements, sizeof(zval *), NULL);
 
 	return props;
 }
@@ -2274,8 +2274,8 @@
 		zend_hash_update(props, "signature", 10, (void*)&sig, sizeof(zval *), NULL);
 	}
 
-	zend_hash_update(props, "dict", 5, (void*)&dict_obj->elements, sizeof(zval *), NULL);
 	Z_ADDREF_P(dict_obj->elements);
+	zend_hash_update(props, "dict", 5, (void*)&dict_obj->elements, sizeof(zval *), NULL);
 
 	return props;
 }
@@ -2328,8 +2328,8 @@
 
 	props = variant_obj->std.properties;
 
-	zend_hash_update(props, "variant", 8, (void*)&variant_obj->data, sizeof(zval *), NULL);
 	Z_ADDREF_P(variant_obj->data);
+	zend_hash_update(props, "variant", 8, (void*)&variant_obj->data, sizeof(zval *), NULL);
 
 	return props;
 }
@@ -2453,8 +2453,8 @@
 
 	props = struct_obj->std.properties;
 
-	zend_hash_update(props, "struct", 7, (void*)&struct_obj->elements, sizeof(zval *), NULL);
 	Z_ADDREF_P(struct_obj->elements);
+	zend_hash_update(props, "struct", 7, (void*)&struct_obj->elements, sizeof(zval *), NULL);
 
 	return props;
 }
--- pecl/dbus/trunk/dbus.c	2014/02/21 10:51:45	332875
+++ pecl/dbus/trunk/dbus.c	2014/02/23 07:50:34	332876
@@ -44,6 +44,10 @@
 # define INIT_OBJ_PROP	zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *));
 #endif
 
+#ifndef ZEND_MOD_END
+#define ZEND_MOD_END {NULL, NULL, NULL}
+#endif
+
 /* {{{ arginfo */
 ZEND_BEGIN_ARG_INFO_EX(arginfo_dbus_object___call, 0, 0, 2)
 	ZEND_ARG_INFO(0, function_name)