2 * Implementation of CLSID_SystemDeviceEnum.
4 * FIXME - not tested enough.
6 * hidenori@a2.ctktv.ne.jp
19 #include "debugtools.h"
20 DEFAULT_DEBUG_CHANNEL(quartz);
22 #include "quartz_private.h"
30 /***************************************************************************
32 * new/delete for CLSID_SystemDeviceEnum
36 /* can I use offsetof safely? - FIXME? */
37 static QUARTZ_IFEntry IFEntries[] =
39 { &IID_ICreateDevEnum, offsetof(CSysDevEnum,createdevenum)-offsetof(CSysDevEnum,unk) },
43 static void QUARTZ_DestroySystemDeviceEnum(IUnknown* punk)
45 CSysDevEnum_THIS(punk,unk);
47 CSysDevEnum_UninitICreateDevEnum( This );
50 HRESULT QUARTZ_CreateSystemDeviceEnum(IUnknown* punkOuter,void** ppobj)
55 TRACE("(%p,%p)\n",punkOuter,ppobj);
57 psde = (CSysDevEnum*)QUARTZ_AllocObj( sizeof(CSysDevEnum) );
61 QUARTZ_IUnkInit( &psde->unk, punkOuter );
63 hr = CSysDevEnum_InitICreateDevEnum( psde );
66 QUARTZ_FreeObj( psde );
70 psde->unk.pEntries = IFEntries;
71 psde->unk.dwEntries = sizeof(IFEntries)/sizeof(IFEntries[0]);
72 psde->unk.pOnFinalRelease = QUARTZ_DestroySystemDeviceEnum;
74 *ppobj = (void*)(&psde->unk);
80 /***************************************************************************
82 * CSysDevEnum::ICreateDevEnum
88 ICreateDevEnum_fnQueryInterface(ICreateDevEnum* iface,REFIID riid,void** ppobj)
90 CSysDevEnum_THIS(iface,createdevenum);
92 TRACE("(%p)->()\n",This);
94 return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj);
98 ICreateDevEnum_fnAddRef(ICreateDevEnum* iface)
100 CSysDevEnum_THIS(iface,createdevenum);
102 TRACE("(%p)->()\n",This);
104 return IUnknown_AddRef(This->unk.punkControl);
108 ICreateDevEnum_fnRelease(ICreateDevEnum* iface)
110 CSysDevEnum_THIS(iface,createdevenum);
112 TRACE("(%p)->()\n",This);
114 return IUnknown_Release(This->unk.punkControl);
117 static HRESULT WINAPI
118 ICreateDevEnum_fnCreateClassEnumerator(ICreateDevEnum* iface,REFCLSID rclsidDeviceClass,IEnumMoniker** ppobj, DWORD dwFlags)
120 CSysDevEnum_THIS(iface,createdevenum);
123 QUARTZ_CompList* pMonList;
127 WCHAR wszPath[ 1024 ];
131 FILETIME ftLastWrite;
133 TRACE("(%p)->(%s,%p,%08lx)\n",This,
134 debugstr_guid(rclsidDeviceClass),ppobj,dwFlags);
137 FIXME("unknown flags %08lx\n",dwFlags);
145 hr = QUARTZ_CreateCLSIDPath(
146 wszPath, sizeof(wszPath)/sizeof(wszPath[0]),
147 rclsidDeviceClass, QUARTZ_wszInstance );
151 if ( RegOpenKeyExW( HKEY_CLASSES_ROOT, wszPath,
152 0, KEY_READ, &hKey ) != ERROR_SUCCESS )
155 dwLen = lstrlenW(wszPath);
156 wszPath[dwLen++] = '\\'; wszPath[dwLen] = 0;
157 dwNameMax = sizeof(wszPath)/sizeof(wszPath[0]) - dwLen - 8;
159 pMonList = QUARTZ_CompList_Alloc();
160 if ( pMonList == NULL )
166 /* enumerate all subkeys. */
172 hKey, dwIndex, &wszPath[dwLen], &cbName,
173 NULL, NULL, NULL, &ftLastWrite );
174 if ( lr == ERROR_NO_MORE_ITEMS )
176 if ( lr != ERROR_SUCCESS )
182 hr = QUARTZ_CreateDeviceMoniker(
183 HKEY_CLASSES_ROOT, wszPath, &pMon );
187 hr = QUARTZ_CompList_AddComp(
188 pMonList, (IUnknown*)pMon, NULL, 0 );
189 IMoniker_Release( pMon );
197 /* create an enumerator. */
198 hr = QUARTZ_CreateEnumUnknown(
199 &IID_IEnumMoniker, (void**)ppobj, pMonList );
205 if ( pMonList != NULL )
206 QUARTZ_CompList_Free( pMonList );
212 static ICOM_VTABLE(ICreateDevEnum) icreatedevenum =
214 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
215 /* IUnknown fields */
216 ICreateDevEnum_fnQueryInterface,
217 ICreateDevEnum_fnAddRef,
218 ICreateDevEnum_fnRelease,
219 /* ICreateDevEnum fields */
220 ICreateDevEnum_fnCreateClassEnumerator,
223 HRESULT CSysDevEnum_InitICreateDevEnum( CSysDevEnum* psde )
225 TRACE("(%p)\n",psde);
226 ICOM_VTBL(&psde->createdevenum) = &icreatedevenum;
231 void CSysDevEnum_UninitICreateDevEnum( CSysDevEnum* psde )
233 TRACE("(%p)\n",psde);