blob: fdc044d86e5a08b116961b5d60e001902a1a2b52 [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 Lesinskicacb28f2016-10-19 12:18:14 -070020#include <memory>
Adam Lesinskia40e9722015-11-24 19:11:46 -080021
Adam Lesinskice5e56e2016-10-21 17:56:45 -070022#include "android-base/macros.h"
23#include "utils/FileMap.h"
24
Adam Lesinskia40e9722015-11-24 19:11:46 -080025namespace aapt {
26namespace io {
27
28/**
Adam Lesinskicacb28f2016-10-19 12:18:14 -070029 * Interface for a block of contiguous memory. An instance of this interface
30 * owns the data.
Adam Lesinskia40e9722015-11-24 19:11:46 -080031 */
32class IData {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070033 public:
34 virtual ~IData() = default;
Adam Lesinskia40e9722015-11-24 19:11:46 -080035
Adam Lesinskicacb28f2016-10-19 12:18:14 -070036 virtual const void* data() const = 0;
37 virtual size_t size() const = 0;
Adam Lesinskia40e9722015-11-24 19:11:46 -080038};
39
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070040class DataSegment : public IData {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070041 public:
42 explicit DataSegment(std::unique_ptr<IData> data, size_t offset, size_t len)
Adam Lesinskice5e56e2016-10-21 17:56:45 -070043 : data_(std::move(data)), offset_(offset), len_(len) {}
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070044
Adam Lesinskicacb28f2016-10-19 12:18:14 -070045 const void* data() const override {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070046 return static_cast<const uint8_t*>(data_->data()) + offset_;
Adam Lesinskicacb28f2016-10-19 12:18:14 -070047 }
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070048
Adam Lesinskice5e56e2016-10-21 17:56:45 -070049 size_t size() const override { return len_; }
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070050
Adam Lesinskicacb28f2016-10-19 12:18:14 -070051 private:
52 DISALLOW_COPY_AND_ASSIGN(DataSegment);
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070053
Adam Lesinskice5e56e2016-10-21 17:56:45 -070054 std::unique_ptr<IData> data_;
55 size_t offset_;
56 size_t len_;
Adam Lesinski5eeaadd2016-08-25 12:26:56 -070057};
58
Adam Lesinskia40e9722015-11-24 19:11:46 -080059/**
Adam Lesinskicacb28f2016-10-19 12:18:14 -070060 * Implementation of IData that exposes a memory mapped file. The mmapped file
61 * is owned by this
Adam Lesinskia40e9722015-11-24 19:11:46 -080062 * object.
63 */
64class MmappedData : public IData {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070065 public:
66 explicit MmappedData(android::FileMap&& map)
Adam Lesinskice5e56e2016-10-21 17:56:45 -070067 : map_(std::forward<android::FileMap>(map)) {}
Adam Lesinskia40e9722015-11-24 19:11:46 -080068
Adam Lesinskice5e56e2016-10-21 17:56:45 -070069 const void* data() const override { return map_.getDataPtr(); }
Adam Lesinskia40e9722015-11-24 19:11:46 -080070
Adam Lesinskice5e56e2016-10-21 17:56:45 -070071 size_t size() const override { return map_.getDataLength(); }
Adam Lesinskia40e9722015-11-24 19:11:46 -080072
Adam Lesinskicacb28f2016-10-19 12:18:14 -070073 private:
Adam Lesinskice5e56e2016-10-21 17:56:45 -070074 android::FileMap map_;
Adam Lesinskia40e9722015-11-24 19:11:46 -080075};
76
77/**
Adam Lesinskicacb28f2016-10-19 12:18:14 -070078 * Implementation of IData that exposes a block of memory that was malloc'ed
79 * (new'ed). The
Adam Lesinskia40e9722015-11-24 19:11:46 -080080 * memory is owned by this object.
81 */
82class MallocData : public IData {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070083 public:
84 MallocData(std::unique_ptr<const uint8_t[]> data, size_t size)
Adam Lesinskice5e56e2016-10-21 17:56:45 -070085 : data_(std::move(data)), size_(size) {}
Adam Lesinskia40e9722015-11-24 19:11:46 -080086
Adam Lesinskice5e56e2016-10-21 17:56:45 -070087 const void* data() const override { return data_.get(); }
Adam Lesinskia40e9722015-11-24 19:11:46 -080088
Adam Lesinskice5e56e2016-10-21 17:56:45 -070089 size_t size() const override { return size_; }
Adam Lesinskia40e9722015-11-24 19:11:46 -080090
Adam Lesinskicacb28f2016-10-19 12:18:14 -070091 private:
Adam Lesinskice5e56e2016-10-21 17:56:45 -070092 std::unique_ptr<const uint8_t[]> data_;
93 size_t size_;
Adam Lesinskia40e9722015-11-24 19:11:46 -080094};
95
Adam Lesinski52364f72016-01-11 13:10:24 -080096/**
Adam Lesinskicacb28f2016-10-19 12:18:14 -070097 * When mmap fails because the file has length 0, we use the EmptyData to
98 * simulate data of length 0.
Adam Lesinski52364f72016-01-11 13:10:24 -080099 */
100class EmptyData : public IData {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700101 public:
102 const void* data() const override {
103 static const uint8_t d = 0;
104 return &d;
105 }
Adam Lesinski52364f72016-01-11 13:10:24 -0800106
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700107 size_t size() const override { return 0u; }
Adam Lesinski52364f72016-01-11 13:10:24 -0800108};
109
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700110} // namespace io
111} // namespace aapt
Adam Lesinskia40e9722015-11-24 19:11:46 -0800112
113#endif /* AAPT_IO_DATA_H */