17d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber/*
27d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * Copyright (C) 2010 The Android Open Source Project
37d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber *
47d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
57d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * you may not use this file except in compliance with the License.
67d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * You may obtain a copy of the License at
77d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber *
87d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
97d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber *
107d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * Unless required by applicable law or agreed to in writing, software
117d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
127d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * See the License for the specific language governing permissions and
147d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * limitations under the License.
157d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber */
167d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
177d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#include "AMessage.h"
187d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber#include <ctype.h>
2003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
217d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#include "AAtomizer.h"
227d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#include "ADebug.h"
237d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#include "ALooperRoster.h"
247d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#include "AString.h"
257d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
26ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber#include <binder/Parcel.h>
27ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
287d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubernamespace android {
297d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
30e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huberextern ALooperRoster gLooperRoster;
31e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber
327d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberAMessage::AMessage(uint32_t what, ALooper::handler_id target)
337d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    : mWhat(what),
347d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber      mTarget(target),
357d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber      mNumItems(0) {
367d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
377d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
387d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberAMessage::~AMessage() {
397d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    clear();
407d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
417d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
427d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setWhat(uint32_t what) {
437d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    mWhat = what;
447d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
457d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
467d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberuint32_t AMessage::what() const {
477d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return mWhat;
487d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
497d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
507d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setTarget(ALooper::handler_id handlerID) {
517d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    mTarget = handlerID;
527d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
537d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
547d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberALooper::handler_id AMessage::target() const {
557d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return mTarget;
567d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
577d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
587d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::clear() {
597d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
607d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        Item *item = &mItems[i];
617d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        freeItem(item);
627d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
637d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    mNumItems = 0;
647d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
657d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
667d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::freeItem(Item *item) {
677d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    switch (item->mType) {
687d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        case kTypeString:
697d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        {
707d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            delete item->u.stringValue;
717d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            break;
727d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        }
737d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
747d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        case kTypeObject:
757d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        case kTypeMessage:
767d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        {
777d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            if (item->u.refValue != NULL) {
787d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                item->u.refValue->decStrong(this);
797d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            }
807d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            break;
817d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        }
827d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
837d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        default:
847d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            break;
857d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
867d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
877d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
887d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberAMessage::Item *AMessage::allocateItem(const char *name) {
897d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    name = AAtomizer::Atomize(name);
907d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
917d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    size_t i = 0;
927d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    while (i < mNumItems && mItems[i].mName != name) {
937d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        ++i;
947d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
957d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
967d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    Item *item;
977d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
987d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    if (i < mNumItems) {
997d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        item = &mItems[i];
1007d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        freeItem(item);
1017d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    } else {
1027d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        CHECK(mNumItems < kMaxNumItems);
1037d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        i = mNumItems++;
1047d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        item = &mItems[i];
1057d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1067d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        item->mName = name;
1077d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
1087d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1097d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return item;
1107d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
1117d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1127d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberconst AMessage::Item *AMessage::findItem(
1137d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        const char *name, Type type) const {
1147d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    name = AAtomizer::Atomize(name);
1157d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1167d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
1177d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        const Item *item = &mItems[i];
1187d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1197d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        if (item->mName == name) {
1207d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            return item->mType == type ? item : NULL;
1217d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        }
1227d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
1237d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1247d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return NULL;
1257d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
1267d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1277d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#define BASIC_TYPE(NAME,FIELDNAME,TYPENAME)                             \
1287d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::set##NAME(const char *name, TYPENAME value) {            \
1297d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    Item *item = allocateItem(name);                                    \
1307d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                                                                        \
1317d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    item->mType = kType##NAME;                                          \
1327d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    item->u.FIELDNAME = value;                                          \
1337d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}                                                                       \
1347d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                                                                        \
1357d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberbool AMessage::find##NAME(const char *name, TYPENAME *value) const {    \
1367d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    const Item *item = findItem(name, kType##NAME);                     \
1377d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    if (item) {                                                         \
1387d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        *value = item->u.FIELDNAME;                                     \
1397d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        return true;                                                    \
1407d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }                                                                   \
1417d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return false;                                                       \
1427d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
1437d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1447d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Int32,int32Value,int32_t)
1457d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Int64,int64Value,int64_t)
1467d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Size,sizeValue,size_t)
1477d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Float,floatValue,float)
1487d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Double,doubleValue,double)
1497d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Pointer,ptrValue,void *)
1507d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1517d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#undef BASIC_TYPE
1527d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1537d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setString(
1547d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        const char *name, const char *s, ssize_t len) {
1557d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    Item *item = allocateItem(name);
1567d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    item->mType = kTypeString;
1577d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    item->u.stringValue = new AString(s, len < 0 ? strlen(s) : len);
1587d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
1597d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1607d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setObject(const char *name, const sp<RefBase> &obj) {
1617d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    Item *item = allocateItem(name);
1627d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    item->mType = kTypeObject;
1637d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1647d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    if (obj != NULL) { obj->incStrong(this); }
1657d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    item->u.refValue = obj.get();
1667d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
1677d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1687d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setMessage(const char *name, const sp<AMessage> &obj) {
1697d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    Item *item = allocateItem(name);
1707d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    item->mType = kTypeMessage;
1717d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1727d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    if (obj != NULL) { obj->incStrong(this); }
1737d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    item->u.refValue = obj.get();
1747d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
1757d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1767caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Hubervoid AMessage::setRect(
1777caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber        const char *name,
1787caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber        int32_t left, int32_t top, int32_t right, int32_t bottom) {
1797caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber    Item *item = allocateItem(name);
1807caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber    item->mType = kTypeRect;
1817caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber
1827caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber    item->u.rectValue.mLeft = left;
1837caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber    item->u.rectValue.mTop = top;
1847caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber    item->u.rectValue.mRight = right;
1857caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber    item->u.rectValue.mBottom = bottom;
1867caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber}
1877caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber
1887d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberbool AMessage::findString(const char *name, AString *value) const {
1897d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    const Item *item = findItem(name, kTypeString);
1907d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    if (item) {
1917d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        *value = *item->u.stringValue;
1927d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        return true;
1937d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
1947d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return false;
1957d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
1967d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1977d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberbool AMessage::findObject(const char *name, sp<RefBase> *obj) const {
1987d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    const Item *item = findItem(name, kTypeObject);
1997d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    if (item) {
2007d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        *obj = item->u.refValue;
2017d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        return true;
2027d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
2037d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return false;
2047d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
2057d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
2067d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberbool AMessage::findMessage(const char *name, sp<AMessage> *obj) const {
2077d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    const Item *item = findItem(name, kTypeMessage);
2087d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    if (item) {
2097d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        *obj = static_cast<AMessage *>(item->u.refValue);
2107d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        return true;
2117d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
2127d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return false;
2137d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
2147d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
2157caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huberbool AMessage::findRect(
2167caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber        const char *name,
2177caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber        int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const {
2187caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber    const Item *item = findItem(name, kTypeRect);
2197caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber    if (item == NULL) {
2207caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber        return false;
2217caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber    }
2227caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber
2237caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber    *left = item->u.rectValue.mLeft;
2247caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber    *top = item->u.rectValue.mTop;
2257caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber    *right = item->u.rectValue.mRight;
2267caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber    *bottom = item->u.rectValue.mBottom;
2277caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber
2287caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber    return true;
2297caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber}
2307caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber
2317d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::post(int64_t delayUs) {
2327d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    gLooperRoster.postMessage(this, delayUs);
2337d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
2347d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
235e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huberstatus_t AMessage::postAndAwaitResponse(sp<AMessage> *response) {
236e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber    return gLooperRoster.postAndAwaitResponse(this, response);
237e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber}
238e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber
239e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Hubervoid AMessage::postReply(uint32_t replyID) {
240e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber    gLooperRoster.postReply(replyID, this);
241e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber}
242e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber
243e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huberbool AMessage::senderAwaitsResponse(uint32_t *replyID) const {
244e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber    int32_t tmp;
245e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber    bool found = findInt32("replyID", &tmp);
246e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber
247e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber    if (!found) {
248e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber        return false;
249e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber    }
250e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber
251e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber    *replyID = static_cast<uint32_t>(tmp);
252e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber
253e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber    return true;
254e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber}
255e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber
2567d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubersp<AMessage> AMessage::dup() const {
2577d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    sp<AMessage> msg = new AMessage(mWhat, mTarget);
2587d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    msg->mNumItems = mNumItems;
2597d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
2607d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
2617d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        const Item *from = &mItems[i];
2627d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        Item *to = &msg->mItems[i];
2637d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
2647d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        to->mName = from->mName;
2657d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        to->mType = from->mType;
2667d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
2677d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        switch (from->mType) {
2687d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            case kTypeString:
2697d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            {
2707d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                to->u.stringValue =
2717d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                    new AString(*from->u.stringValue);
2727d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                break;
2737d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            }
2747d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
2757d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            case kTypeObject:
2767d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            {
2777d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                to->u.refValue = from->u.refValue;
2787d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                to->u.refValue->incStrong(msg.get());
2797d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                break;
2807d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            }
2817d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
282687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber            case kTypeMessage:
283687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber            {
284687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber                sp<AMessage> copy =
285687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber                    static_cast<AMessage *>(from->u.refValue)->dup();
286687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber
287687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber                to->u.refValue = copy.get();
288687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber                to->u.refValue->incStrong(msg.get());
289687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber                break;
290687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber            }
291687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber
2927d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            default:
2937d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            {
2947d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                to->u = from->u;
2957d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                break;
2967d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            }
2977d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        }
2987d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
2997d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
3007d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return msg;
3017d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
3027d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
30303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huberstatic void appendIndent(AString *s, int32_t indent) {
30403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    static const char kWhitespace[] =
30503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        "                                        "
30603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        "                                        ";
30703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
30803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    CHECK_LT((size_t)indent, sizeof(kWhitespace));
30903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
31003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    s->append(kWhitespace, indent);
31103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber}
31203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
31303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huberstatic bool isFourcc(uint32_t what) {
31403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    return isprint(what & 0xff)
31503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        && isprint((what >> 8) & 0xff)
31603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        && isprint((what >> 16) & 0xff)
31703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        && isprint((what >> 24) & 0xff);
31803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber}
31903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
32003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas HuberAString AMessage::debugString(int32_t indent) const {
32103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    AString s = "AMessage(what = ";
32203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
32303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    AString tmp;
32403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    if (isFourcc(mWhat)) {
32503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        tmp = StringPrintf(
32603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                "'%c%c%c%c'",
32703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                (char)(mWhat >> 24),
32803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                (char)((mWhat >> 16) & 0xff),
32903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                (char)((mWhat >> 8) & 0xff),
33003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                (char)(mWhat & 0xff));
33103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    } else {
33203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        tmp = StringPrintf("0x%08x", mWhat);
33303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    }
33403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    s.append(tmp);
33503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
33603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    if (mTarget != 0) {
33703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        tmp = StringPrintf(", target = %d", mTarget);
33803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        s.append(tmp);
33903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    }
34003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    s.append(") = {\n");
34103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
34203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
34303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        const Item &item = mItems[i];
34403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
34503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        switch (item.mType) {
34603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypeInt32:
34703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
34803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "int32_t %s = %d", item.mName, item.u.int32Value);
34903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
35003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypeInt64:
35103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
35203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "int64_t %s = %lld", item.mName, item.u.int64Value);
35303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
35403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypeSize:
35503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
35603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "size_t %s = %d", item.mName, item.u.sizeValue);
35703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
35803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypeFloat:
35903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
36003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "float %s = %f", item.mName, item.u.floatValue);
36103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
36203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypeDouble:
36303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
36403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "double %s = %f", item.mName, item.u.doubleValue);
36503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
36603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypePointer:
36703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
36803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "void *%s = %p", item.mName, item.u.ptrValue);
36903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
37003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypeString:
37103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
37203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "string %s = \"%s\"",
37303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        item.mName,
37403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        item.u.stringValue->c_str());
37503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
37603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypeObject:
37703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
37803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "RefBase *%s = %p", item.mName, item.u.refValue);
37903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
38003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypeMessage:
38103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
38203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "AMessage %s = %s",
38303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        item.mName,
38403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        static_cast<AMessage *>(
38503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                            item.u.refValue)->debugString(
38603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                                indent + strlen(item.mName) + 14).c_str());
38703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
388115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber            case kTypeRect:
389115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber                tmp = StringPrintf(
390115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber                        "Rect %s(%d, %d, %d, %d)",
391115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber                        item.mName,
392115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber                        item.u.rectValue.mLeft,
393115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber                        item.u.rectValue.mTop,
394115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber                        item.u.rectValue.mRight,
395115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber                        item.u.rectValue.mBottom);
396115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber                break;
39703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            default:
39803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                TRESPASS();
39903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        }
40003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
40103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        appendIndent(&s, indent);
40203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        s.append("  ");
40303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        s.append(tmp);
40403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        s.append("\n");
40503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    }
40603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
40703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    appendIndent(&s, indent);
40803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    s.append("}");
40903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
41003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    return s;
41103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber}
41203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
413ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber// static
414ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Hubersp<AMessage> AMessage::FromParcel(const Parcel &parcel) {
415ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    int32_t what = parcel.readInt32();
416ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    sp<AMessage> msg = new AMessage(what);
417ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
418ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    msg->mNumItems = static_cast<size_t>(parcel.readInt32());
419ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
420ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    for (size_t i = 0; i < msg->mNumItems; ++i) {
421ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        Item *item = &msg->mItems[i];
422ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
423ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        item->mName = AAtomizer::Atomize(parcel.readCString());
424ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        item->mType = static_cast<Type>(parcel.readInt32());
425ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
426ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        switch (item->mType) {
427ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeInt32:
428ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
429ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                item->u.int32Value = parcel.readInt32();
430ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
431ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
432ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
433ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeInt64:
434ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
435ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                item->u.int64Value = parcel.readInt64();
436ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
437ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
438ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
439ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeSize:
440ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
441ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                item->u.sizeValue = static_cast<size_t>(parcel.readInt32());
442ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
443ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
444ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
445ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeFloat:
446ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
447ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                item->u.floatValue = parcel.readFloat();
448ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
449ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
450ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
451ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeDouble:
452ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
453ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                item->u.doubleValue = parcel.readDouble();
454ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
455ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
456ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
457ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeString:
458ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
459ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                item->u.stringValue = new AString(parcel.readCString());
460ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
461ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
462ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
463ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeMessage:
464ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
465ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                sp<AMessage> subMsg = AMessage::FromParcel(parcel);
466ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                subMsg->incStrong(msg.get());
467ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
468ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                item->u.refValue = subMsg.get();
469ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
470ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
471ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
472ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            default:
473ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
474ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                LOGE("This type of object cannot cross process boundaries.");
475ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                TRESPASS();
476ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
477ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        }
478ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    }
479ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
480ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    return msg;
481ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber}
482ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
483ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Hubervoid AMessage::writeToParcel(Parcel *parcel) const {
484ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    parcel->writeInt32(static_cast<int32_t>(mWhat));
485ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    parcel->writeInt32(static_cast<int32_t>(mNumItems));
486ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
487ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
488ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        const Item &item = mItems[i];
489ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
490ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        parcel->writeCString(item.mName);
491ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        parcel->writeInt32(static_cast<int32_t>(item.mType));
492ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
493ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        switch (item.mType) {
494ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeInt32:
495ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
496ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                parcel->writeInt32(item.u.int32Value);
497ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
498ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
499ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
500ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeInt64:
501ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
502ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                parcel->writeInt64(item.u.int64Value);
503ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
504ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
505ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
506ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeSize:
507ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
508ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                parcel->writeInt32(static_cast<int32_t>(item.u.sizeValue));
509ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
510ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
511ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
512ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeFloat:
513ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
514ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                parcel->writeFloat(item.u.floatValue);
515ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
516ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
517ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
518ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeDouble:
519ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
520ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                parcel->writeDouble(item.u.doubleValue);
521ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
522ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
523ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
524ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeString:
525ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
526ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                parcel->writeCString(item.u.stringValue->c_str());
527ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
528ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
529ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
530ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeMessage:
531ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
532ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                static_cast<AMessage *>(item.u.refValue)->writeToParcel(parcel);
533ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
534ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
535ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
536ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            default:
537ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
538ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                LOGE("This type of object cannot cross process boundaries.");
539ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                TRESPASS();
540ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
541ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        }
542ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    }
543ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber}
544ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
5457d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}  // namespace android
546