1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #include "WidevineFileIO.h"
8 #include "GMPLog.h"
9 #include "WidevineUtils.h"
10 
11 #include "gmp-api/gmp-platform.h"
12 
13 // Declared in ChromiumCDMAdapter.cpp.
14 extern const GMPPlatformAPI* sPlatform;
15 
16 namespace mozilla {
17 
Open(const char * aFilename,uint32_t aFilenameLength)18 void WidevineFileIO::Open(const char* aFilename, uint32_t aFilenameLength) {
19   mName = std::string(aFilename, aFilename + aFilenameLength);
20   GMPRecord* record = nullptr;
21   GMPErr err = sPlatform->createrecord(aFilename, aFilenameLength, &record,
22                                        static_cast<GMPRecordClient*>(this));
23   if (GMP_FAILED(err)) {
24     GMP_LOG_DEBUG("WidevineFileIO::Open() '%s' GMPCreateRecord failed",
25                   mName.c_str());
26     mClient->OnOpenComplete(cdm::FileIOClient::Status::kError);
27     return;
28   }
29   if (GMP_FAILED(record->Open())) {
30     GMP_LOG_DEBUG("WidevineFileIO::Open() '%s' record open failed",
31                   mName.c_str());
32     mClient->OnOpenComplete(cdm::FileIOClient::Status::kError);
33     return;
34   }
35 
36   GMP_LOG_DEBUG("WidevineFileIO::Open() '%s'", mName.c_str());
37   mRecord = record;
38 }
39 
Read()40 void WidevineFileIO::Read() {
41   if (!mRecord) {
42     GMP_LOG_DEBUG("WidevineFileIO::Read() '%s' used uninitialized!",
43                   mName.c_str());
44     mClient->OnReadComplete(cdm::FileIOClient::Status::kError, nullptr, 0);
45     return;
46   }
47   GMP_LOG_DEBUG("WidevineFileIO::Read() '%s'", mName.c_str());
48   mRecord->Read();
49 }
50 
Write(const uint8_t * aData,uint32_t aDataSize)51 void WidevineFileIO::Write(const uint8_t* aData, uint32_t aDataSize) {
52   if (!mRecord) {
53     GMP_LOG_DEBUG("WidevineFileIO::Write() '%s' used uninitialized!",
54                   mName.c_str());
55     mClient->OnWriteComplete(cdm::FileIOClient::Status::kError);
56     return;
57   }
58   mRecord->Write(aData, aDataSize);
59 }
60 
Close()61 void WidevineFileIO::Close() {
62   GMP_LOG_DEBUG("WidevineFileIO::Close() '%s'", mName.c_str());
63   if (mRecord) {
64     mRecord->Close();
65     mRecord = nullptr;
66   }
67   delete this;
68 }
69 
GMPToWidevineFileStatus(GMPErr aStatus)70 static cdm::FileIOClient::Status GMPToWidevineFileStatus(GMPErr aStatus) {
71   switch (aStatus) {
72     case GMPRecordInUse:
73       return cdm::FileIOClient::Status::kInUse;
74     case GMPNoErr:
75       return cdm::FileIOClient::Status::kSuccess;
76     default:
77       return cdm::FileIOClient::Status::kError;
78   }
79 }
80 
OpenComplete(GMPErr aStatus)81 void WidevineFileIO::OpenComplete(GMPErr aStatus) {
82   GMP_LOG_DEBUG("WidevineFileIO::OpenComplete() '%s' status=%d", mName.c_str(),
83                 aStatus);
84   mClient->OnOpenComplete(GMPToWidevineFileStatus(aStatus));
85 }
86 
ReadComplete(GMPErr aStatus,const uint8_t * aData,uint32_t aDataSize)87 void WidevineFileIO::ReadComplete(GMPErr aStatus, const uint8_t* aData,
88                                   uint32_t aDataSize) {
89   GMP_LOG_DEBUG("WidevineFileIO::OnReadComplete() '%s' status=%d",
90                 mName.c_str(), aStatus);
91   mClient->OnReadComplete(GMPToWidevineFileStatus(aStatus), aData, aDataSize);
92 }
93 
WriteComplete(GMPErr aStatus)94 void WidevineFileIO::WriteComplete(GMPErr aStatus) {
95   GMP_LOG_DEBUG("WidevineFileIO::WriteComplete() '%s' status=%d", mName.c_str(),
96                 aStatus);
97   mClient->OnWriteComplete(GMPToWidevineFileStatus(aStatus));
98 }
99 
100 }  // namespace mozilla
101