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