Menangani Peristiwa Akuisisi Lisensi

[Fitur yang terkait dengan halaman ini, Windows Media Format 11 SDK, adalah fitur warisan. Ini telah digantikan oleh Pembaca Sumber dan Penulis Sink. Pembaca Sumber dan Penulis Sink telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan Pembaca Sumber dan Penulis Sink alih-alih Windows Media Format 11 SDK, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Aplikasi pembaca berkemampuan DRM, dalam metode panggilan balik IWMStatusCallback::OnStatus , menangani empat peristiwa berikut yang terkait dengan proses akuisisi lisensi:

  • WMT_LICENSEURL_SIGNATURE_STATE
  • WMT_NO_RIGHTS
  • WMT_NO_RIGHTS_EX
  • WMT_ACQUIRE_LICENSE

WMT_LICENSEURL_SIGNATURE_STATE

Ketika komponen DRM mendeteksi konten yang dilindungi oleh DRM versi 7, pertama-tama komponen TERSEBUT mencari lisensi yang valid pada sistem lokal. Jika tidak ada, itu kemudian mengevaluasi URL akuisisi lisensi di header DRM file dan mengirim peristiwa WMT_LICENSEURL_SIGNATURE_STATE dengan pValue yang diatur ke salah satu nilai WMT_DRMLA_TRUST , menunjukkan apakah URL tepercaya, tidak tepercaya, atau telah dirusak. Jika URL tidak tepercaya, maka aplikasi harus memperingatkan pengguna. Jika URL telah diubah, maka file harus dianggap rusak, dan aplikasi tidak boleh menavigasi ke URL tanpa mengeluarkan peringatan kuat kepada pengguna.

WMT_NO_RIGHTS

Peristiwa WMT_NO_RIGHTS dikirim hanya untuk konten DRM versi 1, yang berarti bahwa lisensi harus diperoleh secara tidak diam-diam. Dengan kata lain, pengguna harus menavigasi ke halaman Web untuk memperoleh lisensi. URL untuk halaman diambil sebagai string karakter lebar yang dihentikan null dari parameter pValue dalam metode OnStatus .

Jika sesuai, aplikasi dapat mempermudah pengguna untuk menavigasi ke halaman Web, baik dengan membuka Internet Explorer dalam proses terpisah atau dengan menghosting kontrol Browser Web. Namun, ini tidak diperlukan. Setidaknya, aplikasi hanya dapat menampilkan URL kepada pengguna dalam kotak pesan dan meminta mereka untuk menempelkannya ke bilah alamat Internet Explorer. Sampel Audioplayer menunjukkan penanganan peristiwa WMT_NO_RIGHTS yang tepat, termasuk cara memformat string URL, dan cara menggunakan metode CreateProcess untuk membuka Internet Explorer dan menavigasi ke URL yang ditentukan.

Karena aplikasi tidak memiliki cara untuk mengetahui kapan lisensi DRM versi 1 telah diperoleh, terserah pengguna untuk mencoba membuka file lagi setelah memperoleh lisensi.

Proses akuisisi lisensi non-senyap yang sama ini juga dapat digunakan untuk lisensi versi 7, tetapi dalam hal ini aplikasi dapat terlebih dahulu memanggil IWMDRMReader::MonitorLicenseAcquisition. Metode ini akan menyebabkan penyimpanan lisensi lokal diperiksa berulang kali sampai lisensi untuk file baru ditemukan. Pada saat itu, aplikasi akan menerima peristiwa WMT_ACQUIRE_LICENSE . Untuk semua lisensi versi 7, disarankan agar aplikasi memberi pengguna opsi untuk mendapatkan lisensi secara diam-diam atau tidak diam-diam.

WMT_NO_RIGHTS_EX

Peristiwa WMT_NO_RIGHTS_EX menunjukkan bahwa konten dilindungi oleh DRM versi 7, dan oleh karena itu proses akuisisi lisensi dapat dilanjutkan baik secara diam-diam atau tidak diam-diam. Secara umum, akuisisi lisensi senyap lebih nyaman bagi pengguna akhir, meskipun beberapa orang lebih suka memperoleh semua lisensi secara tidak diam-diam. Ketika akuisisi lisensi mengharuskan pengguna untuk mengirimkan pembayaran atau informasi pribadi, proses harus selalu dilakukan tanpa diam-diam. Akuisisi lisensi non-senyap dijelaskan di atas di bawah judul WMT_NO_RIGHTS . Akuisisi senyap berlanjut sebagai berikut:

  1. Transmisikan parameter pValue ke struktur WM_GET_LICENSE_DATA dan simpan struktur jika diperlukan nanti untuk akuisisi lisensi tanpa senyap.
  2. Panggil QueryInterface pada objek pembaca untuk mendapatkan antarmuka IWMDRMReader .
  3. Panggil IWMDRMReader::AcquireLicense dan tentukan 0x1 dalam parameter dwFlags untuk menunjukkan akuisisi bahasa senyap. Ini adalah panggilan asinkron yang segera kembali.
  4. Tunggu peristiwa WMT_ACQUIRE_LICENSE .

WMT_ACQUIRE_LICENSE

Peristiwa WMT_ACQUIRE_LICENSE dikirim setelah proses akuisisi lisensi selesai untuk lisensi DRM versi 7. IWMDRMReader::AcquireLicense menyebabkan peristiwa ini dikirim untuk akuisisi senyap, dan MonitorLicenseAcquisition menyebabkannya dikirim untuk akuisisi tanpa senyap. Di penanganan aktivitas Anda, transmisikan pValue ke penunjuk ke struktur WM_GET_LICENSE_DATA dan periksa anggota sdm untuk menentukan apakah lisensi berhasil diperoleh. Jika jam sama dengan NS_E_DRM_NO_RIGHTS, itu menunjukkan bahwa lisensi harus diperoleh secara tidak diam-diam. Aplikasi harus memungkinkan pengguna untuk membatalkan proses akuisisi lisensi kapan saja. Ini dilakukan dengan memanggil IWMDRMReader::CancelLicenseAcquisition. Memanggil metode ini akan mengirim peristiwa WMT_ACQUIRE_LICENSE dengan nilai HRESULT NS_S_DRM_ACQUIRE_CANCELLED.

Jika jam sama dengan NS_S_DRM_LICENSE_ACQUIRED, maka lisensi telah diperoleh dan aplikasi dapat mencoba memutar file, atau menyalinnya ke perangkat atau melakukan tindakan apa pun yang telah diminta haknya.

Pada Windows XP, kode kesalahan baru diperkenalkan: NS_E_DRM_LICENSE_NOTACQUIRED. Kode galat ini dihasilkan setiap kali komponen run-time Windows Media Format pada Windows XP gagal memperoleh lisensi selama akuisisi lisensi senyap atau tidak diam. Pada platform lain, NS_E_DRM_LICENSE_STORE_ERROR biasanya dikembalikan ketika akuisisi lisensi gagal. Kode kesalahan baru dimaksudkan untuk membedakan kegagalan akuisisi lisensi dari kondisi kegagalan lain di mana NS_E_DRM_LICENSE_STORE_ERROR dihasilkan.

Cara yang disarankan untuk menangani kesalahan ini ketika dikembalikan setelah upaya akuisisi lisensi senyap ditampilkan dalam cuplikan kode berikut:

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.
}

Catatan

DRM tidak didukung oleh versi berbasis x64 dari SDK ini.

 

Membaca File yang Dilindungi