/****************************************************************** * ParseURLFromOutsideSourceW (SHDOCVW.170) */ DWORD WINAPI ParseURLFromOutsideSourceW(LPCWSTR url, LPWSTR out, LPDWORD plen, LPDWORD unknown) { WCHAR buffer_in[INTERNET_MAX_URL_LENGTH]; WCHAR buffer_out[INTERNET_MAX_URL_LENGTH]; LPCWSTR ptr = url; HRESULT hr; DWORD needed; DWORD len; DWORD res = 0; TRACE("(%s, %p, %p, %p) len: %d, unknown: 0x%x\n", debugstr_w(url), out, plen, unknown, plen ? *plen : 0, unknown ? *unknown : 0); if (!PathIsURLW(ptr)) { len = sizeof(buffer_in) / sizeof(buffer_in[0]); buffer_in[0] = 0; hr = UrlApplySchemeW(ptr, buffer_in, &len, URL_APPLY_GUESSSCHEME); TRACE("got 0x%x with %s\n", hr, debugstr_w(buffer_in)); if (hr != S_OK) { /* when we can't guess the scheme, use the default scheme */ len = sizeof(buffer_in) / sizeof(buffer_in[0]); hr = UrlApplySchemeW(ptr, buffer_in, &len, URL_APPLY_DEFAULT); } if (hr == S_OK) { /* we parsed the url to buffer_in */ ptr = buffer_in; } else { FIXME("call search hook for %s\n", debugstr_w(ptr)); } } len = sizeof(buffer_out) / sizeof(buffer_out[0]); buffer_out[0] = '\0'; hr = UrlCanonicalizeW(ptr, buffer_out, &len, URL_ESCAPE_SPACES_ONLY); needed = lstrlenW(buffer_out)+1; TRACE("got 0x%x with %s (need %d)\n", hr, debugstr_w(buffer_out), needed); if (*plen >= needed) { if (out != NULL) { lstrcpyW(out, buffer_out); res++; } needed--; } *plen = needed; TRACE("=> %d\n", res); return res; }
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); }
HRESULT navigate_url(DocHost *This, LPCWSTR url, const VARIANT *Flags, const VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers) { PBYTE post_data = NULL; ULONG post_data_len = 0; LPWSTR headers = NULL; HRESULT hres = S_OK; TRACE("navigating to %s\n", debugstr_w(url)); if((Flags && V_VT(Flags) != VT_EMPTY) || (TargetFrameName && V_VT(TargetFrameName) != VT_EMPTY)) FIXME("Unsupported args (Flags %p:%d; TargetFrameName %p:%d)\n", Flags, Flags ? V_VT(Flags) : -1, TargetFrameName, TargetFrameName ? V_VT(TargetFrameName) : -1); if(PostData && V_VT(PostData) == (VT_ARRAY | VT_UI1) && V_ARRAY(PostData)) { SafeArrayAccessData(V_ARRAY(PostData), (void**)&post_data); post_data_len = V_ARRAY(PostData)->rgsabound[0].cElements; } if(Headers && V_VT(Headers) == VT_BSTR) { headers = V_BSTR(Headers); TRACE("Headers: %s\n", debugstr_w(headers)); } set_doc_state(This, READYSTATE_LOADING); This->ready_state = READYSTATE_LOADING; if(This->doc_navigate) { WCHAR new_url[INTERNET_MAX_URL_LENGTH]; if(PathIsURLW(url)) { new_url[0] = 0; }else { DWORD size; size = sizeof(new_url)/sizeof(WCHAR); hres = UrlApplySchemeW(url, new_url, &size, URL_APPLY_GUESSSCHEME); if(FAILED(hres)) { WARN("UrlApplyScheme failed: %08x\n", hres); new_url[0] = 0; } } hres = async_doc_navigate(This, *new_url ? new_url : url, headers, post_data, post_data_len, TRUE); }else { task_navigate_bsc_t *task; task = heap_alloc(sizeof(*task)); task->bsc = create_callback(This, url, post_data, post_data_len, headers); push_dochost_task(This, &task->header, navigate_bsc_proc, This->url == NULL); } if(post_data) SafeArrayUnaccessData(V_ARRAY(PostData)); return hres; }
static enum content get_content_type(LPCOLESTR name, CLSID *control_id) { WCHAR new_urlW[MAX_PATH]; DWORD size = MAX_PATH; WCHAR mshtml_prefixW[] = {'m','s','h','t','m','l',':','\0'}; if (!name || !name[0]) { WARN("name %s\n", wine_dbgstr_w(name)); return IsEmpty; } if (CLSIDFromString(name, control_id) == S_OK || CLSIDFromProgID(name, control_id) == S_OK) return IsGUID; if (PathIsURLW (name) || UrlApplySchemeW(name, new_urlW, &size, URL_APPLY_GUESSSCHEME|URL_APPLY_GUESSFILE) == S_OK) { *control_id = CLSID_WebBrowser; return IsURL; } if (!strncmpiW(name, mshtml_prefixW, 7)) { FIXME("mshtml prefix not implemented\n"); *control_id = CLSID_WebBrowser; return IsHTML; } return IsUnknown; }
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); size = sizeof(new_url)/sizeof(WCHAR); hres = UrlApplySchemeW(url, new_url, &size, URL_APPLY_GUESSSCHEME | URL_APPLY_GUESSFILE | URL_APPLY_DEFAULT); TRACE("was %s got %s\n", debugstr_w(url), debugstr_w(new_url)); if(FAILED(hres)) { WARN("UrlApplyScheme failed: %08x\n", hres); return hres; } return CreateURLMoniker(NULL, new_url, mon); }
HRESULT navigate_url(DocHost *This, LPCWSTR url, const VARIANT *Flags, const VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers) { SAFEARRAY *post_array = NULL; PBYTE post_data = NULL; ULONG post_data_len = 0; LPWSTR headers = NULL; HRESULT hres = S_OK; TRACE("navigating to %s\n", debugstr_w(url)); if((Flags && V_VT(Flags) != VT_EMPTY && V_VT(Flags) != VT_ERROR) || (TargetFrameName && V_VT(TargetFrameName) != VT_EMPTY && V_VT(TargetFrameName) != VT_ERROR)) FIXME("Unsupported args (Flags %s; TargetFrameName %s)\n", debugstr_variant(Flags), debugstr_variant(TargetFrameName)); if(PostData) { if(V_VT(PostData) & VT_ARRAY) post_array = V_ISBYREF(PostData) ? *V_ARRAYREF(PostData) : V_ARRAY(PostData); else WARN("Invalid post data %s\n", debugstr_variant(PostData)); } if(post_array) { LONG elem_max; SafeArrayAccessData(post_array, (void**)&post_data); SafeArrayGetUBound(post_array, 1, &elem_max); post_data_len = (elem_max+1) * SafeArrayGetElemsize(post_array); } if(Headers && V_VT(Headers) == VT_BSTR) { headers = V_BSTR(Headers); TRACE("Headers: %s\n", debugstr_w(headers)); } set_doc_state(This, READYSTATE_LOADING); This->ready_state = READYSTATE_LOADING; if(This->doc_navigate) { WCHAR new_url[INTERNET_MAX_URL_LENGTH]; if(PathIsURLW(url)) { new_url[0] = 0; }else { DWORD size; size = sizeof(new_url)/sizeof(WCHAR); hres = UrlApplySchemeW(url, new_url, &size, URL_APPLY_GUESSSCHEME | URL_APPLY_GUESSFILE | URL_APPLY_DEFAULT); if(FAILED(hres)) { WARN("UrlApplyScheme failed: %08x\n", hres); new_url[0] = 0; } } hres = async_doc_navigate(This, *new_url ? new_url : url, headers, post_data, post_data_len, TRUE); }else { task_navigate_bsc_t *task; task = heap_alloc(sizeof(*task)); task->bsc = create_callback(This, url, post_data, post_data_len, headers); push_dochost_task(This, &task->header, navigate_bsc_proc, navigate_bsc_task_destr, This->url == NULL); } if(post_data) SafeArrayUnaccessData(post_array); return hres; }