Sync to Wine-0_9_10:

Francois Gouget <fgouget@free.fr>
- Fix compatibility with native advpack dlls.

Sync to Wine-0_9_7:
Dmitry Timoshkov <dmitry@codeweavers.com>
- Make more arrays const.

Sync to Wine-0_9_6:
Jacek Caban <jacek@codeweavers.com>
- urlmon: Pass FORMATETC to OnDataAvailable.
- urlmon: Added implementation of protocol stream.
- urlmon: Added implementation of QueryService and stub implementation
  of IHttpNegotiate2 interface.
- urlmon: Query service provider for IInternetProtocol.
- urlmon: Added GetBindInfoString implementation.
- urlmon: Reimplement CoInternetCombineUrl to use pluggable protocol.
- urlmon: Use CoInternetCombineUrl in URLMonikerImpl_Construct.
- urlmon: Fix ref counting.
Rolf Kalbermatter <rolf.kalbermatter@citeng.com>
- urlmon: Fix a LARGE_INTEGER truncation.

svn path=/trunk/; revision=21614
This commit is contained in:
Aleksey Bragin 2006-04-16 17:34:25 +00:00
parent b54888e17e
commit a592154d29
8 changed files with 665 additions and 89 deletions

View file

@ -34,6 +34,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
typedef struct ProtocolStream ProtocolStream;
typedef struct {
const IBindingVtbl *lpBindingVtbl;
const IInternetProtocolSinkVtbl *lpInternetProtocolSinkVtbl;
@ -44,7 +46,8 @@ typedef struct {
IBindStatusCallback *callback;
IInternetProtocol *protocol;
IStream *stream;
IServiceProvider *service_provider;
ProtocolStream *stream;
BINDINFO bindinfo;
DWORD bindf;
@ -52,14 +55,312 @@ typedef struct {
LPWSTR url;
} Binding;
struct ProtocolStream {
const IStreamVtbl *lpStreamVtbl;
LONG ref;
IInternetProtocol *protocol;
BYTE buf[1024*8];
DWORD buf_size;
};
#define BINDING(x) ((IBinding*) &(x)->lpBindingVtbl)
#define PROTSINK(x) ((IInternetProtocolSink*) &(x)->lpInternetProtocolSinkVtbl)
#define BINDINF(x) ((IInternetBindInfo*) &(x)->lpInternetBindInfoVtbl)
#define SERVPROV(x) ((IServiceProvider*) &(x)->lpServiceProviderVtbl)
#define STREAM(x) ((IStream*) &(x)->lpStreamVtbl)
static HRESULT WINAPI HttpNegotiate_QueryInterface(IHttpNegotiate2 *iface,
REFIID riid, void **ppv)
{
*ppv = NULL;
if(IsEqualGUID(&IID_IUnknown, riid)) {
TRACE("(IID_IUnknown %p)\n", ppv);
*ppv = iface;
}else if(IsEqualGUID(&IID_IHttpNegotiate, riid)) {
TRACE("(IID_IHttpNegotiate %p)\n", ppv);
*ppv = iface;
}else if(IsEqualGUID(&IID_IHttpNegotiate2, riid)) {
TRACE("(IID_IHttpNegotiate2 %p)\n", ppv);
*ppv = iface;
}
if(*ppv) {
IHttpNegotiate2_AddRef(iface);
return S_OK;
}
WARN("Unsupported interface %s\n", debugstr_guid(riid));
return E_NOINTERFACE;
}
static ULONG WINAPI HttpNegotiate_AddRef(IHttpNegotiate2 *iface)
{
URLMON_LockModule();
return 2;
}
static ULONG WINAPI HttpNegotiate_Release(IHttpNegotiate2 *iface)
{
URLMON_UnlockModule();
return 1;
}
static HRESULT WINAPI HttpNegotiate_BeginningTransaction(IHttpNegotiate2 *iface,
LPCWSTR szURL, LPCWSTR szHeaders, DWORD dwReserved, LPWSTR *pszAdditionalHeaders)
{
FIXME("(%s %s %ld %p)\n", debugstr_w(szURL), debugstr_w(szHeaders), dwReserved,
pszAdditionalHeaders);
return E_NOTIMPL;
}
static HRESULT WINAPI HttpNegotiate_OnResponse(IHttpNegotiate2 *iface, DWORD dwResponseCode,
LPCWSTR szResponseHeaders, LPCWSTR szRequestHeaders,
LPWSTR *pszAdditionalRequestHeaders)
{
FIXME("(%ld %s %s %p)\n", dwResponseCode, debugstr_w(szResponseHeaders),
debugstr_w(szRequestHeaders), pszAdditionalRequestHeaders);
return E_NOTIMPL;
}
static HRESULT WINAPI HttpNegotiate_GetRootSecurityId(IHttpNegotiate2 *iface,
BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD_PTR dwReserved)
{
FIXME("(%p %p %ld)\n", pbSecurityId, pcbSecurityId, dwReserved);
return E_NOTIMPL;
}
static const IHttpNegotiate2Vtbl HttpNegotiate2Vtbl = {
HttpNegotiate_QueryInterface,
HttpNegotiate_AddRef,
HttpNegotiate_Release,
HttpNegotiate_BeginningTransaction,
HttpNegotiate_OnResponse,
HttpNegotiate_GetRootSecurityId
};
static IHttpNegotiate2 HttpNegotiate = { &HttpNegotiate2Vtbl };
#define STREAM_THIS(iface) DEFINE_THIS(ProtocolStream, Stream, iface)
static HRESULT WINAPI ProtocolStream_QueryInterface(IStream *iface,
REFIID riid, void **ppv)
{
ProtocolStream *This = STREAM_THIS(iface);
*ppv = NULL;
if(IsEqualGUID(&IID_IUnknown, riid)) {
TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
*ppv = STREAM(This);
}else if(IsEqualGUID(&IID_ISequentialStream, riid)) {
TRACE("(%p)->(IID_ISequentialStream %p)\n", This, ppv);
*ppv = STREAM(This);
}else if(IsEqualGUID(&IID_IStream, riid)) {
TRACE("(%p)->(IID_IStream %p)\n", This, ppv);
*ppv = STREAM(This);
}
if(*ppv) {
IStream_AddRef(STREAM(This));
return S_OK;
}
WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
return E_NOINTERFACE;
}
static ULONG WINAPI ProtocolStream_AddRef(IStream *iface)
{
ProtocolStream *This = STREAM_THIS(iface);
LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%ld\n", This, ref);
return ref;
}
static ULONG WINAPI ProtocolStream_Release(IStream *iface)
{
ProtocolStream *This = STREAM_THIS(iface);
LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%ld\n", This, ref);
if(!ref) {
IInternetProtocol_Release(This->protocol);
HeapFree(GetProcessHeap(), 0, This);
URLMON_UnlockModule();
}
return ref;
}
static HRESULT WINAPI ProtocolStream_Read(IStream *iface, void *pv,
ULONG cb, ULONG *pcbRead)
{
ProtocolStream *This = STREAM_THIS(iface);
DWORD read = 0, pread = 0;
TRACE("(%p)->(%p %ld %p)\n", This, pv, cb, pcbRead);
if(This->buf_size) {
read = cb;
if(read > This->buf_size)
read = This->buf_size;
memcpy(pv, This->buf, read);
if(read < This->buf_size)
memmove(This->buf, This->buf+read, This->buf_size-read);
This->buf_size -= read;
}
if(read == cb) {
*pcbRead = read;
return S_OK;
}
IInternetProtocol_Read(This->protocol, (PBYTE)pv+read, cb-read, &pread);
*pcbRead = read + pread;
return read || pread ? S_OK : S_FALSE;
}
static HRESULT WINAPI ProtocolStream_Write(IStream *iface, const void *pv,
ULONG cb, ULONG *pcbWritten)
{
ProtocolStream *This = STREAM_THIS(iface);
TRACE("(%p)->(%p %ld %p)\n", This, pv, cb, pcbWritten);
return STG_E_ACCESSDENIED;
}
static HRESULT WINAPI ProtocolStream_Seek(IStream *iface, LARGE_INTEGER dlibMove,
DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
{
ProtocolStream *This = STREAM_THIS(iface);
FIXME("(%p)->(%ld %08lx %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
return E_NOTIMPL;
}
static HRESULT WINAPI ProtocolStream_SetSize(IStream *iface, ULARGE_INTEGER libNewSize)
{
ProtocolStream *This = STREAM_THIS(iface);
FIXME("(%p)->(%ld)\n", This, libNewSize.u.LowPart);
return E_NOTIMPL;
}
static HRESULT WINAPI ProtocolStream_CopyTo(IStream *iface, IStream *pstm,
ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, ULARGE_INTEGER *pcbWritten)
{
ProtocolStream *This = STREAM_THIS(iface);
FIXME("(%p)->(%p %ld %p %p)\n", This, pstm, cb.u.LowPart, pcbRead, pcbWritten);
return E_NOTIMPL;
}
static HRESULT WINAPI ProtocolStream_Commit(IStream *iface, DWORD grfCommitFlags)
{
ProtocolStream *This = STREAM_THIS(iface);
TRACE("(%p)->(%08lx)\n", This, grfCommitFlags);
return E_NOTIMPL;
}
static HRESULT WINAPI ProtocolStream_Revert(IStream *iface)
{
ProtocolStream *This = STREAM_THIS(iface);
TRACE("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI ProtocolStream_LockRegion(IStream *iface, ULARGE_INTEGER libOffset,
ULARGE_INTEGER cb, DWORD dwLockType)
{
ProtocolStream *This = STREAM_THIS(iface);
FIXME("(%p)->(%ld %ld %ld)\n", This, libOffset.u.LowPart, cb.u.LowPart, dwLockType);
return E_NOTIMPL;
}
static HRESULT WINAPI ProtocolStream_UnlockRegion(IStream *iface,
ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType)
{
ProtocolStream *This = STREAM_THIS(iface);
FIXME("(%p)->(%ld %ld %ld)\n", This, libOffset.u.LowPart, cb.u.LowPart, dwLockType);
return E_NOTIMPL;
}
static HRESULT WINAPI ProtocolStream_Stat(IStream *iface, STATSTG *pstatstg,
DWORD dwStatFlag)
{
ProtocolStream *This = STREAM_THIS(iface);
FIXME("(%p)->(%p %08lx)\n", This, pstatstg, dwStatFlag);
return E_NOTIMPL;
}
static HRESULT WINAPI ProtocolStream_Clone(IStream *iface, IStream **ppstm)
{
ProtocolStream *This = STREAM_THIS(iface);
FIXME("(%p)->(%p)\n", This, ppstm);
return E_NOTIMPL;
}
#undef STREAM_THIS
static const IStreamVtbl ProtocolStreamVtbl = {
ProtocolStream_QueryInterface,
ProtocolStream_AddRef,
ProtocolStream_Release,
ProtocolStream_Read,
ProtocolStream_Write,
ProtocolStream_Seek,
ProtocolStream_SetSize,
ProtocolStream_CopyTo,
ProtocolStream_Commit,
ProtocolStream_Revert,
ProtocolStream_LockRegion,
ProtocolStream_UnlockRegion,
ProtocolStream_Stat,
ProtocolStream_Clone
};
#define BINDING_THIS(iface) DEFINE_THIS(Binding, Binding, iface)
static ProtocolStream *create_stream(IInternetProtocol *protocol)
{
ProtocolStream *ret = HeapAlloc(GetProcessHeap(), 0, sizeof(ProtocolStream));
ret->lpStreamVtbl = &ProtocolStreamVtbl;
ret->ref = 1;
ret->buf_size = 0;
IInternetProtocol_AddRef(protocol);
ret->protocol = protocol;
URLMON_LockModule();
return ret;
}
static void fill_stream_buffer(ProtocolStream *This)
{
DWORD read = 0;
IInternetProtocol_Read(This->protocol, This->buf+This->buf_size,
sizeof(This->buf)-This->buf_size, &read);
This->buf_size += read;
}
static HRESULT WINAPI Binding_QueryInterface(IBinding *iface, REFIID riid, void **ppv)
{
Binding *This = BINDING_THIS(iface);
@ -83,8 +384,10 @@ static HRESULT WINAPI Binding_QueryInterface(IBinding *iface, REFIID riid, void
*ppv = SERVPROV(This);
}
if(*ppv)
if(*ppv) {
IBinding_AddRef(BINDING(This));
return S_OK;
}
WARN("Unsupported interface %s\n", debugstr_guid(riid));
return E_NOINTERFACE;
@ -112,14 +415,18 @@ static ULONG WINAPI Binding_Release(IBinding *iface)
IBindStatusCallback_Release(This->callback);
if(This->protocol)
IInternetProtocol_Release(This->protocol);
if(This->service_provider)
IServiceProvider_Release(This->service_provider);
if(This->stream)
IStream_Release(This->stream);
IStream_Release(STREAM(This->stream));
ReleaseBindInfo(&This->bindinfo);
HeapFree(GetProcessHeap(), 0, This->mime);
HeapFree(GetProcessHeap(), 0, This->url);
HeapFree(GetProcessHeap(), 0, This);
URLMON_UnlockModule();
}
return ref;
@ -247,9 +554,8 @@ static HRESULT WINAPI InternetProtocolSink_ReportData(IInternetProtocolSink *ifa
DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax)
{
Binding *This = PROTSINK_THIS(iface);
DWORD read = 0, cread;
STGMEDIUM stgmed;
BYTE buf[1024];
FORMATETC formatetc;
TRACE("(%p)->(%ld %lu %lu)\n", This, grfBSCF, ulProgress, ulProgressMax);
@ -267,18 +573,20 @@ static HRESULT WINAPI InternetProtocolSink_ReportData(IInternetProtocolSink *ifa
if(grfBSCF & BSCF_FIRSTDATANOTIFICATION)
IInternetProtocol_LockRequest(This->protocol, 0);
do {
cread = 0;
IInternetProtocol_Read(This->protocol, buf, sizeof(buf), &cread);
IStream_Write(This->stream, buf, read, NULL);
read += cread;
}while(cread);
fill_stream_buffer(This->stream);
stgmed.tymed = TYMED_ISTREAM;
stgmed.u.pstm = This->stream;
stgmed.u.pstm = STREAM(This->stream);
IBindStatusCallback_OnDataAvailable(This->callback, grfBSCF, read,
NULL /* FIXME */, &stgmed);
formatetc.cfFormat = 0; /* FIXME */
formatetc.ptd = NULL;
formatetc.dwAspect = 1;
formatetc.lindex = -1;
formatetc.tymed = TYMED_ISTREAM;
IBindStatusCallback_OnDataAvailable(This->callback, grfBSCF, This->stream->buf_size,
&formatetc, &stgmed);
if(grfBSCF & BSCF_LASTDATANOTIFICATION)
IBindStatusCallback_OnStopBinding(This->callback, S_OK, NULL);
@ -351,7 +659,39 @@ static HRESULT WINAPI InternetBindInfo_GetBindString(IInternetBindInfo *iface,
ULONG ulStringType, LPOLESTR *ppwzStr, ULONG cEl, ULONG *pcElFetched)
{
Binding *This = BINDINF_THIS(iface);
FIXME("(%p)->(%ld %p %ld %p)\n", This, ulStringType, ppwzStr, cEl, pcElFetched);
TRACE("(%p)->(%ld %p %ld %p)\n", This, ulStringType, ppwzStr, cEl, pcElFetched);
switch(ulStringType) {
case BINDSTRING_ACCEPT_MIMES: {
static const WCHAR wszMimes[] = {'*','/','*',0};
if(!ppwzStr || !pcElFetched)
return E_INVALIDARG;
ppwzStr[0] = CoTaskMemAlloc(sizeof(wszMimes));
memcpy(ppwzStr[0], wszMimes, sizeof(wszMimes));
*pcElFetched = 1;
return S_OK;
}
case BINDSTRING_USER_AGENT: {
IInternetBindInfo *bindinfo = NULL;
HRESULT hres;
hres = IBindStatusCallback_QueryInterface(This->callback, &IID_IInternetBindInfo,
(void**)&bindinfo);
if(FAILED(hres))
return hres;
hres = IInternetBindInfo_GetBindString(bindinfo, ulStringType, ppwzStr,
cEl, pcElFetched);
IInternetBindInfo_Release(bindinfo);
return hres;
}
}
FIXME("not supported string type %ld\n", ulStringType);
return E_NOTIMPL;
}
@ -390,7 +730,22 @@ static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface,
REFGUID guidService, REFIID riid, void **ppv)
{
Binding *This = SERVPROV_THIS(iface);
FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
HRESULT hres;
TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
if(This->service_provider) {
hres = IServiceProvider_QueryService(This->service_provider, guidService,
riid, ppv);
if(SUCCEEDED(hres))
return hres;
}
if(IsEqualGUID(&IID_IHttpNegotiate, guidService)
|| IsEqualGUID(&IID_IHttpNegotiate2, guidService))
return IHttpNegotiate2_QueryInterface(&HttpNegotiate, riid, ppv);
WARN("unknown service %s\n", debugstr_guid(guidService));
return E_NOTIMPL;
}
@ -427,6 +782,13 @@ static HRESULT get_protocol(Binding *This, LPCWSTR url)
if(SUCCEEDED(hres))
return S_OK;
if(This->service_provider) {
hres = IServiceProvider_QueryService(This->service_provider, &IID_IInternetProtocol,
&IID_IInternetProtocol, (void**)&This->protocol);
if(SUCCEEDED(hres))
return S_OK;
}
hres = get_protocol_iface(url, &unk);
if(FAILED(hres))
return hres;
@ -455,6 +817,8 @@ static HRESULT Binding_Create(LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding *
return E_NOTIMPL;
}
URLMON_LockModule();
ret = HeapAlloc(GetProcessHeap(), 0, sizeof(Binding));
ret->lpBindingVtbl = &BindingVtbl;
@ -466,6 +830,7 @@ static HRESULT Binding_Create(LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding *
ret->callback = NULL;
ret->protocol = NULL;
ret->service_provider = NULL;
ret->stream = NULL;
ret->mime = NULL;
ret->url = NULL;
@ -481,6 +846,9 @@ static HRESULT Binding_Create(LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding *
return hres;
}
IBindStatusCallback_QueryInterface(ret->callback, &IID_IServiceProvider,
(void**)&ret->service_provider);
hres = get_protocol(ret, url);
if(FAILED(hres)) {
WARN("Could not get protocol handler\n");
@ -505,7 +873,7 @@ static HRESULT Binding_Create(LPCWSTR url, IBindCtx *pbc, REFIID riid, Binding *
ret->url = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
memcpy(ret->url, url, len*sizeof(WCHAR));
CreateStreamOnHGlobal(NULL, TRUE, &ret->stream);
ret->stream = create_stream(ret->protocol);
*binding = ret;
return S_OK;
@ -541,7 +909,7 @@ HRESULT start_binding(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv)
IBindStatusCallback_OnStopBinding(binding->callback, S_OK, NULL);
}
IStream_AddRef(binding->stream);
IStream_AddRef(STREAM(binding->stream));
*ppv = binding->stream;
IBinding_Release(BINDING(binding));

View file

@ -166,7 +166,9 @@ static HRESULT parse_security_domain(LPCWSTR url, DWORD flags, LPWSTR result,
return E_FAIL;
}
/**************************************************************************
* CoInternetParseUrl (URLMON.@)
*/
HRESULT WINAPI CoInternetParseUrl(LPCWSTR pwzUrl, PARSEACTION ParseAction, DWORD dwFlags,
LPWSTR pszResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved)
{
@ -190,3 +192,36 @@ HRESULT WINAPI CoInternetParseUrl(LPCWSTR pwzUrl, PARSEACTION ParseAction, DWORD
return E_NOTIMPL;
}
/**************************************************************************
* CoInternetCombineUrl (URLMON.@)
*/
HRESULT WINAPI CoInternetCombineUrl(LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl,
DWORD dwCombineFlags, LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult,
DWORD dwReserved)
{
IInternetProtocolInfo *protocol_info;
DWORD size = cchResult;
HRESULT hres;
TRACE("(%s,%s,0x%08lx,%p,%ld,%p,%ld)\n", debugstr_w(pwzBaseUrl),
debugstr_w(pwzRelativeUrl), dwCombineFlags, pwzResult, cchResult, pcchResult,
dwReserved);
protocol_info = get_protocol_info(pwzBaseUrl);
if(protocol_info) {
hres = IInternetProtocolInfo_CombineUrl(protocol_info, pwzBaseUrl, pwzRelativeUrl,
dwCombineFlags, pwzResult, cchResult, pcchResult, dwReserved);
if(SUCCEEDED(hres))
return hres;
}
hres = UrlCombineW(pwzBaseUrl, pwzRelativeUrl, pwzResult, &size, dwCombineFlags);
if(pcchResult)
*pcchResult = size;
return hres;
}

View file

@ -580,9 +580,9 @@ static HRESULT register_inf(BOOL doregister)
{
HRESULT hres;
HMODULE hAdvpack;
typeof(RegInstall) *pRegInstall;
STRTABLE strtable;
STRENTRY pse[7];
typeof(RegInstallA) *pRegInstall;
STRTABLEA strtable;
STRENTRYA pse[7];
static CLSID const *clsids[34];
int i = 0;
@ -608,7 +608,7 @@ static HRESULT register_inf(BOOL doregister)
strtable.pse = pse;
hAdvpack = LoadLibraryW(wszAdvpack);
pRegInstall = (typeof(RegInstall)*)GetProcAddress(hAdvpack, "RegInstall");
pRegInstall = (typeof(RegInstallA)*)GetProcAddress(hAdvpack, "RegInstall");
hres = pRegInstall(URLMON_hInstance, doregister ? "RegisterDll" : "UnregisterDll", &strtable);

View file

@ -259,7 +259,7 @@ static void Binding_FinishedDownload(Binding *This, HRESULT hr)
0, NULL);
if (!pwchError)
{
static WCHAR achFormat[] = { '%', '0', '8', 'x', 0 };
static const WCHAR achFormat[] = { '%', '0', '8', 'x', 0 };
pwchError =(WCHAR *) LocalAlloc(LMEM_FIXED, sizeof(WCHAR) * 9);
wsprintfW(pwchError, achFormat, hr);
@ -1065,29 +1065,19 @@ static HRESULT URLMonikerImpl_Construct(URLMonikerImpl* This, LPCOLESTR lpszLeft
DWORD sizeStr = INTERNET_MAX_URL_LENGTH;
TRACE("(%p,%s,%s)\n",This,debugstr_w(lpszLeftURLName),debugstr_w(lpszURLName));
memset(This, 0, sizeof(*This));
/* Initialize the virtual function table. */
This->lpvtbl = &VT_URLMonikerImpl;
This->ref = 0;
if(lpszLeftURLName) {
hres = UrlCombineW(lpszLeftURLName, lpszURLName, NULL, &sizeStr, 0);
if(FAILED(hres)) {
return hres;
}
sizeStr++;
}
else
sizeStr = lstrlenW(lpszURLName)+1;
sizeStr = lstrlenW(lpszURLName)+1;
if(lpszLeftURLName)
sizeStr += strlenW(lpszLeftURLName)+32;
This->URLName=HeapAlloc(GetProcessHeap(),0,sizeof(WCHAR)*(sizeStr));
if (This->URLName==NULL)
return E_OUTOFMEMORY;
This->URLName = HeapAlloc(GetProcessHeap(), 0, sizeStr*sizeof(WCHAR));
if(lpszLeftURLName) {
hres = UrlCombineW(lpszLeftURLName, lpszURLName, This->URLName, &sizeStr, 0);
hres = CoInternetCombineUrl(lpszLeftURLName, lpszURLName, 0, This->URLName, sizeStr,
&sizeStr, 0);
if(FAILED(hres)) {
HeapFree(GetProcessHeap(), 0, This->URLName);
return hres;

View file

@ -252,26 +252,21 @@ static HRESULT WINAPI IStream_fnWrite (IStream * iface,
return E_NOTIMPL;
}
static HRESULT WINAPI IStream_fnSeek ( IStream * iface,
static HRESULT WINAPI IStream_fnSeek (IStream * iface,
LARGE_INTEGER dlibMove,
DWORD dwOrigin,
ULARGE_INTEGER* plibNewPosition)
{
DWORD pos, newposlo;
LONG newposhi;
LARGE_INTEGER newpos;
IUMCacheStream *This = (IUMCacheStream *)iface;
TRACE("(%p)\n",This);
pos = dlibMove.QuadPart; /* FIXME: truncates */
newposhi = 0;
newposlo = SetFilePointer( This->handle, pos, &newposhi, dwOrigin );
if( newposlo == INVALID_SET_FILE_POINTER && GetLastError())
if (!SetFilePointerEx( This->handle, dlibMove, &newpos, dwOrigin ))
return E_FAIL;
if (plibNewPosition)
plibNewPosition->QuadPart = newposlo | ( (LONGLONG)newposhi<<32);
plibNewPosition->QuadPart = newpos.QuadPart;
return S_OK;
}
@ -279,11 +274,13 @@ static HRESULT WINAPI IStream_fnSeek ( IStream * iface,
static HRESULT WINAPI IStream_fnSetSize (IStream * iface,
ULARGE_INTEGER libNewSize)
{
LARGE_INTEGER newpos;
IUMCacheStream *This = (IUMCacheStream *)iface;
TRACE("(%p)\n",This);
if( ! SetFilePointer( This->handle, libNewSize.QuadPart, NULL, FILE_BEGIN ) )
newpos.QuadPart = libNewSize.QuadPart;
if( ! SetFilePointerEx( This->handle, newpos, NULL, FILE_BEGIN ) )
return E_FAIL;
if( ! SetEndOfFile( This->handle ) )

View file

@ -293,19 +293,6 @@ HRESULT WINAPI ObtainUserAgentString(DWORD dwOption, LPSTR pcszUAOut, DWORD *cbS
return S_OK;
}
HRESULT WINAPI CoInternetCombineUrl(LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl, DWORD dwCombineFlags,
LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved)
{
HRESULT hres;
DWORD size = cchResult;
TRACE("(%s,%s,0x%08lx,%p,%ld,%p,%ld)\n", debugstr_w(pwzBaseUrl), debugstr_w(pwzRelativeUrl), dwCombineFlags,
pwzResult, cchResult, pcchResult, dwReserved);
hres = UrlCombineW(pwzBaseUrl, pwzRelativeUrl, pwzResult, &size, dwCombineFlags);
if(pcchResult) *pcchResult = size;
return hres;
}
HRESULT WINAPI CoInternetCompareUrl(LPCWSTR pwzUrl1, LPCWSTR pwzUrl2, DWORD dwCompareFlags)
{
TRACE("(%s,%s,%08lx)\n", debugstr_w(pwzUrl1), debugstr_w(pwzUrl2), dwCompareFlags);

View file

@ -18,33 +18,109 @@
#ifndef __WINE_ADVPUB_H
#define __WINE_ADVPUB_H
#include <setupapi.h>
/* FIXME: #include <cfgmgr32.h> */
#ifdef __cplusplus
extern "C" {
#endif
typedef struct _CabInfo {
PSTR pszCab;
PSTR pszInf;
PSTR pszSection;
char szSrcPath[MAX_PATH];
DWORD dwFlags;
} CABINFO, *PCABINFO;
typedef struct _CabInfoA
{
LPSTR pszCab;
LPSTR pszInf;
LPSTR pszSection;
CHAR szSrcPath[MAX_PATH];
DWORD dwFlags;
} CABINFOA, *PCABINFOA;
typedef struct _StrEntry {
typedef struct _CabInfoW
{
LPWSTR pszCab;
LPWSTR pszInf;
LPWSTR pszSection;
WCHAR szSrcPath[MAX_PATH];
DWORD dwFlags;
} CABINFOW, *PCABINFOW;
DECL_WINELIB_TYPE_AW(CABINFO)
DECL_WINELIB_TYPE_AW(PCABINFO)
typedef struct _PERUSERSECTIONA
{
CHAR szGUID[39 /*MAX_GUID_STRING_LEN*/ + 20];
CHAR szDispName[128];
CHAR szLocale[10];
CHAR szStub[MAX_PATH * 4];
CHAR szVersion[32];
CHAR szCompID[128];
DWORD dwIsInstalled;
BOOL bRollback;
} PERUSERSECTIONA, *PPERUSERSECTIONA;
typedef struct _PERUSERSECTIONW
{
WCHAR szGUID[39 /*MAX_GUID_STRING_LEN*/ + 20];
WCHAR szDispName[128];
WCHAR szLocale[10];
WCHAR szStub[MAX_PATH * 4];
WCHAR szVersion[32];
WCHAR szCompID[128];
DWORD dwIsInstalled;
BOOL bRollback;
} PERUSERSECTIONW, *PPERUSERSECTIONW;
DECL_WINELIB_TYPE_AW(PERUSERSECTION)
DECL_WINELIB_TYPE_AW(PPERUSERSECTION)
typedef struct _StrEntryA
{
LPSTR pszName;
LPSTR pszValue;
} STRENTRY, *LPSTRENTRY;
} STRENTRYA, *LPSTRENTRYA;
typedef const STRENTRY CSTRENTRY;
typedef CSTRENTRY *LPCSTRENTRY;
typedef struct _StrEntryW
{
LPWSTR pszName;
LPWSTR pszValue;
} STRENTRYW, *LPSTRENTRYW;
typedef struct _StrTable {
DECL_WINELIB_TYPE_AW(STRENTRY)
DECL_WINELIB_TYPE_AW(LPSTRENTRY)
typedef struct _StrTableA
{
DWORD cEntries;
LPSTRENTRY pse;
} STRTABLE, *LPSTRTABLE;
STRENTRYA* pse;
} STRTABLEA, *LPSTRTABLEA;
typedef const STRTABLEA CSTRTABLEA, *LPCSTRTABLEA;
typedef const STRTABLE CSTRTABLE;
typedef CSTRTABLE *LPCSTRTABLE;
typedef struct _StrTableW
{
DWORD cEntries;
STRENTRYW* pse;
} STRTABLEW, *LPSTRTABLEW;
typedef const STRTABLEW CSTRTABLEW, *LPCSTRTABLEW;
DECL_WINELIB_TYPE_AW(STRTABLE)
DECL_WINELIB_TYPE_AW(CSTRTABLE)
DECL_WINELIB_TYPE_AW(LPSTRTABLE)
DECL_WINELIB_TYPE_AW(LPCSTRTABLE)
/* Flags for AddDelBackupEntry */
#define AADBE_ADD_ENTRY 0x01
#define AADBE_DEL_ENTRY 0x02
/* Flags for AdvInstallFile */
#define AIF_WARNIFSKIP 0x00000001
#define AIF_NOSKIP 0x00000002
#define AIF_NOVERSIONCHECK 0x00000004
#define AIF_FORCE_FILE_IN_USE 0x00000008
#define AIF_NOOVERWRITE 0x00000010
#define AIF_NO_VERSION_DIALOG 0x00000020
#define AIF_REPLACEONLY 0x00000400
#define AIF_NOLANGUAGECHECK 0x10000000
#define AIF_QUIET 0x20000000
/* Flags for RunSetupCommand */
#define RSC_FLAG_INF 0x00000001
@ -59,16 +135,139 @@ typedef CSTRTABLE *LPCSTRTABLE;
#define ADN_DEL_IF_EMPTY 0x00000001
#define ADN_DONT_DEL_SUBDIRS 0x00000002
#define ADN_DONT_DEL_DIR 0x00000004
#define ADN_DEL_UNC_PATHS 0x00000008
HRESULT WINAPI RunSetupCommand(HWND hWnd,
LPCSTR szCmdName, LPCSTR szInfSection, LPCSTR szDir, LPCSTR lpszTitle,
HANDLE *phEXE, DWORD dwFlags, LPVOID pvReserved);
HRESULT WINAPI DelNode(LPCSTR pszFileOrDirName, DWORD dwFlags);
/* Flags for RegRestoreAll, RegSaveRestore, RegSaveRestoreOnINF */
#define IE4_RESTORE 0x00000001
#define IE4_BACKNEW 0x00000002
#define IE4_NODELETENEW 0x00000004
#define IE4_NOMESSAGES 0x00000008
#define IE4_NOPROGRESS 0x00000010
#define IE4_NOENUMKEY 0x00000020
#define IE4_NO_CRC_MAPPING 0x00000040
#define IE4_REGSECTION 0x00000080
#define IE4_FRDOALL 0x00000100
#define IE4_UPDREFCNT 0x00000200
#define IE4_USEREFCNT 0x00000400
#define IE4_EXTRAINCREFCNT 0x00000800
/* Flags for file save and restore functions */
#define AFSR_RESTORE IE4_RESTORE
#define AFSR_BACKNEW IE4_BACKNEW
#define AFSR_NODELETENEW IE4_NODELETENEW
#define AFSR_NOMESSAGES IE4_NOMESSAGES
#define AFSR_NOPROGRESS IE4_NOPROGRESS
#define AFSR_UPDREFCNT IE4_UPDREFCNT
#define AFSR_USEREFCNT IE4_USEREFCNT
#define AFSR_EXTRAINCREFCNT IE4_EXTRAINCREFCNT
HRESULT WINAPI AddDelBackupEntryA(LPCSTR lpcszFileList, LPCSTR lpcszBackupDir,
LPCSTR lpcszBaseName, DWORD dwFlags);
HRESULT WINAPI AddDelBackupEntryW(LPCWSTR lpcszFileList, LPCWSTR lpcszBackupDir,
LPCWSTR lpcszBaseName, DWORD dwFlags);
#define AddDelBackupEntry WINELIB_NAME_AW(AddDelBackupEntry)
HRESULT WINAPI AdvInstallFileA(HWND hwnd, LPCSTR lpszSourceDir,
LPCSTR lpszSourceFile, LPCSTR lpszDestDir, LPCSTR lpszDestFile,
DWORD dwFlags, DWORD dwReserved);
HRESULT WINAPI AdvInstallFileW(HWND hwnd, LPCWSTR lpszSourceDir,
LPCWSTR lpszSourceFile, LPCWSTR lpszDestDir, LPCWSTR lpszDestFile,
DWORD dwFlags, DWORD dwReserved);
#define AdvInstallFile WINELIB_NAME_AW(AdvInstallFile)
HRESULT WINAPI CloseINFEngine(HINF hInf);
HRESULT WINAPI DelNodeA(LPCSTR pszFileOrDirName, DWORD dwFlags);
HRESULT WINAPI DelNodeW(LPCWSTR pszFileOrDirName, DWORD dwFlags);
#define DelNode WINELIB_NAME_AW(DelNode)
HRESULT WINAPI DelNodeRunDLL32A(HWND,HINSTANCE,LPSTR,INT);
HRESULT WINAPI DelNodeRunDLL32W(HWND,HINSTANCE,LPWSTR,INT);
#define DelNodeRunDLL32 WINELIB_NAME_AW(DelNodeRunDLL32)
HRESULT WINAPI ExecuteCabA( HWND hwnd, CABINFOA* pCab, LPVOID pReserved );
HRESULT WINAPI ExecuteCabW( HWND hwnd, CABINFOW* pCab, LPVOID pReserved );
#define ExecuteCab WINELIB_NAME_AW(ExecuteCab)
HRESULT WINAPI ExtractFilesA(LPCSTR,LPCSTR,DWORD,LPCSTR,LPVOID,DWORD);
HRESULT WINAPI ExtractFilesW(LPCWSTR,LPCWSTR,DWORD,LPCWSTR,LPVOID,DWORD);
#define ExtractFiles WINELIB_NAME_AW(ExtractFiles)
HRESULT WINAPI FileSaveMarkNotExistA(LPSTR pszFileList, LPSTR pszDir, LPSTR pszBaseName);
HRESULT WINAPI FileSaveMarkNotExistW(LPWSTR pszFileList, LPWSTR pszDir, LPWSTR pszBaseName);
#define FileSaveMarkNotExist WINELIB_NAME_AW(FileSaveMarkNotExist)
HRESULT WINAPI FileSaveRestoreA(HWND hDlg, LPSTR pszFileList, LPSTR pszDir,
LPSTR pszBaseName, DWORD dwFlags);
HRESULT WINAPI FileSaveRestoreW(HWND hDlg, LPWSTR pszFileList, LPWSTR pszDir,
LPWSTR pszBaseName, DWORD dwFlags);
#define FileSaveRestore WINELIB_NAME_AW(FileSaveRestore)
HRESULT WINAPI FileSaveRestoreOnINFA(HWND hWnd, LPCSTR pszTitle, LPCSTR pszINF,
LPCSTR pszSection, LPCSTR pszBackupDir, LPCSTR pszBaseBackupFile, DWORD dwFlags);
HRESULT WINAPI FileSaveRestoreOnINFW(HWND hWnd, LPCWSTR pszTitle, LPCWSTR pszINF,
LPCWSTR pszSection, LPCWSTR pszBackupDir, LPCWSTR pszBaseBackupFile, DWORD dwFlags);
#define FileSaveRestoreOnINF WINELIB_NAME_AW(FileSaveRestoreOnINF)
HRESULT WINAPI GetVersionFromFileA(LPCSTR lpszFilename, LPDWORD pdwMSVer, LPDWORD pdwLSVer, BOOL bVersion);
HRESULT WINAPI GetVersionFromFileW(LPCWSTR lpszFilename, LPDWORD pdwMSVer, LPDWORD pdwLSVer, BOOL bVersion);
#define GetVersionFromFile WINELIB_NAME_AW(GetVersionFromFile)
HRESULT WINAPI GetVersionFromFileExA(LPCSTR lpszFilename, LPDWORD pdwMSVer, LPDWORD pdwLSVer, BOOL bVersion);
HRESULT WINAPI GetVersionFromFileExW(LPCWSTR lpszFilename, LPDWORD pdwMSVer, LPDWORD pdwLSVer, BOOL bVersion);
#define GetVersionFromFileEx WINELIB_NAME_AW(GetVersionFromFileEx)
BOOL WINAPI IsNTAdmin(DWORD,LPDWORD);
INT WINAPI LaunchINFSectionA(HWND,HINSTANCE,LPSTR,INT);
INT WINAPI LaunchINFSectionW(HWND,HINSTANCE,LPWSTR,INT);
#define LaunchINFSection WINELIB_NAME_AW(LaunchINFSection)
HRESULT WINAPI LaunchINFSectionExA(HWND,HINSTANCE,LPSTR,INT);
HRESULT WINAPI LaunchINFSectionExW(HWND,HINSTANCE,LPWSTR,INT);
#define LaunchINFSectionEx WINELIB_NAME_AW(LaunchINFSectionEx)
DWORD WINAPI NeedRebootInit(VOID);
BOOL WINAPI NeedReboot(DWORD dwRebootCheck);
HRESULT WINAPI RegInstall(HMODULE hm, LPCSTR pszSection, LPCSTRTABLE pstTable);
HRESULT WINAPI GetVersionFromFile(LPSTR lpszFilename, LPDWORD pdwMSVer, LPDWORD pdwLSVer, BOOL bVersion);
HRESULT WINAPI GetVersionFromFileEx(LPSTR lpszFilename, LPDWORD pdwMSVer, LPDWORD pdwLSVer, BOOL bVersion);
HRESULT WINAPI OpenINFEngineA(LPCSTR pszInfFilename, LPCSTR pszInstallSection,
DWORD dwFlags, HINF *phInf, PVOID pvReserved);
HRESULT WINAPI OpenINFEngineW(LPCWSTR pszInfFilename, LPCWSTR pszInstallSection,
DWORD dwFlags, HINF *phInf, PVOID pvReserved);
#define OpenINFEngine WINELIB_NAME_AW(OpenINFEngine)
HRESULT WINAPI RebootCheckOnInstallA(HWND hWnd, LPCSTR pszINF, LPSTR pszSec, DWORD dwReserved);
HRESULT WINAPI RebootCheckOnInstallW(HWND hWnd, LPCWSTR pszINF, LPWSTR pszSec, DWORD dwReserved);
#define RebootCheckOnInstall WINELIB_NAME_AW(RebootCheckOnInstall)
HRESULT WINAPI RegInstallA(HMODULE hm, LPCSTR pszSection, const STRTABLEA* pstTable);
HRESULT WINAPI RegInstallW(HMODULE hm, LPCWSTR pszSection, const STRTABLEW* pstTable);
#define RegInstall WINELIB_NAME_AW(RegInstall)
HRESULT WINAPI RegRestoreAllA(HWND hWnd, LPSTR pszTitleString, HKEY hkBackupKey);
HRESULT WINAPI RegRestoreAllW(HWND hWnd, LPWSTR pszTitleString, HKEY hkBackupKey);
#define RegRestoreAll WINELIB_NAME_AW(RegRestoreAll)
HRESULT WINAPI RegSaveRestoreA(HWND hWnd, LPCSTR pszTitleString, HKEY hkBackupKey,
LPCSTR pcszRootKey, LPCSTR pcszSubKey, LPCSTR pcszValueName, DWORD dwFlags);
HRESULT WINAPI RegSaveRestoreW(HWND hWnd, LPCWSTR pszTitleString, HKEY hkBackupKey,
LPCWSTR pcszRootKey, LPCWSTR pcszSubKey, LPCWSTR pcszValueName, DWORD dwFlags);
#define RegSaveRestore WINELIB_NAME_AW(RegSaveRestore)
HRESULT WINAPI RegSaveRestoreOnINFA(HWND hWnd, LPCSTR pszTitle, LPCSTR pszINF,
LPCSTR pszSection, HKEY hHKLMBackKey, HKEY hHKCUBackKey, DWORD dwFlags);
HRESULT WINAPI RegSaveRestoreOnINFW(HWND hWnd, LPCWSTR pszTitle, LPCWSTR pszINF,
LPCWSTR pszSection, HKEY hHKLMBackKey, HKEY hHKCUBackKey, DWORD dwFlags);
#define RegSaveRestoreOnINF WINELIB_NAME_AW(RegSaveRestoreOnINF)
HRESULT WINAPI RunSetupCommandA(HWND hWnd,
LPCSTR szCmdName, LPCSTR szInfSection, LPCSTR szDir, LPCSTR lpszTitle,
HANDLE *phEXE, DWORD dwFlags, LPVOID pvReserved);
HRESULT WINAPI RunSetupCommandW(HWND hWnd,
LPCWSTR szCmdName, LPCWSTR szInfSection, LPCWSTR szDir, LPCWSTR lpszTitle,
HANDLE *phEXE, DWORD dwFlags, LPVOID pvReserved);
#define RunSetupCommand WINELIB_NAME_AW(RunSetupCommand)
HRESULT WINAPI SetPerUserSecValuesA(PPERUSERSECTIONA pPerUser);
HRESULT WINAPI SetPerUserSecValuesW(PPERUSERSECTIONW pPerUser);
#define SetPerUserSecValues WINELIB_NAME_AW(SetPerUserSecValues)
HRESULT WINAPI TranslateInfStringA(LPCSTR pszInfFilename, LPCSTR pszInstallSection,
LPCSTR pszTranslateSection, LPCSTR pszTranslateKey, LPSTR pszBuffer,
DWORD dwBufferSize, PDWORD pdwRequiredSize, PVOID pvReserved);
HRESULT WINAPI TranslateInfStringW(LPCWSTR pszInfFilename, LPCWSTR pszInstallSection,
LPCWSTR pszTranslateSection, LPCWSTR pszTranslateKey, LPWSTR pszBuffer,
DWORD dwBufferSize, PDWORD pdwRequiredSize, PVOID pvReserved);
#define TranslateInfString WINELIB_NAME_AW(TranslateInfString)
HRESULT WINAPI TranslateInfStringExA(HINF hInf, LPCSTR pszInfFilename,
LPCSTR pszTranslateSection, LPCSTR pszTranslateKey, LPSTR pszBuffer,
DWORD dwBufferSize, PDWORD pdwRequiredSize, PVOID pvReserved);
HRESULT WINAPI TranslateInfStringExW(HINF hInf, LPCWSTR pszInfFilename,
LPCWSTR pszTranslateSection, LPCWSTR pszTranslateKey, LPWSTR pszBuffer,
DWORD dwBufferSize, PDWORD pdwRequiredSize, PVOID pvReserved);
#define TranslateInfStringEx WINELIB_NAME_AW(TranslateInfStringEx)
HRESULT WINAPI UserInstStubWrapperA(HWND hWnd, HINSTANCE hInstance, LPSTR pszParms, INT nShow);
HRESULT WINAPI UserInstStubWrapperW(HWND hWnd, HINSTANCE hInstance, LPWSTR pszParms, INT nShow);
#define UserInstStubWrapper WINELIB_NAME_AW(UserInstStubWrapper)
HRESULT WINAPI UserUnInstStubWrapperA(HWND hWnd, HINSTANCE hInstance, LPSTR pszParms, INT nShow);
HRESULT WINAPI UserUnInstStubWrapperW(HWND hWnd, HINSTANCE hInstance, LPWSTR pszParms, INT nShow);
#define UserUnInstStubWrapper WINELIB_NAME_AW(UserUnInstStubWrapper)
#ifdef __cplusplus
}

View file

@ -51,11 +51,11 @@ reactos/dll/win32/mapi32 # Synced to Wine-0_9_5
reactos/dll/win32/msvcrt20 # Out of sync
reactos/dll/win32/mpr # Synced to Wine-0_9_5
reactos/dll/win32/msacm # Out of sync
reactos/dll/win32/msimg32 # Synced to Wine-0_9_5
reactos/dll/win32/msimg32 # Synced to Wine-0_9_12
reactos/dll/win32/msi # Synced to Wine-0_9_5
reactos/dll/win32/msvideo # Out of sync
reactos/dll/win32/netapi32 # Synced to Wine-0_9_5
reactos/dll/win32/objsel # Synced to Wine-0_9_5
reactos/dll/win32/objsel # Synced to Wine-0_9_12
reactos/dll/win32/odbc32 # Out of sync. Depends on port of Linux ODBC.
reactos/dll/win32/ole32 # Synced to Wine-0_9_5
reactos/dll/win32/oleacc # Synced to Wine-0_9_5
@ -71,7 +71,7 @@ reactos/dll/win32/shdocvw # Synced to Wine-0_9_5
reactos/dll/win32/shfolder # Synced to Wine-0_9_5
reactos/dll/win32/shlwapi # Synced to Wine-0_9_5
reactos/dll/win32/twain # Out of sync
reactos/dll/win32/urlmon # Synced to Wine-0_9_5
reactos/dll/win32/urlmon # Synced to Wine-0_9_10
reactos/dll/win32/uxtheme # Synced to Wine-0_9_5
reactos/dll/win32/version # Out of sync
reactos/dll/win32/wininet # Synced to Wine-0_9_5