WMFCDMProxyCallback.cpp (3568B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 3 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #include "WMFCDMProxyCallback.h" 6 7 #include "GMPUtils.h" 8 #include "mozilla/EMEUtils.h" 9 #include "mozilla/WMFCDMProxy.h" 10 11 namespace mozilla { 12 13 #define RETURN_IF_NULL(proxy) \ 14 if (!proxy) { \ 15 return; \ 16 } 17 18 #define LOG(msg, ...) \ 19 EME_LOG("WMFCDMProxyCallback[%p]@%s: " msg, this, __func__, ##__VA_ARGS__) 20 21 WMFCDMProxyCallback::WMFCDMProxyCallback(WMFCDMProxy* aProxy) : mProxy(aProxy) { 22 MOZ_ASSERT(NS_IsMainThread()); 23 MOZ_ASSERT(mProxy); 24 } 25 26 WMFCDMProxyCallback::~WMFCDMProxyCallback() { MOZ_ASSERT(!mProxy); } 27 28 void WMFCDMProxyCallback::OnSessionMessage(const MFCDMKeyMessage& aMessage) { 29 NS_DispatchToMainThread(NS_NewRunnableFunction( 30 "WMFCDMProxyCallback::OnSessionMessage", 31 [self = RefPtr{this}, this, message = aMessage]() { 32 RETURN_IF_NULL(mProxy); 33 mProxy->OnSessionMessage(message.sessionId(), message.type(), 34 std::move(message.message())); 35 })); 36 } 37 38 void WMFCDMProxyCallback::OnSessionKeyStatusesChange( 39 const MFCDMKeyStatusChange& aKeyStatuses) { 40 NS_DispatchToMainThread(NS_NewRunnableFunction( 41 "WMFCDMProxyCallback::OnSessionKeyStatusesChange", 42 [self = RefPtr{this}, this, keyStatuses = aKeyStatuses]() { 43 RETURN_IF_NULL(mProxy); 44 bool keyStatusesChange = false; 45 { 46 auto caps = mProxy->Capabilites().Lock(); 47 for (const auto& keyInfo : keyStatuses.keyInfo()) { 48 bool statusChanged = caps->SetKeyStatus( 49 keyInfo.keyId(), keyStatuses.sessionId(), 50 dom::Optional<dom::MediaKeyStatus>(keyInfo.status())); 51 keyStatusesChange |= statusChanged; 52 LOG("Session ID: %s, Key ID: %s, Status changed: %s", 53 NS_ConvertUTF16toUTF8(keyStatuses.sessionId()).get(), 54 ToHexString(keyInfo.keyId()).get(), 55 statusChanged ? "true" : "false"); 56 } 57 } 58 if (keyStatusesChange) { 59 mProxy->OnKeyStatusesChange(keyStatuses.sessionId()); 60 } 61 })); 62 } 63 64 void WMFCDMProxyCallback::OnSessionKeyExpiration( 65 const MFCDMKeyExpiration& aExpiration) { 66 NS_DispatchToMainThread(NS_NewRunnableFunction( 67 "WMFCDMProxyCallback::OnSessionKeyExpiration", 68 [self = RefPtr{this}, this, expiration = aExpiration]() { 69 RETURN_IF_NULL(mProxy); 70 mProxy->OnExpirationChange( 71 expiration.sessionId(), 72 expiration.expiredTimeMilliSecondsSinceEpoch()); 73 })); 74 } 75 76 void WMFCDMProxyCallback::OnSessionClosed( 77 const MFCDMSessionClosedResult& aResult) { 78 NS_DispatchToMainThread(NS_NewRunnableFunction( 79 "WMFCDMProxyCallback::OnSessionClosed", 80 [self = RefPtr{this}, this, result = aResult]() { 81 RETURN_IF_NULL(mProxy); 82 mProxy->OnSessionClosed(result.sessionId(), result.reason()); 83 })); 84 } 85 86 void WMFCDMProxyCallback::OnRemoteProcessCrashed() { 87 NS_DispatchToMainThread( 88 NS_NewRunnableFunction("WMFCDMProxyCallback::OnRemoteProcessCrashed", 89 [self = RefPtr{this}, this]() { 90 RETURN_IF_NULL(mProxy); 91 mProxy->Terminated(); 92 })); 93 } 94 95 void WMFCDMProxyCallback::Shutdown() { 96 MOZ_ASSERT(NS_IsMainThread()); 97 mProxy = nullptr; 98 } 99 100 #undef RETURN_IF_NULL 101 #undef LOG 102 } // namespace mozilla