/*************************************************************************************** * BindCtx implementation * * Copyright 1999 Noomen Hamza ***************************************************************************************/ #include #include #include #include #include "winerror.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(IBindCtx* iface,REFIID riid,void** ppvObject); ULONG WINAPI BindCtxImpl_AddRef(IBindCtx* iface); ULONG WINAPI BindCtxImpl_Release(IBindCtx* iface); HRESULT WINAPI BindCtxImpl_RegisterObjectBound(IBindCtx* iface,IUnknown* punk); HRESULT WINAPI BindCtxImpl_RevokeObjectBound(IBindCtx* iface, IUnknown* punk); HRESULT WINAPI BindCtxImpl_ReleaseObjects(IBindCtx* iface); HRESULT WINAPI BindCtxImpl_SetBindOptions(IBindCtx* iface,LPBIND_OPTS2 pbindopts); HRESULT WINAPI BindCtxImpl_GetBindOptions(IBindCtx* iface,LPBIND_OPTS2 pbindopts); HRESULT WINAPI BindCtxImpl_GetRunningObjectTable(IBindCtx* iface,IRunningObjectTable** pprot); HRESULT WINAPI BindCtxImpl_RegisterObjectParam(IBindCtx* iface,LPOLESTR pszkey, IUnknown* punk); HRESULT WINAPI BindCtxImpl_GetObjectParam(IBindCtx* iface,LPOLESTR pszkey, IUnknown* punk); HRESULT WINAPI BindCtxImpl_EnumObjectParam(IBindCtx* iface,IEnumString** ppenum); HRESULT WINAPI BindCtxImpl_RevokeObjectParam(IBindCtx* iface,LPOLESTR pszkey); HRESULT WINAPI CreateBindCtx16(DWORD reserved, LPBC * ppbc); HRESULT WINAPI CreateBindCtx(DWORD reserved, LPBC * ppbc); HRESULT WINAPI BindCtxImpl_Construct(BindCtxImpl* This); HRESULT WINAPI BindCtxImpl_Destroy(BindCtxImpl* This); // Virtual function table for the BindCtx class. static ICOM_VTABLE(IBindCtx) VT_BindCtxImpl = { BindCtxImpl_QueryInterface, BindCtxImpl_AddRef, BindCtxImpl_Release, BindCtxImpl_RegisterObjectBound, BindCtxImpl_RevokeObjectBound, BindCtxImpl_ReleaseObjects, BindCtxImpl_SetBindOptions, BindCtxImpl_GetBindOptions, BindCtxImpl_GetRunningObjectTable, BindCtxImpl_RegisterObjectParam, BindCtxImpl_GetObjectParam, BindCtxImpl_EnumObjectParam, BindCtxImpl_RevokeObjectParam }; /******************************************************************************* * BindCtx_QueryInterface *******************************************************************************/ HRESULT WINAPI BindCtxImpl_QueryInterface(IBindCtx* iface,REFIID riid,void** ppvObject) { ICOM_THIS(BindCtxImpl,iface); 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(iface); return S_OK; } /****************************************************************************** * BindCtx_ _AddRef ******************************************************************************/ ULONG WINAPI BindCtxImpl_AddRef(IBindCtx* iface) { ICOM_THIS(BindCtxImpl,iface); TRACE(ole,"(%p)\n",This); return ++(This->ref); } /****************************************************************************** * BindCtx_Release ******************************************************************************/ ULONG WINAPI BindCtxImpl_Release(IBindCtx* iface) { ICOM_THIS(BindCtxImpl,iface); TRACE(ole,"(%p)\n",This); This->ref--; if (This->ref==0){ BindCtxImpl_Destroy(This); return 0; } return This->ref;; } /****************************************************************************** * BindCtx_Construct *******************************************************************************/ 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_Destroy *******************************************************************************/ HRESULT WINAPI BindCtxImpl_Destroy(BindCtxImpl* This) { FIXME(ole,"(%p),stub!\n",This); SEGPTR_FREE(This); return S_OK; } /****************************************************************************** * BindCtx_RegisterObjectBound ******************************************************************************/ HRESULT WINAPI BindCtxImpl_RegisterObjectBound(IBindCtx* iface,IUnknown* punk) { ICOM_THIS(BindCtxImpl,iface); FIXME(ole,"(%p,%p),stub!\n",This,punk); return E_NOTIMPL; } /****************************************************************************** * BindCtx_RevokeObjectBound ******************************************************************************/ HRESULT WINAPI BindCtxImpl_RevokeObjectBound(IBindCtx* iface, IUnknown* punk) { ICOM_THIS(BindCtxImpl,iface); FIXME(ole,"(%p,%p),stub!\n",This,punk); return E_NOTIMPL; } /****************************************************************************** * BindCtx_ReleaseObjects ******************************************************************************/ HRESULT WINAPI BindCtxImpl_ReleaseObjects(IBindCtx* iface) { ICOM_THIS(BindCtxImpl,iface); FIXME(ole,"(%p),stub!\n",This); return E_NOTIMPL; } /****************************************************************************** * BindCtx_SetBindOptions ******************************************************************************/ HRESULT WINAPI BindCtxImpl_SetBindOptions(IBindCtx* iface,LPBIND_OPTS2 pbindopts) { ICOM_THIS(BindCtxImpl,iface); FIXME(ole,"(%p,%p),stub!\n",This,pbindopts); return E_NOTIMPL; } /****************************************************************************** * BindCtx_GetBindOptions ******************************************************************************/ HRESULT WINAPI BindCtxImpl_GetBindOptions(IBindCtx* iface,LPBIND_OPTS2 pbindopts) { ICOM_THIS(BindCtxImpl,iface); FIXME(ole,"(%p,%p),stub!\n",This,pbindopts); return E_NOTIMPL; } /****************************************************************************** * BindCtx_GetRunningObjectTable ******************************************************************************/ HRESULT WINAPI BindCtxImpl_GetRunningObjectTable(IBindCtx* iface,IRunningObjectTable** pprot) { ICOM_THIS(BindCtxImpl,iface); FIXME(ole,"(%p,%p),stub!\n",This,pprot); return E_NOTIMPL; } /****************************************************************************** * BindCtx_RegisterObjectParam ******************************************************************************/ HRESULT WINAPI BindCtxImpl_RegisterObjectParam(IBindCtx* iface,LPOLESTR pszkey, IUnknown* punk) { ICOM_THIS(BindCtxImpl,iface); FIXME(ole,"(%p,%p,%p),stub!\n",This,pszkey,punk); return E_NOTIMPL; } /****************************************************************************** * BindCtx_GetObjectParam ******************************************************************************/ HRESULT WINAPI BindCtxImpl_GetObjectParam(IBindCtx* iface,LPOLESTR pszkey, IUnknown* punk) { ICOM_THIS(BindCtxImpl,iface); FIXME(ole,"(%p,%p,%p),stub!\n",This,pszkey,punk); return E_NOTIMPL; } /****************************************************************************** * BindCtx_EnumObjectParam ******************************************************************************/ HRESULT WINAPI BindCtxImpl_EnumObjectParam(IBindCtx* iface,IEnumString** ppenum) { ICOM_THIS(BindCtxImpl,iface); FIXME(ole,"(%p,%p),stub!\n",This,ppenum); return E_NOTIMPL; } /****************************************************************************** * BindCtx_RevokeObjectParam ******************************************************************************/ HRESULT WINAPI BindCtxImpl_RevokeObjectParam(IBindCtx* iface,LPOLESTR pszkey) { ICOM_THIS(BindCtxImpl,iface); 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 CreateBindCtx(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((IBindCtx*)newBindCtx,&IID_IBindCtx,(void**)ppbc); return hr; }