msvcrt: _Gettnames() should respect user overrides.
[wine.git] / dlls / oledb32 / dslocator.c
blobf530d2e09a2e619e93d05aad7e2fb4abb5eee800
1 /* Data Links
3 * Copyright 2013 Alistair Leslie-Hughes
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include <stdarg.h>
20 #include <string.h>
22 #define COBJMACROS
24 #include "windef.h"
25 #include "winbase.h"
26 #include "objbase.h"
27 #include "oleauto.h"
28 #include "winerror.h"
29 #include "oledb.h"
30 #include "oledberr.h"
31 #include "msdasc.h"
33 #include "oledb_private.h"
35 #include "wine/debug.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(oledb);
40 typedef struct DSLocatorImpl
42 IDataSourceLocator IDataSourceLocator_iface;
43 IDataInitialize IDataInitialize_iface;
44 LONG ref;
46 HWND hwnd;
47 } DSLocatorImpl;
49 static inline DSLocatorImpl *impl_from_IDataSourceLocator( IDataSourceLocator *iface )
51 return CONTAINING_RECORD(iface, DSLocatorImpl, IDataSourceLocator_iface);
54 static inline DSLocatorImpl *impl_from_IDataInitialize(IDataInitialize *iface)
56 return CONTAINING_RECORD(iface, DSLocatorImpl, IDataInitialize_iface);
59 static HRESULT WINAPI dslocator_QueryInterface(IDataSourceLocator *iface, REFIID riid, void **ppvoid)
61 DSLocatorImpl *This = impl_from_IDataSourceLocator(iface);
62 TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid),ppvoid);
64 *ppvoid = NULL;
66 if (IsEqualIID(riid, &IID_IUnknown) ||
67 IsEqualIID(riid, &IID_IDispatch) ||
68 IsEqualIID(riid, &IID_IDataSourceLocator))
70 *ppvoid = &This->IDataSourceLocator_iface;
72 else if (IsEqualIID(riid, &IID_IDataInitialize))
74 *ppvoid = &This->IDataInitialize_iface;
76 else if (IsEqualIID(riid, &IID_IRunnableObject))
78 TRACE("IID_IRunnableObject returning NULL\n");
79 return E_NOINTERFACE;
81 else if (IsEqualIID(riid, &IID_IProvideClassInfo))
83 TRACE("IID_IProvideClassInfo returning NULL\n");
84 return E_NOINTERFACE;
86 else if (IsEqualIID(riid, &IID_IMarshal))
88 TRACE("IID_IMarshal returning NULL\n");
89 return E_NOINTERFACE;
91 else if (IsEqualIID(riid, &IID_IRpcOptions))
93 TRACE("IID_IRpcOptions returning NULL\n");
94 return E_NOINTERFACE;
97 if(*ppvoid)
99 IUnknown_AddRef( (IUnknown*)*ppvoid );
100 return S_OK;
103 FIXME("interface %s not implemented\n", debugstr_guid(riid));
104 return E_NOINTERFACE;
107 static ULONG WINAPI dslocator_AddRef(IDataSourceLocator *iface)
109 DSLocatorImpl *This = impl_from_IDataSourceLocator(iface);
110 TRACE("(%p)->%u\n",This,This->ref);
111 return InterlockedIncrement(&This->ref);
114 static ULONG WINAPI dslocator_Release(IDataSourceLocator *iface)
116 DSLocatorImpl *This = impl_from_IDataSourceLocator(iface);
117 ULONG ref = InterlockedDecrement(&This->ref);
119 TRACE("(%p)->%u\n",This,ref+1);
121 if (!ref)
123 heap_free(This);
126 return ref;
129 static HRESULT WINAPI dslocator_GetTypeInfoCount(IDataSourceLocator *iface, UINT *pctinfo)
131 DSLocatorImpl *This = impl_from_IDataSourceLocator(iface);
133 FIXME("(%p)->()\n", This);
135 return E_NOTIMPL;
138 static HRESULT WINAPI dslocator_GetTypeInfo(IDataSourceLocator *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
140 DSLocatorImpl *This = impl_from_IDataSourceLocator(iface);
142 FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
144 return E_NOTIMPL;
147 static HRESULT WINAPI dslocator_GetIDsOfNames(IDataSourceLocator *iface, REFIID riid, LPOLESTR *rgszNames,
148 UINT cNames, LCID lcid, DISPID *rgDispId)
150 DSLocatorImpl *This = impl_from_IDataSourceLocator(iface);
152 FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
154 return E_NOTIMPL;
157 static HRESULT WINAPI dslocator_Invoke(IDataSourceLocator *iface, DISPID dispIdMember, REFIID riid,
158 LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
160 DSLocatorImpl *This = impl_from_IDataSourceLocator(iface);
162 FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
163 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
165 return E_NOTIMPL;
168 static HRESULT WINAPI dslocator_get_hWnd(IDataSourceLocator *iface, COMPATIBLE_LONG *phwndParent)
170 DSLocatorImpl *This = impl_from_IDataSourceLocator(iface);
172 TRACE("(%p)->(%p)\n",This, phwndParent);
174 *phwndParent = (COMPATIBLE_LONG)This->hwnd;
176 return S_OK;
179 static HRESULT WINAPI dslocator_put_hWnd(IDataSourceLocator *iface, COMPATIBLE_LONG hwndParent)
181 DSLocatorImpl *This = impl_from_IDataSourceLocator(iface);
183 TRACE("(%p)->(%p)\n",This, (HWND)hwndParent);
185 This->hwnd = (HWND)hwndParent;
187 return S_OK;
190 static HRESULT WINAPI dslocator_PromptNew(IDataSourceLocator *iface, IDispatch **ppADOConnection)
192 DSLocatorImpl *This = impl_from_IDataSourceLocator(iface);
194 FIXME("(%p)->(%p)\n",This, ppADOConnection);
196 return E_NOTIMPL;
199 static HRESULT WINAPI dslocator_PromptEdit(IDataSourceLocator *iface, IDispatch **ppADOConnection, VARIANT_BOOL *success)
201 DSLocatorImpl *This = impl_from_IDataSourceLocator(iface);
203 FIXME("(%p)->(%p %p)\n",This, ppADOConnection, success);
205 return E_NOTIMPL;
208 static const IDataSourceLocatorVtbl DSLocatorVtbl =
210 dslocator_QueryInterface,
211 dslocator_AddRef,
212 dslocator_Release,
213 dslocator_GetTypeInfoCount,
214 dslocator_GetTypeInfo,
215 dslocator_GetIDsOfNames,
216 dslocator_Invoke,
217 dslocator_get_hWnd,
218 dslocator_put_hWnd,
219 dslocator_PromptNew,
220 dslocator_PromptEdit
223 static HRESULT WINAPI datainitialize_QueryInterface(IDataInitialize *iface, REFIID riid, void **obj)
225 DSLocatorImpl *This = impl_from_IDataInitialize(iface);
226 return IDataSourceLocator_QueryInterface(&This->IDataSourceLocator_iface, riid, obj);
229 static ULONG WINAPI datainitialize_AddRef(IDataInitialize *iface)
231 DSLocatorImpl *This = impl_from_IDataInitialize(iface);
232 return IDataSourceLocator_AddRef(&This->IDataSourceLocator_iface);
235 static ULONG WINAPI datainitialize_Release(IDataInitialize *iface)
237 DSLocatorImpl *This = impl_from_IDataInitialize(iface);
238 return IDataSourceLocator_Release(&This->IDataSourceLocator_iface);
241 static HRESULT WINAPI datainitialize_GetDataSource(IDataInitialize *iface,
242 IUnknown *outer, DWORD context, LPWSTR initstring, REFIID riid, IUnknown **datasource)
244 TRACE("(%p)->(%p %#x %s %s %p)\n", iface, outer, context, debugstr_w(initstring), debugstr_guid(riid),
245 datasource);
247 return get_data_source(outer, context, initstring, riid, datasource);
250 static HRESULT WINAPI datainitialize_GetInitializationString(IDataInitialize *iface, IUnknown *datasource,
251 boolean include_password, LPWSTR *initstring)
253 FIXME("(%p)->(%d %p): stub\n", iface, include_password, initstring);
254 return E_NOTIMPL;
257 static HRESULT WINAPI datainitialize_CreateDBInstance(IDataInitialize *iface, REFCLSID prov, IUnknown *outer,
258 DWORD clsctx, LPWSTR reserved, REFIID riid, IUnknown **datasource)
260 FIXME("(%p)->(%s %p %#x %p %s %p): stub\n", iface, debugstr_guid(prov), outer, clsctx, reserved,
261 debugstr_guid(riid), datasource);
262 return E_NOTIMPL;
265 static HRESULT WINAPI datainitialize_CreateDBInstanceEx(IDataInitialize *iface, REFCLSID prov, IUnknown *outer,
266 DWORD clsctx, LPWSTR reserved, COSERVERINFO *server_info, DWORD cmq, MULTI_QI *results)
268 FIXME("(%p)->(%s %p %#x %p %p %u %p): stub\n", iface, debugstr_guid(prov), outer, clsctx, reserved,
269 server_info, cmq, results);
270 return E_NOTIMPL;
273 static HRESULT WINAPI datainitialize_LoadStringFromStorage(IDataInitialize *iface, LPWSTR filename, LPWSTR *initstring)
275 FIXME("(%p)->(%s %p): stub\n", iface, debugstr_w(filename), initstring);
276 return E_NOTIMPL;
279 static HRESULT WINAPI datainitialize_WriteStringToStorage(IDataInitialize *iface, LPWSTR filename, LPWSTR initstring,
280 DWORD disposition)
282 FIXME("(%p)->(%s %s %#x): stub\n", iface, debugstr_w(filename), debugstr_w(initstring), disposition);
283 return E_NOTIMPL;
286 static const IDataInitializeVtbl ds_datainitialize_vtbl =
288 datainitialize_QueryInterface,
289 datainitialize_AddRef,
290 datainitialize_Release,
291 datainitialize_GetDataSource,
292 datainitialize_GetInitializationString,
293 datainitialize_CreateDBInstance,
294 datainitialize_CreateDBInstanceEx,
295 datainitialize_LoadStringFromStorage,
296 datainitialize_WriteStringToStorage,
299 HRESULT create_dslocator(IUnknown *outer, void **obj)
301 DSLocatorImpl *This;
303 TRACE("(%p, %p)\n", outer, obj);
305 *obj = NULL;
307 if(outer) return CLASS_E_NOAGGREGATION;
309 This = heap_alloc(sizeof(*This));
310 if(!This) return E_OUTOFMEMORY;
312 This->IDataSourceLocator_iface.lpVtbl = &DSLocatorVtbl;
313 This->IDataInitialize_iface.lpVtbl = &ds_datainitialize_vtbl;
314 This->ref = 1;
315 This->hwnd = 0;
317 *obj = &This->IDataSourceLocator_iface;
319 return S_OK;