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
33 #include "oledb_private.h"
35 #include "wine/debug.h"
36 #include "wine/heap.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(oledb
);
41 typedef struct DSLocatorImpl
43 IDataSourceLocator IDataSourceLocator_iface
;
44 IDataInitialize IDataInitialize_iface
;
50 static inline DSLocatorImpl
*impl_from_IDataSourceLocator( IDataSourceLocator
*iface
)
52 return CONTAINING_RECORD(iface
, DSLocatorImpl
, IDataSourceLocator_iface
);
55 static inline DSLocatorImpl
*impl_from_IDataInitialize(IDataInitialize
*iface
)
57 return CONTAINING_RECORD(iface
, DSLocatorImpl
, IDataInitialize_iface
);
60 static HRESULT WINAPI
dslocator_QueryInterface(IDataSourceLocator
*iface
, REFIID riid
, void **ppvoid
)
62 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
63 TRACE("(%p)->(%s, %p)\n", This
, debugstr_guid(riid
),ppvoid
);
67 if (IsEqualIID(riid
, &IID_IUnknown
) ||
68 IsEqualIID(riid
, &IID_IDispatch
) ||
69 IsEqualIID(riid
, &IID_IDataSourceLocator
))
71 *ppvoid
= &This
->IDataSourceLocator_iface
;
73 else if (IsEqualIID(riid
, &IID_IDataInitialize
))
75 *ppvoid
= &This
->IDataInitialize_iface
;
77 else if (IsEqualIID(riid
, &IID_IRunnableObject
))
79 TRACE("IID_IRunnableObject returning NULL\n");
82 else if (IsEqualIID(riid
, &IID_IProvideClassInfo
))
84 TRACE("IID_IProvideClassInfo returning NULL\n");
87 else if (IsEqualIID(riid
, &IID_IMarshal
))
89 TRACE("IID_IMarshal returning NULL\n");
92 else if (IsEqualIID(riid
, &IID_IRpcOptions
))
94 TRACE("IID_IRpcOptions returning NULL\n");
100 IUnknown_AddRef( (IUnknown
*)*ppvoid
);
104 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
105 return E_NOINTERFACE
;
108 static ULONG WINAPI
dslocator_AddRef(IDataSourceLocator
*iface
)
110 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
111 TRACE("(%p)->%u\n",This
,This
->ref
);
112 return InterlockedIncrement(&This
->ref
);
115 static ULONG WINAPI
dslocator_Release(IDataSourceLocator
*iface
)
117 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
118 ULONG ref
= InterlockedDecrement(&This
->ref
);
120 TRACE("(%p)->%u\n",This
,ref
+1);
130 static HRESULT WINAPI
dslocator_GetTypeInfoCount(IDataSourceLocator
*iface
, UINT
*pctinfo
)
132 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
134 FIXME("(%p)->()\n", This
);
139 static HRESULT WINAPI
dslocator_GetTypeInfo(IDataSourceLocator
*iface
, UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
141 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
143 FIXME("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
148 static HRESULT WINAPI
dslocator_GetIDsOfNames(IDataSourceLocator
*iface
, REFIID riid
, LPOLESTR
*rgszNames
,
149 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
151 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
153 FIXME("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
, lcid
, rgDispId
);
158 static HRESULT WINAPI
dslocator_Invoke(IDataSourceLocator
*iface
, DISPID dispIdMember
, REFIID riid
,
159 LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
161 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
163 FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
164 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
169 static HRESULT WINAPI
dslocator_get_hWnd(IDataSourceLocator
*iface
, COMPATIBLE_LONG
*phwndParent
)
171 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
173 TRACE("(%p)->(%p)\n",This
, phwndParent
);
175 *phwndParent
= (COMPATIBLE_LONG
)This
->hwnd
;
180 static HRESULT WINAPI
dslocator_put_hWnd(IDataSourceLocator
*iface
, COMPATIBLE_LONG hwndParent
)
182 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
184 TRACE("(%p)->(%p)\n",This
, (HWND
)hwndParent
);
186 This
->hwnd
= (HWND
)hwndParent
;
191 static HRESULT WINAPI
dslocator_PromptNew(IDataSourceLocator
*iface
, IDispatch
**ppADOConnection
)
193 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
195 FIXME("(%p)->(%p)\n",This
, ppADOConnection
);
200 static HRESULT WINAPI
dslocator_PromptEdit(IDataSourceLocator
*iface
, IDispatch
**ppADOConnection
, VARIANT_BOOL
*success
)
202 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
204 FIXME("(%p)->(%p %p)\n",This
, ppADOConnection
, success
);
209 static const IDataSourceLocatorVtbl DSLocatorVtbl
=
211 dslocator_QueryInterface
,
214 dslocator_GetTypeInfoCount
,
215 dslocator_GetTypeInfo
,
216 dslocator_GetIDsOfNames
,
224 static HRESULT WINAPI
datainitialize_QueryInterface(IDataInitialize
*iface
, REFIID riid
, void **obj
)
226 DSLocatorImpl
*This
= impl_from_IDataInitialize(iface
);
227 return IDataSourceLocator_QueryInterface(&This
->IDataSourceLocator_iface
, riid
, obj
);
230 static ULONG WINAPI
datainitialize_AddRef(IDataInitialize
*iface
)
232 DSLocatorImpl
*This
= impl_from_IDataInitialize(iface
);
233 return IDataSourceLocator_AddRef(&This
->IDataSourceLocator_iface
);
236 static ULONG WINAPI
datainitialize_Release(IDataInitialize
*iface
)
238 DSLocatorImpl
*This
= impl_from_IDataInitialize(iface
);
239 return IDataSourceLocator_Release(&This
->IDataSourceLocator_iface
);
242 static HRESULT WINAPI
datainitialize_GetDataSource(IDataInitialize
*iface
,
243 IUnknown
*outer
, DWORD context
, LPWSTR initstring
, REFIID riid
, IUnknown
**datasource
)
245 TRACE("(%p)->(%p %#x %s %s %p)\n", iface
, outer
, context
, debugstr_w(initstring
), debugstr_guid(riid
),
248 return get_data_source(outer
, context
, initstring
, riid
, datasource
);
251 static HRESULT WINAPI
datainitialize_GetInitializationString(IDataInitialize
*iface
, IUnknown
*datasource
,
252 boolean include_password
, LPWSTR
*initstring
)
254 FIXME("(%p)->(%d %p): stub\n", iface
, include_password
, initstring
);
258 static HRESULT WINAPI
datainitialize_CreateDBInstance(IDataInitialize
*iface
, REFCLSID prov
, IUnknown
*outer
,
259 DWORD clsctx
, LPWSTR reserved
, REFIID riid
, IUnknown
**datasource
)
261 FIXME("(%p)->(%s %p %#x %p %s %p): stub\n", iface
, debugstr_guid(prov
), outer
, clsctx
, reserved
,
262 debugstr_guid(riid
), datasource
);
266 static HRESULT WINAPI
datainitialize_CreateDBInstanceEx(IDataInitialize
*iface
, REFCLSID prov
, IUnknown
*outer
,
267 DWORD clsctx
, LPWSTR reserved
, COSERVERINFO
*server_info
, DWORD cmq
, MULTI_QI
*results
)
269 FIXME("(%p)->(%s %p %#x %p %p %u %p): stub\n", iface
, debugstr_guid(prov
), outer
, clsctx
, reserved
,
270 server_info
, cmq
, results
);
274 static HRESULT WINAPI
datainitialize_LoadStringFromStorage(IDataInitialize
*iface
, LPWSTR filename
, LPWSTR
*initstring
)
276 FIXME("(%p)->(%s %p): stub\n", iface
, debugstr_w(filename
), initstring
);
280 static HRESULT WINAPI
datainitialize_WriteStringToStorage(IDataInitialize
*iface
, LPWSTR filename
, LPWSTR initstring
,
283 FIXME("(%p)->(%s %s %#x): stub\n", iface
, debugstr_w(filename
), debugstr_w(initstring
), disposition
);
287 static const IDataInitializeVtbl ds_datainitialize_vtbl
=
289 datainitialize_QueryInterface
,
290 datainitialize_AddRef
,
291 datainitialize_Release
,
292 datainitialize_GetDataSource
,
293 datainitialize_GetInitializationString
,
294 datainitialize_CreateDBInstance
,
295 datainitialize_CreateDBInstanceEx
,
296 datainitialize_LoadStringFromStorage
,
297 datainitialize_WriteStringToStorage
,
300 HRESULT
create_dslocator(IUnknown
*outer
, void **obj
)
304 TRACE("(%p, %p)\n", outer
, obj
);
308 if(outer
) return CLASS_E_NOAGGREGATION
;
310 This
= heap_alloc(sizeof(*This
));
311 if(!This
) return E_OUTOFMEMORY
;
313 This
->IDataSourceLocator_iface
.lpVtbl
= &DSLocatorVtbl
;
314 This
->IDataInitialize_iface
.lpVtbl
= &ds_datainitialize_vtbl
;
318 *obj
= &This
->IDataSourceLocator_iface
;