AMessage.cpp revision cf31f1eecf46d599428e115dfee8dd47b76c83fc
172961230a5890071bcca436eb5630172ce84ec41Andreas Huber/*
272961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Copyright (C) 2010 The Android Open Source Project
372961230a5890071bcca436eb5630172ce84ec41Andreas Huber *
472961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
572961230a5890071bcca436eb5630172ce84ec41Andreas Huber * you may not use this file except in compliance with the License.
672961230a5890071bcca436eb5630172ce84ec41Andreas Huber * You may obtain a copy of the License at
772961230a5890071bcca436eb5630172ce84ec41Andreas Huber *
872961230a5890071bcca436eb5630172ce84ec41Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
972961230a5890071bcca436eb5630172ce84ec41Andreas Huber *
1072961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Unless required by applicable law or agreed to in writing, software
1172961230a5890071bcca436eb5630172ce84ec41Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1272961230a5890071bcca436eb5630172ce84ec41Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1372961230a5890071bcca436eb5630172ce84ec41Andreas Huber * See the License for the specific language governing permissions and
1472961230a5890071bcca436eb5630172ce84ec41Andreas Huber * limitations under the License.
1572961230a5890071bcca436eb5630172ce84ec41Andreas Huber */
1672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
177ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#define LOG_TAG "AMessage"
187ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar//#define LOG_NDEBUG 0
197ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar//#define DUMP_STATS
207ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#include <cutils/log.h>
217ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar
2272961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AMessage.h"
2372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
24bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber#include <ctype.h>
25bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
2672961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AAtomizer.h"
272d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber#include "ABuffer.h"
2872961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ADebug.h"
2972961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ALooperRoster.h"
3072961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AString.h"
3172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3214acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <binder/Parcel.h>
33840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include <media/stagefright/foundation/hexdump.h>
3414acc736e336cbd6026df781d4f411e908831815Andreas Huber
3572961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android {
3672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
375df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberextern ALooperRoster gLooperRoster;
385df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
3972961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::AMessage(uint32_t what, ALooper::handler_id target)
4072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    : mWhat(what),
4172961230a5890071bcca436eb5630172ce84ec41Andreas Huber      mTarget(target),
4272961230a5890071bcca436eb5630172ce84ec41Andreas Huber      mNumItems(0) {
4372961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
4472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4572961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::~AMessage() {
4672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    clear();
4772961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
4872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setWhat(uint32_t what) {
5072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mWhat = what;
5172961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
5272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5372961230a5890071bcca436eb5630172ce84ec41Andreas Huberuint32_t AMessage::what() const {
5472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return mWhat;
5572961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
5672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setTarget(ALooper::handler_id handlerID) {
5872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mTarget = handlerID;
5972961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
6072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
6172961230a5890071bcca436eb5630172ce84ec41Andreas HuberALooper::handler_id AMessage::target() const {
6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return mTarget;
6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
6572961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::clear() {
6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        Item *item = &mItems[i];
687ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        delete[] item->mName;
697ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        item->mName = NULL;
707ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        freeItemValue(item);
7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mNumItems = 0;
7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
757ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarvoid AMessage::freeItemValue(Item *item) {
7672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    switch (item->mType) {
7772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeString:
7872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        {
7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber            delete item->u.stringValue;
8072961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
8172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeObject:
8472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeMessage:
85bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber        case kTypeBuffer:
8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        {
8772961230a5890071bcca436eb5630172ce84ec41Andreas Huber            if (item->u.refValue != NULL) {
8872961230a5890071bcca436eb5630172ce84ec41Andreas Huber                item->u.refValue->decStrong(this);
8972961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
9072961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
9172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        default:
9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
987ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS
997ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#include <utils/Mutex.h>
1007ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar
1017ea429295a2eb31f2d9256c36c1ef53a195456acLajos MolnarMutex gLock;
1027ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gFindItemCalls = 1;
1037ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gDupCalls = 1;
1047ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gAverageNumItems = 0;
1057ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gAverageNumChecks = 0;
1067ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gAverageNumMemChecks = 0;
1077ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gAverageDupItems = 0;
1087ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gLastChecked = -1;
1097ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar
1107ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic void reportStats() {
1117ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    int32_t time = (ALooper::GetNowUs() / 1000);
1127ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    if (time / 1000 != gLastChecked / 1000) {
1137ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        gLastChecked = time;
1147ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        ALOGI("called findItemIx %zu times (for len=%.1f i=%.1f/%.1f mem) dup %zu times (for len=%.1f)",
1157ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar                gFindItemCalls,
1167ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar                gAverageNumItems / (float)gFindItemCalls,
1177ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar                gAverageNumChecks / (float)gFindItemCalls,
1187ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar                gAverageNumMemChecks / (float)gFindItemCalls,
1197ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar                gDupCalls,
1207ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar                gAverageDupItems / (float)gDupCalls);
1217ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        gFindItemCalls = gDupCalls = 1;
1227ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        gAverageNumItems = gAverageNumChecks = gAverageNumMemChecks = gAverageDupItems = 0;
1237ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        gLastChecked = time;
1247ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    }
1257ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar}
1267ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif
12772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1287ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarinline size_t AMessage::findItemIndex(const char *name, size_t len) const {
1297ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS
1307ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    size_t memchecks = 0;
1317ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif
13272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    size_t i = 0;
1337ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    for (; i < mNumItems; i++) {
1347ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        if (len != mItems[i].mNameLength) {
1357ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar            continue;
1367ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        }
1377ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS
1387ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        ++memchecks;
1397ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif
1407ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        if (!memcmp(mItems[i].mName, name, len)) {
1417ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar            break;
1427ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        }
1437ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    }
1447ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS
1457ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    {
1467ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        Mutex::Autolock _l(gLock);
1477ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        ++gFindItemCalls;
1487ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        gAverageNumItems += mNumItems;
1497ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        gAverageNumMemChecks += memchecks;
1507ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        gAverageNumChecks += i;
1517ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        reportStats();
15272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
1537ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif
1547ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    return i;
1557ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar}
1567ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar
1577ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar// assumes item's name was uninitialized or NULL
1587ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarvoid AMessage::Item::setName(const char *name, size_t len) {
1597ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    mNameLength = len;
1607ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    mName = new char[len + 1];
1617ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    memcpy((void*)mName, name, len + 1);
1627ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar}
16372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1647ea429295a2eb31f2d9256c36c1ef53a195456acLajos MolnarAMessage::Item *AMessage::allocateItem(const char *name) {
1657ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    size_t len = strlen(name);
1667ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    size_t i = findItemIndex(name, len);
16772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item;
16872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
16972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (i < mNumItems) {
17072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        item = &mItems[i];
1717ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        freeItemValue(item);
17272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    } else {
17372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        CHECK(mNumItems < kMaxNumItems);
17472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        i = mNumItems++;
17572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        item = &mItems[i];
1767ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        item->setName(name, len);
17772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
17872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
17972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return item;
18072961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
18172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
18272961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst AMessage::Item *AMessage::findItem(
18372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const char *name, Type type) const {
1847ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    size_t i = findItemIndex(name, strlen(name));
1857ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    if (i < mNumItems) {
18672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const Item *item = &mItems[i];
1877ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        return item->mType == type ? item : NULL;
18872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
18972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
19072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return NULL;
19172961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
19272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
193513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnarbool AMessage::contains(const char *name) const {
1947ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    size_t i = findItemIndex(name, strlen(name));
1957ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    return i < mNumItems;
196513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar}
197513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar
19872961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define BASIC_TYPE(NAME,FIELDNAME,TYPENAME)                             \
19972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::set##NAME(const char *name, TYPENAME value) {            \
20072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);                                    \
20172961230a5890071bcca436eb5630172ce84ec41Andreas Huber                                                                        \
20272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kType##NAME;                                          \
20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.FIELDNAME = value;                                          \
20472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}                                                                       \
20572961230a5890071bcca436eb5630172ce84ec41Andreas Huber                                                                        \
20672961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::find##NAME(const char *name, TYPENAME *value) const {    \
20772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kType##NAME);                     \
20872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {                                                         \
20972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *value = item->u.FIELDNAME;                                     \
21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;                                                    \
21172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }                                                                   \
21272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;                                                       \
21372961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
21472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
21572961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int32,int32Value,int32_t)
21672961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int64,int64Value,int64_t)
21772961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Size,sizeValue,size_t)
21872961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Float,floatValue,float)
21972961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Double,doubleValue,double)
22072961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Pointer,ptrValue,void *)
22172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
22272961230a5890071bcca436eb5630172ce84ec41Andreas Huber#undef BASIC_TYPE
22372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
22472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setString(
22572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const char *name, const char *s, ssize_t len) {
22672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
22772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kTypeString;
22872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.stringValue = new AString(s, len < 0 ? strlen(s) : len);
22972961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
23072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
231513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnarvoid AMessage::setString(
232513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar        const char *name, const AString &s) {
233513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar    setString(name, s.c_str(), s.size());
234513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar}
235513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar
2362d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObjectInternal(
2372d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        const char *name, const sp<RefBase> &obj, Type type) {
23872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
2392d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    item->mType = type;
24072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
24172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (obj != NULL) { obj->incStrong(this); }
24272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.refValue = obj.get();
24372961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
24472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
2452d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObject(const char *name, const sp<RefBase> &obj) {
2462d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    setObjectInternal(name, obj, kTypeObject);
2472d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber}
2482d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber
2492d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setBuffer(const char *name, const sp<ABuffer> &buffer) {
2502d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    setObjectInternal(name, sp<RefBase>(buffer), kTypeBuffer);
2512d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber}
2522d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber
25372961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setMessage(const char *name, const sp<AMessage> &obj) {
25472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
25572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kTypeMessage;
25672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
25772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (obj != NULL) { obj->incStrong(this); }
25872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.refValue = obj.get();
25972961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
26072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
26131e2508c75018145a8238925ff1a08cbde4e799aAndreas Hubervoid AMessage::setRect(
26231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        const char *name,
26331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        int32_t left, int32_t top, int32_t right, int32_t bottom) {
26431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    Item *item = allocateItem(name);
26531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->mType = kTypeRect;
26631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
26731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mLeft = left;
26831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mTop = top;
26931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mRight = right;
27031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mBottom = bottom;
27131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber}
27231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
27372961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findString(const char *name, AString *value) const {
27472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeString);
27572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
27672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *value = *item->u.stringValue;
27772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
27872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
27972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
28072961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
28172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
28272961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findObject(const char *name, sp<RefBase> *obj) const {
28372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeObject);
28472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
28572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *obj = item->u.refValue;
28672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
28772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
28872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
28972961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
29072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
2912d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huberbool AMessage::findBuffer(const char *name, sp<ABuffer> *buf) const {
2922d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    const Item *item = findItem(name, kTypeBuffer);
2932d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    if (item) {
2942d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        *buf = (ABuffer *)(item->u.refValue);
2952d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        return true;
2962d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    }
2972d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    return false;
2982d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber}
2992d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber
30072961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findMessage(const char *name, sp<AMessage> *obj) const {
30172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeMessage);
30272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
30372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *obj = static_cast<AMessage *>(item->u.refValue);
30472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
30572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
30672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
30772961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
30872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
30931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huberbool AMessage::findRect(
31031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        const char *name,
31131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const {
31231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    const Item *item = findItem(name, kTypeRect);
31331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    if (item == NULL) {
31431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        return false;
31531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    }
31631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
31731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *left = item->u.rectValue.mLeft;
31831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *top = item->u.rectValue.mTop;
31931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *right = item->u.rectValue.mRight;
32031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *bottom = item->u.rectValue.mBottom;
32131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
32231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    return true;
32331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber}
32431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
32572961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::post(int64_t delayUs) {
32672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    gLooperRoster.postMessage(this, delayUs);
32772961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
32872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3295df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberstatus_t AMessage::postAndAwaitResponse(sp<AMessage> *response) {
3305df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    return gLooperRoster.postAndAwaitResponse(this, response);
3315df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber}
3325df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
3335df775d2f509c76e76a46615fca83dba95299f6eAndreas Hubervoid AMessage::postReply(uint32_t replyID) {
3345df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    gLooperRoster.postReply(replyID, this);
3355df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber}
3365df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
3375df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberbool AMessage::senderAwaitsResponse(uint32_t *replyID) const {
3385df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    int32_t tmp;
3395df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    bool found = findInt32("replyID", &tmp);
3405df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
3415df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    if (!found) {
3425df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber        return false;
3435df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    }
3445df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
3455df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    *replyID = static_cast<uint32_t>(tmp);
3465df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
3475df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    return true;
3485df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber}
3495df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
35072961230a5890071bcca436eb5630172ce84ec41Andreas Hubersp<AMessage> AMessage::dup() const {
35172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    sp<AMessage> msg = new AMessage(mWhat, mTarget);
35272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    msg->mNumItems = mNumItems;
35372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3547ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS
3557ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    {
3567ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        Mutex::Autolock _l(gLock);
3577ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        ++gDupCalls;
3587ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        gAverageDupItems += mNumItems;
3597ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        reportStats();
3607ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    }
3617ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif
3627ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar
36372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
36472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const Item *from = &mItems[i];
36572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        Item *to = &msg->mItems[i];
36672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3677ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        to->setName(from->mName, from->mNameLength);
36872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        to->mType = from->mType;
36972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
37072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        switch (from->mType) {
37172961230a5890071bcca436eb5630172ce84ec41Andreas Huber            case kTypeString:
37272961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
37372961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.stringValue =
37472961230a5890071bcca436eb5630172ce84ec41Andreas Huber                    new AString(*from->u.stringValue);
37572961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
37672961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
37772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
37872961230a5890071bcca436eb5630172ce84ec41Andreas Huber            case kTypeObject:
379bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber            case kTypeBuffer:
38072961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
38172961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.refValue = from->u.refValue;
38272961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.refValue->incStrong(msg.get());
38372961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
38472961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
38572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3862c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            case kTypeMessage:
3872c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            {
3882c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                sp<AMessage> copy =
3892c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                    static_cast<AMessage *>(from->u.refValue)->dup();
3902c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
3912c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                to->u.refValue = copy.get();
3922c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                to->u.refValue->incStrong(msg.get());
3932c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                break;
3942c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            }
3952c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
39672961230a5890071bcca436eb5630172ce84ec41Andreas Huber            default:
39772961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
39872961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u = from->u;
39972961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
40072961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
40172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
40272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
40372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
40472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return msg;
40572961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
40672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
407bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic void appendIndent(AString *s, int32_t indent) {
408bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    static const char kWhitespace[] =
409bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        "                                        "
410bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        "                                        ";
411bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
412bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    CHECK_LT((size_t)indent, sizeof(kWhitespace));
413bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
414bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s->append(kWhitespace, indent);
415bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
416bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
417bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic bool isFourcc(uint32_t what) {
418bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    return isprint(what & 0xff)
419bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 8) & 0xff)
420bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 16) & 0xff)
421bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 24) & 0xff);
422bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
423bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
424bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas HuberAString AMessage::debugString(int32_t indent) const {
425bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    AString s = "AMessage(what = ";
426bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
427bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    AString tmp;
428bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    if (isFourcc(mWhat)) {
429bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        tmp = StringPrintf(
430bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                "'%c%c%c%c'",
431bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)(mWhat >> 24),
432bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)((mWhat >> 16) & 0xff),
433bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)((mWhat >> 8) & 0xff),
434bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)(mWhat & 0xff));
435bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    } else {
436bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        tmp = StringPrintf("0x%08x", mWhat);
437bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
438bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append(tmp);
439bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
440bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    if (mTarget != 0) {
441bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        tmp = StringPrintf(", target = %d", mTarget);
442bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append(tmp);
443bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
444bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append(") = {\n");
445bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
446bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
447bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        const Item &item = mItems[i];
448bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
449bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        switch (item.mType) {
450bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeInt32:
451bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
452bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "int32_t %s = %d", item.mName, item.u.int32Value);
453bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
454bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeInt64:
455bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
456bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "int64_t %s = %lld", item.mName, item.u.int64Value);
457bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
458bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeSize:
459bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
460bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "size_t %s = %d", item.mName, item.u.sizeValue);
461bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
462bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeFloat:
463bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
464bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "float %s = %f", item.mName, item.u.floatValue);
465bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
466bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeDouble:
467bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
468bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "double %s = %f", item.mName, item.u.doubleValue);
469bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
470bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypePointer:
471bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
472bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "void *%s = %p", item.mName, item.u.ptrValue);
473bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
474bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeString:
475bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
476bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "string %s = \"%s\"",
477bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.mName,
478bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.u.stringValue->c_str());
479bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
480bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeObject:
481bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
482bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "RefBase *%s = %p", item.mName, item.u.refValue);
483bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
484bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber            case kTypeBuffer:
485840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            {
486840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                sp<ABuffer> buffer = static_cast<ABuffer *>(item.u.refValue);
487840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
488cf31f1eecf46d599428e115dfee8dd47b76c83fcAndy Hung                if (buffer != NULL && buffer->data() != NULL && buffer->size() <= 64) {
489840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                    tmp = StringPrintf("Buffer %s = {\n", item.mName);
490840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                    hexdump(buffer->data(), buffer->size(), indent + 4, &tmp);
491840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                    appendIndent(&tmp, indent + 2);
492840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                    tmp.append("}");
493840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                } else {
494840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                    tmp = StringPrintf(
495840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                            "Buffer *%s = %p", item.mName, buffer.get());
496840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                }
497bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber                break;
498840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            }
499bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeMessage:
500bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
501bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "AMessage %s = %s",
502bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.mName,
503bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        static_cast<AMessage *>(
504bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                            item.u.refValue)->debugString(
505bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                                indent + strlen(item.mName) + 14).c_str());
506bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
507078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber            case kTypeRect:
508078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                tmp = StringPrintf(
509078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        "Rect %s(%d, %d, %d, %d)",
510078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.mName,
511078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mLeft,
512078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mTop,
513078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mRight,
514078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mBottom);
515078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                break;
516bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            default:
517bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                TRESPASS();
518bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        }
519bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
520bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        appendIndent(&s, indent);
521bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append("  ");
522bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append(tmp);
523bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append("\n");
524bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
525bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
526bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    appendIndent(&s, indent);
527bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append("}");
528bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
529bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    return s;
530bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
531bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
53214acc736e336cbd6026df781d4f411e908831815Andreas Huber// static
53314acc736e336cbd6026df781d4f411e908831815Andreas Hubersp<AMessage> AMessage::FromParcel(const Parcel &parcel) {
53414acc736e336cbd6026df781d4f411e908831815Andreas Huber    int32_t what = parcel.readInt32();
53514acc736e336cbd6026df781d4f411e908831815Andreas Huber    sp<AMessage> msg = new AMessage(what);
53614acc736e336cbd6026df781d4f411e908831815Andreas Huber
53714acc736e336cbd6026df781d4f411e908831815Andreas Huber    msg->mNumItems = static_cast<size_t>(parcel.readInt32());
53814acc736e336cbd6026df781d4f411e908831815Andreas Huber    for (size_t i = 0; i < msg->mNumItems; ++i) {
53914acc736e336cbd6026df781d4f411e908831815Andreas Huber        Item *item = &msg->mItems[i];
54014acc736e336cbd6026df781d4f411e908831815Andreas Huber
5417ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        const char *name = parcel.readCString();
5427ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        item->setName(name, strlen(name));
54314acc736e336cbd6026df781d4f411e908831815Andreas Huber        item->mType = static_cast<Type>(parcel.readInt32());
54414acc736e336cbd6026df781d4f411e908831815Andreas Huber
54514acc736e336cbd6026df781d4f411e908831815Andreas Huber        switch (item->mType) {
54614acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt32:
54714acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
54814acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.int32Value = parcel.readInt32();
54914acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
55014acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
55114acc736e336cbd6026df781d4f411e908831815Andreas Huber
55214acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt64:
55314acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
55414acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.int64Value = parcel.readInt64();
55514acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
55614acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
55714acc736e336cbd6026df781d4f411e908831815Andreas Huber
55814acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeSize:
55914acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
56014acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.sizeValue = static_cast<size_t>(parcel.readInt32());
56114acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
56214acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
56314acc736e336cbd6026df781d4f411e908831815Andreas Huber
56414acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeFloat:
56514acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
56614acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.floatValue = parcel.readFloat();
56714acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
56814acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
56914acc736e336cbd6026df781d4f411e908831815Andreas Huber
57014acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeDouble:
57114acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
57214acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.doubleValue = parcel.readDouble();
57314acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
57414acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
57514acc736e336cbd6026df781d4f411e908831815Andreas Huber
57614acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeString:
57714acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
57814acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.stringValue = new AString(parcel.readCString());
57914acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
58014acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
58114acc736e336cbd6026df781d4f411e908831815Andreas Huber
58214acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeMessage:
58314acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
58414acc736e336cbd6026df781d4f411e908831815Andreas Huber                sp<AMessage> subMsg = AMessage::FromParcel(parcel);
58514acc736e336cbd6026df781d4f411e908831815Andreas Huber                subMsg->incStrong(msg.get());
58614acc736e336cbd6026df781d4f411e908831815Andreas Huber
58714acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.refValue = subMsg.get();
58814acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
58914acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
59014acc736e336cbd6026df781d4f411e908831815Andreas Huber
59114acc736e336cbd6026df781d4f411e908831815Andreas Huber            default:
59214acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
59329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("This type of object cannot cross process boundaries.");
59414acc736e336cbd6026df781d4f411e908831815Andreas Huber                TRESPASS();
59514acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
59614acc736e336cbd6026df781d4f411e908831815Andreas Huber        }
59714acc736e336cbd6026df781d4f411e908831815Andreas Huber    }
59814acc736e336cbd6026df781d4f411e908831815Andreas Huber
59914acc736e336cbd6026df781d4f411e908831815Andreas Huber    return msg;
60014acc736e336cbd6026df781d4f411e908831815Andreas Huber}
60114acc736e336cbd6026df781d4f411e908831815Andreas Huber
60214acc736e336cbd6026df781d4f411e908831815Andreas Hubervoid AMessage::writeToParcel(Parcel *parcel) const {
60314acc736e336cbd6026df781d4f411e908831815Andreas Huber    parcel->writeInt32(static_cast<int32_t>(mWhat));
60414acc736e336cbd6026df781d4f411e908831815Andreas Huber    parcel->writeInt32(static_cast<int32_t>(mNumItems));
60514acc736e336cbd6026df781d4f411e908831815Andreas Huber
60614acc736e336cbd6026df781d4f411e908831815Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
60714acc736e336cbd6026df781d4f411e908831815Andreas Huber        const Item &item = mItems[i];
60814acc736e336cbd6026df781d4f411e908831815Andreas Huber
60914acc736e336cbd6026df781d4f411e908831815Andreas Huber        parcel->writeCString(item.mName);
61014acc736e336cbd6026df781d4f411e908831815Andreas Huber        parcel->writeInt32(static_cast<int32_t>(item.mType));
61114acc736e336cbd6026df781d4f411e908831815Andreas Huber
61214acc736e336cbd6026df781d4f411e908831815Andreas Huber        switch (item.mType) {
61314acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt32:
61414acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
61514acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeInt32(item.u.int32Value);
61614acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
61714acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
61814acc736e336cbd6026df781d4f411e908831815Andreas Huber
61914acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt64:
62014acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
62114acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeInt64(item.u.int64Value);
62214acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
62314acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
62414acc736e336cbd6026df781d4f411e908831815Andreas Huber
62514acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeSize:
62614acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
62714acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeInt32(static_cast<int32_t>(item.u.sizeValue));
62814acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
62914acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
63014acc736e336cbd6026df781d4f411e908831815Andreas Huber
63114acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeFloat:
63214acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
63314acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeFloat(item.u.floatValue);
63414acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
63514acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
63614acc736e336cbd6026df781d4f411e908831815Andreas Huber
63714acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeDouble:
63814acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
63914acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeDouble(item.u.doubleValue);
64014acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
64114acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
64214acc736e336cbd6026df781d4f411e908831815Andreas Huber
64314acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeString:
64414acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
64514acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeCString(item.u.stringValue->c_str());
64614acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
64714acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
64814acc736e336cbd6026df781d4f411e908831815Andreas Huber
64914acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeMessage:
65014acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
65114acc736e336cbd6026df781d4f411e908831815Andreas Huber                static_cast<AMessage *>(item.u.refValue)->writeToParcel(parcel);
65214acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
65314acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
65414acc736e336cbd6026df781d4f411e908831815Andreas Huber
65514acc736e336cbd6026df781d4f411e908831815Andreas Huber            default:
65614acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
65729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("This type of object cannot cross process boundaries.");
65814acc736e336cbd6026df781d4f411e908831815Andreas Huber                TRESPASS();
65914acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
66014acc736e336cbd6026df781d4f411e908831815Andreas Huber        }
66114acc736e336cbd6026df781d4f411e908831815Andreas Huber    }
66214acc736e336cbd6026df781d4f411e908831815Andreas Huber}
66314acc736e336cbd6026df781d4f411e908831815Andreas Huber
6645778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t AMessage::countEntries() const {
6655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return mNumItems;
6665778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
6675778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6685778822d86b0337407514b9372562b86edfa91cdAndreas Huberconst char *AMessage::getEntryNameAt(size_t index, Type *type) const {
6695778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index >= mNumItems) {
6705778822d86b0337407514b9372562b86edfa91cdAndreas Huber        *type = kTypeInt32;
6715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6725778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return NULL;
6735778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
6745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6755778822d86b0337407514b9372562b86edfa91cdAndreas Huber    *type = mItems[index].mType;
6765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6775778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return mItems[index].mName;
6785778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
6795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
68072961230a5890071bcca436eb5630172ce84ec41Andreas Huber}  // namespace android
681