WidevineFileIO.cpp (3294B)
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 9 #include "GMPLog.h" 10 #include "WidevineUtils.h" 11 #include "gmp-api/gmp-platform.h" 12 13 // Declared in ChromiumCDMAdapter.cpp. 14 extern const GMPPlatformAPI* sPlatform; 15 16 namespace mozilla { 17 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 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 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 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 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 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 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 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