1a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski/*
2a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski * Copyright (C) 2015 The Android Open Source Project
3a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski *
4a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski * you may not use this file except in compliance with the License.
6a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski * You may obtain a copy of the License at
7a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski *
8a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski *
10a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski * Unless required by applicable law or agreed to in writing, software
11a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski * See the License for the specific language governing permissions and
14a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski * limitations under the License.
15a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski */
16a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski
17a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski#ifndef AAPT_IO_DATA_H
18a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski#define AAPT_IO_DATA_H
19a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski
20a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski#include <utils/FileMap.h>
21a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski
22a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski#include <memory>
23a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski
24a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinskinamespace aapt {
25a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinskinamespace io {
26a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski
27a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski/**
28a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski * Interface for a block of contiguous memory. An instance of this interface owns the data.
29a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski */
30a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinskiclass IData {
31a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinskipublic:
32a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    virtual ~IData() = default;
33a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski
34a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    virtual const void* data() const = 0;
35a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    virtual size_t size() const = 0;
36a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski};
37a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski
38a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski/**
39a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski * Implementation of IData that exposes a memory mapped file. The mmapped file is owned by this
40a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski * object.
41a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski */
42a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinskiclass MmappedData : public IData {
43a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinskipublic:
44a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    explicit MmappedData(android::FileMap&& map) : mMap(std::forward<android::FileMap>(map)) {
45a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    }
46a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski
47a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    const void* data() const override {
48a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski        return mMap.getDataPtr();
49a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    }
50a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski
51a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    size_t size() const override {
52a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski        return mMap.getDataLength();
53a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    }
54a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski
55a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinskiprivate:
56a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    android::FileMap mMap;
57a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski};
58a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski
59a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski/**
60a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski * Implementation of IData that exposes a block of memory that was malloc'ed (new'ed). The
61a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski * memory is owned by this object.
62a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski */
63a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinskiclass MallocData : public IData {
64a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinskipublic:
65a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    MallocData(std::unique_ptr<const uint8_t[]> data, size_t size) :
66a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski            mData(std::move(data)), mSize(size) {
67a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    }
68a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski
69a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    const void* data() const override {
70a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski        return mData.get();
71a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    }
72a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski
73a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    size_t size() const override {
74a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski        return mSize;
75a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    }
76a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski
77a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinskiprivate:
78a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    std::unique_ptr<const uint8_t[]> mData;
79a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski    size_t mSize;
80a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski};
81a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski
8252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski/**
8352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski * When mmap fails because the file has length 0, we use the EmptyData to simulate data of length 0.
8452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski */
8552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinskiclass EmptyData : public IData {
8652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinskipublic:
8752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    const void* data() const override {
8852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        static const uint8_t d = 0;
8952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        return &d;
9052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    }
9152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
9252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    size_t size() const override {
9352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        return 0u;
9452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    }
9552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski};
9652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
97a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski} // namespace io
98a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski} // namespace aapt
99a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski
100a40e972fdaa68fc486ff90a319195515819068b2Adam Lesinski#endif /* AAPT_IO_DATA_H */
101