Chromium Code Reviews| Index: media/mojo/services/mojo_cdm_service.cc |
| diff --git a/media/mojo/services/mojo_cdm_service.cc b/media/mojo/services/mojo_cdm_service.cc |
| index c67897d78e6f9c3447adea68944034b33dc00288..55abea45271d770cc9163f1f6d85d636fff97607 100644 |
| --- a/media/mojo/services/mojo_cdm_service.cc |
| +++ b/media/mojo/services/mojo_cdm_service.cc |
| @@ -10,6 +10,7 @@ |
| #include "media/cdm/aes_decryptor.h" |
| #include "media/mojo/services/media_type_converters.h" |
| #include "media/mojo/services/mojo_cdm_promise.h" |
| +#include "media/mojo/services/mojo_cdm_service_context.h" |
| #include "mojo/common/common_type_converters.h" |
| #include "mojo/common/url_type_converters.h" |
| @@ -18,19 +19,26 @@ namespace media { |
| typedef MojoCdmPromise<> SimpleMojoCdmPromise; |
| typedef MojoCdmPromise<std::string> NewSessionMojoCdmPromise; |
| -MojoCdmService::MojoCdmService(const mojo::String& key_system) |
| - : weak_factory_(this) { |
| - base::WeakPtr<MojoCdmService> weak_this = weak_factory_.GetWeakPtr(); |
| +MojoCdmService* MojoCdmService::Create(MojoCdmServiceContext* context, |
| + const mojo::String& key_system) { |
| + // Only AesDecryptor is supported. |
|
ddorwin
2015/05/15 19:10:07
TODO with bug?
xhwang
2015/06/01 21:21:24
Done.
|
| + if (!CanUseAesDecryptor(key_system)) |
| + return nullptr; |
| + |
| + return new MojoCdmService(context, key_system); |
| +} |
| - if (CanUseAesDecryptor(key_system)) { |
| - cdm_.reset(new AesDecryptor( |
| - base::Bind(&MojoCdmService::OnSessionMessage, weak_this), |
| - base::Bind(&MojoCdmService::OnSessionClosed, weak_this), |
| - base::Bind(&MojoCdmService::OnSessionKeysChange, weak_this))); |
| - } |
| +MojoCdmService::MojoCdmService(MojoCdmServiceContext* context, |
| + const mojo::String& key_system) |
| + : context_(context), weak_factory_(this) { |
| + DVLOG(1) << __FUNCTION__ << ": " << key_system; |
| + DCHECK(CanUseAesDecryptor(key_system)); |
| - // TODO(xhwang): Check key system support in the app. |
| - NOTREACHED(); |
| + base::WeakPtr<MojoCdmService> weak_this = weak_factory_.GetWeakPtr(); |
| + cdm_.reset(new AesDecryptor( |
| + base::Bind(&MojoCdmService::OnSessionMessage, weak_this), |
| + base::Bind(&MojoCdmService::OnSessionClosed, weak_this), |
| + base::Bind(&MojoCdmService::OnSessionKeysChange, weak_this))); |
| } |
| MojoCdmService::~MojoCdmService() { |
| @@ -44,12 +52,13 @@ void MojoCdmService::SetClient(mojo::ContentDecryptionModuleClientPtr client) { |
| void MojoCdmService::SetServerCertificate( |
| mojo::Array<uint8_t> certificate_data, |
| const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) { |
| + DVLOG(2) << __FUNCTION__; |
| const std::vector<uint8_t>& certificate_data_vector = |
| certificate_data.storage(); |
| cdm_->SetServerCertificate( |
| certificate_data_vector.empty() ? nullptr : &certificate_data_vector[0], |
| certificate_data_vector.size(), |
| - scoped_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback))); |
| + make_scoped_ptr(new SimpleMojoCdmPromise(callback))); |
| } |
| void MojoCdmService::CreateSessionAndGenerateRequest( |
| @@ -58,13 +67,14 @@ void MojoCdmService::CreateSessionAndGenerateRequest( |
| mojo::Array<uint8_t> init_data, |
| const mojo::Callback<void(mojo::CdmPromiseResultPtr, mojo::String)>& |
| callback) { |
| + DVLOG(2) << __FUNCTION__; |
| const std::vector<uint8_t>& init_data_vector = init_data.storage(); |
| cdm_->CreateSessionAndGenerateRequest( |
| static_cast<MediaKeys::SessionType>(session_type), |
| init_data_type.To<std::string>(), |
| init_data_vector.empty() ? nullptr : &init_data_vector[0], |
| init_data_vector.size(), |
| - scoped_ptr<NewSessionCdmPromise>(new NewSessionMojoCdmPromise(callback))); |
| + make_scoped_ptr(new NewSessionMojoCdmPromise(callback))); |
| } |
| void MojoCdmService::LoadSession( |
| @@ -72,50 +82,63 @@ void MojoCdmService::LoadSession( |
| const mojo::String& session_id, |
| const mojo::Callback<void(mojo::CdmPromiseResultPtr, mojo::String)>& |
| callback) { |
| - cdm_->LoadSession( |
| - static_cast<MediaKeys::SessionType>(session_type), |
| - session_id.To<std::string>(), |
| - scoped_ptr<NewSessionCdmPromise>(new NewSessionMojoCdmPromise(callback))); |
| + DVLOG(2) << __FUNCTION__; |
| + cdm_->LoadSession(static_cast<MediaKeys::SessionType>(session_type), |
| + session_id.To<std::string>(), |
| + make_scoped_ptr(new NewSessionMojoCdmPromise(callback))); |
| } |
| void MojoCdmService::UpdateSession( |
| const mojo::String& session_id, |
| mojo::Array<uint8_t> response, |
| const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) { |
| + DVLOG(2) << __FUNCTION__; |
| const std::vector<uint8_t>& response_vector = response.storage(); |
| - cdm_->UpdateSession( |
| - session_id.To<std::string>(), |
| - response_vector.empty() ? nullptr : &response_vector[0], |
| - response_vector.size(), |
| - scoped_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback))); |
| + cdm_->UpdateSession(session_id.To<std::string>(), |
| + response_vector.empty() ? nullptr : &response_vector[0], |
| + response_vector.size(), |
| + make_scoped_ptr(new SimpleMojoCdmPromise(callback))); |
| } |
| void MojoCdmService::CloseSession( |
| const mojo::String& session_id, |
| const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) { |
| - cdm_->CloseSession( |
| - session_id.To<std::string>(), |
| - scoped_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback))); |
| + DVLOG(2) << __FUNCTION__; |
| + cdm_->CloseSession(session_id.To<std::string>(), |
| + make_scoped_ptr(new SimpleMojoCdmPromise(callback))); |
| } |
| void MojoCdmService::RemoveSession( |
| const mojo::String& session_id, |
| const mojo::Callback<void(mojo::CdmPromiseResultPtr)>& callback) { |
| - cdm_->RemoveSession( |
| - session_id.To<std::string>(), |
| - scoped_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback))); |
| + DVLOG(2) << __FUNCTION__; |
| + cdm_->RemoveSession(session_id.To<std::string>(), |
| + make_scoped_ptr(new SimpleMojoCdmPromise(callback))); |
| } |
| -void MojoCdmService::GetCdmContext( |
| - int32_t cdm_id, |
| +void MojoCdmService::GetDecryptor( |
| mojo::InterfaceRequest<mojo::Decryptor> decryptor) { |
| NOTIMPLEMENTED(); |
| } |
| +CdmContext* MojoCdmService::GetCdmContext() { |
| + DVLOG(2) << __FUNCTION__; |
| + return cdm_->GetCdmContext(); |
| +} |
| + |
| +void MojoCdmService::OnConnectionError() { |
| + DVLOG(2) << __FUNCTION__; |
|
ddorwin
2015/05/15 19:10:07
Should this be a DLOG(ERROR)?
xhwang
2015/06/01 21:21:24
This will happen when the client (MojoCdm) is dest
|
| + context_->ServiceHadConnectionError(this); |
| + |
| + // The above call deleted this instance, so the only safe thing to do is |
| + // return. |
| +} |
| + |
| void MojoCdmService::OnSessionMessage(const std::string& session_id, |
| MediaKeys::MessageType message_type, |
| const std::vector<uint8_t>& message, |
| const GURL& legacy_destination_url) { |
| + DVLOG(2) << __FUNCTION__; |
| client_->OnSessionMessage(session_id, |
| static_cast<mojo::CdmMessageType>(message_type), |
| mojo::Array<uint8_t>::From(message), |
| @@ -125,6 +148,7 @@ void MojoCdmService::OnSessionMessage(const std::string& session_id, |
| void MojoCdmService::OnSessionKeysChange(const std::string& session_id, |
| bool has_additional_usable_key, |
| CdmKeysInfo keys_info) { |
| + DVLOG(2) << __FUNCTION__; |
| mojo::Array<mojo::CdmKeyInformationPtr> keys_data; |
| for (const auto& key : keys_info) |
| keys_data.push_back(mojo::CdmKeyInformation::From(*key)); |
| @@ -135,11 +159,13 @@ void MojoCdmService::OnSessionKeysChange(const std::string& session_id, |
| void MojoCdmService::OnSessionExpirationUpdate( |
| const std::string& session_id, |
| const base::Time& new_expiry_time) { |
| + DVLOG(2) << __FUNCTION__; |
| client_->OnSessionExpirationUpdate(session_id, |
| new_expiry_time.ToInternalValue()); |
| } |
| void MojoCdmService::OnSessionClosed(const std::string& session_id) { |
| + DVLOG(2) << __FUNCTION__; |
| client_->OnSessionClosed(session_id); |
| } |
| @@ -147,6 +173,7 @@ void MojoCdmService::OnSessionError(const std::string& session_id, |
| MediaKeys::Exception exception, |
| uint32_t system_code, |
| const std::string& error_message) { |
| + DVLOG(2) << __FUNCTION__; |
| client_->OnSessionError(session_id, |
| static_cast<mojo::CdmException>(exception), |
| system_code, error_message); |