static void on_before_navigate2(DocHost *This, LPCWSTR url, SAFEARRAY *post_data, LPWSTR headers, VARIANT_BOOL *cancel) { VARIANT var_url, var_flags, var_frame_name, var_post_data, var_post_data2, var_headers; DISPPARAMS dispparams; VARIANTARG params[7]; WCHAR file_path[MAX_PATH]; DWORD file_path_len = sizeof(file_path) / sizeof(*file_path); dispparams.cArgs = 7; dispparams.cNamedArgs = 0; dispparams.rgdispidNamedArgs = NULL; dispparams.rgvarg = params; This->busy = VARIANT_TRUE; V_VT(params) = VT_BOOL|VT_BYREF; V_BOOLREF(params) = cancel; V_VT(params+1) = (VT_BYREF|VT_VARIANT); V_VARIANTREF(params+1) = &var_headers; V_VT(&var_headers) = VT_BSTR; V_BSTR(&var_headers) = headers; V_VT(params+2) = (VT_BYREF|VT_VARIANT); V_VARIANTREF(params+2) = &var_post_data2; V_VT(&var_post_data2) = (VT_BYREF|VT_VARIANT); V_VARIANTREF(&var_post_data2) = &var_post_data; if(post_data) { V_VT(&var_post_data) = VT_UI1|VT_ARRAY; V_ARRAY(&var_post_data) = post_data; }else { V_VT(&var_post_data) = VT_EMPTY; } V_VT(params+3) = (VT_BYREF|VT_VARIANT); V_VARIANTREF(params+3) = &var_frame_name; V_VT(&var_frame_name) = VT_BSTR; V_BSTR(&var_frame_name) = NULL; V_VT(params+4) = (VT_BYREF|VT_VARIANT); V_VARIANTREF(params+4) = &var_flags; V_VT(&var_flags) = VT_I4; V_I4(&var_flags) = 0; V_VT(params+5) = (VT_BYREF|VT_VARIANT); V_VARIANTREF(params+5) = &var_url; V_VT(&var_url) = VT_BSTR; if(PathCreateFromUrlW(url, file_path, &file_path_len, 0) == S_OK) V_BSTR(&var_url) = SysAllocString(file_path); else V_BSTR(&var_url) = SysAllocString(url); V_VT(params+6) = (VT_DISPATCH); V_DISPATCH(params+6) = (IDispatch*)This->wb; call_sink(This->cps.wbe2, DISPID_BEFORENAVIGATE2, &dispparams); SysFreeString(V_BSTR(&var_url)); }
static HRESULT parse_path_from_url(LPCWSTR url, DWORD flags, LPWSTR result, DWORD size, DWORD *rsize) { IInternetProtocolInfo *protocol_info; DWORD prsize; 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_PATH_FROM_URL, flags, result, size, rsize, 0); IInternetProtocolInfo_Release(protocol_info); if(SUCCEEDED(hres)) return hres; } prsize = size; hres = PathCreateFromUrlW(url, result, &prsize, 0); if(rsize) *rsize = prsize; return hres; }
HRESULT PathCreateFromUrlWrap(LPCWSTR pszUrl, LPWSTR pszPath, LPDWORD pcchPath, DWORD dwFlags) { HRESULT hr = S_OK; DWORD dw; WCHAR wzEscaped[MAX_URL_LENGTH]; if (!UrlIsW(pszUrl, URLIS_FILEURL)) { hr = E_INVALIDARG; goto Exit; } dw = MAX_URL_LENGTH; hr = UrlEscapeW(pszUrl, wzEscaped, &dw, URL_ESCAPE_PERCENT); if (FAILED(hr)) { goto Exit; } hr = PathCreateFromUrlW(wzEscaped, pszPath, pcchPath, dwFlags); if (FAILED(hr)) { goto Exit; } Exit: return hr; }
HRESULT RemoveDirectoryAndChildren(LPWSTR szDir) { HRESULT hr = S_OK; HANDLE hf = INVALID_HANDLE_VALUE; TCHAR szBuf[MAX_PATH]; WIN32_FIND_DATA fd; LPWSTR wzCanonicalized=NULL; WCHAR wzPath[MAX_PATH]; DWORD dwSize; if (!szDir || !lstrlenW(szDir)) { hr = E_INVALIDARG; goto Exit; } wzPath[0] = L'\0'; wzCanonicalized = NEW(WCHAR[MAX_URL_LENGTH+1]); if (!wzCanonicalized) { hr = E_OUTOFMEMORY; goto Exit; } dwSize = MAX_URL_LENGTH; hr = UrlCanonicalizeW(szDir, wzCanonicalized, &dwSize, 0); if (FAILED(hr)) { goto Exit; } dwSize = MAX_PATH; hr = PathCreateFromUrlW(wzCanonicalized, wzPath, &dwSize, 0); if (FAILED(hr)) { goto Exit; } // Cannot delete root. Path must have greater length than "x:\" if (lstrlenW(wzPath) < 4) { ASSERT(0); hr = HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED); goto Exit; } if (RemoveDirectory(wzPath)) { goto Exit; } // ha! we have a case where the directory is probbaly not empty StrCpy(szBuf, wzPath); StrCat(szBuf, TEXT("\\*")); if ((hf = FindFirstFile(szBuf, &fd)) == INVALID_HANDLE_VALUE) { hr = FusionpHresultFromLastError(); goto Exit; } do { if ( (StrCmp(fd.cFileName, TEXT(".")) == 0) || (StrCmp(fd.cFileName, TEXT("..")) == 0)) continue; wnsprintf(szBuf, MAX_PATH-1, TEXT("%s\\%s"), wzPath, fd.cFileName); if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { SetFileAttributes(szBuf, FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_NORMAL); if (FAILED((hr=RemoveDirectoryAndChildren(szBuf)))) { goto Exit; } } else { SetFileAttributes(szBuf, FILE_ATTRIBUTE_NORMAL); if (!DeleteFile(szBuf)) { hr = FusionpHresultFromLastError(); #ifdef DEBUG if((hr != HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) && (hr != HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND))) { WCHAR szMsgBuf[MAX_PATH*2 + 1]; wnsprintf( szMsgBuf, MAX_PATH*2, L" RemoveDirectoryAndChildren: DeleteFile(<%s>) failed hr = <%x>\r\n", szBuf, hr); WriteToLogFile(szMsgBuf); } #endif // DEBUG goto Exit; } } } while (FindNextFile(hf, &fd)); if (GetLastError() != ERROR_NO_MORE_FILES) { hr = FusionpHresultFromLastError(); goto Exit; } if (hf != INVALID_HANDLE_VALUE) { FindClose(hf); hf = INVALID_HANDLE_VALUE; } // here if all subdirs/children removed /// re-attempt to remove the main dir if (!RemoveDirectory(wzPath)) { hr = FusionpHresultFromLastError(); #ifdef DEBUG WCHAR szMsgBuf[MAX_PATH*2 + 1]; wnsprintf( szMsgBuf, MAX_PATH*2, L" RemoveDirectoryAndChildren: RemoveDirectory(<%s>) failed hr = <%x>\r\n", wzPath, hr); WriteToLogFile(szMsgBuf); #endif // DEBUG goto Exit; } Exit: if(hr == HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED)) hr = HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION); if (hf != INVALID_HANDLE_VALUE) FindClose(hf); SAFEDELETEARRAY(wzCanonicalized); return hr; }
static HRESULT WINAPI DocObjectService_FireBeforeNavigate2( IDocObjectService* iface, IDispatch *pDispatch, LPCWSTR lpszUrl, DWORD dwFlags, LPCWSTR lpszFrameName, BYTE *pPostData, DWORD cbPostData, LPCWSTR lpszHeaders, BOOL fPlayNavSound, BOOL *pfCancel) { ShellBrowser *This = impl_from_IDocObjectService(iface); VARIANT var_url, var_flags, var_frame_name, var_post_data, var_post_data2, var_headers; VARIANTARG params[7]; DISPPARAMS dp = {params, NULL, 7, 0}; VARIANT_BOOL cancel = VARIANT_FALSE; SAFEARRAY *post_data; WCHAR file_path[MAX_PATH]; DWORD file_path_len = sizeof(file_path) / sizeof(*file_path); TRACE("%p %p %s %x %s %p %d %s %d %p\n", This, pDispatch, debugstr_w(lpszUrl), dwFlags, debugstr_w(lpszFrameName), pPostData, cbPostData, debugstr_w(lpszHeaders), fPlayNavSound, pfCancel); if(cbPostData) { post_data = SafeArrayCreateVector(VT_UI1, 0, cbPostData); if(!post_data) return E_OUTOFMEMORY; memcpy(post_data->pvData, pPostData, cbPostData); }else { post_data = NULL; } V_VT(params) = VT_BOOL|VT_BYREF; V_BOOLREF(params) = &cancel; V_VT(params+1) = (VT_BYREF|VT_VARIANT); V_VARIANTREF(params+1) = &var_headers; V_VT(&var_headers) = VT_BSTR; V_BSTR(&var_headers) = lpszHeaders ? SysAllocString(lpszHeaders) : NULL; V_VT(params+2) = (VT_BYREF|VT_VARIANT); V_VARIANTREF(params+2) = &var_post_data2; V_VT(&var_post_data2) = (VT_BYREF|VT_VARIANT); V_VARIANTREF(&var_post_data2) = &var_post_data; if(post_data) { V_VT(&var_post_data) = VT_UI1|VT_ARRAY; V_ARRAY(&var_post_data) = post_data; }else { V_VT(&var_post_data) = VT_EMPTY; } V_VT(params+3) = (VT_BYREF|VT_VARIANT); V_VARIANTREF(params+3) = &var_frame_name; V_VT(&var_frame_name) = VT_BSTR; V_BSTR(&var_frame_name) = lpszFrameName ? SysAllocString(lpszFrameName) : NULL; V_VT(params+4) = (VT_BYREF|VT_VARIANT); V_VARIANTREF(params+4) = &var_flags; V_VT(&var_flags) = VT_I4; V_I4(&var_flags) = 0; V_VT(params+5) = (VT_BYREF|VT_VARIANT); V_VARIANTREF(params+5) = &var_url; V_VT(&var_url) = VT_BSTR; if(PathCreateFromUrlW(lpszUrl, file_path, &file_path_len, 0) == S_OK) V_BSTR(&var_url) = SysAllocString(file_path); else V_BSTR(&var_url) = SysAllocString(lpszUrl); V_VT(params+6) = (VT_DISPATCH); V_DISPATCH(params+6) = (IDispatch*)This->doc_host->wb; /* Keep reference to This. It may be released in event handler. */ IShellBrowser_AddRef(&This->IShellBrowser_iface); TRACE(">>>\n"); call_sink(This->doc_host->cps.wbe2, DISPID_BEFORENAVIGATE2, &dp); TRACE("<<<\n"); IShellBrowser_Release(&This->IShellBrowser_iface); SysFreeString(V_BSTR(&var_url)); SysFreeString(V_BSTR(&var_headers)); SysFreeString(V_BSTR(&var_frame_name)); SafeArrayDestroy(post_data); *pfCancel = !!cancel; return S_OK; }