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"
305804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar#include "AHandler.h"
3172961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AString.h"
3272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3314acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <binder/Parcel.h>
34840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include <media/stagefright/foundation/hexdump.h>
3514acc736e336cbd6026df781d4f411e908831815Andreas Huber
3672961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android {
3772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
385df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberextern ALooperRoster gLooperRoster;
395df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
403f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstatus_t AReplyToken::setReply(const sp<AMessage> &reply) {
413f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    if (mReplied) {
423f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar        ALOGE("trying to post a duplicate reply");
433f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar        return -EBUSY;
443f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    }
453f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    CHECK(mReply == NULL);
463f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    mReply = reply;
473f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    mReplied = true;
483f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    return OK;
493f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar}
503f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar
515804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos MolnarAMessage::AMessage(void)
525804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    : mWhat(0),
535804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar      mTarget(0),
545804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar      mNumItems(0) {
555804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar}
565804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar
575804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos MolnarAMessage::AMessage(uint32_t what, const sp<const AHandler> &handler)
585804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    : mWhat(what),
5972961230a5890071bcca436eb5630172ce84ec41Andreas Huber      mNumItems(0) {
605804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    setTarget(handler);
6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
6372961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::~AMessage() {
6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    clear();
6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
6772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setWhat(uint32_t what) {
6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mWhat = what;
6972961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
7172961230a5890071bcca436eb5630172ce84ec41Andreas Huberuint32_t AMessage::what() const {
7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return mWhat;
7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
755804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnarvoid AMessage::setTarget(const sp<const AHandler> &handler) {
765804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    if (handler == NULL) {
775804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar        mTarget = 0;
785804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar        mHandler.clear();
795804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar        mLooper.clear();
805804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    } else {
815804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar        mTarget = handler->id();
825804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar        mHandler = handler->getHandler();
835804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar        mLooper = handler->getLooper();
845804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    }
8572961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
8772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::clear() {
8872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
8972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        Item *item = &mItems[i];
907ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        delete[] item->mName;
917ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        item->mName = NULL;
927ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        freeItemValue(item);
9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mNumItems = 0;
9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
977ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarvoid AMessage::freeItemValue(Item *item) {
9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    switch (item->mType) {
9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeString:
10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        {
10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber            delete item->u.stringValue;
10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeObject:
10672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeMessage:
107bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber        case kTypeBuffer:
10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        {
10972961230a5890071bcca436eb5630172ce84ec41Andreas Huber            if (item->u.refValue != NULL) {
11072961230a5890071bcca436eb5630172ce84ec41Andreas Huber                item->u.refValue->decStrong(this);
11172961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
11272961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
11372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
11472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
11572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        default:
11672961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1207ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS
1217ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#include <utils/Mutex.h>
1227ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar
1237ea429295a2eb31f2d9256c36c1ef53a195456acLajos MolnarMutex gLock;
1247ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gFindItemCalls = 1;
1257ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gDupCalls = 1;
1267ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gAverageNumItems = 0;
1277ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gAverageNumChecks = 0;
1287ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gAverageNumMemChecks = 0;
1297ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gAverageDupItems = 0;
1307ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gLastChecked = -1;
1317ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar
1327ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic void reportStats() {
1337ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    int32_t time = (ALooper::GetNowUs() / 1000);
1347ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    if (time / 1000 != gLastChecked / 1000) {
1357ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        gLastChecked = time;
1367ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        ALOGI("called findItemIx %zu times (for len=%.1f i=%.1f/%.1f mem) dup %zu times (for len=%.1f)",
1377ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar                gFindItemCalls,
1387ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar                gAverageNumItems / (float)gFindItemCalls,
1397ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar                gAverageNumChecks / (float)gFindItemCalls,
1407ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar                gAverageNumMemChecks / (float)gFindItemCalls,
1417ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar                gDupCalls,
1427ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar                gAverageDupItems / (float)gDupCalls);
1437ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        gFindItemCalls = gDupCalls = 1;
1447ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        gAverageNumItems = gAverageNumChecks = gAverageNumMemChecks = gAverageDupItems = 0;
1457ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        gLastChecked = time;
1467ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    }
1477ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar}
1487ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif
14972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1507ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarinline size_t AMessage::findItemIndex(const char *name, size_t len) const {
1517ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS
1527ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    size_t memchecks = 0;
1537ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif
15472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    size_t i = 0;
1557ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    for (; i < mNumItems; i++) {
1567ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        if (len != mItems[i].mNameLength) {
1577ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar            continue;
1587ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        }
1597ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS
1607ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        ++memchecks;
1617ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif
1627ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        if (!memcmp(mItems[i].mName, name, len)) {
1637ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar            break;
1647ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        }
1657ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    }
1667ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS
1677ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    {
1687ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        Mutex::Autolock _l(gLock);
1697ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        ++gFindItemCalls;
1707ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        gAverageNumItems += mNumItems;
1717ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        gAverageNumMemChecks += memchecks;
1727ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        gAverageNumChecks += i;
1737ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        reportStats();
17472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
1757ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif
1767ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    return i;
1777ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar}
1787ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar
1797ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar// assumes item's name was uninitialized or NULL
1807ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarvoid AMessage::Item::setName(const char *name, size_t len) {
1817ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    mNameLength = len;
1827ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    mName = new char[len + 1];
1837ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    memcpy((void*)mName, name, len + 1);
1847ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar}
18572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1867ea429295a2eb31f2d9256c36c1ef53a195456acLajos MolnarAMessage::Item *AMessage::allocateItem(const char *name) {
1877ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    size_t len = strlen(name);
1887ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    size_t i = findItemIndex(name, len);
18972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item;
19072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
19172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (i < mNumItems) {
19272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        item = &mItems[i];
1937ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        freeItemValue(item);
19472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    } else {
19572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        CHECK(mNumItems < kMaxNumItems);
19672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        i = mNumItems++;
19772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        item = &mItems[i];
1987ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        item->setName(name, len);
19972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
20072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
20172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return item;
20272961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
20472961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst AMessage::Item *AMessage::findItem(
20572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const char *name, Type type) const {
2067ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    size_t i = findItemIndex(name, strlen(name));
2077ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    if (i < mNumItems) {
20872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const Item *item = &mItems[i];
2097ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        return item->mType == type ? item : NULL;
21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
21172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
21272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return NULL;
21372961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
21472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
215513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnarbool AMessage::contains(const char *name) const {
2167ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    size_t i = findItemIndex(name, strlen(name));
2177ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    return i < mNumItems;
218513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar}
219513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar
22072961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define BASIC_TYPE(NAME,FIELDNAME,TYPENAME)                             \
22172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::set##NAME(const char *name, TYPENAME value) {            \
22272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);                                    \
22372961230a5890071bcca436eb5630172ce84ec41Andreas Huber                                                                        \
22472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kType##NAME;                                          \
22572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.FIELDNAME = value;                                          \
22672961230a5890071bcca436eb5630172ce84ec41Andreas Huber}                                                                       \
22772961230a5890071bcca436eb5630172ce84ec41Andreas Huber                                                                        \
22872961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::find##NAME(const char *name, TYPENAME *value) const {    \
22972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kType##NAME);                     \
23072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {                                                         \
23172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *value = item->u.FIELDNAME;                                     \
23272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;                                                    \
23372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }                                                                   \
23472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;                                                       \
23572961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
23672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
23772961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int32,int32Value,int32_t)
23872961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int64,int64Value,int64_t)
23972961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Size,sizeValue,size_t)
24072961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Float,floatValue,float)
24172961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Double,doubleValue,double)
24272961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Pointer,ptrValue,void *)
24372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
24472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#undef BASIC_TYPE
24572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
24672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setString(
24772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const char *name, const char *s, ssize_t len) {
24872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
24972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kTypeString;
25072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.stringValue = new AString(s, len < 0 ? strlen(s) : len);
25172961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
25272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
253513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnarvoid AMessage::setString(
254513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar        const char *name, const AString &s) {
255513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar    setString(name, s.c_str(), s.size());
256513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar}
257513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar
2582d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObjectInternal(
2592d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        const char *name, const sp<RefBase> &obj, Type type) {
26072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
2612d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    item->mType = type;
26272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
26372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (obj != NULL) { obj->incStrong(this); }
26472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.refValue = obj.get();
26572961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
26672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
2672d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObject(const char *name, const sp<RefBase> &obj) {
2682d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    setObjectInternal(name, obj, kTypeObject);
2692d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber}
2702d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber
2712d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setBuffer(const char *name, const sp<ABuffer> &buffer) {
2722d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    setObjectInternal(name, sp<RefBase>(buffer), kTypeBuffer);
2732d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber}
2742d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber
27572961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setMessage(const char *name, const sp<AMessage> &obj) {
27672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
27772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kTypeMessage;
27872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
27972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (obj != NULL) { obj->incStrong(this); }
28072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.refValue = obj.get();
28172961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
28272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
28331e2508c75018145a8238925ff1a08cbde4e799aAndreas Hubervoid AMessage::setRect(
28431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        const char *name,
28531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        int32_t left, int32_t top, int32_t right, int32_t bottom) {
28631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    Item *item = allocateItem(name);
28731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->mType = kTypeRect;
28831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
28931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mLeft = left;
29031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mTop = top;
29131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mRight = right;
29231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mBottom = bottom;
29331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber}
29431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
29572961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findString(const char *name, AString *value) const {
29672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeString);
29772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
29872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *value = *item->u.stringValue;
29972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
30072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
30172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
30272961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
30372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
30472961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findObject(const char *name, sp<RefBase> *obj) const {
30572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeObject);
30672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
30772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *obj = item->u.refValue;
30872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
30972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
31072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
31172961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
31272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3132d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huberbool AMessage::findBuffer(const char *name, sp<ABuffer> *buf) const {
3142d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    const Item *item = findItem(name, kTypeBuffer);
3152d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    if (item) {
3162d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        *buf = (ABuffer *)(item->u.refValue);
3172d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        return true;
3182d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    }
3192d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    return false;
3202d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber}
3212d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber
32272961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findMessage(const char *name, sp<AMessage> *obj) const {
32372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeMessage);
32472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
32572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *obj = static_cast<AMessage *>(item->u.refValue);
32672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
32772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
32872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
32972961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
33072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
33131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huberbool AMessage::findRect(
33231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        const char *name,
33331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const {
33431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    const Item *item = findItem(name, kTypeRect);
33531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    if (item == NULL) {
33631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        return false;
33731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    }
33831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
33931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *left = item->u.rectValue.mLeft;
34031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *top = item->u.rectValue.mTop;
34131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *right = item->u.rectValue.mRight;
34231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *bottom = item->u.rectValue.mBottom;
34331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
34431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    return true;
34531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber}
34631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
3475804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnarvoid AMessage::deliver() {
3485804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    sp<AHandler> handler = mHandler.promote();
3495804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    if (handler == NULL) {
3505804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar        ALOGW("failed to deliver message as target handler %d is gone.", mTarget);
3515804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar        return;
3525804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    }
3535804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar
3545804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    handler->deliverMessage(this);
3555804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar}
3565804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar
3575804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnarstatus_t AMessage::post(int64_t delayUs) {
3585804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    sp<ALooper> looper = mLooper.promote();
3595804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    if (looper == NULL) {
3605804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar        ALOGW("failed to post message as target looper for handler %d is gone.", mTarget);
3615804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar        return -ENOENT;
3625804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    }
3635804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar
3645804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    looper->post(this, delayUs);
3655804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    return OK;
36672961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
36772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3685df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberstatus_t AMessage::postAndAwaitResponse(sp<AMessage> *response) {
3693f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<ALooper> looper = mLooper.promote();
3703f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    if (looper == NULL) {
3713f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar        ALOGW("failed to post message as target looper for handler %d is gone.", mTarget);
3723f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar        return -ENOENT;
3733f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    }
3743f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar
3753f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> token = looper->createReplyToken();
3763f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    if (token == NULL) {
3773f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar        ALOGE("failed to create reply token");
3783f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar        return -ENOMEM;
3793f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    }
3803f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    setObject("replyID", token);
3813f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar
3823f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    looper->post(this, 0 /* delayUs */);
3833f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    return looper->awaitResponse(token, response);
3845df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber}
3855df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
3863f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstatus_t AMessage::postReply(const sp<AReplyToken> &replyToken) {
3873f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    if (replyToken == NULL) {
3883f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar        ALOGW("failed to post reply to a NULL token");
3893f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar        return -ENOENT;
3903f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    }
3913f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<ALooper> looper = replyToken->getLooper();
3923f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    if (looper == NULL) {
3933f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar        ALOGW("failed to post reply as target looper is gone.");
3943f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar        return -ENOENT;
3953f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    }
3963f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    return looper->postReply(replyToken, this);
3975df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber}
3985df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
3993f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarbool AMessage::senderAwaitsResponse(sp<AReplyToken> *replyToken) {
4003f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<RefBase> tmp;
4013f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    bool found = findObject("replyID", &tmp);
4025df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
4035df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    if (!found) {
4045df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber        return false;
4055df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    }
4065df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
4073f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    *replyToken = static_cast<AReplyToken *>(tmp.get());
4083f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    tmp.clear();
4093f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    setObject("replyID", tmp);
4103f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // TODO: delete Object instead of setting it to NULL
4115df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
4123f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    return *replyToken != NULL;
4135df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber}
4145df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
41572961230a5890071bcca436eb5630172ce84ec41Andreas Hubersp<AMessage> AMessage::dup() const {
4165804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    sp<AMessage> msg = new AMessage(mWhat, mHandler.promote());
41772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    msg->mNumItems = mNumItems;
41872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4197ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS
4207ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    {
4217ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        Mutex::Autolock _l(gLock);
4227ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        ++gDupCalls;
4237ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        gAverageDupItems += mNumItems;
4247ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        reportStats();
4257ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    }
4267ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif
4277ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar
42872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
42972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const Item *from = &mItems[i];
43072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        Item *to = &msg->mItems[i];
43172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4327ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        to->setName(from->mName, from->mNameLength);
43372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        to->mType = from->mType;
43472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
43572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        switch (from->mType) {
43672961230a5890071bcca436eb5630172ce84ec41Andreas Huber            case kTypeString:
43772961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
43872961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.stringValue =
43972961230a5890071bcca436eb5630172ce84ec41Andreas Huber                    new AString(*from->u.stringValue);
44072961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
44172961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
44272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
44372961230a5890071bcca436eb5630172ce84ec41Andreas Huber            case kTypeObject:
444bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber            case kTypeBuffer:
44572961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
44672961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.refValue = from->u.refValue;
44772961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.refValue->incStrong(msg.get());
44872961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
44972961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
45072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4512c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            case kTypeMessage:
4522c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            {
4532c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                sp<AMessage> copy =
4542c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                    static_cast<AMessage *>(from->u.refValue)->dup();
4552c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
4562c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                to->u.refValue = copy.get();
4572c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                to->u.refValue->incStrong(msg.get());
4582c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                break;
4592c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            }
4602c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
46172961230a5890071bcca436eb5630172ce84ec41Andreas Huber            default:
46272961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
46372961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u = from->u;
46472961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
46572961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
46672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
46772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
46872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
46972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return msg;
47072961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
47172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
472bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic void appendIndent(AString *s, int32_t indent) {
473bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    static const char kWhitespace[] =
474bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        "                                        "
475bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        "                                        ";
476bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
477bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    CHECK_LT((size_t)indent, sizeof(kWhitespace));
478bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
479bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s->append(kWhitespace, indent);
480bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
481bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
482bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic bool isFourcc(uint32_t what) {
483bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    return isprint(what & 0xff)
484bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 8) & 0xff)
485bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 16) & 0xff)
486bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 24) & 0xff);
487bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
488bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
489bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas HuberAString AMessage::debugString(int32_t indent) const {
490bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    AString s = "AMessage(what = ";
491bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
492bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    AString tmp;
493bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    if (isFourcc(mWhat)) {
494a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes        tmp = AStringPrintf(
495bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                "'%c%c%c%c'",
496bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)(mWhat >> 24),
497bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)((mWhat >> 16) & 0xff),
498bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)((mWhat >> 8) & 0xff),
499bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)(mWhat & 0xff));
500bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    } else {
501a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes        tmp = AStringPrintf("0x%08x", mWhat);
502bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
503bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append(tmp);
504bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
505bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    if (mTarget != 0) {
506a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes        tmp = AStringPrintf(", target = %d", mTarget);
507bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append(tmp);
508bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
509bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append(") = {\n");
510bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
511bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
512bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        const Item &item = mItems[i];
513bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
514bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        switch (item.mType) {
515bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeInt32:
516a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes                tmp = AStringPrintf(
517bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "int32_t %s = %d", item.mName, item.u.int32Value);
518bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
519bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeInt64:
520a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes                tmp = AStringPrintf(
521bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "int64_t %s = %lld", item.mName, item.u.int64Value);
522bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
523bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeSize:
524a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes                tmp = AStringPrintf(
525bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "size_t %s = %d", item.mName, item.u.sizeValue);
526bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
527bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeFloat:
528a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes                tmp = AStringPrintf(
529bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "float %s = %f", item.mName, item.u.floatValue);
530bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
531bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeDouble:
532a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes                tmp = AStringPrintf(
533bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "double %s = %f", item.mName, item.u.doubleValue);
534bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
535bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypePointer:
536a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes                tmp = AStringPrintf(
537bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "void *%s = %p", item.mName, item.u.ptrValue);
538bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
539bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeString:
540a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes                tmp = AStringPrintf(
541bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "string %s = \"%s\"",
542bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.mName,
543bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.u.stringValue->c_str());
544bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
545bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeObject:
546a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes                tmp = AStringPrintf(
547bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "RefBase *%s = %p", item.mName, item.u.refValue);
548bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
549bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber            case kTypeBuffer:
550840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            {
551840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                sp<ABuffer> buffer = static_cast<ABuffer *>(item.u.refValue);
552840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
553cf31f1eecf46d599428e115dfee8dd47b76c83fcAndy Hung                if (buffer != NULL && buffer->data() != NULL && buffer->size() <= 64) {
554a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes                    tmp = AStringPrintf("Buffer %s = {\n", item.mName);
555840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                    hexdump(buffer->data(), buffer->size(), indent + 4, &tmp);
556840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                    appendIndent(&tmp, indent + 2);
557840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                    tmp.append("}");
558840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                } else {
559a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes                    tmp = AStringPrintf(
560840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                            "Buffer *%s = %p", item.mName, buffer.get());
561840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                }
562bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber                break;
563840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            }
564bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeMessage:
565a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes                tmp = AStringPrintf(
566bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "AMessage %s = %s",
567bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.mName,
568bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        static_cast<AMessage *>(
569bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                            item.u.refValue)->debugString(
570bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                                indent + strlen(item.mName) + 14).c_str());
571bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
572078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber            case kTypeRect:
573a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes                tmp = AStringPrintf(
574078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        "Rect %s(%d, %d, %d, %d)",
575078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.mName,
576078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mLeft,
577078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mTop,
578078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mRight,
579078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mBottom);
580078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                break;
581bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            default:
582bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                TRESPASS();
583bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        }
584bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
585bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        appendIndent(&s, indent);
586bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append("  ");
587bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append(tmp);
588bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append("\n");
589bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
590bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
591bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    appendIndent(&s, indent);
592bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append("}");
593bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
594bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    return s;
595bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
596bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
59714acc736e336cbd6026df781d4f411e908831815Andreas Huber// static
59814acc736e336cbd6026df781d4f411e908831815Andreas Hubersp<AMessage> AMessage::FromParcel(const Parcel &parcel) {
59914acc736e336cbd6026df781d4f411e908831815Andreas Huber    int32_t what = parcel.readInt32();
6005804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    sp<AMessage> msg = new AMessage();
6015804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    msg->setWhat(what);
60214acc736e336cbd6026df781d4f411e908831815Andreas Huber
60314acc736e336cbd6026df781d4f411e908831815Andreas Huber    msg->mNumItems = static_cast<size_t>(parcel.readInt32());
60414acc736e336cbd6026df781d4f411e908831815Andreas Huber    for (size_t i = 0; i < msg->mNumItems; ++i) {
60514acc736e336cbd6026df781d4f411e908831815Andreas Huber        Item *item = &msg->mItems[i];
60614acc736e336cbd6026df781d4f411e908831815Andreas Huber
6077ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        const char *name = parcel.readCString();
6087ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        item->setName(name, strlen(name));
60914acc736e336cbd6026df781d4f411e908831815Andreas Huber        item->mType = static_cast<Type>(parcel.readInt32());
61014acc736e336cbd6026df781d4f411e908831815Andreas Huber
61114acc736e336cbd6026df781d4f411e908831815Andreas Huber        switch (item->mType) {
61214acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt32:
61314acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
61414acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.int32Value = parcel.readInt32();
61514acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
61614acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
61714acc736e336cbd6026df781d4f411e908831815Andreas Huber
61814acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt64:
61914acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
62014acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.int64Value = parcel.readInt64();
62114acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
62214acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
62314acc736e336cbd6026df781d4f411e908831815Andreas Huber
62414acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeSize:
62514acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
62614acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.sizeValue = static_cast<size_t>(parcel.readInt32());
62714acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
62814acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
62914acc736e336cbd6026df781d4f411e908831815Andreas Huber
63014acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeFloat:
63114acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
63214acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.floatValue = parcel.readFloat();
63314acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
63414acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
63514acc736e336cbd6026df781d4f411e908831815Andreas Huber
63614acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeDouble:
63714acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
63814acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.doubleValue = parcel.readDouble();
63914acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
64014acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
64114acc736e336cbd6026df781d4f411e908831815Andreas Huber
64214acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeString:
64314acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
64414acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.stringValue = new AString(parcel.readCString());
64514acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
64614acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
64714acc736e336cbd6026df781d4f411e908831815Andreas Huber
64814acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeMessage:
64914acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
65014acc736e336cbd6026df781d4f411e908831815Andreas Huber                sp<AMessage> subMsg = AMessage::FromParcel(parcel);
65114acc736e336cbd6026df781d4f411e908831815Andreas Huber                subMsg->incStrong(msg.get());
65214acc736e336cbd6026df781d4f411e908831815Andreas Huber
65314acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.refValue = subMsg.get();
65414acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
65514acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
65614acc736e336cbd6026df781d4f411e908831815Andreas Huber
65714acc736e336cbd6026df781d4f411e908831815Andreas Huber            default:
65814acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
65929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("This type of object cannot cross process boundaries.");
66014acc736e336cbd6026df781d4f411e908831815Andreas Huber                TRESPASS();
66114acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
66214acc736e336cbd6026df781d4f411e908831815Andreas Huber        }
66314acc736e336cbd6026df781d4f411e908831815Andreas Huber    }
66414acc736e336cbd6026df781d4f411e908831815Andreas Huber
66514acc736e336cbd6026df781d4f411e908831815Andreas Huber    return msg;
66614acc736e336cbd6026df781d4f411e908831815Andreas Huber}
66714acc736e336cbd6026df781d4f411e908831815Andreas Huber
66814acc736e336cbd6026df781d4f411e908831815Andreas Hubervoid AMessage::writeToParcel(Parcel *parcel) const {
66914acc736e336cbd6026df781d4f411e908831815Andreas Huber    parcel->writeInt32(static_cast<int32_t>(mWhat));
67014acc736e336cbd6026df781d4f411e908831815Andreas Huber    parcel->writeInt32(static_cast<int32_t>(mNumItems));
67114acc736e336cbd6026df781d4f411e908831815Andreas Huber
67214acc736e336cbd6026df781d4f411e908831815Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
67314acc736e336cbd6026df781d4f411e908831815Andreas Huber        const Item &item = mItems[i];
67414acc736e336cbd6026df781d4f411e908831815Andreas Huber
67514acc736e336cbd6026df781d4f411e908831815Andreas Huber        parcel->writeCString(item.mName);
67614acc736e336cbd6026df781d4f411e908831815Andreas Huber        parcel->writeInt32(static_cast<int32_t>(item.mType));
67714acc736e336cbd6026df781d4f411e908831815Andreas Huber
67814acc736e336cbd6026df781d4f411e908831815Andreas Huber        switch (item.mType) {
67914acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt32:
68014acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
68114acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeInt32(item.u.int32Value);
68214acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
68314acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
68414acc736e336cbd6026df781d4f411e908831815Andreas Huber
68514acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt64:
68614acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
68714acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeInt64(item.u.int64Value);
68814acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
68914acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
69014acc736e336cbd6026df781d4f411e908831815Andreas Huber
69114acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeSize:
69214acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
69314acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeInt32(static_cast<int32_t>(item.u.sizeValue));
69414acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
69514acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
69614acc736e336cbd6026df781d4f411e908831815Andreas Huber
69714acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeFloat:
69814acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
69914acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeFloat(item.u.floatValue);
70014acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
70114acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
70214acc736e336cbd6026df781d4f411e908831815Andreas Huber
70314acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeDouble:
70414acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
70514acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeDouble(item.u.doubleValue);
70614acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
70714acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
70814acc736e336cbd6026df781d4f411e908831815Andreas Huber
70914acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeString:
71014acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
71114acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeCString(item.u.stringValue->c_str());
71214acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
71314acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
71414acc736e336cbd6026df781d4f411e908831815Andreas Huber
71514acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeMessage:
71614acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
71714acc736e336cbd6026df781d4f411e908831815Andreas Huber                static_cast<AMessage *>(item.u.refValue)->writeToParcel(parcel);
71814acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
71914acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
72014acc736e336cbd6026df781d4f411e908831815Andreas Huber
72114acc736e336cbd6026df781d4f411e908831815Andreas Huber            default:
72214acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
72329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("This type of object cannot cross process boundaries.");
72414acc736e336cbd6026df781d4f411e908831815Andreas Huber                TRESPASS();
72514acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
72614acc736e336cbd6026df781d4f411e908831815Andreas Huber        }
72714acc736e336cbd6026df781d4f411e908831815Andreas Huber    }
72814acc736e336cbd6026df781d4f411e908831815Andreas Huber}
72914acc736e336cbd6026df781d4f411e908831815Andreas Huber
7305778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t AMessage::countEntries() const {
7315778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return mNumItems;
7325778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
7335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7345778822d86b0337407514b9372562b86edfa91cdAndreas Huberconst char *AMessage::getEntryNameAt(size_t index, Type *type) const {
7355778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index >= mNumItems) {
7365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        *type = kTypeInt32;
7375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return NULL;
7395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
7405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7415778822d86b0337407514b9372562b86edfa91cdAndreas Huber    *type = mItems[index].mType;
7425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return mItems[index].mName;
7445778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
7455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
74672961230a5890071bcca436eb5630172ce84ec41Andreas Huber}  // namespace android
747