From cf53c2161ff4aad6a2e772f26c076546cd19e562 Mon Sep 17 00:00:00 2001 From: erwinschrodinger1 Date: Thu, 6 Nov 2025 10:52:54 +0545 Subject: [PATCH 1/4] Add support of user_data in read_cb (Fixes #604) Added in reference to write callback. Is backward compatible. Tested with file read using FileIO in esp32s3. --- esp_delta_ota/include/esp_delta_ota.h | 6 +++++- esp_delta_ota/src/esp_delta_ota.c | 22 +++++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/esp_delta_ota/include/esp_delta_ota.h b/esp_delta_ota/include/esp_delta_ota.h index 389e367fa0..0c255d06d0 100644 --- a/esp_delta_ota/include/esp_delta_ota.h +++ b/esp_delta_ota/include/esp_delta_ota.h @@ -23,6 +23,7 @@ typedef void *esp_delta_ota_handle_t; // Callback for reading the source data typedef esp_err_t (*src_read_cb_t)(uint8_t *buf_p, size_t size, int src_offset); +typedef esp_err_t (*src_read_cb_with_user_ctx_t)(uint8_t *buf_p, size_t size, int src_offset, void* user_data); // Callback for working on the data generated by applying patch on the source data typedef esp_err_t (*merged_stream_write_cb_t)(const uint8_t *buf_p, size_t size); @@ -30,7 +31,10 @@ typedef esp_err_t (*merged_stream_write_cb_with_user_ctx_t)(const uint8_t *buf_p typedef struct esp_delta_ota_cfg { void *user_data; /*!< User Data */ - src_read_cb_t read_cb; /*!< Read Callback */ + union{ + src_read_cb_t read_cb; /*!< Read Callback */ + src_read_cb_with_user_ctx_t read_cb_with_user_data; /*!< Read Callback with user data */ + }; union { merged_stream_write_cb_with_user_ctx_t write_cb_with_user_data; /*!< Write Callback with user data */ merged_stream_write_cb_t write_cb DEPRECATED_ATTRIBUTE; /*!< Write Callback */ diff --git a/esp_delta_ota/src/esp_delta_ota.c b/esp_delta_ota/src/esp_delta_ota.c index 1b82477d3e..d637cd008e 100644 --- a/esp_delta_ota/src/esp_delta_ota.c +++ b/esp_delta_ota/src/esp_delta_ota.c @@ -19,7 +19,10 @@ static const char *TAG = "esp_delta_ota"; typedef struct esp_delta_ota_ctx { void *user_data; - src_read_cb_t read_cb; + union{ + src_read_cb_t read_cb; /*!< Read Callback */ + src_read_cb_with_user_ctx_t read_cb_with_user_data; /*!< Read Callback with user data */ + }; union { merged_stream_write_cb_with_user_ctx_t write_cb_with_user_data; merged_stream_write_cb_t write_cb; @@ -57,11 +60,20 @@ static int esp_delta_ota_read_cb(void *arg_p, uint8_t *buf_p, size_t size) return -ESP_ERR_INVALID_ARG; } esp_delta_ota_ctx *handle = (esp_delta_ota_ctx *)arg_p; - esp_err_t err = handle->read_cb(buf_p, size, handle->src_offset); - if (err != ESP_OK) { - ESP_LOGE(TAG, "Error in read_cb(): %s", esp_err_to_name(err)); - return ESP_FAIL; + esp_err_t err = ESP_OK; + if (!handle->user_data) { + err = handle->read_cb(buf_p, size, handle->src_offset); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Error in read_cb(): %s", esp_err_to_name(err)); + return ESP_FAIL; + } + } else { + err = handle->read_cb_with_user_data(buf_p, size, handle->src_offset, handle->user_data); if (err != ESP_OK) { + ESP_LOGE(TAG, "Error in read_cb_with_user_data(): %s", esp_err_to_name(err)); + return ESP_FAIL; + } } + handle->src_offset += size; return ESP_OK; } From 8746e623b741a792b0f13e8f38405eab8395018c Mon Sep 17 00:00:00 2001 From: erwinschrodinger1 Date: Tue, 25 Nov 2025 16:48:29 +0545 Subject: [PATCH 2/4] Bump component version to 1.1.4 and update changelogs --- esp_delta_ota/CHANGELOG.md | 5 +++++ esp_delta_ota/idf_component.yml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/esp_delta_ota/CHANGELOG.md b/esp_delta_ota/CHANGELOG.md index 14cd5993c5..4a09bef01a 100644 --- a/esp_delta_ota/CHANGELOG.md +++ b/esp_delta_ota/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.1.4 + +### Enhancements: +- Added support to pass user data to read callback with new callback function: `src_read_cb_with_user_ctx_t` + ## 1.1.3 ### Bugfixes: diff --git a/esp_delta_ota/idf_component.yml b/esp_delta_ota/idf_component.yml index b4caab573a..825a745ebc 100644 --- a/esp_delta_ota/idf_component.yml +++ b/esp_delta_ota/idf_component.yml @@ -1,4 +1,4 @@ -version: "1.1.3" +version: "1.1.4" description: "ESP Delta OTA Library" url: https://github.com/espressif/idf-extra-components/tree/master/esp_delta_ota dependencies: From 3f7532f6e7530cfe2fba3b35de3e62975aa02200 Mon Sep 17 00:00:00 2001 From: Nirjal Bhurtel <81609547+erwinschrodinger1@users.noreply.github.com> Date: Fri, 28 Nov 2025 21:06:19 +0545 Subject: [PATCH 3/4] Update esp_delta_ota/src/esp_delta_ota.c Co-authored-by: hrushikesh430 <89566923+hrushikesh430@users.noreply.github.com> --- esp_delta_ota/src/esp_delta_ota.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/esp_delta_ota/src/esp_delta_ota.c b/esp_delta_ota/src/esp_delta_ota.c index d637cd008e..c8455497b0 100644 --- a/esp_delta_ota/src/esp_delta_ota.c +++ b/esp_delta_ota/src/esp_delta_ota.c @@ -68,7 +68,8 @@ static int esp_delta_ota_read_cb(void *arg_p, uint8_t *buf_p, size_t size) return ESP_FAIL; } } else { - err = handle->read_cb_with_user_data(buf_p, size, handle->src_offset, handle->user_data); if (err != ESP_OK) { + err = handle->read_cb_with_user_data(buf_p, size, handle->src_offset, handle->user_data); + if (err != ESP_OK) { ESP_LOGE(TAG, "Error in read_cb_with_user_data(): %s", esp_err_to_name(err)); return ESP_FAIL; } From 7d6386eb8a341c3141f4849362c297f28e5fb5d5 Mon Sep 17 00:00:00 2001 From: erwinschrodinger1 Date: Mon, 8 Dec 2025 13:47:06 +0545 Subject: [PATCH 4/4] formatting: update formatting based on pre-commit --- esp_delta_ota/include/esp_delta_ota.h | 4 ++-- esp_delta_ota/src/esp_delta_ota.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/esp_delta_ota/include/esp_delta_ota.h b/esp_delta_ota/include/esp_delta_ota.h index 0c255d06d0..df92649cee 100644 --- a/esp_delta_ota/include/esp_delta_ota.h +++ b/esp_delta_ota/include/esp_delta_ota.h @@ -23,7 +23,7 @@ typedef void *esp_delta_ota_handle_t; // Callback for reading the source data typedef esp_err_t (*src_read_cb_t)(uint8_t *buf_p, size_t size, int src_offset); -typedef esp_err_t (*src_read_cb_with_user_ctx_t)(uint8_t *buf_p, size_t size, int src_offset, void* user_data); +typedef esp_err_t (*src_read_cb_with_user_ctx_t)(uint8_t *buf_p, size_t size, int src_offset, void *user_data); // Callback for working on the data generated by applying patch on the source data typedef esp_err_t (*merged_stream_write_cb_t)(const uint8_t *buf_p, size_t size); @@ -31,7 +31,7 @@ typedef esp_err_t (*merged_stream_write_cb_with_user_ctx_t)(const uint8_t *buf_p typedef struct esp_delta_ota_cfg { void *user_data; /*!< User Data */ - union{ + union { src_read_cb_t read_cb; /*!< Read Callback */ src_read_cb_with_user_ctx_t read_cb_with_user_data; /*!< Read Callback with user data */ }; diff --git a/esp_delta_ota/src/esp_delta_ota.c b/esp_delta_ota/src/esp_delta_ota.c index c8455497b0..fa476fb4e8 100644 --- a/esp_delta_ota/src/esp_delta_ota.c +++ b/esp_delta_ota/src/esp_delta_ota.c @@ -19,7 +19,7 @@ static const char *TAG = "esp_delta_ota"; typedef struct esp_delta_ota_ctx { void *user_data; - union{ + union { src_read_cb_t read_cb; /*!< Read Callback */ src_read_cb_with_user_ctx_t read_cb_with_user_data; /*!< Read Callback with user data */ }; @@ -68,7 +68,7 @@ static int esp_delta_ota_read_cb(void *arg_p, uint8_t *buf_p, size_t size) return ESP_FAIL; } } else { - err = handle->read_cb_with_user_data(buf_p, size, handle->src_offset, handle->user_data); + err = handle->read_cb_with_user_data(buf_p, size, handle->src_offset, handle->user_data); if (err != ESP_OK) { ESP_LOGE(TAG, "Error in read_cb_with_user_data(): %s", esp_err_to_name(err)); return ESP_FAIL;