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