1111#include " WVDecrypter.h"
1212#include " decrypters/HelperWv.h"
1313#include " decrypters/Helpers.h"
14+ #include " utils/StringUtils.h"
1415#include " utils/FileUtils.h"
1516#include " utils/log.h"
1617
@@ -36,6 +37,24 @@ void CMediaDrmOnEventListener::onEvent(const CJNIMediaDrm& mediaDrm,
3637 m_decrypterEventCallback->OnMediaDrmEvent (mediaDrm, sessionId, event, extra, data);
3738}
3839
40+ CMediaDrmOnKeyStatusChangeListener::CMediaDrmOnKeyStatusChangeListener (
41+ CMediaDrmOnKeyStatusChangeCallback* decrypterOnKeyStatusChangeCallback,
42+ std::shared_ptr<CJNIClassLoader> classLoader)
43+ : CJNIMediaDrmOnKeyStatusChangeListener(*classLoader)
44+ {
45+ m_decrypterOnKeyStatusChangeCallback = decrypterOnKeyStatusChangeCallback;
46+ }
47+
48+ void CMediaDrmOnKeyStatusChangeListener::onKeyStatusChange (
49+ const CJNIMediaDrm& mediaDrm,
50+ const std::vector<char >& sessionId,
51+ const CJNIList<CJNIMediaDrmKeyStatus>& keyInformation,
52+ bool hasNewUsableKey)
53+ {
54+ m_decrypterOnKeyStatusChangeCallback->OnKeyStatusChange (mediaDrm, sessionId, keyInformation,
55+ hasNewUsableKey);
56+ }
57+
3958CWVCdmAdapterA::CWVCdmAdapterA (std::string_view keySystem,
4059 const DRM::Config& config,
4160 std::shared_ptr<CJNIClassLoader> jniClassLoader,
@@ -80,14 +99,28 @@ CWVCdmAdapterA::CWVCdmAdapterA(std::string_view keySystem,
8099
81100 // Create media drm EventListener (unique_ptr explanation on class comment)
82101 m_mediaDrmEventListener = std::make_unique<CMediaDrmOnEventListener>(this , jniClassLoader);
83- m_cdmAdapter->setOnEventListener (*m_mediaDrmEventListener.get ());
84102 if (xbmc_jnienv ()->ExceptionCheck ())
85103 {
86104 LOG::LogF (LOGERROR, " Exception during installation of EventListener" );
87105 xbmc_jnienv ()->ExceptionClear ();
88106 m_cdmAdapter->release ();
89107 return ;
90108 }
109+ m_cdmAdapter->setOnEventListener (*m_mediaDrmEventListener.get ());
110+
111+ // Create media drm OnKeyStatusChangeListener (unique_ptr explanation on class comment)
112+ m_mediaDrmOnKeyChangeListener =
113+ std::make_unique<CMediaDrmOnKeyStatusChangeListener>(this , jniClassLoader);
114+ if (xbmc_jnienv ()->ExceptionCheck ())
115+ {
116+ LOG::LogF (LOGERROR, " Exception during installation of OnKeyStatusChangeListener" );
117+ xbmc_jnienv ()->ExceptionClear ();
118+ m_cdmAdapter->release ();
119+ return ;
120+ }
121+ CJNIMediaDrmKeyStatus::PopulateStaticFields (); // should be done by CJNIContext but currently not implemented for add-ons case
122+ m_cdmAdapter->setOnKeyStatusChangeListener (*m_mediaDrmOnKeyChangeListener.get ());
123+
91124
92125 std::vector<uint8_t > strDeviceId = m_cdmAdapter->getPropertyByteArray (" deviceUniqueId" );
93126 xbmc_jnienv ()->ExceptionClear ();
@@ -199,6 +232,29 @@ void CWVCdmAdapterA::OnMediaDrmEvent(const CJNIMediaDrm& mediaDrm,
199232 NotifyObservers (cdmMsg);
200233}
201234
235+ void CWVCdmAdapterA::OnKeyStatusChange (const CJNIMediaDrm& mediaDrm,
236+ const std::vector<char >& sessionId,
237+ const CJNIList<CJNIMediaDrmKeyStatus>& keyInformation,
238+ bool hasNewUsableKey)
239+ {
240+ LOG::LogF (LOGDEBUG, " MediaDrm OnKeyStatusChange event: SID %s" , sessionId.data ());
241+
242+ if (keyInformation.size () == 0 )
243+ {
244+ LOG::LogF (LOGWARNING, " MediaDrm OnKeyStatusChange: NO KEYS" );
245+ return ;
246+ }
247+
248+ for (int i = 0 ; i < keyInformation.size (); ++i)
249+ {
250+ const std::vector<uint8_t > kid = keyInformation.get (i).getKeyId ();
251+ const int statusCode = keyInformation.get (i).getStatusCode ();
252+
253+ LOG::LogF (LOGWARNING, " MediaDrm OnKeyStatusChange: KID %s, status code: %i" ,
254+ STRING::ToHexadecimal (kid).c_str (), statusCode);
255+ }
256+ }
257+
202258void CWVCdmAdapterA::SaveServiceCertificate ()
203259{
204260 const std::vector<uint8_t > sc = m_cdmAdapter->getPropertyByteArray (" serviceCertificate" );
0 commit comments