1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CONTENT_RENDERER_MEDIA_CRYPTO_PROXY_MEDIA_KEYS_H_
6 #define CONTENT_RENDERER_MEDIA_CRYPTO_PROXY_MEDIA_KEYS_H_
11 #include "base/basictypes.h"
12 #include "base/containers/hash_tables.h"
13 #include "base/containers/scoped_ptr_hash_map.h"
14 #include "media/base/cdm_promise.h"
15 #include "media/base/media_keys.h"
21 class RendererCdmManager;
23 // A MediaKeys proxy that wraps the EME part of RendererCdmManager.
24 class ProxyMediaKeys : public media::MediaKeys {
26 static scoped_ptr<ProxyMediaKeys> Create(
27 const std::string& key_system,
28 const GURL& security_origin,
29 RendererCdmManager* manager,
30 const media::SessionMessageCB& session_message_cb,
31 const media::SessionReadyCB& session_ready_cb,
32 const media::SessionClosedCB& session_closed_cb,
33 const media::SessionErrorCB& session_error_cb,
34 const media::SessionKeysChangeCB& session_keys_change_cb,
35 const media::SessionExpirationUpdateCB& session_expiration_update_cb);
37 virtual ~ProxyMediaKeys();
39 // MediaKeys implementation.
40 virtual void SetServerCertificate(
41 const uint8* certificate_data,
42 int certificate_data_length,
43 scoped_ptr<media::SimpleCdmPromise> promise) OVERRIDE;
44 virtual void CreateSession(
45 const std::string& init_data_type,
46 const uint8* init_data,
48 SessionType session_type,
49 scoped_ptr<media::NewSessionCdmPromise> promise) OVERRIDE;
50 virtual void LoadSession(
51 const std::string& web_session_id,
52 scoped_ptr<media::NewSessionCdmPromise> promise) OVERRIDE;
53 virtual void UpdateSession(
54 const std::string& web_session_id,
55 const uint8* response,
57 scoped_ptr<media::SimpleCdmPromise> promise) OVERRIDE;
58 virtual void CloseSession(
59 const std::string& web_session_id,
60 scoped_ptr<media::SimpleCdmPromise> promise) OVERRIDE;
61 virtual void RemoveSession(
62 const std::string& web_session_id,
63 scoped_ptr<media::SimpleCdmPromise> promise) OVERRIDE;
64 virtual void GetUsableKeyIds(
65 const std::string& web_session_id,
66 scoped_ptr<media::KeyIdsPromise> promise) OVERRIDE;
69 void OnSessionCreated(uint32 session_id, const std::string& web_session_id);
70 void OnSessionMessage(uint32 session_id,
71 const std::vector<uint8>& message,
72 const GURL& destination_url);
73 void OnSessionReady(uint32 session_id);
74 void OnSessionClosed(uint32 session_id);
75 void OnSessionError(uint32 session_id,
76 media::MediaKeys::KeyError error_code,
82 // The Android-specific code that handles sessions uses integer session ids
83 // (basically a reference id), but media::MediaKeys bases everything on
84 // web_session_id (a string representing the actual session id as generated
85 // by the CDM). SessionIdMap is used to map between the web_session_id and
86 // the session_id used by the Android-specific code.
87 typedef base::hash_map<std::string, uint32_t> SessionIdMap;
89 // The following types keep track of Promises. The index is the
90 // Android-specific session_id, so that returning results can be matched to
91 // the corresponding promise.
92 typedef base::ScopedPtrHashMap<uint32_t, media::CdmPromise> PromiseMap;
94 ProxyMediaKeys(RendererCdmManager* manager,
95 const media::SessionMessageCB& session_message_cb,
96 const media::SessionReadyCB& session_ready_cb,
97 const media::SessionClosedCB& session_closed_cb,
98 const media::SessionErrorCB& session_error_cb);
100 void InitializeCdm(const std::string& key_system,
101 const GURL& security_origin);
103 // These functions keep track of Android-specific session_ids <->
104 // web_session_ids mappings.
105 // TODO(jrummell): Remove this once the Android-specific code changes to
106 // support string web session ids.
107 uint32_t CreateSessionId();
108 void AssignWebSessionId(uint32_t session_id,
109 const std::string& web_session_id);
110 uint32_t LookupSessionId(const std::string& web_session_id) const;
111 std::string LookupWebSessionId(uint32_t session_id) const;
112 void DropWebSessionId(const std::string& web_session_id);
114 // Helper function to keep track of promises. Adding takes ownership of the
115 // promise, transferred back to caller on take.
116 void SavePromise(uint32_t session_id, scoped_ptr<media::CdmPromise> promise);
117 scoped_ptr<media::CdmPromise> TakePromise(uint32_t session_id);
119 RendererCdmManager* manager_;
122 media::SessionMessageCB session_message_cb_;
123 media::SessionReadyCB session_ready_cb_;
124 media::SessionClosedCB session_closed_cb_;
125 media::SessionErrorCB session_error_cb_;
127 // Android-specific. See comment above CreateSessionId().
128 uint32_t next_session_id_;
129 SessionIdMap web_session_to_session_id_map_;
131 // Keep track of outstanding promises. This map owns the promise object.
132 PromiseMap session_id_to_promise_map_;
134 DISALLOW_COPY_AND_ASSIGN(ProxyMediaKeys);
137 } // namespace content
139 #endif // CONTENT_RENDERER_MEDIA_CRYPTO_PROXY_MEDIA_KEYS_H_