#ifndef _subitem_h
#define _subitem_h

HRESULT BlobToVariant(BYTE *pData, DWORD cbData, VARIANT *pVar, DWORD *pcbUsed, BOOL fStream = FALSE);

class CEnumItemProperties : public IEnumItemProperties
{
public:
    CEnumItemProperties();
    HRESULT Initialize(const SUBSCRIPTIONCOOKIE *pCookie, ISubscriptionItem *psi);
    HRESULT CopyItem(ITEMPROP *pip, WCHAR *pwszName, VARIANT *pVar);
    HRESULT CopyRange(ULONG nStart, ULONG nCount, ITEMPROP *ppip, ULONG *pnCopied);

    // IUnknown members
    STDMETHODIMP         QueryInterface(REFIID riid, void **ppv);
    STDMETHODIMP_(ULONG) AddRef();
    STDMETHODIMP_(ULONG) Release();

    // IEnumItemProperties
    STDMETHODIMP Next( 
        /* [in] */ ULONG celt,
        /* [length_is][size_is][out] */ ITEMPROP *rgelt,
        /* [out] */ ULONG *pceltFetched);
    
    STDMETHODIMP Skip( 
        /* [in] */ ULONG celt);
    
    STDMETHODIMP Reset( void);
    
    STDMETHODIMP Clone( 
        /* [out] */ IEnumItemProperties **ppenum);
    
    STDMETHODIMP GetCount( 
        /* [out] */ ULONG *pnCount);

private:
    ~CEnumItemProperties();

    ULONG       m_cRef;
    ULONG       m_nCurrent;
    ULONG       m_nCount;

    ITEMPROP    *m_pItemProps;
};

class CSubscriptionItem : public ISubscriptionItem 
{
public:
    CSubscriptionItem(const SUBSCRIPTIONCOOKIE *pCookie, HKEY hkey);
    HRESULT Read(HKEY hkeyIn, const WCHAR *pwszValueName, BYTE *pData, DWORD dwDataSize);
    HRESULT ReadWithAlloc(HKEY hkeyIn, const WCHAR *pwszValueName, BYTE **ppData, DWORD *pdwDataSize);
    HRESULT Write(HKEY hkeyIn, const WCHAR *pwszValueName, BYTE *pData, DWORD dwDataSize);

    // IUnknown members
    STDMETHODIMP         QueryInterface(REFIID riid, void **ppv);
    STDMETHODIMP_(ULONG) AddRef();
    STDMETHODIMP_(ULONG) Release();

    // ISubscriptionItem
    STDMETHODIMP GetCookie(SUBSCRIPTIONCOOKIE *pCookie);
    STDMETHODIMP GetSubscriptionItemInfo( 
        /* [out] */ SUBSCRIPTIONITEMINFO *pSubscriptionItemInfo);
    
    STDMETHODIMP SetSubscriptionItemInfo( 
        /* [in] */ const SUBSCRIPTIONITEMINFO *pSubscriptionItemInfo);
    
    STDMETHODIMP ReadProperties( 
        ULONG nCount,
        /* [size_is][in] */ const LPCWSTR rgwszName[],
        /* [size_is][out] */ VARIANT rgValue[]);
    
    STDMETHODIMP WriteProperties( 
        ULONG nCount,
        /* [size_is][in] */ const LPCWSTR rgwszName[],
        /* [size_is][in] */ const VARIANT rgValue[]);
    
    STDMETHODIMP EnumProperties( 
        /* [out] */ IEnumItemProperties **ppEnumItemProperties);

    STDMETHODIMP NotifyChanged();

private:
    ~CSubscriptionItem();
    ULONG               m_cRef;
    SUBSCRIPTIONCOOKIE  m_Cookie;
    DWORD               m_dwFlags;
};

#endif // _subitem_h


