447 lines
9.8 KiB
C
447 lines
9.8 KiB
C
/*
|
|
* 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;
|
|
}
|
|
|