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");
81 else if (IsEqualIID(riid
, &IID_IProvideClassInfo
))
83 TRACE("IID_IProvideClassInfo returning NULL\n");
86 else if (IsEqualIID(riid
, &IID_IMarshal
))
88 TRACE("IID_IMarshal returning NULL\n");
91 else if (IsEqualIID(riid
, &IID_IRpcOptions
))
93 TRACE("IID_IRpcOptions returning NULL\n");
99 IUnknown_AddRef( (IUnknown
*)*ppvoid
);
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);
129 static HRESULT WINAPI
dslocator_GetTypeInfoCount(IDataSourceLocator
*iface
, UINT
*pctinfo
)
131 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
133 FIXME("(%p)->()\n", This
);
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
);
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
);
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
);
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
;
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
;
190 static HRESULT WINAPI
dslocator_PromptNew(IDataSourceLocator
*iface
, IDispatch
**ppADOConnection
)
192 DSLocatorImpl
*This
= impl_from_IDataSourceLocator(iface
);
194 FIXME("(%p)->(%p)\n",This
, ppADOConnection
);
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
);
208 static const IDataSourceLocatorVtbl DSLocatorVtbl
=
210 dslocator_QueryInterface
,
213 dslocator_GetTypeInfoCount
,
214 dslocator_GetTypeInfo
,
215 dslocator_GetIDsOfNames
,
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
),
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
);
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
);
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
);
273 static HRESULT WINAPI
datainitialize_LoadStringFromStorage(IDataInitialize
*iface
, LPWSTR filename
, LPWSTR
*initstring
)
275 FIXME("(%p)->(%s %p): stub\n", iface
, debugstr_w(filename
), initstring
);
279 static HRESULT WINAPI
datainitialize_WriteStringToStorage(IDataInitialize
*iface
, LPWSTR filename
, LPWSTR initstring
,
282 FIXME("(%p)->(%s %s %#x): stub\n", iface
, debugstr_w(filename
), debugstr_w(initstring
), disposition
);
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
)
303 TRACE("(%p, %p)\n", outer
, obj
);
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
;
317 *obj
= &This
->IDataSourceLocator_iface
;