cdm-test-storage.cpp (6374B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #include "cdm-test-storage.h" 7 8 #include <vector> 9 10 using namespace cdm; 11 12 class WriteRecordClient : public FileIOClient { 13 public: 14 WriteRecordClient(std::function<void()>&& aOnSuccess, 15 std::function<void()>&& aOnFailure, const uint8_t* aData, 16 uint32_t aDataSize) 17 : mOnSuccess(std::move(aOnSuccess)), mOnFailure(std::move(aOnFailure)) { 18 mData.insert(mData.end(), aData, aData + aDataSize); 19 } 20 21 void OnOpenComplete(Status aStatus) override { 22 // If we hit an error, fail. 23 if (aStatus != Status::kSuccess) { 24 Done(aStatus); 25 } else if (mFileIO) { // Otherwise, write our data to the file. 26 mFileIO->Write(mData.empty() ? nullptr : &mData.front(), mData.size()); 27 } 28 } 29 30 void OnReadComplete(Status aStatus, const uint8_t* aData, 31 uint32_t aDataSize) override {} 32 33 void OnWriteComplete(Status aStatus) override { Done(aStatus); } 34 35 void Do(const std::string& aName, Host_11* aHost) { 36 // Initialize the FileIO. 37 mFileIO = aHost->CreateFileIO(this); 38 mFileIO->Open(aName.c_str(), aName.size()); 39 } 40 41 private: 42 void Done(cdm::FileIOClient::Status aStatus) { 43 // Note: Call Close() before running continuation, in case the 44 // continuation tries to open the same record; if we call Close() 45 // after running the continuation, the Close() call will arrive 46 // just after the Open() call succeeds, immediately closing the 47 // record we just opened. 48 if (mFileIO) { 49 // will delete mFileIO inside Close. 50 mFileIO->Close(); 51 } 52 53 if (IO_SUCCEEDED(aStatus)) { 54 mOnSuccess(); 55 } else { 56 mOnFailure(); 57 } 58 59 delete this; 60 } 61 62 FileIO* mFileIO = nullptr; 63 std::function<void()> mOnSuccess; 64 std::function<void()> mOnFailure; 65 std::vector<uint8_t> mData; 66 }; 67 68 void WriteRecord(Host_11* aHost, const std::string& aRecordName, 69 const uint8_t* aData, uint32_t aNumBytes, 70 std::function<void()>&& aOnSuccess, 71 std::function<void()>&& aOnFailure) { 72 // client will be delete in WriteRecordClient::Done 73 WriteRecordClient* client = new WriteRecordClient( 74 std::move(aOnSuccess), std::move(aOnFailure), aData, aNumBytes); 75 client->Do(aRecordName, aHost); 76 } 77 78 void WriteRecord(Host_11* aHost, const std::string& aRecordName, 79 const std::string& aData, std::function<void()>&& aOnSuccess, 80 std::function<void()>&& aOnFailure) { 81 return WriteRecord(aHost, aRecordName, (const uint8_t*)aData.c_str(), 82 aData.size(), std::move(aOnSuccess), 83 std::move(aOnFailure)); 84 } 85 86 class ReadRecordClient : public FileIOClient { 87 public: 88 explicit ReadRecordClient( 89 std::function<void(bool, const uint8_t*, uint32_t)>&& aOnReadComplete) 90 : mOnReadComplete(std::move(aOnReadComplete)) {} 91 92 void OnOpenComplete(Status aStatus) override { 93 auto err = aStatus; 94 if (aStatus != Status::kSuccess) { 95 Done(err, reinterpret_cast<const uint8_t*>(""), 0); 96 } else { 97 mFileIO->Read(); 98 } 99 } 100 101 void OnReadComplete(Status aStatus, const uint8_t* aData, 102 uint32_t aDataSize) override { 103 Done(aStatus, aData, aDataSize); 104 } 105 106 void OnWriteComplete(Status aStatus) override {} 107 108 void Do(const std::string& aName, Host_11* aHost) { 109 mFileIO = aHost->CreateFileIO(this); 110 mFileIO->Open(aName.c_str(), aName.size()); 111 } 112 113 private: 114 void Done(cdm::FileIOClient::Status aStatus, const uint8_t* aData, 115 uint32_t aDataSize) { 116 // Note: Call Close() before running continuation, in case the 117 // continuation tries to open the same record; if we call Close() 118 // after running the continuation, the Close() call will arrive 119 // just after the Open() call succeeds, immediately closing the 120 // record we just opened. 121 if (mFileIO) { 122 // will delete mFileIO inside Close. 123 mFileIO->Close(); 124 } 125 126 if (IO_SUCCEEDED(aStatus)) { 127 mOnReadComplete(true, aData, aDataSize); 128 } else { 129 mOnReadComplete(false, reinterpret_cast<const uint8_t*>(""), 0); 130 } 131 132 delete this; 133 } 134 135 FileIO* mFileIO = nullptr; 136 std::function<void(bool, const uint8_t*, uint32_t)> mOnReadComplete; 137 }; 138 139 void ReadRecord( 140 Host_11* aHost, const std::string& aRecordName, 141 std::function<void(bool, const uint8_t*, uint32_t)>&& aOnReadComplete) { 142 // client will be delete in ReadRecordClient::Done 143 ReadRecordClient* client = new ReadRecordClient(std::move(aOnReadComplete)); 144 client->Do(aRecordName, aHost); 145 } 146 147 class OpenRecordClient : public FileIOClient { 148 public: 149 explicit OpenRecordClient(std::function<void(bool)>&& aOpenComplete) 150 : mOpenComplete(std::move(aOpenComplete)) {} 151 152 void OnOpenComplete(Status aStatus) override { Done(aStatus); } 153 154 void OnReadComplete(Status aStatus, const uint8_t* aData, 155 uint32_t aDataSize) override {} 156 157 void OnWriteComplete(Status aStatus) override {} 158 159 void Do(const std::string& aName, Host_11* aHost) { 160 // Initialize the FileIO. 161 mFileIO = aHost->CreateFileIO(this); 162 mFileIO->Open(aName.c_str(), aName.size()); 163 } 164 165 private: 166 void Done(cdm::FileIOClient::Status aStatus) { 167 // Note: Call Close() before running continuation, in case the 168 // continuation tries to open the same record; if we call Close() 169 // after running the continuation, the Close() call will arrive 170 // just after the Open() call succeeds, immediately closing the 171 // record we just opened. 172 if (mFileIO) { 173 // will delete mFileIO inside Close. 174 mFileIO->Close(); 175 } 176 177 if (IO_SUCCEEDED(aStatus)) { 178 mOpenComplete(true); 179 } else { 180 mOpenComplete(false); 181 } 182 183 delete this; 184 } 185 186 FileIO* mFileIO = nullptr; 187 std::function<void(bool)> mOpenComplete; 188 }; 189 190 void OpenRecord(Host_11* aHost, const std::string& aRecordName, 191 std::function<void(bool)>&& aOpenComplete) { 192 // client will be delete in OpenRecordClient::Done 193 OpenRecordClient* client = new OpenRecordClient(std::move(aOpenComplete)); 194 client->Do(aRecordName, aHost); 195 }