diff --git a/mosquitto.c b/mosquitto.c index 32f6fe8..8ed43bd 100644 --- a/mosquitto.c +++ b/mosquitto.c @@ -385,19 +385,20 @@ PHP_MOSQUITTO_API void php_mosquitto_message_callback(struct mosquitto *mosq, vo { mosquitto_client_object *object = (mosquitto_client_object *) client_obj; mosquitto_message_object *message_object; - zval *retval_ptr = NULL; - zval **params = ecalloc(1, sizeof (zval)); + zval *retval_ptr = NULL, *message_zval = NULL; + zval **params[1]; if (!ZEND_FCI_INITIALIZED(object->message_callback)) { return; } - ALLOC_INIT_ZVAL(params[0]); - object_init_ex(params[0], mosquitto_ce_message); - message_object = (mosquitto_message_object *) zend_object_store_get_object(params[0] TSRMLS_CC); + ALLOC_INIT_ZVAL(message_zval); + object_init_ex(message_zval, mosquitto_ce_message); + message_object = (mosquitto_message_object *) zend_object_store_get_object(message_zval TSRMLS_CC); mosquitto_message_copy(message_object->message, message); + params[0] = &message_zval; - object->message_callback.params = ¶ms; + object->message_callback.params = params; object->message_callback.param_count = 1; object->message_callback.retval_ptr_ptr = &retval_ptr; object->message_callback.no_separation = 1; @@ -408,7 +409,7 @@ PHP_MOSQUITTO_API void php_mosquitto_message_callback(struct mosquitto *mosq, vo } } - zval_ptr_dtor(params); + zval_ptr_dtor(&message_zval); if (retval_ptr != NULL) { zval_ptr_dtor(&retval_ptr); @@ -419,19 +420,22 @@ PHP_MOSQUITTO_API void php_mosquitto_subscribe_callback(struct mosquitto *mosq, { mosquitto_client_object *object = (mosquitto_client_object *) client_obj; zval *retval_ptr = NULL; - zval **params = ecalloc(2, sizeof (zval)); + zval *mid_zval = NULL, *qos_count_zval = NULL; + zval **params[2]; if (!ZEND_FCI_INITIALIZED(object->subscribe_callback)) { return; } - ALLOC_INIT_ZVAL(params[0]); - ALLOC_INIT_ZVAL(params[1]); - ZVAL_LONG(params[0], mid); - ZVAL_LONG(params[1], qos_count); + ALLOC_INIT_ZVAL(mid_zval); + ALLOC_INIT_ZVAL(qos_count_zval); + ZVAL_LONG(mid_zval, mid); + ZVAL_LONG(qos_count_zval, qos_count); /* TODO: handle granted_qos */ + params[0] = &mid_zval; + params[1] = &qos_count_zval; - object->subscribe_callback.params = ¶ms; + object->subscribe_callback.params = params; object->subscribe_callback.param_count = 2; object->subscribe_callback.retval_ptr_ptr = &retval_ptr; object->subscribe_callback.no_separation = 1; @@ -442,8 +446,8 @@ PHP_MOSQUITTO_API void php_mosquitto_subscribe_callback(struct mosquitto *mosq, } } - zval_ptr_dtor(¶ms[0]); - zval_ptr_dtor(¶ms[1]); + zval_ptr_dtor(params[0]); + zval_ptr_dtor(params[1]); if (retval_ptr != NULL) { zval_ptr_dtor(&retval_ptr); diff --git a/mosquitto_message.c b/mosquitto_message.c index 7e0e46f..e7996a5 100644 --- a/mosquitto_message.c +++ b/mosquitto_message.c @@ -331,6 +331,7 @@ PHP_MINIT_FUNCTION(mosquitto_message) INIT_NS_CLASS_ENTRY(message_ce, "Mosquitto", "Message", mosquitto_message_methods); mosquitto_ce_message = zend_register_internal_class(&message_ce TSRMLS_CC); + mosquitto_ce_message->create_object = mosquitto_message_object_new; zend_hash_init(&php_mosquitto_message_properties, 0, NULL, NULL, 1); PHP_MOSQUITTO_ADD_PROPERTIES(&php_mosquitto_message_properties, php_mosquitto_message_property_entries); diff --git a/php_mosquitto.h b/php_mosquitto.h index c6ef65d..953c4e4 100644 --- a/php_mosquitto.h +++ b/php_mosquitto.h @@ -118,7 +118,7 @@ PHP_MOSQUITTO_API void php_mosquitto_subscribe_callback(struct mosquitto *mosq, char *php_mosquitto_strerror_wrapper(int err); -static void php_mosquitto_handle_errno(int retval, int err); +void php_mosquitto_handle_errno(int retval, int err); PHP_MINIT_FUNCTION(mosquitto); PHP_MINIT_FUNCTION(mosquitto_message); diff --git a/test.php b/test.php index 1fe5f47..3e9b5a2 100644 --- a/test.php +++ b/test.php @@ -3,6 +3,7 @@ $client = new Mosquitto\Client("test"); $client->onConnect('callback'); $client->onSubscribe('subscribe'); +$client->onMessage('message'); $client->connect("localhost", 1883, 5); $client->subscribe('/#', 1); @@ -17,3 +18,7 @@ function callback($r) { function subscribe() { var_dump(func_get_args()); } + +function message($message) { + var_dump($message->topic, $message->payload); +}