static HRESULT WINAPI DEVENUM_IMediaCatMoniker_BindToStorage(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft, REFIID riid, void **ppvObj) { MediaCatMoniker *This = impl_from_IMoniker(iface); TRACE("(%p)->(%p, %p, %s, %p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppvObj); *ppvObj = NULL; if (pmkToLeft) return MK_E_NOSTORAGE; if (pbc != NULL) { static DWORD reported; if (!reported) { FIXME("ignoring IBindCtx %p\n", pbc); reported++; } } if (IsEqualGUID(riid, &IID_IPropertyBag)) { HANDLE hkey; DuplicateHandle(GetCurrentProcess(), This->hkey, GetCurrentProcess(), &hkey, 0, 0, DUPLICATE_SAME_ACCESS); return DEVENUM_IPropertyBag_Construct(hkey, (IPropertyBag**)ppvObj); } return MK_E_NOSTORAGE; }
static HRESULT WINAPI URLMoniker_ParseDisplayName(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft, LPOLESTR pszDisplayName, ULONG *pchEaten, IMoniker **ppmkOut) { URLMoniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p,%p,%p,%p,%p): stub\n",This,pbc,pmkToLeft,pszDisplayName,pchEaten,ppmkOut); return E_NOTIMPL; }
/****************************************************************************** * ClassMoniker_BindToObject ******************************************************************************/ static HRESULT WINAPI ClassMoniker_BindToObject(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult) { ClassMoniker *This = impl_from_IMoniker(iface); BIND_OPTS2 bindopts; IClassActivator *pActivator; HRESULT hr; TRACE("(%p,%p,%p,%p)\n", pbc, pmkToLeft, riid, ppvResult); bindopts.cbStruct = sizeof(bindopts); IBindCtx_GetBindOptions(pbc, (BIND_OPTS *)&bindopts); if (!pmkToLeft) return CoGetClassObject(&This->clsid, bindopts.dwClassContext, NULL, riid, ppvResult); else { hr = IMoniker_BindToObject(pmkToLeft, pbc, NULL, &IID_IClassActivator, (void **)&pActivator); if (FAILED(hr)) return hr; hr = IClassActivator_GetClassObject(pActivator, &This->clsid, bindopts.dwClassContext, bindopts.locale, riid, ppvResult); IClassActivator_Release(pActivator); return hr; } }
static HRESULT WINAPI URLMoniker_IsEqual(IMoniker *iface, IMoniker *pmkOtherMoniker) { URLMoniker *This = impl_from_IMoniker(iface); CLSID clsid; LPOLESTR urlPath; IBindCtx* bind; HRESULT res; TRACE("(%p,%p)\n",This, pmkOtherMoniker); 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; } IBindCtx_Release(bind); return res; }
static HRESULT WINAPI URLMoniker_IsRunning(IMoniker* iface, IBindCtx* pbc, IMoniker *pmkToLeft, IMoniker *pmkNewlyRunning) { URLMoniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p,%p,%p): stub\n",This,pbc,pmkToLeft,pmkNewlyRunning); return E_NOTIMPL; }
static HRESULT WINAPI XMLView_Moniker_RelativePathTo(IMoniker *iface, IMoniker *pmkOther, IMoniker **ppmkRelPath) { Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p %p)\n", This, pmkOther, ppmkRelPath); return E_NOTIMPL; }
static HRESULT WINAPI XMLView_Moniker_IsSystemMoniker( IMoniker *iface, DWORD *pdwMksys) { Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p)\n", This, pdwMksys); return E_NOTIMPL; }
/****************************************************************************** * PointerMoniker_ParseDisplayName ******************************************************************************/ static HRESULT WINAPI PointerMonikerImpl_ParseDisplayName(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut) { PointerMonikerImpl *This = impl_from_IMoniker(iface); HRESULT hr; IParseDisplayName *pPDN; TRACE("(%p,%p,%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pszDisplayName,pchEaten,ppmkOut); if (pmkToLeft) return MK_E_SYNTAX; if (!This->pObject) return E_UNEXPECTED; hr = IUnknown_QueryInterface(This->pObject, &IID_IParseDisplayName, (void **)&pPDN); if (FAILED(hr)) return hr; hr = IParseDisplayName_ParseDisplayName(pPDN, pbc, pszDisplayName, pchEaten, ppmkOut); IParseDisplayName_Release(pPDN); return hr; }
/****************************************************************************** * FileMoniker_GetDisplayName */ static HRESULT WINAPI FileMonikerImpl_GetDisplayName(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR *ppszDisplayName) { FileMonikerImpl *This = impl_from_IMoniker(iface); int len=lstrlenW(This->filePathName); TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,ppszDisplayName); if (ppszDisplayName==NULL) return E_POINTER; if (pmkToLeft!=NULL) return E_INVALIDARG; *ppszDisplayName=CoTaskMemAlloc(sizeof(WCHAR)*(len+1)); if (*ppszDisplayName==NULL) return E_OUTOFMEMORY; strcpyW(*ppszDisplayName,This->filePathName); TRACE("-- %s\n", debugstr_w(*ppszDisplayName)); return S_OK; }
/****************************************************************************** * ItemMoniker_GetDisplayName ******************************************************************************/ static HRESULT WINAPI ItemMonikerImpl_GetDisplayName(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR *ppszDisplayName) { ItemMonikerImpl *This = impl_from_IMoniker(iface); TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,ppszDisplayName); if (ppszDisplayName==NULL) return E_POINTER; if (pmkToLeft!=NULL){ return E_INVALIDARG; } *ppszDisplayName=CoTaskMemAlloc(sizeof(WCHAR)*(lstrlenW(This->itemDelimiter)+lstrlenW(This->itemName)+1)); if (*ppszDisplayName==NULL) return E_OUTOFMEMORY; lstrcpyW(*ppszDisplayName,This->itemDelimiter); lstrcatW(*ppszDisplayName,This->itemName); TRACE("-- %s\n", debugstr_w(*ppszDisplayName)); return S_OK; }
static HRESULT WINAPI PointerMonikerImpl_QueryInterface(IMoniker* iface,REFIID riid,void** ppvObject) { PointerMonikerImpl *This = impl_from_IMoniker(iface); TRACE("(%p,%p,%p)\n",This,riid,ppvObject); /* Perform a sanity check on the parameters.*/ if ( (This==0) || (ppvObject==0) ) return E_INVALIDARG; /* Initialize the return parameter */ *ppvObject = 0; /* Compare the riid with the interface IDs implemented by this object.*/ if (IsEqualIID(&IID_IUnknown, riid) || IsEqualIID(&IID_IPersist, riid) || IsEqualIID(&IID_IPersistStream, riid) || IsEqualIID(&IID_IMoniker, riid)) *ppvObject = iface; /* Check that we obtained an interface.*/ if ((*ppvObject)==0) return E_NOINTERFACE; /* always increase the reference count by one when it is successful */ IMoniker_AddRef(iface); return S_OK; }
/******************************************************************************* * ItemMoniker_QueryInterface *******************************************************************************/ static HRESULT WINAPI ItemMonikerImpl_QueryInterface(IMoniker* iface,REFIID riid,void** ppvObject) { ItemMonikerImpl *This = impl_from_IMoniker(iface); TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppvObject); if (!ppvObject) return E_INVALIDARG; /* Compare the riid with the interface IDs implemented by this object.*/ if (IsEqualIID(&IID_IUnknown, riid) || IsEqualIID(&IID_IPersist, riid) || IsEqualIID(&IID_IPersistStream, riid) || IsEqualIID(&IID_IMoniker, riid)) *ppvObject = iface; else if (IsEqualIID(&IID_IROTData, riid)) *ppvObject = &This->IROTData_iface; else if (IsEqualIID(&IID_IMarshal, riid)) { HRESULT hr = S_OK; if (!This->pMarshal) hr = MonikerMarshal_Create(iface, &This->pMarshal); if (hr != S_OK) return hr; return IUnknown_QueryInterface(This->pMarshal, riid, ppvObject); } else { *ppvObject = NULL; return E_NOINTERFACE; } IMoniker_AddRef(iface); return S_OK; }
/****************************************************************************** * ItemMoniker_BindToStorage ******************************************************************************/ static HRESULT WINAPI ItemMonikerImpl_BindToStorage(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult) { ItemMonikerImpl *This = impl_from_IMoniker(iface); HRESULT res; IOleItemContainer *poic=0; TRACE("(%p,%p,%p,%s,%p)\n",iface,pbc,pmkToLeft,debugstr_guid(riid),ppvResult); *ppvResult=0; if(pmkToLeft==NULL) return E_INVALIDARG; res=IMoniker_BindToObject(pmkToLeft,pbc,NULL,&IID_IOleItemContainer,(void**)&poic); if (SUCCEEDED(res)){ res=IOleItemContainer_GetObjectStorage(poic,This->itemName,pbc,riid,ppvResult); IOleItemContainer_Release(poic); } return res; }
/****************************************************************************** * ItemMoniker_Save ******************************************************************************/ static HRESULT WINAPI ItemMonikerImpl_Save(IMoniker* iface, IStream* pStm, BOOL fClearDirty) { ItemMonikerImpl *This = impl_from_IMoniker(iface); HRESULT res; CHAR *itemNameA,*itemDelimiterA; /* data written by this function are : 1) DWORD : size of item delimiter string ('\0' included ) */ /* 2) String (type A): item delimiter string ('\0' included) */ /* 3) DWORD : size of item name string ('\0' included) */ /* 4) String (type A): item name string ('\0' included) */ DWORD nameLength = WideCharToMultiByte( CP_ACP, 0, This->itemName, -1, NULL, 0, NULL, NULL); DWORD delimiterLength = WideCharToMultiByte( CP_ACP, 0, This->itemDelimiter, -1, NULL, 0, NULL, NULL); itemNameA=HeapAlloc(GetProcessHeap(),0,nameLength); itemDelimiterA=HeapAlloc(GetProcessHeap(),0,delimiterLength); WideCharToMultiByte( CP_ACP, 0, This->itemName, -1, itemNameA, nameLength, NULL, NULL); WideCharToMultiByte( CP_ACP, 0, This->itemDelimiter, -1, itemDelimiterA, delimiterLength, NULL, NULL); TRACE("%p, %s\n", pStm, fClearDirty ? "TRUE" : "FALSE"); res=IStream_Write(pStm,&delimiterLength,sizeof(DWORD),NULL); res=IStream_Write(pStm,itemDelimiterA,delimiterLength * sizeof(CHAR),NULL); res=IStream_Write(pStm,&nameLength,sizeof(DWORD),NULL); res=IStream_Write(pStm,itemNameA,nameLength * sizeof(CHAR),NULL); HeapFree(GetProcessHeap(), 0, itemNameA); HeapFree(GetProcessHeap(), 0, itemDelimiterA); return res; }
static HRESULT WINAPI XMLView_Moniker_IsEqual(IMoniker *iface, IMoniker *pmkOtherMoniker) { Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p)\n", This, pmkOtherMoniker); return E_NOTIMPL; }
/****************************************************************************** * FileMoniker_IsEqual */ static HRESULT WINAPI FileMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker) { FileMonikerImpl *This = impl_from_IMoniker(iface); CLSID clsid; LPOLESTR filePath; IBindCtx* bind; HRESULT res; TRACE("(%p,%p)\n",iface,pmkOtherMoniker); if (pmkOtherMoniker==NULL) return S_FALSE; IMoniker_GetClassID(pmkOtherMoniker,&clsid); if (!IsEqualCLSID(&clsid,&CLSID_FileMoniker)) return S_FALSE; res = CreateBindCtx(0,&bind); if (FAILED(res)) return res; res = S_FALSE; if (SUCCEEDED(IMoniker_GetDisplayName(pmkOtherMoniker,bind,NULL,&filePath))) { if (!lstrcmpiW(filePath, This->filePathName)) res = S_OK; CoTaskMemFree(filePath); } IBindCtx_Release(bind); return res; }
static HRESULT WINAPI XMLView_Moniker_CommonPrefixWith(IMoniker *iface, IMoniker *pmkOther, IMoniker **ppmkPrefix) { Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p %p)\n", This, pmkOther, ppmkPrefix); return E_NOTIMPL; }
/****************************************************************************** * FileMoniker_Hash */ static HRESULT WINAPI FileMonikerImpl_Hash(IMoniker* iface,DWORD* pdwHash) { FileMonikerImpl *This = impl_from_IMoniker(iface); int h = 0,i,skip,len; int off = 0; LPOLESTR val; if (pdwHash==NULL) return E_POINTER; val = This->filePathName; len = lstrlenW(val); if (len < 16) { for (i = len ; i > 0; i--) { h = (h * 37) + val[off++]; } } else { /* 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; }
static HRESULT WINAPI XMLView_Moniker_GetDisplayName(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft, LPOLESTR *ppszDisplayName) { Moniker *This = impl_from_IMoniker(iface); TRACE("(%p)->(%p %p %p)\n", This, pbc, pmkToLeft, ppszDisplayName); return IMoniker_GetDisplayName(This->mon, pbc, pmkToLeft, ppszDisplayName); }
/****************************************************************************** * FileMoniker_GetTimeOfLastChange ******************************************************************************/ static HRESULT WINAPI FileMonikerImpl_GetTimeOfLastChange(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, FILETIME* pFileTime) { FileMonikerImpl *This = impl_from_IMoniker(iface); IRunningObjectTable* rot; HRESULT res; WIN32_FILE_ATTRIBUTE_DATA info; TRACE("(%p,%p,%p,%p)\n",iface,pbc,pmkToLeft,pFileTime); if (pFileTime==NULL) return E_POINTER; if (pmkToLeft!=NULL) return E_INVALIDARG; res=IBindCtx_GetRunningObjectTable(pbc,&rot); if (FAILED(res)) return res; res= IRunningObjectTable_GetTimeOfLastChange(rot,iface,pFileTime); if (FAILED(res)){ /* the moniker is not registered */ if (!GetFileAttributesExW(This->filePathName,GetFileExInfoStandard,&info)) return MK_E_NOOBJECT; *pFileTime=info.ftLastWriteTime; } return S_OK; }
static HRESULT WINAPI URLMoniker_ComposeWith(IMoniker *iface, IMoniker *pmkRight, BOOL fOnlyIfNotGeneric, IMoniker **ppmkComposite) { URLMoniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p,%d,%p): stub\n",This,pmkRight,fOnlyIfNotGeneric,ppmkComposite); return E_NOTIMPL; }
static HRESULT WINAPI XMLView_Moniker_Save(IMoniker *iface, IStream *pStm, BOOL fClearDirty) { Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p %x)\n", This, pStm, fClearDirty); return E_NOTIMPL; }
static HRESULT WINAPI URLMoniker_Hash(IMoniker *iface, DWORD *pdwHash) { URLMoniker *This = impl_from_IMoniker(iface); 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++]; } }else { /* 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; }
static HRESULT WINAPI XMLView_Moniker_GetSizeMax( IMoniker *iface, ULARGE_INTEGER *pcbSize) { Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p)\n", This, pcbSize); return E_NOTIMPL; }
static HRESULT WINAPI URLMoniker_GetTimeOfLastChange(IMoniker *iface, IBindCtx *pbc, IMoniker *pmkToLeft, FILETIME *pFileTime) { URLMoniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p,%p,%p): stub\n", This, pbc, pmkToLeft, pFileTime); return E_NOTIMPL; }
static HRESULT WINAPI XMLView_Moniker_Reduce(IMoniker *iface, IBindCtx *pbc, DWORD dwReduceHowFar, IMoniker **ppmkToLeft, IMoniker **ppmkReduced) { Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%p %d %p %p)\n", This, pbc, dwReduceHowFar, ppmkToLeft, ppmkReduced); return E_NOTIMPL; }
static HRESULT WINAPI URLMoniker_QueryInterface(IMoniker *iface, REFIID riid, void **ppv) { URLMoniker *This = impl_from_IMoniker(iface); if(!ppv) return E_INVALIDARG; 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; }else if(IsEqualIID(&IID_IUriContainer, riid)) { TRACE("(%p)->(IID_IUriContainer %p)\n", This, ppv); *ppv = &This->IUriContainer_iface; }else { WARN("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppv); *ppv = NULL; return E_NOINTERFACE; } IUnknown_AddRef((IUnknown*)*ppv); return S_OK; }
static HRESULT WINAPI XMLView_Moniker_Enum(IMoniker *iface, BOOL fForward, IEnumMoniker **ppenumMoniker) { Moniker *This = impl_from_IMoniker(iface); FIXME("(%p)->(%x %p)\n", This, fForward, ppenumMoniker); return E_NOTIMPL; }
/****************************************************************************** * ClassMoniker_GetDisplayName ******************************************************************************/ static HRESULT WINAPI ClassMoniker_GetDisplayName(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR *ppszDisplayName) { ClassMoniker *This = impl_from_IMoniker(iface); static const WCHAR wszClsidPrefix[] = {'c','l','s','i','d',':',0}; TRACE("(%p, %p, %p)\n", pbc, pmkToLeft, ppszDisplayName); if (!ppszDisplayName) return E_POINTER; if (pmkToLeft) return E_INVALIDARG; *ppszDisplayName = CoTaskMemAlloc(sizeof(wszClsidPrefix) + (CHARS_IN_GUID-2) * sizeof(WCHAR)); StringFromGUID2(&This->clsid, *ppszDisplayName+sizeof(wszClsidPrefix)/sizeof(WCHAR)-2, CHARS_IN_GUID); /* note: this overwrites the opening curly bracket of the CLSID string generated above */ memcpy(*ppszDisplayName, wszClsidPrefix, sizeof(wszClsidPrefix)-sizeof(WCHAR)); /* note: this overwrites the closing curly bracket of the CLSID string generated above */ (*ppszDisplayName)[sizeof(wszClsidPrefix)/sizeof(WCHAR)-2+CHARS_IN_GUID-2] = ':'; (*ppszDisplayName)[sizeof(wszClsidPrefix)/sizeof(WCHAR)-2+CHARS_IN_GUID-1] = '\0'; TRACE("string is %s\n", debugstr_w(*ppszDisplayName)); return S_OK; }
static ULONG WINAPI ITS_IMonikerImpl_AddRef( IMoniker* iface) { ITS_IMonikerImpl *This = impl_from_IMoniker(iface); TRACE("%p\n", This); return InterlockedIncrement(&This->ref); }