Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(316)

Side by Side Diff: media/cdm/ppapi/external_clear_key/clear_key_cdm.cc

Issue 604283003: Refactor CdmPromise and related classes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/cdm/ppapi/external_clear_key/clear_key_cdm.h" 5 #include "media/cdm/ppapi/external_clear_key/clear_key_cdm.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cstring> 8 #include <cstring>
9 #include <sstream> 9 #include <sstream>
10 #include <string> 10 #include <string>
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 241
242 void ClearKeyCdm::CreateSession(uint32 promise_id, 242 void ClearKeyCdm::CreateSession(uint32 promise_id,
243 const char* init_data_type, 243 const char* init_data_type,
244 uint32 init_data_type_size, 244 uint32 init_data_type_size,
245 const uint8* init_data, 245 const uint8* init_data,
246 uint32 init_data_size, 246 uint32 init_data_size,
247 cdm::SessionType session_type) { 247 cdm::SessionType session_type) {
248 DVLOG(1) << __FUNCTION__; 248 DVLOG(1) << __FUNCTION__;
249 249
250 scoped_ptr<media::NewSessionCdmPromise> promise( 250 scoped_ptr<media::NewSessionCdmPromise> promise(
251 new media::NewSessionCdmPromise(base::Bind(&ClearKeyCdm::OnSessionCreated, 251 new media::CdmCallbackPromise<std::string>(
252 base::Unretained(this), 252 base::Bind(&ClearKeyCdm::OnSessionCreated,
253 promise_id), 253 base::Unretained(this),
254 base::Bind(&ClearKeyCdm::OnPromiseFailed, 254 promise_id),
255 base::Unretained(this), 255 base::Bind(&ClearKeyCdm::OnPromiseFailed,
256 promise_id))); 256 base::Unretained(this),
257 promise_id)));
257 decryptor_.CreateSession(std::string(init_data_type, init_data_type_size), 258 decryptor_.CreateSession(std::string(init_data_type, init_data_type_size),
258 init_data, 259 init_data,
259 init_data_size, 260 init_data_size,
260 ConvertSessionType(session_type), 261 ConvertSessionType(session_type),
261 promise.Pass()); 262 promise.Pass());
262 263
263 if (key_system_ == kExternalClearKeyFileIOTestKeySystem) 264 if (key_system_ == kExternalClearKeyFileIOTestKeySystem)
264 StartFileIOTest(); 265 StartFileIOTest();
265 } 266 }
266 267
(...skipping 11 matching lines...) Expand all
278 std::string message("Incorrect session id specified for LoadSession()."); 279 std::string message("Incorrect session id specified for LoadSession().");
279 host_->OnRejectPromise(promise_id, 280 host_->OnRejectPromise(promise_id,
280 cdm::kInvalidAccessError, 281 cdm::kInvalidAccessError,
281 0, 282 0,
282 message.data(), 283 message.data(),
283 message.length()); 284 message.length());
284 return; 285 return;
285 } 286 }
286 287
287 scoped_ptr<media::NewSessionCdmPromise> promise( 288 scoped_ptr<media::NewSessionCdmPromise> promise(
288 new media::NewSessionCdmPromise(base::Bind(&ClearKeyCdm::OnSessionLoaded, 289 new media::CdmCallbackPromise<std::string>(
289 base::Unretained(this), 290 base::Bind(&ClearKeyCdm::OnSessionLoaded,
290 promise_id), 291 base::Unretained(this),
291 base::Bind(&ClearKeyCdm::OnPromiseFailed, 292 promise_id),
292 base::Unretained(this), 293 base::Bind(&ClearKeyCdm::OnPromiseFailed,
293 promise_id))); 294 base::Unretained(this),
295 promise_id)));
294 decryptor_.CreateSession(std::string(kLoadableSessionContentType), 296 decryptor_.CreateSession(std::string(kLoadableSessionContentType),
295 NULL, 297 NULL,
296 0, 298 0,
297 MediaKeys::TEMPORARY_SESSION, 299 MediaKeys::TEMPORARY_SESSION,
298 promise.Pass()); 300 promise.Pass());
299 } 301 }
300 302
301 void ClearKeyCdm::UpdateSession(uint32 promise_id, 303 void ClearKeyCdm::UpdateSession(uint32 promise_id,
302 const char* web_session_id, 304 const char* web_session_id,
303 uint32_t web_session_id_length, 305 uint32_t web_session_id_length,
304 const uint8* response, 306 const uint8* response,
305 uint32 response_size) { 307 uint32 response_size) {
306 DVLOG(1) << __FUNCTION__; 308 DVLOG(1) << __FUNCTION__;
307 std::string web_session_str(web_session_id, web_session_id_length); 309 std::string web_session_str(web_session_id, web_session_id_length);
308 310
309 scoped_ptr<media::SimpleCdmPromise> promise(new media::SimpleCdmPromise( 311 scoped_ptr<media::SimpleCdmPromise> promise(
310 base::Bind(&ClearKeyCdm::OnSessionUpdated, 312 new media::CdmCallbackPromise<void>(
311 base::Unretained(this), 313 base::Bind(&ClearKeyCdm::OnSessionUpdated,
312 promise_id, 314 base::Unretained(this),
313 web_session_str), 315 promise_id,
314 base::Bind( 316 web_session_str),
315 &ClearKeyCdm::OnPromiseFailed, base::Unretained(this), promise_id))); 317 base::Bind(&ClearKeyCdm::OnPromiseFailed,
318 base::Unretained(this),
319 promise_id)));
316 decryptor_.UpdateSession( 320 decryptor_.UpdateSession(
317 web_session_str, response, response_size, promise.Pass()); 321 web_session_str, response, response_size, promise.Pass());
318 322
319 if (!heartbeat_timer_set_) { 323 if (!heartbeat_timer_set_) {
320 ScheduleNextHeartBeat(); 324 ScheduleNextHeartBeat();
321 heartbeat_timer_set_ = true; 325 heartbeat_timer_set_ = true;
322 } 326 }
323 } 327 }
324 328
325 void ClearKeyCdm::CloseSession(uint32 promise_id, 329 void ClearKeyCdm::CloseSession(uint32 promise_id,
326 const char* web_session_id, 330 const char* web_session_id,
327 uint32_t web_session_id_length) { 331 uint32_t web_session_id_length) {
328 DVLOG(1) << __FUNCTION__; 332 DVLOG(1) << __FUNCTION__;
329 std::string web_session_str(web_session_id, web_session_id_length); 333 std::string web_session_str(web_session_id, web_session_id_length);
330 334
331 scoped_ptr<media::SimpleCdmPromise> promise(new media::SimpleCdmPromise( 335 scoped_ptr<media::SimpleCdmPromise>
336 promise(new media::CdmCallbackPromise<void>(
332 base::Bind( 337 base::Bind(
333 &ClearKeyCdm::OnPromiseResolved, base::Unretained(this), promise_id), 338 &ClearKeyCdm::OnPromiseResolved, base::Unretained(this), promise_id),
334 base::Bind( 339 base::Bind(
335 &ClearKeyCdm::OnPromiseFailed, base::Unretained(this), promise_id))); 340 &ClearKeyCdm::OnPromiseFailed, base::Unretained(this), promise_id)));
336 decryptor_.CloseSession(web_session_str, promise.Pass()); 341 decryptor_.CloseSession(web_session_str, promise.Pass());
337 } 342 }
338 343
339 void ClearKeyCdm::RemoveSession(uint32 promise_id, 344 void ClearKeyCdm::RemoveSession(uint32 promise_id,
340 const char* web_session_id, 345 const char* web_session_id,
341 uint32_t web_session_id_length) { 346 uint32_t web_session_id_length) {
342 DVLOG(1) << __FUNCTION__; 347 DVLOG(1) << __FUNCTION__;
343 // RemoveSession only allowed for persistent sessions. 348 // RemoveSession only allowed for persistent sessions.
344 bool is_persistent_session = 349 bool is_persistent_session =
345 std::string(kLoadableWebSessionId) == 350 std::string(kLoadableWebSessionId) ==
346 std::string(web_session_id, web_session_id_length); 351 std::string(web_session_id, web_session_id_length);
347 if (is_persistent_session) { 352 if (is_persistent_session) {
348 std::string web_session_str(web_session_id, web_session_id_length); 353 std::string web_session_str(web_session_id, web_session_id_length);
349 354
350 scoped_ptr<media::SimpleCdmPromise> promise( 355 scoped_ptr<media::SimpleCdmPromise> promise(
351 new media::SimpleCdmPromise(base::Bind(&ClearKeyCdm::OnPromiseResolved, 356 new media::CdmCallbackPromise<void>(
352 base::Unretained(this), 357 base::Bind(&ClearKeyCdm::OnPromiseResolved,
353 promise_id), 358 base::Unretained(this),
354 base::Bind(&ClearKeyCdm::OnPromiseFailed, 359 promise_id),
355 base::Unretained(this), 360 base::Bind(&ClearKeyCdm::OnPromiseFailed,
356 promise_id))); 361 base::Unretained(this),
362 promise_id)));
357 decryptor_.RemoveSession(web_session_str, promise.Pass()); 363 decryptor_.RemoveSession(web_session_str, promise.Pass());
358 } else { 364 } else {
359 // TODO(jrummell): This should be a DCHECK once blink does the proper 365 // TODO(jrummell): This should be a DCHECK once blink does the proper
360 // checks. 366 // checks.
361 std::string message("Not supported for non-persistent sessions."); 367 std::string message("Not supported for non-persistent sessions.");
362 host_->OnRejectPromise(promise_id, 368 host_->OnRejectPromise(promise_id,
363 cdm::kInvalidAccessError, 369 cdm::kInvalidAccessError,
364 0, 370 0,
365 message.data(), 371 message.data(),
366 message.length()); 372 message.length());
367 } 373 }
368 } 374 }
369 375
370 void ClearKeyCdm::SetServerCertificate(uint32 promise_id, 376 void ClearKeyCdm::SetServerCertificate(uint32 promise_id,
371 const uint8_t* server_certificate_data, 377 const uint8_t* server_certificate_data,
372 uint32_t server_certificate_data_size) { 378 uint32_t server_certificate_data_size) {
373 // ClearKey doesn't use a server certificate. 379 // ClearKey doesn't use a server certificate.
374 host_->OnResolvePromise(promise_id); 380 host_->OnResolvePromise(promise_id);
375 } 381 }
376 382
377 void ClearKeyCdm::GetUsableKeyIds(uint32_t promise_id, 383 void ClearKeyCdm::GetUsableKeyIds(uint32_t promise_id,
378 const char* web_session_id, 384 const char* web_session_id,
379 uint32_t web_session_id_length) { 385 uint32_t web_session_id_length) {
380 std::string web_session_str(web_session_id, web_session_id_length); 386 std::string web_session_str(web_session_id, web_session_id_length);
381 scoped_ptr<media::KeyIdsPromise> promise(new media::KeyIdsPromise( 387 scoped_ptr<media::KeyIdsPromise> promise(
382 base::Bind(&ClearKeyCdm::OnUsableKeyIdsObtained, 388 new media::CdmCallbackPromise<KeyIdsVector>(
383 base::Unretained(this), 389 base::Bind(&ClearKeyCdm::OnUsableKeyIdsObtained,
384 promise_id), 390 base::Unretained(this),
385 base::Bind( 391 promise_id),
386 &ClearKeyCdm::OnPromiseFailed, base::Unretained(this), promise_id))); 392 base::Bind(&ClearKeyCdm::OnPromiseFailed,
393 base::Unretained(this),
394 promise_id)));
387 decryptor_.GetUsableKeyIds(web_session_str, promise.Pass()); 395 decryptor_.GetUsableKeyIds(web_session_str, promise.Pass());
388 } 396 }
389 397
390 void ClearKeyCdm::TimerExpired(void* context) { 398 void ClearKeyCdm::TimerExpired(void* context) {
391 if (context == &session_id_for_emulated_loadsession_) { 399 if (context == &session_id_for_emulated_loadsession_) {
392 LoadLoadableSession(); 400 LoadLoadableSession();
393 return; 401 return;
394 } 402 }
395 403
396 DCHECK(heartbeat_timer_set_); 404 DCHECK(heartbeat_timer_set_);
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 NOTIMPLEMENTED(); 661 NOTIMPLEMENTED();
654 }; 662 };
655 663
656 void ClearKeyCdm::LoadLoadableSession() { 664 void ClearKeyCdm::LoadLoadableSession() {
657 std::string jwk_set = GenerateJWKSet(kLoadableSessionKey, 665 std::string jwk_set = GenerateJWKSet(kLoadableSessionKey,
658 sizeof(kLoadableSessionKey), 666 sizeof(kLoadableSessionKey),
659 kLoadableSessionKeyId, 667 kLoadableSessionKeyId,
660 sizeof(kLoadableSessionKeyId) - 1); 668 sizeof(kLoadableSessionKeyId) - 1);
661 // TODO(xhwang): This triggers OnSessionUpdated(). For prefixed EME support, 669 // TODO(xhwang): This triggers OnSessionUpdated(). For prefixed EME support,
662 // this is okay. Check WD EME support. 670 // this is okay. Check WD EME support.
663 scoped_ptr<media::SimpleCdmPromise> promise(new media::SimpleCdmPromise( 671 scoped_ptr<media::SimpleCdmPromise> promise(
664 base::Bind(&ClearKeyCdm::OnSessionUpdated, 672 new media::CdmCallbackPromise<void>(
665 base::Unretained(this), 673 base::Bind(&ClearKeyCdm::OnSessionUpdated,
666 promise_id_for_emulated_loadsession_, 674 base::Unretained(this),
667 session_id_for_emulated_loadsession_), 675 promise_id_for_emulated_loadsession_,
668 base::Bind(&ClearKeyCdm::OnPromiseFailed, 676 session_id_for_emulated_loadsession_),
669 base::Unretained(this), 677 base::Bind(&ClearKeyCdm::OnPromiseFailed,
670 promise_id_for_emulated_loadsession_))); 678 base::Unretained(this),
679 promise_id_for_emulated_loadsession_)));
671 decryptor_.UpdateSession(session_id_for_emulated_loadsession_, 680 decryptor_.UpdateSession(session_id_for_emulated_loadsession_,
672 reinterpret_cast<const uint8*>(jwk_set.data()), 681 reinterpret_cast<const uint8*>(jwk_set.data()),
673 jwk_set.size(), 682 jwk_set.size(),
674 promise.Pass()); 683 promise.Pass());
675 } 684 }
676 685
677 void ClearKeyCdm::OnSessionMessage(const std::string& web_session_id, 686 void ClearKeyCdm::OnSessionMessage(const std::string& web_session_id,
678 const std::vector<uint8>& message, 687 const std::vector<uint8>& message,
679 const GURL& destination_url) { 688 const GURL& destination_url) {
680 DVLOG(1) << "OnSessionMessage: " << message.size(); 689 DVLOG(1) << "OnSessionMessage: " << message.size();
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 host_->OnSessionMessage(last_session_id_.data(), 857 host_->OnSessionMessage(last_session_id_.data(),
849 last_session_id_.length(), 858 last_session_id_.length(),
850 message.data(), 859 message.data(),
851 message.length(), 860 message.length(),
852 NULL, 861 NULL,
853 0); 862 0);
854 file_io_test_runner_.reset(); 863 file_io_test_runner_.reset();
855 } 864 }
856 865
857 } // namespace media 866 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698