Added some stubs.
diff --git a/dlls/Makefile.in b/dlls/Makefile.in
index f44b264..f9ea850 100644
--- a/dlls/Makefile.in
+++ b/dlls/Makefile.in
@@ -718,7 +718,8 @@
url/url.dll$(DLLEXT): dummy ntdll.dll$(DLLEXT)
@cd url && $(MAKE) url.dll$(DLLEXT)
-urlmon/urlmon.dll$(DLLEXT): dummy ole32.dll$(DLLEXT) ntdll.dll$(DLLEXT)
+urlmon/urlmon.dll$(DLLEXT): dummy ole32.dll$(DLLEXT) kernel32.dll$(DLLEXT) \
+ ntdll.dll$(DLLEXT)
@cd urlmon && $(MAKE) urlmon.dll$(DLLEXT)
user/user32.dll$(DLLEXT): dummy gdi32.dll$(DLLEXT) advapi32.dll$(DLLEXT) \
diff --git a/dlls/urlmon/Makefile.in b/dlls/urlmon/Makefile.in
index 7827f1b..65c9470 100644
--- a/dlls/urlmon/Makefile.in
+++ b/dlls/urlmon/Makefile.in
@@ -3,11 +3,14 @@
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = urlmon.dll
+EXTRALIBS = $(LIBUUID)
LDDLLFLAGS = @LDDLLFLAGS@
SYMBOLFILE = $(MODULE).tmp.o
C_SRCS = \
+ comimpl.c \
+ moniker.c \
umon.c \
urlmon_main.c
diff --git a/dlls/urlmon/comimpl.c b/dlls/urlmon/comimpl.c
new file mode 100644
index 0000000..4793dc2
--- /dev/null
+++ b/dlls/urlmon/comimpl.c
@@ -0,0 +1,444 @@
+/*
+ * A basic implementation for COM DLL implementor.
+ *
+ * Copyright (C) 2002 Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp>
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "config.h"
+
+#include "windef.h"
+#include "winerror.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "winnls.h"
+#include "ole2.h"
+
+#include "wine/debug.h"
+WINE_DEFAULT_DEBUG_CHANNEL(comimpl);
+
+#include "comimpl.h"
+
+/*
+ - All threading model including Apartment and Both are supported.
+ - Aggregation is supported.
+ - CoFreeUnusedLibraries() is supported.
+ - DisableThreadLibraryCalls() is supported.
+ */
+
+static CRITICAL_SECTION csComImpl;
+static DWORD dwComImplRef;
+
+
+static HRESULT WINAPI
+IUnknown_fnQueryInterface(IUnknown* iface,REFIID riid,LPVOID *ppobj)
+{
+ ICOM_THIS(COMIMPL_IUnkImpl,iface);
+ size_t ofs;
+ DWORD dwIndex;
+ COMIMPL_IFDelegation* pDelegation;
+ HRESULT hr;
+
+ TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppobj);
+
+ if ( ppobj == NULL )
+ return E_POINTER;
+ *ppobj = NULL;
+
+ ofs = 0;
+
+ if ( IsEqualGUID( &IID_IUnknown, riid ) )
+ {
+ TRACE("IID_IUnknown - returns inner object.\n");
+ }
+ else
+ {
+ for ( dwIndex = 0; dwIndex < This->dwEntries; dwIndex++ )
+ {
+ if ( IsEqualGUID( This->pEntries[dwIndex].piid, riid ) )
+ {
+ ofs = This->pEntries[dwIndex].ofsVTPtr;
+ break;
+ }
+ }
+ if ( dwIndex == This->dwEntries )
+ {
+ hr = E_NOINTERFACE;
+
+ /* delegation */
+ pDelegation = This->pDelegationFirst;
+ while ( pDelegation != NULL )
+ {
+ hr = (*pDelegation->pOnQueryInterface)( iface, riid, ppobj );
+ if ( hr != E_NOINTERFACE )
+ break;
+ pDelegation = pDelegation->pNext;
+ }
+
+ if ( hr == E_NOINTERFACE )
+ {
+ FIXME("(%p) unknown interface: %s\n",This,debugstr_guid(riid));
+ }
+
+ return hr;
+ }
+ }
+
+ *ppobj = (LPVOID)(((char*)This) + ofs);
+ IUnknown_AddRef((IUnknown*)(*ppobj));
+
+ return S_OK;
+}
+
+static ULONG WINAPI
+IUnknown_fnAddRef(IUnknown* iface)
+{
+ ICOM_THIS(COMIMPL_IUnkImpl,iface);
+
+ TRACE("(%p)->()\n",This);
+
+ return InterlockedExchangeAdd(&(This->ref),1) + 1;
+}
+
+static ULONG WINAPI
+IUnknown_fnRelease(IUnknown* iface)
+{
+ ICOM_THIS(COMIMPL_IUnkImpl,iface);
+ LONG ref;
+
+ TRACE("(%p)->()\n",This);
+ ref = InterlockedExchangeAdd(&(This->ref),-1) - 1;
+ if ( ref > 0 )
+ return (ULONG)ref;
+
+ This->ref ++;
+ if ( This->pOnFinalRelease != NULL )
+ (*(This->pOnFinalRelease))(iface);
+ This->ref --;
+
+ COMIMPL_FreeObj(This);
+
+ return 0;
+}
+
+
+static ICOM_VTABLE(IUnknown) iunknown =
+{
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+ /* IUnknown fields */
+ IUnknown_fnQueryInterface,
+ IUnknown_fnAddRef,
+ IUnknown_fnRelease,
+};
+
+
+void COMIMPL_IUnkInit( COMIMPL_IUnkImpl* pImpl, IUnknown* punkOuter )
+{
+ TRACE("(%p)\n",pImpl);
+
+ ICOM_VTBL(pImpl) = &iunknown;
+ pImpl->pEntries = NULL;
+ pImpl->dwEntries = 0;
+ pImpl->pDelegationFirst = NULL;
+ pImpl->pOnFinalRelease = NULL;
+ pImpl->ref = 1;
+ pImpl->punkControl = (IUnknown*)pImpl;
+
+ /* for implementing aggregation. */
+ if ( punkOuter != NULL )
+ pImpl->punkControl = punkOuter;
+}
+
+void COMIMPL_IUnkAddDelegationHandler(
+ COMIMPL_IUnkImpl* pImpl, COMIMPL_IFDelegation* pDelegation )
+{
+ pDelegation->pNext = pImpl->pDelegationFirst;
+ pImpl->pDelegationFirst = pDelegation;
+}
+
+
+
+/************************************************************************/
+
+
+static HRESULT WINAPI
+IClassFactory_fnQueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj);
+static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface);
+static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface);
+static HRESULT WINAPI IClassFactory_fnCreateInstance(LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj);
+static HRESULT WINAPI IClassFactory_fnLockServer(LPCLASSFACTORY iface,BOOL dolock);
+
+static ICOM_VTABLE(IClassFactory) iclassfact =
+{
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+ IClassFactory_fnQueryInterface,
+ IClassFactory_fnAddRef,
+ IClassFactory_fnRelease,
+ IClassFactory_fnCreateInstance,
+ IClassFactory_fnLockServer
+};
+
+typedef struct
+{
+ /* IUnknown fields */
+ ICOM_VFIELD(IClassFactory);
+ LONG ref;
+ /* IClassFactory fields */
+ const COMIMPL_CLASSENTRY* pEntry;
+} IClassFactoryImpl;
+
+
+static HRESULT WINAPI
+IClassFactory_fnQueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
+{
+ ICOM_THIS(IClassFactoryImpl,iface);
+
+ TRACE("(%p)->(%p,%p)\n",This,riid,ppobj);
+ if ( ( IsEqualGUID( &IID_IUnknown, riid ) ) ||
+ ( IsEqualGUID( &IID_IClassFactory, riid ) ) )
+ {
+ *ppobj = iface;
+ IClassFactory_AddRef(iface);
+ return S_OK;
+ }
+
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface)
+{
+ ICOM_THIS(IClassFactoryImpl,iface);
+
+ TRACE("(%p)->()\n",This);
+
+ return InterlockedExchangeAdd(&(This->ref),1) + 1;
+}
+
+static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface)
+{
+ ICOM_THIS(IClassFactoryImpl,iface);
+ LONG ref;
+
+ TRACE("(%p)->()\n",This);
+ ref = InterlockedExchangeAdd(&(This->ref),-1) - 1;
+ if ( ref > 0 )
+ return (ULONG)ref;
+
+ COMIMPL_FreeObj(This);
+ return 0;
+}
+
+static HRESULT WINAPI IClassFactory_fnCreateInstance(LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj)
+{
+ ICOM_THIS(IClassFactoryImpl,iface);
+ HRESULT hr;
+ IUnknown* punk;
+
+ TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
+
+ if ( ppobj == NULL )
+ return E_POINTER;
+ if ( pOuter != NULL && !IsEqualGUID( riid, &IID_IUnknown ) )
+ return CLASS_E_NOAGGREGATION;
+
+ *ppobj = NULL;
+
+ hr = (*This->pEntry->pCreateIUnk)(pOuter,(void**)&punk);
+ if ( hr != S_OK )
+ return hr;
+
+ hr = IUnknown_QueryInterface(punk,riid,ppobj);
+ IUnknown_Release(punk);
+
+ return hr;
+}
+
+static HRESULT WINAPI IClassFactory_fnLockServer(LPCLASSFACTORY iface,BOOL dolock)
+{
+ ICOM_THIS(IClassFactoryImpl,iface);
+ HRESULT hr;
+
+ TRACE("(%p)->(%d)\n",This,dolock);
+ if (dolock)
+ hr = IClassFactory_AddRef(iface);
+ else
+ hr = IClassFactory_Release(iface);
+
+ return hr;
+}
+
+
+
+static HRESULT IClassFactory_Alloc( const CLSID* pclsid, void** ppobj )
+{
+ const COMIMPL_CLASSENTRY* pEntry;
+ IClassFactoryImpl* pImpl;
+
+ TRACE( "(%s,%p)\n", debugstr_guid(pclsid), ppobj );
+
+ pEntry = COMIMPL_ClassList;
+ while ( pEntry->pclsid != NULL )
+ {
+ if ( IsEqualGUID( pclsid, pEntry->pclsid ) )
+ goto found;
+ pEntry ++;
+ }
+
+ return CLASS_E_CLASSNOTAVAILABLE;
+found:
+ pImpl = (IClassFactoryImpl*)COMIMPL_AllocObj( sizeof(IClassFactoryImpl) );
+ if ( pImpl == NULL )
+ return E_OUTOFMEMORY;
+
+ TRACE( "allocated successfully.\n" );
+
+ ICOM_VTBL(pImpl) = &iclassfact;
+ pImpl->ref = 1;
+ pImpl->pEntry = pEntry;
+
+ *ppobj = (void*)pImpl;
+ return S_OK;
+}
+
+
+
+
+/***********************************************************************
+ * COMIMPL_InitProcess (internal)
+ */
+static BOOL COMIMPL_InitProcess( HINSTANCE hInstDLL )
+{
+ TRACE("()\n");
+
+ dwComImplRef = 0;
+ InitializeCriticalSection( &csComImpl );
+
+#ifndef COMIMPL_PERTHREAD_INIT
+ DisableThreadLibraryCalls((HMODULE)hInstDLL);
+#endif /* COMIMPL_PERTHREAD_INIT */
+
+ return TRUE;
+}
+
+/***********************************************************************
+ * COMIMPL_UninitProcess (internal)
+ */
+static void COMIMPL_UninitProcess( HINSTANCE hInstDLL )
+{
+ CHAR szThisDLL[ MAX_PATH ];
+
+ TRACE("()\n");
+
+ if ( dwComImplRef != 0 )
+ {
+ szThisDLL[0] = '\0';
+ if ( !GetModuleFileNameA( (HMODULE)hInstDLL, szThisDLL, MAX_PATH ) )
+ szThisDLL[0] = '\0';
+ ERR( "you must release some objects allocated from %s.\n", szThisDLL );
+ }
+ DeleteCriticalSection( &csComImpl );
+}
+
+
+/***********************************************************************
+ * COMIMPL_DllMain
+ */
+BOOL WINAPI COMIMPL_DllMain(
+ HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved )
+{
+ TRACE("(%08x,%08lx,%p)\n",hInstDLL,fdwReason,lpvReserved);
+
+ switch ( fdwReason )
+ {
+ case DLL_PROCESS_ATTACH:
+ if ( !COMIMPL_InitProcess( hInstDLL ) )
+ return FALSE;
+ break;
+ case DLL_PROCESS_DETACH:
+ COMIMPL_UninitProcess( hInstDLL );
+ break;
+ case DLL_THREAD_ATTACH:
+ break;
+ case DLL_THREAD_DETACH:
+ break;
+ }
+
+ return TRUE;
+}
+
+/***********************************************************************
+ * COMIMPL_DllGetClassObject
+ */
+HRESULT WINAPI COMIMPL_DllGetClassObject(
+ const CLSID* pclsid,const IID* piid,void** ppv)
+{
+ *ppv = NULL;
+ if ( IsEqualGUID( &IID_IUnknown, piid ) ||
+ IsEqualGUID( &IID_IClassFactory, piid ) )
+ {
+ return IClassFactory_Alloc( pclsid, ppv );
+ }
+
+ return CLASS_E_CLASSNOTAVAILABLE;
+}
+
+/***********************************************************************
+ * COMIMPL_DllCanUnloadNow
+ *
+ * RETURNS
+ * Success: S_OK
+ * Failure: S_FALSE
+ */
+HRESULT WINAPI COMIMPL_DllCanUnloadNow(void)
+{
+ HRESULT hr;
+
+ EnterCriticalSection( &csComImpl );
+ hr = ( dwComImplRef == 0 ) ? S_OK : S_FALSE;
+ LeaveCriticalSection( &csComImpl );
+
+ return hr;
+}
+
+/***********************************************************************
+ * COMIMPL_AllocObj
+ */
+void* COMIMPL_AllocObj( DWORD dwSize )
+{
+ void* pv;
+
+ EnterCriticalSection( &csComImpl );
+ dwComImplRef ++;
+ pv = HeapAlloc( COMIMPL_hHeap, 0, dwSize );
+ if ( pv == NULL )
+ dwComImplRef --;
+ LeaveCriticalSection( &csComImpl );
+
+ return pv;
+}
+
+/***********************************************************************
+ * COMIMPL_FreeObj
+ */
+void COMIMPL_FreeObj( void* pobj )
+{
+ EnterCriticalSection( &csComImpl );
+ HeapFree( COMIMPL_hHeap, 0, pobj );
+ dwComImplRef --;
+ LeaveCriticalSection( &csComImpl );
+}
+
diff --git a/dlls/urlmon/comimpl.h b/dlls/urlmon/comimpl.h
new file mode 100644
index 0000000..443906e
--- /dev/null
+++ b/dlls/urlmon/comimpl.h
@@ -0,0 +1,171 @@
+/*
+ * A basic implementation for COM DLL implementor.
+ *
+ * Copyright (C) 2002 Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp>
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef WINE_COMIMPL_H
+#define WINE_COMIMPL_H
+
+/*
+ This code provides a basic thread-safe COM implementation
+ including aggregation(and an IClassFactory implementation).
+ This code is based on my quartz code.
+
+ The usage of this library is:
+
+ 1) copy comimpl.h and comimpl.c.
+ 2) implement the global class entries 'COMIMPL_ClassList'.
+ 3) export COMIMPL_DllMain, COMIMPL_DllGetClassObject and
+ COMIMPL_DllCanUnloadNow.
+ 4) add 'comimpl' to your debug channels.
+ 5) implement your IUnknown as a thunk to call
+ COMIMPL_IUnkImpl.punk methods.
+ 6) provide pointers of vtables in constructor.
+ 7) optionally, you can edit comimpl.h and/or comimpl.c.
+
+ A sample allocator of class COne that supports
+ two interface IOne and ITwo is:
+
+ const COMIMPL_CLASSENTRY COMIMPL_ClassList[] =
+ {
+ { &CLSID_COne, &COne_AllocObj },
+ { NULL, NULL } << the last entry must be NULL >>
+ };
+
+ typedef struct COne
+ {
+ COMIMPL_IUnkImpl vfunk; << must be the first member of this struct >>
+ struct { ICOM_VFIELD(IOne); } vfone;
+ struct { ICOM_VFIELD(ITwo); } vftwo;
+ << ... >>
+ } COne;
+ #define COne_THIS(iface,member) COne* This = ((COne*)(((char*)iface)-offsetof(COne,member)))
+
+ static COMIMPL_IFEntry IFEntries[] =
+ {
+ << all supported interfaces >>
+ { &IID_IOne, offsetof(COne,vfone)-offsetof(COne,vfunk) },
+ { &IID_ITwo, offsetof(COne,vftwo)-offsetof(COne,vfunk) },
+ };
+
+ static void COne_Destructor(IUnknown* iface)
+ {
+ COne_THIS(iface,vfunk);
+
+ << ... implement destructor ... >>
+ }
+
+ HRESULT COne_AllocObj(IUnknown* punkOuter,void** ppobj)
+ {
+ COne* This;
+
+ This = (COne*)COMIMPL_AllocObj( sizeof(COne) );
+ if ( This == NULL ) return E_OUTOFMEMORY;
+ COMIMPL_IUnkInit( &This->vfunk, punkOuter );
+ This->vfunk.pEntries = IFEntries;
+ This->vfunk.dwEntries = sizeof(IFEntries)/sizeof(IFEntries[0]);
+ This->vfunk.pOnFinalRelease = COne_Destructor;
+
+ ICOM_VTBL(&This->vfone) = &ione;
+ ICOM_VTBL(&This->vftwo) = &itwo;
+
+ << ... implement constructor ... >>
+ << if error occurs in constructing, you can call simply
+ punk::Release() and return HRESULT. >>
+
+ *ppobj = (void*)(&This->vfunk);
+
+ return S_OK; << return S_OK if succeeded >>
+ }
+ */
+
+/* if per-thread initialization is needed, uncomment the following line */
+/*#define COMIMPL_PERTHREAD_INIT*/
+/* If an own heap is needed, customize the following line */
+#define COMIMPL_hHeap GetProcessHeap()
+
+
+typedef HRESULT (*COMIMPL_pCreateIUnknown)(IUnknown* punkOuter,void** ppobj);
+typedef void (*COMIMPL_pOnFinalRelease)(IUnknown* punkInner);
+
+typedef struct COMIMPL_IFEntry COMIMPL_IFEntry;
+typedef struct COMIMPL_IFDelegation COMIMPL_IFDelegation;
+typedef struct COMIMPL_IUnkImpl COMIMPL_IUnkImpl;
+
+struct COMIMPL_IFEntry
+{
+ const IID* piid; /* interface ID. */
+ size_t ofsVTPtr; /* offset from IUnknown. */
+};
+
+struct COMIMPL_IFDelegation
+{
+ struct COMIMPL_IFDelegation* pNext;
+ HRESULT (*pOnQueryInterface)(
+ IUnknown* punk, const IID* piid, void** ppobj );
+};
+
+/* COMIMPL_IUnkimpl must be aligned for InterlockedExchangeAdd. */
+#include <pshpack4.h>
+
+struct COMIMPL_IUnkImpl
+{
+ /* pointer of IUnknown interface. */
+ ICOM_VFIELD(IUnknown);
+
+ /* array of supported IIDs and offsets. */
+ const COMIMPL_IFEntry* pEntries;
+ DWORD dwEntries;
+ /* list of delegation handlers. */
+ COMIMPL_IFDelegation* pDelegationFirst;
+ /* called on final release. */
+ COMIMPL_pOnFinalRelease pOnFinalRelease;
+
+ /* IUnknown fields. */
+ LONG ref;
+ IUnknown* punkControl;
+};
+
+#include <poppack.h>
+
+typedef struct COMIMPL_CLASSENTRY
+{
+ const CLSID* pclsid;
+ COMIMPL_pCreateIUnknown pCreateIUnk;
+} COMIMPL_CLASSENTRY;
+
+
+extern const COMIMPL_CLASSENTRY COMIMPL_ClassList[]; /* must be provided */
+
+void COMIMPL_IUnkInit( COMIMPL_IUnkImpl* pImpl, IUnknown* punkOuter );
+void COMIMPL_IUnkAddDelegationHandler(
+ COMIMPL_IUnkImpl* pImpl, COMIMPL_IFDelegation* pDelegation );
+
+BOOL WINAPI COMIMPL_DllMain(
+ HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved );
+HRESULT WINAPI COMIMPL_DllGetClassObject(
+ const CLSID* pclsid,const IID* piid,void** ppv);
+HRESULT WINAPI COMIMPL_DllCanUnloadNow(void);
+
+void* COMIMPL_AllocObj( DWORD dwSize );
+void COMIMPL_FreeObj( void* pobj ); /* for internal use only. */
+
+
+
+
+#endif /* WINE_COMIMPL_H */
diff --git a/dlls/urlmon/moniker.c b/dlls/urlmon/moniker.c
new file mode 100644
index 0000000..6a68b30
--- /dev/null
+++ b/dlls/urlmon/moniker.c
@@ -0,0 +1,446 @@
+/*
+ * URL Moniker
+ *
+ * FIXME - stub
+ *
+ * Copyright (C) 2002 Hidenori TAKESHIMA <hidenori@a2.ctktv.ne.jp>
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "config.h"
+
+#include "windef.h"
+#include "winerror.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "ole2.h"
+#include "urlmon.h"
+
+#include "wine/debug.h"
+WINE_DEFAULT_DEBUG_CHANNEL(comimpl);
+
+#include "comimpl.h"
+
+
+/*
+ * NOTE:
+ * URL Moniker supports the following protocols(at least):
+ *
+ * CLSID_HttpProtocol
+ * CLSID_FtpProtocol
+ * CLSID_GopherProtocol
+ * CLSID_HttpSProtocol
+ * CLSID_FileProtocol
+ *
+ */
+
+typedef struct CURLMonikerImpl
+{
+ COMIMPL_IUnkImpl vfunk;
+ struct { ICOM_VFIELD(IMoniker); } moniker;
+ struct { ICOM_VFIELD(IROTData); } rotd;
+
+ /* IMoniker stuffs */
+} CURLMonikerImpl;
+
+#define CURLMonikerImpl_THIS(iface,member) CURLMonikerImpl* This = ((CURLMonikerImpl*)(((char*)iface)-offsetof(CURLMonikerImpl,member)))
+
+
+static HRESULT WINAPI
+IMoniker_fnQueryInterface(IMoniker* iface,REFIID riid,void** ppobj)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ TRACE("(%p)->()\n",This);
+
+ return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
+}
+
+static ULONG WINAPI
+IMoniker_fnAddRef(IMoniker* iface)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ TRACE("(%p)->()\n",This);
+
+ return IUnknown_AddRef(This->vfunk.punkControl);
+}
+
+static ULONG WINAPI
+IMoniker_fnRelease(IMoniker* iface)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ TRACE("(%p)->()\n",This);
+
+ return IUnknown_Release(This->vfunk.punkControl);
+}
+
+static HRESULT WINAPI IMoniker_fnGetClassID(IMoniker* iface, CLSID *pClassID)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub\n",This);
+
+ return E_NOTIMPL;
+#if 0
+ TRACE("(%p)->()\n",This);
+
+ if ( pClassID == NULL )
+ return E_POINTER;
+ memcpy( pClassID, &CLSID_StdURLMoniker, sizeof(CLSID) );
+
+ return NOERROR;
+#endif
+}
+
+static HRESULT WINAPI IMoniker_fnIsDirty(IMoniker* iface)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnLoad(IMoniker* iface, IStream* pStm)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnSave(IMoniker* iface, IStream* pStm, BOOL fClearDirty)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnGetSizeMax(IMoniker* iface, ULARGE_INTEGER* pcbSize)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnBindToObject(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->(%p,%p,%s,%p)\n",This,
+ pbc,pmkToLeft,debugstr_guid(riid),ppvResult);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnBindToStorage(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->(%p,%p,%s,%p)\n",This,
+ pbc,pmkToLeft,debugstr_guid(riid),ppvResult);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnReduce(IMoniker* iface,IBindCtx* pbc, DWORD dwReduceHowFar,IMoniker** ppmkToLeft, IMoniker** ppmkReduced)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnComposeWith(IMoniker* iface,IMoniker* pmkRight,BOOL fOnlyIfNotGeneric, IMoniker** ppmkComposite)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnEnum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnIsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnHash(IMoniker* iface,DWORD* pdwHash)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnIsRunning(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, IMoniker* pmkNewlyRunning)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnGetTimeOfLastChange(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, FILETIME* pCompositeTime)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnInverse(IMoniker* iface,IMoniker** ppmk)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnCommonPrefixWith(IMoniker* iface,IMoniker* pmkOther, IMoniker** ppmkPrefix)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnRelativePathTo(IMoniker* iface,IMoniker* pmOther, IMoniker** ppmkRelPath)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnGetDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR *ppszDisplayName)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnParseDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI IMoniker_fnIsSystemMoniker(IMoniker* iface,DWORD* pdwMksys)
+{
+ CURLMonikerImpl_THIS(iface,moniker);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+
+static ICOM_VTABLE(IMoniker) imoniker =
+{
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+ /* IUnknown fields */
+ IMoniker_fnQueryInterface,
+ IMoniker_fnAddRef,
+ IMoniker_fnRelease,
+ /* IPersist fields */
+ IMoniker_fnGetClassID,
+ /* IPersistStream fields */
+ IMoniker_fnIsDirty,
+ IMoniker_fnLoad,
+ IMoniker_fnSave,
+ IMoniker_fnGetSizeMax,
+ /* IMoniker fields */
+ IMoniker_fnBindToObject,
+ IMoniker_fnBindToStorage,
+ IMoniker_fnReduce,
+ IMoniker_fnComposeWith,
+ IMoniker_fnEnum,
+ IMoniker_fnIsEqual,
+ IMoniker_fnHash,
+ IMoniker_fnIsRunning,
+ IMoniker_fnGetTimeOfLastChange,
+ IMoniker_fnInverse,
+ IMoniker_fnCommonPrefixWith,
+ IMoniker_fnRelativePathTo,
+ IMoniker_fnGetDisplayName,
+ IMoniker_fnParseDisplayName,
+ IMoniker_fnIsSystemMoniker,
+};
+
+
+
+
+static HRESULT WINAPI
+IROTData_fnQueryInterface(IROTData* iface,REFIID riid,void** ppobj)
+{
+ CURLMonikerImpl_THIS(iface,rotd);
+
+ TRACE("(%p)->()\n",This);
+
+ return IUnknown_QueryInterface(This->vfunk.punkControl,riid,ppobj);
+}
+
+static ULONG WINAPI
+IROTData_fnAddRef(IROTData* iface)
+{
+ CURLMonikerImpl_THIS(iface,rotd);
+
+ TRACE("(%p)->()\n",This);
+
+ return IUnknown_AddRef(This->vfunk.punkControl);
+}
+
+static ULONG WINAPI
+IROTData_fnRelease(IROTData* iface)
+{
+ CURLMonikerImpl_THIS(iface,rotd);
+
+ TRACE("(%p)->()\n",This);
+
+ return IUnknown_Release(This->vfunk.punkControl);
+}
+
+static HRESULT WINAPI IROTData_fnGetComparisonData(IROTData* iface,BYTE* pbData,ULONG cbMax,ULONG* pcbData)
+{
+ CURLMonikerImpl_THIS(iface,rotd);
+
+ FIXME("(%p)->() stub!\n",This);
+
+ return E_NOTIMPL;
+}
+
+
+
+static ICOM_VTABLE(IROTData) irotdata =
+{
+ ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
+ /* IUnknown fields */
+ IROTData_fnQueryInterface,
+ IROTData_fnAddRef,
+ IROTData_fnRelease,
+ /* IROTData fields */
+ IROTData_fnGetComparisonData,
+};
+
+
+
+static COMIMPL_IFEntry IFEntries[] =
+{
+ { &IID_IPersist, offsetof(CURLMonikerImpl,moniker)-offsetof(CURLMonikerImpl,vfunk) },
+ { &IID_IPersistStream, offsetof(CURLMonikerImpl,moniker)-offsetof(CURLMonikerImpl,vfunk) },
+ { &IID_IMoniker, offsetof(CURLMonikerImpl,moniker)-offsetof(CURLMonikerImpl,vfunk) },
+ { &IID_IROTData, offsetof(CURLMonikerImpl,rotd)-offsetof(CURLMonikerImpl,vfunk) },
+};
+
+static void CURLMonikerImpl_Destructor(IUnknown* iface)
+{
+ CURLMonikerImpl_THIS(iface,vfunk);
+
+ TRACE("(%p)\n",This);
+}
+
+static HRESULT CURLMonikerImpl_AllocObj(
+ void** ppobj,
+ IMoniker* pmonContext,
+ LPCWSTR lpwszURL )
+{
+ CURLMonikerImpl* This;
+
+ This = (CURLMonikerImpl*)COMIMPL_AllocObj( sizeof(CURLMonikerImpl) );
+ if ( This == NULL ) return E_OUTOFMEMORY;
+ COMIMPL_IUnkInit( &This->vfunk, NULL );
+ This->vfunk.pEntries = IFEntries;
+ This->vfunk.dwEntries = sizeof(IFEntries)/sizeof(IFEntries[0]);
+ This->vfunk.pOnFinalRelease = CURLMonikerImpl_Destructor;
+
+ ICOM_VTBL(&This->moniker) = &imoniker;
+ ICOM_VTBL(&This->rotd) = &irotdata;
+
+ *ppobj = (void*)(&This->vfunk);
+
+ return S_OK;
+}
+
+
+/***********************************************************************
+ *
+ * CreateURLMoniker (URLMON.@)
+ *
+ * S_OK success
+ * E_OUTOFMEMORY out of memory
+ * MK_E_SYNTAX not a valid url
+ *
+ */
+
+HRESULT WINAPI CreateURLMoniker(
+ IMoniker* pmonContext,
+ LPCWSTR lpwszURL,
+ IMoniker** ppmon )
+{
+ HRESULT hr;
+ IUnknown* punk = NULL;
+
+ FIXME("(%p,%s,%p)\n",pmonContext,debugstr_w(lpwszURL),ppmon);
+
+ if ( ppmon == NULL )
+ return E_POINTER;
+ *ppmon = NULL;
+
+ hr = CURLMonikerImpl_AllocObj( (void**)&punk, pmonContext, lpwszURL );
+ if ( FAILED(hr) )
+ return hr;
+
+ hr = IUnknown_QueryInterface( punk, &IID_IMoniker, (void**)ppmon );
+ IUnknown_Release( punk );
+
+ return hr;
+}
+
diff --git a/dlls/urlmon/umon.c b/dlls/urlmon/umon.c
index 3eb20fc..3f31b50 100644
--- a/dlls/urlmon/umon.c
+++ b/dlls/urlmon/umon.c
@@ -48,27 +48,6 @@
/***********************************************************************
- * CreateURLMoniker (URLMON.@)
- *
- * Create a url moniker
- *
- * RETURNS
- * S_OK success
- * E_OUTOFMEMORY out of memory
- * MK_E_SYNTAX not a valid url
- *
- */
-HRESULT WINAPI CreateURLMoniker(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk)
-{
- TRACE("\n");
-
- if (NULL != pmkContext)
- FIXME("Non-null pmkContext not implemented\n");
-
- return CreateFileMoniker(szURL, ppmk);
-}
-
-/***********************************************************************
* RegisterBindStatusCallback (URLMON.@)
*
* Register a bind status callback
@@ -146,7 +125,7 @@
*/
HRESULT WINAPI Extract(DWORD Param1, DWORD Param2)
{
- TRACE("%lx %lx\n", Param1, Param2);
+ FIXME("%lx %lx\n", Param1, Param2);
- return S_OK;
+ return E_NOTIMPL;
}
diff --git a/dlls/urlmon/urlmon.spec b/dlls/urlmon/urlmon.spec
index f40bb66..f05d06b 100644
--- a/dlls/urlmon/urlmon.spec
+++ b/dlls/urlmon/urlmon.spec
@@ -1,10 +1,12 @@
name urlmon
type win32
+init COMIMPL_DllMain
import ole32.dll
+import kernel32.dll
import ntdll.dll
-debug_channels (urlmon win32)
+debug_channels (comimpl urlmon)
1 stub CDLGetLongPathNameA
2 stub CDLGetLongPathNameW
@@ -26,60 +28,60 @@
@ stub CopyStgMedium
@ stub CreateAsyncBindCtx
@ stdcall CreateAsyncBindCtxEx(ptr long ptr ptr ptr long) CreateAsyncBindCtxEx
-@ stub CreateFormatEnumerator
+@ stdcall CreateFormatEnumerator(long ptr ptr) CreateFormatEnumerator
@ stdcall CreateURLMoniker(ptr str ptr) CreateURLMoniker
-@ stdcall DllCanUnloadNow() URLMON_DllCanUnloadNow
-@ stdcall DllGetClassObject(ptr ptr ptr) URLMON_DllGetClassObject
+@ stdcall DllCanUnloadNow() COMIMPL_DllCanUnloadNow
+@ stdcall DllGetClassObject(ptr ptr ptr) COMIMPL_DllGetClassObject
@ stdcall DllInstall(long ptr) URLMON_DllInstall
@ stdcall DllRegisterServer() URLMON_DllRegisterServer
@ stdcall DllRegisterServerEx() URLMON_DllRegisterServerEx
@ stdcall DllUnregisterServer() URLMON_DllUnregisterServer
@ stdcall Extract(long long) Extract
@ stub FaultInIEFeature
-@ stub FindMediaType
-@ stub FindMediaTypeClass
-@ stub FindMimeFromData
-@ stub GetClassFileOrMime
-@ stub GetClassURL
+@ stdcall FindMediaType(str ptr) FindMediaType
+@ stdcall FindMediaTypeClass(ptr str ptr long) FindMediaTypeClass
+@ stdcall FindMimeFromData(ptr wstr ptr long wstr long ptr long) FindMimeFromData
+@ stdcall GetClassFileOrMime(ptr wstr ptr long wstr long ptr) GetClassFileOrMime
+@ stdcall GetClassURL(wstr ptr) GetClassURL
@ stub GetComponentIDFromCLSSPEC
@ stub GetMarkOfTheWeb
-@ stub GetSoftwareUpdateInfo
-@ stub HlinkGoBack
-@ stub HlinkGoForward
-@ stub HlinkNavigateMoniker
-@ stub HlinkNavigateString
-@ stub HlinkSimpleNavigateToMoniker
-@ stub HlinkSimpleNavigateToString
-@ stub IsAsyncMoniker
-@ stub IsLoggingEnabledA
-@ stub IsLoggingEnabledW
-@ stub IsValidURL
-@ stub MkParseDisplayNameEx
+@ stdcall GetSoftwareUpdateInfo(wstr ptr) GetSoftwareUpdateInfo
+@ stdcall HlinkGoBack(ptr) HlinkGoBack
+@ stdcall HlinkGoForward(ptr) HlinkGoForward
+@ stdcall HlinkNavigateMoniker(ptr ptr) HlinkNavigateMoniker
+@ stdcall HlinkNavigateString(ptr wstr) HlinkNavigateString
+@ stdcall HlinkSimpleNavigateToMoniker(ptr wstr wstr ptr ptr ptr long long) HlinkSimpleNavigateToMoniker
+@ stdcall HlinkSimpleNavigateToString(wstr wstr wstr ptr ptr ptr long long) HlinkSimpleNavigateToString
+@ stdcall IsAsyncMoniker(ptr) IsAsyncMoniker
+@ stdcall IsLoggingEnabledA(str) IsLoggingEnabledA
+@ stdcall IsLoggingEnabledW(wstr) IsLoggingEnabledW
+@ stdcall IsValidURL(ptr wstr long) IsValidURL
+@ stdcall MkParseDisplayNameEx(ptr wstr ptr ptr) MkParseDisplayNameEx
@ stdcall ObtainUserAgentString(long str ptr) ObtainUserAgentString
@ stub PrivateCoInstall
@ stdcall RegisterBindStatusCallback(ptr ptr ptr long) RegisterBindStatusCallback
-@ stub RegisterFormatEnumerator
-@ stub RegisterMediaTypeClass
-@ stub RegisterMediaTypes
-@ stub ReleaseBindInfo
+@ stdcall RegisterFormatEnumerator(ptr ptr long) RegisterFormatEnumerator
+@ stdcall RegisterMediaTypeClass(ptr long ptr ptr long) RegisterMediaTypeClass
+@ stdcall RegisterMediaTypes(long ptr ptr) RegisterMediaTypes
+@ stdcall ReleaseBindInfo(ptr) ReleaseBindInfo
@ stdcall RevokeBindStatusCallback(ptr ptr) RevokeBindStatusCallback
-@ stub RevokeFormatEnumerator
-@ stub SetSoftwareUpdateAdvertisementState
+@ stdcall RevokeFormatEnumerator(ptr ptr) RevokeFormatEnumerator
+@ stdcall SetSoftwareUpdateAdvertisementState(wstr long long long) SetSoftwareUpdateAdvertisementState
@ stub URLDownloadA
-@ stub URLDownloadToCacheFileA
-@ stub URLDownloadToCacheFileW
-@ stub URLDownloadToFileA
-@ stub URLDownloadToFileW
+@ stdcall URLDownloadToCacheFileA(ptr str ptr long long ptr) URLDownloadToCacheFileA
+@ stdcall URLDownloadToCacheFileW(ptr wstr ptr long long ptr) URLDownloadToCacheFileW
+@ stdcall URLDownloadToFileA(ptr str str long ptr) URLDownloadToFileA
+@ stdcall URLDownloadToFileW(ptr wstr wstr long ptr) URLDownloadToFileW
@ stub URLDownloadW
-@ stub URLOpenBlockingStreamA
-@ stub URLOpenBlockingStreamW
-@ stub URLOpenPullStreamA
-@ stub URLOpenPullStreamW
-@ stub URLOpenStreamA
-@ stub URLOpenStreamW
+@ stdcall URLOpenBlockingStreamA(ptr str ptr long ptr) URLOpenBlockingStreamA
+@ stdcall URLOpenBlockingStreamW(ptr wstr ptr long ptr) URLOpenBlockingStreamW
+@ stdcall URLOpenPullStreamA(ptr str long ptr) URLOpenPullStreamA
+@ stdcall URLOpenPullStreamW(ptr wstr long ptr) URLOpenPullStreamW
+@ stdcall URLOpenStreamA(ptr str long ptr) URLOpenStreamA
+@ stdcall URLOpenStreamW(ptr wstr long ptr) URLOpenStreamW
@ stub UrlMkBuildVersion
-@ stub UrlMkGetSessionOption
+@ stdcall UrlMkGetSessionOption(long ptr long ptr long) UrlMkGetSessionOption
@ stdcall UrlMkSetSessionOption(long ptr long long) UrlMkSetSessionOption
-@ stub WriteHitLogging
+@ stdcall WriteHitLogging(ptr) WriteHitLogging
@ stub ZonesReInit
diff --git a/dlls/urlmon/urlmon_main.c b/dlls/urlmon/urlmon_main.c
index b58a229..543bdb7 100644
--- a/dlls/urlmon/urlmon_main.c
+++ b/dlls/urlmon/urlmon_main.c
@@ -21,10 +21,22 @@
#include "windef.h"
#include "winerror.h"
#include "wtypes.h"
+#include "ole2.h"
+#include "urlmon.h"
+
+#include "comimpl.h"
#include "wine/debug.h"
-WINE_DEFAULT_DEBUG_CHANNEL(win32);
+WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
+
+
+const COMIMPL_CLASSENTRY COMIMPL_ClassList[] =
+{
+ /* list of exported classes */
+ { NULL, NULL }
+};
+
/***********************************************************************
* DllInstall (URLMON.@)
@@ -38,28 +50,6 @@
}
/***********************************************************************
- * DllCanUnloadNow (URLMON.@)
- */
-HRESULT WINAPI URLMON_DllCanUnloadNow(void)
-{
- FIXME("(void): stub\n");
-
- return S_FALSE;
-}
-
-/***********************************************************************
- * DllGetClassObject (URLMON.@)
- */
-HRESULT WINAPI URLMON_DllGetClassObject(REFCLSID rclsid, REFIID riid,
- LPVOID *ppv)
-{
- FIXME("(%p, %p, %p): stub\n", debugstr_guid(rclsid),
- debugstr_guid(riid), ppv);
-
- return CLASS_E_CLASSNOTAVAILABLE;
-}
-
-/***********************************************************************
* DllRegisterServer (URLMON.@)
*/
HRESULT WINAPI URLMON_DllRegisterServer(void)
@@ -118,7 +108,7 @@
ERR("dwReserved: %ld, must be zero\n", dwReserved);
}
- return S_OK;
+ return E_NOTIMPL;
}
@@ -133,5 +123,260 @@
ERR("dwOption: %ld, must be zero\n", dwOption);
}
- return S_OK;
+ return E_NOTIMPL;
}
+
+/*****************************************************************************
+ * stubs
+ */
+
+typedef struct
+{
+ DWORD dwStructSize;
+ LPSTR lpszLoggedUrlName;
+ SYSTEMTIME StartTime;
+ SYSTEMTIME EndTime;
+ LPSTR lpszExtendedInfo;
+} HIT_LOGGING_INFO;
+
+
+typedef struct
+{
+ ULONG cbSize;
+ DWORD dwFlags;
+ DWORD dwAdState;
+ LPWSTR szTitle;
+ LPWSTR szAbstract;
+ LPWSTR szHREF;
+ DWORD dwInstalledVersionMS;
+ DWORD dwInstalledVersionLS;
+ DWORD dwUpdateVersionMS;
+ DWORD dwUpdateVersionLS;
+ DWORD dwAdvertisedVersionMS;
+ DWORD dwAdvertisedVersionLS;
+ DWORD dwReserved;
+} SOFTDISTINFO;
+
+
+HRESULT WINAPI CreateFormatEnumerator(UINT cFormatEtcs,FORMATETC* pFormatEtcs,IEnumFORMATETC** ppenum)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI FindMediaType(LPCSTR pszTypes,CLIPFORMAT* pcfTypes)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI FindMediaTypeClass(IBindCtx* pbc,LPCSTR pszType,CLSID* pclsid,DWORD dwReserved)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI FindMimeFromData(IBindCtx* pbc,LPCWSTR pwszURL,void* pbuf,DWORD cb,LPCWSTR pwszMimeProposed,DWORD dwMimeFlags,LPWSTR* ppwszMimeOut,DWORD dwReserved)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI GetClassFileOrMime(IBindCtx* pbc,LPCWSTR pwszFilename,void* pbuf,DWORD cb,LPCWSTR pwszMime,DWORD dwReserved,CLSID* pclsid)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI GetClassURL(LPCWSTR pwszURL,CLSID* pclsid)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI GetSoftwareUpdateInfo(LPCWSTR pwszDistUnit,SOFTDISTINFO* psdi)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI HlinkGoBack(IUnknown* punk)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI HlinkGoForward(IUnknown* punk)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI HlinkNavigateMoniker(IUnknown* punk,IMoniker* pmonTarget)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI HlinkNavigateString(IUnknown* punk,LPCWSTR szTarget)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI HlinkSimpleNavigateToMoniker(
+ IMoniker* pmonTarget,LPCWSTR pwszLocation,LPCWSTR pwszTargetFrame,
+ IUnknown* punk,IBindCtx* pbc,IBindStatusCallback* pbscb,
+ DWORD dwHLNF,DWORD dwReserved)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI HlinkSimpleNavigateToString(
+ LPCWSTR pwszTarget,LPCWSTR pwszLocation,LPCWSTR pwszTargetFrame,
+ IUnknown* punk,IBindCtx* pbc,IBindStatusCallback* pbscb,
+ DWORD dwHLNF,DWORD dwReserved)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI IsAsyncMoniker(IMoniker* pmon)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+BOOL WINAPI IsLoggingEnabledA(LPCSTR pszURL)
+{
+ FIXME("() stub\n");
+ return FALSE;
+}
+
+BOOL WINAPI IsLoggingEnabledW(LPCWSTR pwszURL)
+{
+ FIXME("() stub\n");
+ return FALSE;
+}
+
+HRESULT WINAPI IsValidURL(IBindCtx* pbc,LPCWSTR pwszURL,DWORD dwReserved)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI MkParseDisplayNameEx(IBindCtx* pbc,LPCWSTR pwszDisplayName,ULONG* pulCharEaten,IMoniker** ppmon)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI RegisterFormatEnumerator(IBindCtx* pbc,IEnumFORMATETC* penum,DWORD dwReserved)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI RegisterMediaTypeClass(IBindCtx* pbc,UINT cTypes,const LPCSTR* pszTypes,CLSID* pclsid,DWORD dwReserved)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI RegisterMediaTypes(UINT cTypes,const LPCSTR* pszTypes,CLIPFORMAT* pcfTypes)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+void WINAPI ReleaseBindInfo(BINDINFO* pbi)
+{
+ FIXME("() stub\n");
+}
+
+HRESULT WINAPI RevokeFormatEnumerator(IBindCtx* pbc,IEnumFORMATETC* penum)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI SetSoftwareUpdateAdvertisementState(LPCWSTR pwszDistUnit,DWORD dwAdvState,DWORD dwAdvVerMS,DWORD dwAdvVerLS)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI URLDownloadToCacheFileA(IUnknown* punk,LPCSTR pszURL,LPSTR pszNameBuf,DWORD dwNameBufLen,DWORD dwReserved,IBindStatusCallback* pbscb)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI URLDownloadToCacheFileW(IUnknown* punk,LPCWSTR pwszURL,LPWSTR pwszNameBuf,DWORD dwNameBufLen,DWORD dwReserved,IBindStatusCallback* pbscb)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI URLDownloadToFileA(IUnknown* punk,LPCSTR pszURL,LPCSTR pszFileName,DWORD dwReserved,IBindStatusCallback* pbscb)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI URLDownloadToFileW(IUnknown* punk,LPCWSTR pwszURL,LPCWSTR pwszFileName,DWORD dwReserved,IBindStatusCallback* pbscb)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI URLOpenBlockingStreamA(IUnknown* punk,LPCSTR pszURL,IStream** ppstream,DWORD dwReserved,IBindStatusCallback* pbscb)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI URLOpenBlockingStreamW(IUnknown* punk,LPCWSTR pwszURL,IStream** ppstream,DWORD dwReserved,IBindStatusCallback* pbscb)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI URLOpenPullStreamA(IUnknown* punk,LPCSTR pszURL,DWORD dwReserved,IBindStatusCallback* pbscb)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI URLOpenPullStreamW(IUnknown* punk,LPCWSTR pwszURL,DWORD dwReserved,IBindStatusCallback* pbscb)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI URLOpenStreamA(IUnknown* punk,LPCSTR pszURL,DWORD dwReserved,IBindStatusCallback* pbscb)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI URLOpenStreamW(IUnknown* punk,LPCWSTR pwszURL,DWORD dwReserved,IBindStatusCallback* pbscb)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI UrlMkGetSessionOption(DWORD dwOpt,void* pvBuf,DWORD dwBufLen,DWORD* pdwLen,DWORD dwReserved)
+{
+ FIXME("() stub\n");
+ return E_NOTIMPL;
+}
+
+BOOL WINAPI WriteHitLogging(HIT_LOGGING_INFO* pli)
+{
+ FIXME("() stub\n");
+ return FALSE;
+}
+
+