/*************************************************************************************** * ItemMonikers implementation * * Copyright 1999 Noomen Hamza ***************************************************************************************/ #include #include #include #include #include "winerror.h" #include "wine/obj_base.h" #include "wine/obj_storage.h" #include "wine/obj_moniker.h" #include "debug.h" #include "heap.h" typedef struct ItemMonikerImpl{ ICOM_VTABLE(IMoniker)* lpvtbl; ULONG ref; } ItemMonikerImpl; HRESULT WINAPI ItemMonikerImpl_QueryInterface(ItemMonikerImpl* This,REFIID riid,void** ppvObject); ULONG WINAPI ItemMonikerImpl_AddRef(ItemMonikerImpl* This); ULONG WINAPI ItemMonikerImpl_Release(ItemMonikerImpl* This); HRESULT WINAPI ItemMonikerImpl_GetClassID(ItemMonikerImpl* This, CLSID *pClassID); HRESULT WINAPI ItemMonikerImpl_IsDirty(ItemMonikerImpl* This); HRESULT WINAPI ItemMonikerImpl_Load(ItemMonikerImpl* This,LPCOLESTR32 pszItemName,DWORD dwMode); HRESULT WINAPI ItemMonikerImpl_Save(ItemMonikerImpl* This,LPCOLESTR32 pszItemName,BOOL32 fRemember); HRESULT WINAPI ItemMonikerImpl_GetSizeMax(ItemMonikerImpl* This,LPOLESTR32 *ppszItemName); HRESULT WINAPI ItemMonikerImpl_Construct(ItemMonikerImpl* This, LPCOLESTR32 lpszDelim,LPCOLESTR32 lpszItem); HRESULT WINAPI ItemMonikerImpl_destroy(ItemMonikerImpl* This); HRESULT WINAPI ItemMonikerImpl_BindToObject(ItemMonikerImpl* This,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult); HRESULT WINAPI ItemMonikerImpl_BindToStorage(ItemMonikerImpl* This,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult); HRESULT WINAPI ItemMonikerImpl_Reduce(ItemMonikerImpl* This,IBindCtx* pbc, DWORD dwReduceHowFar,IMoniker** ppmkToLeft, IMoniker** ppmkReduced); HRESULT WINAPI ItemMonikerImpl_ComposeWith(ItemMonikerImpl* This,IMoniker* pmkRight,BOOL32 fOnlyIfNotGeneric, IMoniker** ppmkComposite); HRESULT WINAPI ItemMonikerImpl_Enum(ItemMonikerImpl* This,BOOL32 fForward, IEnumMoniker** ppenumMoniker); HRESULT WINAPI ItemMonikerImpl_IsEqual(ItemMonikerImpl* This,IMoniker* pmkOtherMoniker); HRESULT WINAPI ItemMonikerImpl_Hash(ItemMonikerImpl* This,DWORD* pdwHash); HRESULT WINAPI ItemMonikerImpl_IsRunning(ItemMonikerImpl* This,IBindCtx* pbc, IMoniker* pmkToLeft, IMoniker* pmkNewlyRunning); HRESULT WINAPI ItemMonikerImpl_GetTimeOfLastChange(ItemMonikerImpl* This, IBindCtx* pbc, IMoniker* pmkToLeft, FILETIME* pItemTime); HRESULT WINAPI ItemMonikerImpl_Inverse(ItemMonikerImpl* This,IMoniker** ppmk); HRESULT WINAPI ItemMonikerImpl_CommonPrefixWith(ItemMonikerImpl* This,IMoniker* pmkOther, IMoniker** ppmkPrefix); HRESULT WINAPI ItemMonikerImpl_RelativePathTo(ItemMonikerImpl* This,IMoniker* pmOther, IMoniker** ppmkRelPath); HRESULT WINAPI ItemMonikerImpl_GetDisplayName(ItemMonikerImpl* This,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR32 *ppszDisplayName); HRESULT WINAPI ItemMonikerImpl_ParseDisplayName(ItemMonikerImpl* This,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR32 pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut); HRESULT WINAPI ItemMonikerImpl_IsSystemMoniker(ItemMonikerImpl* This,DWORD* pwdMksys); HRESULT WINAPI CreateItemMoniker16(LPCOLESTR16 lpszDelim,LPCOLESTR32 lpszItem,LPMONIKER * ppmk); HRESULT WINAPI CreateItemMoniker32(LPCOLESTR32 lpszDelim,LPCOLESTR32 lpszItem,LPMONIKER * ppmk); #define VTABLE_FUNC(a) (void*)(a) // Virtual function table for the ItemMonikerImpl class. static ICOM_VTABLE(IMoniker) VT_ItemMonikerImpl = { { { { VTABLE_FUNC(ItemMonikerImpl_QueryInterface), VTABLE_FUNC(ItemMonikerImpl_AddRef), VTABLE_FUNC(ItemMonikerImpl_Release) }, VTABLE_FUNC(ItemMonikerImpl_GetClassID) }, VTABLE_FUNC(ItemMonikerImpl_IsDirty), VTABLE_FUNC(ItemMonikerImpl_Load), VTABLE_FUNC(ItemMonikerImpl_Save), VTABLE_FUNC(ItemMonikerImpl_GetSizeMax) }, VTABLE_FUNC(ItemMonikerImpl_BindToObject), VTABLE_FUNC(ItemMonikerImpl_BindToStorage), VTABLE_FUNC(ItemMonikerImpl_Reduce), VTABLE_FUNC(ItemMonikerImpl_ComposeWith), VTABLE_FUNC(ItemMonikerImpl_Enum), VTABLE_FUNC(ItemMonikerImpl_IsEqual), VTABLE_FUNC(ItemMonikerImpl_Hash), VTABLE_FUNC(ItemMonikerImpl_IsRunning), VTABLE_FUNC(ItemMonikerImpl_GetTimeOfLastChange), VTABLE_FUNC(ItemMonikerImpl_Inverse), VTABLE_FUNC(ItemMonikerImpl_CommonPrefixWith), VTABLE_FUNC(ItemMonikerImpl_RelativePathTo), VTABLE_FUNC(ItemMonikerImpl_GetDisplayName), VTABLE_FUNC(ItemMonikerImpl_ParseDisplayName), VTABLE_FUNC(ItemMonikerImpl_IsSystemMoniker) }; /******************************************************************************* * ItemMoniker_QueryInterface *******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_QueryInterface(ItemMonikerImpl* This,REFIID riid,void** ppvObject){ TRACE(ole,"(%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 (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) *ppvObject = (IMoniker*)This; else if (memcmp(&IID_IPersist, riid, sizeof(IID_IPersist)) == 0) *ppvObject = (IMoniker*)This; else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0) *ppvObject = (IMoniker*)This; else if (memcmp(&IID_IMoniker, riid, sizeof(IID_IMoniker)) == 0) *ppvObject = (IMoniker*)This; // Check that we obtained an interface. if ((*ppvObject)==0) return E_NOINTERFACE; // Query Interface always increases the reference count by one when it is successful ItemMonikerImpl_AddRef(This); return S_OK;; } /****************************************************************************** * ItemMoniker_AddRef ******************************************************************************/ ULONG WINAPI ItemMonikerImpl_AddRef(ItemMonikerImpl* This){ TRACE(ole,"(%p)\n",This); return ++(This->ref); } /****************************************************************************** * ItemMoniker_Release ******************************************************************************/ ULONG WINAPI ItemMonikerImpl_Release(ItemMonikerImpl* This){ TRACE(ole,"(%p),stub!\n",This); This->ref--; if (This->ref==0){ ItemMonikerImpl_destroy(This); return 0; } return This->ref;; } /****************************************************************************** * ItemMoniker_GetClassID ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_GetClassID(ItemMonikerImpl* This, CLSID *pClassID){//Pointer to CLSID of object FIXME(ole,"(%p),stub!\n",pClassID); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_IsDirty ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_IsDirty(ItemMonikerImpl* This) { FIXME(ole,"(%p),stub!\n",This); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_Load ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_Load( ItemMonikerImpl* This, LPCOLESTR32 pszFileName,//Pointer to absolute path of the file to open DWORD dwMode) //Specifies the access mode from the STGM enumeration { FIXME(ole,"(%p,%ld),stub!\n",pszFileName,dwMode); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_save ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_Save( ItemMonikerImpl* This, LPCOLESTR32 pszFileName, //Pointer to absolute path of the file where the object is saved BOOL32 fRemember) //Specifies whether the file is to be the current working file or not { FIXME(ole,"(%p,%d),stub!\n",pszFileName,fRemember); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_GetSizeMax ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_GetSizeMax( ItemMonikerImpl* This, LPOLESTR32 *ppszFileName) //Pointer to the path for the current file or the default save prompt { FIXME(ole,"(%p),stub!\n",ppszFileName); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_Constructor *******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_Construct(ItemMonikerImpl* This, LPCOLESTR32 lpszDelim,LPCOLESTR32 lpszItem){ FIXME(ole,"(%p,%p,%p),stub!\n",This,lpszDelim,lpszItem); memset(This, 0, sizeof(ItemMonikerImpl)); //Initialize the virtual fgunction table. This->lpvtbl = &VT_ItemMonikerImpl; return S_OK; } /****************************************************************************** * ItemMoniker_destructor *******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_destroy(ItemMonikerImpl* This){ FIXME(ole,"(%p),stub!\n",This); SEGPTR_FREE(This); return S_OK; } /****************************************************************************** * ItemMoniker_BindToObject ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_BindToObject(ItemMonikerImpl* This,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult){ FIXME(ole,"(%p,%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,riid,ppvResult); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_BindToStorage ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_BindToStorage(ItemMonikerImpl* This,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult){ FIXME(ole,"(%p,%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,riid,ppvResult); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_Reduce ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_Reduce(ItemMonikerImpl* This,IBindCtx* pbc, DWORD dwReduceHowFar, IMoniker** ppmkToLeft, IMoniker** ppmkReduced){ FIXME(ole,"(%p,%p,%ld,%p,%p),stub!\n",This,pbc,dwReduceHowFar,ppmkToLeft,ppmkReduced); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_ComposeWith ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_ComposeWith(ItemMonikerImpl* This,IMoniker* pmkRight,BOOL32 fOnlyIfNotGeneric, IMoniker** ppmkComposite){ FIXME(ole,"(%p,%p,%d,%p),stub!\n",This,pmkRight,fOnlyIfNotGeneric,ppmkComposite); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_Enum ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_Enum(ItemMonikerImpl* This,BOOL32 fForward, IEnumMoniker** ppenumMoniker){ FIXME(ole,"(%p,%d,%p),stub!\n",This,fForward,ppenumMoniker); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_IsEqual ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_IsEqual(ItemMonikerImpl* This,IMoniker* pmkOtherMoniker){ FIXME(ole,"(%p,%p),stub!\n",This,pmkOtherMoniker); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_Hash ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_Hash(ItemMonikerImpl* This,DWORD* pdwHash){ FIXME(ole,"(%p,%p),stub!\n",This,pdwHash); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_IsRunning ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_IsRunning(ItemMonikerImpl* This,IBindCtx* pbc, IMoniker* pmkToLeft, IMoniker* pmkNewlyRunning){ FIXME(ole,"(%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,pmkNewlyRunning); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_GetTimeOfLastChange ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_GetTimeOfLastChange(ItemMonikerImpl* This, IBindCtx* pbc, IMoniker* pmkToLeft, FILETIME* pFileTime){ FIXME(ole,"(%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,pFileTime); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_Inverse ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_Inverse(ItemMonikerImpl* This,IMoniker** ppmk){ FIXME(ole,"(%p,%p),stub!\n",This,ppmk); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_CommonPrefixWith ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_CommonPrefixWith(ItemMonikerImpl* This,IMoniker* pmkOther, IMoniker** ppmkPrefix){ FIXME(ole,"(%p,%p,%p),stub!\n",This,pmkOther,ppmkPrefix); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_RelativePathTo ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_RelativePathTo(ItemMonikerImpl* This,IMoniker* pmOther, IMoniker** ppmkRelPath){ FIXME(ole,"(%p,%p,%p),stub!\n",This,pmOther,ppmkRelPath); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_GetDisplayName ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_GetDisplayName(ItemMonikerImpl* This,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR32 *ppszDisplayName){ FIXME(ole,"(%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,ppszDisplayName); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_ParseDisplayName ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_ParseDisplayName(ItemMonikerImpl* This,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR32 pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut){ FIXME(ole,"(%p,%p,%p,%p,%p,%p),stub!\n",This,pbc,pmkToLeft,pszDisplayName,pchEaten,ppmkOut); return E_NOTIMPL; } /****************************************************************************** * ItemMoniker_IsSystemMonker ******************************************************************************/ HRESULT WINAPI ItemMonikerImpl_IsSystemMoniker(ItemMonikerImpl* This,DWORD* pwdMksys){ FIXME(ole,"(%p,%p),stub!\n",This,pwdMksys); return E_NOTIMPL; } /****************************************************************************** * CreateItemMoniker16 [OLE2.28] ******************************************************************************/ HRESULT WINAPI CreateItemMoniker16(LPCOLESTR16 lpszDelim,LPCOLESTR32 lpszItem,LPMONIKER* ppmk){// [in] pathname [out] new moniker object FIXME(ole,"(%s,%p),stub!\n",lpszDelim,ppmk); *ppmk = NULL; return E_NOTIMPL; } /****************************************************************************** * CreateItemMoniker32 [OLE32.55] ******************************************************************************/ HRESULT WINAPI CreateItemMoniker32(LPCOLESTR32 lpszDelim,LPCOLESTR32 lpszItem, LPMONIKER * ppmk) { ItemMonikerImpl* newItemMoniker = 0; HRESULT hr = S_OK; TRACE(ole,"(%p,%p,%p)\n",lpszDelim,lpszItem,ppmk); newItemMoniker = HeapAlloc(GetProcessHeap(), 0, sizeof(ItemMonikerImpl)); if (newItemMoniker == 0) return STG_E_INSUFFICIENTMEMORY; hr = ItemMonikerImpl_Construct(newItemMoniker,lpszDelim,lpszItem); if (FAILED(hr)) return hr; hr = ItemMonikerImpl_QueryInterface(newItemMoniker,&IID_IMoniker,(void**)ppmk); return hr; }