AMessage.cpp revision 3f27436a9346f043f52265da1e6a74cde2bffd4d
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" 305804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar#include "AHandler.h" 3172961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AString.h" 3272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3314acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <binder/Parcel.h> 34840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include <media/stagefright/foundation/hexdump.h> 3514acc736e336cbd6026df781d4f411e908831815Andreas Huber 3672961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android { 3772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 385df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberextern ALooperRoster gLooperRoster; 395df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 403f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstatus_t AReplyToken::setReply(const sp<AMessage> &reply) { 413f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar if (mReplied) { 423f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar ALOGE("trying to post a duplicate reply"); 433f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return -EBUSY; 443f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar } 453f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar CHECK(mReply == NULL); 463f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar mReply = reply; 473f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar mReplied = true; 483f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return OK; 493f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar} 503f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar 515804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos MolnarAMessage::AMessage(void) 525804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar : mWhat(0), 535804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar mTarget(0), 545804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar mNumItems(0) { 555804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar} 565804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar 575804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos MolnarAMessage::AMessage(uint32_t what, const sp<const AHandler> &handler) 585804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar : mWhat(what), 5972961230a5890071bcca436eb5630172ce84ec41Andreas Huber mNumItems(0) { 605804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar setTarget(handler); 6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6372961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::~AMessage() { 6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setWhat(uint32_t what) { 6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber mWhat = what; 6972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 7172961230a5890071bcca436eb5630172ce84ec41Andreas Huberuint32_t AMessage::what() const { 7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mWhat; 7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 755804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnarvoid AMessage::setTarget(const sp<const AHandler> &handler) { 765804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar if (handler == NULL) { 775804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar mTarget = 0; 785804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar mHandler.clear(); 795804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar mLooper.clear(); 805804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar } else { 815804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar mTarget = handler->id(); 825804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar mHandler = handler->getHandler(); 835804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar mLooper = handler->getLooper(); 845804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar } 8572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::clear() { 8872961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 8972961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = &mItems[i]; 907ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar delete[] item->mName; 917ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar item->mName = NULL; 927ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar freeItemValue(item); 9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber mNumItems = 0; 9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 977ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarvoid AMessage::freeItemValue(Item *item) { 9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber switch (item->mType) { 9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeString: 10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber delete item->u.stringValue; 10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeObject: 10672961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeMessage: 107bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber case kTypeBuffer: 10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 10972961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item->u.refValue != NULL) { 11072961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue->decStrong(this); 11172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 11272961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 11372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 11472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11572961230a5890071bcca436eb5630172ce84ec41Andreas Huber default: 11672961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1207ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS 1217ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#include <utils/Mutex.h> 1227ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar 1237ea429295a2eb31f2d9256c36c1ef53a195456acLajos MolnarMutex gLock; 1247ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gFindItemCalls = 1; 1257ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gDupCalls = 1; 1267ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gAverageNumItems = 0; 1277ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gAverageNumChecks = 0; 1287ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gAverageNumMemChecks = 0; 1297ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gAverageDupItems = 0; 1307ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic int32_t gLastChecked = -1; 1317ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar 1327ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarstatic void reportStats() { 1337ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar int32_t time = (ALooper::GetNowUs() / 1000); 1347ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar if (time / 1000 != gLastChecked / 1000) { 1357ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gLastChecked = time; 1367ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar ALOGI("called findItemIx %zu times (for len=%.1f i=%.1f/%.1f mem) dup %zu times (for len=%.1f)", 1377ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gFindItemCalls, 1387ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageNumItems / (float)gFindItemCalls, 1397ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageNumChecks / (float)gFindItemCalls, 1407ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageNumMemChecks / (float)gFindItemCalls, 1417ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gDupCalls, 1427ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageDupItems / (float)gDupCalls); 1437ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gFindItemCalls = gDupCalls = 1; 1447ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageNumItems = gAverageNumChecks = gAverageNumMemChecks = gAverageDupItems = 0; 1457ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gLastChecked = time; 1467ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar } 1477ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar} 1487ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif 14972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1507ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarinline size_t AMessage::findItemIndex(const char *name, size_t len) const { 1517ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS 1527ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar size_t memchecks = 0; 1537ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif 15472961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t i = 0; 1557ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar for (; i < mNumItems; i++) { 1567ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar if (len != mItems[i].mNameLength) { 1577ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar continue; 1587ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar } 1597ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS 1607ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar ++memchecks; 1617ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif 1627ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar if (!memcmp(mItems[i].mName, name, len)) { 1637ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar break; 1647ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar } 1657ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar } 1667ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS 1677ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar { 1687ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar Mutex::Autolock _l(gLock); 1697ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar ++gFindItemCalls; 1707ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageNumItems += mNumItems; 1717ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageNumMemChecks += memchecks; 1727ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageNumChecks += i; 1737ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar reportStats(); 17472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 1757ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif 1767ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar return i; 1777ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar} 1787ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar 1797ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar// assumes item's name was uninitialized or NULL 1807ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnarvoid AMessage::Item::setName(const char *name, size_t len) { 1817ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar mNameLength = len; 1827ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar mName = new char[len + 1]; 1837ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar memcpy((void*)mName, name, len + 1); 1847ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar} 18572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1867ea429295a2eb31f2d9256c36c1ef53a195456acLajos MolnarAMessage::Item *AMessage::allocateItem(const char *name) { 1877ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar size_t len = strlen(name); 1887ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar size_t i = findItemIndex(name, len); 18972961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item; 19072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19172961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (i < mNumItems) { 19272961230a5890071bcca436eb5630172ce84ec41Andreas Huber item = &mItems[i]; 1937ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar freeItemValue(item); 19472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } else { 19572961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(mNumItems < kMaxNumItems); 19672961230a5890071bcca436eb5630172ce84ec41Andreas Huber i = mNumItems++; 19772961230a5890071bcca436eb5630172ce84ec41Andreas Huber item = &mItems[i]; 1987ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar item->setName(name, len); 19972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 20072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 20172961230a5890071bcca436eb5630172ce84ec41Andreas Huber return item; 20272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 20472961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst AMessage::Item *AMessage::findItem( 20572961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *name, Type type) const { 2067ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar size_t i = findItemIndex(name, strlen(name)); 2077ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar if (i < mNumItems) { 20872961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = &mItems[i]; 2097ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar return item->mType == type ? item : NULL; 21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 21172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 21272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return NULL; 21372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 21472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 215513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnarbool AMessage::contains(const char *name) const { 2167ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar size_t i = findItemIndex(name, strlen(name)); 2177ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar return i < mNumItems; 218513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar} 219513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar 22072961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define BASIC_TYPE(NAME,FIELDNAME,TYPENAME) \ 22172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::set##NAME(const char *name, TYPENAME value) { \ 22272961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); \ 22372961230a5890071bcca436eb5630172ce84ec41Andreas Huber \ 22472961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kType##NAME; \ 22572961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.FIELDNAME = value; \ 22672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} \ 22772961230a5890071bcca436eb5630172ce84ec41Andreas Huber \ 22872961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::find##NAME(const char *name, TYPENAME *value) const { \ 22972961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kType##NAME); \ 23072961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { \ 23172961230a5890071bcca436eb5630172ce84ec41Andreas Huber *value = item->u.FIELDNAME; \ 23272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; \ 23372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } \ 23472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; \ 23572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 23672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 23772961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int32,int32Value,int32_t) 23872961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int64,int64Value,int64_t) 23972961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Size,sizeValue,size_t) 24072961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Float,floatValue,float) 24172961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Double,doubleValue,double) 24272961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Pointer,ptrValue,void *) 24372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 24472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#undef BASIC_TYPE 24572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 24672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setString( 24772961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *name, const char *s, ssize_t len) { 24872961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 24972961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kTypeString; 25072961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.stringValue = new AString(s, len < 0 ? strlen(s) : len); 25172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 25272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 253513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnarvoid AMessage::setString( 254513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar const char *name, const AString &s) { 255513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar setString(name, s.c_str(), s.size()); 256513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar} 257513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar 2582d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObjectInternal( 2592d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber const char *name, const sp<RefBase> &obj, Type type) { 26072961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 2612d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber item->mType = type; 26272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26372961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (obj != NULL) { obj->incStrong(this); } 26472961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue = obj.get(); 26572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 26672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2672d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObject(const char *name, const sp<RefBase> &obj) { 2682d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber setObjectInternal(name, obj, kTypeObject); 2692d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber} 2702d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 2712d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setBuffer(const char *name, const sp<ABuffer> &buffer) { 2722d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber setObjectInternal(name, sp<RefBase>(buffer), kTypeBuffer); 2732d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber} 2742d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 27572961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setMessage(const char *name, const sp<AMessage> &obj) { 27672961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 27772961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kTypeMessage; 27872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 27972961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (obj != NULL) { obj->incStrong(this); } 28072961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue = obj.get(); 28172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 28272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28331e2508c75018145a8238925ff1a08cbde4e799aAndreas Hubervoid AMessage::setRect( 28431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const char *name, 28531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t left, int32_t top, int32_t right, int32_t bottom) { 28631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber Item *item = allocateItem(name); 28731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->mType = kTypeRect; 28831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 28931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mLeft = left; 29031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mTop = top; 29131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mRight = right; 29231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mBottom = bottom; 29331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 29431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 29572961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findString(const char *name, AString *value) const { 29672961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeString); 29772961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 29872961230a5890071bcca436eb5630172ce84ec41Andreas Huber *value = *item->u.stringValue; 29972961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 30072961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 30172961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 30272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 30372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 30472961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findObject(const char *name, sp<RefBase> *obj) const { 30572961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeObject); 30672961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 30772961230a5890071bcca436eb5630172ce84ec41Andreas Huber *obj = item->u.refValue; 30872961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 30972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 31072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 31172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 31272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3132d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huberbool AMessage::findBuffer(const char *name, sp<ABuffer> *buf) const { 3142d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber const Item *item = findItem(name, kTypeBuffer); 3152d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber if (item) { 3162d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber *buf = (ABuffer *)(item->u.refValue); 3172d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber return true; 3182d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber } 3192d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber return false; 3202d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber} 3212d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 32272961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findMessage(const char *name, sp<AMessage> *obj) const { 32372961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeMessage); 32472961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 32572961230a5890071bcca436eb5630172ce84ec41Andreas Huber *obj = static_cast<AMessage *>(item->u.refValue); 32672961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 32772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 32872961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 32972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 33072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 33131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huberbool AMessage::findRect( 33231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const char *name, 33331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const { 33431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const Item *item = findItem(name, kTypeRect); 33531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (item == NULL) { 33631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber return false; 33731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 33831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 33931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *left = item->u.rectValue.mLeft; 34031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *top = item->u.rectValue.mTop; 34131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *right = item->u.rectValue.mRight; 34231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *bottom = item->u.rectValue.mBottom; 34331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 34431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber return true; 34531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 34631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3475804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnarvoid AMessage::deliver() { 3485804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar sp<AHandler> handler = mHandler.promote(); 3495804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar if (handler == NULL) { 3505804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar ALOGW("failed to deliver message as target handler %d is gone.", mTarget); 3515804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar return; 3525804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar } 3535804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar 3545804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar handler->deliverMessage(this); 3555804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar} 3565804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar 3575804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnarstatus_t AMessage::post(int64_t delayUs) { 3585804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar sp<ALooper> looper = mLooper.promote(); 3595804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar if (looper == NULL) { 3605804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar ALOGW("failed to post message as target looper for handler %d is gone.", mTarget); 3615804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar return -ENOENT; 3625804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar } 3635804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar 3645804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar looper->post(this, delayUs); 3655804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar return OK; 36672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 36772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3685df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberstatus_t AMessage::postAndAwaitResponse(sp<AMessage> *response) { 3693f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<ALooper> looper = mLooper.promote(); 3703f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar if (looper == NULL) { 3713f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar ALOGW("failed to post message as target looper for handler %d is gone.", mTarget); 3723f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return -ENOENT; 3733f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar } 3743f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar 3753f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> token = looper->createReplyToken(); 3763f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar if (token == NULL) { 3773f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar ALOGE("failed to create reply token"); 3783f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return -ENOMEM; 3793f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar } 3803f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar setObject("replyID", token); 3813f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar 3823f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar looper->post(this, 0 /* delayUs */); 3833f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return looper->awaitResponse(token, response); 3845df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 3855df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 3863f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstatus_t AMessage::postReply(const sp<AReplyToken> &replyToken) { 3873f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar if (replyToken == NULL) { 3883f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar ALOGW("failed to post reply to a NULL token"); 3893f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return -ENOENT; 3903f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar } 3913f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<ALooper> looper = replyToken->getLooper(); 3923f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar if (looper == NULL) { 3933f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar ALOGW("failed to post reply as target looper is gone."); 3943f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return -ENOENT; 3953f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar } 3963f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return looper->postReply(replyToken, this); 3975df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 3985df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 3993f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarbool AMessage::senderAwaitsResponse(sp<AReplyToken> *replyToken) { 4003f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<RefBase> tmp; 4013f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar bool found = findObject("replyID", &tmp); 4025df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 4035df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber if (!found) { 4045df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber return false; 4055df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber } 4065df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 4073f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar *replyToken = static_cast<AReplyToken *>(tmp.get()); 4083f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar tmp.clear(); 4093f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar setObject("replyID", tmp); 4103f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar // TODO: delete Object instead of setting it to NULL 4115df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 4123f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return *replyToken != NULL; 4135df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 4145df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 41572961230a5890071bcca436eb5630172ce84ec41Andreas Hubersp<AMessage> AMessage::dup() const { 4165804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar sp<AMessage> msg = new AMessage(mWhat, mHandler.promote()); 41772961230a5890071bcca436eb5630172ce84ec41Andreas Huber msg->mNumItems = mNumItems; 41872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4197ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS 4207ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar { 4217ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar Mutex::Autolock _l(gLock); 4227ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar ++gDupCalls; 4237ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageDupItems += mNumItems; 4247ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar reportStats(); 4257ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar } 4267ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif 4277ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar 42872961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 42972961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *from = &mItems[i]; 43072961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *to = &msg->mItems[i]; 43172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4327ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar to->setName(from->mName, from->mNameLength); 43372961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->mType = from->mType; 43472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 43572961230a5890071bcca436eb5630172ce84ec41Andreas Huber switch (from->mType) { 43672961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeString: 43772961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 43872961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.stringValue = 43972961230a5890071bcca436eb5630172ce84ec41Andreas Huber new AString(*from->u.stringValue); 44072961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 44172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 44272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 44372961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeObject: 444bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber case kTypeBuffer: 44572961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 44672961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.refValue = from->u.refValue; 44772961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.refValue->incStrong(msg.get()); 44872961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 44972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 45072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4512c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber case kTypeMessage: 4522c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber { 4532c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber sp<AMessage> copy = 4542c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber static_cast<AMessage *>(from->u.refValue)->dup(); 4552c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 4562c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber to->u.refValue = copy.get(); 4572c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber to->u.refValue->incStrong(msg.get()); 4582c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber break; 4592c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } 4602c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 46172961230a5890071bcca436eb5630172ce84ec41Andreas Huber default: 46272961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 46372961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u = from->u; 46472961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 46572961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 46672961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 46772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 46872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 46972961230a5890071bcca436eb5630172ce84ec41Andreas Huber return msg; 47072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 47172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 472bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic void appendIndent(AString *s, int32_t indent) { 473bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber static const char kWhitespace[] = 474bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber " " 475bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber " "; 476bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 477bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber CHECK_LT((size_t)indent, sizeof(kWhitespace)); 478bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 479bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s->append(kWhitespace, indent); 480bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 481bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 482bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic bool isFourcc(uint32_t what) { 483bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber return isprint(what & 0xff) 484bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 8) & 0xff) 485bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 16) & 0xff) 486bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 24) & 0xff); 487bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 488bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 489bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas HuberAString AMessage::debugString(int32_t indent) const { 490bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber AString s = "AMessage(what = "; 491bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 492bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber AString tmp; 493bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber if (isFourcc(mWhat)) { 494a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 495bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "'%c%c%c%c'", 496bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)(mWhat >> 24), 497bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)((mWhat >> 16) & 0xff), 498bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)((mWhat >> 8) & 0xff), 499bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)(mWhat & 0xff)); 500bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } else { 501a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf("0x%08x", mWhat); 502bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 503bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 504bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 505bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber if (mTarget != 0) { 506a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf(", target = %d", mTarget); 507bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 508bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 509bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(") = {\n"); 510bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 511bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 512bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber const Item &item = mItems[i]; 513bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 514bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber switch (item.mType) { 515bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeInt32: 516a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 517bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "int32_t %s = %d", item.mName, item.u.int32Value); 518bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 519bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeInt64: 520a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 521bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "int64_t %s = %lld", item.mName, item.u.int64Value); 522bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 523bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeSize: 524a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 525bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "size_t %s = %d", item.mName, item.u.sizeValue); 526bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 527bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeFloat: 528a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 529bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "float %s = %f", item.mName, item.u.floatValue); 530bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 531bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeDouble: 532a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 533bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "double %s = %f", item.mName, item.u.doubleValue); 534bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 535bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypePointer: 536a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 537bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "void *%s = %p", item.mName, item.u.ptrValue); 538bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 539bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeString: 540a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 541bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "string %s = \"%s\"", 542bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.mName, 543bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.u.stringValue->c_str()); 544bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 545bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeObject: 546a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 547bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "RefBase *%s = %p", item.mName, item.u.refValue); 548bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 549bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber case kTypeBuffer: 550840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber { 551840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(item.u.refValue); 552840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 553cf31f1eecf46d599428e115dfee8dd47b76c83fcAndy Hung if (buffer != NULL && buffer->data() != NULL && buffer->size() <= 64) { 554a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf("Buffer %s = {\n", item.mName); 555840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber hexdump(buffer->data(), buffer->size(), indent + 4, &tmp); 556840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber appendIndent(&tmp, indent + 2); 557840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber tmp.append("}"); 558840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } else { 559a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 560840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber "Buffer *%s = %p", item.mName, buffer.get()); 561840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 562bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber break; 563840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 564bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeMessage: 565a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 566bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "AMessage %s = %s", 567bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.mName, 568bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber static_cast<AMessage *>( 569bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.u.refValue)->debugString( 570bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber indent + strlen(item.mName) + 14).c_str()); 571bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 572078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber case kTypeRect: 573a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 574078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber "Rect %s(%d, %d, %d, %d)", 575078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.mName, 576078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mLeft, 577078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mTop, 578078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mRight, 579078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mBottom); 580078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber break; 581bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber default: 582bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber TRESPASS(); 583bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 584bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 585bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber appendIndent(&s, indent); 586bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(" "); 587bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 588bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append("\n"); 589bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 590bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 591bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber appendIndent(&s, indent); 592bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append("}"); 593bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 594bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber return s; 595bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 596bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 59714acc736e336cbd6026df781d4f411e908831815Andreas Huber// static 59814acc736e336cbd6026df781d4f411e908831815Andreas Hubersp<AMessage> AMessage::FromParcel(const Parcel &parcel) { 59914acc736e336cbd6026df781d4f411e908831815Andreas Huber int32_t what = parcel.readInt32(); 6005804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar sp<AMessage> msg = new AMessage(); 6015804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar msg->setWhat(what); 60214acc736e336cbd6026df781d4f411e908831815Andreas Huber 60314acc736e336cbd6026df781d4f411e908831815Andreas Huber msg->mNumItems = static_cast<size_t>(parcel.readInt32()); 60414acc736e336cbd6026df781d4f411e908831815Andreas Huber for (size_t i = 0; i < msg->mNumItems; ++i) { 60514acc736e336cbd6026df781d4f411e908831815Andreas Huber Item *item = &msg->mItems[i]; 60614acc736e336cbd6026df781d4f411e908831815Andreas Huber 6077ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar const char *name = parcel.readCString(); 6087ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar item->setName(name, strlen(name)); 60914acc736e336cbd6026df781d4f411e908831815Andreas Huber item->mType = static_cast<Type>(parcel.readInt32()); 61014acc736e336cbd6026df781d4f411e908831815Andreas Huber 61114acc736e336cbd6026df781d4f411e908831815Andreas Huber switch (item->mType) { 61214acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt32: 61314acc736e336cbd6026df781d4f411e908831815Andreas Huber { 61414acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.int32Value = parcel.readInt32(); 61514acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 61614acc736e336cbd6026df781d4f411e908831815Andreas Huber } 61714acc736e336cbd6026df781d4f411e908831815Andreas Huber 61814acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt64: 61914acc736e336cbd6026df781d4f411e908831815Andreas Huber { 62014acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.int64Value = parcel.readInt64(); 62114acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 62214acc736e336cbd6026df781d4f411e908831815Andreas Huber } 62314acc736e336cbd6026df781d4f411e908831815Andreas Huber 62414acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeSize: 62514acc736e336cbd6026df781d4f411e908831815Andreas Huber { 62614acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.sizeValue = static_cast<size_t>(parcel.readInt32()); 62714acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 62814acc736e336cbd6026df781d4f411e908831815Andreas Huber } 62914acc736e336cbd6026df781d4f411e908831815Andreas Huber 63014acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeFloat: 63114acc736e336cbd6026df781d4f411e908831815Andreas Huber { 63214acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.floatValue = parcel.readFloat(); 63314acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 63414acc736e336cbd6026df781d4f411e908831815Andreas Huber } 63514acc736e336cbd6026df781d4f411e908831815Andreas Huber 63614acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeDouble: 63714acc736e336cbd6026df781d4f411e908831815Andreas Huber { 63814acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.doubleValue = parcel.readDouble(); 63914acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 64014acc736e336cbd6026df781d4f411e908831815Andreas Huber } 64114acc736e336cbd6026df781d4f411e908831815Andreas Huber 64214acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeString: 64314acc736e336cbd6026df781d4f411e908831815Andreas Huber { 64414acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.stringValue = new AString(parcel.readCString()); 64514acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 64614acc736e336cbd6026df781d4f411e908831815Andreas Huber } 64714acc736e336cbd6026df781d4f411e908831815Andreas Huber 64814acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeMessage: 64914acc736e336cbd6026df781d4f411e908831815Andreas Huber { 65014acc736e336cbd6026df781d4f411e908831815Andreas Huber sp<AMessage> subMsg = AMessage::FromParcel(parcel); 65114acc736e336cbd6026df781d4f411e908831815Andreas Huber subMsg->incStrong(msg.get()); 65214acc736e336cbd6026df781d4f411e908831815Andreas Huber 65314acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.refValue = subMsg.get(); 65414acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 65514acc736e336cbd6026df781d4f411e908831815Andreas Huber } 65614acc736e336cbd6026df781d4f411e908831815Andreas Huber 65714acc736e336cbd6026df781d4f411e908831815Andreas Huber default: 65814acc736e336cbd6026df781d4f411e908831815Andreas Huber { 65929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("This type of object cannot cross process boundaries."); 66014acc736e336cbd6026df781d4f411e908831815Andreas Huber TRESPASS(); 66114acc736e336cbd6026df781d4f411e908831815Andreas Huber } 66214acc736e336cbd6026df781d4f411e908831815Andreas Huber } 66314acc736e336cbd6026df781d4f411e908831815Andreas Huber } 66414acc736e336cbd6026df781d4f411e908831815Andreas Huber 66514acc736e336cbd6026df781d4f411e908831815Andreas Huber return msg; 66614acc736e336cbd6026df781d4f411e908831815Andreas Huber} 66714acc736e336cbd6026df781d4f411e908831815Andreas Huber 66814acc736e336cbd6026df781d4f411e908831815Andreas Hubervoid AMessage::writeToParcel(Parcel *parcel) const { 66914acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(mWhat)); 67014acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(mNumItems)); 67114acc736e336cbd6026df781d4f411e908831815Andreas Huber 67214acc736e336cbd6026df781d4f411e908831815Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 67314acc736e336cbd6026df781d4f411e908831815Andreas Huber const Item &item = mItems[i]; 67414acc736e336cbd6026df781d4f411e908831815Andreas Huber 67514acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeCString(item.mName); 67614acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(item.mType)); 67714acc736e336cbd6026df781d4f411e908831815Andreas Huber 67814acc736e336cbd6026df781d4f411e908831815Andreas Huber switch (item.mType) { 67914acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt32: 68014acc736e336cbd6026df781d4f411e908831815Andreas Huber { 68114acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(item.u.int32Value); 68214acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 68314acc736e336cbd6026df781d4f411e908831815Andreas Huber } 68414acc736e336cbd6026df781d4f411e908831815Andreas Huber 68514acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt64: 68614acc736e336cbd6026df781d4f411e908831815Andreas Huber { 68714acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt64(item.u.int64Value); 68814acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 68914acc736e336cbd6026df781d4f411e908831815Andreas Huber } 69014acc736e336cbd6026df781d4f411e908831815Andreas Huber 69114acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeSize: 69214acc736e336cbd6026df781d4f411e908831815Andreas Huber { 69314acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(item.u.sizeValue)); 69414acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 69514acc736e336cbd6026df781d4f411e908831815Andreas Huber } 69614acc736e336cbd6026df781d4f411e908831815Andreas Huber 69714acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeFloat: 69814acc736e336cbd6026df781d4f411e908831815Andreas Huber { 69914acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeFloat(item.u.floatValue); 70014acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 70114acc736e336cbd6026df781d4f411e908831815Andreas Huber } 70214acc736e336cbd6026df781d4f411e908831815Andreas Huber 70314acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeDouble: 70414acc736e336cbd6026df781d4f411e908831815Andreas Huber { 70514acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeDouble(item.u.doubleValue); 70614acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 70714acc736e336cbd6026df781d4f411e908831815Andreas Huber } 70814acc736e336cbd6026df781d4f411e908831815Andreas Huber 70914acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeString: 71014acc736e336cbd6026df781d4f411e908831815Andreas Huber { 71114acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeCString(item.u.stringValue->c_str()); 71214acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 71314acc736e336cbd6026df781d4f411e908831815Andreas Huber } 71414acc736e336cbd6026df781d4f411e908831815Andreas Huber 71514acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeMessage: 71614acc736e336cbd6026df781d4f411e908831815Andreas Huber { 71714acc736e336cbd6026df781d4f411e908831815Andreas Huber static_cast<AMessage *>(item.u.refValue)->writeToParcel(parcel); 71814acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 71914acc736e336cbd6026df781d4f411e908831815Andreas Huber } 72014acc736e336cbd6026df781d4f411e908831815Andreas Huber 72114acc736e336cbd6026df781d4f411e908831815Andreas Huber default: 72214acc736e336cbd6026df781d4f411e908831815Andreas Huber { 72329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("This type of object cannot cross process boundaries."); 72414acc736e336cbd6026df781d4f411e908831815Andreas Huber TRESPASS(); 72514acc736e336cbd6026df781d4f411e908831815Andreas Huber } 72614acc736e336cbd6026df781d4f411e908831815Andreas Huber } 72714acc736e336cbd6026df781d4f411e908831815Andreas Huber } 72814acc736e336cbd6026df781d4f411e908831815Andreas Huber} 72914acc736e336cbd6026df781d4f411e908831815Andreas Huber 7305778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t AMessage::countEntries() const { 7315778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mNumItems; 7325778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 7335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7345778822d86b0337407514b9372562b86edfa91cdAndreas Huberconst char *AMessage::getEntryNameAt(size_t index, Type *type) const { 7355778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mNumItems) { 7365778822d86b0337407514b9372562b86edfa91cdAndreas Huber *type = kTypeInt32; 7375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7385778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 7395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7415778822d86b0337407514b9372562b86edfa91cdAndreas Huber *type = mItems[index].mType; 7425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7435778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mItems[index].mName; 7445778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 7455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 74672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} // namespace android 747