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"
37 WINE_DEFAULT_DEBUG_CHANNEL(oledb
);
40 typedef struct DSLocatorImpl
42 IDataSourceLocator IDataSourceLocator_iface
;
43 IDataInitialize IDataInitialize_iface
;
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
);
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");
84 IUnknown_AddRef( (IUnknown
*)*ppvoid
);
88 FIXME("interface %s not implemented\n", debugstr_guid(riid
));
92 static ULONG WINAPI
dslocator_AddRef(IDataSourceLocator
*iface
)
94 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
95 TRACE("(%p)->%u\n",This
,This
->ref
);
96 return InterlockedIncrement(&This
->ref
);
99 static ULONG WINAPI
dslocator_Release(IDataSourceLocator
*iface
)
101 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
102 ULONG ref
= InterlockedDecrement(&This
->ref
);
104 TRACE("(%p)->%u\n",This
,ref
+1);
114 static HRESULT WINAPI
dslocator_GetTypeInfoCount(IDataSourceLocator
*iface
, UINT
*pctinfo
)
116 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
118 FIXME("(%p)->()\n", This
);
123 static HRESULT WINAPI
dslocator_GetTypeInfo(IDataSourceLocator
*iface
, UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
125 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
127 FIXME("(%p)->(%u %u %p)\n", This
, iTInfo
, lcid
, ppTInfo
);
132 static HRESULT WINAPI
dslocator_GetIDsOfNames(IDataSourceLocator
*iface
, REFIID riid
, LPOLESTR
*rgszNames
,
133 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
135 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
137 FIXME("(%p)->(%s %p %u %u %p)\n", This
, debugstr_guid(riid
), rgszNames
, cNames
, lcid
, rgDispId
);
142 static HRESULT WINAPI
dslocator_Invoke(IDataSourceLocator
*iface
, DISPID dispIdMember
, REFIID riid
,
143 LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
145 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
147 FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This
, dispIdMember
, debugstr_guid(riid
),
148 lcid
, wFlags
, pDispParams
, pVarResult
, pExcepInfo
, puArgErr
);
153 static HRESULT WINAPI
dslocator_get_hWnd(IDataSourceLocator
*iface
, COMPATIBLE_LONG
*phwndParent
)
155 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
157 TRACE("(%p)->(%p)\n",This
, phwndParent
);
159 *phwndParent
= (COMPATIBLE_LONG
)This
->hwnd
;
164 static HRESULT WINAPI
dslocator_put_hWnd(IDataSourceLocator
*iface
, COMPATIBLE_LONG hwndParent
)
166 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
168 TRACE("(%p)->(%p)\n",This
, (HWND
)hwndParent
);
170 This
->hwnd
= (HWND
)hwndParent
;
175 static HRESULT WINAPI
dslocator_PromptNew(IDataSourceLocator
*iface
, IDispatch
**ppADOConnection
)
177 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
179 FIXME("(%p)->(%p)\n",This
, ppADOConnection
);
184 static HRESULT WINAPI
dslocator_PromptEdit(IDataSourceLocator
*iface
, IDispatch
**ppADOConnection
, VARIANT_BOOL
*success
)
186 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
188 FIXME("(%p)->(%p %p)\n",This
, ppADOConnection
, success
);
193 static const IDataSourceLocatorVtbl DSLocatorVtbl
=
195 dslocator_QueryInterface
,
198 dslocator_GetTypeInfoCount
,
199 dslocator_GetTypeInfo
,
200 dslocator_GetIDsOfNames
,
208 static HRESULT WINAPI
datainitialize_QueryInterface(IDataInitialize
*iface
, REFIID riid
, void **obj
)
210 DSLocatorImpl
*This
= impl_from_IDataInitialize(iface
);
211 return IDataSourceLocator_QueryInterface(&This
->IDataSourceLocator_iface
, riid
, obj
);
214 static ULONG WINAPI
datainitialize_AddRef(IDataInitialize
*iface
)
216 DSLocatorImpl
*This
= impl_from_IDataInitialize(iface
);
217 return IDataSourceLocator_AddRef(&This
->IDataSourceLocator_iface
);
220 static ULONG WINAPI
datainitialize_Release(IDataInitialize
*iface
)
222 DSLocatorImpl
*This
= impl_from_IDataInitialize(iface
);
223 return IDataSourceLocator_Release(&This
->IDataSourceLocator_iface
);
226 static HRESULT WINAPI
datainitialize_GetDataSource(IDataInitialize
*iface
,
227 IUnknown
*outer
, DWORD context
, LPWSTR initstring
, REFIID riid
, IUnknown
**datasource
)
229 TRACE("(%p)->(%p %#x %s %s %p)\n", iface
, outer
, context
, debugstr_w(initstring
), debugstr_guid(riid
),
232 return get_data_source(outer
, context
, initstring
, riid
, datasource
);
235 static HRESULT WINAPI
datainitialize_GetInitializationString(IDataInitialize
*iface
, IUnknown
*datasource
,
236 boolean include_password
, LPWSTR
*initstring
)
238 FIXME("(%p)->(%d %p): stub\n", iface
, include_password
, initstring
);
242 static HRESULT WINAPI
datainitialize_CreateDBInstance(IDataInitialize
*iface
, REFCLSID prov
, IUnknown
*outer
,
243 DWORD clsctx
, LPWSTR reserved
, REFIID riid
, IUnknown
**datasource
)
245 FIXME("(%p)->(%s %p %#x %p %s %p): stub\n", iface
, debugstr_guid(prov
), outer
, clsctx
, reserved
,
246 debugstr_guid(riid
), datasource
);
250 static HRESULT WINAPI
datainitialize_CreateDBInstanceEx(IDataInitialize
*iface
, REFCLSID prov
, IUnknown
*outer
,
251 DWORD clsctx
, LPWSTR reserved
, COSERVERINFO
*server_info
, DWORD cmq
, MULTI_QI
*results
)
253 FIXME("(%p)->(%s %p %#x %p %p %u %p): stub\n", iface
, debugstr_guid(prov
), outer
, clsctx
, reserved
,
254 server_info
, cmq
, results
);
258 static HRESULT WINAPI
datainitialize_LoadStringFromStorage(IDataInitialize
*iface
, LPWSTR filename
, LPWSTR
*initstring
)
260 FIXME("(%p)->(%s %p): stub\n", iface
, debugstr_w(filename
), initstring
);
264 static HRESULT WINAPI
datainitialize_WriteStringToStorage(IDataInitialize
*iface
, LPWSTR filename
, LPWSTR initstring
,
267 FIXME("(%p)->(%s %s %#x): stub\n", iface
, debugstr_w(filename
), debugstr_w(initstring
), disposition
);
271 static const IDataInitializeVtbl ds_datainitialize_vtbl
=
273 datainitialize_QueryInterface
,
274 datainitialize_AddRef
,
275 datainitialize_Release
,
276 datainitialize_GetDataSource
,
277 datainitialize_GetInitializationString
,
278 datainitialize_CreateDBInstance
,
279 datainitialize_CreateDBInstanceEx
,
280 datainitialize_LoadStringFromStorage
,
281 datainitialize_WriteStringToStorage
,
284 HRESULT
create_dslocator(IUnknown
*outer
, void **obj
)
288 TRACE("(%p, %p)\n", outer
, obj
);
292 if(outer
) return CLASS_E_NOAGGREGATION
;
294 This
= heap_alloc(sizeof(*This
));
295 if(!This
) return E_OUTOFMEMORY
;
297 This
->IDataSourceLocator_iface
.lpVtbl
= &DSLocatorVtbl
;
298 This
->IDataInitialize_iface
.lpVtbl
= &ds_datainitialize_vtbl
;
302 *obj
= &This
->IDataSourceLocator_iface
;