blob: 0479228b44e7e75e4e45f2968f40f4db901bddba [file] [log] [blame]
Adam Lesinskia40e9722015-11-24 19:11:46 -08001/*
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
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070020#include <android-base/macros.h>
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070021#include <utils/FileMap.h>
Adam Lesinskicacb28f2016-10-19 12:18:14 -070022#include <memory>
Adam Lesinskia40e9722015-11-24 19:11:46 -080023
24namespace aapt {
25namespace io {
26
27/**
Adam Lesinskicacb28f2016-10-19 12:18:14 -070028 * Interface for a block of contiguous memory. An instance of this interface
29 * owns the data.
Adam Lesinskia40e9722015-11-24 19:11:46 -080030 */
31class IData {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070032 public:
33 virtual ~IData() = default;
Adam Lesinskia40e9722015-11-24 19:11:46 -080034
Adam Lesinskicacb28f2016-10-19 12:18:14 -070035 virtual const void* data() const = 0;
36 virtual size_t size() const = 0;
Adam Lesinskia40e9722015-11-24 19:11:46 -080037};
38
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070039class DataSegment : public IData {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070040 public:
41 explicit DataSegment(std::unique_ptr<IData> data, size_t offset, size_t len)
42 : mData(std::move(data)), mOffset(offset), mLen(len) {}
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070043
Adam Lesinskicacb28f2016-10-19 12:18:14 -070044 const void* data() const override {
45 return static_cast<const uint8_t*>(mData->data()) + mOffset;
46 }
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070047
Adam Lesinskicacb28f2016-10-19 12:18:14 -070048 size_t size() const override { return mLen; }
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070049
Adam Lesinskicacb28f2016-10-19 12:18:14 -070050 private:
51 DISALLOW_COPY_AND_ASSIGN(DataSegment);
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070052
Adam Lesinskicacb28f2016-10-19 12:18:14 -070053 std::unique_ptr<IData> mData;
54 size_t mOffset;
55 size_t mLen;
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070056};
57
Adam Lesinskia40e9722015-11-24 19:11:46 -080058/**
Adam Lesinskicacb28f2016-10-19 12:18:14 -070059 * Implementation of IData that exposes a memory mapped file. The mmapped file
60 * is owned by this
Adam Lesinskia40e9722015-11-24 19:11:46 -080061 * object.
62 */
63class MmappedData : public IData {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070064 public:
65 explicit MmappedData(android::FileMap&& map)
66 : mMap(std::forward<android::FileMap>(map)) {}
Adam Lesinskia40e9722015-11-24 19:11:46 -080067
Adam Lesinskicacb28f2016-10-19 12:18:14 -070068 const void* data() const override { return mMap.getDataPtr(); }
Adam Lesinskia40e9722015-11-24 19:11:46 -080069
Adam Lesinskicacb28f2016-10-19 12:18:14 -070070 size_t size() const override { return mMap.getDataLength(); }
Adam Lesinskia40e9722015-11-24 19:11:46 -080071
Adam Lesinskicacb28f2016-10-19 12:18:14 -070072 private:
73 android::FileMap mMap;
Adam Lesinskia40e9722015-11-24 19:11:46 -080074};
75
76/**
Adam Lesinskicacb28f2016-10-19 12:18:14 -070077 * Implementation of IData that exposes a block of memory that was malloc'ed
78 * (new'ed). The
Adam Lesinskia40e9722015-11-24 19:11:46 -080079 * memory is owned by this object.
80 */
81class MallocData : public IData {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070082 public:
83 MallocData(std::unique_ptr<const uint8_t[]> data, size_t size)
84 : mData(std::move(data)), mSize(size) {}
Adam Lesinskia40e9722015-11-24 19:11:46 -080085
Adam Lesinskicacb28f2016-10-19 12:18:14 -070086 const void* data() const override { return mData.get(); }
Adam Lesinskia40e9722015-11-24 19:11:46 -080087
Adam Lesinskicacb28f2016-10-19 12:18:14 -070088 size_t size() const override { return mSize; }
Adam Lesinskia40e9722015-11-24 19:11:46 -080089
Adam Lesinskicacb28f2016-10-19 12:18:14 -070090 private:
91 std::unique_ptr<const uint8_t[]> mData;
92 size_t mSize;
Adam Lesinskia40e9722015-11-24 19:11:46 -080093};
94
Adam Lesinski52364f72016-01-11 13:10:24 -080095/**
Adam Lesinskicacb28f2016-10-19 12:18:14 -070096 * When mmap fails because the file has length 0, we use the EmptyData to
97 * simulate data of length 0.
Adam Lesinski52364f72016-01-11 13:10:24 -080098 */
99class EmptyData : public IData {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700100 public:
101 const void* data() const override {
102 static const uint8_t d = 0;
103 return &d;
104 }
Adam Lesinski52364f72016-01-11 13:10:24 -0800105
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700106 size_t size() const override { return 0u; }
Adam Lesinski52364f72016-01-11 13:10:24 -0800107};
108
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700109} // namespace io
110} // namespace aapt
Adam Lesinskia40e9722015-11-24 19:11:46 -0800111
112#endif /* AAPT_IO_DATA_H */