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