| /*************************************************************************************** |
| * BindCtx implementation |
| * |
| * Copyright 1999 Noomen Hamza |
| ***************************************************************************************/ |
| |
| #include <ctype.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <assert.h> |
| #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; |
| } |