Merge "Hide MetaData internals"

gugelfrei
Marco Nelissen 7 years ago committed by Android (Google) Code Review
commit a13ac6c89d

@ -17,6 +17,7 @@
//#define LOG_NDEBUG 0
#define LOG_TAG "MetaData"
#include <inttypes.h>
#include <utils/KeyedVector.h>
#include <utils/Log.h>
#include <stdlib.h>
@ -29,30 +30,81 @@
namespace android {
MetaData::MetaData() {
struct MetaData::typed_data {
typed_data();
~typed_data();
typed_data(const MetaData::typed_data &);
typed_data &operator=(const MetaData::typed_data &);
void clear();
void setData(uint32_t type, const void *data, size_t size);
void getData(uint32_t *type, const void **data, size_t *size) const;
// may include hexdump of binary data if verbose=true
String8 asString(bool verbose) const;
private:
uint32_t mType;
size_t mSize;
union {
void *ext_data;
float reservoir;
} u;
bool usesReservoir() const {
return mSize <= sizeof(u.reservoir);
}
void *allocateStorage(size_t size);
void freeStorage();
void *storage() {
return usesReservoir() ? &u.reservoir : u.ext_data;
}
const void *storage() const {
return usesReservoir() ? &u.reservoir : u.ext_data;
}
};
struct MetaData::Rect {
int32_t mLeft, mTop, mRight, mBottom;
};
struct MetaData::MetaDataInternal {
KeyedVector<uint32_t, MetaData::typed_data> mItems;
};
MetaData::MetaData()
: mInternalData(new MetaDataInternal()) {
}
MetaData::MetaData(const MetaData &from)
: RefBase(),
mItems(from.mItems) {
mInternalData(new MetaDataInternal()) {
mInternalData->mItems = from.mInternalData->mItems;
}
MetaData::~MetaData() {
clear();
delete mInternalData;
}
void MetaData::clear() {
mItems.clear();
mInternalData->mItems.clear();
}
bool MetaData::remove(uint32_t key) {
ssize_t i = mItems.indexOfKey(key);
ssize_t i = mInternalData->mItems.indexOfKey(key);
if (i < 0) {
return false;
}
mItems.removeItemsAt(i);
mInternalData->mItems.removeItemsAt(i);
return true;
}
@ -192,15 +244,15 @@ bool MetaData::setData(
uint32_t key, uint32_t type, const void *data, size_t size) {
bool overwrote_existing = true;
ssize_t i = mItems.indexOfKey(key);
ssize_t i = mInternalData->mItems.indexOfKey(key);
if (i < 0) {
typed_data item;
i = mItems.add(key, item);
i = mInternalData->mItems.add(key, item);
overwrote_existing = false;
}
typed_data &item = mItems.editValueAt(i);
typed_data &item = mInternalData->mItems.editValueAt(i);
item.setData(type, data, size);
@ -209,13 +261,13 @@ bool MetaData::setData(
bool MetaData::findData(uint32_t key, uint32_t *type,
const void **data, size_t *size) const {
ssize_t i = mItems.indexOfKey(key);
ssize_t i = mInternalData->mItems.indexOfKey(key);
if (i < 0) {
return false;
}
const typed_data &item = mItems.valueAt(i);
const typed_data &item = mInternalData->mItems.valueAt(i);
item.getData(type, data, size);
@ -223,7 +275,7 @@ bool MetaData::findData(uint32_t key, uint32_t *type,
}
bool MetaData::hasData(uint32_t key) const {
ssize_t i = mItems.indexOfKey(key);
ssize_t i = mInternalData->mItems.indexOfKey(key);
if (i < 0) {
return false;
@ -369,11 +421,11 @@ static void MakeFourCCString(uint32_t x, char *s) {
String8 MetaData::toString() const {
String8 s;
for (int i = mItems.size(); --i >= 0;) {
int32_t key = mItems.keyAt(i);
for (int i = mInternalData->mItems.size(); --i >= 0;) {
int32_t key = mInternalData->mItems.keyAt(i);
char cc[5];
MakeFourCCString(key, cc);
const typed_data &item = mItems.valueAt(i);
const typed_data &item = mInternalData->mItems.valueAt(i);
s.appendFormat("%s: %s", cc, item.asString(false).string());
if (i != 0) {
s.append(", ");
@ -382,25 +434,25 @@ String8 MetaData::toString() const {
return s;
}
void MetaData::dumpToLog() const {
for (int i = mItems.size(); --i >= 0;) {
int32_t key = mItems.keyAt(i);
for (int i = mInternalData->mItems.size(); --i >= 0;) {
int32_t key = mInternalData->mItems.keyAt(i);
char cc[5];
MakeFourCCString(key, cc);
const typed_data &item = mItems.valueAt(i);
const typed_data &item = mInternalData->mItems.valueAt(i);
ALOGI("%s: %s", cc, item.asString(true /* verbose */).string());
}
}
status_t MetaData::writeToParcel(Parcel &parcel) {
status_t ret;
size_t numItems = mItems.size();
size_t numItems = mInternalData->mItems.size();
ret = parcel.writeUint32(uint32_t(numItems));
if (ret) {
return ret;
}
for (size_t i = 0; i < numItems; i++) {
int32_t key = mItems.keyAt(i);
const typed_data &item = mItems.valueAt(i);
int32_t key = mInternalData->mItems.keyAt(i);
const typed_data &item = mInternalData->mItems.valueAt(i);
uint32_t type;
const void *data;
size_t size;

@ -24,7 +24,6 @@
#include <binder/Parcel.h>
#include <utils/RefBase.h>
#include <utils/KeyedVector.h>
#include <utils/String8.h>
namespace android {
@ -287,51 +286,10 @@ protected:
virtual ~MetaData();
private:
struct typed_data {
typed_data();
~typed_data();
typed_data(const MetaData::typed_data &);
typed_data &operator=(const MetaData::typed_data &);
void clear();
void setData(uint32_t type, const void *data, size_t size);
void getData(uint32_t *type, const void **data, size_t *size) const;
// may include hexdump of binary data if verbose=true
String8 asString(bool verbose) const;
private:
uint32_t mType;
size_t mSize;
union {
void *ext_data;
float reservoir;
} u;
bool usesReservoir() const {
return mSize <= sizeof(u.reservoir);
}
void *allocateStorage(size_t size);
void freeStorage();
void *storage() {
return usesReservoir() ? &u.reservoir : u.ext_data;
}
const void *storage() const {
return usesReservoir() ? &u.reservoir : u.ext_data;
}
};
struct Rect {
int32_t mLeft, mTop, mRight, mBottom;
};
KeyedVector<uint32_t, typed_data> mItems;
// MetaData &operator=(const MetaData &);
struct typed_data;
struct Rect;
struct MetaDataInternal;
MetaDataInternal *mInternalData;
};
} // namespace android

Loading…
Cancel
Save