//
//  Microsoft Windows Media Technologies
//  Copyright (C) Microsoft Corporation, 1999 - 2001. All rights reserved.
//

cpp_quote("// SCP Data Flags")
cpp_quote("#define WMDM_SCP_EXAMINE_EXTENSION                 0x00000001L")
cpp_quote("#define WMDM_SCP_EXAMINE_DATA                      0x00000002L")
cpp_quote("#define WMDM_SCP_DECIDE_DATA                       0x00000008L")
cpp_quote("#define WMDM_SCP_PROTECTED_OUTPUT                  0x00000010L")
cpp_quote("#define WMDM_SCP_UNPROTECTED_OUTPUT                0x00000020L")
cpp_quote("#define WMDM_SCP_RIGHTS_DATA                       0x00000040L")

cpp_quote("// SCP Transfer Flags")
cpp_quote("#define WMDM_SCP_TRANSFER_OBJECTDATA               0x00000020L")
cpp_quote("#define WMDM_SCP_NO_MORE_CHANGES                   0x00000040L")

interface ISCPSecureExchange;
interface ISCPSecureQuery;
interface ISCPSecureQuery2;

// ISCPSecureAuthenticate
[
	object,
	uuid(1DCB3A0F-33ED-11d3-8470-00C04F79DBC0),
	pointer_default(unique)
]
interface ISCPSecureAuthenticate : IUnknown
{
    HRESULT GetSecureQuery([out] ISCPSecureQuery **ppSecureQuery);
};

// ISCPSecureQuery
[
	object,
	uuid(1DCB3A0D-33ED-11d3-8470-00C04F79DBC0),
	pointer_default(unique)
]
interface ISCPSecureQuery : IUnknown
{
    HRESULT GetDataDemands([out] UINT *pfuFlags,
                           [out] DWORD *pdwMinRightsData,
                           [out] DWORD *pdwMinExamineData,
                           [out] DWORD *pdwMinDecideData,
                           [in, out] BYTE abMac[WMDM_MAC_LENGTH]);
    HRESULT ExamineData([in] UINT fuFlags,
                        [in, string, unique] LPWSTR pwszExtension,
                        [in, size_is(dwSize)] BYTE *pData,
                        [in] DWORD dwSize,
                        [in, out] BYTE abMac[WMDM_MAC_LENGTH]);
    HRESULT MakeDecision([in] UINT fuFlags,
                         [in, size_is(dwSize)] BYTE *pData,
                         [in] DWORD dwSize,
                         [in] DWORD dwAppSec,
						 [in, size_is(dwSessionKeyLen)] BYTE *pbSPSessionKey,
                         [in] DWORD dwSessionKeyLen,
                         [in] IMDSPStorageGlobals *pStorageGlobals,
                         [out] ISCPSecureExchange **ppExchange,
                         [in, out] BYTE abMac[WMDM_MAC_LENGTH]);
    HRESULT GetRights([in, size_is(dwSize)] BYTE *pData,
                      [in] DWORD dwSize,
 					  [in, size_is(dwSessionKeyLen)] BYTE *pbSPSessionKey,
                      [in] DWORD dwSessionKeyLen,
                      [in] IMDSPStorageGlobals *pStgGlobals,
                      [out, size_is(, *pnRightsCount)] PWMDMRIGHTS *ppRights,
                      [out] UINT *pnRightsCount,
                      [in, out] BYTE abMac[WMDM_MAC_LENGTH]);
};

// ISCPSecureQuery2
[
	object,
	uuid(EBE17E25-4FD7-4632-AF46-6D93D4FCC72E),
	pointer_default(unique)
]
interface ISCPSecureQuery2 : ISCPSecureQuery
{
    HRESULT MakeDecision2([in] UINT fuFlags,
                          [in, size_is(dwSize)] BYTE *pData,
                          [in] DWORD dwSize,
                          [in] DWORD dwAppSec,
						  [in, size_is(dwSessionKeyLen)] BYTE *pbSPSessionKey,
                          [in] DWORD dwSessionKeyLen,
                          [in] IMDSPStorageGlobals *pStorageGlobals,
						  [in, size_is(dwAppCertAppLen)] BYTE* pAppCertApp,
						  [in] DWORD dwAppCertAppLen,
						  [in, size_is(dwAppCertSPLen)] BYTE* pAppCertSP,
						  [in] DWORD dwAppCertSPLen,
						  [in, out, string, size_is(, *pdwRevocationURLLen)] LPWSTR* pszRevocationURL,
						  [in, out, ref] DWORD*  pdwRevocationURLLen,
						  [out] DWORD* pdwRevocationBitFlag, 
						  [in, out, unique] ULONGLONG* pqwFileSize,
						  [in] IUnknown* pUnknown,
                          [out] ISCPSecureExchange **ppExchange,
                          [in, out] BYTE abMac[WMDM_MAC_LENGTH]);
};


// ISCPSecureEchange
[
	object,
	uuid(1DCB3A0E-33ED-11d3-8470-00C04F79DBC0),
	pointer_default(unique)
]
interface ISCPSecureExchange : IUnknown
{
    HRESULT TransferContainerData([in,size_is(dwSize)] BYTE *pData,
                                  [in] DWORD dwSize,
                                  [out] UINT *pfuReadyFlags,
                                  [in, out] BYTE abMac[WMDM_MAC_LENGTH]);
    HRESULT ObjectData([out,size_is(*pdwSize)] BYTE *pData,
                       [in, out] DWORD *pdwSize,
                       [in, out] BYTE abMac[WMDM_MAC_LENGTH]);
    HRESULT TransferComplete(); 
};
