IWMDRMDeviceApp::GenerateMeterChallenge method
The GenerateMeterChallenge method acquires metering data from a device.
Syntax
HRESULT GenerateMeterChallenge(
[in] IWMDMDevice *pDevice,
[in] BSTR bstrMeterCert,
[out] BSTR *pbstrMeterURL,
[out] BSTR *pbstrMeterData
);
Parameters
-
pDevice [in]
-
Pointer to an IWMDMDevice interface. If the application passes in NULL, metering information stored on the computer is used instead of metering information from a connected device.
-
bstrMeterCert [in]
-
The application's metering certificate, as a BSTR. This is a signed certificate received from Microsoft.
-
pbstrMeterURL [out]
-
The URL where metering data should be sent. This is allocated by Windows Media Device Manager, and must be free by the caller using SysFreeString.
-
pbstrMeterData [out]
-
Metering data to send to the metering service. This is allocated by Windows Media Device Manager, and must be free by the caller using SysFreeString.
Return value
The method returns an HRESULT. Possible values include, but are not limited to, those in the following table.
Return code | Description |
---|---|
|
The method succeeded. |
|
One or more arguments are not valid. |
|
XML is improperly formed. |
|
XML is improperly formed. |
|
XML is improperly formed. |
|
Failed to find a required XML tag. |
|
Any of a number of device errors. |
|
Any of a number of internal DRM client errors. |
|
The specified device is not a Windows Media DRM compatible device. |
Remarks
Before calling this method, the application should call IWMDRMDeviceApp::QueryDeviceStatus or IWMDRMDeviceApp2::QueryDeviceStatus2 to verify that all the device's DRM components are up to date. This method can only be called on a device that supports Windows Media DRM 10 for Portable Devices.
The retrieved data pbstrMeterData should be sent to the URL specified by pbstrMeterURL. Be sure to URL-encode the retrieved data so that it does not get modified during transfer.
See Handling Protected Content in the Application for more information.
Examples
The following C++ code example creates a WMDRMDeviceApp object, verifies that the device is a Windows Media DRM 10 device, that its clock is accurate, and then requests the metering data.
HRESULT hr = S_OK;
// Create the WMDRMDeviceApp object.
CComPtr<IWMDRMDeviceApp> pDRM;
hr = pDRM.CoCreateInstance(CLSID_WMDRMDeviceApp, 0, CLSCTX_ALL);
// Find out first if the device is a WMDRM 10 device, and if it requires
// any clock updates.
DWORD status = 0;
hr = pDRM->QueryDeviceStatus(pDevice, &status);
if (!(WMDRM_DEVICE_ISWMDRM & status)) // Device is not WMDRM 10. Nothing can be updated,
return E_FAIL; // and metering cannot be performed.
else if (status & WMDRM_DEVICE_REVOKED) // Device is revoked.
return E_FAIL;
else if (status & WMDRM_DEVICE_NEEDCLOCK ||
status & WMDRM_CLIENT_NEEDINDIV ||
status & WMDRM_DEVICE_REFRESHCLOCK)
{
// Need to update device clock.
// Using custom function, which is synchronous.
hr = myAcquireDeviceData(pDRM, pDevice, this, status, &result);
if (hr != S_OK || result != 0) // Couldn't perform the updates.
return E_FAIL;
}
// Any updates have been performed. Now get the metering information from the device.
CComBSTR meterCert(METERCERT);
CComBSTR URL;
CComBSTR rawdata;
CComBSTR data;
hr = pDRM->GenerateMeterChallenge(pDevice, meterCert, &URL, &rawdata);
if (hr == S_OK)
..... Send to URL...
Requirements
Requirement | Value |
---|---|
Header |
|
Library |
|