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