AMessage.cpp revision bbc2b8289458cfde931b133bad0c9d1026674ee7
172961230a5890071bcca436eb5630172ce84ec41Andreas Huber/*
272961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Copyright (C) 2010 The Android Open Source Project
372961230a5890071bcca436eb5630172ce84ec41Andreas Huber *
472961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
572961230a5890071bcca436eb5630172ce84ec41Andreas Huber * you may not use this file except in compliance with the License.
672961230a5890071bcca436eb5630172ce84ec41Andreas Huber * You may obtain a copy of the License at
772961230a5890071bcca436eb5630172ce84ec41Andreas Huber *
872961230a5890071bcca436eb5630172ce84ec41Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
972961230a5890071bcca436eb5630172ce84ec41Andreas Huber *
1072961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Unless required by applicable law or agreed to in writing, software
1172961230a5890071bcca436eb5630172ce84ec41Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1272961230a5890071bcca436eb5630172ce84ec41Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1372961230a5890071bcca436eb5630172ce84ec41Andreas Huber * See the License for the specific language governing permissions and
1472961230a5890071bcca436eb5630172ce84ec41Andreas Huber * limitations under the License.
1572961230a5890071bcca436eb5630172ce84ec41Andreas Huber */
1672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1772961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AMessage.h"
1872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
19bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber#include <ctype.h>
20bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
2172961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AAtomizer.h"
2272961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ADebug.h"
2372961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ALooperRoster.h"
2472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AString.h"
2572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
2672961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android {
2772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
2872961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::AMessage(uint32_t what, ALooper::handler_id target)
2972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    : mWhat(what),
3072961230a5890071bcca436eb5630172ce84ec41Andreas Huber      mTarget(target),
3172961230a5890071bcca436eb5630172ce84ec41Andreas Huber      mNumItems(0) {
3272961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
3372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3472961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::~AMessage() {
3572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    clear();
3672961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
3772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setWhat(uint32_t what) {
3972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mWhat = what;
4072961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
4172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4272961230a5890071bcca436eb5630172ce84ec41Andreas Huberuint32_t AMessage::what() const {
4372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return mWhat;
4472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
4572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setTarget(ALooper::handler_id handlerID) {
4772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mTarget = handlerID;
4872961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
4972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5072961230a5890071bcca436eb5630172ce84ec41Andreas HuberALooper::handler_id AMessage::target() const {
5172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return mTarget;
5272961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
5372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::clear() {
5572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
5672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        Item *item = &mItems[i];
5772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        freeItem(item);
5872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
5972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    mNumItems = 0;
6072961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
6272961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::freeItem(Item *item) {
6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    switch (item->mType) {
6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeString:
6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        {
6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber            delete item->u.stringValue;
6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
6972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeObject:
7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        case kTypeMessage:
7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        {
7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber            if (item->u.refValue != NULL) {
7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber                item->u.refValue->decStrong(this);
7572961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
7672961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
7772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
7872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        default:
8072961230a5890071bcca436eb5630172ce84ec41Andreas Huber            break;
8172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
8472961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::Item *AMessage::allocateItem(const char *name) {
8572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    name = AAtomizer::Atomize(name);
8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
8772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    size_t i = 0;
8872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    while (i < mNumItems && mItems[i].mName != name) {
8972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        ++i;
9072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
9172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item;
9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (i < mNumItems) {
9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        item = &mItems[i];
9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        freeItem(item);
9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    } else {
9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        CHECK(mNumItems < kMaxNumItems);
9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        i = mNumItems++;
10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        item = &mItems[i];
10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        item->mName = name;
10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return item;
10672961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
10772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
10872961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst AMessage::Item *AMessage::findItem(
10972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const char *name, Type type) const {
11072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    name = AAtomizer::Atomize(name);
11172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
11272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
11372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const Item *item = &mItems[i];
11472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
11572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        if (item->mName == name) {
11672961230a5890071bcca436eb5630172ce84ec41Andreas Huber            return item->mType == type ? item : NULL;
11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
12072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return NULL;
12172961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
12272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
12372961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define BASIC_TYPE(NAME,FIELDNAME,TYPENAME)                             \
12472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::set##NAME(const char *name, TYPENAME value) {            \
12572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);                                    \
12672961230a5890071bcca436eb5630172ce84ec41Andreas Huber                                                                        \
12772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kType##NAME;                                          \
12872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.FIELDNAME = value;                                          \
12972961230a5890071bcca436eb5630172ce84ec41Andreas Huber}                                                                       \
13072961230a5890071bcca436eb5630172ce84ec41Andreas Huber                                                                        \
13172961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::find##NAME(const char *name, TYPENAME *value) const {    \
13272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kType##NAME);                     \
13372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {                                                         \
13472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *value = item->u.FIELDNAME;                                     \
13572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;                                                    \
13672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }                                                                   \
13772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;                                                       \
13872961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
13972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
14072961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int32,int32Value,int32_t)
14172961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int64,int64Value,int64_t)
14272961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Size,sizeValue,size_t)
14372961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Float,floatValue,float)
14472961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Double,doubleValue,double)
14572961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Pointer,ptrValue,void *)
14672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
14772961230a5890071bcca436eb5630172ce84ec41Andreas Huber#undef BASIC_TYPE
14872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
14972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setString(
15072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const char *name, const char *s, ssize_t len) {
15172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
15272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kTypeString;
15372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.stringValue = new AString(s, len < 0 ? strlen(s) : len);
15472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
15572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
15672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setObject(const char *name, const sp<RefBase> &obj) {
15772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
15872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kTypeObject;
15972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
16072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (obj != NULL) { obj->incStrong(this); }
16172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.refValue = obj.get();
16272961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
16372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
16472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setMessage(const char *name, const sp<AMessage> &obj) {
16572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *item = allocateItem(name);
16672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->mType = kTypeMessage;
16772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
16872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (obj != NULL) { obj->incStrong(this); }
16972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    item->u.refValue = obj.get();
17072961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
17172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
17272961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findString(const char *name, AString *value) const {
17372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeString);
17472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
17572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *value = *item->u.stringValue;
17672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
17772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
17872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
17972961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
18072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
18172961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findObject(const char *name, sp<RefBase> *obj) const {
18272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeObject);
18372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
18472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *obj = item->u.refValue;
18572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
18672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
18772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
18872961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
18972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
19072961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findMessage(const char *name, sp<AMessage> *obj) const {
19172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *item = findItem(name, kTypeMessage);
19272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    if (item) {
19372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        *obj = static_cast<AMessage *>(item->u.refValue);
19472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        return true;
19572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
19672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return false;
19772961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
19872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
19972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::post(int64_t delayUs) {
20072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    extern ALooperRoster gLooperRoster;
20172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
20272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    gLooperRoster.postMessage(this, delayUs);
20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
20472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
20572961230a5890071bcca436eb5630172ce84ec41Andreas Hubersp<AMessage> AMessage::dup() const {
20672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    sp<AMessage> msg = new AMessage(mWhat, mTarget);
20772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    msg->mNumItems = mNumItems;
20872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
20972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const Item *from = &mItems[i];
21172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        Item *to = &msg->mItems[i];
21272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
21372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        to->mName = from->mName;
21472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        to->mType = from->mType;
21572961230a5890071bcca436eb5630172ce84ec41Andreas Huber
21672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        switch (from->mType) {
21772961230a5890071bcca436eb5630172ce84ec41Andreas Huber            case kTypeString:
21872961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
21972961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.stringValue =
22072961230a5890071bcca436eb5630172ce84ec41Andreas Huber                    new AString(*from->u.stringValue);
22172961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
22272961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
22372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
22472961230a5890071bcca436eb5630172ce84ec41Andreas Huber            case kTypeObject:
22572961230a5890071bcca436eb5630172ce84ec41Andreas Huber            case kTypeMessage:
22672961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
22772961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.refValue = from->u.refValue;
22872961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u.refValue->incStrong(msg.get());
22972961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
23072961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
23172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
23272961230a5890071bcca436eb5630172ce84ec41Andreas Huber            default:
23372961230a5890071bcca436eb5630172ce84ec41Andreas Huber            {
23472961230a5890071bcca436eb5630172ce84ec41Andreas Huber                to->u = from->u;
23572961230a5890071bcca436eb5630172ce84ec41Andreas Huber                break;
23672961230a5890071bcca436eb5630172ce84ec41Andreas Huber            }
23772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        }
23872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    }
23972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
24072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    return msg;
24172961230a5890071bcca436eb5630172ce84ec41Andreas Huber}
24272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
243bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic void appendIndent(AString *s, int32_t indent) {
244bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    static const char kWhitespace[] =
245bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        "                                        "
246bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        "                                        ";
247bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
248bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    CHECK_LT((size_t)indent, sizeof(kWhitespace));
249bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
250bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s->append(kWhitespace, indent);
251bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
252bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
253bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic bool isFourcc(uint32_t what) {
254bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    return isprint(what & 0xff)
255bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 8) & 0xff)
256bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 16) & 0xff)
257bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        && isprint((what >> 24) & 0xff);
258bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
259bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
260bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas HuberAString AMessage::debugString(int32_t indent) const {
261bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    AString s = "AMessage(what = ";
262bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
263bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    AString tmp;
264bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    if (isFourcc(mWhat)) {
265bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        tmp = StringPrintf(
266bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                "'%c%c%c%c'",
267bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)(mWhat >> 24),
268bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)((mWhat >> 16) & 0xff),
269bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)((mWhat >> 8) & 0xff),
270bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                (char)(mWhat & 0xff));
271bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    } else {
272bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        tmp = StringPrintf("0x%08x", mWhat);
273bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
274bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append(tmp);
275bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
276bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    if (mTarget != 0) {
277bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        tmp = StringPrintf(", target = %d", mTarget);
278bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append(tmp);
279bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
280bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append(") = {\n");
281bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
282bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    for (size_t i = 0; i < mNumItems; ++i) {
283bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        const Item &item = mItems[i];
284bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
285bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        switch (item.mType) {
286bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeInt32:
287bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
288bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "int32_t %s = %d", item.mName, item.u.int32Value);
289bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
290bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeInt64:
291bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
292bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "int64_t %s = %lld", item.mName, item.u.int64Value);
293bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
294bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeSize:
295bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
296bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "size_t %s = %d", item.mName, item.u.sizeValue);
297bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
298bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeFloat:
299bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
300bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "float %s = %f", item.mName, item.u.floatValue);
301bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
302bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeDouble:
303bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
304bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "double %s = %f", item.mName, item.u.doubleValue);
305bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
306bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypePointer:
307bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
308bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "void *%s = %p", item.mName, item.u.ptrValue);
309bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
310bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeString:
311bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
312bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "string %s = \"%s\"",
313bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.mName,
314bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.u.stringValue->c_str());
315bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
316bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeObject:
317bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
318bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "RefBase *%s = %p", item.mName, item.u.refValue);
319bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
320bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            case kTypeMessage:
321bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                tmp = StringPrintf(
322bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        "AMessage %s = %s",
323bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        item.mName,
324bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                        static_cast<AMessage *>(
325bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                            item.u.refValue)->debugString(
326bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                                indent + strlen(item.mName) + 14).c_str());
327bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                break;
328bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber            default:
329bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber                TRESPASS();
330bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        }
331bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
332bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        appendIndent(&s, indent);
333bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append("  ");
334bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append(tmp);
335bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber        s.append("\n");
336bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    }
337bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
338bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    appendIndent(&s, indent);
339bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    s.append("}");
340bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
341bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    return s;
342bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber}
343bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
34472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}  // namespace android
345