From a9a9fe76bf01236b2556eca2475a86648eeaf1a6 Mon Sep 17 00:00:00 2001 From: Euripedes Rocha Date: Tue, 19 Jul 2022 06:42:13 -0300 Subject: [PATCH] Adds unregister event API - Added to enable users to unregister event handler. Closes https://github.com/espressif/esp-idf/issues/9194 --- include/mqtt_client.h | 13 +++++++++++++ mqtt_client.c | 17 +++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/include/mqtt_client.h b/include/mqtt_client.h index 5039287..809f2e9 100644 --- a/include/mqtt_client.h +++ b/include/mqtt_client.h @@ -547,6 +547,19 @@ esp_err_t esp_mqtt_client_register_event(esp_mqtt_client_handle_t client, esp_event_handler_t event_handler, void *event_handler_arg); +/** + * @brief Unregisters mqtt event + * + * @param client mqtt client handle + * @param event event ID + * @param event_handler handler to unregister + * + * @return ESP_ERR_NO_MEM if failed to allocate + * ESP_ERR_INVALID_ARG on invalid event ID + * ESP_OK on success + */ +esp_err_t esp_mqtt_client_unregister_event(esp_mqtt_client_handle_t client, esp_mqtt_event_id_t event, esp_event_handler_t event_handler); + /** * @brief Get outbox size * diff --git a/mqtt_client.c b/mqtt_client.c index a92e36c..d8d1c94 100644 --- a/mqtt_client.c +++ b/mqtt_client.c @@ -2056,6 +2056,23 @@ esp_err_t esp_mqtt_client_register_event(esp_mqtt_client_handle_t client, esp_mq #endif } +esp_err_t esp_mqtt_client_unregister_event(esp_mqtt_client_handle_t client, esp_mqtt_event_id_t event, esp_event_handler_t event_handler) +{ + if (client == NULL) { + return ESP_ERR_INVALID_ARG; + } +#ifdef MQTT_SUPPORTED_FEATURE_EVENT_LOOP + if (client->config->event_handle) { + ESP_LOGW(TAG, "Unregistering event loop while event callback is not null, clearing callback"); + client->config->event_handle = NULL; + } + + return esp_event_handler_unregister_with(client->config->event_loop_handle, MQTT_EVENTS, event, event_handler); +#else + ESP_LOGE(TAG, "Unregistering event handler while event loop not available in IDF version %s", IDF_VER); + return ESP_FAIL; +#endif +} static void esp_mqtt_client_dispatch_transport_error(esp_mqtt_client_handle_t client) {