sync urlmon to wine 1.1.39

svn path=/trunk/; revision=45834
This commit is contained in:
Christoph von Wittich 2010-03-04 15:24:17 +00:00
parent 7473d1aab3
commit 266a9a6369
18 changed files with 813 additions and 38 deletions

View file

@ -98,6 +98,7 @@ struct Binding {
LPWSTR mime;
UINT clipboard_format;
LPWSTR url;
LPWSTR redirect_url;
IID iid;
BOOL report_mime;
DWORD state;
@ -829,6 +830,7 @@ static ULONG WINAPI Binding_Release(IBinding *iface)
This->section.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&This->section);
heap_free(This->mime);
heap_free(This->redirect_url);
heap_free(This->url);
heap_free(This);
@ -967,6 +969,11 @@ static HRESULT WINAPI InternetProtocolSink_ReportProgress(IInternetProtocolSink
case BINDSTATUS_CONNECTING:
on_progress(This, 0, 0, BINDSTATUS_CONNECTING, szStatusText);
break;
case BINDSTATUS_REDIRECTING:
heap_free(This->redirect_url);
This->redirect_url = heap_strdupW(szStatusText);
on_progress(This, 0, 0, BINDSTATUS_REDIRECTING, szStatusText);
break;
case BINDSTATUS_BEGINDOWNLOADDATA:
fill_stgmed_buffer(This->stgmed_buf);
break;
@ -1474,6 +1481,8 @@ static HRESULT start_binding(IMoniker *mon, Binding *binding_ctx, LPCWSTR url, I
if(binding_ctx) {
set_binding_sink(binding->protocol, PROTSINK(binding));
if(binding_ctx->redirect_url)
IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_REDIRECTING, binding_ctx->redirect_url);
report_data(binding, 0, 0, 0);
}else {
hres = IInternetProtocol_Start(binding->protocol, url, PROTSINK(binding),

View file

@ -205,7 +205,7 @@ static void push_task(BindProtocol *This, task_header_t *task, task_proc_t proc)
This->task_queue_tail = task;
}else {
This->task_queue_tail = This->task_queue_head = task;
do_post = TRUE;
do_post = !This->continue_call;
}
LeaveCriticalSection(&This->section);
@ -960,6 +960,7 @@ static void report_progress(BindProtocol *This, ULONG status_code, LPCWSTR statu
switch(status_code) {
case BINDSTATUS_FINDINGRESOURCE:
case BINDSTATUS_CONNECTING:
case BINDSTATUS_REDIRECTING:
case BINDSTATUS_BEGINDOWNLOADDATA:
case BINDSTATUS_SENDINGREQUEST:
case BINDSTATUS_CACHEFILENAMEAVAILABLE:

View file

@ -140,6 +140,7 @@ static HRESULT WINAPI DownloadBSC_OnProgress(IBindStatusCallback *iface, ULONG u
debugstr_w(szStatusText));
switch(ulStatusCode) {
case BINDSTATUS_CONNECTING:
case BINDSTATUS_BEGINDOWNLOADDATA:
case BINDSTATUS_DOWNLOADINGDATA:
case BINDSTATUS_ENDDOWNLOADDATA:
@ -153,8 +154,7 @@ static HRESULT WINAPI DownloadBSC_OnProgress(IBindStatusCallback *iface, ULONG u
This->cache_file = heap_strdupW(szStatusText);
break;
case BINDSTATUS_FINDINGRESOURCE:
case BINDSTATUS_CONNECTING:
case BINDSTATUS_FINDINGRESOURCE: /* FIXME */
break;
default:

View file

@ -17,11 +17,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
/*
* TODO:
* - Handle redirects as native.
*/
#include "urlmon_main.h"
#include "wininet.h"
@ -84,7 +79,7 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, LPCWSTR url, DWORD requ
URL_COMPONENTSW url_comp;
BYTE security_id[512];
DWORD len = 0;
ULONG num = 0;
ULONG num;
BOOL res, b;
HRESULT hres;
@ -95,7 +90,7 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, LPCWSTR url, DWORD requ
memset(&url_comp, 0, sizeof(url_comp));
url_comp.dwStructSize = sizeof(url_comp);
url_comp.dwSchemeLength = url_comp.dwHostNameLength = url_comp.dwUrlPathLength =
url_comp.dwSchemeLength = url_comp.dwHostNameLength = url_comp.dwUrlPathLength = url_comp.dwExtraInfoLength =
url_comp.dwUserNameLength = url_comp.dwPasswordLength = 1;
if (!InternetCrackUrlW(url, 0, 0, &url_comp))
return MK_E_SYNTAX;
@ -124,7 +119,12 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, LPCWSTR url, DWORD requ
}
accept_mimes[num] = 0;
path = heap_strndupW(url_comp.lpszUrlPath, url_comp.dwUrlPathLength);
path = heap_alloc((url_comp.dwUrlPathLength+url_comp.dwExtraInfoLength+1)*sizeof(WCHAR));
if(url_comp.dwUrlPathLength)
memcpy(path, url_comp.lpszUrlPath, url_comp.dwUrlPathLength*sizeof(WCHAR));
if(url_comp.dwExtraInfoLength)
memcpy(path+url_comp.dwUrlPathLength, url_comp.lpszExtraInfo, url_comp.dwExtraInfoLength*sizeof(WCHAR));
path[url_comp.dwUrlPathLength+url_comp.dwExtraInfoLength] = 0;
if(This->https)
request_flags |= INTERNET_FLAG_SECURE;
This->base.request = HttpOpenRequestW(This->base.connection,
@ -132,8 +132,8 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, LPCWSTR url, DWORD requ
? wszBindVerb[This->base.bind_info.dwBindVerb] : This->base.bind_info.szCustomVerb,
path, NULL, NULL, (LPCWSTR *)accept_mimes, request_flags, (DWORD_PTR)&This->base);
heap_free(path);
while (num<sizeof(accept_mimes)/sizeof(accept_mimes[0]) && accept_mimes[num])
CoTaskMemFree(accept_mimes[num++]);
while(num--)
CoTaskMemFree(accept_mimes[num]);
if (!This->base.request) {
WARN("HttpOpenRequest failed: %d\n", GetLastError());
return INET_E_RESOURCE_NOT_FOUND;
@ -227,7 +227,7 @@ static HRESULT HttpProtocol_open_request(Protocol *prot, LPCWSTR url, DWORD requ
static HRESULT HttpProtocol_start_downloading(Protocol *prot)
{
HttpProtocol *This = ASYNCPROTOCOL_THIS(prot);
LPWSTR content_type = 0, content_length = 0;
LPWSTR content_type, content_length, ranges;
DWORD len = sizeof(DWORD);
DWORD status_code;
BOOL res;
@ -258,8 +258,11 @@ static HRESULT HttpProtocol_start_downloading(Protocol *prot)
WARN("HttpQueryInfo failed: %d\n", GetLastError());
}
if(This->https)
ranges = query_http_info(This, HTTP_QUERY_ACCEPT_RANGES);
if(ranges) {
IInternetProtocolSink_ReportProgress(This->base.protocol_sink, BINDSTATUS_ACCEPTRANGES, NULL);
heap_free(ranges);
}
content_type = query_http_info(This, HTTP_QUERY_CONTENT_TYPE);
if(content_type) {

View file

@ -38,6 +38,9 @@ static HRESULT parse_schema(LPCWSTR url, DWORD flags, LPWSTR result, DWORD size,
if(ptr)
len = ptr-url;
if(rsize)
*rsize = len;
if(len >= size)
return E_POINTER;
@ -45,9 +48,6 @@ static HRESULT parse_schema(LPCWSTR url, DWORD flags, LPWSTR result, DWORD size,
memcpy(result, url, len*sizeof(WCHAR));
result[len] = 0;
if(rsize)
*rsize = len;
return S_OK;
}
@ -170,6 +170,100 @@ static HRESULT parse_security_domain(LPCWSTR url, DWORD flags, LPWSTR result,
return E_FAIL;
}
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;
}
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;
}
}
/**************************************************************************
* CoInternetParseUrl (URLMON.@)
*/
@ -192,6 +286,10 @@ HRESULT WINAPI CoInternetParseUrl(LPCWSTR pwzUrl, PARSEACTION ParseAction, DWORD
return parse_schema(pwzUrl, dwFlags, pszResult, cchResult, pcchResult);
case PARSE_SECURITY_DOMAIN:
return parse_security_domain(pwzUrl, dwFlags, pszResult, cchResult, pcchResult);
case PARSE_DOMAIN:
return parse_domain(pwzUrl, dwFlags, pszResult, cchResult, pcchResult);
case PARSE_ROOTDOCUMENT:
return parse_rootdocument(pwzUrl, dwFlags, pszResult, cchResult, pcchResult);
default:
FIXME("not supported action %d\n", ParseAction);
}

View file

@ -151,6 +151,11 @@ static void WINAPI internet_status_callback(HINTERNET internet, DWORD_PTR contex
report_progress(protocol, BINDSTATUS_SENDINGREQUEST, (LPWSTR)status_info);
break;
case INTERNET_STATUS_REDIRECT:
TRACE("%p INTERNET_STATUS_REDIRECT\n", protocol);
report_progress(protocol, BINDSTATUS_REDIRECTING, (LPWSTR)status_info);
break;
case INTERNET_STATUS_REQUEST_COMPLETE:
request_complete(protocol, status_info);
break;

View file

@ -495,6 +495,12 @@ static struct regsvr_coclass const coclass_list[] = {
"urlmon.dll",
"Both"
},
{ &CLSID_PSFactoryBuffer,
"URLMoniker ProxyStub Factory",
NULL,
"urlmon.dll",
"Apartment"
},
{ NULL } /* list terminator */
};
@ -573,12 +579,14 @@ HRESULT WINAPI DllRegisterServer(void)
TRACE("\n");
hr = register_coclasses(coclass_list);
if (SUCCEEDED(hr))
hr = URLMON_DllRegisterServer();
if(SUCCEEDED(hr))
hr = register_coclasses(coclass_list);
if(SUCCEEDED(hr))
hr = register_interfaces(interface_list);
if(FAILED(hr))
return hr;
return register_inf(TRUE);
if(SUCCEEDED(hr))
hr = register_inf(TRUE);
return hr;
}
/***********************************************************************
@ -590,10 +598,12 @@ HRESULT WINAPI DllUnregisterServer(void)
TRACE("\n");
hr = unregister_coclasses(coclass_list);
if (SUCCEEDED(hr))
hr = URLMON_DllUnregisterServer();
if(SUCCEEDED(hr))
hr = unregister_coclasses(coclass_list);
if(SUCCEEDED(hr))
hr = unregister_interfaces(interface_list);
if(FAILED(hr))
return hr;
return register_inf(FALSE);
if(SUCCEEDED(hr))
hr = register_inf(FALSE);
return hr;
}

View file

@ -147,12 +147,18 @@ static HRESULT map_url_to_zone(LPCWSTR url, DWORD *zone, LPWSTR *ret_url)
DWORD size=0;
HRESULT hres;
secur_url = heap_alloc(INTERNET_MAX_URL_LENGTH*sizeof(WCHAR));
*zone = -1;
hres = CoInternetParseUrl(url, PARSE_SECURITY_URL, 0, secur_url, INTERNET_MAX_URL_LENGTH, &size, 0);
if(hres != S_OK)
strcpyW(secur_url, url);
hres = CoInternetGetSecurityUrl(url, &secur_url, PSU_SECURITY_URL_ONLY, 0);
if(hres != S_OK) {
size = strlenW(url)*sizeof(WCHAR);
secur_url = heap_alloc(size);
if(!secur_url)
return E_OUTOFMEMORY;
memcpy(secur_url, url, size);
}
hres = CoInternetParseUrl(secur_url, PARSE_SCHEMA, 0, schema, sizeof(schema)/sizeof(WCHAR), &size, 0);
if(FAILED(hres) || !*schema) {
@ -1228,3 +1234,84 @@ HRESULT WINAPI CoInternetCreateZoneManager(IServiceProvider* pSP, IInternetZoneM
TRACE("(%p %p %x)\n", pSP, ppZM, dwReserved);
return ZoneMgrImpl_Construct(NULL, (void**)ppZM);
}
/********************************************************************
* CoInternetGetSecurityUrl (URLMON.@)
*/
HRESULT WINAPI CoInternetGetSecurityUrl(LPCWSTR pwzUrl, LPWSTR *ppwzSecUrl, PSUACTION psuAction, DWORD dwReserved)
{
WCHAR buf1[INTERNET_MAX_URL_LENGTH], buf2[INTERNET_MAX_URL_LENGTH];
LPWSTR url, domain;
DWORD len;
HRESULT hres;
TRACE("(%p,%p,%u,%u)\n", pwzUrl, ppwzSecUrl, psuAction, dwReserved);
url = buf1;
domain = buf2;
strcpyW(url, pwzUrl);
while(1) {
hres = CoInternetParseUrl(url, PARSE_SECURITY_URL, 0, domain, INTERNET_MAX_URL_LENGTH, &len, 0);
if(hres!=S_OK || !strcmpW(url, domain))
break;
if(url == buf1) {
url = buf2;
domain = buf1;
} else {
url = buf1;
domain = buf2;
}
}
if(psuAction==PSU_SECURITY_URL_ONLY) {
len = lstrlenW(url)+1;
*ppwzSecUrl = CoTaskMemAlloc(len*sizeof(WCHAR));
if(!*ppwzSecUrl)
return E_OUTOFMEMORY;
memcpy(*ppwzSecUrl, url, len*sizeof(WCHAR));
return S_OK;
}
hres = CoInternetParseUrl(url, PARSE_SECURITY_DOMAIN, 0, domain,
INTERNET_MAX_URL_LENGTH, &len, 0);
if(SUCCEEDED(hres)) {
len++;
*ppwzSecUrl = CoTaskMemAlloc(len*sizeof(WCHAR));
if(!*ppwzSecUrl)
return E_OUTOFMEMORY;
memcpy(*ppwzSecUrl, domain, len*sizeof(WCHAR));
return S_OK;
}
hres = CoInternetParseUrl(url, PARSE_ROOTDOCUMENT, 0, domain, 0, &len, 0);
if(hres == S_FALSE) {
hres = CoInternetParseUrl(url, PARSE_SCHEMA, 0, domain,
INTERNET_MAX_URL_LENGTH, &len, 0);
if(hres == S_OK) {
domain[len] = ':';
hres = CoInternetParseUrl(url, PARSE_DOMAIN, 0, domain+len+1,
INTERNET_MAX_URL_LENGTH-len-1, &len, 0);
if(hres == S_OK) {
len = lstrlenW(domain)+1;
*ppwzSecUrl = CoTaskMemAlloc(len*sizeof(WCHAR));
if(!*ppwzSecUrl)
return E_OUTOFMEMORY;
memcpy(*ppwzSecUrl, domain, len*sizeof(WCHAR));
return S_OK;
}
}
}
len = lstrlenW(url)+1;
*ppwzSecUrl = CoTaskMemAlloc(len*sizeof(WCHAR));
if(!*ppwzSecUrl)
return E_OUTOFMEMORY;
memcpy(*ppwzSecUrl, url, len*sizeof(WCHAR));
return S_OK;
}

View file

@ -0,0 +1,302 @@
/*
* Copyright 2010 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "urlmon_main.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
typedef struct {
const IUriVtbl *lpIUriVtbl;
LONG ref;
} Uri;
#define URI(x) ((IUri*) &(x)->lpIUriVtbl)
#define URI_THIS(iface) DEFINE_THIS(Uri, IUri, iface)
static HRESULT WINAPI Uri_QueryInterface(IUri *iface, REFIID riid, void **ppv)
{
Uri *This = URI_THIS(iface);
if(IsEqualGUID(&IID_IUnknown, riid)) {
TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
*ppv = URI(This);
}else if(IsEqualGUID(&IID_IUri, riid)) {
TRACE("(%p)->(IID_IUri %p)\n", This, ppv);
*ppv = URI(This);
}else {
TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
*ppv = NULL;
return E_NOINTERFACE;
}
IUnknown_AddRef((IUnknown*)*ppv);
return S_OK;
}
static ULONG WINAPI Uri_AddRef(IUri *iface)
{
Uri *This = URI_THIS(iface);
LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
return ref;
}
static ULONG WINAPI Uri_Release(IUri *iface)
{
Uri *This = URI_THIS(iface);
LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
if(!ref)
heap_free(This);
return ref;
}
static HRESULT WINAPI Uri_GetPropertyBSTR(IUri *iface, Uri_PROPERTY uriProp, BSTR *pbstrProperty, DWORD dwFlags)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%d %p %x)\n", This, uriProp, pbstrProperty, dwFlags);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetPropertyLength(IUri *iface, Uri_PROPERTY uriProp, DWORD *pcchProperty, DWORD dwFlags)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%d %p %x)\n", This, uriProp, pcchProperty, dwFlags);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetPropertyDWORD(IUri *iface, Uri_PROPERTY uriProp, DWORD *pcchProperty, DWORD dwFlags)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%d %p %x)\n", This, uriProp, pcchProperty, dwFlags);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_HasProperty(IUri *iface, Uri_PROPERTY uriProp, BOOL *pfHasProperty)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->()\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetAbsoluteUri(IUri *iface, BSTR *pstrAbsoluteUri)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrAbsoluteUri);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetAuthority(IUri *iface, BSTR *pstrAuthority)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrAuthority);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetDisplayUri(IUri *iface, BSTR *pstrDisplayUri)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrDisplayUri);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetDomain(IUri *iface, BSTR *pstrDomain)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrDomain);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetExtension(IUri *iface, BSTR *pstrExtension)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrExtension);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetFragment(IUri *iface, BSTR *pstrFragment)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrFragment);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetHost(IUri *iface, BSTR *pstrHost)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrHost);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetPassword(IUri *iface, BSTR *pstrPassword)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrPassword);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetPath(IUri *iface, BSTR *pstrPath)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrPath);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetPathAndQuery(IUri *iface, BSTR *pstrPathAndQuery)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrPathAndQuery);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetQuery(IUri *iface, BSTR *pstrQuery)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrQuery);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetRawUri(IUri *iface, BSTR *pstrRawUri)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrRawUri);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetSchemeName(IUri *iface, BSTR *pstrSchemeName)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrSchemeName);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetUserInfo(IUri *iface, BSTR *pstrUserInfo)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrUserInfo);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetUserName(IUri *iface, BSTR *pstrUserName)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrUserName);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetHostType(IUri *iface, DWORD *pdwHostType)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pdwHostType);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetPort(IUri *iface, DWORD *pdwPort)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pdwPort);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetScheme(IUri *iface, DWORD *pdwScheme)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pdwScheme);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetZone(IUri *iface, DWORD *pdwZone)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pdwZone);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_GetProperties(IUri *iface, DWORD *pdwProperties)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pdwProperties);
return E_NOTIMPL;
}
static HRESULT WINAPI Uri_IsEqual(IUri *iface, IUri *pUri, BOOL *pfEqual)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p %p)\n", This, pUri, pfEqual);
return E_NOTIMPL;
}
#undef URI_THIS
static const IUriVtbl UriVtbl = {
Uri_QueryInterface,
Uri_AddRef,
Uri_Release,
Uri_GetPropertyBSTR,
Uri_GetPropertyLength,
Uri_GetPropertyDWORD,
Uri_HasProperty,
Uri_GetAbsoluteUri,
Uri_GetAuthority,
Uri_GetDisplayUri,
Uri_GetDomain,
Uri_GetExtension,
Uri_GetFragment,
Uri_GetHost,
Uri_GetPassword,
Uri_GetPath,
Uri_GetPathAndQuery,
Uri_GetQuery,
Uri_GetRawUri,
Uri_GetSchemeName,
Uri_GetUserInfo,
Uri_GetUserName,
Uri_GetHostType,
Uri_GetPort,
Uri_GetScheme,
Uri_GetZone,
Uri_GetProperties,
Uri_IsEqual
};
/***********************************************************************
* CreateUri (urlmon.@)
*/
HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IUri **ppURI)
{
Uri *ret;
TRACE("(%s %x %x %p)\n", debugstr_w(pwzURI), dwFlags, (DWORD)dwReserved, ppURI);
ret = heap_alloc(sizeof(Uri));
if(!ret)
return E_OUTOFMEMORY;
ret->lpIUriVtbl = &UriVtbl;
ret->ref = 1;
*ppURI = URI(ret);
return S_OK;
}

View file

@ -43,7 +43,6 @@ HKCR,"PROTOCOLS\Filter\lzdhtml","CLSID",,"%CLSID_DeCompMimeFilter%"
[ZoneMap.Reg]
HKCU,"Software\Microsoft\Windows\CurrentVersion\Internet Settings",,,
HKCU,"%PATH_ZONEMAP%",,,
HKLM,"%PATH_ZONEMAP%",,,
HKCU,"%PATH_ZONEMAP%","ProxyByPass", 0x10001,0x1

View file

@ -27,18 +27,29 @@
<file>session.c</file>
<file>umon.c</file>
<file>umstream.c</file>
<file>uri.c</file>
<file>urlmon_main.c</file>
<file>usrmarshal.c</file>
<file>rsrc.rc</file>
<library>wine</library>
<library>uuid</library>
<library>rpcrt4</library>
<library>ole32</library>
<library>shlwapi</library>
<library>wininet</library>
<library>user32</library>
<library>advapi32</library>
<library>pseh</library>
<library>urlmon_proxy</library>
<library>ntdll</library>
</module>
<module name="urlmon_local_interface" type="idlinterface">
<file>urlmon_local.idl</file>
<module name="urlmon_proxy" type="rpcproxy" allowwarnings="true">
<define name="__WINESRC__" />
<define name="ENTRY_PREFIX">URLMON_</define>
<define name="PROXY_DELEGATION"/>
<define name="REGISTER_PROXY_DLL"/>
<define name="_URLMON_"/>
<define name="PROXY_CLSID_IS">{0x79EAC9F1,0xBAF9,0x11CE,{0x8C,0x82,0x00,0xAA,0x00,0x4B,0xA9,0x0B}}</define>
<file>urlmon_urlmon.idl</file>
</module>
</group>

View file

@ -15,7 +15,7 @@
@ stdcall CoInternetCreateSecurityManager(ptr ptr long)
@ stdcall CoInternetCreateZoneManager(ptr ptr long)
@ stub CoInternetGetProtocolFlags
@ stub CoInternetGetSecurityUrl
@ stdcall CoInternetGetSecurityUrl(ptr ptr long long)
@ stdcall CoInternetGetSession(long ptr long)
@ stdcall CoInternetParseUrl(wstr long long wstr long ptr long)
@ stdcall CoInternetQueryInfo(ptr long long ptr long ptr long)
@ -26,6 +26,7 @@
@ stdcall CreateAsyncBindCtx(long ptr ptr ptr)
@ stdcall CreateAsyncBindCtxEx(ptr long ptr ptr ptr long)
@ stdcall CreateFormatEnumerator(long ptr ptr)
@ stdcall CreateUri(wstr long long ptr)
@ stdcall CreateURLMoniker(ptr wstr ptr)
@ stdcall CreateURLMonikerEx(ptr wstr ptr long)
@ stdcall -private DllCanUnloadNow()

View file

@ -1,2 +0,0 @@
#include "urlmon.idl"

View file

@ -348,6 +348,7 @@ static void init_session(BOOL init)
HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
{
unsigned int i;
HRESULT hr;
TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
@ -357,6 +358,10 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
return IClassFactory_QueryInterface(object_creation[i].cf, riid, ppv);
}
hr = URLMON_DllGetClassObject(rclsid, riid, ppv);
if(SUCCEEDED(hr))
return hr;
FIXME("%s: no class found.\n", debugstr_guid(rclsid));
return CLASS_E_CLASSNOTAVAILABLE;
}

View file

@ -48,6 +48,12 @@ extern HRESULT GopherProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj);
extern HRESULT MkProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj);
extern HRESULT MimeFilter_Construct(IUnknown *pUnkOuter, LPVOID *ppobj);
extern HRESULT WINAPI URLMON_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) DECLSPEC_HIDDEN;
extern HRESULT WINAPI URLMON_DllRegisterServer(void) DECLSPEC_HIDDEN;
extern HRESULT WINAPI URLMON_DllUnregisterServer(void) DECLSPEC_HIDDEN;
extern GUID const CLSID_PSFactoryBuffer DECLSPEC_HIDDEN;
/**********************************************************************
* Dll lifetime tracking declaration for urlmon.dll
*/

View file

@ -0,0 +1,19 @@
/*
* Copyright 2009 Piotr Caban for Codeweavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "urlmon.idl"

View file

@ -0,0 +1,162 @@
/*
* Copyright 2009 Piotr Caban for Codeweavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "urlmon_main.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
HRESULT CALLBACK IWinInetHttpInfo_QueryInfo_Proxy(IWinInetHttpInfo* This,
DWORD dwOption, LPVOID pBuffer, DWORD *pcbBuf, DWORD *pdwFlags,
DWORD *pdwReserved)
{
FIXME("stub\n");
return E_NOTIMPL;
}
HRESULT __RPC_STUB IWinInetHttpInfo_QueryInfo_Stub(IWinInetHttpInfo* This,
DWORD dwOption, BYTE *pBuffer, DWORD *pcbBuf, DWORD *pdwFlags,
DWORD *pdwReserved)
{
FIXME("stub\n");
return E_NOTIMPL;
}
HRESULT CALLBACK IWinInetInfo_QueryOption_Proxy(IWinInetInfo* This,
DWORD dwOption, LPVOID pBuffer, DWORD *pcbBuf)
{
FIXME("stub\n");
return E_NOTIMPL;
}
HRESULT __RPC_STUB IWinInetInfo_QueryOption_Stub(IWinInetInfo* This,
DWORD dwOption, BYTE *pBuffer, DWORD *pcbBuf)
{
FIXME("stub\n");
return E_NOTIMPL;
}
HRESULT CALLBACK IBindHost_MonikerBindToStorage_Proxy(IBindHost* This,
IMoniker *pMk, IBindCtx *pBC, IBindStatusCallback *pBSC,
REFIID riid, void **ppvObj)
{
FIXME("stub\n");
return E_NOTIMPL;
}
HRESULT __RPC_STUB IBindHost_MonikerBindToStorage_Stub(IBindHost* This,
IMoniker *pMk, IBindCtx *pBC, IBindStatusCallback *pBSC,
REFIID riid, IUnknown **ppvObj)
{
FIXME("stub\n");
return E_NOTIMPL;
}
HRESULT CALLBACK IBindHost_MonikerBindToObject_Proxy(IBindHost* This,
IMoniker *pMk, IBindCtx *pBC, IBindStatusCallback *pBSC,
REFIID riid, void **ppvObj)
{
FIXME("stub\n");
return E_NOTIMPL;
}
HRESULT __RPC_STUB IBindHost_MonikerBindToObject_Stub(IBindHost* This,
IMoniker *pMk, IBindCtx *pBC, IBindStatusCallback *pBSC,
REFIID riid, IUnknown **ppvObj)
{
FIXME("stub\n");
return E_NOTIMPL;
}
HRESULT CALLBACK IBindStatusCallbackEx_GetBindInfoEx_Proxy(
IBindStatusCallbackEx* This, DWORD *grfBINDF, BINDINFO *pbindinfo,
DWORD *grfBINDF2, DWORD *pdwReserved)
{
FIXME("stub\n");
return E_NOTIMPL;
}
HRESULT __RPC_STUB IBindStatusCallbackEx_GetBindInfoEx_Stub(
IBindStatusCallbackEx* This, DWORD *grfBINDF, RemBINDINFO *pbindinfo,
RemSTGMEDIUM *pstgmed, DWORD *grfBINDF2, DWORD *pdwReserved)
{
FIXME("stub\n");
return E_NOTIMPL;
}
HRESULT CALLBACK IBindStatusCallback_GetBindInfo_Proxy(
IBindStatusCallback* This, DWORD *grfBINDF, BINDINFO *pbindinfo)
{
FIXME("stub\n");
return E_NOTIMPL;
}
HRESULT __RPC_STUB IBindStatusCallback_GetBindInfo_Stub(
IBindStatusCallback* This, DWORD *grfBINDF,
RemBINDINFO *pbindinfo, RemSTGMEDIUM *pstgmed)
{
FIXME("stub\n");
return E_NOTIMPL;
}
HRESULT CALLBACK IBindStatusCallback_OnDataAvailable_Proxy(
IBindStatusCallback* This, DWORD grfBSCF, DWORD dwSize,
FORMATETC *pformatetc, STGMEDIUM *pstgmed)
{
FIXME("stub\n");
return E_NOTIMPL;
}
HRESULT __RPC_STUB IBindStatusCallback_OnDataAvailable_Stub(
IBindStatusCallback* This, DWORD grfBSCF, DWORD dwSize,
RemFORMATETC *pformatetc, RemSTGMEDIUM *pstgmed)
{
FIXME("stub\n");
return E_NOTIMPL;
}
HRESULT CALLBACK IBinding_GetBindResult_Proxy(IBinding* This,
CLSID *pclsidProtocol, DWORD *pdwResult,
LPOLESTR *pszResult, DWORD *pdwReserved)
{
FIXME("stub\n");
return E_NOTIMPL;
}
HRESULT __RPC_STUB IBinding_GetBindResult_Stub(IBinding* This,
CLSID *pclsidProtocol, DWORD *pdwResult,
LPOLESTR *pszResult, DWORD dwReserved)
{
FIXME("stub\n");
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE IWindowForBindingUI_GetWindow_Proxy(
IWindowForBindingUI* This, REFGUID rguidReason, HWND *phwnd)
{
FIXME("stub\n");
return E_NOTIMPL;
}
void __RPC_STUB IWindowForBindingUI_GetWindow_Stub(IRpcStubBuffer* This,
IRpcChannelBuffer* pRpcChannelBuffer, PRPC_MESSAGE pRpcMessage,
DWORD* pdwStubPhase)
{
FIXME("stub\n");
}

View file

@ -1646,6 +1646,62 @@ interface IUri : IUnknown
[out] BOOL *pfEqual);
}
cpp_quote("HRESULT WINAPI CreateUri(LPCWSTR,DWORD,DWORD_PTR,IUri**);")
cpp_quote("HRESULT WINAPI CreateUriWithFragment(LPCWSTR,LPCWSTR,DWORD,DWORD_PTR,IUri**);")
cpp_quote("HRESULT WINAPI CreateUriFromMultiByteString(LPCSTR,DWORD,DWORD,DWORD,DWORD_PTR,IUri**);")
cpp_quote("#define Uri_HAS_ABSOLUTE_URI (1 << Uri_PROPERTY_ABSOLUTE_URI)")
cpp_quote("#define Uri_HAS_AUTHORITY (1 << Uri_PROPERTY_AUTHORITY)")
cpp_quote("#define Uri_HAS_DISPLAY_URI (1 << Uri_PROPERTY_DISPLAY_URI)")
cpp_quote("#define Uri_HAS_DOMAIN (1 << Uri_PROPERTY_DOMAIN)")
cpp_quote("#define Uri_HAS_EXTENSION (1 << Uri_PROPERTY_EXTENSION)")
cpp_quote("#define Uri_HAS_FRAGMENT (1 << Uri_PROPERTY_FRAGMENT)")
cpp_quote("#define Uri_HAS_HOST (1 << Uri_PROPERTY_HOST)")
cpp_quote("#define Uri_HAS_PASSWORD (1 << Uri_PROPERTY_PASSWORD)")
cpp_quote("#define Uri_HAS_PATH (1 << Uri_PROPERTY_PATH)")
cpp_quote("#define Uri_HAS_QUERY (1 << Uri_PROPERTY_QUERY)")
cpp_quote("#define Uri_HAS_RAW_URI (1 << Uri_PROPERTY_RAW_URI)")
cpp_quote("#define Uri_HAS_SCHEME_NAME (1 << Uri_PROPERTY_SCHEME_NAME)")
cpp_quote("#define Uri_HAS_USER_NAME (1 << Uri_PROPERTY_USER_NAME)")
cpp_quote("#define Uri_HAS_PATH_AND_QUERY (1 << Uri_PROPERTY_PATH_AND_QUERY)")
cpp_quote("#define Uri_HAS_USER_INFO (1 << Uri_PROPERTY_USER_INFO)")
cpp_quote("#define Uri_HAS_HOST_TYPE (1 << Uri_PROPERTY_HOST_TYPE)")
cpp_quote("#define Uri_HAS_PORT (1 << Uri_PROPERTY_PORT)")
cpp_quote("#define Uri_HAS_SCHEME (1 << Uri_PROPERTY_SCHEME)")
cpp_quote("#define Uri_HAS_ZONE (1 << Uri_PROPERTY_ZONE)")
cpp_quote("#define Uri_CREATE_ALLOW_RELATIVE 0x0001")
cpp_quote("#define Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME 0x0002")
cpp_quote("#define Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME 0x0004")
cpp_quote("#define Uri_CREATE_NOFRAG 0x0008")
cpp_quote("#define Uri_CREATE_NO_CANONICALIZE 0x0010")
cpp_quote("#define Uri_CREATE_CANONICALIZE 0x0100")
cpp_quote("#define Uri_CREATE_FILE_USE_DOS_PATH 0x0020")
cpp_quote("#define Uri_CREATE_DECODE_EXTRA_INFO 0x0040")
cpp_quote("#define Uri_CREATE_NO_DECODE_EXTRA_INFO 0x0080")
cpp_quote("#define Uri_CREATE_CRACK_UNKNOWN_SCHEMES 0x0200")
cpp_quote("#define Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES 0x0400")
cpp_quote("#define Uri_CREATE_PRE_PROCESS_HTML_URI 0x0800")
cpp_quote("#define Uri_CREATE_NO_PRE_PROCESS_HTML_URI 0x1000")
cpp_quote("#define Uri_CREATE_IE_SETTINGS 0x2000")
cpp_quote("#define Uri_CREATE_NO_IE_SETTINGS 0x4000")
cpp_quote("#define Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS 0x8000")
cpp_quote("#define Uri_DISPLAY_NO_FRAGMENT 0x00000001")
cpp_quote("#define Uri_PUNYCODE_IDN_HOST 0x00000002")
cpp_quote("#define Uri_DISPLAY_IDN_HOST 0x00000004")
cpp_quote("#define Uri_ENCODING_USER_INFO_AND_PATH_IS_PERCENT_ENCODED_UTF8 0x00000001")
cpp_quote("#define Uri_ENCODING_USER_INFO_AND_PATH_IS_CP 0x00000002")
cpp_quote("#define Uri_ENCODING_HOST_IS_IDN 0x00000004")
cpp_quote("#define Uri_ENCODING_HOST_IS_PERCENT_ENCODED_UTF8 0x00000008")
cpp_quote("#define Uri_ENCODING_HOST_IS_PERCENT_ENCODED_CP 0x00000010")
cpp_quote("#define Uri_ENCODING_QUERY_AND_FRAGMENT_IS_PERCENT_ENCODED_UTF8 0x00000020")
cpp_quote("#define Uri_ENCODING_QUERY_AND_FRAGMENT_IS_CP 0x00000040")
cpp_quote("#define Uri_ENCODING_RFC (Uri_ENCODING_USER_INFO_AND_PATH_IS_PERCENT_ENCODED_UTF8|Uri_ENCODING_HOST_IS_PERCENT_ENCODED_UTF8|Uri_ENCODING_QUERY_AND_FRAGMENT_IS_PERCENT_ENCODED_UTF8)")
cpp_quote("#define UriBuilder_USE_ORIGINAL_FLAGS 0x00000001")
/*****************************************************************************
* IUriContainer interface
*/
@ -1740,6 +1796,8 @@ cpp_quote("#define INET_E_DEFAULT_ACTION INET_E_USE_DEFAULT_PROTOCOLH
cpp_quote("HRESULT WINAPI CoGetClassObjectFromURL(REFCLSID, LPCWSTR, DWORD, DWORD, LPCWSTR, LPBINDCTX, DWORD, LPVOID, REFIID, LPVOID*);")
cpp_quote("HRESULT WINAPI CreateURLMoniker(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk);")
cpp_quote("HRESULT WINAPI CreateURLMonikerEx(IMoniker*,LPCWSTR,IMoniker**,DWORD);")
cpp_quote("HRESULT WINAPI CreateURLMonikerEx2(IMoniker*,IUri*,IMoniker**,DWORD);")
cpp_quote("HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pbsc, IBindStatusCallback **ppbsc, DWORD dwReserved);")
cpp_quote("HRESULT WINAPI CompareSecurityIds(BYTE*,DWORD,BYTE*,DWORD,DWORD);")
cpp_quote("HRESULT WINAPI URLDownloadToFileA(LPUNKNOWN,LPCSTR,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);")
@ -1758,6 +1816,7 @@ cpp_quote("HRESULT WINAPI CoInternetCreateZoneManager(IServiceProvider*, IIntern
cpp_quote("HRESULT WINAPI CoInternetParseUrl(LPCWSTR,PARSEACTION,DWORD,LPWSTR,DWORD,DWORD*,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetQueryInfo(LPCWSTR,QUERYOPTION,DWORD,LPVOID,DWORD,DWORD*,DWORD);")
cpp_quote("HRESULT WINAPI CoInternetSetFeatureEnabled(INTERNETFEATURELIST,DWORD,BOOL);")
cpp_quote("HRESULT WINAPI CoInternetGetSecurityUrl(LPCWSTR,LPWSTR*,PSUACTION,DWORD);")
cpp_quote("HRESULT WINAPI CreateFormatEnumerator(UINT,FORMATETC*,IEnumFORMATETC**);")
cpp_quote("HRESULT WINAPI GetSoftwareUpdateInfo( LPCWSTR szDistUnit, LPSOFTDISTINFO psdi);")
cpp_quote("HRESULT WINAPI FaultInIEFeature(HWND,uCLSSPEC*,QUERYCONTEXT*,DWORD);")