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 177ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#define LOG_TAG "AMessage" 187ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar//#define LOG_NDEBUG 0 197ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar//#define DUMP_STATS 207ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#include <cutils/log.h> 217ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar 2272961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AMessage.h" 2372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 24bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber#include <ctype.h> 25bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 2672961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AAtomizer.h" 272d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber#include "ABuffer.h" 2872961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ADebug.h" 2972961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ALooperRoster.h" 3072961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AString.h" 3172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3214acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <binder/Parcel.h> 33840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include <media/stagefright/foundation/hexdump.h> 3414acc736e336cbd6026df781d4f411e908831815Andreas Huber 3572961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android { 3672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 375df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberextern ALooperRoster gLooperRoster; 385df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 3972961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::AMessage(uint32_t what, ALooper::handler_id target) 4072961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mWhat(what), 4172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mTarget(target), 4272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mNumItems(0) { 4372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 4472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4572961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::~AMessage() { 4672961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 4772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 4872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setWhat(uint32_t what) { 5072961230a5890071bcca436eb5630172ce84ec41Andreas Huber mWhat = what; 5172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 5272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5372961230a5890071bcca436eb5630172ce84ec41Andreas Huberuint32_t AMessage::what() const { 5472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mWhat; 5572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 5672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setTarget(ALooper::handler_id handlerID) { 5872961230a5890071bcca436eb5630172ce84ec41Andreas Huber mTarget = handlerID; 5972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 6072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6172961230a5890071bcca436eb5630172ce84ec41Andreas HuberALooper::handler_id AMessage::target() const { 6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mTarget; 6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6572961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::clear() { 6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = &mItems[i]; 687ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar delete[] item->mName; 697ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar item->mName = NULL; 707ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar freeItemValue(item); 7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mNumItems = 0; 7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 757ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarvoid AMessage::freeItemValue(Item *item) { 7672961230a5890071bcca436eb5630172ce84ec41Andreas Huber switch (item->mType) { 7772961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeString: 7872961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber delete item->u.stringValue; 8072961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 8172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeObject: 8472961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeMessage: 85bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber case kTypeBuffer: 8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 8772961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item->u.refValue != NULL) { 8872961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue->decStrong(this); 8972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 9072961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 9172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber default: 9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 987ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS 997ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#include <utils/Mutex.h> 1007ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar 1017ea429295a2eb31f2d9256c36c1ef53a195456acLajos MolnarMutex gLock; 1027ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gFindItemCalls = 1; 1037ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gDupCalls = 1; 1047ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gAverageNumItems = 0; 1057ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gAverageNumChecks = 0; 1067ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gAverageNumMemChecks = 0; 1077ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gAverageDupItems = 0; 1087ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gLastChecked = -1; 1097ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar 1107ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic void reportStats() { 1117ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar int32_t time = (ALooper::GetNowUs() / 1000); 1127ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar if (time / 1000 != gLastChecked / 1000) { 1137ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gLastChecked = time; 1147ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar ALOGI("called findItemIx %zu times (for len=%.1f i=%.1f/%.1f mem) dup %zu times (for len=%.1f)", 1157ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gFindItemCalls, 1167ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageNumItems / (float)gFindItemCalls, 1177ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageNumChecks / (float)gFindItemCalls, 1187ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageNumMemChecks / (float)gFindItemCalls, 1197ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gDupCalls, 1207ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageDupItems / (float)gDupCalls); 1217ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gFindItemCalls = gDupCalls = 1; 1227ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageNumItems = gAverageNumChecks = gAverageNumMemChecks = gAverageDupItems = 0; 1237ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gLastChecked = time; 1247ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar } 1257ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar} 1267ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif 12772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1287ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarinline size_t AMessage::findItemIndex(const char *name, size_t len) const { 1297ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS 1307ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar size_t memchecks = 0; 1317ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif 13272961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t i = 0; 1337ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar for (; i < mNumItems; i++) { 1347ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar if (len != mItems[i].mNameLength) { 1357ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar continue; 1367ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar } 1377ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS 1387ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar ++memchecks; 1397ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif 1407ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar if (!memcmp(mItems[i].mName, name, len)) { 1417ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar break; 1427ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar } 1437ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar } 1447ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS 1457ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar { 1467ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar Mutex::Autolock _l(gLock); 1477ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar ++gFindItemCalls; 1487ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageNumItems += mNumItems; 1497ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageNumMemChecks += memchecks; 1507ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageNumChecks += i; 1517ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar reportStats(); 15272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 1537ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif 1547ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar return i; 1557ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar} 1567ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar 1577ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar// assumes item's name was uninitialized or NULL 1587ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarvoid AMessage::Item::setName(const char *name, size_t len) { 1597ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar mNameLength = len; 1607ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar mName = new char[len + 1]; 1617ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar memcpy((void*)mName, name, len + 1); 1627ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar} 16372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1647ea429295a2eb31f2d9256c36c1ef53a195456acLajos MolnarAMessage::Item *AMessage::allocateItem(const char *name) { 1657ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar size_t len = strlen(name); 1667ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar size_t i = findItemIndex(name, len); 16772961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item; 16872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16972961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (i < mNumItems) { 17072961230a5890071bcca436eb5630172ce84ec41Andreas Huber item = &mItems[i]; 1717ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar freeItemValue(item); 17272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } else { 17372961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(mNumItems < kMaxNumItems); 17472961230a5890071bcca436eb5630172ce84ec41Andreas Huber i = mNumItems++; 17572961230a5890071bcca436eb5630172ce84ec41Andreas Huber item = &mItems[i]; 1767ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar item->setName(name, len); 17772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 17872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 17972961230a5890071bcca436eb5630172ce84ec41Andreas Huber return item; 18072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 18172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 18272961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst AMessage::Item *AMessage::findItem( 18372961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *name, Type type) const { 1847ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar size_t i = findItemIndex(name, strlen(name)); 1857ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar if (i < mNumItems) { 18672961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = &mItems[i]; 1877ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar return item->mType == type ? item : NULL; 18872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 18972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 19072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return NULL; 19172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 19272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 193513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnarbool AMessage::contains(const char *name) const { 1947ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar size_t i = findItemIndex(name, strlen(name)); 1957ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar return i < mNumItems; 196513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar} 197513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar 19872961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define BASIC_TYPE(NAME,FIELDNAME,TYPENAME) \ 19972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::set##NAME(const char *name, TYPENAME value) { \ 20072961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); \ 20172961230a5890071bcca436eb5630172ce84ec41Andreas Huber \ 20272961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kType##NAME; \ 20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.FIELDNAME = value; \ 20472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} \ 20572961230a5890071bcca436eb5630172ce84ec41Andreas Huber \ 20672961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::find##NAME(const char *name, TYPENAME *value) const { \ 20772961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kType##NAME); \ 20872961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { \ 20972961230a5890071bcca436eb5630172ce84ec41Andreas Huber *value = item->u.FIELDNAME; \ 21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; \ 21172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } \ 21272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; \ 21372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 21472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 21572961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int32,int32Value,int32_t) 21672961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int64,int64Value,int64_t) 21772961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Size,sizeValue,size_t) 21872961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Float,floatValue,float) 21972961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Double,doubleValue,double) 22072961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Pointer,ptrValue,void *) 22172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 22272961230a5890071bcca436eb5630172ce84ec41Andreas Huber#undef BASIC_TYPE 22372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 22472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setString( 22572961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *name, const char *s, ssize_t len) { 22672961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 22772961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kTypeString; 22872961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.stringValue = new AString(s, len < 0 ? strlen(s) : len); 22972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 23072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 231513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnarvoid AMessage::setString( 232513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar const char *name, const AString &s) { 233513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar setString(name, s.c_str(), s.size()); 234513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar} 235513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar 2362d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObjectInternal( 2372d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber const char *name, const sp<RefBase> &obj, Type type) { 23872961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 2392d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber item->mType = type; 24072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 24172961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (obj != NULL) { obj->incStrong(this); } 24272961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue = obj.get(); 24372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 24472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2452d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObject(const char *name, const sp<RefBase> &obj) { 2462d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber setObjectInternal(name, obj, kTypeObject); 2472d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber} 2482d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 2492d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setBuffer(const char *name, const sp<ABuffer> &buffer) { 2502d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber setObjectInternal(name, sp<RefBase>(buffer), kTypeBuffer); 2512d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber} 2522d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 25372961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setMessage(const char *name, const sp<AMessage> &obj) { 25472961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 25572961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kTypeMessage; 25672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 25772961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (obj != NULL) { obj->incStrong(this); } 25872961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue = obj.get(); 25972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 26072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26131e2508c75018145a8238925ff1a08cbde4e799aAndreas Hubervoid AMessage::setRect( 26231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const char *name, 26331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t left, int32_t top, int32_t right, int32_t bottom) { 26431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber Item *item = allocateItem(name); 26531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->mType = kTypeRect; 26631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 26731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mLeft = left; 26831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mTop = top; 26931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mRight = right; 27031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mBottom = bottom; 27131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 27231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 27372961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findString(const char *name, AString *value) const { 27472961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeString); 27572961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 27672961230a5890071bcca436eb5630172ce84ec41Andreas Huber *value = *item->u.stringValue; 27772961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 27872961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 27972961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 28072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 28172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28272961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findObject(const char *name, sp<RefBase> *obj) const { 28372961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeObject); 28472961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 28572961230a5890071bcca436eb5630172ce84ec41Andreas Huber *obj = item->u.refValue; 28672961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 28772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 28872961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 28972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 29072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2912d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huberbool AMessage::findBuffer(const char *name, sp<ABuffer> *buf) const { 2922d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber const Item *item = findItem(name, kTypeBuffer); 2932d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber if (item) { 2942d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber *buf = (ABuffer *)(item->u.refValue); 2952d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber return true; 2962d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber } 2972d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber return false; 2982d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber} 2992d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 30072961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findMessage(const char *name, sp<AMessage> *obj) const { 30172961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeMessage); 30272961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 30372961230a5890071bcca436eb5630172ce84ec41Andreas Huber *obj = static_cast<AMessage *>(item->u.refValue); 30472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 30572961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 30672961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 30772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 30872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 30931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huberbool AMessage::findRect( 31031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const char *name, 31131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const { 31231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const Item *item = findItem(name, kTypeRect); 31331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (item == NULL) { 31431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber return false; 31531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 31631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 31731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *left = item->u.rectValue.mLeft; 31831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *top = item->u.rectValue.mTop; 31931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *right = item->u.rectValue.mRight; 32031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *bottom = item->u.rectValue.mBottom; 32131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 32231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber return true; 32331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 32431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 32572961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::post(int64_t delayUs) { 32672961230a5890071bcca436eb5630172ce84ec41Andreas Huber gLooperRoster.postMessage(this, delayUs); 32772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 32872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3295df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberstatus_t AMessage::postAndAwaitResponse(sp<AMessage> *response) { 3305df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber return gLooperRoster.postAndAwaitResponse(this, response); 3315df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 3325df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 3335df775d2f509c76e76a46615fca83dba95299f6eAndreas Hubervoid AMessage::postReply(uint32_t replyID) { 3345df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber gLooperRoster.postReply(replyID, this); 3355df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 3365df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 3375df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberbool AMessage::senderAwaitsResponse(uint32_t *replyID) const { 3385df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber int32_t tmp; 3395df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber bool found = findInt32("replyID", &tmp); 3405df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 3415df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber if (!found) { 3425df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber return false; 3435df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber } 3445df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 3455df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber *replyID = static_cast<uint32_t>(tmp); 3465df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 3475df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber return true; 3485df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 3495df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 35072961230a5890071bcca436eb5630172ce84ec41Andreas Hubersp<AMessage> AMessage::dup() const { 35172961230a5890071bcca436eb5630172ce84ec41Andreas Huber sp<AMessage> msg = new AMessage(mWhat, mTarget); 35272961230a5890071bcca436eb5630172ce84ec41Andreas Huber msg->mNumItems = mNumItems; 35372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3547ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS 3557ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar { 3567ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar Mutex::Autolock _l(gLock); 3577ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar ++gDupCalls; 3587ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageDupItems += mNumItems; 3597ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar reportStats(); 3607ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar } 3617ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif 3627ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar 36372961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 36472961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *from = &mItems[i]; 36572961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *to = &msg->mItems[i]; 36672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3677ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar to->setName(from->mName, from->mNameLength); 36872961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->mType = from->mType; 36972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 37072961230a5890071bcca436eb5630172ce84ec41Andreas Huber switch (from->mType) { 37172961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeString: 37272961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 37372961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.stringValue = 37472961230a5890071bcca436eb5630172ce84ec41Andreas Huber new AString(*from->u.stringValue); 37572961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 37672961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 37772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 37872961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeObject: 379bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber case kTypeBuffer: 38072961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 38172961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.refValue = from->u.refValue; 38272961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.refValue->incStrong(msg.get()); 38372961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 38472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 38572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3862c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber case kTypeMessage: 3872c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber { 3882c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber sp<AMessage> copy = 3892c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber static_cast<AMessage *>(from->u.refValue)->dup(); 3902c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 3912c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber to->u.refValue = copy.get(); 3922c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber to->u.refValue->incStrong(msg.get()); 3932c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber break; 3942c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } 3952c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 39672961230a5890071bcca436eb5630172ce84ec41Andreas Huber default: 39772961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 39872961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u = from->u; 39972961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 40072961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 40172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 40272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 40372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 40472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return msg; 40572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 40672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 407bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic void appendIndent(AString *s, int32_t indent) { 408bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber static const char kWhitespace[] = 409bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber " " 410bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber " "; 411bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 412bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber CHECK_LT((size_t)indent, sizeof(kWhitespace)); 413bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 414bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s->append(kWhitespace, indent); 415bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 416bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 417bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic bool isFourcc(uint32_t what) { 418bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber return isprint(what & 0xff) 419bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 8) & 0xff) 420bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 16) & 0xff) 421bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 24) & 0xff); 422bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 423bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 424bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas HuberAString AMessage::debugString(int32_t indent) const { 425bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber AString s = "AMessage(what = "; 426bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 427bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber AString tmp; 428bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber if (isFourcc(mWhat)) { 429bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 430bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "'%c%c%c%c'", 431bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)(mWhat >> 24), 432bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)((mWhat >> 16) & 0xff), 433bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)((mWhat >> 8) & 0xff), 434bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)(mWhat & 0xff)); 435bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } else { 436bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf("0x%08x", mWhat); 437bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 438bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 439bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 440bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber if (mTarget != 0) { 441bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf(", target = %d", mTarget); 442bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 443bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 444bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(") = {\n"); 445bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 446bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 447bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber const Item &item = mItems[i]; 448bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 449bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber switch (item.mType) { 450bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeInt32: 451bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 452bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "int32_t %s = %d", item.mName, item.u.int32Value); 453bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 454bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeInt64: 455bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 456bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "int64_t %s = %lld", item.mName, item.u.int64Value); 457bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 458bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeSize: 459bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 460bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "size_t %s = %d", item.mName, item.u.sizeValue); 461bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 462bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeFloat: 463bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 464bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "float %s = %f", item.mName, item.u.floatValue); 465bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 466bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeDouble: 467bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 468bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "double %s = %f", item.mName, item.u.doubleValue); 469bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 470bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypePointer: 471bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 472bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "void *%s = %p", item.mName, item.u.ptrValue); 473bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 474bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeString: 475bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 476bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "string %s = \"%s\"", 477bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.mName, 478bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.u.stringValue->c_str()); 479bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 480bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeObject: 481bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 482bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "RefBase *%s = %p", item.mName, item.u.refValue); 483bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 484bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber case kTypeBuffer: 485840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber { 486840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(item.u.refValue); 487840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 488cf31f1eecf46d599428e115dfee8dd47b76c83fcAndy Hung if (buffer != NULL && buffer->data() != NULL && buffer->size() <= 64) { 489840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber tmp = StringPrintf("Buffer %s = {\n", item.mName); 490840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber hexdump(buffer->data(), buffer->size(), indent + 4, &tmp); 491840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber appendIndent(&tmp, indent + 2); 492840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber tmp.append("}"); 493840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } else { 494840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber tmp = StringPrintf( 495840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber "Buffer *%s = %p", item.mName, buffer.get()); 496840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 497bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber break; 498840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 499bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeMessage: 500bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 501bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "AMessage %s = %s", 502bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.mName, 503bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber static_cast<AMessage *>( 504bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.u.refValue)->debugString( 505bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber indent + strlen(item.mName) + 14).c_str()); 506bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 507078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber case kTypeRect: 508078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber tmp = StringPrintf( 509078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber "Rect %s(%d, %d, %d, %d)", 510078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.mName, 511078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mLeft, 512078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mTop, 513078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mRight, 514078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mBottom); 515078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber break; 516bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber default: 517bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber TRESPASS(); 518bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 519bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 520bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber appendIndent(&s, indent); 521bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(" "); 522bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 523bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append("\n"); 524bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 525bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 526bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber appendIndent(&s, indent); 527bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append("}"); 528bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 529bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber return s; 530bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 531bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 53214acc736e336cbd6026df781d4f411e908831815Andreas Huber// static 53314acc736e336cbd6026df781d4f411e908831815Andreas Hubersp<AMessage> AMessage::FromParcel(const Parcel &parcel) { 53414acc736e336cbd6026df781d4f411e908831815Andreas Huber int32_t what = parcel.readInt32(); 53514acc736e336cbd6026df781d4f411e908831815Andreas Huber sp<AMessage> msg = new AMessage(what); 53614acc736e336cbd6026df781d4f411e908831815Andreas Huber 53714acc736e336cbd6026df781d4f411e908831815Andreas Huber msg->mNumItems = static_cast<size_t>(parcel.readInt32()); 53814acc736e336cbd6026df781d4f411e908831815Andreas Huber for (size_t i = 0; i < msg->mNumItems; ++i) { 53914acc736e336cbd6026df781d4f411e908831815Andreas Huber Item *item = &msg->mItems[i]; 54014acc736e336cbd6026df781d4f411e908831815Andreas Huber 5417ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar const char *name = parcel.readCString(); 5427ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar item->setName(name, strlen(name)); 54314acc736e336cbd6026df781d4f411e908831815Andreas Huber item->mType = static_cast<Type>(parcel.readInt32()); 54414acc736e336cbd6026df781d4f411e908831815Andreas Huber 54514acc736e336cbd6026df781d4f411e908831815Andreas Huber switch (item->mType) { 54614acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt32: 54714acc736e336cbd6026df781d4f411e908831815Andreas Huber { 54814acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.int32Value = parcel.readInt32(); 54914acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 55014acc736e336cbd6026df781d4f411e908831815Andreas Huber } 55114acc736e336cbd6026df781d4f411e908831815Andreas Huber 55214acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt64: 55314acc736e336cbd6026df781d4f411e908831815Andreas Huber { 55414acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.int64Value = parcel.readInt64(); 55514acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 55614acc736e336cbd6026df781d4f411e908831815Andreas Huber } 55714acc736e336cbd6026df781d4f411e908831815Andreas Huber 55814acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeSize: 55914acc736e336cbd6026df781d4f411e908831815Andreas Huber { 56014acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.sizeValue = static_cast<size_t>(parcel.readInt32()); 56114acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 56214acc736e336cbd6026df781d4f411e908831815Andreas Huber } 56314acc736e336cbd6026df781d4f411e908831815Andreas Huber 56414acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeFloat: 56514acc736e336cbd6026df781d4f411e908831815Andreas Huber { 56614acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.floatValue = parcel.readFloat(); 56714acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 56814acc736e336cbd6026df781d4f411e908831815Andreas Huber } 56914acc736e336cbd6026df781d4f411e908831815Andreas Huber 57014acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeDouble: 57114acc736e336cbd6026df781d4f411e908831815Andreas Huber { 57214acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.doubleValue = parcel.readDouble(); 57314acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 57414acc736e336cbd6026df781d4f411e908831815Andreas Huber } 57514acc736e336cbd6026df781d4f411e908831815Andreas Huber 57614acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeString: 57714acc736e336cbd6026df781d4f411e908831815Andreas Huber { 57814acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.stringValue = new AString(parcel.readCString()); 57914acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 58014acc736e336cbd6026df781d4f411e908831815Andreas Huber } 58114acc736e336cbd6026df781d4f411e908831815Andreas Huber 58214acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeMessage: 58314acc736e336cbd6026df781d4f411e908831815Andreas Huber { 58414acc736e336cbd6026df781d4f411e908831815Andreas Huber sp<AMessage> subMsg = AMessage::FromParcel(parcel); 58514acc736e336cbd6026df781d4f411e908831815Andreas Huber subMsg->incStrong(msg.get()); 58614acc736e336cbd6026df781d4f411e908831815Andreas Huber 58714acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.refValue = subMsg.get(); 58814acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 58914acc736e336cbd6026df781d4f411e908831815Andreas Huber } 59014acc736e336cbd6026df781d4f411e908831815Andreas Huber 59114acc736e336cbd6026df781d4f411e908831815Andreas Huber default: 59214acc736e336cbd6026df781d4f411e908831815Andreas Huber { 59329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("This type of object cannot cross process boundaries."); 59414acc736e336cbd6026df781d4f411e908831815Andreas Huber TRESPASS(); 59514acc736e336cbd6026df781d4f411e908831815Andreas Huber } 59614acc736e336cbd6026df781d4f411e908831815Andreas Huber } 59714acc736e336cbd6026df781d4f411e908831815Andreas Huber } 59814acc736e336cbd6026df781d4f411e908831815Andreas Huber 59914acc736e336cbd6026df781d4f411e908831815Andreas Huber return msg; 60014acc736e336cbd6026df781d4f411e908831815Andreas Huber} 60114acc736e336cbd6026df781d4f411e908831815Andreas Huber 60214acc736e336cbd6026df781d4f411e908831815Andreas Hubervoid AMessage::writeToParcel(Parcel *parcel) const { 60314acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(mWhat)); 60414acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(mNumItems)); 60514acc736e336cbd6026df781d4f411e908831815Andreas Huber 60614acc736e336cbd6026df781d4f411e908831815Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 60714acc736e336cbd6026df781d4f411e908831815Andreas Huber const Item &item = mItems[i]; 60814acc736e336cbd6026df781d4f411e908831815Andreas Huber 60914acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeCString(item.mName); 61014acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(item.mType)); 61114acc736e336cbd6026df781d4f411e908831815Andreas Huber 61214acc736e336cbd6026df781d4f411e908831815Andreas Huber switch (item.mType) { 61314acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt32: 61414acc736e336cbd6026df781d4f411e908831815Andreas Huber { 61514acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(item.u.int32Value); 61614acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 61714acc736e336cbd6026df781d4f411e908831815Andreas Huber } 61814acc736e336cbd6026df781d4f411e908831815Andreas Huber 61914acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt64: 62014acc736e336cbd6026df781d4f411e908831815Andreas Huber { 62114acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt64(item.u.int64Value); 62214acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 62314acc736e336cbd6026df781d4f411e908831815Andreas Huber } 62414acc736e336cbd6026df781d4f411e908831815Andreas Huber 62514acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeSize: 62614acc736e336cbd6026df781d4f411e908831815Andreas Huber { 62714acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(item.u.sizeValue)); 62814acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 62914acc736e336cbd6026df781d4f411e908831815Andreas Huber } 63014acc736e336cbd6026df781d4f411e908831815Andreas Huber 63114acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeFloat: 63214acc736e336cbd6026df781d4f411e908831815Andreas Huber { 63314acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeFloat(item.u.floatValue); 63414acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 63514acc736e336cbd6026df781d4f411e908831815Andreas Huber } 63614acc736e336cbd6026df781d4f411e908831815Andreas Huber 63714acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeDouble: 63814acc736e336cbd6026df781d4f411e908831815Andreas Huber { 63914acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeDouble(item.u.doubleValue); 64014acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 64114acc736e336cbd6026df781d4f411e908831815Andreas Huber } 64214acc736e336cbd6026df781d4f411e908831815Andreas Huber 64314acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeString: 64414acc736e336cbd6026df781d4f411e908831815Andreas Huber { 64514acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeCString(item.u.stringValue->c_str()); 64614acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 64714acc736e336cbd6026df781d4f411e908831815Andreas Huber } 64814acc736e336cbd6026df781d4f411e908831815Andreas Huber 64914acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeMessage: 65014acc736e336cbd6026df781d4f411e908831815Andreas Huber { 65114acc736e336cbd6026df781d4f411e908831815Andreas Huber static_cast<AMessage *>(item.u.refValue)->writeToParcel(parcel); 65214acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 65314acc736e336cbd6026df781d4f411e908831815Andreas Huber } 65414acc736e336cbd6026df781d4f411e908831815Andreas Huber 65514acc736e336cbd6026df781d4f411e908831815Andreas Huber default: 65614acc736e336cbd6026df781d4f411e908831815Andreas Huber { 65729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("This type of object cannot cross process boundaries."); 65814acc736e336cbd6026df781d4f411e908831815Andreas Huber TRESPASS(); 65914acc736e336cbd6026df781d4f411e908831815Andreas Huber } 66014acc736e336cbd6026df781d4f411e908831815Andreas Huber } 66114acc736e336cbd6026df781d4f411e908831815Andreas Huber } 66214acc736e336cbd6026df781d4f411e908831815Andreas Huber} 66314acc736e336cbd6026df781d4f411e908831815Andreas Huber 6645778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t AMessage::countEntries() const { 6655778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mNumItems; 6665778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 6675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6685778822d86b0337407514b9372562b86edfa91cdAndreas Huberconst char *AMessage::getEntryNameAt(size_t index, Type *type) const { 6695778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mNumItems) { 6705778822d86b0337407514b9372562b86edfa91cdAndreas Huber *type = kTypeInt32; 6715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6725778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 6735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6755778822d86b0337407514b9372562b86edfa91cdAndreas Huber *type = mItems[index].mType; 6765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6775778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mItems[index].mName; 6785778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 6795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 68072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} // namespace android 681