| Date: May 18, 2021 6:04 PM |
| From: 06c9d9dbd9473fa2384ea66cbcb30de3bfc23c07 May 18, 2021 6:04 PM |
| Subject: [PATCH] DELIA-50375 : PSN data not populating in AD placement request |
| |
| Added progressCallback and stop the http download if thread stop requested. |
| |
| Source: COMCAST |
| License: Apache-2.0 |
| Upstream-Status: Pending |
| Signed-off-by: Suresh Sathiah <Suresh_Sathiah@comcast.com> |
| --- |
| diff --git a/src/rtFileDownloader.cpp b/src/rtFileDownloader.cpp |
| index 99503fb31..4687c0518 100644 |
| --- a/src/rtFileDownloader.cpp |
| +++ b/src/rtFileDownloader.cpp |
| @@ -108,7 +108,7 @@ static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, voi |
| size_t downloadCallbackSize = 0; |
| struct MemoryStruct *mem = (struct MemoryStruct *)userp; |
| |
| - downloadCallbackSize = mem->downloadRequest->executeDownloadProgressCallback(contents, size, nmemb ); |
| + downloadCallbackSize = mem->downloadRequest->executeExternalWriteCallback(contents, size, nmemb ); |
| |
| mem->contentsBuffer = (char*)realloc(mem->contentsBuffer, mem->contentsSize + downloadSize + 1); |
| if(mem->contentsBuffer == NULL) { |
| @@ -181,8 +181,8 @@ void onDownloadHandleCheck() |
| |
| rtFileDownloadRequest::rtFileDownloadRequest(const char* imageUrl, void* callbackData, void (*callbackFunction)(rtFileDownloadRequest*)) |
| : mTag(), mFileUrl(imageUrl), mProxyServer(), |
| - mErrorString(), mHttpStatusCode(0), mCallbackFunction(callbackFunction), mDownloadProgressCallbackFunction(NULL), mDownloadProgressUserPtr(NULL), |
| - mDownloadedData(0), mDownloadedDataSize(), mDownloadStatusCode(0) ,mCallbackData(callbackData), |
| + mErrorString(), mHttpStatusCode(0), mCallbackFunction(callbackFunction), mExternalWriteCallback(NULL), mExternalWriteCallbackUserPtr(NULL), |
| + mProgressCallback(NULL), mProgressCallbackUserPtr(NULL), mDownloadedData(0), mDownloadedDataSize(), mDownloadStatusCode(0) ,mCallbackData(callbackData), |
| mCallbackFunctionMutex(), mHeaderData(0), mHeaderDataSize(0), mHeaderOnly(false), mDownloadHandleExpiresTime(-2) |
| #ifdef ENABLE_HTTP_CACHE |
| , mCacheEnabled(true), mDeferCacheRead(false), mCachedFileReadSize(0) |
| @@ -261,10 +261,26 @@ void rtFileDownloadRequest::setCallbackFunction(void (*callbackFunction)(rtFileD |
| mCallbackFunction = callbackFunction; |
| } |
| |
| -void rtFileDownloadRequest::setDownloadProgressCallbackFunction(size_t (*callbackFunction)(void *ptr, size_t size, size_t nmemb, void *userData), void *userPtr) |
| +void rtFileDownloadRequest::setExternalWriteCallback(size_t (*callbackFunction)(void *ptr, size_t size, size_t nmemb, void *userData), void *userPtr) |
| { |
| - mDownloadProgressCallbackFunction = callbackFunction; |
| - mDownloadProgressUserPtr = userPtr; |
| + mExternalWriteCallback = callbackFunction; |
| + mExternalWriteCallbackUserPtr = userPtr; |
| +} |
| + |
| +void rtFileDownloadRequest::setProgressCallback(int (*callbackFunction)(void* ptr, double dltotal, double dlnow, double ultotal, double ulnow), void *userPtr) |
| +{ |
| + mProgressCallback = callbackFunction; |
| + mProgressCallbackUserPtr = userPtr; |
| +} |
| + |
| +void* rtFileDownloadRequest::progressCallback(void) |
| +{ |
| + return mProgressCallback; |
| +} |
| + |
| +void* rtFileDownloadRequest::progressCallbackUserPtr(void) |
| +{ |
| + return mProgressCallbackUserPtr; |
| } |
| |
| void rtFileDownloadRequest::setCallbackFunctionThreadSafe(void (*callbackFunction)(rtFileDownloadRequest*)) |
| @@ -298,11 +314,11 @@ bool rtFileDownloadRequest::executeCallback(int statusCode) |
| return false; |
| } |
| |
| -size_t rtFileDownloadRequest::executeDownloadProgressCallback(void * ptr, size_t size, size_t nmemb) |
| +size_t rtFileDownloadRequest::executeExternalWriteCallback(void * ptr, size_t size, size_t nmemb) |
| { |
| - if(mDownloadProgressCallbackFunction) |
| + if(mExternalWriteCallback) |
| { |
| - return mDownloadProgressCallbackFunction(ptr, size, nmemb, mDownloadProgressUserPtr); |
| + return mExternalWriteCallback(ptr, size, nmemb, mExternalWriteCallbackUserPtr); |
| } |
| return 0; |
| } |
| @@ -889,7 +905,7 @@ void rtFileDownloader::downloadFileAsByteRange(rtFileDownloadRequest* downloadRe |
| memset(buffer, 0, downloadRequest->getCachedFileReadSize()); |
| bytesCount = fread(buffer, 1, downloadRequest->getCachedFileReadSize(), fp); |
| dataSize += bytesCount; |
| - downloadRequest->executeDownloadProgressCallback((unsigned char*)buffer, bytesCount, 1 ); |
| + downloadRequest->executeExternalWriteCallback((unsigned char*)buffer, bytesCount, 1 ); |
| } |
| // For deferCacheRead, the user requires the downloadedDataSize but not the data. |
| downloadRequest->setDownloadedData( invalidData, dataSize); |
| @@ -1029,6 +1045,15 @@ bool rtFileDownloader::downloadByteRangeFromNetwork(rtFileDownloadRequest* downl |
| |
| if(downloadRequest->isProgressMeterSwitchOff()) |
| curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1); |
| + else |
| + { |
| + if(downloadRequest->progressCallback()) |
| + { |
| + curl_easy_setopt(curl_handle, CURLOPT_PROGRESSFUNCTION, downloadRequest->progressCallback()); |
| + curl_easy_setopt(curl_handle, CURLOPT_PROGRESSDATA, downloadRequest->progressCallbackUserPtr()); |
| + curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 0); |
| + } |
| + } |
| |
| if(downloadRequest->isHTTPFailOnError()) |
| { |
| @@ -1418,7 +1443,7 @@ void rtFileDownloader::downloadFile(rtFileDownloadRequest* downloadRequest) |
| memset(buffer, 0, downloadRequest->getCachedFileReadSize()); |
| bytesCount = fread(buffer, 1, downloadRequest->getCachedFileReadSize(), fp); |
| dataSize += bytesCount; |
| - downloadRequest->executeDownloadProgressCallback((unsigned char*)buffer, bytesCount, 1 ); |
| + downloadRequest->executeExternalWriteCallback((unsigned char*)buffer, bytesCount, 1 ); |
| } |
| // For deferCacheRead, the user requires the downloadedDataSize but not the data. |
| downloadRequest->setDownloadedData( invalidData, dataSize); |
| @@ -1537,6 +1562,15 @@ bool rtFileDownloader::downloadFromNetwork(rtFileDownloadRequest* downloadReques |
| |
| if(downloadRequest->isProgressMeterSwitchOff()) |
| curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1); |
| + else |
| + { |
| + if(downloadRequest->progressCallback()) |
| + { |
| + curl_easy_setopt(curl_handle, CURLOPT_PROGRESSFUNCTION, downloadRequest->progressCallback()); |
| + curl_easy_setopt(curl_handle, CURLOPT_PROGRESSDATA, downloadRequest->progressCallbackUserPtr()); |
| + curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 0); |
| + } |
| + } |
| |
| if(downloadRequest->isHTTPFailOnError()) |
| { |
| diff --git a/src/rtFileDownloader.h b/src/rtFileDownloader.h |
| index 9e66b04a6..66027c0de 100644 |
| --- a/src/rtFileDownloader.h |
| +++ b/src/rtFileDownloader.h |
| @@ -60,12 +60,15 @@ public: |
| void setErrorString(const char* errorString); |
| rtString errorString(); |
| void setCallbackFunction(void (*callbackFunction)(rtFileDownloadRequest*)); |
| - void setDownloadProgressCallbackFunction(size_t (*callbackFunction)(void *ptr, size_t size, size_t nmemb, void *userData), void *userPtr); |
| + void setExternalWriteCallback(size_t (*callbackFunction)(void *ptr, size_t size, size_t nmemb, void *userData), void *userPtr); |
| + void setProgressCallback(int (*callbackFunction)(void* ptr, double dltotal, double dlnow, double ultotal, double ulnow), void *userPtr); |
| + void* progressCallback(void); |
| + void* progressCallbackUserPtr(void); |
| void setCallbackFunctionThreadSafe(void (*callbackFunction)(rtFileDownloadRequest*)); |
| long httpStatusCode(); |
| void setHttpStatusCode(long statusCode); |
| bool executeCallback(int statusCode); |
| - size_t executeDownloadProgressCallback(void *ptr, size_t size, size_t nmemb); |
| + size_t executeExternalWriteCallback(void *ptr, size_t size, size_t nmemb); |
| void setDownloadedData(char* data, size_t size); |
| void downloadedData(char*& data, size_t& size); |
| char* downloadedData(); |
| @@ -151,8 +154,10 @@ private: |
| rtString mErrorString; |
| long mHttpStatusCode; |
| void (*mCallbackFunction)(rtFileDownloadRequest*); |
| - size_t (*mDownloadProgressCallbackFunction)(void *ptr, size_t size, size_t nmemb, void *userData); |
| - void *mDownloadProgressUserPtr; |
| + size_t (*mExternalWriteCallback)(void *ptr, size_t size, size_t nmemb, void *userData); |
| + void *mExternalWriteCallbackUserPtr; |
| + int (*mProgressCallback)(void* ptr, double TotalToDownload, double NowDownloaded, double TotalToUpload, double NowUploaded); |
| + void *mProgressCallbackUserPtr; |
| char* mDownloadedData; |
| size_t mDownloadedDataSize; |
| int mDownloadStatusCode; |