source: trunk/src/quartz/devmon.c@ 6952

Last change on this file since 6952 was 6952, checked in by sandervl, 24 years ago

Wine 20011004 resync

File size: 13.7 KB
Line 
1/*
2 * Implements IMoniker for CLSID_CDeviceMoniker.
3 * Implements IPropertyBag. (internal)
4 *
5 * hidenori@a2.ctktv.ne.jp
6 */
7
8#include "config.h"
9
10#include "windef.h"
11#include "winbase.h"
12#include "wingdi.h"
13#include "winuser.h"
14#include "winreg.h"
15#include "winerror.h"
16#include "wine/obj_base.h"
17#include "objidl.h"
18#include "oleidl.h"
19#include "ocidl.h"
20#include "oleauto.h"
21#include "strmif.h"
22#include "uuids.h"
23#include "wine/unicode.h"
24
25#include "debugtools.h"
26DEFAULT_DEBUG_CHANNEL(quartz);
27
28#include "quartz_private.h"
29#include "devmon.h"
30#include "regsvr.h"
31
32
33/***************************************************************************
34 *
35 * CDeviceMoniker::IMoniker
36 *
37 */
38
39static HRESULT WINAPI
40IMoniker_fnQueryInterface(IMoniker* iface,REFIID riid,void** ppobj)
41{
42 CDeviceMoniker_THIS(iface,moniker);
43
44 TRACE("(%p)->()\n",This);
45
46 return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj);
47}
48
49static ULONG WINAPI
50IMoniker_fnAddRef(IMoniker* iface)
51{
52 CDeviceMoniker_THIS(iface,moniker);
53
54 TRACE("(%p)->()\n",This);
55
56 return IUnknown_AddRef(This->unk.punkControl);
57}
58
59static ULONG WINAPI
60IMoniker_fnRelease(IMoniker* iface)
61{
62 CDeviceMoniker_THIS(iface,moniker);
63
64 TRACE("(%p)->()\n",This);
65
66 return IUnknown_Release(This->unk.punkControl);
67}
68
69static HRESULT WINAPI IMoniker_fnGetClassID(IMoniker* iface, CLSID *pClassID)
70{
71 CDeviceMoniker_THIS(iface,moniker);
72
73 TRACE("(%p)->()\n",This);
74
75 if ( pClassID == NULL )
76 return E_POINTER;
77 memcpy( pClassID, &CLSID_CDeviceMoniker, sizeof(CLSID) );
78
79 return NOERROR;
80}
81
82static HRESULT WINAPI IMoniker_fnIsDirty(IMoniker* iface)
83{
84 CDeviceMoniker_THIS(iface,moniker);
85
86 FIXME("(%p)->() stub!\n",This);
87
88 return E_NOTIMPL;
89}
90
91static HRESULT WINAPI IMoniker_fnLoad(IMoniker* iface, IStream* pStm)
92{
93 CDeviceMoniker_THIS(iface,moniker);
94
95 FIXME("(%p)->() stub!\n",This);
96
97 return E_NOTIMPL;
98}
99
100static HRESULT WINAPI IMoniker_fnSave(IMoniker* iface, IStream* pStm, BOOL fClearDirty)
101{
102 CDeviceMoniker_THIS(iface,moniker);
103
104 FIXME("(%p)->() stub!\n",This);
105
106 return E_NOTIMPL;
107}
108
109static HRESULT WINAPI IMoniker_fnGetSizeMax(IMoniker* iface, ULARGE_INTEGER* pcbSize)
110{
111 CDeviceMoniker_THIS(iface,moniker);
112
113 FIXME("(%p)->() stub!\n",This);
114
115 return E_NOTIMPL;
116}
117
118static HRESULT WINAPI IMoniker_fnBindToObject(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult)
119{
120 CDeviceMoniker_THIS(iface,moniker);
121 HRESULT hr;
122 IPropertyBag* pPropBag;
123 VARIANT vClsid;
124 CLSID clsid;
125
126 TRACE("(%p)->(%p,%p,%s,%p)\n",This,
127 pbc,pmkToLeft,debugstr_guid(riid),ppvResult);
128 if ( pbc != NULL )
129 {
130 FIXME("IBindCtx* pbc != NULL not implemented.\n");
131 return E_FAIL;
132 }
133 if ( pmkToLeft != NULL )
134 {
135 FIXME("IMoniker* pmkToLeft != NULL not implemented.\n");
136 return E_FAIL;
137 }
138 if ( ppvResult == NULL )
139 return E_POINTER;
140
141 hr = QUARTZ_CreateRegPropertyBag(
142 This->m_hkRoot, This->m_pwszPath, &pPropBag );
143 if ( FAILED(hr) )
144 return hr;
145
146 vClsid.n1.n2.vt = VT_BSTR;
147 hr = IPropertyBag_Read(
148 pPropBag, QUARTZ_wszCLSID, &vClsid, NULL );
149 IPropertyBag_Release( pPropBag );
150 if ( FAILED(hr) )
151 return hr;
152
153 hr = CLSIDFromString( vClsid.n1.n2.n3.bstrVal, &clsid );
154 SysFreeString(vClsid.n1.n2.n3.bstrVal);
155 if ( FAILED(hr) )
156 return hr;
157
158 hr = CoCreateInstance(
159 &clsid, NULL, CLSCTX_INPROC_SERVER, riid, ppvResult );
160 TRACE( "hr = %08lx\n", hr );
161
162 return hr;
163}
164
165static HRESULT WINAPI IMoniker_fnBindToStorage(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, VOID** ppvResult)
166{
167 CDeviceMoniker_THIS(iface,moniker);
168 HRESULT hr;
169
170 TRACE("(%p)->(%p,%p,%s,%p)\n",This,
171 pbc,pmkToLeft,debugstr_guid(riid),ppvResult);
172 if ( pbc != NULL )
173 {
174 FIXME("IBindCtx* pbc != NULL not implemented.\n");
175 return E_FAIL;
176 }
177 if ( pmkToLeft != NULL )
178 {
179 FIXME("IMoniker* pmkToLeft != NULL not implemented.\n");
180 return E_FAIL;
181 }
182 if ( ppvResult == NULL )
183 return E_POINTER;
184
185 hr = E_NOINTERFACE;
186 if ( IsEqualGUID(riid,&IID_IUnknown) ||
187 IsEqualGUID(riid,&IID_IPropertyBag) )
188 {
189 hr = QUARTZ_CreateRegPropertyBag(
190 This->m_hkRoot, This->m_pwszPath,
191 (IPropertyBag**)ppvResult );
192 }
193
194 return hr;
195}
196
197static HRESULT WINAPI IMoniker_fnReduce(IMoniker* iface,IBindCtx* pbc, DWORD dwReduceHowFar,IMoniker** ppmkToLeft, IMoniker** ppmkReduced)
198{
199 CDeviceMoniker_THIS(iface,moniker);
200
201 TRACE("(%p)->()\n",This);
202
203 if ( ppmkReduced == NULL )
204 return E_POINTER;
205
206 *ppmkReduced = iface; IMoniker_AddRef(iface);
207
208 return MK_S_REDUCED_TO_SELF;
209}
210
211static HRESULT WINAPI IMoniker_fnComposeWith(IMoniker* iface,IMoniker* pmkRight,BOOL fOnlyIfNotGeneric, IMoniker** ppmkComposite)
212{
213 CDeviceMoniker_THIS(iface,moniker);
214
215 FIXME("(%p)->() stub!\n",This);
216
217 return E_NOTIMPL;
218}
219
220static HRESULT WINAPI IMoniker_fnEnum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker)
221{
222 CDeviceMoniker_THIS(iface,moniker);
223
224 TRACE("(%p)->()\n",This);
225
226 if ( ppenumMoniker == NULL )
227 return E_POINTER;
228
229 *ppenumMoniker = NULL;
230 return NOERROR;
231}
232
233static HRESULT WINAPI IMoniker_fnIsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker)
234{
235 CDeviceMoniker_THIS(iface,moniker);
236
237 FIXME("(%p)->() stub!\n",This);
238
239 return E_NOTIMPL;
240}
241
242static HRESULT WINAPI IMoniker_fnHash(IMoniker* iface,DWORD* pdwHash)
243{
244 CDeviceMoniker_THIS(iface,moniker);
245
246 FIXME("(%p)->() stub!\n",This);
247
248 return E_NOTIMPL;
249}
250
251static HRESULT WINAPI IMoniker_fnIsRunning(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, IMoniker* pmkNewlyRunning)
252{
253 CDeviceMoniker_THIS(iface,moniker);
254
255 FIXME("(%p)->() stub!\n",This);
256
257 return E_NOTIMPL;
258}
259
260static HRESULT WINAPI IMoniker_fnGetTimeOfLastChange(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, FILETIME* pCompositeTime)
261{
262 CDeviceMoniker_THIS(iface,moniker);
263
264 FIXME("(%p)->() stub!\n",This);
265
266 return E_NOTIMPL;
267}
268
269static HRESULT WINAPI IMoniker_fnInverse(IMoniker* iface,IMoniker** ppmk)
270{
271 CDeviceMoniker_THIS(iface,moniker);
272
273 FIXME("(%p)->() stub!\n",This);
274
275 return E_NOTIMPL;
276}
277
278static HRESULT WINAPI IMoniker_fnCommonPrefixWith(IMoniker* iface,IMoniker* pmkOther, IMoniker** ppmkPrefix)
279{
280 CDeviceMoniker_THIS(iface,moniker);
281
282 FIXME("(%p)->() stub!\n",This);
283
284 return E_NOTIMPL;
285}
286
287static HRESULT WINAPI IMoniker_fnRelativePathTo(IMoniker* iface,IMoniker* pmOther, IMoniker** ppmkRelPath)
288{
289 CDeviceMoniker_THIS(iface,moniker);
290
291 FIXME("(%p)->() stub!\n",This);
292
293 return E_NOTIMPL;
294}
295
296static HRESULT WINAPI IMoniker_fnGetDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR *ppszDisplayName)
297{
298 CDeviceMoniker_THIS(iface,moniker);
299
300 FIXME("(%p)->() stub!\n",This);
301
302 return E_NOTIMPL;
303}
304
305static HRESULT WINAPI IMoniker_fnParseDisplayName(IMoniker* iface,IBindCtx* pbc, IMoniker* pmkToLeft, LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut)
306{
307 CDeviceMoniker_THIS(iface,moniker);
308
309 FIXME("(%p)->() stub!\n",This);
310
311 return E_NOTIMPL;
312}
313
314static HRESULT WINAPI IMoniker_fnIsSystemMoniker(IMoniker* iface,DWORD* pdwMksys)
315{
316 CDeviceMoniker_THIS(iface,moniker);
317
318 TRACE("(%p)->()\n",This);
319 if ( pdwMksys == NULL )
320 return E_POINTER;
321
322 *pdwMksys = MKSYS_NONE;
323 return S_FALSE;
324}
325
326
327static ICOM_VTABLE(IMoniker) imoniker =
328{
329 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
330 /* IUnknown fields */
331 IMoniker_fnQueryInterface,
332 IMoniker_fnAddRef,
333 IMoniker_fnRelease,
334 /* IPersist fields */
335 IMoniker_fnGetClassID,
336 /* IPersistStream fields */
337 IMoniker_fnIsDirty,
338 IMoniker_fnLoad,
339 IMoniker_fnSave,
340 IMoniker_fnGetSizeMax,
341 /* IMoniker fields */
342 IMoniker_fnBindToObject,
343 IMoniker_fnBindToStorage,
344 IMoniker_fnReduce,
345 IMoniker_fnComposeWith,
346 IMoniker_fnEnum,
347 IMoniker_fnIsEqual,
348 IMoniker_fnHash,
349 IMoniker_fnIsRunning,
350 IMoniker_fnGetTimeOfLastChange,
351 IMoniker_fnInverse,
352 IMoniker_fnCommonPrefixWith,
353 IMoniker_fnRelativePathTo,
354 IMoniker_fnGetDisplayName,
355 IMoniker_fnParseDisplayName,
356 IMoniker_fnIsSystemMoniker,
357};
358
359
360static HRESULT CDeviceMoniker_InitIMoniker(
361 CDeviceMoniker* pdm, HKEY hkRoot, LPCWSTR lpKeyPath )
362{
363 DWORD dwLen;
364
365 ICOM_VTBL(&pdm->moniker) = &imoniker;
366 pdm->m_hkRoot = hkRoot;
367 pdm->m_pwszPath = NULL;
368
369 dwLen = sizeof(WCHAR)*(strlenW(lpKeyPath)+1);
370 pdm->m_pwszPath = (WCHAR*)QUARTZ_AllocMem( dwLen );
371 if ( pdm->m_pwszPath == NULL )
372 return E_OUTOFMEMORY;
373 memcpy( pdm->m_pwszPath, lpKeyPath, dwLen );
374
375 return NOERROR;
376}
377
378static void CDeviceMoniker_UninitIMoniker(
379 CDeviceMoniker* pdm )
380{
381 if ( pdm->m_pwszPath != NULL )
382 QUARTZ_FreeMem( pdm->m_pwszPath );
383}
384
385/***************************************************************************
386 *
387 * new/delete for CDeviceMoniker
388 *
389 */
390
391static void QUARTZ_DestroyDeviceMoniker(IUnknown* punk)
392{
393 CDeviceMoniker_THIS(punk,unk);
394
395 CDeviceMoniker_UninitIMoniker( This );
396}
397
398/* can I use offsetof safely? - FIXME? */
399static QUARTZ_IFEntry CDeviceMoniker_IFEntries[] =
400{
401 { &IID_IPersist, offsetof(CDeviceMoniker,moniker)-offsetof(CDeviceMoniker,unk) },
402 { &IID_IPersistStream, offsetof(CDeviceMoniker,moniker)-offsetof(CDeviceMoniker,unk) },
403 { &IID_IMoniker, offsetof(CDeviceMoniker,moniker)-offsetof(CDeviceMoniker,unk) },
404};
405
406HRESULT QUARTZ_CreateDeviceMoniker(
407 HKEY hkRoot, LPCWSTR lpKeyPath,
408 IMoniker** ppMoniker )
409{
410 CDeviceMoniker* pdm;
411 HRESULT hr;
412
413 TRACE("(%08x,%s,%p)\n",hkRoot,debugstr_w(lpKeyPath),ppMoniker );
414
415 pdm = (CDeviceMoniker*)QUARTZ_AllocObj( sizeof(CDeviceMoniker) );
416 if ( pdm == NULL )
417 return E_OUTOFMEMORY;
418
419 QUARTZ_IUnkInit( &pdm->unk, NULL );
420 hr = CDeviceMoniker_InitIMoniker( pdm, hkRoot, lpKeyPath );
421 if ( FAILED(hr) )
422 {
423 QUARTZ_FreeObj( pdm );
424 return hr;
425 }
426
427 pdm->unk.pEntries = CDeviceMoniker_IFEntries;
428 pdm->unk.dwEntries = sizeof(CDeviceMoniker_IFEntries)/sizeof(CDeviceMoniker_IFEntries[0]);
429 pdm->unk.pOnFinalRelease = &QUARTZ_DestroyDeviceMoniker;
430
431 *ppMoniker = (IMoniker*)(&pdm->moniker);
432
433 return S_OK;
434}
435
436
437/***************************************************************************
438 *
439 * CRegPropertyBag::IPropertyBag
440 *
441 */
442
443static HRESULT WINAPI
444IPropertyBag_fnQueryInterface(IPropertyBag* iface,REFIID riid,void** ppobj)
445{
446 CRegPropertyBag_THIS(iface,propbag);
447
448 TRACE("(%p)->()\n",This);
449
450 return IUnknown_QueryInterface(This->unk.punkControl,riid,ppobj);
451}
452
453static ULONG WINAPI
454IPropertyBag_fnAddRef(IPropertyBag* iface)
455{
456 CRegPropertyBag_THIS(iface,propbag);
457
458 TRACE("(%p)->()\n",This);
459
460 return IUnknown_AddRef(This->unk.punkControl);
461}
462
463static ULONG WINAPI
464IPropertyBag_fnRelease(IPropertyBag* iface)
465{
466 CRegPropertyBag_THIS(iface,propbag);
467
468 TRACE("(%p)->()\n",This);
469
470 return IUnknown_Release(This->unk.punkControl);
471}
472
473static HRESULT WINAPI
474IPropertyBag_fnRead(IPropertyBag* iface,LPCOLESTR lpszPropName,VARIANT* pVar,IErrorLog* pLog)
475{
476 CRegPropertyBag_THIS(iface,propbag);
477 LONG lr;
478 DWORD dwSize;
479 DWORD dwValueType;
480
481 TRACE("(%p)->(%s,%p,%p)\n",This,
482 debugstr_w(lpszPropName),pVar,pLog);
483
484 if ( lpszPropName == NULL || pVar == NULL )
485 return E_POINTER;
486
487 dwSize = 0;
488 lr = RegQueryValueExW(
489 This->m_hKey, lpszPropName, NULL,
490 &dwValueType, NULL, &dwSize );
491 if ( lr != ERROR_SUCCESS )
492 {
493 TRACE( "RegQueryValueExW failed.\n" );
494 return E_INVALIDARG;
495 }
496
497 switch ( dwValueType )
498 {
499 case REG_SZ:
500 TRACE( "REG_SZ / length = %lu\n", dwSize );
501 if ( pVar->n1.n2.vt == VT_EMPTY )
502 pVar->n1.n2.vt = VT_BSTR;
503 if ( pVar->n1.n2.vt != VT_BSTR )
504 {
505 TRACE( "type of VARIANT is not BSTR\n" );
506 return E_FAIL;
507 }
508
509 pVar->n1.n2.n3.bstrVal = SysAllocStringByteLen(
510 NULL, dwSize );
511 if ( pVar->n1.n2.n3.bstrVal == NULL )
512 {
513 TRACE( "out of memory.\n" );
514 return E_OUTOFMEMORY;
515 }
516 lr = RegQueryValueExW(
517 This->m_hKey, lpszPropName, NULL,
518 &dwValueType,
519 (BYTE*)pVar->n1.n2.n3.bstrVal, &dwSize );
520 if ( lr != ERROR_SUCCESS )
521 {
522 TRACE( "failed to query value\n" );
523 SysFreeString(pVar->n1.n2.n3.bstrVal);
524 return E_FAIL;
525 }
526 TRACE( "value is BSTR; %s\n", debugstr_w(pVar->n1.n2.n3.bstrVal) );
527 break;
528 default:
529 FIXME("(%p)->(%s,%p,%p) - unsupported value type.\n",This,
530 debugstr_w(lpszPropName),pVar,pLog);
531 return E_FAIL;
532 }
533
534 TRACE( "returned successfully.\n" );
535 return NOERROR;
536}
537
538static HRESULT WINAPI
539IPropertyBag_fnWrite(IPropertyBag* iface,LPCOLESTR lpszPropName,VARIANT* pVar)
540{
541 CRegPropertyBag_THIS(iface,propbag);
542
543 FIXME("(%p)->(%s,%p) stub!\n",This,
544 debugstr_w(lpszPropName),pVar);
545
546 if ( lpszPropName == NULL || pVar == NULL )
547 return E_POINTER;
548
549 return E_NOTIMPL;
550}
551
552
553
554
555static ICOM_VTABLE(IPropertyBag) ipropbag =
556{
557 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
558 /* IUnknown fields */
559 IPropertyBag_fnQueryInterface,
560 IPropertyBag_fnAddRef,
561 IPropertyBag_fnRelease,
562 /* IPropertyBag fields */
563 IPropertyBag_fnRead,
564 IPropertyBag_fnWrite,
565};
566
567static HRESULT CRegPropertyBag_InitIPropertyBag(
568 CRegPropertyBag* prpb, HKEY hkRoot, LPCWSTR lpKeyPath )
569{
570 ICOM_VTBL(&prpb->propbag) = &ipropbag;
571
572 if ( RegOpenKeyExW(
573 hkRoot, lpKeyPath, 0,
574 KEY_ALL_ACCESS, &prpb->m_hKey ) != ERROR_SUCCESS )
575 return E_FAIL;
576
577 return NOERROR;
578}
579
580static void CRegPropertyBag_UninitIPropertyBag(
581 CRegPropertyBag* prpb )
582{
583 RegCloseKey( prpb->m_hKey );
584}
585
586
587/***************************************************************************
588 *
589 * new/delete for CRegPropertyBag
590 *
591 */
592
593static void QUARTZ_DestroyRegPropertyBag(IUnknown* punk)
594{
595 CRegPropertyBag_THIS(punk,unk);
596
597 CRegPropertyBag_UninitIPropertyBag(This);
598}
599
600
601/* can I use offsetof safely? - FIXME? */
602static QUARTZ_IFEntry CRegPropertyBag_IFEntries[] =
603{
604 { &IID_IPropertyBag, offsetof(CRegPropertyBag,propbag)-offsetof(CRegPropertyBag,unk) },
605};
606
607HRESULT QUARTZ_CreateRegPropertyBag(
608 HKEY hkRoot, LPCWSTR lpKeyPath,
609 IPropertyBag** ppPropBag )
610{
611 CRegPropertyBag* prpb;
612 HRESULT hr;
613
614 TRACE("(%08x,%s,%p)\n",hkRoot,debugstr_w(lpKeyPath),ppPropBag );
615
616 prpb = (CRegPropertyBag*)QUARTZ_AllocObj( sizeof(CRegPropertyBag) );
617 if ( prpb == NULL )
618 return E_OUTOFMEMORY;
619
620 QUARTZ_IUnkInit( &prpb->unk, NULL );
621 hr = CRegPropertyBag_InitIPropertyBag( prpb, hkRoot, lpKeyPath );
622 if ( FAILED(hr) )
623 {
624 QUARTZ_FreeObj( prpb );
625 return hr;
626 }
627
628 prpb->unk.pEntries = CRegPropertyBag_IFEntries;
629 prpb->unk.dwEntries = sizeof(CRegPropertyBag_IFEntries)/sizeof(CRegPropertyBag_IFEntries[0]);
630 prpb->unk.pOnFinalRelease = &QUARTZ_DestroyRegPropertyBag;
631
632 *ppPropBag = (IPropertyBag*)(&prpb->propbag);
633
634 return S_OK;
635}
636
637
638
Note: See TracBrowser for help on using the repository browser.