| 22 | } |
| 23 | |
| 24 | static size_t WriteMemoryCallback(void* contents, size_t size, size_t nmemb, void* userp) |
| 25 | { |
| 26 | NetRequest* netRequest = (NetRequest*)userp; |
| 27 | |
| 28 | long response_code = 0; |
| 29 | curl_easy_getinfo(netRequest->mCURL, CURLINFO_RESPONSE_CODE, &response_code); |
| 30 | |
| 31 | if (netRequest->mCancelling) |
| 32 | { |
| 33 | netRequest->mFailed = true; |
| 34 | return 0; |
| 35 | } |
| 36 | |
| 37 | if (response_code != 200) |
| 38 | return 0; |
| 39 | |
| 40 | if (netRequest->mFailed) |
| 41 | return 0; |
| 42 | |
| 43 | if (!netRequest->mOutFile.IsOpen()) |
| 44 | { |
| 45 | RecursiveCreateDirectory(GetFileDir(netRequest->mOutPath)); |
| 46 | if (!netRequest->mOutFile.Open(netRequest->mOutTempPath, BfpFileCreateKind_CreateAlways, BfpFileCreateFlag_Write)) |
| 47 | { |
| 48 | netRequest->Fail(StrFormat("Failed to create file '%s'", netRequest->mOutTempPath.c_str())); |
| 49 | return 0; |
| 50 | } |
| 51 | } |
| 52 | |
| 53 | uint32 tickNow = BFTickCount(); |
| 54 | |
| 55 | if (tickNow - netRequest->mLastUpdateTick >= 500) |
| 56 | { |
| 57 | curl_off_t downloadSize = 0; |
| 58 | curl_easy_getinfo(netRequest->mCURL, CURLINFO_SIZE_DOWNLOAD_T, &downloadSize); |
| 59 | curl_off_t length = 0; |
| 60 | curl_easy_getinfo(netRequest->mCURL, CURLINFO_CONTENT_LENGTH_DOWNLOAD_T, &length); |
| 61 | |
| 62 | if (netRequest->mShowTracking) |
| 63 | { |
| 64 | String msg = StrFormat("symsrv Getting '%s' - %dk", netRequest->mURL.c_str(), (int)(downloadSize / 1024)); |
| 65 | |
| 66 | if (length > 0) |
| 67 | { |
| 68 | msg += StrFormat(" (%d%%)", (int)(downloadSize * 100 / length)); |
| 69 | } |
| 70 | |
| 71 | netRequest->mNetManager->mDebugManager->OutputRawMessage(msg); |
| 72 | } |
| 73 | |
| 74 | netRequest->mLastUpdateTick = tickNow; |
| 75 | } |
| 76 | |
| 77 | size_t realsize = size * nmemb; |
| 78 | netRequest->mOutFile.Write(contents, (int)realsize); |
| 79 | return realsize; |
| 80 | } |
| 81 | |