| 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 926535bfccb3159c600f65f9d8e7468f82460512..b73f9b6995f278f87c84585ca803e6d4e222b200 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"
|
| #include "url/gurl.h"
|
| @@ -19,23 +20,34 @@ namespace media {
|
| typedef MojoCdmPromise<> SimpleMojoCdmPromise;
|
| typedef MojoCdmPromise<std::string> NewSessionMojoCdmPromise;
|
|
|
| +MojoCdmService* MojoCdmService::Create(
|
| + MojoCdmServiceContext* context,
|
| + const mojo::String& key_system,
|
| + mojo::InterfaceRequest<mojo::ContentDecryptionModule> request) {
|
| + // Only AesDecryptor is supported.
|
| + // TODO(xhwang): Use a CdmFactory to create the CDM here. See
|
| + // http://crbug.com/495273
|
| + if (!CanUseAesDecryptor(key_system))
|
| + return nullptr;
|
| +
|
| + // TODO(xhwang): Pass security origin through.
|
| + return new MojoCdmService(context, key_system, request.Pass());
|
| +}
|
| +
|
| MojoCdmService::MojoCdmService(
|
| + MojoCdmServiceContext* context,
|
| const mojo::String& key_system,
|
| mojo::InterfaceRequest<mojo::ContentDecryptionModule> request)
|
| - : binding_(this, request.Pass()), weak_factory_(this) {
|
| - base::WeakPtr<MojoCdmService> weak_this = weak_factory_.GetWeakPtr();
|
| + : binding_(this, request.Pass()), context_(context), weak_factory_(this) {
|
| + DVLOG(1) << __FUNCTION__ << ": " << key_system;
|
| + DCHECK(CanUseAesDecryptor(key_system));
|
|
|
| - if (CanUseAesDecryptor(key_system)) {
|
| - // TODO(jrummell): Determine proper origin.
|
| - cdm_.reset(new AesDecryptor(
|
| - GURL::EmptyGURL(),
|
| - base::Bind(&MojoCdmService::OnSessionMessage, weak_this),
|
| - base::Bind(&MojoCdmService::OnSessionClosed, weak_this),
|
| - base::Bind(&MojoCdmService::OnSessionKeysChange, weak_this)));
|
| - }
|
| -
|
| - // TODO(xhwang): Check key system support in the app.
|
| - NOTREACHED();
|
| + base::WeakPtr<MojoCdmService> weak_this = weak_factory_.GetWeakPtr();
|
| + cdm_.reset(new AesDecryptor(
|
| + GURL::EmptyGURL(),
|
| + base::Bind(&MojoCdmService::OnSessionMessage, weak_this),
|
| + base::Bind(&MojoCdmService::OnSessionClosed, weak_this),
|
| + base::Bind(&MojoCdmService::OnSessionKeysChange, weak_this)));
|
| }
|
|
|
| MojoCdmService::~MojoCdmService() {
|
| @@ -49,9 +61,10 @@ 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__;
|
| cdm_->SetServerCertificate(
|
| certificate_data.storage(),
|
| - scoped_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback)));
|
| + make_scoped_ptr(new SimpleMojoCdmPromise(callback)));
|
| }
|
|
|
| void MojoCdmService::CreateSessionAndGenerateRequest(
|
| @@ -60,10 +73,11 @@ void MojoCdmService::CreateSessionAndGenerateRequest(
|
| mojo::Array<uint8_t> init_data,
|
| const mojo::Callback<void(mojo::CdmPromiseResultPtr, mojo::String)>&
|
| callback) {
|
| + DVLOG(2) << __FUNCTION__;
|
| cdm_->CreateSessionAndGenerateRequest(
|
| static_cast<MediaKeys::SessionType>(session_type),
|
| static_cast<EmeInitDataType>(init_data_type), init_data.storage(),
|
| - scoped_ptr<NewSessionCdmPromise>(new NewSessionMojoCdmPromise(callback)));
|
| + make_scoped_ptr(new NewSessionMojoCdmPromise(callback)));
|
| }
|
|
|
| void MojoCdmService::LoadSession(
|
| @@ -71,16 +85,17 @@ 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__;
|
| cdm_->UpdateSession(
|
| session_id.To<std::string>(), response.storage(),
|
| scoped_ptr<SimpleCdmPromise>(new SimpleMojoCdmPromise(callback)));
|
| @@ -89,17 +104,17 @@ void MojoCdmService::UpdateSession(
|
| 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(
|
| @@ -108,10 +123,22 @@ void MojoCdmService::GetCdmContext(
|
| NOTIMPLEMENTED();
|
| }
|
|
|
| +CdmContext* MojoCdmService::GetCdmContext() {
|
| + return cdm_->GetCdmContext();
|
| +}
|
| +
|
| +void MojoCdmService::OnConnectionError() {
|
| + DVLOG(1) << __FUNCTION__;
|
| + 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),
|
| @@ -121,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));
|
| @@ -131,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_sec) {
|
| + DVLOG(2) << __FUNCTION__;
|
| client_->OnSessionExpirationUpdate(session_id,
|
| new_expiry_time_sec.ToDoubleT());
|
| }
|
|
|
| void MojoCdmService::OnSessionClosed(const std::string& session_id) {
|
| + DVLOG(2) << __FUNCTION__;
|
| client_->OnSessionClosed(session_id);
|
| }
|
|
|
| @@ -143,6 +173,7 @@ void MojoCdmService::OnLegacySessionError(const std::string& session_id,
|
| MediaKeys::Exception exception,
|
| uint32_t system_code,
|
| const std::string& error_message) {
|
| + DVLOG(2) << __FUNCTION__;
|
| client_->OnLegacySessionError(session_id,
|
| static_cast<mojo::CdmException>(exception),
|
| system_code, error_message);
|
|
|