/******************************************************************************* * BindCtx_QueryInterface *******************************************************************************/ static HRESULT WINAPI BindCtxImpl_QueryInterface(IBindCtx* iface,REFIID riid,void** ppvObject) { BindCtxImpl *This = impl_from_IBindCtx(iface); TRACE("(%p %s %p)\n",This, debugstr_guid(riid), ppvObject); /* Perform a sanity check on the parameters.*/ if (!ppvObject) return E_POINTER; /* Initialize the return parameter.*/ *ppvObject = 0; /* Compare the riid with the interface IDs implemented by this object.*/ if (IsEqualIID(&IID_IUnknown, riid) || IsEqualIID(&IID_IBindCtx, riid)) { *ppvObject = This; IBindCtx_AddRef(iface); return S_OK; } return E_NOINTERFACE; }
/****************************************************************************** * BindCtx_RegisterObjectBound ******************************************************************************/ static HRESULT WINAPI BindCtxImpl_RegisterObjectBound(IBindCtx* iface,IUnknown* punk) { BindCtxImpl *This = impl_from_IBindCtx(iface); DWORD lastIndex=This->bindCtxTableLastIndex; TRACE("(%p,%p)\n",This,punk); if (punk==NULL) return S_OK; if (lastIndex == This->bindCtxTableSize) { HRESULT hr = BindCtxImpl_ExpandTable(This); if (FAILED(hr)) return hr; } IUnknown_AddRef(punk); /* put the object in the first free element in the table */ This->bindCtxTable[lastIndex].pObj = punk; This->bindCtxTable[lastIndex].pkeyObj = NULL; This->bindCtxTable[lastIndex].regType = 0; lastIndex= ++This->bindCtxTableLastIndex; return S_OK; }
static HRESULT WINAPI AsyncBindCtx_QueryInterface(IBindCtx *iface, REFIID riid, void **ppv) { AsyncBindCtx *This = impl_from_IBindCtx(iface); *ppv = NULL; if(IsEqualGUID(riid, &IID_IUnknown)) { TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); *ppv = &This->IBindCtx_iface; }else if(IsEqualGUID(riid, &IID_IBindCtx)) { TRACE("(%p)->(IID_IBindCtx %p)\n", This, ppv); *ppv = &This->IBindCtx_iface; }else if(IsEqualGUID(riid, &IID_IAsyncBindCtx)) { TRACE("(%p)->(IID_IAsyncBindCtx %p)\n", This, ppv); *ppv = &This->IBindCtx_iface; } if(*ppv) { IUnknown_AddRef((IUnknown*)*ppv); return S_OK; } FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); return E_NOINTERFACE; }
/****************************************************************************** * BindCtx_RevokeObjectBound ******************************************************************************/ static HRESULT WINAPI BindCtxImpl_RevokeObjectBound(IBindCtx* iface, IUnknown* punk) { DWORD index,j; BindCtxImpl *This = impl_from_IBindCtx(iface); TRACE("(%p,%p)\n",This,punk); if (!punk) return E_INVALIDARG; /* check if the object was registered or not */ if (BindCtxImpl_GetObjectIndex(This,punk,NULL,&index)==S_FALSE) return MK_E_NOTBOUND; if(This->bindCtxTable[index].pObj) IUnknown_Release(This->bindCtxTable[index].pObj); HeapFree(GetProcessHeap(),0,This->bindCtxTable[index].pkeyObj); /* left-shift all elements in the right side of the current revoked object */ for(j=index; j<This->bindCtxTableLastIndex-1; j++) This->bindCtxTable[j]= This->bindCtxTable[j+1]; This->bindCtxTableLastIndex--; return S_OK; }
/****************************************************************************** * BindCtx_RevokeObjectParam ******************************************************************************/ static HRESULT WINAPI BindCtxImpl_RevokeObjectParam(IBindCtx* iface,LPOLESTR ppenum) { DWORD index,j; BindCtxImpl *This = impl_from_IBindCtx(iface); TRACE("(%p,%s)\n",This,debugstr_w(ppenum)); if (BindCtxImpl_GetObjectIndex(This,NULL,ppenum,&index)==S_FALSE) return E_FAIL; /* release the object if it's found */ if(This->bindCtxTable[index].pObj) IUnknown_Release(This->bindCtxTable[index].pObj); HeapFree(GetProcessHeap(),0,This->bindCtxTable[index].pkeyObj); /* remove the object from the table with a left-shifting of all objects in the right side */ for(j=index; j<This->bindCtxTableLastIndex-1; j++) This->bindCtxTable[j]= This->bindCtxTable[j+1]; This->bindCtxTableLastIndex--; return S_OK; }
/****************************************************************************** * BindCtx_AddRef ******************************************************************************/ static ULONG WINAPI BindCtxImpl_AddRef(IBindCtx* iface) { BindCtxImpl *This = impl_from_IBindCtx(iface); TRACE("(%p)\n",This); return InterlockedIncrement(&This->ref); }
static HRESULT WINAPI AsyncBindCtx_EnumObjectParam(IBindCtx *iface, IEnumString **pszkey) { AsyncBindCtx *This = impl_from_IBindCtx(iface); TRACE("(%p)->(%p)\n", This, pszkey); return IBindCtx_EnumObjectParam(This->bindctx, pszkey); }
static HRESULT WINAPI AsyncBindCtx_RevokeObjectParam(IBindCtx *iface, LPOLESTR pszkey) { AsyncBindCtx *This = impl_from_IBindCtx(iface); TRACE("(%p)->(%s)\n", This, debugstr_w(pszkey)); return IBindCtx_RevokeObjectParam(This->bindctx, pszkey); }
static HRESULT WINAPI AsyncBindCtx_GetRunningObjectTable(IBindCtx *iface, IRunningObjectTable **pprot) { AsyncBindCtx *This = impl_from_IBindCtx(iface); TRACE("(%p)->(%p)\n", This, pprot); return IBindCtx_GetRunningObjectTable(This->bindctx, pprot); }
static HRESULT WINAPI AsyncBindCtx_GetObjectParam(IBindCtx* iface, LPOLESTR pszkey, IUnknown **punk) { AsyncBindCtx *This = impl_from_IBindCtx(iface); TRACE("(%p)->(%s %p)\n", This, debugstr_w(pszkey), punk); return IBindCtx_GetObjectParam(This->bindctx, pszkey, punk); }
static HRESULT WINAPI AsyncBindCtx_ReleaseBoundObjects(IBindCtx *iface) { AsyncBindCtx *This = impl_from_IBindCtx(iface); TRACE("(%p)\n", This); return IBindCtx_ReleaseBoundObjects(This->bindctx); }
static HRESULT WINAPI AsyncBindCtx_GetBindOptions(IBindCtx *iface, BIND_OPTS *pbindopts) { AsyncBindCtx *This = impl_from_IBindCtx(iface); TRACE("(%p)->(%p)\n", This, pbindopts); return IBindCtx_GetBindOptions(This->bindctx, pbindopts); }
static HRESULT WINAPI AsyncBindCtx_RevokeObjectBound(IBindCtx *iface, IUnknown *punk) { AsyncBindCtx *This = impl_from_IBindCtx(iface); TRACE("(%p %p)\n", This, punk); return IBindCtx_RevokeObjectBound(This->bindctx, punk); }
static ULONG WINAPI AsyncBindCtx_AddRef(IBindCtx *iface) { AsyncBindCtx *This = impl_from_IBindCtx(iface); LONG ref = InterlockedIncrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); return ref; }
/****************************************************************************** * BindCtx_GetRunningObjectTable ******************************************************************************/ static HRESULT WINAPI BindCtxImpl_GetRunningObjectTable(IBindCtx* iface,IRunningObjectTable** pprot) { BindCtxImpl *This = impl_from_IBindCtx(iface); TRACE("(%p,%p)\n",This,pprot); if (pprot==NULL) return E_POINTER; return GetRunningObjectTable(0, pprot); }
/****************************************************************************** * BindCtx_RegisterObjectParam ******************************************************************************/ static HRESULT WINAPI BindCtxImpl_RegisterObjectParam(IBindCtx* iface,LPOLESTR pszkey, IUnknown* punk) { DWORD index=0; BindCtxImpl *This = impl_from_IBindCtx(iface); TRACE("(%p,%s,%p)\n",This,debugstr_w(pszkey),punk); if (punk==NULL) return E_INVALIDARG; if (pszkey!=NULL && BindCtxImpl_GetObjectIndex(This,NULL,pszkey,&index)==S_OK) { TRACE("Overwriting existing key\n"); if(This->bindCtxTable[index].pObj!=NULL) IUnknown_Release(This->bindCtxTable[index].pObj); This->bindCtxTable[index].pObj=punk; IUnknown_AddRef(punk); return S_OK; } if (This->bindCtxTableLastIndex == This->bindCtxTableSize) { HRESULT hr = BindCtxImpl_ExpandTable(This); if (FAILED(hr)) return hr; } This->bindCtxTable[This->bindCtxTableLastIndex].pObj = punk; This->bindCtxTable[This->bindCtxTableLastIndex].regType = 1; if (pszkey==NULL) This->bindCtxTable[This->bindCtxTableLastIndex].pkeyObj=NULL; else { This->bindCtxTable[This->bindCtxTableLastIndex].pkeyObj= HeapAlloc(GetProcessHeap(),0,(sizeof(WCHAR)*(1+lstrlenW(pszkey)))); if (This->bindCtxTable[This->bindCtxTableLastIndex].pkeyObj==NULL) return E_OUTOFMEMORY; lstrcpyW(This->bindCtxTable[This->bindCtxTableLastIndex].pkeyObj,pszkey); } This->bindCtxTableLastIndex++; IUnknown_AddRef(punk); return S_OK; }
static ULONG WINAPI AsyncBindCtx_Release(IBindCtx *iface) { AsyncBindCtx *This = impl_from_IBindCtx(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); if(!ref) { IBindCtx_Release(This->bindctx); heap_free(This); } return ref; }
/****************************************************************************** * BindCtx_Release ******************************************************************************/ static ULONG WINAPI BindCtxImpl_Release(IBindCtx* iface) { BindCtxImpl *This = impl_from_IBindCtx(iface); ULONG ref; TRACE("(%p)\n",This); ref = InterlockedDecrement(&This->ref); if (ref == 0) { /* release all registered objects */ BindCtxImpl_ReleaseBoundObjects(&This->IBindCtx_iface); BindCtxImpl_Destroy(This); } return ref; }
/****************************************************************************** * BindCtx_SetBindOptions ******************************************************************************/ static HRESULT WINAPI BindCtxImpl_SetBindOptions(IBindCtx* iface,BIND_OPTS *pbindopts) { BindCtxImpl *This = impl_from_IBindCtx(iface); TRACE("(%p,%p)\n",This,pbindopts); if (pbindopts==NULL) return E_POINTER; if (pbindopts->cbStruct > sizeof(BIND_OPTS2)) { WARN("invalid size\n"); return E_INVALIDARG; /* FIXME : not verified */ } memcpy(&This->bindOption2, pbindopts, pbindopts->cbStruct); return S_OK; }
/****************************************************************************** * BindCtx_ReleaseBoundObjects ******************************************************************************/ static HRESULT WINAPI BindCtxImpl_ReleaseBoundObjects(IBindCtx* iface) { DWORD i; BindCtxImpl *This = impl_from_IBindCtx(iface); TRACE("(%p)\n",This); for(i=0; i<This->bindCtxTableLastIndex; i++) { if(This->bindCtxTable[i].pObj) IUnknown_Release(This->bindCtxTable[i].pObj); HeapFree(GetProcessHeap(),0,This->bindCtxTable[i].pkeyObj); } This->bindCtxTableLastIndex = 0; return S_OK; }
/****************************************************************************** * BindCtx_GetBindOptions ******************************************************************************/ static HRESULT WINAPI BindCtxImpl_GetBindOptions(IBindCtx* iface,BIND_OPTS *pbindopts) { BindCtxImpl *This = impl_from_IBindCtx(iface); ULONG cbStruct; TRACE("(%p,%p)\n",This,pbindopts); if (pbindopts==NULL) return E_POINTER; cbStruct = pbindopts->cbStruct; if (cbStruct > sizeof(BIND_OPTS2)) cbStruct = sizeof(BIND_OPTS2); memcpy(pbindopts, &This->bindOption2, cbStruct); pbindopts->cbStruct = cbStruct; return S_OK; }
/****************************************************************************** * BindCtx_GetObjectParam ******************************************************************************/ static HRESULT WINAPI BindCtxImpl_GetObjectParam(IBindCtx* iface,LPOLESTR pszkey, IUnknown** punk) { DWORD index; BindCtxImpl *This = impl_from_IBindCtx(iface); TRACE("(%p,%s,%p)\n",This,debugstr_w(pszkey),punk); if (punk==NULL) return E_POINTER; *punk=0; if (BindCtxImpl_GetObjectIndex(This,NULL,pszkey,&index)==S_FALSE) return E_FAIL; IUnknown_AddRef(This->bindCtxTable[index].pObj); *punk = This->bindCtxTable[index].pObj; return S_OK; }