bstr_t CCommonUtils::CreateRelativeURL(bstr_t baseURL, bstr_t relURL) { WCHAR ret[INTERNET_MAX_URL_LENGTH]; DWORD dwLen = INTERNET_MAX_URL_LENGTH; HRESULT hr = E_FAIL; if(PathIsURL(baseURL)) { hr = UrlCombine(baseURL, relURL, ret, &dwLen, 0); if(FAILED(hr)) { throw _com_error(hr); } } else { hr = StringCchCopyW(ret, sizeof(ret)/sizeof(WCHAR), relURL); if(FAILED(hr)) { throw _com_error(hr); } } return ret; }
void web_page::make_url( LPCWSTR url, LPCWSTR basepath, std::wstring& out ) { if(PathIsRelative(url) && !PathIsURL(url)) { if(basepath && basepath[0]) { DWORD dl = lstrlen(url) + lstrlen(basepath) + 1; LPWSTR abs_url = new WCHAR[dl]; HRESULT res = UrlCombine(basepath, url, abs_url, &dl, 0); if (res == E_POINTER) { delete abs_url; abs_url = new WCHAR[dl + 1]; if (UrlCombine(basepath, url, abs_url, &dl, 0) == S_OK) { out = abs_url; } } else if (res == S_OK) { out = abs_url; } delete abs_url; } else { DWORD dl = lstrlen(url) + (DWORD) m_base_path.length() + 1; LPWSTR abs_url = new WCHAR[dl]; HRESULT res = UrlCombine(m_base_path.c_str(), url, abs_url, &dl, 0); if (res == E_POINTER) { delete abs_url; abs_url = new WCHAR[dl + 1]; if (UrlCombine(m_base_path.c_str(), url, abs_url, &dl, 0) == S_OK) { out = abs_url; } } else if (res == S_OK) { out = abs_url; } delete abs_url; } } else { if(PathIsURL(url)) { out = url; } else { DWORD dl = lstrlen(url) + 1; LPWSTR abs_url = new WCHAR[dl]; HRESULT res = UrlCreateFromPath(url, abs_url, &dl, 0); if (res == E_POINTER) { delete abs_url; abs_url = new WCHAR[dl + 1]; if (UrlCreateFromPath(url, abs_url, &dl, 0) == S_OK) { out = abs_url; } } else if (res == S_OK) { out = abs_url; } delete abs_url; } } if(out.substr(0, 8) == L"file:///") { out.erase(5, 1); } if(out.substr(0, 7) == L"file://") { out.erase(0, 7); } }