tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }