From 5ffa8aebec027a6fe338dfde0bd69ed678f60791 Mon Sep 17 00:00:00 2001 From: gurpreet319 Date: Fri, 18 Sep 2026 06:49:31 +0000 Subject: [PATCH] RDKEMW-25174 : Analytics events are not getting posted as expected with Nativescript wgt Reason for change: Handle libcurl upload retries by implementing CURLOPT_SEEKFUNCTION Test Procedure: build should be successful. Risks: low Priority: P2 --- src/rtFileDownloader.cpp | 79 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/src/rtFileDownloader.cpp b/src/rtFileDownloader.cpp index 824a911d4..c2a3dd4d5 100644 --- a/src/rtFileDownloader.cpp +++ b/src/rtFileDownloader.cpp @@ -149,6 +149,81 @@ static size_t ReadMemoryCallback(void *contents, size_t size, size_t nmemb, void return 0; } +static int SeekMemoryCallback( + void *userp, + curl_off_t offset, + int origin) +{ + MemoryStruct *mem = (MemoryStruct *)userp; + + size_t dataSize = mem->downloadRequest->readDataSize(); + size_t newPos = 0; + + switch (origin) + { + case SEEK_SET: + if (offset < 0) + return CURL_SEEKFUNC_CANTSEEK; + + newPos = (size_t)offset; + break; + + case SEEK_CUR: + { + long long pos = + (long long)mem->readSize + + (long long)offset; + + if (pos < 0) + return CURL_SEEKFUNC_CANTSEEK; + + newPos = (size_t)pos; + break; + } + + case SEEK_END: + { + long long pos = + (long long)dataSize + + (long long)offset; + + if (pos < 0) + return CURL_SEEKFUNC_CANTSEEK; + + newPos = (size_t)pos; + break; + } + + default: + return CURL_SEEKFUNC_CANTSEEK; + } + + if (newPos > dataSize) + { + rtLogWarn( + "SeekMemoryCallback invalid seek: " + "origin=%d offset=%lld newPos=%zu dataSize=%zu", + origin, + (long long)offset, + newPos, + dataSize); + + return CURL_SEEKFUNC_CANTSEEK; + } + + rtLogWarn( + "SeekMemoryCallback: " + "origin=%d offset=%lld oldPos=%zu newPos=%zu dataSize=%zu", + origin, + (long long)offset, + mem->readSize, + newPos, + dataSize); + + mem->readSize = newPos; + + return CURL_SEEKFUNC_OK; +} void startFileDownloadInBackground(void* data) { @@ -1123,6 +1198,8 @@ bool rtFileDownloader::downloadByteRangeFromNetwork(rtFileDownloadRequest* downl chunk.downloadRequest = downloadRequest; curl_easy_setopt(curl_handle, CURLOPT_READFUNCTION, ReadMemoryCallback); curl_easy_setopt(curl_handle, CURLOPT_READDATA, (void *)&chunk); + curl_easy_setopt(curl_handle, CURLOPT_SEEKFUNCTION, SeekMemoryCallback); + curl_easy_setopt(curl_handle, CURLOPT_SEEKDATA, (void *)&chunk); curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, readDataSize); } @@ -1629,6 +1706,8 @@ bool rtFileDownloader::downloadFromNetwork(rtFileDownloadRequest* downloadReques chunk.downloadRequest = downloadRequest; curl_easy_setopt(curl_handle, CURLOPT_READFUNCTION, ReadMemoryCallback); curl_easy_setopt(curl_handle, CURLOPT_READDATA, (void *)&chunk); + curl_easy_setopt(curl_handle, CURLOPT_SEEKFUNCTION, SeekMemoryCallback); + curl_easy_setopt(curl_handle, CURLOPT_SEEKDATA, (void *)&chunk); curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, readDataSize); }