MetaData.cpp revision 4650ff0e86f9e815e3152a806a06c700418d071d
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Copyright (C) 2009 The Android Open Source Project
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius * Licensed under the Apache License, Version 2.0 (the "License");
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * you may not use this file except in compliance with the License.
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * You may obtain a copy of the License at
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *      http://www.apache.org/licenses/LICENSE-2.0
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Unless required by applicable law or agreed to in writing, software
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * distributed under the License is distributed on an "AS IS" BASIS,
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * See the License for the specific language governing permissions and
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * limitations under the License.
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h>
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h>
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <media/stagefright/MediaDebug.h>
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <media/stagefright/MetaData.h>
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querunamespace android {
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruMetaData::MetaData() {
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
2750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2883a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusMetaData::MetaData(const MetaData &from)
2983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    : RefBase(),
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      mItems(from.mItems) {
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruMetaData::~MetaData() {
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    clear();
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid MetaData::clear() {
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    mItems.clear();
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::remove(uint32_t key) {
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ssize_t i = mItems.indexOfKey(key);
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i < 0) {
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return false;
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    mItems.removeItemsAt(i);
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return true;
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::setCString(uint32_t key, const char *value) {
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return setData(key, TYPE_C_STRING, value, strlen(value) + 1);
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::setInt32(uint32_t key, int32_t value) {
5883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    return setData(key, TYPE_INT32, &value, sizeof(value));
5983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius}
6083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
6183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusbool MetaData::setInt64(uint32_t key, int64_t value) {
6283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    return setData(key, TYPE_INT64, &value, sizeof(value));
6383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius}
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::setFloat(uint32_t key, float value) {
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return setData(key, TYPE_FLOAT, &value, sizeof(value));
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::setPointer(uint32_t key, void *value) {
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return setData(key, TYPE_POINTER, &value, sizeof(value));
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehobool MetaData::setRect(
7483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        uint32_t key,
7583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius        int32_t left, int32_t top,
7650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        int32_t right, int32_t bottom) {
7750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    Rect r;
7850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    r.mLeft = left;
7950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    r.mTop = top;
8050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    r.mRight = right;
8150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    r.mBottom = bottom;
8283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
8350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return setData(key, TYPE_RECT, &r, sizeof(r));
8483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius}
8550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
8650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehobool MetaData::findCString(uint32_t key, const char **value) const {
8750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    uint32_t type;
8883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    const void *data;
8983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    size_t size;
9050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (!findData(key, &type, &data, &size) || type != TYPE_C_STRING) {
9150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return false;
9250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
9350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
9450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    *value = (const char *)data;
9583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
9650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    return true;
9783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius}
9850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
9950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehobool MetaData::findInt32(uint32_t key, int32_t *value) const {
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t type;
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const void *data;
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size_t size;
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!findData(key, &type, &data, &size) || type != TYPE_INT32) {
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return false;
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK_EQ(size, sizeof(*value));
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *value = *(int32_t *)data;
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return true;
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::findInt64(uint32_t key, int64_t *value) const {
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t type;
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const void *data;
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size_t size;
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!findData(key, &type, &data, &size) || type != TYPE_INT64) {
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return false;
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK_EQ(size, sizeof(*value));
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *value = *(int64_t *)data;
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return true;
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::findFloat(uint32_t key, float *value) const {
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t type;
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const void *data;
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size_t size;
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!findData(key, &type, &data, &size) || type != TYPE_FLOAT) {
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return false;
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK_EQ(size, sizeof(*value));
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *value = *(float *)data;
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return true;
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::findPointer(uint32_t key, void **value) const {
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uint32_t type;
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const void *data;
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    size_t size;
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!findData(key, &type, &data, &size) || type != TYPE_POINTER) {
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return false;
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK_EQ(size, sizeof(*value));
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *value = *(void **)data;
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return true;
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::findRect(
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint32_t key,
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t *left, int32_t *top,
162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        int32_t *right, int32_t *bottom) const {
163b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    uint32_t type;
164b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const void *data;
165b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    size_t size;
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!findData(key, &type, &data, &size) || type != TYPE_RECT) {
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return false;
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    CHECK_EQ(size, sizeof(Rect));
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
172b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const Rect *r = (const Rect *)data;
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *left = r->mLeft;
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *top = r->mTop;
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *right = r->mRight;
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *bottom = r->mBottom;
177b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
178b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return true;
179b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
180b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
181b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querubool MetaData::setData(
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint32_t key, uint32_t type, const void *data, size_t size) {
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    bool overwrote_existing = true;
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
185b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ssize_t i = mItems.indexOfKey(key);
186b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (i < 0) {
187b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        typed_data item;
188b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        i = mItems.add(key, item);
189b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
190b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        overwrote_existing = false;
191b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
193b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    typed_data &item = mItems.editValueAt(i);
194b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    item.setData(type, data, size);
196b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
197b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return overwrote_existing;
198b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
199b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
200b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querubool MetaData::findData(uint32_t key, uint32_t *type,
201b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                        const void **data, size_t *size) const {
202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    ssize_t i = mItems.indexOfKey(key);
203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (i < 0) {
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return false;
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
207b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
208b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const typed_data &item = mItems.valueAt(i);
209b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
210b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    item.getData(type, data, size);
211b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
212b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    return true;
213b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
215b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruMetaData::typed_data::typed_data()
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    : mType(0),
217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru      mSize(0) {
218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru}
219b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruMetaData::typed_data::~typed_data() {
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    clear();
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
224b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoMetaData::typed_data::typed_data(const typed_data &from)
225b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    : mType(from.mType),
226b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho      mSize(0) {
227b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    allocateStorage(from.mSize);
228b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    memcpy(storage(), from.storage(), mSize);
229b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
230b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
231b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoMetaData::typed_data &MetaData::typed_data::operator=(
232b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        const MetaData::typed_data &from) {
233b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if (this != &from) {
234b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        clear();
235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        mType = from.mType;
236b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        allocateStorage(from.mSize);
237b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        memcpy(storage(), from.storage(), mSize);
238b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
239b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
240b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    return *this;
241b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
242b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid MetaData::typed_data::clear() {
244b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    freeStorage();
245b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    mType = 0;
247b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
249b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid MetaData::typed_data::setData(
250b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        uint32_t type, const void *data, size_t size) {
251b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    clear();
252b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
253b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    mType = type;
254b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    allocateStorage(size);
255b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    memcpy(storage(), data, size);
256b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
257b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
258b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid MetaData::typed_data::getData(
259b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        uint32_t *type, const void **data, size_t *size) const {
260b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    *type = mType;
261b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    *size = mSize;
262b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    *data = storage();
263}
264
265void MetaData::typed_data::allocateStorage(size_t size) {
266    mSize = size;
267
268    if (usesReservoir()) {
269        return;
270    }
271
272    u.ext_data = malloc(mSize);
273}
274
275void MetaData::typed_data::freeStorage() {
276    if (!usesReservoir()) {
277        if (u.ext_data) {
278            free(u.ext_data);
279        }
280    }
281
282    mSize = 0;
283}
284
285}  // namespace android
286
287