static HRESULT DownloadUpdateFeed( __in_z LPCWSTR wzBundleId, __in BURN_USER_EXPERIENCE* pUX, __in BURN_UPDATE* pUpdate, __out_opt LPWSTR* psczTempFile ) { HRESULT hr = S_OK; DOWNLOAD_SOURCE downloadSource = { }; DOWNLOAD_CACHE_CALLBACK cacheCallback = { }; DOWNLOAD_AUTHENTICATION_CALLBACK authenticationCallback = { }; DETECT_AUTHENTICATION_REQUIRED_DATA authenticationData = { }; LPWSTR sczUpdateId = NULL; LPWSTR sczDestinationPath = NULL; LPWSTR sczError = NULL; DWORD64 qwDownloadSize = 0; // Always do our work in the working folder, even if cached. hr = PathCreateTimeBasedTempFile(NULL, L"UpdateFeed", NULL, L"xml", &sczDestinationPath, NULL); ExitOnFailure(hr, "Failed to create UpdateFeed based on current system time."); // Do we need a means of the BA to pass in a username and password? If so, we should copy it to downloadSource here hr = StrAllocString(&downloadSource.sczUrl, pUpdate->sczUpdateSource, 0); ExitOnFailure(hr, "Failed to copy update url."); cacheCallback.pfnProgress = NULL; //UpdateProgressRoutine; cacheCallback.pfnCancel = NULL; // TODO: set this cacheCallback.pv = NULL; //pProgress; authenticationData.pUX = pUX; authenticationData.wzPackageOrContainerId = wzBundleId; authenticationCallback.pv = static_cast<LPVOID>(&authenticationData); authenticationCallback.pfnAuthenticate = &AuthenticationRequired; hr = DownloadUrl(&downloadSource, qwDownloadSize, sczDestinationPath, &cacheCallback, &authenticationCallback); ExitOnFailure2(hr, "Failed attempt to download update feed from URL: '%ls' to: '%ls'", downloadSource.sczUrl, sczDestinationPath); if (psczTempFile) { hr = StrAllocString(psczTempFile, sczDestinationPath, 0); ExitOnFailure(hr, "Failed to copy temp file string."); } LExit: ReleaseStr(downloadSource.sczUrl); ReleaseStr(downloadSource.sczUser); ReleaseStr(downloadSource.sczPassword); ReleaseStr(sczUpdateId); ReleaseStr(sczDestinationPath); ReleaseStr(sczError); return hr; }
// Fetches the data from the net and parses the page unsigned __stdcall NetworkThreadProc(void* pParam) { MeasureData* measure = (MeasureData*)pParam; DWORD dwSize = 0; RmLogF(measure->rm, LOG_DEBUG, L"WebParser: Fetching: %s", measure->url.c_str()); BYTE* data = DownloadUrl(measure->proxy.handle, measure->url, &dwSize, measure->forceReload); if (!data) { ShowError(measure->rm, L"Fetch error"); if (!measure->onConnectErrAction.empty()) { RmExecute(measure->skin, measure->onConnectErrAction.c_str()); } } else { if (measure->debug == 2) { // Dump to a file FILE* file = _wfopen(measure->debugFileLocation.c_str(), L"wb"); if (file) { fwrite(data, sizeof(BYTE), dwSize, file); fclose(file); } else { RmLog(measure->rm, LOG_ERROR, L"WebParser: Failed to dump debug data"); } } ParseData(measure, data, dwSize); free(data); } EnterCriticalSection(&g_CriticalSection); CloseHandle(measure->threadHandle); measure->threadHandle = 0; LeaveCriticalSection(&g_CriticalSection); return 0; // thread completed successfully }
bool cYTFeedParser::ParseFeed(std::string &url) { videos.clear(); std::string answer; curfeedfile = thumbnail_dir; curfeedfile += "/"; curfeedfile += curfeed; curfeedfile += ".xml"; #ifdef CACHE_FILES if(!DownloadUrl(url, cfile)) return false; #else if (!getUrl(url, answer)) return false; #endif return parseFeedJSON(answer); }
bool cYTFeedParser::DownloadThumbnail(cYTVideoInfo &vinfo, CURL *_curl_handle) { if (!_curl_handle) _curl_handle = curl_handle; bool found = false; if (!vinfo.thumbnail.empty()) { std::string fname = thumbnail_dir + "/" + vinfo.id + ".jpg"; found = !access(fname, F_OK); if (!found) { for (int *fmtp = itags; *fmtp && !found; fmtp++) found = cYTCache::getInstance()->getNameIfExists(fname, vinfo.id, *fmtp); } if (!found) found = DownloadUrl(vinfo.thumbnail, fname, _curl_handle); if (found) vinfo.tfile = fname; } return found; }
// Fetches the data from the net and parses the page unsigned __stdcall NetworkThreadProc(void* pParam) { MeasureData* measure = (MeasureData*)pParam; DWORD dwSize = 0; BYTE* data = DownloadUrl(measure->proxy.handle, measure->url, &dwSize, measure->forceReload); if (data) { if (measure->debug == 2) { // Dump to a file FILE* file = _wfopen(measure->debugFileLocation.c_str(), L"wb"); if (file) { fwrite(data, sizeof(BYTE), dwSize, file); fclose(file); } else { std::wstring log = L"WebParser.dll: ["; log += measure->section; log += L"] Failed to dump debug data: "; log += measure->debugFileLocation; RmLog(LOG_ERROR, log.c_str()); } } ParseData(measure, (LPCSTR)data, dwSize); free(data); } EnterCriticalSection(&g_CriticalSection); CloseHandle(measure->threadHandle); measure->threadHandle = 0; LeaveCriticalSection(&g_CriticalSection); return 0; // thread completed successfully }