2 * Copyright (C) 2012 Alistair Leslie-Hughes
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #define NONAMELESSUNION
22 #define NONAMELESSSTRUCT
31 #include "oledb_private.h"
33 #include "wine/debug.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(oledb);
38 typedef struct datainit
40 IDataInitialize IDataInitialize_iface;
45 static inline datainit *impl_from_IDataInitialize(IDataInitialize *iface)
47 return CONTAINING_RECORD(iface, datainit, IDataInitialize_iface);
52 IDBInitialize IDBInitialize_iface;
53 IDBProperties IDBProperties_iface;
58 static inline dbinit *impl_from_IDBInitialize(IDBInitialize *iface)
60 return CONTAINING_RECORD(iface, dbinit, IDBInitialize_iface);
63 static inline dbinit *impl_from_IDBProperties(IDBProperties *iface)
65 return CONTAINING_RECORD(iface, dbinit, IDBProperties_iface);
68 static HRESULT WINAPI dbprops_QueryInterface(IDBProperties *iface, REFIID riid, void **ppvObject)
70 dbinit *This = impl_from_IDBProperties(iface);
72 return IDBInitialize_QueryInterface(&This->IDBInitialize_iface, riid, ppvObject);
75 static ULONG WINAPI dbprops_AddRef(IDBProperties *iface)
77 dbinit *This = impl_from_IDBProperties(iface);
79 return IDBInitialize_AddRef(&This->IDBInitialize_iface);
82 static ULONG WINAPI dbprops_Release(IDBProperties *iface)
84 dbinit *This = impl_from_IDBProperties(iface);
86 return IDBInitialize_Release(&This->IDBInitialize_iface);
89 static HRESULT WINAPI dbprops_GetProperties(IDBProperties *iface, ULONG cPropertyIDSets,
90 const DBPROPIDSET rgPropertyIDSets[], ULONG *pcPropertySets, DBPROPSET **prgPropertySets)
92 dbinit *This = impl_from_IDBProperties(iface);
94 FIXME("(%p)->(%d %p %p %p)\n", This, cPropertyIDSets, rgPropertyIDSets, pcPropertySets, prgPropertySets);
99 static HRESULT WINAPI dbprops_GetPropertyInfo(IDBProperties *iface, ULONG cPropertyIDSets,
100 const DBPROPIDSET rgPropertyIDSets[], ULONG *pcPropertyInfoSets,
101 DBPROPINFOSET **prgPropertyInfoSets, OLECHAR **ppDescBuffer)
103 dbinit *This = impl_from_IDBProperties(iface);
105 FIXME("(%p)->(%d %p %p %p %p)\n", This, cPropertyIDSets, rgPropertyIDSets, pcPropertyInfoSets,
106 prgPropertyInfoSets, ppDescBuffer);
111 static HRESULT WINAPI dbprops_SetProperties(IDBProperties *iface, ULONG cPropertySets,
112 DBPROPSET rgPropertySets[])
114 dbinit *This = impl_from_IDBProperties(iface);
116 FIXME("(%p)->(%d %p)\n", This, cPropertySets, rgPropertySets);
121 static const struct IDBPropertiesVtbl dbprops_vtbl =
123 dbprops_QueryInterface,
126 dbprops_GetProperties,
127 dbprops_GetPropertyInfo,
128 dbprops_SetProperties
131 static HRESULT WINAPI dbinit_QueryInterface(IDBInitialize *iface, REFIID riid, void **obj)
133 dbinit *This = impl_from_IDBInitialize(iface);
134 TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), obj);
138 if(IsEqualIID(riid, &IID_IUnknown) ||
139 IsEqualIID(riid, &IID_IDBInitialize))
143 else if(IsEqualIID(riid, &IID_IDBProperties))
145 *obj = &This->IDBProperties_iface;
149 FIXME("interface %s not implemented\n", debugstr_guid(riid));
150 return E_NOINTERFACE;
153 IDBInitialize_AddRef(iface);
157 static ULONG WINAPI dbinit_AddRef(IDBInitialize *iface)
159 dbinit *This = impl_from_IDBInitialize(iface);
160 TRACE("(%p)\n", This);
162 return InterlockedIncrement(&This->ref);
165 static ULONG WINAPI dbinit_Release(IDBInitialize *iface)
167 dbinit *This = impl_from_IDBInitialize(iface);
170 TRACE("(%p)\n", This);
172 ref = InterlockedDecrement(&This->ref);
175 HeapFree(GetProcessHeap(), 0, This);
181 static HRESULT WINAPI dbinit_Initialize(IDBInitialize *iface)
183 dbinit *This = impl_from_IDBInitialize(iface);
185 FIXME("(%p) stub\n", This);
190 static HRESULT WINAPI dbinit_Uninitialize(IDBInitialize *iface)
192 dbinit *This = impl_from_IDBInitialize(iface);
194 FIXME("(%p) stub\n", This);
199 static const IDBInitializeVtbl dbinit_vtbl =
201 dbinit_QueryInterface,
208 static HRESULT create_db_init(void **obj)
216 This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
217 if(!This) return E_OUTOFMEMORY;
219 This->IDBInitialize_iface.lpVtbl = &dbinit_vtbl;
220 This->IDBProperties_iface.lpVtbl = &dbprops_vtbl;
223 *obj = &This->IDBInitialize_iface;
228 static HRESULT WINAPI datainit_QueryInterface(IDataInitialize *iface, REFIID riid, void **obj)
230 datainit *This = impl_from_IDataInitialize(iface);
231 TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), obj);
235 if(IsEqualIID(riid, &IID_IUnknown) ||
236 IsEqualIID(riid, &IID_IDataInitialize))
238 *obj = &This->IDataInitialize_iface;
242 FIXME("interface %s not implemented\n", debugstr_guid(riid));
243 return E_NOINTERFACE;
246 IDataInitialize_AddRef(iface);
250 static ULONG WINAPI datainit_AddRef(IDataInitialize *iface)
252 datainit *This = impl_from_IDataInitialize(iface);
253 TRACE("(%p)\n", This);
255 return InterlockedIncrement(&This->ref);
258 static ULONG WINAPI datainit_Release(IDataInitialize *iface)
260 datainit *This = impl_from_IDataInitialize(iface);
263 TRACE("(%p)\n", This);
265 ref = InterlockedDecrement(&This->ref);
268 HeapFree(GetProcessHeap(), 0, This);
274 /*** IDataInitialize methods ***/
275 static HRESULT WINAPI datainit_GetDataSource(IDataInitialize *iface, IUnknown *pUnkOuter, DWORD dwClsCtx,
276 LPWSTR pwszInitializationString, REFIID riid, IUnknown **ppDataSource)
278 datainit *This = impl_from_IDataInitialize(iface);
280 FIXME("(%p)->(%p %d %s %s %p)\n", This, pUnkOuter, dwClsCtx, debugstr_w(pwszInitializationString),
281 debugstr_guid(riid), ppDataSource);
283 if(IsEqualIID(riid, &IID_IDBInitialize))
285 return create_db_init( (LPVOID*)ppDataSource);
291 static HRESULT WINAPI datainit_GetInitializationString(IDataInitialize *iface, IUnknown *pDataSource,
292 boolean fIncludePassword, LPWSTR *ppwszInitString)
294 datainit *This = impl_from_IDataInitialize(iface);
296 FIXME("(%p)->(%p %d %p)\n", This, pDataSource, fIncludePassword, ppwszInitString);
301 static HRESULT WINAPI datainit_CreateDBInstance(IDataInitialize *iface, REFCLSID clsidProvider,
302 IUnknown *pUnkOuter, DWORD dwClsCtx, LPWSTR pwszReserved, REFIID riid,
303 IUnknown **ppDataSource)
305 datainit *This = impl_from_IDataInitialize(iface);
307 FIXME("(%p)->()\n", This);
312 static HRESULT WINAPI datainit_RemoteCreateDBInstanceEx(IDataInitialize *iface, REFCLSID clsidProvider,
313 IUnknown *pUnkOuter, DWORD dwClsCtx, LPWSTR pwszReserved, COSERVERINFO *pServerInfo,
314 DWORD cmq, GUID **rgpIID, IUnknown **rgpItf, HRESULT *rghr)
316 datainit *This = impl_from_IDataInitialize(iface);
318 FIXME("(%p)->()\n", This);
323 static HRESULT WINAPI datainit_LoadStringFromStorage(IDataInitialize *iface, LPWSTR pwszFileName,
324 LPWSTR *ppwszInitializationString)
326 datainit *This = impl_from_IDataInitialize(iface);
328 FIXME("(%p)->(%s %p)\n", This, debugstr_w(pwszFileName), ppwszInitializationString);
333 static HRESULT WINAPI datainit_WriteStringToStorage(IDataInitialize *iface, LPWSTR pwszFileName,
334 LPWSTR pwszInitializationString, DWORD dwCreationDisposition)
336 datainit *This = impl_from_IDataInitialize(iface);
338 FIXME("(%p)->(%s %s %d)\n", This, debugstr_w(pwszFileName), debugstr_w(pwszInitializationString), dwCreationDisposition);
344 static const struct IDataInitializeVtbl datainit_vtbl =
346 datainit_QueryInterface,
349 datainit_GetDataSource,
350 datainit_GetInitializationString,
351 datainit_CreateDBInstance,
352 datainit_RemoteCreateDBInstanceEx,
353 datainit_LoadStringFromStorage,
354 datainit_WriteStringToStorage
357 HRESULT create_data_init(IUnknown *outer, void **obj)
361 TRACE("(%p)\n", obj);
363 if(outer) return CLASS_E_NOAGGREGATION;
367 This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
368 if(!This) return E_OUTOFMEMORY;
370 This->IDataInitialize_iface.lpVtbl = &datainit_vtbl;
373 *obj = &This->IDataInitialize_iface;