static HRESULT create_moniker(LPCWSTR url, IMoniker **mon) { WCHAR new_url[INTERNET_MAX_URL_LENGTH]; DWORD size; HRESULT hres; if(PathIsURLW(url)) return CreateURLMoniker(NULL, url, mon); if(url[1] == ':') { size = sizeof(new_url); hres = UrlCreateFromPathW(url, new_url, &size, 0); if(FAILED(hres)) { WARN("UrlCreateFromPathW failed: %08x\n", hres); return hres; } }else { size = sizeof(new_url)/sizeof(WCHAR); hres = UrlApplySchemeW(url, new_url, &size, URL_APPLY_GUESSSCHEME); TRACE("got %s\n", debugstr_w(new_url)); if(FAILED(hres)) { WARN("UrlApplyScheme failed: %08x\n", hres); return hres; } } return CreateURLMoniker(NULL, new_url, mon); }
static void test_UrlCreateFromPath(void) { size_t i; char ret_url[INTERNET_MAX_URL_LENGTH]; DWORD len, ret; WCHAR ret_urlW[INTERNET_MAX_URL_LENGTH]; WCHAR *pathW, *urlW; for(i = 0; i < sizeof(TEST_URLFROMPATH) / sizeof(TEST_URLFROMPATH[0]); i++) { len = INTERNET_MAX_URL_LENGTH; ret = UrlCreateFromPathA(TEST_URLFROMPATH[i].path, ret_url, &len, 0); ok(ret == TEST_URLFROMPATH[i].ret, "ret %08x from path %s\n", ret, TEST_URLFROMPATH[i].path); ok(!lstrcmpi(ret_url, TEST_URLFROMPATH[i].url), "url %s from path %s\n", ret_url, TEST_URLFROMPATH[i].path); ok(len == strlen(ret_url), "ret len %d from path %s\n", len, TEST_URLFROMPATH[i].path); len = INTERNET_MAX_URL_LENGTH; pathW = GetWideString(TEST_URLFROMPATH[i].path); urlW = GetWideString(TEST_URLFROMPATH[i].url); ret = UrlCreateFromPathW(pathW, ret_urlW, &len, 0); WideCharToMultiByte(CP_ACP, 0, ret_urlW, -1, ret_url, sizeof(ret_url),0,0); ok(ret == TEST_URLFROMPATH[i].ret, "ret %08x from path L\"%s\", expected %08x\n", ret, TEST_URLFROMPATH[i].path, TEST_URLFROMPATH[i].ret); ok(!lstrcmpiW(ret_urlW, urlW), "got %s expected %s from path L\"%s\"\n", ret_url, TEST_URLFROMPATH[i].url, TEST_URLFROMPATH[i].path); ok(len == lstrlenW(ret_urlW), "ret len %d from path L\"%s\"\n", len, TEST_URLFROMPATH[i].path); FreeWideString(urlW); FreeWideString(pathW); } }
HRESULT create_uri(const WCHAR *url, IUri **uri) { WCHAR fileUrl[INTERNET_MAX_URL_LENGTH]; TRACE("%s\n", debugstr_w(url)); if (!PathIsURLW(url)) { WCHAR fullpath[MAX_PATH]; DWORD needed = ARRAY_SIZE(fileUrl); if (!PathSearchAndQualifyW(url, fullpath, ARRAY_SIZE(fullpath))) { WARN("can't find path\n"); return E_FAIL; } if (FAILED(UrlCreateFromPathW(fullpath, fileUrl, &needed, 0))) { ERR("can't create url from path\n"); return E_FAIL; } url = fileUrl; } return CreateUri(url, Uri_CREATE_ALLOW_RELATIVE | Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME, 0, uri); }
static HRESULT WINAPI xmldoc_put_URL(IXMLDocument *iface, BSTR p) { WCHAR url[INTERNET_MAX_URL_LENGTH]; IStream *stream; IBindCtx *bctx; IMoniker *moniker; IPersistStreamInit *persist; HRESULT hr; TRACE("(%p, %s)\n", iface, debugstr_w(p)); if (!p) return E_INVALIDARG; if (!PathIsURLW(p)) { WCHAR fullpath[MAX_PATH]; DWORD needed = sizeof(url) / sizeof(WCHAR); if (!PathSearchAndQualifyW(p, fullpath, sizeof(fullpath) / sizeof(WCHAR))) { ERR("can't find path\n"); return E_FAIL; } if (FAILED(UrlCreateFromPathW(fullpath, url, &needed, 0))) { ERR("can't create url from path\n"); return E_FAIL; } p = url; } hr = CreateURLMoniker(NULL, p, &moniker); if (FAILED(hr)) return hr; CreateAsyncBindCtx(0, &xmldoc_bsc.IBindStatusCallback_iface, 0, &bctx); hr = IMoniker_BindToStorage(moniker, bctx, NULL, &IID_IStream, (LPVOID *)&stream); IBindCtx_Release(bctx); IMoniker_Release(moniker); if (FAILED(hr)) return hr; hr = IXMLDocument_QueryInterface(iface, &IID_IPersistStreamInit, (LPVOID *)&persist); if (FAILED(hr)) { IStream_Release(stream); return hr; } hr = IPersistStreamInit_Load(persist, stream); IPersistStreamInit_Release(persist); IStream_Release(stream); return hr; }
/* Helper function to add a file to a job. The helper function takes base file name and creates properly formed path and URL strings for creation of the file. */ static HRESULT addFileHelper(IBackgroundCopyJob* job, const WCHAR *localName, const WCHAR *remoteName) { DWORD urlSize; WCHAR localFile[MAX_PATH]; WCHAR remoteUrl[MAX_PATH]; WCHAR remoteFile[MAX_PATH]; GetCurrentDirectoryW(MAX_PATH, localFile); PathAppendW(localFile, localName); GetCurrentDirectoryW(MAX_PATH, remoteFile); PathAppendW(remoteFile, remoteName); urlSize = MAX_PATH; UrlCreateFromPathW(remoteFile, remoteUrl, &urlSize, 0); UrlUnescapeW(remoteUrl, NULL, &urlSize, URL_UNESCAPE_INPLACE); return IBackgroundCopyJob_AddFile(test_job, remoteUrl, localFile); }
HRESULT bind_url(LPCWSTR url, HRESULT (*onDataAvailable)(void*,char*,DWORD), void *obj, bsc_t **ret) { WCHAR fileUrl[INTERNET_MAX_URL_LENGTH]; bsc_t *bsc; IBindCtx *pbc; HRESULT hr; TRACE("%s\n", debugstr_w(url)); if(!PathIsURLW(url)) { WCHAR fullpath[MAX_PATH]; DWORD needed = sizeof(fileUrl)/sizeof(WCHAR); if(!PathSearchAndQualifyW(url, fullpath, sizeof(fullpath)/sizeof(WCHAR))) { WARN("can't find path\n"); return E_FAIL; } if(FAILED(UrlCreateFromPathW(url, fileUrl, &needed, 0))) { ERR("can't create url from path\n"); return E_FAIL; } url = fileUrl; } hr = CreateBindCtx(0, &pbc); if(FAILED(hr)) return hr; bsc = HeapAlloc(GetProcessHeap(), 0, sizeof(bsc_t)); bsc->lpVtbl = &bsc_vtbl; bsc->ref = 1; bsc->obj = obj; bsc->onDataAvailable = onDataAvailable; bsc->binding = NULL; bsc->memstream = NULL; hr = RegisterBindStatusCallback(pbc, (IBindStatusCallback*)&bsc->lpVtbl, NULL, 0); if(SUCCEEDED(hr)) { IMoniker *moniker; hr = CreateURLMoniker(NULL, url, &moniker); if(SUCCEEDED(hr)) { IStream *stream; hr = IMoniker_BindToStorage(moniker, pbc, NULL, &IID_IStream, (LPVOID*)&stream); IMoniker_Release(moniker); if(stream) IStream_Release(stream); } IBindCtx_Release(pbc); } if(FAILED(hr)) { IBindStatusCallback_Release((IBindStatusCallback*)&bsc->lpVtbl); bsc = NULL; } *ret = bsc; return hr; }