Ignore:
Timestamp:
Oct 6, 2001, 10:56:18 AM (24 years ago)
Author:
sandervl
Message:

Wine 20011004 resync

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/quartz/devmon.c

    r6710 r6952  
    11/*
    22 * Implements IMoniker for CLSID_CDeviceMoniker.
     3 * Implements IPropertyBag. (internal)
    34 *
    45 * hidenori@a2.ctktv.ne.jp
     
    2728#include "quartz_private.h"
    2829#include "devmon.h"
    29 #include "monprop.h"
    3030#include "regsvr.h"
    3131
     32
     33/***************************************************************************
     34 *
     35 *      CDeviceMoniker::IMoniker
     36 *
     37 */
    3238
    3339static HRESULT WINAPI
     
    150156                return hr;
    151157
    152         return CoCreateInstance(
     158        hr = CoCreateInstance(
    153159                &clsid, NULL, CLSCTX_INPROC_SERVER, riid, ppvResult );
     160        TRACE( "hr = %08lx\n", hr );
     161
     162        return hr;
    154163}
    155164
     
    374383}
    375384
     385/***************************************************************************
     386 *
     387 *      new/delete for CDeviceMoniker
     388 *
     389 */
    376390
    377391static void QUARTZ_DestroyDeviceMoniker(IUnknown* punk)
     
    383397
    384398/* can I use offsetof safely? - FIXME? */
    385 static QUARTZ_IFEntry IFEntries[] =
     399static QUARTZ_IFEntry CDeviceMoniker_IFEntries[] =
    386400{
    387401  { &IID_IPersist, offsetof(CDeviceMoniker,moniker)-offsetof(CDeviceMoniker,unk) },
     
    411425        }
    412426
    413         pdm->unk.pEntries = IFEntries;
    414         pdm->unk.dwEntries = sizeof(IFEntries)/sizeof(IFEntries[0]);
     427        pdm->unk.pEntries = CDeviceMoniker_IFEntries;
     428        pdm->unk.dwEntries = sizeof(CDeviceMoniker_IFEntries)/sizeof(CDeviceMoniker_IFEntries[0]);
    415429        pdm->unk.pOnFinalRelease = &QUARTZ_DestroyDeviceMoniker;
    416430
     
    421435
    422436
     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 TracChangeset for help on using the changeset viewer.