Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 54bd6475 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[res] Enable zero-copy assets access" into main

parents 3a58b526 82a34378
Loading
Loading
Loading
Loading
+25 −9
Original line number Diff line number Diff line
@@ -87,16 +87,26 @@ class BufferReader final : public zip_archive::Reader {
    }

    bool ReadAtOffset(uint8_t* buf, size_t len, off64_t offset) const override {
        if (mInputSize < len || offset > mInputSize - len) {
        auto in = AccessAtOffset(buf, len, offset);
        if (!in) {
          return false;
        }
        memcpy(buf, in, len);
        return true;
    }

    const uint8_t* AccessAtOffset(uint8_t*, size_t len, off64_t offset) const override {
      if (offset > mInputSize - len) {
        return nullptr;
      }
      const incfs::map_ptr<uint8_t> pos = mInput.offset(offset);
      if (!pos.verify(len)) {
          return false;
        return nullptr;
      }
      return pos.unsafe_ptr();
    }

        memcpy(buf, pos.unsafe_ptr(), len);
    bool IsZeroCopy() const override {
      return true;
    }

@@ -107,7 +117,7 @@ class BufferReader final : public zip_archive::Reader {

class BufferWriter final : public zip_archive::Writer {
  public:
    BufferWriter(void* output, size_t outputSize) : Writer(),
    BufferWriter(void* output, size_t outputSize) :
        mOutput(reinterpret_cast<uint8_t*>(output)), mOutputSize(outputSize), mBytesWritten(0) {
    }

@@ -121,6 +131,12 @@ class BufferWriter final : public zip_archive::Writer {
        return true;
    }

    Buffer GetBuffer(size_t length) override {
        const auto remaining_size = mOutputSize - mBytesWritten;
        return remaining_size >= length
                   ? Buffer(mOutput + mBytesWritten, remaining_size) : Buffer();
    }

  private:
    uint8_t* const mOutput;
    const size_t mOutputSize;