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

Commit 82a34378 authored by Yurii Zubrytskyi's avatar Yurii Zubrytskyi
Browse files

[res] Enable zero-copy assets access

libziparchive supports using the provided memory buffers
directly when exracting compressed files, but it requires
explicit opt in in the implementation of its interfaces.

This CL ensures the functions we use for reading compressed
assets use those.

Flag: EXEMPT small optimization
Test: build + boot + atest libandroidfw_tests
Change-Id: I6bcb73081e027b503b8513cf1d732c556df39012
parent e4ddaa6c
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;