static void test_url_part(const char* szUrl, DWORD dwPart, DWORD dwFlags, const char* szExpected) { CHAR szPart[INTERNET_MAX_URL_LENGTH]; WCHAR wszPart[INTERNET_MAX_URL_LENGTH]; LPWSTR wszUrl = GetWideString(szUrl); LPWSTR wszConvertedPart; DWORD dwSize; dwSize = INTERNET_MAX_URL_LENGTH; ok( UrlGetPartA(szUrl, szPart, &dwSize, dwPart, dwFlags) == S_OK, "UrlGetPartA for \"%s\" part 0x%08x didn't return S_OK but \"%s\"\n", szUrl, dwPart, szPart); dwSize = INTERNET_MAX_URL_LENGTH; ok( UrlGetPartW(wszUrl, wszPart, &dwSize, dwPart, dwFlags) == S_OK, "UrlGetPartW didn't return S_OK\n" ); wszConvertedPart = GetWideString(szPart); ok(lstrcmpW(wszPart,wszConvertedPart)==0, "Strings didn't match between ascii and unicode UrlGetPart!\n"); FreeWideString(wszUrl); FreeWideString(wszConvertedPart); /* Note that v6.0 and later don't return '?' with the query */ ok(strcmp(szPart,szExpected)==0 || (*szExpected=='?' && !strcmp(szPart,szExpected+1)), "Expected %s, but got %s\n", szExpected, szPart); }
static HRESULT parse_domain(LPCWSTR url, DWORD flags, LPWSTR result, DWORD size, DWORD *rsize) { IInternetProtocolInfo *protocol_info; HRESULT hres; TRACE("(%s %08x %p %d %p)\n", debugstr_w(url), flags, result, size, rsize); protocol_info = get_protocol_info(url); if(protocol_info) { hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_DOMAIN, flags, result, size, rsize, 0); IInternetProtocolInfo_Release(protocol_info); if(SUCCEEDED(hres)) return hres; } hres = UrlGetPartW(url, result, &size, URL_PART_HOSTNAME, flags); if(rsize) *rsize = size; if(hres == E_POINTER) return S_FALSE; if(FAILED(hres)) return E_FAIL; return S_OK; }
/******************************************************************** * CoInternetGetSecurityUrl (URLMON.@) */ HRESULT WINAPI CoInternetGetSecurityUrl(LPCWSTR pwzUrl, LPWSTR *ppwzSecUrl, PSUACTION psuAction, DWORD dwReserved) { WCHAR *secure_url; HRESULT hres; TRACE("(%p,%p,%u,%u)\n", pwzUrl, ppwzSecUrl, psuAction, dwReserved); hres = parse_security_url(pwzUrl, psuAction, &secure_url); if(FAILED(hres)) return hres; if(psuAction != PSU_SECURITY_URL_ONLY) { PARSEDURLW parsed_url = { sizeof(parsed_url) }; DWORD size; /* FIXME: Use helpers from uri.c */ if(SUCCEEDED(ParseURLW(secure_url, &parsed_url))) { WCHAR *new_url; switch(parsed_url.nScheme) { case URL_SCHEME_FTP: case URL_SCHEME_HTTP: case URL_SCHEME_HTTPS: size = strlenW(secure_url)+1; new_url = CoTaskMemAlloc(size * sizeof(WCHAR)); if(new_url) hres = UrlGetPartW(secure_url, new_url, &size, URL_PART_HOSTNAME, URL_PARTFLAG_KEEPSCHEME); else hres = E_OUTOFMEMORY; CoTaskMemFree(secure_url); if(hres != S_OK) { WARN("UrlGetPart failed: %08x\n", hres); CoTaskMemFree(new_url); return FAILED(hres) ? hres : E_FAIL; } secure_url = new_url; } } } *ppwzSecUrl = secure_url; return S_OK; }
static HRESULT parse_rootdocument(LPCWSTR url, DWORD flags, LPWSTR result, DWORD size, DWORD *rsize) { IInternetProtocolInfo *protocol_info; PARSEDURLW url_info; HRESULT hres; TRACE("(%s %08x %p %d %p)\n", debugstr_w(url), flags, result, size, rsize); protocol_info = get_protocol_info(url); if(protocol_info) { hres = IInternetProtocolInfo_ParseUrl(protocol_info, url, PARSE_ROOTDOCUMENT, flags, result, size, rsize, 0); IInternetProtocolInfo_Release(protocol_info); if(SUCCEEDED(hres)) return hres; } url_info.cbSize = sizeof(url_info); if(FAILED(ParseURLW(url, &url_info))) return E_FAIL; switch(url_info.nScheme) { case URL_SCHEME_FTP: case URL_SCHEME_HTTP: case URL_SCHEME_HTTPS: if(url_info.cchSuffix<3 || *(url_info.pszSuffix)!='/' || *(url_info.pszSuffix+1)!='/') return E_FAIL; if(size < url_info.cchProtocol+3) { size = 0; hres = UrlGetPartW(url, result, &size, URL_PART_HOSTNAME, flags); if(rsize) *rsize = size+url_info.cchProtocol+3; if(hres == E_POINTER) return S_FALSE; return hres; } size -= url_info.cchProtocol+3; hres = UrlGetPartW(url, result+url_info.cchProtocol+3, &size, URL_PART_HOSTNAME, flags); if(hres == E_POINTER) return S_FALSE; if(FAILED(hres)) return E_FAIL; if(rsize) *rsize = size+url_info.cchProtocol+3; memcpy(result, url, (url_info.cchProtocol+3)*sizeof(WCHAR)); return hres; default: return E_FAIL; } }
HRESULT CDebugLog::DumpDebugLog(DWORD dwDetailLvl, HRESULT hrLog) { HRESULT hr = S_OK; HANDLE hFile = INVALID_HANDLE_VALUE; LISTNODE pos = NULL; LPWSTR wzUrlName=NULL; CDebugLogElement *pLogElem = NULL; WCHAR wzFileName[MAX_PATH]; WCHAR wzSiteName[MAX_PATH]; WCHAR wzAppLogDir[MAX_PATH]; LPWSTR wzResourceName = NULL; DWORD dwBytes; DWORD dwSize; CCriticalSection cs(&g_csBindLog); BOOL bRet; if (!g_dwLogFailures && !g_dwForceLog) { return S_FALSE; } hr = cs.Lock(); if (FAILED(hr)) { return hr; } pos = _listDbgMsg.GetHeadPosition(); if (!pos) { hr = S_FALSE; goto Exit; } wzUrlName = NEW(WCHAR[MAX_URL_LENGTH+1]); if (!wzUrlName) { hr = E_OUTOFMEMORY; goto Exit; } // Build the log entry URL and Wininet cache file wnsprintfW(wzUrlName, MAX_URL_LENGTH, L"?FusionBindError!exe=%ws!name=%ws", _wzEXEName, _pwzAsmName); { wnsprintfW(wzAppLogDir, MAX_PATH, L"%ws\\%ws", _szLogPath, _wzEXEName); if (GetFileAttributes(wzAppLogDir) == (DWORD) -1) { bRet = CreateDirectory(wzAppLogDir, NULL); if (!bRet) { hr = HRESULT_FROM_WIN32(GetLastError()); goto Exit; } } if (PathIsURLW(_pwzAsmName)) { // This was a where-ref bind. We can't spit out a filename w/ // the URL of the bind because the URL has invalid filename chars. // The best we can do is show that it was a where-ref bind, and // give the filename, and maybe the site. dwSize = MAX_PATH; hr = UrlGetPartW(_pwzAsmName, wzSiteName, &dwSize, URL_PART_HOSTNAME, 0); if (FAILED(hr)) { goto Exit; } wzResourceName = PathFindFileName(_pwzAsmName); ASSERT(wzResourceName); if (!lstrlenW(wzSiteName)) { lstrcpyW(wzSiteName, L"LocalMachine"); } wnsprintfW(wzFileName, MAX_PATH, L"%ws\\FusionBindError!exe=%ws!name=WhereRefBind!Host=(%ws)!FileName=(%ws).HTM", wzAppLogDir, _wzEXEName, wzSiteName, wzResourceName); } else { wnsprintfW(wzFileName, MAX_PATH, L"%ws\\FusionBindError!exe=%ws!name=%ws.HTM", wzAppLogDir, _wzEXEName, _pwzAsmName); } } // Create the and write the log file hr = CreateLogFile(&hFile, wzFileName, _wzEXEName, hrLog); if (FAILED(hr)) { goto Exit; } pos = _listDbgMsg.GetHeadPosition(); while (pos) { pLogElem = _listDbgMsg.GetNext(pos); ASSERT(pLogElem); if (pLogElem->_dwDetailLvl <= dwDetailLvl) { pLogElem->Dump(hFile); WriteFile(hFile, DEBUG_LOG_NEW_LINE, lstrlenW(DEBUG_LOG_NEW_LINE) * sizeof(WCHAR), &dwBytes, NULL); } } // Close the log file and commit the wininet cache entry hr = CloseLogFile(&hFile); if (FAILED(hr)) { goto Exit; } Exit: cs.Unlock(); SAFEDELETEARRAY(wzUrlName); return hr; }