AMessage.cpp revision 078cfcf7cce9185ec7559910d08b0bc02bfc88a3
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"
2272961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ADebug.h"
2372961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ALooperRoster.h"
2472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AString.h"
2572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
2614acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <binder/Parcel.h>
2714acc736e336cbd6026df781d4f411e908831815Andreas Huber
2872961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android {
2972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
305df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberextern ALooperRoster gLooperRoster;
315df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
3272961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::AMessage(uint32_t what, ALooper::handler_id target)
3372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    : mWhat(what),
3472961230a5890071bcca436eb5630172ce84ec41Andreas Huber      mTarget(target),
3572961230a5890071bcca436eb5630172ce84ec41Andreas Huber      mNumItems(0) {
3672961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
3772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3872961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::~AMessage() {
3972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    clear();
4072961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
4172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4272961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setWhat(uint32_t what) {
4372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mWhat = what;
4472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
4572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4672961230a5890071bcca436eb5630172ce84ec41Andreas Huberuint32_t AMessage::what() const {
4772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return mWhat;
4872961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
4972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setTarget(ALooper::handler_id handlerID) {
5172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mTarget = handlerID;
5272961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
5372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5472961230a5890071bcca436eb5630172ce84ec41Andreas HuberALooper::handler_id AMessage::target() const {
5572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return mTarget;
5672961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
5772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::clear() {
5972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
6072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        Item *item = &mItems[i];
6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        freeItem(item);
6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mNumItems = 0;
6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
6672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::freeItem(Item *item) {
6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    switch (item->mType) {
6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeString:
6972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        {
7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber            delete item->u.stringValue;
7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeObject:
7572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeMessage:
7672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        {
7772961230a5890071bcca436eb5630172ce84ec41Andreas Huber            if (item->u.refValue != NULL) {
7872961230a5890071bcca436eb5630172ce84ec41Andreas Huber                item->u.refValue->decStrong(this);
7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
8072961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
8172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        default:
8472961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
8572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
8772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
8872961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::Item *AMessage::allocateItem(const char *name) {
8972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    name = AAtomizer::Atomize(name);
9072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
9172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    size_t i = 0;
9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    while (i < mNumItems && mItems[i].mName != name) {
9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        ++i;
9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item;
9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (i < mNumItems) {
9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        item = &mItems[i];
10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        freeItem(item);
10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    } else {
10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        CHECK(mNumItems < kMaxNumItems);
10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        i = mNumItems++;
10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        item = &mItems[i];
10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
10672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        item->mName = name;
10772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
10972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return item;
11072961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
11172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
11272961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst AMessage::Item *AMessage::findItem(
11372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const char *name, Type type) const {
11472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    name = AAtomizer::Atomize(name);
11572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
11672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const Item *item = &mItems[i];
11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        if (item->mName == name) {
12072961230a5890071bcca436eb5630172ce84ec41Andreas Huber            return item->mType == type ? item : NULL;
12172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
12272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
12372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
12472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return NULL;
12572961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
12672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
12772961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define BASIC_TYPE(NAME,FIELDNAME,TYPENAME)                             \
12872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::set##NAME(const char *name, TYPENAME value) {            \
12972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);                                    \
13072961230a5890071bcca436eb5630172ce84ec41Andreas Huber                                                                        \
13172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kType##NAME;                                          \
13272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.FIELDNAME = value;                                          \
13372961230a5890071bcca436eb5630172ce84ec41Andreas Huber}                                                                       \
13472961230a5890071bcca436eb5630172ce84ec41Andreas Huber                                                                        \
13572961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::find##NAME(const char *name, TYPENAME *value) const {    \
13672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kType##NAME);                     \
13772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {                                                         \
13872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *value = item->u.FIELDNAME;                                     \
13972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;                                                    \
14072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }                                                                   \
14172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;                                                       \
14272961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
14372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
14472961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int32,int32Value,int32_t)
14572961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int64,int64Value,int64_t)
14672961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Size,sizeValue,size_t)
14772961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Float,floatValue,float)
14872961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Double,doubleValue,double)
14972961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Pointer,ptrValue,void *)
15072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
15172961230a5890071bcca436eb5630172ce84ec41Andreas Huber#undef BASIC_TYPE
15272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
15372961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setString(
15472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const char *name, const char *s, ssize_t len) {
15572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
15672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kTypeString;
15772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.stringValue = new AString(s, len < 0 ? strlen(s) : len);
15872961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
15972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
16072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setObject(const char *name, const sp<RefBase> &obj) {
16172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
16272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kTypeObject;
16372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
16472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (obj != NULL) { obj->incStrong(this); }
16572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.refValue = obj.get();
16672961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
16772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
16872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setMessage(const char *name, const sp<AMessage> &obj) {
16972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
17072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kTypeMessage;
17172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
17272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (obj != NULL) { obj->incStrong(this); }
17372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.refValue = obj.get();
17472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
17572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
17631e2508c75018145a8238925ff1a08cbde4e799aAndreas Hubervoid AMessage::setRect(
17731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        const char *name,
17831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        int32_t left, int32_t top, int32_t right, int32_t bottom) {
17931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    Item *item = allocateItem(name);
18031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->mType = kTypeRect;
18131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
18231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mLeft = left;
18331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mTop = top;
18431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mRight = right;
18531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mBottom = bottom;
18631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber}
18731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
18872961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findString(const char *name, AString *value) const {
18972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeString);
19072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
19172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *value = *item->u.stringValue;
19272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
19372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
19472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
19572961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
19672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
19772961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findObject(const char *name, sp<RefBase> *obj) const {
19872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeObject);
19972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
20072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *obj = item->u.refValue;
20172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
20272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
20472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
20572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
20672961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findMessage(const char *name, sp<AMessage> *obj) const {
20772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeMessage);
20872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
20972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *obj = static_cast<AMessage *>(item->u.refValue);
21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
21172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
21272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
21372961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
21472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
21531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huberbool AMessage::findRect(
21631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        const char *name,
21731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const {
21831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    const Item *item = findItem(name, kTypeRect);
21931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    if (item == NULL) {
22031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        return false;
22131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    }
22231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
22331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *left = item->u.rectValue.mLeft;
22431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *top = item->u.rectValue.mTop;
22531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *right = item->u.rectValue.mRight;
22631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *bottom = item->u.rectValue.mBottom;
22731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
22831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    return true;
22931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber}
23031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
23172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::post(int64_t delayUs) {
23272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    gLooperRoster.postMessage(this, delayUs);
23372961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
23472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
2355df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberstatus_t AMessage::postAndAwaitResponse(sp<AMessage> *response) {
2365df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    return gLooperRoster.postAndAwaitResponse(this, response);
2375df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber}
2385df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
2395df775d2f509c76e76a46615fca83dba95299f6eAndreas Hubervoid AMessage::postReply(uint32_t replyID) {
2405df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    gLooperRoster.postReply(replyID, this);
2415df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber}
2425df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
2435df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberbool AMessage::senderAwaitsResponse(uint32_t *replyID) const {
2445df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    int32_t tmp;
2455df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    bool found = findInt32("replyID", &tmp);
2465df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
2475df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    if (!found) {
2485df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber        return false;
2495df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    }
2505df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
2515df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    *replyID = static_cast<uint32_t>(tmp);
2525df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
2535df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    return true;
2545df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber}
2555df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
25672961230a5890071bcca436eb5630172ce84ec41Andreas Hubersp<AMessage> AMessage::dup() const {
25772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    sp<AMessage> msg = new AMessage(mWhat, mTarget);
25872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    msg->mNumItems = mNumItems;
25972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
26072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
26172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const Item *from = &mItems[i];
26272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        Item *to = &msg->mItems[i];
26372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
26472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        to->mName = from->mName;
26572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        to->mType = from->mType;
26672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
26772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        switch (from->mType) {
26872961230a5890071bcca436eb5630172ce84ec41Andreas Huber            case kTypeString:
26972961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
27072961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.stringValue =
27172961230a5890071bcca436eb5630172ce84ec41Andreas Huber                    new AString(*from->u.stringValue);
27272961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
27372961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
27472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
27572961230a5890071bcca436eb5630172ce84ec41Andreas Huber            case kTypeObject:
27672961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
27772961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.refValue = from->u.refValue;
27872961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.refValue->incStrong(msg.get());
27972961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
28072961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
28172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
2822c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            case kTypeMessage:
2832c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            {
2842c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                sp<AMessage> copy =
2852c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                    static_cast<AMessage *>(from->u.refValue)->dup();
2862c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
2872c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                to->u.refValue = copy.get();
2882c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                to->u.refValue->incStrong(msg.get());
2892c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                break;
2902c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            }
2912c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
29272961230a5890071bcca436eb5630172ce84ec41Andreas Huber            default:
29372961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
29472961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u = from->u;
29572961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
29672961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
29772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
29872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
29972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
30072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return msg;
30172961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
30272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
303bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic void appendIndent(AString *s, int32_t indent) {
304bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    static const char kWhitespace[] =
305bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        "                                        "
306bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        "                                        ";
307bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
308bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    CHECK_LT((size_t)indent, sizeof(kWhitespace));
309bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
310bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s->append(kWhitespace, indent);
311bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
312bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
313bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic bool isFourcc(uint32_t what) {
314bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    return isprint(what & 0xff)
315bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 8) & 0xff)
316bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 16) & 0xff)
317bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 24) & 0xff);
318bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
319bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
320bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas HuberAString AMessage::debugString(int32_t indent) const {
321bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    AString s = "AMessage(what = ";
322bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
323bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    AString tmp;
324bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    if (isFourcc(mWhat)) {
325bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        tmp = StringPrintf(
326bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                "'%c%c%c%c'",
327bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)(mWhat >> 24),
328bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)((mWhat >> 16) & 0xff),
329bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)((mWhat >> 8) & 0xff),
330bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)(mWhat & 0xff));
331bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    } else {
332bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        tmp = StringPrintf("0x%08x", mWhat);
333bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
334bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append(tmp);
335bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
336bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    if (mTarget != 0) {
337bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        tmp = StringPrintf(", target = %d", mTarget);
338bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append(tmp);
339bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
340bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append(") = {\n");
341bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
342bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
343bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        const Item &item = mItems[i];
344bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
345bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        switch (item.mType) {
346bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeInt32:
347bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
348bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "int32_t %s = %d", item.mName, item.u.int32Value);
349bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
350bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeInt64:
351bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
352bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "int64_t %s = %lld", item.mName, item.u.int64Value);
353bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
354bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeSize:
355bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
356bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "size_t %s = %d", item.mName, item.u.sizeValue);
357bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
358bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeFloat:
359bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
360bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "float %s = %f", item.mName, item.u.floatValue);
361bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
362bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeDouble:
363bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
364bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "double %s = %f", item.mName, item.u.doubleValue);
365bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
366bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypePointer:
367bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
368bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "void *%s = %p", item.mName, item.u.ptrValue);
369bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
370bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeString:
371bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
372bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "string %s = \"%s\"",
373bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.mName,
374bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.u.stringValue->c_str());
375bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
376bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeObject:
377bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
378bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "RefBase *%s = %p", item.mName, item.u.refValue);
379bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
380bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeMessage:
381bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
382bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "AMessage %s = %s",
383bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.mName,
384bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        static_cast<AMessage *>(
385bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                            item.u.refValue)->debugString(
386bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                                indent + strlen(item.mName) + 14).c_str());
387bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
388078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber            case kTypeRect:
389078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                tmp = StringPrintf(
390078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        "Rect %s(%d, %d, %d, %d)",
391078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.mName,
392078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mLeft,
393078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mTop,
394078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mRight,
395078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mBottom);
396078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                break;
397bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            default:
398bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                TRESPASS();
399bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        }
400bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
401bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        appendIndent(&s, indent);
402bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append("  ");
403bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append(tmp);
404bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append("\n");
405bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
406bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
407bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    appendIndent(&s, indent);
408bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append("}");
409bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
410bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    return s;
411bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
412bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
41314acc736e336cbd6026df781d4f411e908831815Andreas Huber// static
41414acc736e336cbd6026df781d4f411e908831815Andreas Hubersp<AMessage> AMessage::FromParcel(const Parcel &parcel) {
41514acc736e336cbd6026df781d4f411e908831815Andreas Huber    int32_t what = parcel.readInt32();
41614acc736e336cbd6026df781d4f411e908831815Andreas Huber    sp<AMessage> msg = new AMessage(what);
41714acc736e336cbd6026df781d4f411e908831815Andreas Huber
41814acc736e336cbd6026df781d4f411e908831815Andreas Huber    msg->mNumItems = static_cast<size_t>(parcel.readInt32());
41914acc736e336cbd6026df781d4f411e908831815Andreas Huber
42014acc736e336cbd6026df781d4f411e908831815Andreas Huber    for (size_t i = 0; i < msg->mNumItems; ++i) {
42114acc736e336cbd6026df781d4f411e908831815Andreas Huber        Item *item = &msg->mItems[i];
42214acc736e336cbd6026df781d4f411e908831815Andreas Huber
42314acc736e336cbd6026df781d4f411e908831815Andreas Huber        item->mName = AAtomizer::Atomize(parcel.readCString());
42414acc736e336cbd6026df781d4f411e908831815Andreas Huber        item->mType = static_cast<Type>(parcel.readInt32());
42514acc736e336cbd6026df781d4f411e908831815Andreas Huber
42614acc736e336cbd6026df781d4f411e908831815Andreas Huber        switch (item->mType) {
42714acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt32:
42814acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
42914acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.int32Value = parcel.readInt32();
43014acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
43114acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
43214acc736e336cbd6026df781d4f411e908831815Andreas Huber
43314acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt64:
43414acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
43514acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.int64Value = parcel.readInt64();
43614acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
43714acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
43814acc736e336cbd6026df781d4f411e908831815Andreas Huber
43914acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeSize:
44014acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
44114acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.sizeValue = static_cast<size_t>(parcel.readInt32());
44214acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
44314acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
44414acc736e336cbd6026df781d4f411e908831815Andreas Huber
44514acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeFloat:
44614acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
44714acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.floatValue = parcel.readFloat();
44814acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
44914acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
45014acc736e336cbd6026df781d4f411e908831815Andreas Huber
45114acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeDouble:
45214acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
45314acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.doubleValue = parcel.readDouble();
45414acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
45514acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
45614acc736e336cbd6026df781d4f411e908831815Andreas Huber
45714acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeString:
45814acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
45914acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.stringValue = new AString(parcel.readCString());
46014acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
46114acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
46214acc736e336cbd6026df781d4f411e908831815Andreas Huber
46314acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeMessage:
46414acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
46514acc736e336cbd6026df781d4f411e908831815Andreas Huber                sp<AMessage> subMsg = AMessage::FromParcel(parcel);
46614acc736e336cbd6026df781d4f411e908831815Andreas Huber                subMsg->incStrong(msg.get());
46714acc736e336cbd6026df781d4f411e908831815Andreas Huber
46814acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.refValue = subMsg.get();
46914acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
47014acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
47114acc736e336cbd6026df781d4f411e908831815Andreas Huber
47214acc736e336cbd6026df781d4f411e908831815Andreas Huber            default:
47314acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
47414acc736e336cbd6026df781d4f411e908831815Andreas Huber                LOGE("This type of object cannot cross process boundaries.");
47514acc736e336cbd6026df781d4f411e908831815Andreas Huber                TRESPASS();
47614acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
47714acc736e336cbd6026df781d4f411e908831815Andreas Huber        }
47814acc736e336cbd6026df781d4f411e908831815Andreas Huber    }
47914acc736e336cbd6026df781d4f411e908831815Andreas Huber
48014acc736e336cbd6026df781d4f411e908831815Andreas Huber    return msg;
48114acc736e336cbd6026df781d4f411e908831815Andreas Huber}
48214acc736e336cbd6026df781d4f411e908831815Andreas Huber
48314acc736e336cbd6026df781d4f411e908831815Andreas Hubervoid AMessage::writeToParcel(Parcel *parcel) const {
48414acc736e336cbd6026df781d4f411e908831815Andreas Huber    parcel->writeInt32(static_cast<int32_t>(mWhat));
48514acc736e336cbd6026df781d4f411e908831815Andreas Huber    parcel->writeInt32(static_cast<int32_t>(mNumItems));
48614acc736e336cbd6026df781d4f411e908831815Andreas Huber
48714acc736e336cbd6026df781d4f411e908831815Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
48814acc736e336cbd6026df781d4f411e908831815Andreas Huber        const Item &item = mItems[i];
48914acc736e336cbd6026df781d4f411e908831815Andreas Huber
49014acc736e336cbd6026df781d4f411e908831815Andreas Huber        parcel->writeCString(item.mName);
49114acc736e336cbd6026df781d4f411e908831815Andreas Huber        parcel->writeInt32(static_cast<int32_t>(item.mType));
49214acc736e336cbd6026df781d4f411e908831815Andreas Huber
49314acc736e336cbd6026df781d4f411e908831815Andreas Huber        switch (item.mType) {
49414acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt32:
49514acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
49614acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeInt32(item.u.int32Value);
49714acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
49814acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
49914acc736e336cbd6026df781d4f411e908831815Andreas Huber
50014acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt64:
50114acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
50214acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeInt64(item.u.int64Value);
50314acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
50414acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
50514acc736e336cbd6026df781d4f411e908831815Andreas Huber
50614acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeSize:
50714acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
50814acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeInt32(static_cast<int32_t>(item.u.sizeValue));
50914acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
51014acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
51114acc736e336cbd6026df781d4f411e908831815Andreas Huber
51214acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeFloat:
51314acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
51414acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeFloat(item.u.floatValue);
51514acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
51614acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
51714acc736e336cbd6026df781d4f411e908831815Andreas Huber
51814acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeDouble:
51914acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
52014acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeDouble(item.u.doubleValue);
52114acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
52214acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
52314acc736e336cbd6026df781d4f411e908831815Andreas Huber
52414acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeString:
52514acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
52614acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeCString(item.u.stringValue->c_str());
52714acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
52814acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
52914acc736e336cbd6026df781d4f411e908831815Andreas Huber
53014acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeMessage:
53114acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
53214acc736e336cbd6026df781d4f411e908831815Andreas Huber                static_cast<AMessage *>(item.u.refValue)->writeToParcel(parcel);
53314acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
53414acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
53514acc736e336cbd6026df781d4f411e908831815Andreas Huber
53614acc736e336cbd6026df781d4f411e908831815Andreas Huber            default:
53714acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
53814acc736e336cbd6026df781d4f411e908831815Andreas Huber                LOGE("This type of object cannot cross process boundaries.");
53914acc736e336cbd6026df781d4f411e908831815Andreas Huber                TRESPASS();
54014acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
54114acc736e336cbd6026df781d4f411e908831815Andreas Huber        }
54214acc736e336cbd6026df781d4f411e908831815Andreas Huber    }
54314acc736e336cbd6026df781d4f411e908831815Andreas Huber}
54414acc736e336cbd6026df781d4f411e908831815Andreas Huber
54572961230a5890071bcca436eb5630172ce84ec41Andreas Huber}  // namespace android
546