AMessage.cpp revision ae9d5072534de65d9ea41def2e1b4258a1731ca4
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
307d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberAMessage::AMessage(uint32_t what, ALooper::handler_id target)
317d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    : mWhat(what),
327d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber      mTarget(target),
337d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber      mNumItems(0) {
347d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
357d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
367d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberAMessage::~AMessage() {
377d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    clear();
387d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
397d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
407d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setWhat(uint32_t what) {
417d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    mWhat = what;
427d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
437d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
447d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberuint32_t AMessage::what() const {
457d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return mWhat;
467d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
477d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
487d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setTarget(ALooper::handler_id handlerID) {
497d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    mTarget = handlerID;
507d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
517d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
527d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberALooper::handler_id AMessage::target() const {
537d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return mTarget;
547d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
557d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
567d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::clear() {
577d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
587d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        Item *item = &mItems[i];
597d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        freeItem(item);
607d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
617d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    mNumItems = 0;
627d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
637d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
647d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::freeItem(Item *item) {
657d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    switch (item->mType) {
667d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        case kTypeString:
677d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        {
687d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            delete item->u.stringValue;
697d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            break;
707d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        }
717d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
727d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        case kTypeObject:
737d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        case kTypeMessage:
747d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        {
757d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            if (item->u.refValue != NULL) {
767d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                item->u.refValue->decStrong(this);
777d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            }
787d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            break;
797d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        }
807d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
817d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        default:
827d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            break;
837d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
847d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
857d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
867d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberAMessage::Item *AMessage::allocateItem(const char *name) {
877d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    name = AAtomizer::Atomize(name);
887d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
897d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    size_t i = 0;
907d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    while (i < mNumItems && mItems[i].mName != name) {
917d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        ++i;
927d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
937d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
947d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    Item *item;
957d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
967d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    if (i < mNumItems) {
977d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        item = &mItems[i];
987d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        freeItem(item);
997d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    } else {
1007d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        CHECK(mNumItems < kMaxNumItems);
1017d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        i = mNumItems++;
1027d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        item = &mItems[i];
1037d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1047d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        item->mName = name;
1057d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
1067d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1077d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return item;
1087d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
1097d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1107d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberconst AMessage::Item *AMessage::findItem(
1117d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        const char *name, Type type) const {
1127d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    name = AAtomizer::Atomize(name);
1137d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1147d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
1157d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        const Item *item = &mItems[i];
1167d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1177d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        if (item->mName == name) {
1187d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            return item->mType == type ? item : NULL;
1197d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        }
1207d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
1217d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1227d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return NULL;
1237d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
1247d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1257d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#define BASIC_TYPE(NAME,FIELDNAME,TYPENAME)                             \
1267d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::set##NAME(const char *name, TYPENAME value) {            \
1277d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    Item *item = allocateItem(name);                                    \
1287d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                                                                        \
1297d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    item->mType = kType##NAME;                                          \
1307d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    item->u.FIELDNAME = value;                                          \
1317d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}                                                                       \
1327d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                                                                        \
1337d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberbool AMessage::find##NAME(const char *name, TYPENAME *value) const {    \
1347d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    const Item *item = findItem(name, kType##NAME);                     \
1357d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    if (item) {                                                         \
1367d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        *value = item->u.FIELDNAME;                                     \
1377d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        return true;                                                    \
1387d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }                                                                   \
1397d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return false;                                                       \
1407d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
1417d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1427d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Int32,int32Value,int32_t)
1437d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Int64,int64Value,int64_t)
1447d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Size,sizeValue,size_t)
1457d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Float,floatValue,float)
1467d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Double,doubleValue,double)
1477d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Pointer,ptrValue,void *)
1487d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1497d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#undef BASIC_TYPE
1507d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1517d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setString(
1527d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        const char *name, const char *s, ssize_t len) {
1537d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    Item *item = allocateItem(name);
1547d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    item->mType = kTypeString;
1557d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    item->u.stringValue = new AString(s, len < 0 ? strlen(s) : len);
1567d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
1577d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1587d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setObject(const char *name, const sp<RefBase> &obj) {
1597d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    Item *item = allocateItem(name);
1607d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    item->mType = kTypeObject;
1617d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1627d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    if (obj != NULL) { obj->incStrong(this); }
1637d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    item->u.refValue = obj.get();
1647d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
1657d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1667d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setMessage(const char *name, const sp<AMessage> &obj) {
1677d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    Item *item = allocateItem(name);
1687d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    item->mType = kTypeMessage;
1697d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1707d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    if (obj != NULL) { obj->incStrong(this); }
1717d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    item->u.refValue = obj.get();
1727d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
1737d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1747d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberbool AMessage::findString(const char *name, AString *value) const {
1757d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    const Item *item = findItem(name, kTypeString);
1767d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    if (item) {
1777d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        *value = *item->u.stringValue;
1787d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        return true;
1797d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
1807d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return false;
1817d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
1827d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1837d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberbool AMessage::findObject(const char *name, sp<RefBase> *obj) const {
1847d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    const Item *item = findItem(name, kTypeObject);
1857d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    if (item) {
1867d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        *obj = item->u.refValue;
1877d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        return true;
1887d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
1897d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return false;
1907d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
1917d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
1927d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberbool AMessage::findMessage(const char *name, sp<AMessage> *obj) const {
1937d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    const Item *item = findItem(name, kTypeMessage);
1947d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    if (item) {
1957d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        *obj = static_cast<AMessage *>(item->u.refValue);
1967d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        return true;
1977d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
1987d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return false;
1997d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
2007d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
2017d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::post(int64_t delayUs) {
2027d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    extern ALooperRoster gLooperRoster;
2037d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
2047d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    gLooperRoster.postMessage(this, delayUs);
2057d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
2067d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
2077d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubersp<AMessage> AMessage::dup() const {
2087d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    sp<AMessage> msg = new AMessage(mWhat, mTarget);
2097d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    msg->mNumItems = mNumItems;
2107d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
2117d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
2127d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        const Item *from = &mItems[i];
2137d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        Item *to = &msg->mItems[i];
2147d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
2157d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        to->mName = from->mName;
2167d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        to->mType = from->mType;
2177d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
2187d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        switch (from->mType) {
2197d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            case kTypeString:
2207d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            {
2217d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                to->u.stringValue =
2227d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                    new AString(*from->u.stringValue);
2237d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                break;
2247d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            }
2257d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
2267d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            case kTypeObject:
2277d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            case kTypeMessage:
2287d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            {
2297d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                to->u.refValue = from->u.refValue;
2307d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                to->u.refValue->incStrong(msg.get());
2317d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                break;
2327d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            }
2337d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
2347d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            default:
2357d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            {
2367d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                to->u = from->u;
2377d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber                break;
2387d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber            }
2397d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber        }
2407d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    }
2417d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
2427d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber    return msg;
2437d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}
2447d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber
24503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huberstatic void appendIndent(AString *s, int32_t indent) {
24603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    static const char kWhitespace[] =
24703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        "                                        "
24803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        "                                        ";
24903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
25003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    CHECK_LT((size_t)indent, sizeof(kWhitespace));
25103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
25203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    s->append(kWhitespace, indent);
25303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber}
25403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
25503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huberstatic bool isFourcc(uint32_t what) {
25603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    return isprint(what & 0xff)
25703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        && isprint((what >> 8) & 0xff)
25803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        && isprint((what >> 16) & 0xff)
25903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        && isprint((what >> 24) & 0xff);
26003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber}
26103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
26203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas HuberAString AMessage::debugString(int32_t indent) const {
26303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    AString s = "AMessage(what = ";
26403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
26503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    AString tmp;
26603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    if (isFourcc(mWhat)) {
26703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        tmp = StringPrintf(
26803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                "'%c%c%c%c'",
26903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                (char)(mWhat >> 24),
27003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                (char)((mWhat >> 16) & 0xff),
27103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                (char)((mWhat >> 8) & 0xff),
27203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                (char)(mWhat & 0xff));
27303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    } else {
27403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        tmp = StringPrintf("0x%08x", mWhat);
27503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    }
27603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    s.append(tmp);
27703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
27803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    if (mTarget != 0) {
27903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        tmp = StringPrintf(", target = %d", mTarget);
28003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        s.append(tmp);
28103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    }
28203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    s.append(") = {\n");
28303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
28403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
28503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        const Item &item = mItems[i];
28603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
28703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        switch (item.mType) {
28803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypeInt32:
28903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
29003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "int32_t %s = %d", item.mName, item.u.int32Value);
29103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
29203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypeInt64:
29303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
29403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "int64_t %s = %lld", item.mName, item.u.int64Value);
29503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
29603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypeSize:
29703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
29803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "size_t %s = %d", item.mName, item.u.sizeValue);
29903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
30003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypeFloat:
30103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
30203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "float %s = %f", item.mName, item.u.floatValue);
30303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
30403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypeDouble:
30503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
30603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "double %s = %f", item.mName, item.u.doubleValue);
30703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
30803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypePointer:
30903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
31003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "void *%s = %p", item.mName, item.u.ptrValue);
31103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
31203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypeString:
31303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
31403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "string %s = \"%s\"",
31503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        item.mName,
31603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        item.u.stringValue->c_str());
31703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
31803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypeObject:
31903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
32003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "RefBase *%s = %p", item.mName, item.u.refValue);
32103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
32203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            case kTypeMessage:
32303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                tmp = StringPrintf(
32403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        "AMessage %s = %s",
32503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        item.mName,
32603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                        static_cast<AMessage *>(
32703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                            item.u.refValue)->debugString(
32803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                                indent + strlen(item.mName) + 14).c_str());
32903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                break;
33003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber            default:
33103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber                TRESPASS();
33203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        }
33303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
33403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        appendIndent(&s, indent);
33503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        s.append("  ");
33603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        s.append(tmp);
33703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber        s.append("\n");
33803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    }
33903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
34003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    appendIndent(&s, indent);
34103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    s.append("}");
34203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
34303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber    return s;
34403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber}
34503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber
346ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber// static
347ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Hubersp<AMessage> AMessage::FromParcel(const Parcel &parcel) {
348ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    int32_t what = parcel.readInt32();
349ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    sp<AMessage> msg = new AMessage(what);
350ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
351ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    msg->mNumItems = static_cast<size_t>(parcel.readInt32());
352ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
353ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    for (size_t i = 0; i < msg->mNumItems; ++i) {
354ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        Item *item = &msg->mItems[i];
355ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
356ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        item->mName = AAtomizer::Atomize(parcel.readCString());
357ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        item->mType = static_cast<Type>(parcel.readInt32());
358ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
359ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        switch (item->mType) {
360ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeInt32:
361ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
362ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                item->u.int32Value = parcel.readInt32();
363ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
364ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
365ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
366ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeInt64:
367ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
368ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                item->u.int64Value = parcel.readInt64();
369ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
370ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
371ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
372ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeSize:
373ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
374ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                item->u.sizeValue = static_cast<size_t>(parcel.readInt32());
375ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
376ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
377ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
378ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeFloat:
379ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
380ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                item->u.floatValue = parcel.readFloat();
381ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
382ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
383ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
384ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeDouble:
385ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
386ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                item->u.doubleValue = parcel.readDouble();
387ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
388ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
389ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
390ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeString:
391ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
392ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                item->u.stringValue = new AString(parcel.readCString());
393ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
394ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
395ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
396ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeMessage:
397ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
398ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                sp<AMessage> subMsg = AMessage::FromParcel(parcel);
399ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                subMsg->incStrong(msg.get());
400ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
401ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                item->u.refValue = subMsg.get();
402ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
403ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
404ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
405ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            default:
406ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
407ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                LOGE("This type of object cannot cross process boundaries.");
408ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                TRESPASS();
409ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
410ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        }
411ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    }
412ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
413ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    return msg;
414ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber}
415ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
416ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Hubervoid AMessage::writeToParcel(Parcel *parcel) const {
417ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    parcel->writeInt32(static_cast<int32_t>(mWhat));
418ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    parcel->writeInt32(static_cast<int32_t>(mNumItems));
419ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
420ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
421ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        const Item &item = mItems[i];
422ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
423ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        parcel->writeCString(item.mName);
424ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        parcel->writeInt32(static_cast<int32_t>(item.mType));
425ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
426ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        switch (item.mType) {
427ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeInt32:
428ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
429ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                parcel->writeInt32(item.u.int32Value);
430ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
431ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
432ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
433ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeInt64:
434ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
435ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                parcel->writeInt64(item.u.int64Value);
436ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
437ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
438ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
439ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeSize:
440ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
441ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                parcel->writeInt32(static_cast<int32_t>(item.u.sizeValue));
442ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
443ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
444ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
445ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeFloat:
446ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
447ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                parcel->writeFloat(item.u.floatValue);
448ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
449ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
450ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
451ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeDouble:
452ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
453ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                parcel->writeDouble(item.u.doubleValue);
454ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
455ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
456ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
457ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeString:
458ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
459ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                parcel->writeCString(item.u.stringValue->c_str());
460ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
461ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
462ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
463ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            case kTypeMessage:
464ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
465ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                static_cast<AMessage *>(item.u.refValue)->writeToParcel(parcel);
466ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                break;
467ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
468ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
469ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            default:
470ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            {
471ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                LOGE("This type of object cannot cross process boundaries.");
472ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber                TRESPASS();
473ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber            }
474ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber        }
475ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber    }
476ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber}
477ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber
4787d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber}  // namespace android
479