Data.h revision ce5e56e243d262a9b65459c3bd0bb9eaadd40628
1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef AAPT_IO_DATA_H 18#define AAPT_IO_DATA_H 19 20#include <memory> 21 22#include "android-base/macros.h" 23#include "utils/FileMap.h" 24 25namespace aapt { 26namespace io { 27 28/** 29 * Interface for a block of contiguous memory. An instance of this interface 30 * owns the data. 31 */ 32class IData { 33 public: 34 virtual ~IData() = default; 35 36 virtual const void* data() const = 0; 37 virtual size_t size() const = 0; 38}; 39 40class DataSegment : public IData { 41 public: 42 explicit DataSegment(std::unique_ptr<IData> data, size_t offset, size_t len) 43 : data_(std::move(data)), offset_(offset), len_(len) {} 44 45 const void* data() const override { 46 return static_cast<const uint8_t*>(data_->data()) + offset_; 47 } 48 49 size_t size() const override { return len_; } 50 51 private: 52 DISALLOW_COPY_AND_ASSIGN(DataSegment); 53 54 std::unique_ptr<IData> data_; 55 size_t offset_; 56 size_t len_; 57}; 58 59/** 60 * Implementation of IData that exposes a memory mapped file. The mmapped file 61 * is owned by this 62 * object. 63 */ 64class MmappedData : public IData { 65 public: 66 explicit MmappedData(android::FileMap&& map) 67 : map_(std::forward<android::FileMap>(map)) {} 68 69 const void* data() const override { return map_.getDataPtr(); } 70 71 size_t size() const override { return map_.getDataLength(); } 72 73 private: 74 android::FileMap map_; 75}; 76 77/** 78 * Implementation of IData that exposes a block of memory that was malloc'ed 79 * (new'ed). The 80 * memory is owned by this object. 81 */ 82class MallocData : public IData { 83 public: 84 MallocData(std::unique_ptr<const uint8_t[]> data, size_t size) 85 : data_(std::move(data)), size_(size) {} 86 87 const void* data() const override { return data_.get(); } 88 89 size_t size() const override { return size_; } 90 91 private: 92 std::unique_ptr<const uint8_t[]> data_; 93 size_t size_; 94}; 95 96/** 97 * When mmap fails because the file has length 0, we use the EmptyData to 98 * simulate data of length 0. 99 */ 100class EmptyData : public IData { 101 public: 102 const void* data() const override { 103 static const uint8_t d = 0; 104 return &d; 105 } 106 107 size_t size() const override { return 0u; } 108}; 109 110} // namespace io 111} // namespace aapt 112 113#endif /* AAPT_IO_DATA_H */ 114