summaryrefslogtreecommitdiffstats
path: root/dom/media/gmp/GMPDecryptorChild.h
blob: 434da774faa9635e8f3fa3a65e9b1b8389bb5df3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef GMPDecryptorChild_h_
#define GMPDecryptorChild_h_

#include "mozilla/gmp/PGMPDecryptorChild.h"
#include "gmp-decryption.h"
#include "mozilla/gmp/GMPTypes.h"
#include "GMPEncryptedBufferDataImpl.h"
#include <string>

namespace mozilla {
namespace gmp {

class GMPContentChild;

class GMPDecryptorChild : public GMPDecryptorCallback
                        , public GMPDecryptorHost
                        , public PGMPDecryptorChild
{
public:
  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GMPDecryptorChild);

  explicit GMPDecryptorChild(GMPContentChild* aPlugin,
                             const nsTArray<uint8_t>& aPluginVoucher,
                             const nsTArray<uint8_t>& aSandboxVoucher);

  void Init(GMPDecryptor* aSession);

  // GMPDecryptorCallback
  void SetSessionId(uint32_t aCreateSessionToken,
                    const char* aSessionId,
                    uint32_t aSessionIdLength) override;
  void ResolveLoadSessionPromise(uint32_t aPromiseId,
                                 bool aSuccess) override;
  void ResolvePromise(uint32_t aPromiseId) override;

  void RejectPromise(uint32_t aPromiseId,
                     GMPDOMException aException,
                     const char* aMessage,
                     uint32_t aMessageLength) override;

  void SessionMessage(const char* aSessionId,
                      uint32_t aSessionIdLength,
                      GMPSessionMessageType aMessageType,
                      const uint8_t* aMessage,
                      uint32_t aMessageLength) override;

  void ExpirationChange(const char* aSessionId,
                        uint32_t aSessionIdLength,
                        GMPTimestamp aExpiryTime) override;

  void SessionClosed(const char* aSessionId,
                     uint32_t aSessionIdLength) override;

  void SessionError(const char* aSessionId,
                    uint32_t aSessionIdLength,
                    GMPDOMException aException,
                    uint32_t aSystemCode,
                    const char* aMessage,
                    uint32_t aMessageLength) override;

  void KeyStatusChanged(const char* aSessionId,
                        uint32_t aSessionIdLength,
                        const uint8_t* aKeyId,
                        uint32_t aKeyIdLength,
                        GMPMediaKeyStatus aStatus) override;

  void SetCapabilities(uint64_t aCaps) override;

  void Decrypted(GMPBuffer* aBuffer, GMPErr aResult) override;

  void BatchedKeyStatusChanged(const char* aSessionId,
                               uint32_t aSessionIdLength,
                               const GMPMediaKeyInfo* aKeyInfos,
                               uint32_t aKeyInfosLength) override;

  // GMPDecryptorHost
  void GetSandboxVoucher(const uint8_t** aVoucher,
                         uint32_t* aVoucherLength) override;

  void GetPluginVoucher(const uint8_t** aVoucher,
                        uint32_t* aVoucherLength) override;
private:
  ~GMPDecryptorChild();

  // GMPDecryptorChild
  bool RecvInit(const bool& aDistinctiveIdentifierRequired,
                const bool& aPersistentStateRequired) override;

  bool RecvCreateSession(const uint32_t& aCreateSessionToken,
                         const uint32_t& aPromiseId,
                         const nsCString& aInitDataType,
                         InfallibleTArray<uint8_t>&& aInitData,
                         const GMPSessionType& aSessionType) override;

  bool RecvLoadSession(const uint32_t& aPromiseId,
                       const nsCString& aSessionId) override;

  bool RecvUpdateSession(const uint32_t& aPromiseId,
                         const nsCString& aSessionId,
                         InfallibleTArray<uint8_t>&& aResponse) override;

  bool RecvCloseSession(const uint32_t& aPromiseId,
                        const nsCString& aSessionId) override;

  bool RecvRemoveSession(const uint32_t& aPromiseId,
                         const nsCString& aSessionId) override;

  bool RecvDecrypt(const uint32_t& aId,
                   InfallibleTArray<uint8_t>&& aBuffer,
                   const GMPDecryptionData& aMetadata) override;

  // Resolve/reject promise on completion.
  bool RecvSetServerCertificate(const uint32_t& aPromiseId,
                                InfallibleTArray<uint8_t>&& aServerCert) override;

  bool RecvDecryptingComplete() override;

  template <typename MethodType, typename... ParamType>
  void CallMethod(MethodType, ParamType&&...);

  template<typename MethodType, typename... ParamType>
  void CallOnGMPThread(MethodType, ParamType&&...);

  // GMP's GMPDecryptor implementation.
  // Only call into this on the (GMP process) main thread.
  GMPDecryptor* mSession;
  GMPContentChild* mPlugin;

  // Reference to the vouchers owned by the GMPChild.
  const nsTArray<uint8_t>& mPluginVoucher;
  const nsTArray<uint8_t>& mSandboxVoucher;
};

} // namespace gmp
} // namespace mozilla

#endif // GMPDecryptorChild_h_