Partilhar via


Tratamento de eventos de aquisição de licenças

[A funcionalidade associada a esta página, Windows Media Format 11 SDK, é uma funcionalidade herdada. Foi substituído pelo Source Reader e pelo Sink Writer. do Source Reader e Sink Writer foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize Leitor de Origem e Escritor de Destino em vez do SDK do Windows Media Format 11 , sempre que possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Um aplicativo leitor habilitado para DRM, em seu método de retorno de chamada IWMStatusCallback::OnStatus, lida com os seguintes quatro eventos relacionados ao processo de aquisição de licença:

  • WMT_LICENSEURL_SIGNATURE_STATE
  • WMT_NO_RIGHTS
  • WMT_NO_RIGHTS_EX
  • WMT_ACQUIRE_LICENSE

WMT_LICENSEURL_SIGNATURE_STATE

Quando o componente DRM deteta conteúdo protegido pelo DRM versão 7, ele primeiro procura uma licença válida no sistema local. Se não existir, ele avalia a URL de aquisição de licença no cabeçalho DRM do arquivo e envia um evento WMT_LICENSEURL_SIGNATURE_STATE com pValue definido como um dos valores WMT_DRMLA_TRUST, indicando se a URL é confiável, não confiável ou foi adulterada. Se o URL não for confiável, o aplicativo deve avisar o usuário. Se o URL tiver sido adulterado, o arquivo deve ser considerado corrompido e o aplicativo não deve navegar para o URL sem emitir um aviso forte ao usuário.

WMT_NO_RIGHTS

O evento WMT_NO_RIGHTS é enviado apenas para conteúdo DRM versão 1, o que significa que a licença deve ser adquirida de forma não silenciosa. Em outras palavras, o usuário deve navegar até uma página da Web para adquirir uma licença. A URL da página é obtida como uma cadeia de caracteres de ampla largura terminada por nulo do parâmetro pValue no método OnStatus.

Se apropriado, um aplicativo pode facilitar a navegação do usuário para a página da Web, abrindo o Internet Explorer em um processo separado ou hospedando o controle do navegador da Web. No entanto, isso não é necessário. No mínimo, um aplicativo poderia simplesmente exibir a URL para o usuário em uma caixa de mensagem e solicitar que eles a colassem na barra de endereços do Internet Explorer. O exemplo de Audioplayer demonstra a manipulação adequada do evento WMT_NO_RIGHTS, incluindo como formatar a cadeia de caracteres de URL e como usar o método CreateProcess para abrir o Internet Explorer e navegar até a URL especificada.

Como o aplicativo não tem como saber quando uma licença DRM versão 1 foi adquirida, cabe ao usuário tentar abrir o arquivo novamente após adquirir a licença.

Este mesmo processo de aquisição de licença não silencioso também pode ser usado para licenças da versão 7, mas neste caso o aplicativo pode primeiro chamar IWMDRMReader::MonitorLicenseAcquisition. Esse método fará com que o armazenamento de licenças local seja verificado repetidamente até que a licença para o novo arquivo seja encontrada. Nessa altura, a aplicação receberá um evento WMT_ACQUIRE_LICENSE. Para todas as licenças da versão 7, recomenda-se que os aplicativos ofereçam aos usuários a opção de obter licenças silenciosamente ou não silenciosamente.

WMT_NO_RIGHTS_EX

O evento WMT_NO_RIGHTS_EX indica que o conteúdo está protegido pelo DRM versão 7 e, portanto, o processo de aquisição de licença pode prosseguir silenciosamente ou não silenciosamente. Em geral, a aquisição silenciosa de licenças é mais conveniente para os usuários finais, embora algumas pessoas prefiram adquirir todas as licenças de forma não silenciosa. Quando a aquisição da licença requer que o usuário envie pagamento ou informações pessoais, o processo deve ser sempre realizado de forma não silenciosa. A aquisição de licenças não silenciosas é descrita, acima, sob o título WMT_NO_RIGHTS. O procedimento para aquisição silenciosa é o seguinte:

  1. Converta o parâmetro pValue para uma estrutura WM_GET_LICENSE_DATA e armazene a estrutura caso seja necessário posteriormente para aquisição de licença não silenciosa.
  2. Chame QueryInterface no objeto de leitor para obter a interface IWMDRMReader.
  3. Chame IWMDRMReader::AcquireLicense e especifique 0x1 no parâmetro dwFlags para indicar a aquisição silenciosa da linguagem. Esta é uma chamada assíncrona que retorna imediatamente.
  4. Aguarde o evento WMT_ACQUIRE_LICENSE.

WMT_ACQUIRE_LICENSE

O evento WMT_ACQUIRE_LICENSE é enviado após a conclusão do processo de aquisição de licença para uma licença DRM versão 7. IWMDRMReader::AcquireLicense faz com que esse evento seja enviado para aquisição silenciosa e MonitorLicenseAcquisition faz com que ele seja enviado para aquisição não silenciosa. No manipulador de eventos, converta pValue para um apontador para uma estrutura de WM_GET_LICENSE_DATA e examine o elemento hr para determinar se a licença foi adquirida com êxito. Se hr for igual a NS_E_DRM_NO_RIGHTS, isso indica que a licença deve ser adquirida de forma não silenciosa. Os aplicativos devem permitir que os usuários cancelem o processo de aquisição de licenças a qualquer momento. Isto é feito ao chamar IWMDRMReader::CancelLicenseAcquisition. Chamar esse método enviará um evento WMT_ACQUIRE_LICENSE com um HRESULT valor de NS_S_DRM_ACQUIRE_CANCELLED.

Se hr for igual a NS_S_DRM_LICENSE_ACQUIRED, então a licença foi adquirida e o aplicativo pode tentar reproduzir o arquivo, copiá-lo para um dispositivo ou executar qualquer ação para a qual tenha solicitado direitos.

No Windows XP, um novo código de erro foi introduzido: NS_E_DRM_LICENSE_NOTACQUIRED. Este código de erro é gerado sempre que os componentes de tempo de execução do Windows Media Format no Windows XP não conseguem adquirir uma licença, quer durante a aquisição silenciosa ou não silenciosa da licença. Em outras plataformas, NS_E_DRM_LICENSE_STORE_ERROR geralmente é retornado quando a aquisição da licença falha. O novo código de erro destina-se a distinguir a falha de aquisição de licença de outras condições de falha onde NS_E_DRM_LICENSE_STORE_ERROR é gerado.

A maneira recomendada de lidar com esses erros quando eles são retornados após uma tentativa silenciosa de aquisição de licença é mostrada no seguinte trecho de código:

if( hrStatus == NS_E_DRM_LICENSE_NOTACQUIRED || 
    hrStatus == NS_E_DRM_LICENSE_STORE_ERROR )
{
  // Attempt non-silent license acquisition.
}
else if( hrStatus == NS_E_DRM_NEEDS_INDIVIDUALIZATION )
{
  // Individualize and then retry.
}
else if( FAILED(hrStatus) )
{
  // Display a helpful error message.
}
else
{
  // Success. Play content.
}

Observação

O DRM não é suportado pela versão baseada em x64 deste SDK.

 

Leitura de arquivos protegidos