Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 1 | /*************************************************************************************** |
| 2 | * BindCtx implementation |
| 3 | * |
| 4 | * Copyright 1999 Noomen Hamza |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 5 | * |
| 6 | * This library is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU Lesser General Public |
| 8 | * License as published by the Free Software Foundation; either |
| 9 | * version 2.1 of the License, or (at your option) any later version. |
| 10 | * |
| 11 | * This library is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 14 | * Lesser General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU Lesser General Public |
| 17 | * License along with this library; if not, write to the Free Software |
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 19 | ***************************************************************************************/ |
| 20 | |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 21 | #include <stdarg.h> |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 22 | #include <string.h> |
| 23 | #include <assert.h> |
| 24 | #include "winerror.h" |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 25 | #include "windef.h" |
Alexandre Julliard | 74af67e | 2000-09-26 00:00:55 +0000 | [diff] [blame] | 26 | #include "winbase.h" |
Alexandre Julliard | c7e7df8 | 2000-08-14 14:41:19 +0000 | [diff] [blame] | 27 | #include "wine/unicode.h" |
Ove Kaaven | 1f5315c | 2002-12-05 20:33:07 +0000 | [diff] [blame] | 28 | #include "objbase.h" |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 29 | #include "wine/debug.h" |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 30 | |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 31 | WINE_DEFAULT_DEBUG_CHANNEL(ole); |
Patrik Stridvall | b4b9fae | 1999-04-19 14:56:29 +0000 | [diff] [blame] | 32 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 33 | /* represent the first size table and it's increment block size */ |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 34 | #define BLOCK_TAB_SIZE 10 |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 35 | #define MAX_TAB_SIZE 0xFFFFFFFF |
| 36 | |
| 37 | /* data structure of the BindCtx table elements */ |
| 38 | typedef struct BindCtxObject{ |
| 39 | |
| 40 | IUnknown* pObj; /* point on a bound object */ |
| 41 | |
| 42 | LPOLESTR pkeyObj; /* key associated to this bound object */ |
| 43 | |
| 44 | BYTE regType; /* registration type: 1 if RegisterObjectParam and 0 if RegisterObjectBound */ |
| 45 | |
| 46 | } BindCtxObject; |
| 47 | |
| 48 | /* BindCtx data strucrture */ |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 49 | typedef struct BindCtxImpl{ |
| 50 | |
Francois Gouget | 01c9ac4 | 1999-10-31 01:59:23 +0000 | [diff] [blame] | 51 | ICOM_VFIELD(IBindCtx); /* VTable relative to the IBindCtx interface.*/ |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 52 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 53 | ULONG ref; /* reference counter for this object */ |
| 54 | |
Francois Gouget | 282f727 | 2001-02-28 05:31:02 +0000 | [diff] [blame] | 55 | BindCtxObject* bindCtxTable; /* this is a table in which all bounded objects are stored*/ |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 56 | DWORD bindCtxTableLastIndex; /* first free index in the table */ |
| 57 | DWORD bindCtxTableSize; /* size table */ |
| 58 | |
Francois Gouget | 282f727 | 2001-02-28 05:31:02 +0000 | [diff] [blame] | 59 | BIND_OPTS2 bindOption2; /* a structure which contains the bind options*/ |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 60 | |
| 61 | } BindCtxImpl; |
| 62 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 63 | /* IBindCtx prototype functions : */ |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 64 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 65 | /* IUnknown functions*/ |
| 66 | static HRESULT WINAPI BindCtxImpl_QueryInterface(IBindCtx* iface,REFIID riid,void** ppvObject); |
| 67 | static ULONG WINAPI BindCtxImpl_AddRef(IBindCtx* iface); |
| 68 | static ULONG WINAPI BindCtxImpl_Release(IBindCtx* iface); |
| 69 | /* IBindCtx functions */ |
| 70 | static HRESULT WINAPI BindCtxImpl_RegisterObjectBound(IBindCtx* iface,IUnknown* punk); |
| 71 | static HRESULT WINAPI BindCtxImpl_RevokeObjectBound(IBindCtx* iface, IUnknown* punk); |
| 72 | static HRESULT WINAPI BindCtxImpl_ReleaseBoundObjects(IBindCtx* iface); |
Alexandre Julliard | 87fa2d5 | 2002-12-19 22:16:35 +0000 | [diff] [blame] | 73 | static HRESULT WINAPI BindCtxImpl_SetBindOptions(IBindCtx* iface,BIND_OPTS *pbindopts); |
| 74 | static HRESULT WINAPI BindCtxImpl_GetBindOptions(IBindCtx* iface,BIND_OPTS *pbindopts); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 75 | static HRESULT WINAPI BindCtxImpl_GetRunningObjectTable(IBindCtx* iface,IRunningObjectTable** pprot); |
| 76 | static HRESULT WINAPI BindCtxImpl_RegisterObjectParam(IBindCtx* iface,LPOLESTR pszkey, IUnknown* punk); |
| 77 | static HRESULT WINAPI BindCtxImpl_GetObjectParam(IBindCtx* iface,LPOLESTR pszkey, IUnknown** punk); |
| 78 | static HRESULT WINAPI BindCtxImpl_EnumObjectParam(IBindCtx* iface,IEnumString** ppenum); |
| 79 | static HRESULT WINAPI BindCtxImpl_RevokeObjectParam(IBindCtx* iface,LPOLESTR pszkey); |
| 80 | /* Local functions*/ |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 81 | HRESULT WINAPI BindCtxImpl_Construct(BindCtxImpl* This); |
| 82 | HRESULT WINAPI BindCtxImpl_Destroy(BindCtxImpl* This); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 83 | HRESULT WINAPI BindCtxImpl_GetObjectIndex(BindCtxImpl* This,IUnknown* punk,LPOLESTR pszkey,DWORD *index); |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 84 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 85 | /* Virtual function table for the BindCtx class. */ |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 86 | static ICOM_VTABLE(IBindCtx) VT_BindCtxImpl = |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 87 | { |
Paul Quinn | 2305f3c | 1999-05-22 11:41:38 +0000 | [diff] [blame] | 88 | ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 89 | BindCtxImpl_QueryInterface, |
| 90 | BindCtxImpl_AddRef, |
| 91 | BindCtxImpl_Release, |
| 92 | BindCtxImpl_RegisterObjectBound, |
| 93 | BindCtxImpl_RevokeObjectBound, |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 94 | BindCtxImpl_ReleaseBoundObjects, |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 95 | BindCtxImpl_SetBindOptions, |
| 96 | BindCtxImpl_GetBindOptions, |
| 97 | BindCtxImpl_GetRunningObjectTable, |
| 98 | BindCtxImpl_RegisterObjectParam, |
| 99 | BindCtxImpl_GetObjectParam, |
| 100 | BindCtxImpl_EnumObjectParam, |
| 101 | BindCtxImpl_RevokeObjectParam |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 102 | }; |
| 103 | |
| 104 | /******************************************************************************* |
| 105 | * BindCtx_QueryInterface |
| 106 | *******************************************************************************/ |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 107 | HRESULT WINAPI BindCtxImpl_QueryInterface(IBindCtx* iface,REFIID riid,void** ppvObject) |
| 108 | { |
| 109 | ICOM_THIS(BindCtxImpl,iface); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 110 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 111 | TRACE("(%p,%p,%p)\n",This,riid,ppvObject); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 112 | |
| 113 | /* Perform a sanity check on the parameters.*/ |
| 114 | if ( (This==0) || (ppvObject==0) ) |
| 115 | return E_INVALIDARG; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 116 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 117 | /* Initialize the return parameter.*/ |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 118 | *ppvObject = 0; |
| 119 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 120 | /* Compare the riid with the interface IDs implemented by this object.*/ |
| 121 | if (IsEqualIID(&IID_IUnknown, riid)) |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 122 | *ppvObject = (IBindCtx*)This; |
| 123 | else |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 124 | if (IsEqualIID(&IID_IBindCtx, riid)) |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 125 | *ppvObject = (IBindCtx*)This; |
| 126 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 127 | /* Check that we obtained an interface.*/ |
| 128 | if ((*ppvObject)==0) |
| 129 | return E_NOINTERFACE; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 130 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 131 | /* Query Interface always increases the reference count by one when it is successful */ |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 132 | BindCtxImpl_AddRef(iface); |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 133 | |
| 134 | return S_OK; |
| 135 | } |
| 136 | |
| 137 | /****************************************************************************** |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 138 | * BindCtx_AddRef |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 139 | ******************************************************************************/ |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 140 | ULONG WINAPI BindCtxImpl_AddRef(IBindCtx* iface) |
| 141 | { |
| 142 | ICOM_THIS(BindCtxImpl,iface); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 143 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 144 | TRACE("(%p)\n",This); |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 145 | |
| 146 | return ++(This->ref); |
| 147 | } |
| 148 | |
| 149 | /****************************************************************************** |
| 150 | * BindCtx_Release |
| 151 | ******************************************************************************/ |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 152 | ULONG WINAPI BindCtxImpl_Release(IBindCtx* iface) |
| 153 | { |
| 154 | ICOM_THIS(BindCtxImpl,iface); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 155 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 156 | TRACE("(%p)\n",This); |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 157 | |
| 158 | This->ref--; |
| 159 | |
| 160 | if (This->ref==0){ |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 161 | |
Alexandre Julliard | 81ee21d | 1999-12-27 05:26:00 +0000 | [diff] [blame] | 162 | /* release all registered objects */ |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 163 | BindCtxImpl_ReleaseBoundObjects((IBindCtx*)This); |
| 164 | |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 165 | BindCtxImpl_Destroy(This); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 166 | |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 167 | return 0; |
| 168 | } |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 169 | return This->ref; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 170 | } |
| 171 | |
| 172 | |
| 173 | /****************************************************************************** |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 174 | * BindCtx_Construct (local function) |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 175 | *******************************************************************************/ |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 176 | HRESULT WINAPI BindCtxImpl_Construct(BindCtxImpl* This) |
| 177 | { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 178 | TRACE("(%p)\n",This); |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 179 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 180 | /* Initialize the virtual function table.*/ |
Alexandre Julliard | c2ebe1f | 2003-04-10 18:17:34 +0000 | [diff] [blame] | 181 | This->lpVtbl = &VT_BindCtxImpl; |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 182 | This->ref = 0; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 183 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 184 | /* Initialize the BIND_OPTS2 structure */ |
| 185 | This->bindOption2.cbStruct = sizeof(BIND_OPTS2); |
| 186 | This->bindOption2.grfFlags = 0; |
| 187 | This->bindOption2.grfMode = STGM_READWRITE; |
| 188 | This->bindOption2.dwTickCountDeadline = 0; |
| 189 | |
| 190 | This->bindOption2.dwTrackFlags = 0; |
| 191 | This->bindOption2.dwClassContext = CLSCTX_SERVER; |
| 192 | This->bindOption2.locale = 1033; |
| 193 | This->bindOption2.pServerInfo = 0; |
| 194 | |
| 195 | /* Initialize the bindctx table */ |
| 196 | This->bindCtxTableSize=BLOCK_TAB_SIZE; |
| 197 | This->bindCtxTableLastIndex=0; |
| 198 | This->bindCtxTable= HeapAlloc(GetProcessHeap(), 0,This->bindCtxTableSize*sizeof(BindCtxObject)); |
| 199 | |
| 200 | if (This->bindCtxTable==NULL) |
| 201 | return E_OUTOFMEMORY; |
| 202 | |
| 203 | return S_OK; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 204 | } |
| 205 | |
| 206 | /****************************************************************************** |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 207 | * BindCtx_Destroy (local function) |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 208 | *******************************************************************************/ |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 209 | HRESULT WINAPI BindCtxImpl_Destroy(BindCtxImpl* This) |
| 210 | { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 211 | TRACE("(%p)\n",This); |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 212 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 213 | /* free the table space memory */ |
| 214 | HeapFree(GetProcessHeap(),0,This->bindCtxTable); |
| 215 | |
| 216 | /* free the bindctx structure */ |
| 217 | HeapFree(GetProcessHeap(),0,This); |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 218 | |
| 219 | return S_OK; |
| 220 | } |
| 221 | |
| 222 | |
| 223 | /****************************************************************************** |
| 224 | * BindCtx_RegisterObjectBound |
| 225 | ******************************************************************************/ |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 226 | HRESULT WINAPI BindCtxImpl_RegisterObjectBound(IBindCtx* iface,IUnknown* punk) |
| 227 | { |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 228 | ICOM_THIS(BindCtxImpl,iface); |
| 229 | DWORD lastIndex=This->bindCtxTableLastIndex; |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 230 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 231 | TRACE("(%p,%p)\n",This,punk); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 232 | |
| 233 | if (punk==NULL) |
| 234 | return E_POINTER; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 235 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 236 | IUnknown_AddRef(punk); |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 237 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 238 | /* put the object in the first free element in the table */ |
| 239 | This->bindCtxTable[lastIndex].pObj = punk; |
| 240 | This->bindCtxTable[lastIndex].pkeyObj = NULL; |
| 241 | This->bindCtxTable[lastIndex].regType = 0; |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 242 | lastIndex= ++This->bindCtxTableLastIndex; |
| 243 | |
| 244 | if (lastIndex == This->bindCtxTableSize){ /* the table is full so it must be resized */ |
| 245 | |
| 246 | if (This->bindCtxTableSize > (MAX_TAB_SIZE-BLOCK_TAB_SIZE)){ |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 247 | FIXME("This->bindCtxTableSize: %ld is out of data limite \n",This->bindCtxTableSize); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 248 | return E_FAIL; |
Patrik Stridvall | 3c0211f | 2001-09-11 00:32:32 +0000 | [diff] [blame] | 249 | } |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 250 | |
| 251 | This->bindCtxTableSize+=BLOCK_TAB_SIZE; /* new table size */ |
| 252 | |
| 253 | This->bindCtxTable = HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,This->bindCtxTable, |
| 254 | This->bindCtxTableSize * sizeof(BindCtxObject)); |
| 255 | if (!This->bindCtxTable) |
| 256 | return E_OUTOFMEMORY; |
| 257 | } |
| 258 | return S_OK; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 259 | } |
| 260 | |
| 261 | /****************************************************************************** |
| 262 | * BindCtx_RevokeObjectBound |
| 263 | ******************************************************************************/ |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 264 | HRESULT WINAPI BindCtxImpl_RevokeObjectBound(IBindCtx* iface, IUnknown* punk) |
| 265 | { |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 266 | DWORD index,j; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 267 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 268 | ICOM_THIS(BindCtxImpl,iface); |
| 269 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 270 | TRACE("(%p,%p)\n",This,punk); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 271 | |
| 272 | /* check if the object was registred or not */ |
| 273 | if (BindCtxImpl_GetObjectIndex(This,punk,NULL,&index)==S_FALSE) |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 274 | return MK_E_NOTBOUND; |
| 275 | |
Alberto Massari | fc47be5 | 2003-04-05 05:10:37 +0000 | [diff] [blame] | 276 | if(This->bindCtxTable[index].pObj) |
| 277 | IUnknown_Release(This->bindCtxTable[index].pObj); |
| 278 | if(This->bindCtxTable[index].pkeyObj) |
| 279 | HeapFree(GetProcessHeap(),0,This->bindCtxTable[index].pkeyObj); |
| 280 | |
Andreas Mohr | f32f918 | 2001-04-20 18:36:05 +0000 | [diff] [blame] | 281 | /* left-shift all elements in the right side of the current revoked object */ |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 282 | for(j=index; j<This->bindCtxTableLastIndex-1; j++) |
| 283 | This->bindCtxTable[j]= This->bindCtxTable[j+1]; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 284 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 285 | This->bindCtxTableLastIndex--; |
| 286 | |
| 287 | return S_OK; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 288 | } |
| 289 | |
| 290 | /****************************************************************************** |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 291 | * BindCtx_ReleaseBoundObjects |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 292 | ******************************************************************************/ |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 293 | HRESULT WINAPI BindCtxImpl_ReleaseBoundObjects(IBindCtx* iface) |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 294 | { |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 295 | DWORD i; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 296 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 297 | ICOM_THIS(BindCtxImpl,iface); |
| 298 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 299 | TRACE("(%p)\n",This); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 300 | |
| 301 | for(i=0;i<This->bindCtxTableLastIndex;i++) |
Alberto Massari | fc47be5 | 2003-04-05 05:10:37 +0000 | [diff] [blame] | 302 | { |
| 303 | if(This->bindCtxTable[i].pObj) |
| 304 | IUnknown_Release(This->bindCtxTable[i].pObj); |
| 305 | if(This->bindCtxTable[i].pkeyObj) |
| 306 | HeapFree(GetProcessHeap(),0,This->bindCtxTable[i].pkeyObj); |
| 307 | } |
| 308 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 309 | This->bindCtxTableLastIndex = 0; |
| 310 | |
| 311 | return S_OK; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 312 | } |
| 313 | |
| 314 | /****************************************************************************** |
| 315 | * BindCtx_SetBindOptions |
| 316 | ******************************************************************************/ |
Alexandre Julliard | 87fa2d5 | 2002-12-19 22:16:35 +0000 | [diff] [blame] | 317 | HRESULT WINAPI BindCtxImpl_SetBindOptions(IBindCtx* iface,BIND_OPTS *pbindopts) |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 318 | { |
| 319 | ICOM_THIS(BindCtxImpl,iface); |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 320 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 321 | TRACE("(%p,%p)\n",This,pbindopts); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 322 | |
| 323 | if (pbindopts==NULL) |
| 324 | return E_POINTER; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 325 | |
Gerard Patel | f44c1f7 | 1999-12-10 03:23:35 +0000 | [diff] [blame] | 326 | if (pbindopts->cbStruct > sizeof(BIND_OPTS2)) |
| 327 | { |
Francois Gouget | e76218d | 2001-05-09 17:31:31 +0000 | [diff] [blame] | 328 | WARN("invalid size\n"); |
Gerard Patel | f44c1f7 | 1999-12-10 03:23:35 +0000 | [diff] [blame] | 329 | return E_INVALIDARG; /* FIXME : not verified */ |
| 330 | } |
| 331 | memcpy(&This->bindOption2, pbindopts, pbindopts->cbStruct); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 332 | return S_OK; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 333 | } |
| 334 | |
| 335 | /****************************************************************************** |
| 336 | * BindCtx_GetBindOptions |
| 337 | ******************************************************************************/ |
Alexandre Julliard | 87fa2d5 | 2002-12-19 22:16:35 +0000 | [diff] [blame] | 338 | HRESULT WINAPI BindCtxImpl_GetBindOptions(IBindCtx* iface,BIND_OPTS *pbindopts) |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 339 | { |
| 340 | ICOM_THIS(BindCtxImpl,iface); |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 341 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 342 | TRACE("(%p,%p)\n",This,pbindopts); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 343 | |
| 344 | if (pbindopts==NULL) |
| 345 | return E_POINTER; |
| 346 | |
Gerard Patel | f44c1f7 | 1999-12-10 03:23:35 +0000 | [diff] [blame] | 347 | if (pbindopts->cbStruct > sizeof(BIND_OPTS2)) |
| 348 | { |
Francois Gouget | e76218d | 2001-05-09 17:31:31 +0000 | [diff] [blame] | 349 | WARN("invalid size\n"); |
Gerard Patel | f44c1f7 | 1999-12-10 03:23:35 +0000 | [diff] [blame] | 350 | return E_INVALIDARG; /* FIXME : not verified */ |
| 351 | } |
| 352 | memcpy(pbindopts, &This->bindOption2, pbindopts->cbStruct); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 353 | return S_OK; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 354 | } |
| 355 | |
| 356 | /****************************************************************************** |
| 357 | * BindCtx_GetRunningObjectTable |
| 358 | ******************************************************************************/ |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 359 | HRESULT WINAPI BindCtxImpl_GetRunningObjectTable(IBindCtx* iface,IRunningObjectTable** pprot) |
| 360 | { |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 361 | HRESULT res; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 362 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 363 | ICOM_THIS(BindCtxImpl,iface); |
| 364 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 365 | TRACE("(%p,%p)\n",This,pprot); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 366 | |
| 367 | if (pprot==NULL) |
| 368 | return E_POINTER; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 369 | |
Paul Quinn | aaa8306 | 1999-06-05 15:23:20 +0000 | [diff] [blame] | 370 | res=GetRunningObjectTable(0, pprot); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 371 | |
| 372 | return res; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 373 | } |
| 374 | |
| 375 | /****************************************************************************** |
| 376 | * BindCtx_RegisterObjectParam |
| 377 | ******************************************************************************/ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 378 | HRESULT WINAPI BindCtxImpl_RegisterObjectParam(IBindCtx* iface,LPOLESTR pszkey, IUnknown* punk) |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 379 | { |
Alberto Massari | bb7e49a | 2003-01-02 17:51:34 +0000 | [diff] [blame] | 380 | DWORD index=0; |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 381 | ICOM_THIS(BindCtxImpl,iface); |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 382 | |
Alberto Massari | bb7e49a | 2003-01-02 17:51:34 +0000 | [diff] [blame] | 383 | TRACE("(%p,%s,%p)\n",This,debugstr_w(pszkey),punk); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 384 | |
| 385 | if (punk==NULL) |
| 386 | return E_INVALIDARG; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 387 | |
Alberto Massari | bb7e49a | 2003-01-02 17:51:34 +0000 | [diff] [blame] | 388 | if (pszkey!=NULL && BindCtxImpl_GetObjectIndex(This,NULL,pszkey,&index)==S_OK) |
| 389 | { |
| 390 | TRACE("Overwriting existing key\n"); |
| 391 | if(This->bindCtxTable[index].pObj!=NULL) |
| 392 | IUnknown_Release(This->bindCtxTable[index].pObj); |
| 393 | This->bindCtxTable[index].pObj=punk; |
Rolf Kalbermatter | 919bd78 | 2003-08-29 22:10:01 +0000 | [diff] [blame] | 394 | IUnknown_AddRef(punk); |
Alberto Massari | bb7e49a | 2003-01-02 17:51:34 +0000 | [diff] [blame] | 395 | return S_OK; |
| 396 | } |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 397 | This->bindCtxTable[This->bindCtxTableLastIndex].pObj = punk; |
| 398 | This->bindCtxTable[This->bindCtxTableLastIndex].regType = 1; |
| 399 | |
| 400 | if (pszkey==NULL) |
| 401 | |
| 402 | This->bindCtxTable[This->bindCtxTableLastIndex].pkeyObj=NULL; |
| 403 | |
| 404 | else{ |
| 405 | |
| 406 | This->bindCtxTable[This->bindCtxTableLastIndex].pkeyObj= |
| 407 | HeapAlloc(GetProcessHeap(),0,(sizeof(WCHAR)*(1+lstrlenW(pszkey)))); |
| 408 | |
| 409 | if (This->bindCtxTable[This->bindCtxTableLastIndex].pkeyObj==NULL) |
| 410 | return E_OUTOFMEMORY; |
Alexandre Julliard | c7e7df8 | 2000-08-14 14:41:19 +0000 | [diff] [blame] | 411 | strcpyW(This->bindCtxTable[This->bindCtxTableLastIndex].pkeyObj,pszkey); |
Patrik Stridvall | 3c0211f | 2001-09-11 00:32:32 +0000 | [diff] [blame] | 412 | } |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 413 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 414 | This->bindCtxTableLastIndex++; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 415 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 416 | if (This->bindCtxTableLastIndex == This->bindCtxTableSize){ /* table is full ! must be resized */ |
| 417 | |
| 418 | This->bindCtxTableSize+=BLOCK_TAB_SIZE; /* new table size */ |
| 419 | |
| 420 | if (This->bindCtxTableSize > (MAX_TAB_SIZE-BLOCK_TAB_SIZE)){ |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 421 | FIXME("This->bindCtxTableSize: %ld is out of data limite \n",This->bindCtxTableSize); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 422 | return E_FAIL; |
| 423 | } |
| 424 | This->bindCtxTable = HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,This->bindCtxTable, |
| 425 | This->bindCtxTableSize * sizeof(BindCtxObject)); |
| 426 | if (!This->bindCtxTable) |
| 427 | return E_OUTOFMEMORY; |
| 428 | } |
Rolf Kalbermatter | 919bd78 | 2003-08-29 22:10:01 +0000 | [diff] [blame] | 429 | IUnknown_AddRef(punk); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 430 | return S_OK; |
| 431 | } |
Rolf Kalbermatter | 919bd78 | 2003-08-29 22:10:01 +0000 | [diff] [blame] | 432 | |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 433 | /****************************************************************************** |
| 434 | * BindCtx_GetObjectParam |
| 435 | ******************************************************************************/ |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 436 | HRESULT WINAPI BindCtxImpl_GetObjectParam(IBindCtx* iface,LPOLESTR pszkey, IUnknown** punk) |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 437 | { |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 438 | DWORD index; |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 439 | ICOM_THIS(BindCtxImpl,iface); |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 440 | |
Alberto Massari | bb7e49a | 2003-01-02 17:51:34 +0000 | [diff] [blame] | 441 | TRACE("(%p,%s,%p)\n",This,debugstr_w(pszkey),punk); |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 442 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 443 | if (punk==NULL) |
| 444 | return E_POINTER; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 445 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 446 | *punk=0; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 447 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 448 | if (BindCtxImpl_GetObjectIndex(This,NULL,pszkey,&index)==S_FALSE) |
| 449 | return E_FAIL; |
| 450 | |
| 451 | IUnknown_AddRef(This->bindCtxTable[index].pObj); |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 452 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 453 | *punk = This->bindCtxTable[index].pObj; |
| 454 | |
| 455 | return S_OK; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 456 | } |
| 457 | |
| 458 | /****************************************************************************** |
| 459 | * BindCtx_RevokeObjectParam |
| 460 | ******************************************************************************/ |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 461 | HRESULT WINAPI BindCtxImpl_RevokeObjectParam(IBindCtx* iface,LPOLESTR ppenum) |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 462 | { |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 463 | DWORD index,j; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 464 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 465 | ICOM_THIS(BindCtxImpl,iface); |
| 466 | |
Alberto Massari | bb7e49a | 2003-01-02 17:51:34 +0000 | [diff] [blame] | 467 | TRACE("(%p,%s)\n",This,debugstr_w(ppenum)); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 468 | |
| 469 | if (BindCtxImpl_GetObjectIndex(This,NULL,ppenum,&index)==S_FALSE) |
| 470 | return E_FAIL; |
| 471 | |
| 472 | /* release the object if it's found */ |
Alberto Massari | fc47be5 | 2003-04-05 05:10:37 +0000 | [diff] [blame] | 473 | if(This->bindCtxTable[index].pObj) |
| 474 | IUnknown_Release(This->bindCtxTable[index].pObj); |
| 475 | if(This->bindCtxTable[index].pkeyObj) |
| 476 | HeapFree(GetProcessHeap(),0,This->bindCtxTable[index].pkeyObj); |
| 477 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 478 | /* remove the object from the table with a left-shifting of all objects in the right side */ |
| 479 | for(j=index; j<This->bindCtxTableLastIndex-1; j++) |
| 480 | This->bindCtxTable[j]= This->bindCtxTable[j+1]; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 481 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 482 | This->bindCtxTableLastIndex--; |
| 483 | |
| 484 | return S_OK; |
| 485 | } |
| 486 | |
| 487 | /****************************************************************************** |
| 488 | * BindCtx_EnumObjectParam |
| 489 | ******************************************************************************/ |
| 490 | HRESULT WINAPI BindCtxImpl_EnumObjectParam(IBindCtx* iface,IEnumString** pszkey) |
| 491 | { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 492 | FIXME("(%p,%p),stub!\n",iface,pszkey); |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 493 | return E_NOTIMPL; |
| 494 | } |
| 495 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 496 | /******************************************************************************** |
| 497 | * GetObjectIndex (local function) |
| 498 | ********************************************************************************/ |
| 499 | HRESULT WINAPI BindCtxImpl_GetObjectIndex(BindCtxImpl* This, |
| 500 | IUnknown* punk, |
| 501 | LPOLESTR pszkey, |
| 502 | DWORD *index) |
| 503 | { |
| 504 | |
| 505 | DWORD i; |
| 506 | BYTE found=0; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 507 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 508 | TRACE("(%p,%p,%p,%p)\n",This,punk,pszkey,index); |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 509 | |
| 510 | if (punk==NULL) |
| 511 | /* search object identified by a register key */ |
| 512 | for(i=0; ( (i<This->bindCtxTableLastIndex) && (!found));i++){ |
| 513 | |
| 514 | if(This->bindCtxTable[i].regType==1){ |
| 515 | |
| 516 | if ( ( (This->bindCtxTable[i].pkeyObj==NULL) && (pszkey==NULL) ) || |
| 517 | ( (This->bindCtxTable[i].pkeyObj!=NULL) && |
| 518 | (pszkey!=NULL) && |
| 519 | (lstrcmpW(This->bindCtxTable[i].pkeyObj,pszkey)==0) |
| 520 | ) |
| 521 | ) |
| 522 | |
| 523 | found=1; |
| 524 | } |
| 525 | } |
| 526 | else |
| 527 | /* search object identified by a moniker*/ |
| 528 | for(i=0; ( (i<This->bindCtxTableLastIndex) && (!found));i++) |
| 529 | if(This->bindCtxTable[i].pObj==punk) |
| 530 | found=1; |
| 531 | |
| 532 | if (index != NULL) |
| 533 | *index=i-1; |
| 534 | |
| 535 | if (found) |
| 536 | return S_OK; |
Alberto Massari | bb7e49a | 2003-01-02 17:51:34 +0000 | [diff] [blame] | 537 | TRACE("key not found\n"); |
| 538 | return S_FALSE; |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 539 | } |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 540 | |
| 541 | /****************************************************************************** |
| 542 | * CreateBindCtx16 |
| 543 | ******************************************************************************/ |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 544 | HRESULT WINAPI CreateBindCtx16(DWORD reserved, LPBC * ppbc) |
| 545 | { |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 546 | FIXME("(%ld,%p),stub!\n",reserved,ppbc); |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 547 | return E_NOTIMPL; |
| 548 | } |
| 549 | |
| 550 | /****************************************************************************** |
Dave Miller | 47fb938 | 2003-09-11 03:06:25 +0000 | [diff] [blame^] | 551 | * CreateBindCtx (OLE32.@) |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 552 | ******************************************************************************/ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 553 | HRESULT WINAPI CreateBindCtx(DWORD reserved, LPBC * ppbc) |
Francois Gouget | b0c6129 | 1999-02-18 13:26:22 +0000 | [diff] [blame] | 554 | { |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 555 | BindCtxImpl* newBindCtx = 0; |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 556 | HRESULT hr; |
| 557 | IID riid=IID_IBindCtx; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 558 | |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 559 | TRACE("(%ld,%p)\n",reserved,ppbc); |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 560 | |
| 561 | newBindCtx = HeapAlloc(GetProcessHeap(), 0, sizeof(BindCtxImpl)); |
| 562 | |
| 563 | if (newBindCtx == 0) |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 564 | return E_OUTOFMEMORY; |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 565 | |
| 566 | hr = BindCtxImpl_Construct(newBindCtx); |
| 567 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 568 | if (FAILED(hr)){ |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 569 | |
Noomen Hamza | ed494ec | 1999-03-23 13:48:56 +0000 | [diff] [blame] | 570 | HeapFree(GetProcessHeap(),0,newBindCtx); |
| 571 | return hr; |
| 572 | } |
| 573 | |
| 574 | hr = BindCtxImpl_QueryInterface((IBindCtx*)newBindCtx,&riid,(void**)ppbc); |
Noomen Hamza | 3fb3da2 | 1999-01-28 17:56:14 +0000 | [diff] [blame] | 575 | |
| 576 | return hr; |
| 577 | } |
Robert Shearman | 26781ac | 2002-12-12 02:17:39 +0000 | [diff] [blame] | 578 | |
| 579 | HRESULT WINAPI BindMoniker(LPMONIKER pmk, DWORD grfOpt, REFIID riid, LPVOID * ppvResult) |
| 580 | { |
| 581 | HRESULT res; |
| 582 | IBindCtx * pbc; |
| 583 | |
| 584 | TRACE("(%p, %lx, %s, %p)\n", pmk, grfOpt, debugstr_guid(riid), ppvResult); |
| 585 | |
| 586 | res = CreateBindCtx(grfOpt, &pbc); |
| 587 | if (SUCCEEDED(res)) |
| 588 | res = IMoniker_BindToObject(pmk, pbc, NULL, riid, ppvResult); |
| 589 | return res; |
| 590 | } |