//+-------------------------------------------------------------------------
//
//  Microsoft Windows Media Technologies
//  Copyright (C) Microsoft Corporation, 1999 - 2001.  All Rights Reserved.
//
//  File:       drmexternals.idl
//
//  Contents: enums and typedefs needed for using microsoft drm.
//            !!!THIS FILE NEEDS TO BE DROPPED TO SDK\IDL DIRECTORY WHENEVER CHANGED!!!
//--------------------------------------------------------------------------
import "oaidl.idl";

// The following is a partial list of DRM (v7 or greater) actions that are of interest to applications.
cpp_quote( "static const WCHAR *g_wszWMDRM_RIGHT_PLAYBACK                = L\"Play\";" )
cpp_quote( "static const WCHAR *g_wszWMDRM_RIGHT_COPY_TO_CD              = L\"Print.redbook\";" )
cpp_quote( "static const WCHAR *g_wszWMDRM_RIGHT_COPY_TO_SDMI_DEVICE     = L\"Transfer.SDMI\";" )
cpp_quote( "static const WCHAR *g_wszWMDRM_RIGHT_COPY_TO_NON_SDMI_DEVICE = L\"Transfer.NONSDMI\";" )
cpp_quote( "static const WCHAR *g_wszWMDRM_RIGHT_BACKUP                  = L\"Backup\";" )

// Property prefix for getting header/license information
cpp_quote( "static const WCHAR *g_wszWMDRM_ActionAllowed                = L\"ActionAllowed.\";" )
cpp_quote( "static const WCHAR *g_wszWMDRM_LicenseState                 = L\"LicenseStateData.\";" )
cpp_quote( "static const WCHAR *g_wszWMDRM_DRMHeader                    = L\"DRMHeader.\";" )

cpp_quote( "static const WCHAR *g_wszWMDRM_IsDRM                             = L\"IsDRM\";" )
cpp_quote( "static const WCHAR *g_wszWMDRM_IsDRMCached                       = L\"IsDRMCached\";" )
cpp_quote( "static const WCHAR *g_wszWMDRM_ActionAllowed_Playback            = L\"ActionAllowed.Play\";" )
cpp_quote( "static const WCHAR *g_wszWMDRM_ActionAllowed_CopyToCD            = L\"ActionAllowed.Print.redbook\";" )
cpp_quote( "static const WCHAR *g_wszWMDRM_ActionAllowed_CopyToSDMIDevice    = L\"ActionAllowed.Transfer.SDMI\";" )
cpp_quote( "static const WCHAR *g_wszWMDRM_ActionAllowed_CopyToNonSDMIDevice = L\"ActionAllowed.Transfer.NONSDMI\";" )
cpp_quote( "static const WCHAR *g_wszWMDRM_ActionAllowed_Backup              = L\"ActionAllowed.Backup\";" )
cpp_quote( "static const WCHAR *g_wszWMDRM_LicenseState_Playback             = L\"LicenseStateData.Play\";" )
cpp_quote( "static const WCHAR *g_wszWMDRM_LicenseState_CopyToCD             = L\"LicenseStateData.Print.redbook\";" )
cpp_quote( "static const WCHAR *g_wszWMDRM_LicenseState_CopyToSDMIDevice     = L\"LicenseStateData.Transfer.SDMI\";" )
cpp_quote( "static const WCHAR *g_wszWMDRM_LicenseState_CopyToNonSDMIDevice  = L\"LicenseStateData.Transfer.NONSDMI\";" )

// This enum indicates the category for each possible output string to be displayed.
// 0 -  Playback not permitted.
// 1 -  Playback valid 5 times.
// 2 - 	Playback valid from 7/12/00.
// 3 - 	Playback valid until 7/12/00.
// 4 - 	Playback valid from 5/12 to 9/12.
// 5 - 	Playback valid 5 times from 7/12/00.
// 6 - 	Playback valid 5 times until 7/12/00.
// 7 - 	Playback valid 5 times from 5/12 to 9/12.
// 8 -  Playback valid for 24 hours from first use.

typedef enum DRM_LICENSE_STATE_CATEGORY
{
    WM_DRM_LICENSE_STATE_NORIGHT = 0,
    WM_DRM_LICENSE_STATE_UNLIM,

    WM_DRM_LICENSE_STATE_COUNT, 
    WM_DRM_LICENSE_STATE_FROM,
    WM_DRM_LICENSE_STATE_UNTIL,
    WM_DRM_LICENSE_STATE_FROM_UNTIL,
    WM_DRM_LICENSE_STATE_COUNT_FROM,
    WM_DRM_LICENSE_STATE_COUNT_UNTIL,
    WM_DRM_LICENSE_STATE_COUNT_FROM_UNTIL,
    WM_DRM_LICENSE_STATE_EXPIRATION_AFTER_FIRSTUSE
} DRM_LICENSE_STATE_CATEGORY;

typedef struct _DRM_LICENSE_STATE_DATA
{
    DWORD dwStreamId;  // 0 => All streams != 0 => For a particular stream. 
    DRM_LICENSE_STATE_CATEGORY dwCategory;  // indicates the category of string to be displayed.
    DWORD dwNumCounts; // Number of items supplied in dwCount
    DWORD dwCount[4];  // Up to 4 counts
    DWORD dwNumDates;  // Number of items supplied in dwDate. 
    FILETIME datetime[4]; // Up to 4 dates. 
    DWORD dwVague;      // 0 => certain 1 => atleast (there could be more licenses. Aggregation not possible).
} DRM_LICENSE_STATE_DATA;


typedef enum DRM_HTTP_STATUS
{
    HTTP_NOTINITIATED = 0,
    HTTP_CONNECTING,
    HTTP_REQUESTING,
    HTTP_RECEIVING,
    HTTP_COMPLETED
} DRM_HTTP_STATUS;

//  The various states individualization can be in:
typedef enum DRM_INDIVIDUALIZATION_STATUS
{
    INDI_UNDEFINED   = 0x0000,
    INDI_BEGIN       = 0x0001,
    INDI_SUCCEED     = 0x0002,
    INDI_FAIL        = 0x0004,
    INDI_CANCEL      = 0x0008,
    INDI_DOWNLOAD    = 0x0010,
    INDI_INSTALL     = 0x0020
} DRM_INDIVIDUALIZATION_STATUS;

typedef struct _WMIndividualizeStatus
{
    HRESULT                         hr;
    DRM_INDIVIDUALIZATION_STATUS    enIndiStatus;
    LPSTR                           pszIndiRespUrl;
    DWORD                           dwHTTPRequest;
    DRM_HTTP_STATUS                 enHTTPStatus;
    DWORD                           dwHTTPReadProgress;
    DWORD                           dwHTTPReadTotal;
} WM_INDIVIDUALIZE_STATUS;

typedef struct _WMGetLicenseData
{
    DWORD   dwSize;
    HRESULT hr;
    WCHAR   *wszURL;
    WCHAR   *wszLocalFilename;
    BYTE    *pbPostData;
    DWORD   dwPostDataSize;
} WM_GET_LICENSE_DATA;

typedef enum MSDRM_STATUS
{
    DRM_ERROR                       = 0,
    DRM_INFORMATION                 = 1,
    DRM_BACKUPRESTORE_BEGIN         = 2,
    DRM_BACKUPRESTORE_END           = 3,
    DRM_BACKUPRESTORE_CONNECTING    = 4,
    DRM_BACKUPRESTORE_DISCONNECTING = 5,
    DRM_ERROR_WITHURL               = 6,
    DRM_RESTRICTED_LICENSE          = 7,
    DRM_NEEDS_INDIVIDUALIZATION     = 8
} MSDRM_STATUS;

//
// Attribute datatypes.
//
typedef enum DRM_ATTR_DATATYPE
{

    DRM_TYPE_DWORD		= 0,
    DRM_TYPE_STRING		= 1,
    DRM_TYPE_BINARY		= 2,
    DRM_TYPE_BOOL   	= 3,
    DRM_TYPE_QWORD      = 4,
    DRM_TYPE_WORD		= 5,
    DRM_TYPE_GUID		= 6,

} DRM_ATTR_DATATYPE;

interface IDRMStatusCallback;

cpp_quote( "#define DRM_BACKUP_OVERWRITE         ((DWORD) 0x00000001)" )
cpp_quote( "#define DRM_RESTORE_INDIVIDUALIZE    ((DWORD) 0x00000002)" )

[
	object,
	uuid( 08548704-75B1-4982-9B26-FB385DEE741D ),
	helpstring("IDRMStatusCallback Interface"),
	pointer_default(unique),
	local
]

interface IDRMStatusCallback : IUnknown
{
    //
    // The contents pParam depends on the Status.
    //
    HRESULT OnStatus( [in] MSDRM_STATUS Status, 
                      [in] HRESULT hr,
                      [in] DRM_ATTR_DATATYPE dwType,
                      [in] BYTE *pValue,
                      [in] void *pvContext );
};

// drmbuf
cpp_quote("#define DRM_ENCRYPT_CONTENT_ASFv1  0x1001")
cpp_quote("#define DRM_ENCRYPT_CONTENT_ASFv2  0x1002")

typedef struct _DRMBUF {
    unsigned long   len;
    char            *buf;
} DRMBUF, *PDRMBUF;


