AMessage.cpp revision 2d8bedd05437b6fccdbc6bf70f673ffd86744d59
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>
2814acc736e336cbd6026df781d4f411e908831815Andreas Huber
2972961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android {
3072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
315df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberextern ALooperRoster gLooperRoster;
325df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
3372961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::AMessage(uint32_t what, ALooper::handler_id target)
3472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    : mWhat(what),
3572961230a5890071bcca436eb5630172ce84ec41Andreas Huber      mTarget(target),
3672961230a5890071bcca436eb5630172ce84ec41Andreas Huber      mNumItems(0) {
3772961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
3872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3972961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::~AMessage() {
4072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    clear();
4172961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
4272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4372961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setWhat(uint32_t what) {
4472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mWhat = what;
4572961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
4672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4772961230a5890071bcca436eb5630172ce84ec41Andreas Huberuint32_t AMessage::what() const {
4872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return mWhat;
4972961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
5072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setTarget(ALooper::handler_id handlerID) {
5272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mTarget = handlerID;
5372961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
5472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5572961230a5890071bcca436eb5630172ce84ec41Andreas HuberALooper::handler_id AMessage::target() const {
5672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return mTarget;
5772961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
5872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::clear() {
6072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        Item *item = &mItems[i];
6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        freeItem(item);
6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mNumItems = 0;
6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
6772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::freeItem(Item *item) {
6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    switch (item->mType) {
6972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeString:
7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        {
7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber            delete item->u.stringValue;
7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
7572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeObject:
7672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeMessage:
7772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        {
7872961230a5890071bcca436eb5630172ce84ec41Andreas Huber            if (item->u.refValue != NULL) {
7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber                item->u.refValue->decStrong(this);
8072961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
8172961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
8472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        default:
8572961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
8772961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
8872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
8972961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::Item *AMessage::allocateItem(const char *name) {
9072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    name = AAtomizer::Atomize(name);
9172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    size_t i = 0;
9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    while (i < mNumItems && mItems[i].mName != name) {
9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        ++i;
9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item;
9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (i < mNumItems) {
10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        item = &mItems[i];
10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        freeItem(item);
10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    } else {
10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        CHECK(mNumItems < kMaxNumItems);
10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        i = mNumItems++;
10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        item = &mItems[i];
10672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
10772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        item->mName = name;
10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
10972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
11072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return item;
11172961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
11272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
11372961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst AMessage::Item *AMessage::findItem(
11472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const char *name, Type type) const {
11572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    name = AAtomizer::Atomize(name);
11672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const Item *item = &mItems[i];
11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
12072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        if (item->mName == name) {
12172961230a5890071bcca436eb5630172ce84ec41Andreas Huber            return item->mType == type ? item : NULL;
12272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
12372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
12472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
12572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return NULL;
12672961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
12772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
12872961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define BASIC_TYPE(NAME,FIELDNAME,TYPENAME)                             \
12972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::set##NAME(const char *name, TYPENAME value) {            \
13072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);                                    \
13172961230a5890071bcca436eb5630172ce84ec41Andreas Huber                                                                        \
13272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kType##NAME;                                          \
13372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.FIELDNAME = value;                                          \
13472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}                                                                       \
13572961230a5890071bcca436eb5630172ce84ec41Andreas Huber                                                                        \
13672961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::find##NAME(const char *name, TYPENAME *value) const {    \
13772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kType##NAME);                     \
13872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {                                                         \
13972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *value = item->u.FIELDNAME;                                     \
14072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;                                                    \
14172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }                                                                   \
14272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;                                                       \
14372961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
14472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
14572961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int32,int32Value,int32_t)
14672961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int64,int64Value,int64_t)
14772961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Size,sizeValue,size_t)
14872961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Float,floatValue,float)
14972961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Double,doubleValue,double)
15072961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Pointer,ptrValue,void *)
15172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
15272961230a5890071bcca436eb5630172ce84ec41Andreas Huber#undef BASIC_TYPE
15372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
15472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setString(
15572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const char *name, const char *s, ssize_t len) {
15672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
15772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kTypeString;
15872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.stringValue = new AString(s, len < 0 ? strlen(s) : len);
15972961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
16072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1612d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObjectInternal(
1622d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        const char *name, const sp<RefBase> &obj, Type type) {
16372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
1642d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    item->mType = type;
16572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
16672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (obj != NULL) { obj->incStrong(this); }
16772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.refValue = obj.get();
16872961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
16972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1702d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObject(const char *name, const sp<RefBase> &obj) {
1712d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    setObjectInternal(name, obj, kTypeObject);
1722d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber}
1732d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber
1742d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setBuffer(const char *name, const sp<ABuffer> &buffer) {
1752d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    setObjectInternal(name, sp<RefBase>(buffer), kTypeBuffer);
1762d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber}
1772d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber
17872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setMessage(const char *name, const sp<AMessage> &obj) {
17972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
18072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kTypeMessage;
18172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
18272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (obj != NULL) { obj->incStrong(this); }
18372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.refValue = obj.get();
18472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
18572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
18631e2508c75018145a8238925ff1a08cbde4e799aAndreas Hubervoid AMessage::setRect(
18731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        const char *name,
18831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        int32_t left, int32_t top, int32_t right, int32_t bottom) {
18931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    Item *item = allocateItem(name);
19031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->mType = kTypeRect;
19131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
19231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mLeft = left;
19331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mTop = top;
19431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mRight = right;
19531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    item->u.rectValue.mBottom = bottom;
19631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber}
19731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
19872961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findString(const char *name, AString *value) const {
19972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeString);
20072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
20172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *value = *item->u.stringValue;
20272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
20472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
20572961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
20672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
20772961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findObject(const char *name, sp<RefBase> *obj) const {
20872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeObject);
20972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *obj = item->u.refValue;
21172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
21272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
21372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
21472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
21572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
2162d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huberbool AMessage::findBuffer(const char *name, sp<ABuffer> *buf) const {
2172d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    const Item *item = findItem(name, kTypeBuffer);
2182d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    if (item) {
2192d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        *buf = (ABuffer *)(item->u.refValue);
2202d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        return true;
2212d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    }
2222d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    return false;
2232d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber}
2242d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber
22572961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findMessage(const char *name, sp<AMessage> *obj) const {
22672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeMessage);
22772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
22872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *obj = static_cast<AMessage *>(item->u.refValue);
22972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
23072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
23172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
23272961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
23372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
23431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huberbool AMessage::findRect(
23531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        const char *name,
23631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const {
23731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    const Item *item = findItem(name, kTypeRect);
23831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    if (item == NULL) {
23931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        return false;
24031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    }
24131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
24231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *left = item->u.rectValue.mLeft;
24331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *top = item->u.rectValue.mTop;
24431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *right = item->u.rectValue.mRight;
24531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    *bottom = item->u.rectValue.mBottom;
24631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
24731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    return true;
24831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber}
24931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
25072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::post(int64_t delayUs) {
25172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    gLooperRoster.postMessage(this, delayUs);
25272961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
25372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
2545df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberstatus_t AMessage::postAndAwaitResponse(sp<AMessage> *response) {
2555df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    return gLooperRoster.postAndAwaitResponse(this, response);
2565df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber}
2575df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
2585df775d2f509c76e76a46615fca83dba95299f6eAndreas Hubervoid AMessage::postReply(uint32_t replyID) {
2595df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    gLooperRoster.postReply(replyID, this);
2605df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber}
2615df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
2625df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberbool AMessage::senderAwaitsResponse(uint32_t *replyID) const {
2635df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    int32_t tmp;
2645df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    bool found = findInt32("replyID", &tmp);
2655df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
2665df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    if (!found) {
2675df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber        return false;
2685df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    }
2695df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
2705df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    *replyID = static_cast<uint32_t>(tmp);
2715df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
2725df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    return true;
2735df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber}
2745df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
27572961230a5890071bcca436eb5630172ce84ec41Andreas Hubersp<AMessage> AMessage::dup() const {
27672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    sp<AMessage> msg = new AMessage(mWhat, mTarget);
27772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    msg->mNumItems = mNumItems;
27872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
27972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
28072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const Item *from = &mItems[i];
28172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        Item *to = &msg->mItems[i];
28272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
28372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        to->mName = from->mName;
28472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        to->mType = from->mType;
28572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
28672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        switch (from->mType) {
28772961230a5890071bcca436eb5630172ce84ec41Andreas Huber            case kTypeString:
28872961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
28972961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.stringValue =
29072961230a5890071bcca436eb5630172ce84ec41Andreas Huber                    new AString(*from->u.stringValue);
29172961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
29272961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
29372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
29472961230a5890071bcca436eb5630172ce84ec41Andreas Huber            case kTypeObject:
29572961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
29672961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.refValue = from->u.refValue;
29772961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.refValue->incStrong(msg.get());
29872961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
29972961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
30072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3012c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            case kTypeMessage:
3022c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            {
3032c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                sp<AMessage> copy =
3042c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                    static_cast<AMessage *>(from->u.refValue)->dup();
3052c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
3062c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                to->u.refValue = copy.get();
3072c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                to->u.refValue->incStrong(msg.get());
3082c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                break;
3092c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            }
3102c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
31172961230a5890071bcca436eb5630172ce84ec41Andreas Huber            default:
31272961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
31372961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u = from->u;
31472961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
31572961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
31672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
31772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
31872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
31972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return msg;
32072961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
32172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
322bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic void appendIndent(AString *s, int32_t indent) {
323bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    static const char kWhitespace[] =
324bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        "                                        "
325bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        "                                        ";
326bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
327bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    CHECK_LT((size_t)indent, sizeof(kWhitespace));
328bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
329bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s->append(kWhitespace, indent);
330bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
331bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
332bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic bool isFourcc(uint32_t what) {
333bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    return isprint(what & 0xff)
334bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 8) & 0xff)
335bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 16) & 0xff)
336bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 24) & 0xff);
337bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
338bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
339bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas HuberAString AMessage::debugString(int32_t indent) const {
340bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    AString s = "AMessage(what = ";
341bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
342bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    AString tmp;
343bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    if (isFourcc(mWhat)) {
344bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        tmp = StringPrintf(
345bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                "'%c%c%c%c'",
346bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)(mWhat >> 24),
347bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)((mWhat >> 16) & 0xff),
348bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)((mWhat >> 8) & 0xff),
349bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)(mWhat & 0xff));
350bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    } else {
351bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        tmp = StringPrintf("0x%08x", mWhat);
352bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
353bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append(tmp);
354bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
355bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    if (mTarget != 0) {
356bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        tmp = StringPrintf(", target = %d", mTarget);
357bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append(tmp);
358bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
359bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append(") = {\n");
360bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
361bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
362bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        const Item &item = mItems[i];
363bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
364bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        switch (item.mType) {
365bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeInt32:
366bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
367bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "int32_t %s = %d", item.mName, item.u.int32Value);
368bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
369bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeInt64:
370bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
371bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "int64_t %s = %lld", item.mName, item.u.int64Value);
372bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
373bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeSize:
374bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
375bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "size_t %s = %d", item.mName, item.u.sizeValue);
376bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
377bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeFloat:
378bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
379bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "float %s = %f", item.mName, item.u.floatValue);
380bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
381bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeDouble:
382bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
383bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "double %s = %f", item.mName, item.u.doubleValue);
384bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
385bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypePointer:
386bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
387bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "void *%s = %p", item.mName, item.u.ptrValue);
388bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
389bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeString:
390bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
391bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "string %s = \"%s\"",
392bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.mName,
393bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.u.stringValue->c_str());
394bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
395bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeObject:
396bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
397bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "RefBase *%s = %p", item.mName, item.u.refValue);
398bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
399bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeMessage:
400bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
401bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "AMessage %s = %s",
402bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.mName,
403bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        static_cast<AMessage *>(
404bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                            item.u.refValue)->debugString(
405bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                                indent + strlen(item.mName) + 14).c_str());
406bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
407078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber            case kTypeRect:
408078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                tmp = StringPrintf(
409078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        "Rect %s(%d, %d, %d, %d)",
410078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.mName,
411078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mLeft,
412078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mTop,
413078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mRight,
414078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                        item.u.rectValue.mBottom);
415078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                break;
416bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            default:
417bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                TRESPASS();
418bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        }
419bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
420bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        appendIndent(&s, indent);
421bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append("  ");
422bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append(tmp);
423bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append("\n");
424bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
425bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
426bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    appendIndent(&s, indent);
427bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append("}");
428bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
429bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    return s;
430bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
431bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
43214acc736e336cbd6026df781d4f411e908831815Andreas Huber// static
43314acc736e336cbd6026df781d4f411e908831815Andreas Hubersp<AMessage> AMessage::FromParcel(const Parcel &parcel) {
43414acc736e336cbd6026df781d4f411e908831815Andreas Huber    int32_t what = parcel.readInt32();
43514acc736e336cbd6026df781d4f411e908831815Andreas Huber    sp<AMessage> msg = new AMessage(what);
43614acc736e336cbd6026df781d4f411e908831815Andreas Huber
43714acc736e336cbd6026df781d4f411e908831815Andreas Huber    msg->mNumItems = static_cast<size_t>(parcel.readInt32());
43814acc736e336cbd6026df781d4f411e908831815Andreas Huber
43914acc736e336cbd6026df781d4f411e908831815Andreas Huber    for (size_t i = 0; i < msg->mNumItems; ++i) {
44014acc736e336cbd6026df781d4f411e908831815Andreas Huber        Item *item = &msg->mItems[i];
44114acc736e336cbd6026df781d4f411e908831815Andreas Huber
44214acc736e336cbd6026df781d4f411e908831815Andreas Huber        item->mName = AAtomizer::Atomize(parcel.readCString());
44314acc736e336cbd6026df781d4f411e908831815Andreas Huber        item->mType = static_cast<Type>(parcel.readInt32());
44414acc736e336cbd6026df781d4f411e908831815Andreas Huber
44514acc736e336cbd6026df781d4f411e908831815Andreas Huber        switch (item->mType) {
44614acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt32:
44714acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
44814acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.int32Value = parcel.readInt32();
44914acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
45014acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
45114acc736e336cbd6026df781d4f411e908831815Andreas Huber
45214acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt64:
45314acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
45414acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.int64Value = parcel.readInt64();
45514acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
45614acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
45714acc736e336cbd6026df781d4f411e908831815Andreas Huber
45814acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeSize:
45914acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
46014acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.sizeValue = static_cast<size_t>(parcel.readInt32());
46114acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
46214acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
46314acc736e336cbd6026df781d4f411e908831815Andreas Huber
46414acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeFloat:
46514acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
46614acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.floatValue = parcel.readFloat();
46714acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
46814acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
46914acc736e336cbd6026df781d4f411e908831815Andreas Huber
47014acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeDouble:
47114acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
47214acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.doubleValue = parcel.readDouble();
47314acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
47414acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
47514acc736e336cbd6026df781d4f411e908831815Andreas Huber
47614acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeString:
47714acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
47814acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.stringValue = new AString(parcel.readCString());
47914acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
48014acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
48114acc736e336cbd6026df781d4f411e908831815Andreas Huber
48214acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeMessage:
48314acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
48414acc736e336cbd6026df781d4f411e908831815Andreas Huber                sp<AMessage> subMsg = AMessage::FromParcel(parcel);
48514acc736e336cbd6026df781d4f411e908831815Andreas Huber                subMsg->incStrong(msg.get());
48614acc736e336cbd6026df781d4f411e908831815Andreas Huber
48714acc736e336cbd6026df781d4f411e908831815Andreas Huber                item->u.refValue = subMsg.get();
48814acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
48914acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
49014acc736e336cbd6026df781d4f411e908831815Andreas Huber
49114acc736e336cbd6026df781d4f411e908831815Andreas Huber            default:
49214acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
49329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("This type of object cannot cross process boundaries.");
49414acc736e336cbd6026df781d4f411e908831815Andreas Huber                TRESPASS();
49514acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
49614acc736e336cbd6026df781d4f411e908831815Andreas Huber        }
49714acc736e336cbd6026df781d4f411e908831815Andreas Huber    }
49814acc736e336cbd6026df781d4f411e908831815Andreas Huber
49914acc736e336cbd6026df781d4f411e908831815Andreas Huber    return msg;
50014acc736e336cbd6026df781d4f411e908831815Andreas Huber}
50114acc736e336cbd6026df781d4f411e908831815Andreas Huber
50214acc736e336cbd6026df781d4f411e908831815Andreas Hubervoid AMessage::writeToParcel(Parcel *parcel) const {
50314acc736e336cbd6026df781d4f411e908831815Andreas Huber    parcel->writeInt32(static_cast<int32_t>(mWhat));
50414acc736e336cbd6026df781d4f411e908831815Andreas Huber    parcel->writeInt32(static_cast<int32_t>(mNumItems));
50514acc736e336cbd6026df781d4f411e908831815Andreas Huber
50614acc736e336cbd6026df781d4f411e908831815Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
50714acc736e336cbd6026df781d4f411e908831815Andreas Huber        const Item &item = mItems[i];
50814acc736e336cbd6026df781d4f411e908831815Andreas Huber
50914acc736e336cbd6026df781d4f411e908831815Andreas Huber        parcel->writeCString(item.mName);
51014acc736e336cbd6026df781d4f411e908831815Andreas Huber        parcel->writeInt32(static_cast<int32_t>(item.mType));
51114acc736e336cbd6026df781d4f411e908831815Andreas Huber
51214acc736e336cbd6026df781d4f411e908831815Andreas Huber        switch (item.mType) {
51314acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt32:
51414acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
51514acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeInt32(item.u.int32Value);
51614acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
51714acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
51814acc736e336cbd6026df781d4f411e908831815Andreas Huber
51914acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeInt64:
52014acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
52114acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeInt64(item.u.int64Value);
52214acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
52314acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
52414acc736e336cbd6026df781d4f411e908831815Andreas Huber
52514acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeSize:
52614acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
52714acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeInt32(static_cast<int32_t>(item.u.sizeValue));
52814acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
52914acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
53014acc736e336cbd6026df781d4f411e908831815Andreas Huber
53114acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeFloat:
53214acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
53314acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeFloat(item.u.floatValue);
53414acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
53514acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
53614acc736e336cbd6026df781d4f411e908831815Andreas Huber
53714acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeDouble:
53814acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
53914acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeDouble(item.u.doubleValue);
54014acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
54114acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
54214acc736e336cbd6026df781d4f411e908831815Andreas Huber
54314acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeString:
54414acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
54514acc736e336cbd6026df781d4f411e908831815Andreas Huber                parcel->writeCString(item.u.stringValue->c_str());
54614acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
54714acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
54814acc736e336cbd6026df781d4f411e908831815Andreas Huber
54914acc736e336cbd6026df781d4f411e908831815Andreas Huber            case kTypeMessage:
55014acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
55114acc736e336cbd6026df781d4f411e908831815Andreas Huber                static_cast<AMessage *>(item.u.refValue)->writeToParcel(parcel);
55214acc736e336cbd6026df781d4f411e908831815Andreas Huber                break;
55314acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
55414acc736e336cbd6026df781d4f411e908831815Andreas Huber
55514acc736e336cbd6026df781d4f411e908831815Andreas Huber            default:
55614acc736e336cbd6026df781d4f411e908831815Andreas Huber            {
55729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block                ALOGE("This type of object cannot cross process boundaries.");
55814acc736e336cbd6026df781d4f411e908831815Andreas Huber                TRESPASS();
55914acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
56014acc736e336cbd6026df781d4f411e908831815Andreas Huber        }
56114acc736e336cbd6026df781d4f411e908831815Andreas Huber    }
56214acc736e336cbd6026df781d4f411e908831815Andreas Huber}
56314acc736e336cbd6026df781d4f411e908831815Andreas Huber
5645778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t AMessage::countEntries() const {
5655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return mNumItems;
5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5685778822d86b0337407514b9372562b86edfa91cdAndreas Huberconst char *AMessage::getEntryNameAt(size_t index, Type *type) const {
5695778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index >= mNumItems) {
5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber        *type = kTypeInt32;
5715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5725778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return NULL;
5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber    *type = mItems[index].mType;
5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5775778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return mItems[index].mName;
5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
58072961230a5890071bcca436eb5630172ce84ec41Andreas Huber}  // namespace android
581