1d0f492db038c6210c1138865d816bfb134376538Adam Lesinski/* 2d0f492db038c6210c1138865d816bfb134376538Adam Lesinski * Copyright (C) 2017 The Android Open Source Project 3d0f492db038c6210c1138865d816bfb134376538Adam Lesinski * 4d0f492db038c6210c1138865d816bfb134376538Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5d0f492db038c6210c1138865d816bfb134376538Adam Lesinski * you may not use this file except in compliance with the License. 6d0f492db038c6210c1138865d816bfb134376538Adam Lesinski * You may obtain a copy of the License at 7d0f492db038c6210c1138865d816bfb134376538Adam Lesinski * 8d0f492db038c6210c1138865d816bfb134376538Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9d0f492db038c6210c1138865d816bfb134376538Adam Lesinski * 10d0f492db038c6210c1138865d816bfb134376538Adam Lesinski * Unless required by applicable law or agreed to in writing, software 11d0f492db038c6210c1138865d816bfb134376538Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12d0f492db038c6210c1138865d816bfb134376538Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d0f492db038c6210c1138865d816bfb134376538Adam Lesinski * See the License for the specific language governing permissions and 14d0f492db038c6210c1138865d816bfb134376538Adam Lesinski * limitations under the License. 15d0f492db038c6210c1138865d816bfb134376538Adam Lesinski */ 16d0f492db038c6210c1138865d816bfb134376538Adam Lesinski 17d0f492db038c6210c1138865d816bfb134376538Adam Lesinski#ifndef AAPT_IO_UTIL_H 18d0f492db038c6210c1138865d816bfb134376538Adam Lesinski#define AAPT_IO_UTIL_H 19d0f492db038c6210c1138865d816bfb134376538Adam Lesinski 20d0f492db038c6210c1138865d816bfb134376538Adam Lesinski#include <string> 21d0f492db038c6210c1138865d816bfb134376538Adam Lesinski 22d0f492db038c6210c1138865d816bfb134376538Adam Lesinski#include "google/protobuf/message_lite.h" 23d0f492db038c6210c1138865d816bfb134376538Adam Lesinski 244670805ea441edb8b280f9312571e7799f1284cfAdam Lesinski#include "format/Archive.h" 25d0f492db038c6210c1138865d816bfb134376538Adam Lesinski#include "io/File.h" 26d0f492db038c6210c1138865d816bfb134376538Adam Lesinski#include "io/Io.h" 27d0f492db038c6210c1138865d816bfb134376538Adam Lesinski#include "process/IResourceTableConsumer.h" 28d0f492db038c6210c1138865d816bfb134376538Adam Lesinski 29d0f492db038c6210c1138865d816bfb134376538Adam Lesinskinamespace aapt { 30d0f492db038c6210c1138865d816bfb134376538Adam Lesinskinamespace io { 31d0f492db038c6210c1138865d816bfb134376538Adam Lesinski 32d0f492db038c6210c1138865d816bfb134376538Adam Lesinskibool CopyInputStreamToArchive(IAaptContext* context, InputStream* in, const std::string& out_path, 33d0f492db038c6210c1138865d816bfb134376538Adam Lesinski uint32_t compression_flags, IArchiveWriter* writer); 34d0f492db038c6210c1138865d816bfb134376538Adam Lesinski 35d0f492db038c6210c1138865d816bfb134376538Adam Lesinskibool CopyFileToArchive(IAaptContext* context, IFile* file, const std::string& out_path, 36d0f492db038c6210c1138865d816bfb134376538Adam Lesinski uint32_t compression_flags, IArchiveWriter* writer); 37d0f492db038c6210c1138865d816bfb134376538Adam Lesinski 38d55bef78a5f2a0fe8068b26b463b161bd0398791Pierre Lecesnebool CopyFileToArchivePreserveCompression(IAaptContext* context, IFile* file, 39d55bef78a5f2a0fe8068b26b463b161bd0398791Pierre Lecesne const std::string& out_path, IArchiveWriter* writer); 40d55bef78a5f2a0fe8068b26b463b161bd0398791Pierre Lecesne 41d0f492db038c6210c1138865d816bfb134376538Adam Lesinskibool CopyProtoToArchive(IAaptContext* context, ::google::protobuf::MessageLite* proto_msg, 42d0f492db038c6210c1138865d816bfb134376538Adam Lesinski const std::string& out_path, uint32_t compression_flags, 43d0f492db038c6210c1138865d816bfb134376538Adam Lesinski IArchiveWriter* writer); 44d0f492db038c6210c1138865d816bfb134376538Adam Lesinski 45d0f492db038c6210c1138865d816bfb134376538Adam Lesinski// Copies the data from in to out. Returns false if there was an error. 46d0f492db038c6210c1138865d816bfb134376538Adam Lesinski// If there was an error, check the individual streams' HadError/GetError methods. 47d0f492db038c6210c1138865d816bfb134376538Adam Lesinskibool Copy(OutputStream* out, InputStream* in); 4893190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinskibool Copy(OutputStream* out, const ::android::StringPiece& in); 49004511660671511ae88e0e837a6f92db28eadaefAdam Lesinskibool Copy(::google::protobuf::io::ZeroCopyOutputStream* out, InputStream* in); 50004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski 51004511660671511ae88e0e837a6f92db28eadaefAdam Lesinskiclass OutputStreamAdaptor : public io::OutputStream { 52004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski public: 53004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski explicit OutputStreamAdaptor(::google::protobuf::io::ZeroCopyOutputStream* out) : out_(out) { 54004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski } 55004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski 56004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski bool Next(void** data, size_t* size) override { 57004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski int out_size; 58004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski bool result = out_->Next(data, &out_size); 59004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski *size = static_cast<size_t>(out_size); 60004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski if (!result) { 61004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski error_ocurred_ = true; 62004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski } 63004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski return result; 64004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski } 65004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski 66004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski void BackUp(size_t count) override { 67004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski out_->BackUp(static_cast<int>(count)); 68004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski } 69004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski 70004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski size_t ByteCount() const override { 71004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski return static_cast<size_t>(out_->ByteCount()); 72004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski } 73004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski 74004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski bool HadError() const override { 75004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski return error_ocurred_; 76004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski } 77004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski 78004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski private: 79004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski DISALLOW_COPY_AND_ASSIGN(OutputStreamAdaptor); 80004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski 81004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski ::google::protobuf::io::ZeroCopyOutputStream* out_; 82004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski bool error_ocurred_ = false; 83004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski}; 84004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski 85004511660671511ae88e0e837a6f92db28eadaefAdam Lesinskiclass ZeroCopyInputAdaptor : public ::google::protobuf::io::ZeroCopyInputStream { 86004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski public: 87004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski explicit ZeroCopyInputAdaptor(io::InputStream* in) : in_(in) { 88004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski } 89004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski 90004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski bool Next(const void** data, int* size) override { 91004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski size_t out_size; 92004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski bool result = in_->Next(data, &out_size); 93004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski *size = static_cast<int>(out_size); 94004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski return result; 95004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski } 96004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski 97004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski void BackUp(int count) override { 98004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski in_->BackUp(static_cast<size_t>(count)); 99004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski } 100004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski 101004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski bool Skip(int count) override { 102004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski const void* data; 103004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski int size; 104004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski while (Next(&data, &size)) { 105004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski if (size > count) { 106004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski BackUp(size - count); 107004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski return true; 108004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski } else { 109004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski count -= size; 110004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski } 111004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski } 112004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski return false; 113004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski } 114004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski 115004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski ::google::protobuf::int64 ByteCount() const override { 116004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski return static_cast<::google::protobuf::int64>(in_->ByteCount()); 117004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski } 118004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski 119004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski private: 120004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski DISALLOW_COPY_AND_ASSIGN(ZeroCopyInputAdaptor); 121004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski 122004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski io::InputStream* in_; 123004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski}; 124d0f492db038c6210c1138865d816bfb134376538Adam Lesinski 125d0f492db038c6210c1138865d816bfb134376538Adam Lesinski} // namespace io 126d0f492db038c6210c1138865d816bfb134376538Adam Lesinski} // namespace aapt 127d0f492db038c6210c1138865d816bfb134376538Adam Lesinski 128d0f492db038c6210c1138865d816bfb134376538Adam Lesinski#endif /* AAPT_IO_UTIL_H */ 129