284 lines
9.5 KiB
C
284 lines
9.5 KiB
C
/***************************************************************************************
|
|
* 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;
|
|
}
|