/*************************************************************************************** * BindCtx 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 BindCtxImpl{ ICOM_VTABLE(IBindCtx)* lpvtbl; ULONG ref; } BindCtxImpl; HRESULT WINAPI BindCtxImpl_QueryInterface(BindCtxImpl* This,REFIID riid,void** ppvObject); ULONG WINAPI BindCtxImpl_AddRef(BindCtxImpl* This); ULONG WINAPI BindCtxImpl_Release(BindCtxImpl* This); HRESULT WINAPI BindCtxImpl_Construct(BindCtxImpl* This); HRESULT WINAPI BindCtxImpl_destroy(BindCtxImpl* This); HRESULT WINAPI BindCtxImpl_RegisterObjectBound(BindCtxImpl* This,IUnknown* punk); HRESULT WINAPI BindCtxImpl_RevokeObjectBound(BindCtxImpl* This, IUnknown* punk); HRESULT WINAPI BindCtxImpl_ReleaseObjects(BindCtxImpl* This); HRESULT WINAPI BindCtxImpl_SetBindOptions(BindCtxImpl* This,LPBIND_OPTS2 pbindopts); HRESULT WINAPI BindCtxImpl_GetBindOptions(BindCtxImpl* This,LPBIND_OPTS2 pbindopts); HRESULT WINAPI BindCtxImpl_GetRunningObjectTable(BindCtxImpl* This,IRunningObjectTable** pprot); HRESULT WINAPI BindCtxImpl_RegisterObjectParam(BindCtxImpl* This,LPOLESTR32 pszkey, IUnknown* punk); HRESULT WINAPI BindCtxImpl_GetObjectParam(BindCtxImpl* This,LPOLESTR32 pszkey, IUnknown* punk); HRESULT WINAPI BindCtxImpl_EnumObjectParam(BindCtxImpl* This,IEnumString** ppenum); HRESULT WINAPI BindCtxImpl_RevokeObjectParam(BindCtxImpl* This,LPOLESTR32 pszkey); HRESULT WINAPI CreateBindCtx16(DWORD reserved, LPBC * ppbc); HRESULT WINAPI CreateBindCtx32(DWORD reserved, LPBC * ppbc); #define VTABLE_FUNC(a) (void*)(a) // Virtual function table for the BindCtx class. static ICOM_VTABLE(IBindCtx) VT_BindCtxImpl = { { VTABLE_FUNC(BindCtxImpl_QueryInterface), VTABLE_FUNC(BindCtxImpl_AddRef), VTABLE_FUNC(BindCtxImpl_Release) }, VTABLE_FUNC(BindCtxImpl_RegisterObjectBound), VTABLE_FUNC(BindCtxImpl_RevokeObjectBound), VTABLE_FUNC(BindCtxImpl_ReleaseObjects), VTABLE_FUNC(BindCtxImpl_SetBindOptions), VTABLE_FUNC(BindCtxImpl_GetBindOptions), VTABLE_FUNC(BindCtxImpl_GetRunningObjectTable), VTABLE_FUNC(BindCtxImpl_RegisterObjectParam), VTABLE_FUNC(BindCtxImpl_GetObjectParam), VTABLE_FUNC(BindCtxImpl_EnumObjectParam), VTABLE_FUNC(BindCtxImpl_RevokeObjectParam) }; /******************************************************************************* * BindCtx_QueryInterface *******************************************************************************/ HRESULT WINAPI BindCtxImpl_QueryInterface(BindCtxImpl* 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 = (IBindCtx*)This; else if (memcmp(&IID_IBindCtx, riid, sizeof(IID_IBindCtx)) == 0) *ppvObject = (IBindCtx*)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 BindCtxImpl_AddRef(This); return S_OK; } /****************************************************************************** * BindCtx_ _AddRef ******************************************************************************/ ULONG WINAPI BindCtxImpl_AddRef(BindCtxImpl* This){ TRACE(ole,"(%p)\n",This); return ++(This->ref); } /****************************************************************************** * BindCtx_Release ******************************************************************************/ ULONG WINAPI BindCtxImpl_Release(BindCtxImpl* This){ TRACE(ole,"(%p)\n",This); This->ref--; if (This->ref==0){ BindCtxImpl_destroy(This); return 0; } return This->ref;; } /****************************************************************************** * BindCtx_Constructor *******************************************************************************/ HRESULT WINAPI BindCtxImpl_Construct(BindCtxImpl* This){ FIXME(ole,"(%p),stub!\n",This); memset(This, 0, sizeof(BindCtxImpl)); //Initialize the virtual fgunction table. This->lpvtbl = &VT_BindCtxImpl; return E_NOTIMPL; } /****************************************************************************** * BindCtx_destructor *******************************************************************************/ HRESULT WINAPI BindCtxImpl_destroy(BindCtxImpl* This){ FIXME(ole,"(%p),stub!\n",This); SEGPTR_FREE(This); return S_OK; } /****************************************************************************** * BindCtx_RegisterObjectBound ******************************************************************************/ HRESULT WINAPI BindCtxImpl_RegisterObjectBound(BindCtxImpl* This,IUnknown* punk){ FIXME(ole,"(%p,%p),stub!\n",This,punk); return E_NOTIMPL; } /****************************************************************************** * BindCtx_RevokeObjectBound ******************************************************************************/ HRESULT WINAPI BindCtxImpl_RevokeObjectBound(BindCtxImpl* This, IUnknown* punk){ FIXME(ole,"(%p,%p),stub!\n",This,punk); return E_NOTIMPL; } /****************************************************************************** * BindCtx_ReleaseObjects ******************************************************************************/ HRESULT WINAPI BindCtxImpl_ReleaseObjects(BindCtxImpl* This){ FIXME(ole,"(%p),stub!\n",This); return E_NOTIMPL; } /****************************************************************************** * BindCtx_SetBindOptions ******************************************************************************/ HRESULT WINAPI BindCtxImpl_SetBindOptions(BindCtxImpl* This,LPBIND_OPTS2 pbindopts){ FIXME(ole,"(%p,%p),stub!\n",This,pbindopts); return E_NOTIMPL; } /****************************************************************************** * BindCtx_GetBindOptions ******************************************************************************/ HRESULT WINAPI BindCtxImpl_GetBindOptions(BindCtxImpl* This,LPBIND_OPTS2 pbindopts){ FIXME(ole,"(%p,%p),stub!\n",This,pbindopts); return E_NOTIMPL; } /****************************************************************************** * BindCtx_GetRunningObjectTable ******************************************************************************/ HRESULT WINAPI BindCtxImpl_GetRunningObjectTable(BindCtxImpl* This,IRunningObjectTable** pprot){ FIXME(ole,"(%p,%p),stub!\n",This,pprot); return E_NOTIMPL; } /****************************************************************************** * BindCtx_RegisterObjectParam ******************************************************************************/ HRESULT WINAPI BindCtxImpl_RegisterObjectParam(BindCtxImpl* This,LPOLESTR32 pszkey, IUnknown* punk){ FIXME(ole,"(%p,%p,%p),stub!\n",This,pszkey,punk); return E_NOTIMPL; } /****************************************************************************** * BindCtx_GetObjectParam ******************************************************************************/ HRESULT WINAPI BindCtxImpl_GetObjectParam(BindCtxImpl* This,LPOLESTR32 pszkey, IUnknown* punk){ FIXME(ole,"(%p,%p,%p),stub!\n",This,pszkey,punk); return E_NOTIMPL; } /****************************************************************************** * BindCtx_EnumObjectParam ******************************************************************************/ HRESULT WINAPI BindCtxImpl_EnumObjectParam(BindCtxImpl* This,IEnumString** ppenum){ FIXME(ole,"(%p,%p),stub!\n",This,ppenum); return E_NOTIMPL; } /****************************************************************************** * BindCtx_RevokeObjectParam ******************************************************************************/ HRESULT WINAPI BindCtxImpl_RevokeObjectParam(BindCtxImpl* This,LPOLESTR32 pszkey){ FIXME(ole,"(%p,%p),stub!\n",This,pszkey); return E_NOTIMPL; } /****************************************************************************** * CreateBindCtx16 ******************************************************************************/ HRESULT WINAPI CreateBindCtx16(DWORD reserved, LPBC * ppbc){ FIXME(ole,"(%ld,%p),stub!\n",reserved,ppbc); return E_NOTIMPL; } /****************************************************************************** * CreateBindCtx32 ******************************************************************************/ HRESULT WINAPI CreateBindCtx32(DWORD reserved, LPBC * ppbc){ BindCtxImpl* newBindCtx = 0; HRESULT hr = S_OK; TRACE(ole,"(%ld,%p)\n",reserved,ppbc); newBindCtx = HeapAlloc(GetProcessHeap(), 0, sizeof(BindCtxImpl)); if (newBindCtx == 0) return STG_E_INSUFFICIENTMEMORY; hr = BindCtxImpl_Construct(newBindCtx); if (FAILED(hr)) return hr; hr = BindCtxImpl_QueryInterface(newBindCtx,&IID_IBindCtx,(void**)ppbc); return hr; }