diff options
Diffstat (limited to 'tools/aapt2/io/Util.cpp')
-rw-r--r-- | tools/aapt2/io/Util.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/tools/aapt2/io/Util.cpp b/tools/aapt2/io/Util.cpp index 15114e8dbf54..97516322c4cb 100644 --- a/tools/aapt2/io/Util.cpp +++ b/tools/aapt2/io/Util.cpp @@ -18,6 +18,9 @@ #include "google/protobuf/io/zero_copy_stream_impl_lite.h" +using ::android::StringPiece; +using ::google::protobuf::io::ZeroCopyOutputStream; + namespace aapt { namespace io { @@ -45,6 +48,12 @@ bool CopyFileToArchive(IAaptContext* context, io::IFile* file, const std::string return CopyInputStreamToArchive(context, data.get(), out_path, compression_flags, writer); } +bool CopyFileToArchivePreserveCompression(IAaptContext* context, io::IFile* file, + const std::string& out_path, IArchiveWriter* writer) { + uint32_t compression_flags = file->WasCompressed() ? ArchiveEntry::kCompress : 0u; + return CopyFileToArchive(context, file, out_path, compression_flags, writer); +} + bool CopyProtoToArchive(IAaptContext* context, ::google::protobuf::MessageLite* proto_msg, const std::string& out_path, uint32_t compression_flags, IArchiveWriter* writer) { @@ -91,5 +100,29 @@ bool Copy(OutputStream* out, InputStream* in) { return !in->HadError(); } +bool Copy(OutputStream* out, const StringPiece& in) { + const char* in_buffer = in.data(); + size_t in_len = in.size(); + while (in_len != 0) { + void* out_buffer; + size_t out_len; + if (!out->Next(&out_buffer, &out_len)) { + return false; + } + + const size_t bytes_to_copy = in_len < out_len ? in_len : out_len; + memcpy(out_buffer, in_buffer, bytes_to_copy); + out->BackUp(out_len - bytes_to_copy); + in_buffer += bytes_to_copy; + in_len -= bytes_to_copy; + } + return true; +} + +bool Copy(ZeroCopyOutputStream* out, InputStream* in) { + OutputStreamAdaptor adaptor(out); + return Copy(&adaptor, in); +} + } // namespace io } // namespace aapt |