1004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski/*
2004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski * Copyright (C) 2017 The Android Open Source Project
3004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski *
4004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski * you may not use this file except in compliance with the License.
6004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski * You may obtain a copy of the License at
7004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski *
8004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski *
10004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski * Unless required by applicable law or agreed to in writing, software
11004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski * See the License for the specific language governing permissions and
14004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski * limitations under the License.
15004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski */
16004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
17004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski#ifndef AAPT_IO_FILESTREAM_H
18004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski#define AAPT_IO_FILESTREAM_H
19004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
20004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski#include "io/Io.h"
21004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
22004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski#include <memory>
23004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski#include <string>
24004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
25004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski#include "android-base/macros.h"
26004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski#include "android-base/unique_fd.h"
27004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
28004511660671511ae88e0e837a6f92db28eadaefAdam Lesinskinamespace aapt {
29004511660671511ae88e0e837a6f92db28eadaefAdam Lesinskinamespace io {
30004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
3193190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinskiconstexpr size_t kDefaultBufferCapacity = 4096u;
3293190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
33004511660671511ae88e0e837a6f92db28eadaefAdam Lesinskiclass FileInputStream : public InputStream {
34004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski public:
3593190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  explicit FileInputStream(const std::string& path,
3693190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski                           size_t buffer_capacity = kDefaultBufferCapacity);
37004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
3893190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  // Take ownership of `fd`.
3993190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  explicit FileInputStream(int fd, size_t buffer_capacity = kDefaultBufferCapacity);
40004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
41004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  bool Next(const void** data, size_t* size) override;
42004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
43004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  void BackUp(size_t count) override;
44004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
45004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  size_t ByteCount() const override;
46004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
47004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  bool HadError() const override;
48004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
49004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  std::string GetError() const override;
50004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
51004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski private:
52004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  DISALLOW_COPY_AND_ASSIGN(FileInputStream);
53004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
54004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  android::base::unique_fd fd_;
55004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  std::string error_;
56004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  std::unique_ptr<uint8_t[]> buffer_;
57a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  size_t buffer_capacity_ = 0u;
58a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  size_t buffer_offset_ = 0u;
59a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  size_t buffer_size_ = 0u;
60a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  size_t total_byte_count_ = 0u;
61004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski};
62004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
63004511660671511ae88e0e837a6f92db28eadaefAdam Lesinskiclass FileOutputStream : public OutputStream {
64004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski public:
65a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  explicit FileOutputStream(const std::string& path,
6693190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski                            size_t buffer_capacity = kDefaultBufferCapacity);
6793190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski
6893190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  // Does not take ownership of `fd`.
6993190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  explicit FileOutputStream(int fd, size_t buffer_capacity = kDefaultBufferCapacity);
70004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
71004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  // Takes ownership of `fd`.
7293190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  explicit FileOutputStream(android::base::unique_fd fd,
7393190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski                            size_t buffer_capacity = kDefaultBufferCapacity);
74004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
75004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  ~FileOutputStream();
76004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
77004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  bool Next(void** data, size_t* size) override;
78004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
79004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  // Immediately flushes out the contents of the buffer to disk.
80004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  bool Flush();
81004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
82004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  void BackUp(size_t count) override;
83004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
84004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  size_t ByteCount() const override;
85004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
86004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  bool HadError() const override;
87004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
88004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  std::string GetError() const override;
89004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
90004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski private:
91004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  DISALLOW_COPY_AND_ASSIGN(FileOutputStream);
92004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
93004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  bool FlushImpl();
94004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
9593190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  android::base::unique_fd owned_fd_;
9693190b79d11d874199cfe7258526a48cfc8399fcAdam Lesinski  int fd_;
97004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  std::string error_;
98004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski  std::unique_ptr<uint8_t[]> buffer_;
99a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  size_t buffer_capacity_ = 0u;
100a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  size_t buffer_offset_ = 0u;
101a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  size_t total_byte_count_ = 0u;
102004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski};
103004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
104004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski}  // namespace io
105004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski}  // namespace aapt
106004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski
107004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski#endif  // AAPT_IO_FILESTREAM_H
108