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