2005-07-31 12:11:56 +00:00
|
|
|
/*
|
|
|
|
* UrlMon
|
|
|
|
*
|
|
|
|
* Copyright 1999 Ulrich Czekalla for Corel Corporation
|
|
|
|
* Copyright 2002 Huw D M Davies for CodeWeavers
|
2006-01-06 20:42:46 +00:00
|
|
|
* Copyright 2005 Jacek Caban for CodeWeavers
|
2005-07-31 12:11:56 +00:00
|
|
|
*
|
|
|
|
* 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
|
2007-07-27 10:11:12 +00:00
|
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
2005-07-31 12:11:56 +00:00
|
|
|
*/
|
|
|
|
|
2008-01-14 16:39:00 +00:00
|
|
|
#include "urlmon_main.h"
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2018-03-23 11:35:23 +00:00
|
|
|
#include "winreg.h"
|
|
|
|
#include "shlwapi.h"
|
|
|
|
#include "hlink.h"
|
|
|
|
#include "shellapi.h"
|
|
|
|
|
|
|
|
#include "wine/debug.h"
|
|
|
|
|
|
|
|
WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
typedef struct {
|
2011-06-05 21:29:41 +00:00
|
|
|
IMoniker IMoniker_iface;
|
|
|
|
IUriContainer IUriContainer_iface;
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
LONG ref;
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
IUri *uri;
|
|
|
|
BSTR URLName;
|
2009-04-06 21:37:38 +00:00
|
|
|
} URLMoniker;
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2011-06-05 21:29:41 +00:00
|
|
|
static inline URLMoniker *impl_from_IMoniker(IMoniker *iface)
|
|
|
|
{
|
|
|
|
return CONTAINING_RECORD(iface, URLMoniker, IMoniker_iface);
|
|
|
|
}
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_QueryInterface(IMoniker *iface, REFIID riid, void **ppv)
|
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
if(!ppv)
|
2005-07-31 12:11:56 +00:00
|
|
|
return E_INVALIDARG;
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
if(IsEqualIID(&IID_IUnknown, riid)) {
|
|
|
|
TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
|
|
|
|
*ppv = iface;
|
|
|
|
}else if(IsEqualIID(&IID_IPersist, riid)) {
|
|
|
|
TRACE("(%p)->(IID_IPersist %p)\n", This, ppv);
|
|
|
|
*ppv = iface;
|
|
|
|
}else if(IsEqualIID(&IID_IPersistStream,riid)) {
|
|
|
|
TRACE("(%p)->(IID_IPersistStream %p)\n", This, ppv);
|
|
|
|
*ppv = iface;
|
|
|
|
}else if(IsEqualIID(&IID_IMoniker, riid)) {
|
|
|
|
TRACE("(%p)->(IID_IMoniker %p)\n", This, ppv);
|
|
|
|
*ppv = iface;
|
|
|
|
}else if(IsEqualIID(&IID_IAsyncMoniker, riid)) {
|
|
|
|
TRACE("(%p)->(IID_IAsyncMoniker %p)\n", This, ppv);
|
|
|
|
*ppv = iface;
|
2011-06-05 21:29:41 +00:00
|
|
|
}else if(IsEqualIID(&IID_IUriContainer, riid)) {
|
|
|
|
TRACE("(%p)->(IID_IUriContainer %p)\n", This, ppv);
|
|
|
|
*ppv = &This->IUriContainer_iface;
|
2009-04-06 21:37:38 +00:00
|
|
|
}else {
|
|
|
|
WARN("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppv);
|
|
|
|
*ppv = NULL;
|
2005-07-31 12:11:56 +00:00
|
|
|
return E_NOINTERFACE;
|
2009-04-06 21:37:38 +00:00
|
|
|
}
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
IUnknown_AddRef((IUnknown*)*ppv);
|
2005-07-31 12:11:56 +00:00
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static ULONG WINAPI URLMoniker_AddRef(IMoniker *iface)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
ULONG refCount = InterlockedIncrement(&This->ref);
|
|
|
|
|
2007-07-27 10:11:12 +00:00
|
|
|
TRACE("(%p) ref=%u\n",This, refCount);
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
return refCount;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static ULONG WINAPI URLMoniker_Release(IMoniker *iface)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
ULONG refCount = InterlockedDecrement(&This->ref);
|
|
|
|
|
2007-07-27 10:11:12 +00:00
|
|
|
TRACE("(%p) ref=%u\n",This, refCount);
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
if (!refCount) {
|
2013-03-22 14:29:11 +00:00
|
|
|
if(This->uri)
|
|
|
|
IUri_Release(This->uri);
|
|
|
|
SysFreeString(This->URLName);
|
2008-01-14 16:39:00 +00:00
|
|
|
heap_free(This);
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2005-08-12 18:17:37 +00:00
|
|
|
URLMON_UnlockModule();
|
|
|
|
}
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
return refCount;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_GetClassID(IMoniker *iface, CLSID *pClassID)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
TRACE("(%p,%p)\n", This, pClassID);
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
if(!pClassID)
|
2005-07-31 12:11:56 +00:00
|
|
|
return E_POINTER;
|
2009-04-06 21:37:38 +00:00
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
/* Windows always returns CLSID_StdURLMoniker */
|
|
|
|
*pClassID = CLSID_StdURLMoniker;
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_IsDirty(IMoniker *iface)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
TRACE("(%p)\n",This);
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
/* Note that the OLE-provided implementations of the IPersistStream::IsDirty
|
|
|
|
method in the OLE-provided moniker interfaces always return S_FALSE because
|
|
|
|
their internal state never changes. */
|
2005-07-31 12:11:56 +00:00
|
|
|
return S_FALSE;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_Load(IMoniker* iface,IStream* pStm)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2013-03-22 14:29:11 +00:00
|
|
|
WCHAR *new_uri_str;
|
|
|
|
IUri *new_uri;
|
|
|
|
BSTR new_url;
|
2007-07-27 10:11:12 +00:00
|
|
|
ULONG size;
|
2005-07-31 12:11:56 +00:00
|
|
|
ULONG got;
|
2013-03-22 14:29:11 +00:00
|
|
|
HRESULT hres;
|
2009-04-06 21:37:38 +00:00
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
TRACE("(%p,%p)\n",This,pStm);
|
|
|
|
|
|
|
|
if(!pStm)
|
|
|
|
return E_INVALIDARG;
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
/*
|
|
|
|
* NOTE
|
|
|
|
* Writes a ULONG containing length of unicode string, followed
|
|
|
|
* by that many unicode characters
|
|
|
|
*/
|
2013-03-22 14:29:11 +00:00
|
|
|
hres = IStream_Read(pStm, &size, sizeof(ULONG), &got);
|
|
|
|
if(FAILED(hres))
|
|
|
|
return hres;
|
|
|
|
if(got != sizeof(ULONG))
|
|
|
|
return E_FAIL;
|
|
|
|
|
|
|
|
new_uri_str = heap_alloc(size+sizeof(WCHAR));
|
|
|
|
if(!new_uri_str)
|
|
|
|
return E_OUTOFMEMORY;
|
|
|
|
|
|
|
|
hres = IStream_Read(pStm, new_uri_str, size, NULL);
|
|
|
|
new_uri_str[size/sizeof(WCHAR)] = 0;
|
|
|
|
if(SUCCEEDED(hres))
|
|
|
|
hres = CreateUri(new_uri_str, 0, 0, &new_uri);
|
|
|
|
heap_free(new_uri_str);
|
|
|
|
if(FAILED(hres))
|
|
|
|
return hres;
|
|
|
|
|
|
|
|
hres = IUri_GetDisplayUri(new_uri, &new_url);
|
|
|
|
if(FAILED(hres)) {
|
|
|
|
IUri_Release(new_uri);
|
|
|
|
return hres;
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
2009-04-06 21:37:38 +00:00
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
SysFreeString(This->URLName);
|
|
|
|
if(This->uri)
|
|
|
|
IUri_Release(This->uri);
|
|
|
|
|
|
|
|
This->uri = new_uri;
|
|
|
|
This->URLName = new_url;
|
|
|
|
return S_OK;
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_Save(IMoniker *iface, IStream* pStm, BOOL fClearDirty)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
HRESULT res;
|
2007-07-27 10:11:12 +00:00
|
|
|
ULONG size;
|
2009-04-06 21:37:38 +00:00
|
|
|
|
|
|
|
TRACE("(%p,%p,%d)\n", This, pStm, fClearDirty);
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
if(!pStm)
|
|
|
|
return E_INVALIDARG;
|
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
size = (SysStringLen(This->URLName) + 1)*sizeof(WCHAR);
|
2007-07-27 10:11:12 +00:00
|
|
|
res=IStream_Write(pStm,&size,sizeof(ULONG),NULL);
|
2005-07-31 12:11:56 +00:00
|
|
|
if(SUCCEEDED(res))
|
2007-07-27 10:11:12 +00:00
|
|
|
res=IStream_Write(pStm,This->URLName,size,NULL);
|
2009-04-06 21:37:38 +00:00
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
return res;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_GetSizeMax(IMoniker* iface, ULARGE_INTEGER *pcbSize)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
TRACE("(%p,%p)\n",This,pcbSize);
|
|
|
|
|
|
|
|
if(!pcbSize)
|
|
|
|
return E_INVALIDARG;
|
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
pcbSize->QuadPart = sizeof(ULONG) + ((SysStringLen(This->URLName)+1) * sizeof(WCHAR));
|
2005-07-31 12:11:56 +00:00
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_BindToObject(IMoniker *iface, IBindCtx* pbc, IMoniker *pmkToLeft,
|
|
|
|
REFIID riid, void **ppv)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2008-01-14 16:39:00 +00:00
|
|
|
IRunningObjectTable *obj_tbl;
|
|
|
|
HRESULT hres;
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
TRACE("(%p)->(%p,%p,%s,%p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppv);
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2008-01-14 16:39:00 +00:00
|
|
|
hres = IBindCtx_GetRunningObjectTable(pbc, &obj_tbl);
|
|
|
|
if(SUCCEEDED(hres)) {
|
2013-09-28 15:08:52 +00:00
|
|
|
hres = IRunningObjectTable_IsRunning(obj_tbl, &This->IMoniker_iface);
|
|
|
|
if(hres == S_OK) {
|
|
|
|
IUnknown *unk = NULL;
|
|
|
|
|
|
|
|
TRACE("Found in running object table\n");
|
|
|
|
|
|
|
|
hres = IRunningObjectTable_GetObject(obj_tbl, &This->IMoniker_iface, &unk);
|
|
|
|
if(SUCCEEDED(hres)) {
|
|
|
|
hres = IUnknown_QueryInterface(unk, riid, ppv);
|
|
|
|
IUnknown_Release(unk);
|
|
|
|
}
|
|
|
|
|
|
|
|
IRunningObjectTable_Release(obj_tbl);
|
|
|
|
return hres;
|
|
|
|
}
|
|
|
|
|
2008-01-14 16:39:00 +00:00
|
|
|
IRunningObjectTable_Release(obj_tbl);
|
|
|
|
}
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
if(!This->uri) {
|
|
|
|
*ppv = NULL;
|
|
|
|
return MK_E_SYNTAX;
|
|
|
|
}
|
2010-12-20 21:29:55 +00:00
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
return bind_to_object(&This->IMoniker_iface, This->uri, pbc, riid, ppv);
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_BindToStorage(IMoniker* iface, IBindCtx* pbc,
|
|
|
|
IMoniker* pmkToLeft, REFIID riid, void **ppvObject)
|
2005-11-20 14:51:28 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-11-20 14:51:28 +00:00
|
|
|
|
2009-03-07 08:34:55 +00:00
|
|
|
TRACE("(%p)->(%p %p %s %p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppvObject);
|
2005-11-20 14:51:28 +00:00
|
|
|
|
2011-06-05 21:29:41 +00:00
|
|
|
if(ppvObject) *ppvObject = NULL;
|
|
|
|
|
|
|
|
if(!pbc || !ppvObject) return E_INVALIDARG;
|
|
|
|
|
2007-11-29 11:20:31 +00:00
|
|
|
if(pmkToLeft)
|
|
|
|
FIXME("Unsupported pmkToLeft\n");
|
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
if(!This->uri)
|
|
|
|
return MK_E_SYNTAX;
|
2010-12-20 21:29:55 +00:00
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
return bind_to_storage(This->uri, pbc, riid, ppvObject);
|
2005-11-20 14:51:28 +00:00
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_Reduce(IMoniker *iface, IBindCtx *pbc,
|
|
|
|
DWORD dwReduceHowFar, IMoniker **ppmkToLeft, IMoniker **ppmkReduced)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
TRACE("(%p,%p,%d,%p,%p)\n", This, pbc, dwReduceHowFar, ppmkToLeft, ppmkReduced);
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
if(!ppmkReduced)
|
|
|
|
return E_INVALIDARG;
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
IMoniker_AddRef(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
*ppmkReduced = iface;
|
|
|
|
return MK_S_REDUCED_TO_SELF;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_ComposeWith(IMoniker *iface, IMoniker *pmkRight,
|
|
|
|
BOOL fOnlyIfNotGeneric, IMoniker **ppmkComposite)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
FIXME("(%p)->(%p,%d,%p): stub\n",This,pmkRight,fOnlyIfNotGeneric,ppmkComposite);
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_Enum(IMoniker *iface, BOOL fForward, IEnumMoniker **ppenumMoniker)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2009-04-06 21:37:38 +00:00
|
|
|
|
|
|
|
TRACE("(%p,%d,%p)\n", This, fForward, ppenumMoniker);
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
if(!ppenumMoniker)
|
|
|
|
return E_INVALIDARG;
|
|
|
|
|
|
|
|
/* Does not support sub-monikers */
|
|
|
|
*ppenumMoniker = NULL;
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_IsEqual(IMoniker *iface, IMoniker *pmkOtherMoniker)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
CLSID clsid;
|
|
|
|
LPOLESTR urlPath;
|
|
|
|
IBindCtx* bind;
|
|
|
|
HRESULT res;
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
TRACE("(%p,%p)\n",This, pmkOtherMoniker);
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
if(pmkOtherMoniker==NULL)
|
|
|
|
return E_INVALIDARG;
|
|
|
|
|
|
|
|
IMoniker_GetClassID(pmkOtherMoniker,&clsid);
|
|
|
|
|
|
|
|
if(!IsEqualCLSID(&clsid,&CLSID_StdURLMoniker))
|
|
|
|
return S_FALSE;
|
|
|
|
|
|
|
|
res = CreateBindCtx(0,&bind);
|
|
|
|
if(FAILED(res))
|
|
|
|
return res;
|
|
|
|
|
|
|
|
res = S_FALSE;
|
|
|
|
if(SUCCEEDED(IMoniker_GetDisplayName(pmkOtherMoniker,bind,NULL,&urlPath))) {
|
|
|
|
int result = lstrcmpiW(urlPath, This->URLName);
|
|
|
|
CoTaskMemFree(urlPath);
|
|
|
|
if(result == 0)
|
|
|
|
res = S_OK;
|
|
|
|
}
|
2013-03-22 14:29:11 +00:00
|
|
|
IBindCtx_Release(bind);
|
2005-07-31 12:11:56 +00:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_Hash(IMoniker *iface, DWORD *pdwHash)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
int h = 0,i,skip,len;
|
|
|
|
int off = 0;
|
|
|
|
LPOLESTR val;
|
|
|
|
|
|
|
|
TRACE("(%p,%p)\n",This,pdwHash);
|
|
|
|
|
|
|
|
if(!pdwHash)
|
|
|
|
return E_INVALIDARG;
|
|
|
|
|
|
|
|
val = This->URLName;
|
|
|
|
len = lstrlenW(val);
|
|
|
|
|
|
|
|
if(len < 16) {
|
|
|
|
for(i = len ; i > 0; i--) {
|
|
|
|
h = (h * 37) + val[off++];
|
|
|
|
}
|
2009-04-06 21:37:38 +00:00
|
|
|
}else {
|
2005-07-31 12:11:56 +00:00
|
|
|
/* only sample some characters */
|
|
|
|
skip = len / 8;
|
|
|
|
for(i = len; i > 0; i -= skip, off += skip) {
|
|
|
|
h = (h * 39) + val[off];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*pdwHash = h;
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_IsRunning(IMoniker* iface, IBindCtx* pbc,
|
|
|
|
IMoniker *pmkToLeft, IMoniker *pmkNewlyRunning)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
FIXME("(%p)->(%p,%p,%p): stub\n",This,pbc,pmkToLeft,pmkNewlyRunning);
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_GetTimeOfLastChange(IMoniker *iface,
|
|
|
|
IBindCtx *pbc, IMoniker *pmkToLeft, FILETIME *pFileTime)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2009-04-06 21:37:38 +00:00
|
|
|
FIXME("(%p)->(%p,%p,%p): stub\n", This, pbc, pmkToLeft, pFileTime);
|
2005-07-31 12:11:56 +00:00
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_Inverse(IMoniker *iface, IMoniker **ppmk)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
TRACE("(%p,%p)\n",This,ppmk);
|
|
|
|
return MK_E_NOINVERSE;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_CommonPrefixWith(IMoniker *iface, IMoniker *pmkOther, IMoniker **ppmkPrefix)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
FIXME("(%p)->(%p,%p): stub\n",This,pmkOther,ppmkPrefix);
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_RelativePathTo(IMoniker *iface, IMoniker *pmOther, IMoniker **ppmkRelPath)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
FIXME("(%p)->(%p,%p): stub\n",This,pmOther,ppmkRelPath);
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_GetDisplayName(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft,
|
|
|
|
LPOLESTR *ppszDisplayName)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
int len;
|
2007-11-29 11:20:31 +00:00
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
TRACE("(%p,%p,%p,%p)\n", This, pbc, pmkToLeft, ppszDisplayName);
|
2007-11-29 11:20:31 +00:00
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
if(!ppszDisplayName)
|
|
|
|
return E_INVALIDARG;
|
2009-04-06 21:37:38 +00:00
|
|
|
|
|
|
|
if(!This->URLName)
|
|
|
|
return E_OUTOFMEMORY;
|
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
/* FIXME: If this is a partial URL, try and get a URL moniker from SZ_URLCONTEXT in the bind context,
|
|
|
|
then look at pmkToLeft to try and complete the URL
|
|
|
|
*/
|
2013-03-22 14:29:11 +00:00
|
|
|
len = SysStringLen(This->URLName)+1;
|
2005-07-31 12:11:56 +00:00
|
|
|
*ppszDisplayName = CoTaskMemAlloc(len*sizeof(WCHAR));
|
|
|
|
if(!*ppszDisplayName)
|
|
|
|
return E_OUTOFMEMORY;
|
|
|
|
lstrcpyW(*ppszDisplayName, This->URLName);
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_ParseDisplayName(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft,
|
|
|
|
LPOLESTR pszDisplayName, ULONG *pchEaten, IMoniker **ppmkOut)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2005-07-31 12:11:56 +00:00
|
|
|
FIXME("(%p)->(%p,%p,%p,%p,%p): stub\n",This,pbc,pmkToLeft,pszDisplayName,pchEaten,ppmkOut);
|
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static HRESULT WINAPI URLMoniker_IsSystemMoniker(IMoniker *iface, DWORD *pwdMksys)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2011-06-05 21:29:41 +00:00
|
|
|
URLMoniker *This = impl_from_IMoniker(iface);
|
2009-04-06 21:37:38 +00:00
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
TRACE("(%p,%p)\n",This,pwdMksys);
|
|
|
|
|
|
|
|
if(!pwdMksys)
|
|
|
|
return E_INVALIDARG;
|
|
|
|
|
|
|
|
*pwdMksys = MKSYS_URLMONIKER;
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
static const IMonikerVtbl URLMonikerVtbl =
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2009-04-06 21:37:38 +00:00
|
|
|
URLMoniker_QueryInterface,
|
|
|
|
URLMoniker_AddRef,
|
|
|
|
URLMoniker_Release,
|
|
|
|
URLMoniker_GetClassID,
|
|
|
|
URLMoniker_IsDirty,
|
|
|
|
URLMoniker_Load,
|
|
|
|
URLMoniker_Save,
|
|
|
|
URLMoniker_GetSizeMax,
|
|
|
|
URLMoniker_BindToObject,
|
|
|
|
URLMoniker_BindToStorage,
|
|
|
|
URLMoniker_Reduce,
|
|
|
|
URLMoniker_ComposeWith,
|
|
|
|
URLMoniker_Enum,
|
|
|
|
URLMoniker_IsEqual,
|
|
|
|
URLMoniker_Hash,
|
|
|
|
URLMoniker_IsRunning,
|
|
|
|
URLMoniker_GetTimeOfLastChange,
|
|
|
|
URLMoniker_Inverse,
|
|
|
|
URLMoniker_CommonPrefixWith,
|
|
|
|
URLMoniker_RelativePathTo,
|
|
|
|
URLMoniker_GetDisplayName,
|
|
|
|
URLMoniker_ParseDisplayName,
|
|
|
|
URLMoniker_IsSystemMoniker
|
2005-07-31 12:11:56 +00:00
|
|
|
};
|
|
|
|
|
2011-06-05 21:29:41 +00:00
|
|
|
static inline URLMoniker *impl_from_IUriContainer(IUriContainer *iface)
|
|
|
|
{
|
|
|
|
return CONTAINING_RECORD(iface, URLMoniker, IUriContainer_iface);
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI UriContainer_QueryInterface(IUriContainer *iface, REFIID riid, void **ppv)
|
|
|
|
{
|
|
|
|
URLMoniker *This = impl_from_IUriContainer(iface);
|
|
|
|
return IMoniker_QueryInterface(&This->IMoniker_iface, riid, ppv);
|
|
|
|
}
|
|
|
|
|
|
|
|
static ULONG WINAPI UriContainer_AddRef(IUriContainer *iface)
|
|
|
|
{
|
|
|
|
URLMoniker *This = impl_from_IUriContainer(iface);
|
|
|
|
return IMoniker_AddRef(&This->IMoniker_iface);
|
|
|
|
}
|
|
|
|
|
|
|
|
static ULONG WINAPI UriContainer_Release(IUriContainer *iface)
|
|
|
|
{
|
|
|
|
URLMoniker *This = impl_from_IUriContainer(iface);
|
|
|
|
return IMoniker_Release(&This->IMoniker_iface);
|
|
|
|
}
|
|
|
|
|
|
|
|
static HRESULT WINAPI UriContainer_GetIUri(IUriContainer *iface, IUri **ppIUri)
|
|
|
|
{
|
|
|
|
URLMoniker *This = impl_from_IUriContainer(iface);
|
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
TRACE("(%p)->(%p)\n", This, ppIUri);
|
2011-06-05 21:29:41 +00:00
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
if(!This->uri) {
|
|
|
|
*ppIUri = NULL;
|
|
|
|
return S_FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
IUri_AddRef(This->uri);
|
|
|
|
*ppIUri = This->uri;
|
|
|
|
return S_OK;
|
2011-06-05 21:29:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static const IUriContainerVtbl UriContainerVtbl = {
|
|
|
|
UriContainer_QueryInterface,
|
|
|
|
UriContainer_AddRef,
|
|
|
|
UriContainer_Release,
|
|
|
|
UriContainer_GetIUri
|
|
|
|
};
|
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
static HRESULT create_moniker(IUri *uri, URLMoniker **ret)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2013-03-22 14:29:11 +00:00
|
|
|
URLMoniker *mon;
|
2005-07-31 12:11:56 +00:00
|
|
|
HRESULT hres;
|
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
mon = heap_alloc(sizeof(*mon));
|
|
|
|
if(!mon)
|
|
|
|
return E_OUTOFMEMORY;
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
mon->IMoniker_iface.lpVtbl = &URLMonikerVtbl;
|
|
|
|
mon->IUriContainer_iface.lpVtbl = &UriContainerVtbl;
|
|
|
|
mon->ref = 1;
|
2006-01-06 20:42:46 +00:00
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
if(uri) {
|
|
|
|
/* FIXME: try to avoid it */
|
|
|
|
hres = IUri_GetDisplayUri(uri, &mon->URLName);
|
|
|
|
if(FAILED(hres)) {
|
|
|
|
heap_free(mon);
|
|
|
|
return hres;
|
|
|
|
}
|
2006-01-06 20:42:46 +00:00
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
IUri_AddRef(uri);
|
|
|
|
mon->uri = uri;
|
|
|
|
}else {
|
|
|
|
mon->URLName = NULL;
|
|
|
|
mon->uri = NULL;
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
|
2005-08-12 18:17:37 +00:00
|
|
|
URLMON_LockModule();
|
2013-03-22 14:29:11 +00:00
|
|
|
*ret = mon;
|
2005-07-31 12:11:56 +00:00
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
HRESULT StdURLMoniker_Construct(IUnknown *outer, void **ppv)
|
|
|
|
{
|
2013-03-22 14:29:11 +00:00
|
|
|
URLMoniker *mon;
|
|
|
|
HRESULT hres;
|
|
|
|
|
2009-04-06 21:37:38 +00:00
|
|
|
TRACE("(%p %p)\n", outer, ppv);
|
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
hres = create_moniker(NULL, &mon);
|
|
|
|
if(FAILED(hres))
|
|
|
|
return hres;
|
|
|
|
|
|
|
|
*ppv = &mon->IMoniker_iface;
|
|
|
|
return S_OK;
|
2009-04-06 21:37:38 +00:00
|
|
|
}
|
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
static const DWORD create_flags_map[3] = {
|
|
|
|
Uri_CREATE_FILE_USE_DOS_PATH, /* URL_MK_LEGACY */
|
|
|
|
0, /* URL_MK_UNIFORM */
|
|
|
|
Uri_CREATE_NO_CANONICALIZE /* URL_MK_NO_CANONICALIZE */
|
|
|
|
};
|
|
|
|
|
|
|
|
static const DWORD combine_flags_map[3] = {
|
|
|
|
URL_FILE_USE_PATHURL, /* URL_MK_LEGACY */
|
|
|
|
0, /* URL_MK_UNIFORM */
|
|
|
|
URL_DONT_SIMPLIFY /* URL_MK_NO_CANONICALIZE */
|
|
|
|
};
|
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
/***********************************************************************
|
2007-07-27 10:11:12 +00:00
|
|
|
* CreateURLMonikerEx (URLMON.@)
|
2005-07-31 12:11:56 +00:00
|
|
|
*
|
|
|
|
* Create a url moniker.
|
|
|
|
*
|
|
|
|
* PARAMS
|
|
|
|
* pmkContext [I] Context
|
|
|
|
* szURL [I] Url to create the moniker for
|
|
|
|
* ppmk [O] Destination for created moniker.
|
2007-07-27 10:11:12 +00:00
|
|
|
* dwFlags [I] Flags.
|
2005-07-31 12:11:56 +00:00
|
|
|
*
|
|
|
|
* RETURNS
|
|
|
|
* Success: S_OK. ppmk contains the created IMoniker object.
|
|
|
|
* Failure: MK_E_SYNTAX if szURL is not a valid url, or
|
|
|
|
* E_OUTOFMEMORY if memory allocation fails.
|
|
|
|
*/
|
2007-07-27 10:11:12 +00:00
|
|
|
HRESULT WINAPI CreateURLMonikerEx(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk, DWORD dwFlags)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2013-03-22 14:29:11 +00:00
|
|
|
IUri *uri, *base_uri = NULL;
|
2009-04-06 21:37:38 +00:00
|
|
|
URLMoniker *obj;
|
2005-07-31 12:11:56 +00:00
|
|
|
HRESULT hres;
|
|
|
|
|
2007-07-27 10:11:12 +00:00
|
|
|
TRACE("(%p, %s, %p, %08x)\n", pmkContext, debugstr_w(szURL), ppmk, dwFlags);
|
|
|
|
|
2010-05-30 10:20:31 +00:00
|
|
|
if (ppmk)
|
|
|
|
*ppmk = NULL;
|
|
|
|
|
|
|
|
if (!szURL || !ppmk)
|
|
|
|
return E_INVALIDARG;
|
|
|
|
|
2019-02-04 12:04:30 +00:00
|
|
|
if(dwFlags >= ARRAY_SIZE(create_flags_map)) {
|
2013-03-22 14:29:11 +00:00
|
|
|
FIXME("Unsupported flags %x\n", dwFlags);
|
|
|
|
return E_INVALIDARG;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(pmkContext) {
|
|
|
|
IUriContainer *uri_container;
|
|
|
|
|
|
|
|
hres = IMoniker_QueryInterface(pmkContext, &IID_IUriContainer, (void**)&uri_container);
|
|
|
|
if(SUCCEEDED(hres)) {
|
|
|
|
hres = IUriContainer_GetIUri(uri_container, &base_uri);
|
|
|
|
IUriContainer_Release(uri_container);
|
|
|
|
if(FAILED(hres))
|
|
|
|
return hres;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(base_uri) {
|
|
|
|
hres = CoInternetCombineUrlEx(base_uri, szURL, combine_flags_map[dwFlags], &uri, 0);
|
|
|
|
IUri_Release(base_uri);
|
|
|
|
}else {
|
|
|
|
hres = CreateUri(szURL, Uri_CREATE_ALLOW_RELATIVE|Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME|create_flags_map[dwFlags], 0, &uri);
|
|
|
|
}
|
|
|
|
if(FAILED(hres))
|
|
|
|
return hres;
|
|
|
|
|
|
|
|
hres = create_moniker(uri, &obj);
|
|
|
|
IUri_Release(uri);
|
|
|
|
if(FAILED(hres))
|
|
|
|
return hres;
|
|
|
|
|
|
|
|
*ppmk = &obj->IMoniker_iface;
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* CreateURLMonikerEx2 (URLMON.@)
|
|
|
|
*/
|
|
|
|
HRESULT WINAPI CreateURLMonikerEx2(IMoniker *pmkContext, IUri *pUri, IMoniker **ppmk, DWORD dwFlags)
|
|
|
|
{
|
|
|
|
IUri *context_uri = NULL, *uri;
|
|
|
|
IUriContainer *uri_container;
|
|
|
|
URLMoniker *ret;
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
TRACE("(%p %p %p %x)\n", pmkContext, pUri, ppmk, dwFlags);
|
|
|
|
|
|
|
|
if (ppmk)
|
|
|
|
*ppmk = NULL;
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2013-03-22 14:29:11 +00:00
|
|
|
if (!pUri || !ppmk)
|
|
|
|
return E_INVALIDARG;
|
|
|
|
|
2019-02-04 12:04:30 +00:00
|
|
|
if(dwFlags >= ARRAY_SIZE(create_flags_map)) {
|
2013-03-22 14:29:11 +00:00
|
|
|
FIXME("Unsupported flags %x\n", dwFlags);
|
|
|
|
return E_INVALIDARG;
|
|
|
|
}
|
2005-07-31 12:11:56 +00:00
|
|
|
|
|
|
|
if(pmkContext) {
|
2013-03-22 14:29:11 +00:00
|
|
|
hres = IMoniker_QueryInterface(pmkContext, &IID_IUriContainer, (void**)&uri_container);
|
|
|
|
if(SUCCEEDED(hres)) {
|
|
|
|
hres = IUriContainer_GetIUri(uri_container, &context_uri);
|
|
|
|
if(FAILED(hres))
|
|
|
|
context_uri = NULL;
|
|
|
|
IUriContainer_Release(uri_container);
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
}
|
2013-03-22 14:29:11 +00:00
|
|
|
|
|
|
|
if(context_uri) {
|
|
|
|
hres = CoInternetCombineIUri(context_uri, pUri, combine_flags_map[dwFlags], &uri, 0);
|
|
|
|
IUri_Release(context_uri);
|
|
|
|
if(FAILED(hres))
|
|
|
|
return hres;
|
|
|
|
}else {
|
|
|
|
uri = pUri;
|
|
|
|
IUri_AddRef(uri);
|
|
|
|
}
|
|
|
|
|
|
|
|
hres = create_moniker(uri, &ret);
|
|
|
|
IUri_Release(uri);
|
|
|
|
if(FAILED(hres))
|
|
|
|
return hres;
|
|
|
|
|
|
|
|
*ppmk = &ret->IMoniker_iface;
|
|
|
|
return S_OK;
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
|
2007-07-27 10:11:12 +00:00
|
|
|
/**********************************************************************
|
|
|
|
* CreateURLMoniker (URLMON.@)
|
|
|
|
*
|
|
|
|
* Create a url moniker.
|
|
|
|
*
|
|
|
|
* PARAMS
|
|
|
|
* pmkContext [I] Context
|
|
|
|
* szURL [I] Url to create the moniker for
|
|
|
|
* ppmk [O] Destination for created moniker.
|
|
|
|
*
|
|
|
|
* RETURNS
|
|
|
|
* Success: S_OK. ppmk contains the created IMoniker object.
|
|
|
|
* Failure: MK_E_SYNTAX if szURL is not a valid url, or
|
|
|
|
* E_OUTOFMEMORY if memory allocation fails.
|
|
|
|
*/
|
|
|
|
HRESULT WINAPI CreateURLMoniker(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk)
|
|
|
|
{
|
|
|
|
return CreateURLMonikerEx(pmkContext, szURL, ppmk, URL_MK_LEGACY);
|
|
|
|
}
|
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
/***********************************************************************
|
|
|
|
* IsAsyncMoniker (URLMON.@)
|
|
|
|
*/
|
|
|
|
HRESULT WINAPI IsAsyncMoniker(IMoniker *pmk)
|
|
|
|
{
|
|
|
|
IUnknown *am;
|
2007-11-29 11:20:31 +00:00
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
TRACE("(%p)\n", pmk);
|
|
|
|
if(!pmk)
|
|
|
|
return E_INVALIDARG;
|
|
|
|
if(SUCCEEDED(IMoniker_QueryInterface(pmk, &IID_IAsyncMoniker, (void**)&am))) {
|
|
|
|
IUnknown_Release(am);
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
return S_FALSE;
|
|
|
|
}
|
|
|
|
|
2006-01-06 20:42:46 +00:00
|
|
|
/***********************************************************************
|
|
|
|
* BindAsyncMoniker (URLMON.@)
|
|
|
|
*
|
|
|
|
* Bind a bind status callback to an asynchronous URL Moniker.
|
|
|
|
*
|
|
|
|
* PARAMS
|
|
|
|
* pmk [I] Moniker object to bind status callback to
|
|
|
|
* grfOpt [I] Options, seems not used
|
|
|
|
* pbsc [I] Status callback to bind
|
|
|
|
* iidResult [I] Interface to return
|
|
|
|
* ppvResult [O] Resulting asynchronous moniker object
|
|
|
|
*
|
|
|
|
* RETURNS
|
|
|
|
* Success: S_OK.
|
|
|
|
* Failure: E_INVALIDARG, if any argument is invalid, or
|
|
|
|
* E_OUTOFMEMORY if memory allocation fails.
|
|
|
|
*/
|
|
|
|
HRESULT WINAPI BindAsyncMoniker(IMoniker *pmk, DWORD grfOpt, IBindStatusCallback *pbsc, REFIID iidResult, LPVOID *ppvResult)
|
|
|
|
{
|
|
|
|
LPBC pbc = NULL;
|
|
|
|
HRESULT hr = E_INVALIDARG;
|
|
|
|
|
2008-01-14 16:39:00 +00:00
|
|
|
TRACE("(%p %08x %p %s %p)\n", pmk, grfOpt, pbsc, debugstr_guid(iidResult), ppvResult);
|
|
|
|
|
2006-01-06 20:42:46 +00:00
|
|
|
if (pmk && ppvResult)
|
|
|
|
{
|
|
|
|
*ppvResult = NULL;
|
|
|
|
|
|
|
|
hr = CreateAsyncBindCtx(0, pbsc, NULL, &pbc);
|
|
|
|
if (hr == NOERROR)
|
|
|
|
{
|
|
|
|
hr = IMoniker_BindToObject(pmk, pbc, NULL, iidResult, ppvResult);
|
|
|
|
IBindCtx_Release(pbc);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return hr;
|
|
|
|
}
|
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
/***********************************************************************
|
2008-04-04 14:41:46 +00:00
|
|
|
* MkParseDisplayNameEx (URLMON.@)
|
2005-07-31 12:11:56 +00:00
|
|
|
*/
|
2008-04-04 14:41:46 +00:00
|
|
|
HRESULT WINAPI MkParseDisplayNameEx(IBindCtx *pbc, LPCWSTR szDisplayName, ULONG *pchEaten, LPMONIKER *ppmk)
|
2005-07-31 12:11:56 +00:00
|
|
|
{
|
2008-04-04 14:41:46 +00:00
|
|
|
TRACE("(%p %s %p %p)\n", pbc, debugstr_w(szDisplayName), pchEaten, ppmk);
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2010-05-30 10:20:31 +00:00
|
|
|
if (!pbc || !szDisplayName || !*szDisplayName || !pchEaten || !ppmk)
|
|
|
|
return E_INVALIDARG;
|
|
|
|
|
2008-04-04 14:41:46 +00:00
|
|
|
if(is_registered_protocol(szDisplayName)) {
|
|
|
|
HRESULT hres;
|
2005-07-31 12:11:56 +00:00
|
|
|
|
2008-04-04 14:41:46 +00:00
|
|
|
hres = CreateURLMoniker(NULL, szDisplayName, ppmk);
|
|
|
|
if(SUCCEEDED(hres)) {
|
2019-12-01 18:39:31 +00:00
|
|
|
*pchEaten = lstrlenW(szDisplayName);
|
2008-04-04 14:41:46 +00:00
|
|
|
return hres;
|
|
|
|
}
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
|
2008-04-04 14:41:46 +00:00
|
|
|
return MkParseDisplayName(pbc, szDisplayName, pchEaten, ppmk);
|
2005-07-31 12:11:56 +00:00
|
|
|
}
|
|
|
|
|
2008-04-04 14:41:46 +00:00
|
|
|
|
2005-11-20 14:51:28 +00:00
|
|
|
/***********************************************************************
|
|
|
|
* URLDownloadToCacheFileA (URLMON.@)
|
|
|
|
*/
|
|
|
|
HRESULT WINAPI URLDownloadToCacheFileA(LPUNKNOWN lpUnkCaller, LPCSTR szURL, LPSTR szFileName,
|
|
|
|
DWORD dwBufLength, DWORD dwReserved, LPBINDSTATUSCALLBACK pBSC)
|
|
|
|
{
|
|
|
|
LPWSTR url = NULL, file_name = NULL;
|
|
|
|
int len;
|
|
|
|
HRESULT hres;
|
|
|
|
|
2007-07-27 10:11:12 +00:00
|
|
|
TRACE("(%p %s %p %d %d %p)\n", lpUnkCaller, debugstr_a(szURL), szFileName,
|
2005-11-20 14:51:28 +00:00
|
|
|
dwBufLength, dwReserved, pBSC);
|
|
|
|
|
|
|
|
if(szURL) {
|
|
|
|
len = MultiByteToWideChar(CP_ACP, 0, szURL, -1, NULL, 0);
|
2008-01-14 16:39:00 +00:00
|
|
|
url = heap_alloc(len*sizeof(WCHAR));
|
2009-02-05 07:01:34 +00:00
|
|
|
MultiByteToWideChar(CP_ACP, 0, szURL, -1, url, len);
|
2005-11-20 14:51:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(szFileName)
|
2008-01-14 16:39:00 +00:00
|
|
|
file_name = heap_alloc(dwBufLength*sizeof(WCHAR));
|
2005-11-20 14:51:28 +00:00
|
|
|
|
|
|
|
hres = URLDownloadToCacheFileW(lpUnkCaller, url, file_name, dwBufLength*sizeof(WCHAR),
|
|
|
|
dwReserved, pBSC);
|
|
|
|
|
|
|
|
if(SUCCEEDED(hres) && file_name)
|
|
|
|
WideCharToMultiByte(CP_ACP, 0, file_name, -1, szFileName, dwBufLength, NULL, NULL);
|
|
|
|
|
2008-01-14 16:39:00 +00:00
|
|
|
heap_free(url);
|
|
|
|
heap_free(file_name);
|
2005-11-20 14:51:28 +00:00
|
|
|
|
|
|
|
return hres;
|
|
|
|
}
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* URLDownloadToCacheFileW (URLMON.@)
|
|
|
|
*/
|
|
|
|
HRESULT WINAPI URLDownloadToCacheFileW(LPUNKNOWN lpUnkCaller, LPCWSTR szURL, LPWSTR szFileName,
|
|
|
|
DWORD dwBufLength, DWORD dwReserved, LPBINDSTATUSCALLBACK pBSC)
|
|
|
|
{
|
2007-07-27 10:11:12 +00:00
|
|
|
WCHAR cache_path[MAX_PATH + 1];
|
|
|
|
FILETIME expire, modified;
|
|
|
|
HRESULT hr;
|
|
|
|
LPWSTR ext;
|
|
|
|
|
|
|
|
static WCHAR header[] = {
|
|
|
|
'H','T','T','P','/','1','.','0',' ','2','0','0',' ',
|
|
|
|
'O','K','\\','r','\\','n','\\','r','\\','n',0
|
|
|
|
};
|
|
|
|
|
|
|
|
TRACE("(%p, %s, %p, %d, %d, %p)\n", lpUnkCaller, debugstr_w(szURL),
|
|
|
|
szFileName, dwBufLength, dwReserved, pBSC);
|
|
|
|
|
|
|
|
if (!szURL || !szFileName)
|
|
|
|
return E_INVALIDARG;
|
|
|
|
|
|
|
|
ext = PathFindExtensionW(szURL);
|
|
|
|
|
|
|
|
if (!CreateUrlCacheEntryW(szURL, 0, ext, cache_path, 0))
|
|
|
|
return E_FAIL;
|
|
|
|
|
|
|
|
hr = URLDownloadToFileW(lpUnkCaller, szURL, cache_path, 0, pBSC);
|
|
|
|
if (FAILED(hr))
|
|
|
|
return hr;
|
|
|
|
|
|
|
|
expire.dwHighDateTime = 0;
|
|
|
|
expire.dwLowDateTime = 0;
|
|
|
|
modified.dwHighDateTime = 0;
|
|
|
|
modified.dwLowDateTime = 0;
|
|
|
|
|
|
|
|
if (!CommitUrlCacheEntryW(szURL, cache_path, expire, modified, NORMAL_CACHE_ENTRY,
|
|
|
|
header, sizeof(header), NULL, NULL))
|
|
|
|
return E_FAIL;
|
|
|
|
|
2019-12-01 18:39:31 +00:00
|
|
|
if (lstrlenW(cache_path) > dwBufLength)
|
2007-07-27 10:11:12 +00:00
|
|
|
return E_OUTOFMEMORY;
|
|
|
|
|
|
|
|
lstrcpyW(szFileName, cache_path);
|
|
|
|
|
|
|
|
return S_OK;
|
2005-11-20 14:51:28 +00:00
|
|
|
}
|
|
|
|
|
2009-02-01 13:46:44 +00:00
|
|
|
/***********************************************************************
|
|
|
|
* HlinkSimpleNavigateToMoniker (URLMON.@)
|
|
|
|
*/
|
|
|
|
HRESULT WINAPI HlinkSimpleNavigateToMoniker(IMoniker *pmkTarget,
|
|
|
|
LPCWSTR szLocation, LPCWSTR szTargetFrameName, IUnknown *pUnk,
|
|
|
|
IBindCtx *pbc, IBindStatusCallback *pbsc, DWORD grfHLNF, DWORD dwReserved)
|
|
|
|
{
|
Finish the Wine sync. These components are not just rc file changes
atl, comctl32, comdlg32, dwmapi, fusion, gdiplus, jscript, mpr, mshtml, msi, msimtf, msxml3, ole32, oleaut32, riched20, shdocvw, shlwapi, urlmon, usp10, version and windowscodecs
Seems to build and boot. /me hides
svn path=/trunk/; revision=48273
2010-07-26 02:26:04 +00:00
|
|
|
LPWSTR target;
|
|
|
|
HRESULT hres;
|
|
|
|
|
|
|
|
TRACE("\n");
|
|
|
|
|
|
|
|
hres = IMoniker_GetDisplayName(pmkTarget, pbc, 0, &target);
|
|
|
|
if(hres == S_OK)
|
|
|
|
hres = HlinkSimpleNavigateToString( target, szLocation, szTargetFrameName,
|
|
|
|
pUnk, pbc, pbsc, grfHLNF, dwReserved );
|
|
|
|
CoTaskMemFree(target);
|
|
|
|
|
|
|
|
return hres;
|
2009-02-01 13:46:44 +00:00
|
|
|
}
|
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
/***********************************************************************
|
|
|
|
* HlinkSimpleNavigateToString (URLMON.@)
|
|
|
|
*/
|
|
|
|
HRESULT WINAPI HlinkSimpleNavigateToString( LPCWSTR szTarget,
|
|
|
|
LPCWSTR szLocation, LPCWSTR szTargetFrameName, IUnknown *pUnk,
|
|
|
|
IBindCtx *pbc, IBindStatusCallback *pbsc, DWORD grfHLNF, DWORD dwReserved)
|
|
|
|
{
|
Sync devenum, atl, comctl32, comdlg32, cryptdlg, cryptui, hhctrl, itss, jscript, mapi32, msacm32, mshtml, msi, msimtf, oleacc, pstorec, shdoclc, shdocvw, shlwapi, snmpapi, urlmon, usp10, uxtheme, windowscodecs, wldap32, wtsapi32, wuapi, xinput1_3
svn path=/trunk/; revision=47961
2010-07-06 23:29:26 +00:00
|
|
|
FIXME("%s %s %s %p %p %p %u %u partial stub\n", debugstr_w( szTarget ), debugstr_w( szLocation ),
|
|
|
|
debugstr_w( szTargetFrameName ), pUnk, pbc, pbsc, grfHLNF, dwReserved);
|
|
|
|
|
|
|
|
/* undocumented: 0 means HLNF_OPENINNEWWINDOW*/
|
|
|
|
if (!grfHLNF) grfHLNF = HLNF_OPENINNEWWINDOW;
|
|
|
|
|
|
|
|
if (grfHLNF == HLNF_OPENINNEWWINDOW)
|
|
|
|
{
|
|
|
|
SHELLEXECUTEINFOW sei;
|
|
|
|
static const WCHAR openW[] = { 'o', 'p', 'e', 'n', 0 };
|
|
|
|
|
|
|
|
memset(&sei, 0, sizeof(sei));
|
|
|
|
sei.cbSize = sizeof(sei);
|
|
|
|
sei.lpVerb = openW;
|
|
|
|
sei.nShow = SW_SHOWNORMAL;
|
|
|
|
sei.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NO_CONSOLE;
|
|
|
|
sei.lpFile = szTarget;
|
|
|
|
|
|
|
|
if (ShellExecuteExW(&sei)) return S_OK;
|
|
|
|
}
|
|
|
|
|
2005-07-31 12:11:56 +00:00
|
|
|
return E_NOTIMPL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* HlinkNavigateString (URLMON.@)
|
|
|
|
*/
|
|
|
|
HRESULT WINAPI HlinkNavigateString( IUnknown *pUnk, LPCWSTR szTarget )
|
|
|
|
{
|
|
|
|
TRACE("%p %s\n", pUnk, debugstr_w( szTarget ) );
|
2007-11-29 11:20:31 +00:00
|
|
|
return HlinkSimpleNavigateToString(
|
2005-07-31 12:11:56 +00:00
|
|
|
szTarget, NULL, NULL, pUnk, NULL, NULL, 0, 0 );
|
|
|
|
}
|
2005-08-05 20:48:26 +00:00
|
|
|
|
|
|
|
/***********************************************************************
|
|
|
|
* GetSoftwareUpdateInfo (URLMON.@)
|
|
|
|
*/
|
|
|
|
HRESULT WINAPI GetSoftwareUpdateInfo( LPCWSTR szDistUnit, LPSOFTDISTINFO psdi )
|
|
|
|
{
|
|
|
|
FIXME("%s %p\n", debugstr_w(szDistUnit), psdi );
|
|
|
|
return E_FAIL;
|
|
|
|
}
|