/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */

import "oaidl.idl";
import "ocidl.idl";
import "propsys.idl";

interface IPortableDeviceKeyCollection;
interface IPortableDevicePropVariantCollection;
interface IPortableDeviceValuesCollection;

[
    uuid(6848f6f2-3155-4f86-b6f5-263eeeab3143),
    object
]
interface IPortableDeviceValues : IUnknown {
    HRESULT GetCount([in] DWORD *pcelt);

    HRESULT GetAt(
            [in] const DWORD index,
            [unique, out, in]  PROPERTYKEY *pKey,
            [unique, out, in]  PROPVARIANT *pValue);

    HRESULT SetValue(
            [in] REFPROPERTYKEY key,
            [in] const PROPVARIANT *pValue);

    HRESULT GetValue(
            [in] REFPROPERTYKEY key,
            [out] PROPVARIANT *pValue);

    HRESULT SetStringValue(
            [in]  REFPROPERTYKEY key,
            [in]  LPCWSTR Value);

    HRESULT GetStringValue(
            [in] REFPROPERTYKEY key,
            [out] LPWSTR *pValue);

    HRESULT SetUnsignedIntegerValue(
            [in] REFPROPERTYKEY key,
            [in] const ULONG Value);

    HRESULT GetUnsignedIntegerValue(
            [in]  REFPROPERTYKEY key,
            [out] ULONG *pValue);

    HRESULT SetSignedIntegerValue(
            [in] REFPROPERTYKEY key,
            [in] const LONG Value);

    HRESULT GetSignedIntegerValue(
            [in] REFPROPERTYKEY key,
            [out] LONG *pValue);

    HRESULT SetUnsignedLargeIntegerValue(
            [in] REFPROPERTYKEY key,
            [in] const ULONGLONG Value);

    HRESULT GetUnsignedLargeIntegerValue(
            [in] REFPROPERTYKEY key,
            [out] ULONGLONG *pValue);

    HRESULT SetSignedLargeIntegerValue(
            [in] REFPROPERTYKEY key,
            [in] const LONGLONG Value) = 0;

    HRESULT GetSignedLargeIntegerValue(
            [in] REFPROPERTYKEY key,
            [out] LONGLONG *pValue);

    HRESULT SetFloatValue(
            [in] REFPROPERTYKEY key,
            [in] const FLOAT Value);

    HRESULT GetFloatValue(
            [in] REFPROPERTYKEY key,
            [out] FLOAT *pValue);

    HRESULT SetErrorValue(
            [in] REFPROPERTYKEY key,
            [in] const HRESULT Value);

    HRESULT GetErrorValue(
            [in] REFPROPERTYKEY key,
            [out] HRESULT *pValue);

    HRESULT SetKeyValue(
            [in] REFPROPERTYKEY key,
            [in] REFPROPERTYKEY Value);

    HRESULT GetKeyValue(
            [in] REFPROPERTYKEY key,
            [out] PROPERTYKEY *pValue);

    HRESULT SetBoolValue(
            [in] REFPROPERTYKEY key,
            [in] const BOOL Value);

    HRESULT GetBoolValue(
            [in] REFPROPERTYKEY key,
            [out] BOOL *pValue);

    HRESULT SetIUnknownValue(
            [in] REFPROPERTYKEY key,
            [in] IUnknown *pValue);

    HRESULT GetIUnknownValue(
            [in] REFPROPERTYKEY key,
            [out] IUnknown **ppValue);

    HRESULT SetGuidValue(
            [in] REFPROPERTYKEY key,
            [in] REFGUID Value);

    HRESULT GetGuidValue(
            [in] REFPROPERTYKEY key,
            [out] GUID *pValue);

    HRESULT SetBufferValue(
            [in] REFPROPERTYKEY key,
            [size_is(cbValue), in] BYTE *pValue,
            [in] DWORD cbValue);

    HRESULT GetBufferValue(
            [in] REFPROPERTYKEY key,
            [size_is(*pcbValue), out] BYTE **ppValue,
            [out] DWORD *pcbValue);

    HRESULT SetIPortableDeviceValuesValue(
            [in] REFPROPERTYKEY key,
            [in] IPortableDeviceValues *pValue);

    HRESULT GetIPortableDeviceValuesValue(
            [in] REFPROPERTYKEY key,
            [out] IPortableDeviceValues **ppValue);

    HRESULT SetIPortableDevicePropVariantCollectionValue(
            [in] REFPROPERTYKEY key,
            [in] IPortableDevicePropVariantCollection *pValue);

    HRESULT GetIPortableDevicePropVariantCollectionValue(
            [in] REFPROPERTYKEY key,
            [out] IPortableDevicePropVariantCollection **ppValue);

    HRESULT SetIPortableDeviceKeyCollectionValue(
            [in] REFPROPERTYKEY key,
            [in] IPortableDeviceKeyCollection *pValue);

    HRESULT GetIPortableDeviceKeyCollectionValue(
            [in] REFPROPERTYKEY key,
            [out] IPortableDeviceKeyCollection **ppValue);

    HRESULT SetIPortableDeviceValuesCollectionValue(
            [in] REFPROPERTYKEY key,
            [in] IPortableDeviceValuesCollection *pValue);

    HRESULT GetIPortableDeviceValuesCollectionValue(
            [in] REFPROPERTYKEY key,
            [out] IPortableDeviceValuesCollection **ppValue);

    HRESULT RemoveValue([in] REFPROPERTYKEY key);
    HRESULT CopyValuesFromPropertyStore([in] IPropertyStore *pStore);
    HRESULT CopyValuesToPropertyStore([in] IPropertyStore *pStore);
    HRESULT Clear();
}

[
    uuid(dada2357-e0ad-492e-98db-dd61c53ba353),
    object
]
interface IPortableDeviceKeyCollection : IUnknown
{
    HRESULT GetCount([in] DWORD *pcElems);

    HRESULT GetAt(
            [in] const DWORD dwIndex,
            [in] PROPERTYKEY *pKey);

    HRESULT Add([in] REFPROPERTYKEY Key);
    HRESULT Clear();
    HRESULT RemoveAt([in] const DWORD dwIndex);
}

[
    uuid(89b2e422-4f1b-4316-bcef-a44afea83eb3),
    object
]
interface IPortableDevicePropVariantCollection : IUnknown
{
    HRESULT GetCount([out] DWORD *pcElems);
    
    HRESULT GetAt(
            [in] const DWORD dwIndex,
            [in] PROPVARIANT *pValue);

    HRESULT Add([in] const PROPVARIANT *pValue);
    HRESULT GetType([out] VARTYPE *pvt);
    HRESULT ChangeType([in] const VARTYPE vt);
    HRESULT Clear();
    HRESULT RemoveAt([in] const DWORD dwIndex);
}

[
    uuid(6e3f2d79-4e07-48c4-8208-d8c2e5af4a99),
    object
]
interface IPortableDeviceValuesCollection : IUnknown
{
    HRESULT GetCount([out] DWORD *pcElems);

    HRESULT GetAt(
            [in] DWORD dwIndex,
            [out] IPortableDeviceValues **ppValues);

    HRESULT Add([in] IPortableDeviceValues *pValues);
    HRESULT Clear();
    HRESULT RemoveAt([in] const DWORD dwIndex);
}

[
    uuid(2b00ba2f-e750-4beb-9235-97142ede1d3e)
]
library PortableDeviceTypesLib
{
    [
        uuid(0c15d503-d017-47ce-9016-7b3f978721cc)
    ]
    coclass PortableDeviceValues {
        interface IPortableDeviceValues;
    }
}