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
1772961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AMessage.h"
1872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
19bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber#include <ctype.h>
20bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
2172961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AAtomizer.h"
222d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber#include "ABuffer.h"
2372961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ADebug.h"
2472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ALooperRoster.h"
2572961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AString.h"
2672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
2714acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <binder/Parcel.h>
28840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include <media/stagefright/foundation/hexdump.h>
2914acc736e336cbd6026df781d4f411e908831815Andreas Huber
3072961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android {
3172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
325df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberextern ALooperRoster gLooperRoster;
335df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
3472961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::AMessage(uint32_t what, ALooper::handler_id target)
3572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    : mWhat(what),
3672961230a5890071bcca436eb5630172ce84ec41Andreas Huber      mTarget(target),
3772961230a5890071bcca436eb5630172ce84ec41Andreas Huber      mNumItems(0) {
3872961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
3972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4072961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::~AMessage() {
4172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    clear();
4272961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
4372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setWhat(uint32_t what) {
4572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mWhat = what;
4672961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
4772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4872961230a5890071bcca436eb5630172ce84ec41Andreas Huberuint32_t AMessage::what() const {
4972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return mWhat;
5072961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
5172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5272961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setTarget(ALooper::handler_id handlerID) {
5372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mTarget = handlerID;
5472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
5572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5672961230a5890071bcca436eb5630172ce84ec41Andreas HuberALooper::handler_id AMessage::target() const {
5772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return mTarget;
5872961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
5972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
6072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::clear() {
6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        Item *item = &mItems[i];
6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        freeItem(item);
6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mNumItems = 0;
6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
6872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::freeItem(Item *item) {
6972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    switch (item->mType) {
7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeString:
7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        {
7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber            delete item->u.stringValue;
7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
7572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
7672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeObject:
7772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeMessage:
78bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber        case kTypeBuffer:
7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        {
8072961230a5890071bcca436eb5630172ce84ec41Andreas Huber            if (item->u.refValue != NULL) {
8172961230a5890071bcca436eb5630172ce84ec41Andreas Huber                item->u.refValue->decStrong(this);
8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
8472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
8572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        default:
8772961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
8872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
8972961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
9072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
9172961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::Item *AMessage::allocateItem(const char *name) {
9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    name = AAtomizer::Atomize(name);
9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    size_t i = 0;
9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    while (i < mNumItems && mItems[i].mName != name) {
9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        ++i;
9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item;
10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (i < mNumItems) {
10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        item = &mItems[i];
10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        freeItem(item);
10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    } else {
10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        CHECK(mNumItems < kMaxNumItems);
10672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        i = mNumItems++;
10772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        item = &mItems[i];
10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
10972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        item->mName = name;
11072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
11172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
11272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return item;
11372961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
11472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
11572961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst AMessage::Item *AMessage::findItem(
11672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const char *name, Type type) const {
11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    name = AAtomizer::Atomize(name);
11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
12072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const Item *item = &mItems[i];
12172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
12272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        if (item->mName == name) {
12372961230a5890071bcca436eb5630172ce84ec41Andreas Huber            return item->mType == type ? item : NULL;
12472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
12572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
12672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
12772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return NULL;
12872961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
12972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
13072961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define BASIC_TYPE(NAME,FIELDNAME,TYPENAME)                             \
13172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::set##NAME(const char *name, TYPENAME value) {            \
13272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);                                    \
13372961230a5890071bcca436eb5630172ce84ec41Andreas Huber                                                                        \
13472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kType##NAME;                                          \
13572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.FIELDNAME = value;                                          \
13672961230a5890071bcca436eb5630172ce84ec41Andreas Huber}                                                                       \
13772961230a5890071bcca436eb5630172ce84ec41Andreas Huber                                                                        \
13872961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::find##NAME(const char *name, TYPENAME *value) const {    \
13972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kType##NAME);                     \
14072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {                                                         \
14172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *value = item->u.FIELDNAME;                                     \
14272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;                                                    \
14372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }                                                                   \
14472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;                                                       \
14572961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
14672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
14772961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int32,int32Value,int32_t)
14872961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int64,int64Value,int64_t)
14972961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Size,sizeValue,size_t)
15072961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Float,floatValue,float)
15172961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Double,doubleValue,double)
15272961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Pointer,ptrValue,void *)
15372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
15472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#undef BASIC_TYPE
15572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
15672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setString(
15772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const char *name, const char *s, ssize_t len) {
15872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
15972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kTypeString;
16072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.stringValue = new AString(s, len < 0 ? strlen(s) : len);
16172961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
16272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1632d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObjectInternal(
1642d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        const char *name, const sp<RefBase> &obj, Type type) {
16572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
1662d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    item->mType = type;
16772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
16872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (obj != NULL) { obj->incStrong(this); }
16972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.refValue = obj.get();
17072961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
17172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1722d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObject(const char *name, const sp<RefBase> &obj) {
1732d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    setObjectInternal(name, obj, kTypeObject);
1742d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber}
1752d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber
1762d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setBuffer(const char *name, const sp<ABuffer> &buffer) {
1772d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    setObjectInternal(name, sp<RefBase>(buffer), kTypeBuffer);
1782d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber}
1792d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber
18072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setMessage(const char *name, const sp<AMessage> &obj) {
18172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
18272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kTypeMessage;
18372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
18472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (obj != NULL) { obj->incStrong(this); }
18572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.refValue = obj.get();
18672961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
18772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
18831e2508c75018145a8238925ff1a08cbde4e799aAndreas Hubervoid AMessage::setRect(
18931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        const char *name,
19031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        int32_t left, int32_t top, int32_t right, int32_t bottom) {
19131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    Item *item = allocateItem(name);
19231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->mType = kTypeRect;
19331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
19431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mLeft = left;
19531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mTop = top;
19631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mRight = right;
19731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mBottom = bottom;
19831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber}
19931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
20072961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findString(const char *name, AString *value) const {
20172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeString);
20272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *value = *item->u.stringValue;
20472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
20572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
20672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
20772961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
20872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
20972961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findObject(const char *name, sp<RefBase> *obj) const {
21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeObject);
21172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
21272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *obj = item->u.refValue;
21372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
21472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
21572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
21672961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
21772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
2182d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huberbool AMessage::findBuffer(const char *name, sp<ABuffer> *buf) const {
2192d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    const Item *item = findItem(name, kTypeBuffer);
2202d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    if (item) {
2212d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        *buf = (ABuffer *)(item->u.refValue);
2222d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        return true;
2232d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    }
2242d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    return false;
2252d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber}
2262d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber
22772961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findMessage(const char *name, sp<AMessage> *obj) const {
22872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeMessage);
22972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
23072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *obj = static_cast<AMessage *>(item->u.refValue);
23172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
23272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
23372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
23472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
23572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
23631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huberbool AMessage::findRect(
23731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        const char *name,
23831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const {
23931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    const Item *item = findItem(name, kTypeRect);
24031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    if (item == NULL) {
24131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        return false;
24231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    }
24331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
24431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *left = item->u.rectValue.mLeft;
24531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *top = item->u.rectValue.mTop;
24631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *right = item->u.rectValue.mRight;
24731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *bottom = item->u.rectValue.mBottom;
24831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
24931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    return true;
25031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber}
25131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
25272961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::post(int64_t delayUs) {
25372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    gLooperRoster.postMessage(this, delayUs);
25472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
25572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
2565df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberstatus_t AMessage::postAndAwaitResponse(sp<AMessage> *response) {
2575df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    return gLooperRoster.postAndAwaitResponse(this, response);
2585df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber}
2595df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
2605df775d2f509c76e76a46615fca83dba95299f6eAndreas Hubervoid AMessage::postReply(uint32_t replyID) {
2615df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    gLooperRoster.postReply(replyID, this);
2625df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber}
2635df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
2645df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberbool AMessage::senderAwaitsResponse(uint32_t *replyID) const {
2655df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    int32_t tmp;
2665df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    bool found = findInt32("replyID", &tmp);
2675df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
2685df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    if (!found) {
2695df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber        return false;
2705df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    }
2715df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
2725df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    *replyID = static_cast<uint32_t>(tmp);
2735df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
2745df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    return true;
2755df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber}
2765df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
27772961230a5890071bcca436eb5630172ce84ec41Andreas Hubersp<AMessage> AMessage::dup() const {
27872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    sp<AMessage> msg = new AMessage(mWhat, mTarget);
27972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    msg->mNumItems = mNumItems;
28072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
28172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
28272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const Item *from = &mItems[i];
28372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        Item *to = &msg->mItems[i];
28472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
28572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        to->mName = from->mName;
28672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        to->mType = from->mType;
28772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
28872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        switch (from->mType) {
28972961230a5890071bcca436eb5630172ce84ec41Andreas Huber            case kTypeString:
29072961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
29172961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.stringValue =
29272961230a5890071bcca436eb5630172ce84ec41Andreas Huber                    new AString(*from->u.stringValue);
29372961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
29472961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
29572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
29672961230a5890071bcca436eb5630172ce84ec41Andreas Huber            case kTypeObject:
297bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber            case kTypeBuffer:
29872961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
29972961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.refValue = from->u.refValue;
30072961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.refValue->incStrong(msg.get());
30172961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
30272961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
30372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3042c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            case kTypeMessage:
3052c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            {
3062c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                sp<AMessage> copy =
3072c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                    static_cast<AMessage *>(from->u.refValue)->dup();
3082c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
3092c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                to->u.refValue = copy.get();
3102c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                to->u.refValue->incStrong(msg.get());
3112c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                break;
3122c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            }
3132c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
31472961230a5890071bcca436eb5630172ce84ec41Andreas Huber            default:
31572961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
31672961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u = from->u;
31772961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
31872961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
31972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
32072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
32172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
32272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return msg;
32372961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
32472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
325bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic void appendIndent(AString *s, int32_t indent) {
326bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    static const char kWhitespace[] =
327bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        "                                        "
328bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        "                                        ";
329bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
330bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    CHECK_LT((size_t)indent, sizeof(kWhitespace));
331bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
332bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s->append(kWhitespace, indent);
333bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
334bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
335bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic bool isFourcc(uint32_t what) {
336bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    return isprint(what & 0xff)
337bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 8) & 0xff)
338bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 16) & 0xff)
339bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 24) & 0xff);
340bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
341bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
342bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas HuberAString AMessage::debugString(int32_t indent) const {
343bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    AString s = "AMessage(what = ";
344bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
345bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    AString tmp;
346bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    if (isFourcc(mWhat)) {
347bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        tmp = StringPrintf(
348bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                "'%c%c%c%c'",
349bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)(mWhat >> 24),
350bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)((mWhat >> 16) & 0xff),
351bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)((mWhat >> 8) & 0xff),
352bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)(mWhat & 0xff));
353bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    } else {
354bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        tmp = StringPrintf("0x%08x", mWhat);
355bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
356bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append(tmp);
357bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
358bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    if (mTarget != 0) {
359bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        tmp = StringPrintf(", target = %d", mTarget);
360bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append(tmp);
361bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
362bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append(") = {\n");
363bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
364bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
365bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        const Item &item = mItems[i];
366bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
367bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        switch (item.mType) {
368bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeInt32:
369bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
370bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "int32_t %s = %d", item.mName, item.u.int32Value);
371bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
372bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeInt64:
373bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
374bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "int64_t %s = %lld", item.mName, item.u.int64Value);
375bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
376bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeSize:
377bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
378bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "size_t %s = %d", item.mName, item.u.sizeValue);
379bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
380bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeFloat:
381bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
382bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "float %s = %f", item.mName, item.u.floatValue);
383bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
384bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeDouble:
385bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
386bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "double %s = %f", item.mName, item.u.doubleValue);
387bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
388bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypePointer:
389bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
390bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "void *%s = %p", item.mName, item.u.ptrValue);
391bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
392bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeString:
393bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
394bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "string %s = \"%s\"",
395bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.mName,
396bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.u.stringValue->c_str());
397bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
398bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeObject:
399bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
400bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "RefBase *%s = %p", item.mName, item.u.refValue);
401bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
402bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber            case kTypeBuffer:
403840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            {
404840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                sp<ABuffer> buffer = static_cast<ABuffer *>(item.u.refValue);
405840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
406840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                if (buffer != NULL && buffer->size() <= 64) {
407840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                    tmp = StringPrintf("Buffer %s = {\n", item.mName);
408840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                    hexdump(buffer->data(), buffer->size(), indent + 4, &tmp);
409840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                    appendIndent(&tmp, indent + 2);
410840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                    tmp.append("}");
411840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                } else {
412840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                    tmp = StringPrintf(
413840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                            "Buffer *%s = %p", item.mName, buffer.get());
414840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber                }
415bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber                break;
416840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber            }
417bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeMessage:
418bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
419bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "AMessage %s = %s",
420bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.mName,
421bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        static_cast<AMessage *>(
422bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                            item.u.refValue)->debugString(
423bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                                indent + strlen(item.mName) + 14).c_str());
424bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
425078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber            case kTypeRect:
426078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                tmp = StringPrintf(
427078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        "Rect %s(%d, %d, %d, %d)",
428078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.mName,
429078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mLeft,
430078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mTop,
431078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mRight,
432078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mBottom);
433078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                break;
434bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            default:
435bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                TRESPASS();
436bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        }
437bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
438bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        appendIndent(&s, indent);
439bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append("  ");
440bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append(tmp);
441bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append("\n");
442bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
443bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
444bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    appendIndent(&s, indent);
445bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append("}");
446bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
447bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    return s;
448bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
449bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
45014acc736e336cbd6026df781d4f411e908831815Andreas Huber// static
45114acc736e336cbd6026df781d4f411e908831815Andreas Hubersp<AMessage> AMessage::FromParcel(const Parcel &parcel) {
45214acc736e336cbd6026df781d4f411e908831815Andreas Huber    int32_t what = parcel.readInt32();
45314acc736e336cbd6026df781d4f411e908831815Andreas Huber    sp<AMessage> msg = new AMessage(what);
45414acc736e336cbd6026df781d4f411e908831815Andreas Huber
45514acc736e336cbd6026df781d4f411e908831815Andreas Huber    msg->mNumItems = static_cast<size_t>(parcel.readInt32());
45614acc736e336cbd6026df781d4f411e908831815Andreas Huber
45714acc736e336cbd6026df781d4f411e908831815Andreas Huber    for (size_t i = 0; i < msg->mNumItems; ++i) {
45814acc736e336cbd6026df781d4f411e908831815Andreas Huber        Item *item = &msg->mItems[i];
45914acc736e336cbd6026df781d4f411e908831815Andreas Huber
46014acc736e336cbd6026df781d4f411e908831815Andreas Huber        item->mName = AAtomizer::Atomize(parcel.readCString());
46114acc736e336cbd6026df781d4f411e908831815Andreas Huber        item->mType = static_cast<Type>(parcel.readInt32());
46214acc736e336cbd6026df781d4f411e908831815Andreas Huber
46314acc736e336cbd6026df781d4f411e908831815Andreas Huber        switch (item->mType) {
46414acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt32:
46514acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
46614acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.int32Value = parcel.readInt32();
46714acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
46814acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
46914acc736e336cbd6026df781d4f411e908831815Andreas Huber
47014acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt64:
47114acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
47214acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.int64Value = parcel.readInt64();
47314acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
47414acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
47514acc736e336cbd6026df781d4f411e908831815Andreas Huber
47614acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeSize:
47714acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
47814acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.sizeValue = static_cast<size_t>(parcel.readInt32());
47914acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
48014acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
48114acc736e336cbd6026df781d4f411e908831815Andreas Huber
48214acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeFloat:
48314acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
48414acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.floatValue = parcel.readFloat();
48514acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
48614acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
48714acc736e336cbd6026df781d4f411e908831815Andreas Huber
48814acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeDouble:
48914acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
49014acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.doubleValue = parcel.readDouble();
49114acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
49214acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
49314acc736e336cbd6026df781d4f411e908831815Andreas Huber
49414acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeString:
49514acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
49614acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.stringValue = new AString(parcel.readCString());
49714acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
49814acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
49914acc736e336cbd6026df781d4f411e908831815Andreas Huber
50014acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeMessage:
50114acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
50214acc736e336cbd6026df781d4f411e908831815Andreas Huber                sp<AMessage> subMsg = AMessage::FromParcel(parcel);
50314acc736e336cbd6026df781d4f411e908831815Andreas Huber                subMsg->incStrong(msg.get());
50414acc736e336cbd6026df781d4f411e908831815Andreas Huber
50514acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.refValue = subMsg.get();
50614acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
50714acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
50814acc736e336cbd6026df781d4f411e908831815Andreas Huber
50914acc736e336cbd6026df781d4f411e908831815Andreas Huber            default:
51014acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
51129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("This type of object cannot cross process boundaries.");
51214acc736e336cbd6026df781d4f411e908831815Andreas Huber                TRESPASS();
51314acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
51414acc736e336cbd6026df781d4f411e908831815Andreas Huber        }
51514acc736e336cbd6026df781d4f411e908831815Andreas Huber    }
51614acc736e336cbd6026df781d4f411e908831815Andreas Huber
51714acc736e336cbd6026df781d4f411e908831815Andreas Huber    return msg;
51814acc736e336cbd6026df781d4f411e908831815Andreas Huber}
51914acc736e336cbd6026df781d4f411e908831815Andreas Huber
52014acc736e336cbd6026df781d4f411e908831815Andreas Hubervoid AMessage::writeToParcel(Parcel *parcel) const {
52114acc736e336cbd6026df781d4f411e908831815Andreas Huber    parcel->writeInt32(static_cast<int32_t>(mWhat));
52214acc736e336cbd6026df781d4f411e908831815Andreas Huber    parcel->writeInt32(static_cast<int32_t>(mNumItems));
52314acc736e336cbd6026df781d4f411e908831815Andreas Huber
52414acc736e336cbd6026df781d4f411e908831815Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
52514acc736e336cbd6026df781d4f411e908831815Andreas Huber        const Item &item = mItems[i];
52614acc736e336cbd6026df781d4f411e908831815Andreas Huber
52714acc736e336cbd6026df781d4f411e908831815Andreas Huber        parcel->writeCString(item.mName);
52814acc736e336cbd6026df781d4f411e908831815Andreas Huber        parcel->writeInt32(static_cast<int32_t>(item.mType));
52914acc736e336cbd6026df781d4f411e908831815Andreas Huber
53014acc736e336cbd6026df781d4f411e908831815Andreas Huber        switch (item.mType) {
53114acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt32:
53214acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
53314acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeInt32(item.u.int32Value);
53414acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
53514acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
53614acc736e336cbd6026df781d4f411e908831815Andreas Huber
53714acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt64:
53814acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
53914acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeInt64(item.u.int64Value);
54014acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
54114acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
54214acc736e336cbd6026df781d4f411e908831815Andreas Huber
54314acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeSize:
54414acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
54514acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeInt32(static_cast<int32_t>(item.u.sizeValue));
54614acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
54714acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
54814acc736e336cbd6026df781d4f411e908831815Andreas Huber
54914acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeFloat:
55014acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
55114acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeFloat(item.u.floatValue);
55214acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
55314acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
55414acc736e336cbd6026df781d4f411e908831815Andreas Huber
55514acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeDouble:
55614acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
55714acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeDouble(item.u.doubleValue);
55814acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
55914acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
56014acc736e336cbd6026df781d4f411e908831815Andreas Huber
56114acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeString:
56214acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
56314acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeCString(item.u.stringValue->c_str());
56414acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
56514acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
56614acc736e336cbd6026df781d4f411e908831815Andreas Huber
56714acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeMessage:
56814acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
56914acc736e336cbd6026df781d4f411e908831815Andreas Huber                static_cast<AMessage *>(item.u.refValue)->writeToParcel(parcel);
57014acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
57114acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
57214acc736e336cbd6026df781d4f411e908831815Andreas Huber
57314acc736e336cbd6026df781d4f411e908831815Andreas Huber            default:
57414acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
57529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("This type of object cannot cross process boundaries.");
57614acc736e336cbd6026df781d4f411e908831815Andreas Huber                TRESPASS();
57714acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
57814acc736e336cbd6026df781d4f411e908831815Andreas Huber        }
57914acc736e336cbd6026df781d4f411e908831815Andreas Huber    }
58014acc736e336cbd6026df781d4f411e908831815Andreas Huber}
58114acc736e336cbd6026df781d4f411e908831815Andreas Huber
5825778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t AMessage::countEntries() const {
5835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return mNumItems;
5845778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5865778822d86b0337407514b9372562b86edfa91cdAndreas Huberconst char *AMessage::getEntryNameAt(size_t index, Type *type) const {
5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index >= mNumItems) {
5885778822d86b0337407514b9372562b86edfa91cdAndreas Huber        *type = kTypeInt32;
5895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5905778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return NULL;
5915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
5925778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5935778822d86b0337407514b9372562b86edfa91cdAndreas Huber    *type = mItems[index].mType;
5945778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5955778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return mItems[index].mName;
5965778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
5975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
59872961230a5890071bcca436eb5630172ce84ec41Andreas Huber}  // namespace android
599