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 21563a4d50f472ca67b3174ae51911091e44db6956eLajos Molnarbool AMessage::findAsFloat(const char *name, float *value) const { 21663a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar size_t i = findItemIndex(name, strlen(name)); 21763a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar if (i < mNumItems) { 21863a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar const Item *item = &mItems[i]; 21963a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar switch (item->mType) { 22063a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar case kTypeFloat: 22163a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar *value = item->u.floatValue; 22263a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar return true; 22363a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar case kTypeDouble: 22463a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar *value = (float)item->u.doubleValue; 22563a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar return true; 22663a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar case kTypeInt64: 22763a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar *value = (float)item->u.int64Value; 22863a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar return true; 22963a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar case kTypeInt32: 23063a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar *value = (float)item->u.int32Value; 23163a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar return true; 23263a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar case kTypeSize: 23363a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar *value = (float)item->u.sizeValue; 23463a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar return true; 23563a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar default: 23663a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar return false; 23763a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar } 23863a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar } 23963a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar return false; 24063a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar} 24163a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar 242513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnarbool AMessage::contains(const char *name) const { 2437ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar size_t i = findItemIndex(name, strlen(name)); 2447ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar return i < mNumItems; 245513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar} 246513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar 24772961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define BASIC_TYPE(NAME,FIELDNAME,TYPENAME) \ 24872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::set##NAME(const char *name, TYPENAME value) { \ 24972961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); \ 25072961230a5890071bcca436eb5630172ce84ec41Andreas Huber \ 25172961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kType##NAME; \ 25272961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.FIELDNAME = value; \ 25372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} \ 25472961230a5890071bcca436eb5630172ce84ec41Andreas Huber \ 25572961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::find##NAME(const char *name, TYPENAME *value) const { \ 25672961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kType##NAME); \ 25772961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { \ 25872961230a5890071bcca436eb5630172ce84ec41Andreas Huber *value = item->u.FIELDNAME; \ 25972961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; \ 26072961230a5890071bcca436eb5630172ce84ec41Andreas Huber } \ 26172961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; \ 26272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 26372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26472961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int32,int32Value,int32_t) 26572961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int64,int64Value,int64_t) 26672961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Size,sizeValue,size_t) 26772961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Float,floatValue,float) 26872961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Double,doubleValue,double) 26972961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Pointer,ptrValue,void *) 27072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 27172961230a5890071bcca436eb5630172ce84ec41Andreas Huber#undef BASIC_TYPE 27272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 27372961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setString( 27472961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *name, const char *s, ssize_t len) { 27572961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 27672961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kTypeString; 27772961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.stringValue = new AString(s, len < 0 ? strlen(s) : len); 27872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 27972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 280513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnarvoid AMessage::setString( 281513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar const char *name, const AString &s) { 282513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar setString(name, s.c_str(), s.size()); 283513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar} 284513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar 2852d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObjectInternal( 2862d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber const char *name, const sp<RefBase> &obj, Type type) { 28772961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 2882d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber item->mType = type; 28972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 29072961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (obj != NULL) { obj->incStrong(this); } 29172961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue = obj.get(); 29272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 29372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2942d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObject(const char *name, const sp<RefBase> &obj) { 2952d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber setObjectInternal(name, obj, kTypeObject); 2962d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber} 2972d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 2982d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setBuffer(const char *name, const sp<ABuffer> &buffer) { 2992d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber setObjectInternal(name, sp<RefBase>(buffer), kTypeBuffer); 3002d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber} 3012d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 30272961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setMessage(const char *name, const sp<AMessage> &obj) { 30372961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 30472961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kTypeMessage; 30572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 30672961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (obj != NULL) { obj->incStrong(this); } 30772961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue = obj.get(); 30872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 30972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 31031e2508c75018145a8238925ff1a08cbde4e799aAndreas Hubervoid AMessage::setRect( 31131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const char *name, 31231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t left, int32_t top, int32_t right, int32_t bottom) { 31331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber Item *item = allocateItem(name); 31431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->mType = kTypeRect; 31531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 31631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mLeft = left; 31731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mTop = top; 31831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mRight = right; 31931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mBottom = bottom; 32031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 32131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 32272961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findString(const char *name, AString *value) const { 32372961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeString); 32472961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 32572961230a5890071bcca436eb5630172ce84ec41Andreas Huber *value = *item->u.stringValue; 32672961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 32772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 32872961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 32972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 33072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 33172961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findObject(const char *name, sp<RefBase> *obj) const { 33272961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeObject); 33372961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 33472961230a5890071bcca436eb5630172ce84ec41Andreas Huber *obj = item->u.refValue; 33572961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 33672961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 33772961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 33872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 33972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3402d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huberbool AMessage::findBuffer(const char *name, sp<ABuffer> *buf) const { 3412d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber const Item *item = findItem(name, kTypeBuffer); 3422d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber if (item) { 3432d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber *buf = (ABuffer *)(item->u.refValue); 3442d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber return true; 3452d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber } 3462d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber return false; 3472d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber} 3482d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 34972961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findMessage(const char *name, sp<AMessage> *obj) const { 35072961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeMessage); 35172961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 35272961230a5890071bcca436eb5630172ce84ec41Andreas Huber *obj = static_cast<AMessage *>(item->u.refValue); 35372961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 35472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 35572961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 35672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 35772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 35831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huberbool AMessage::findRect( 35931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const char *name, 36031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const { 36131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const Item *item = findItem(name, kTypeRect); 36231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (item == NULL) { 36331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber return false; 36431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 36531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 36631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *left = item->u.rectValue.mLeft; 36731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *top = item->u.rectValue.mTop; 36831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *right = item->u.rectValue.mRight; 36931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *bottom = item->u.rectValue.mBottom; 37031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 37131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber return true; 37231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 37331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3745804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnarvoid AMessage::deliver() { 3755804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar sp<AHandler> handler = mHandler.promote(); 3765804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar if (handler == NULL) { 3775804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar ALOGW("failed to deliver message as target handler %d is gone.", mTarget); 3785804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar return; 3795804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar } 3805804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar 3815804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar handler->deliverMessage(this); 3825804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar} 3835804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar 3845804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnarstatus_t AMessage::post(int64_t delayUs) { 3855804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar sp<ALooper> looper = mLooper.promote(); 3865804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar if (looper == NULL) { 3875804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar ALOGW("failed to post message as target looper for handler %d is gone.", mTarget); 3885804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar return -ENOENT; 3895804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar } 3905804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar 3915804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar looper->post(this, delayUs); 3925804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar return OK; 39372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 39472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3955df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberstatus_t AMessage::postAndAwaitResponse(sp<AMessage> *response) { 3963f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<ALooper> looper = mLooper.promote(); 3973f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar if (looper == NULL) { 3983f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar ALOGW("failed to post message as target looper for handler %d is gone.", mTarget); 3993f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return -ENOENT; 4003f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar } 4013f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar 4023f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> token = looper->createReplyToken(); 4033f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar if (token == NULL) { 4043f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar ALOGE("failed to create reply token"); 4053f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return -ENOMEM; 4063f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar } 4073f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar setObject("replyID", token); 4083f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar 4093f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar looper->post(this, 0 /* delayUs */); 4103f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return looper->awaitResponse(token, response); 4115df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 4125df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 4133f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstatus_t AMessage::postReply(const sp<AReplyToken> &replyToken) { 4143f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar if (replyToken == NULL) { 4153f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar ALOGW("failed to post reply to a NULL token"); 4163f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return -ENOENT; 4173f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar } 4183f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<ALooper> looper = replyToken->getLooper(); 4193f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar if (looper == NULL) { 4203f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar ALOGW("failed to post reply as target looper is gone."); 4213f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return -ENOENT; 4223f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar } 4233f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return looper->postReply(replyToken, this); 4245df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 4255df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 4263f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarbool AMessage::senderAwaitsResponse(sp<AReplyToken> *replyToken) { 4273f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<RefBase> tmp; 4283f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar bool found = findObject("replyID", &tmp); 4295df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 4305df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber if (!found) { 4315df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber return false; 4325df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber } 4335df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 4343f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar *replyToken = static_cast<AReplyToken *>(tmp.get()); 4353f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar tmp.clear(); 4363f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar setObject("replyID", tmp); 4373f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar // TODO: delete Object instead of setting it to NULL 4385df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 4393f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return *replyToken != NULL; 4405df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 4415df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 44272961230a5890071bcca436eb5630172ce84ec41Andreas Hubersp<AMessage> AMessage::dup() const { 4435804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar sp<AMessage> msg = new AMessage(mWhat, mHandler.promote()); 44472961230a5890071bcca436eb5630172ce84ec41Andreas Huber msg->mNumItems = mNumItems; 44572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4467ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#ifdef DUMP_STATS 4477ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar { 4487ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar Mutex::Autolock _l(gLock); 4497ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar ++gDupCalls; 4507ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar gAverageDupItems += mNumItems; 4517ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar reportStats(); 4527ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar } 4537ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar#endif 4547ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar 45572961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 45672961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *from = &mItems[i]; 45772961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *to = &msg->mItems[i]; 45872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4597ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar to->setName(from->mName, from->mNameLength); 46072961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->mType = from->mType; 46172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 46272961230a5890071bcca436eb5630172ce84ec41Andreas Huber switch (from->mType) { 46372961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeString: 46472961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 46572961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.stringValue = 46672961230a5890071bcca436eb5630172ce84ec41Andreas Huber new AString(*from->u.stringValue); 46772961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 46872961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 46972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 47072961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeObject: 471bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber case kTypeBuffer: 47272961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 47372961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.refValue = from->u.refValue; 47472961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.refValue->incStrong(msg.get()); 47572961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 47672961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 47772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4782c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber case kTypeMessage: 4792c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber { 4802c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber sp<AMessage> copy = 4812c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber static_cast<AMessage *>(from->u.refValue)->dup(); 4822c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 4832c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber to->u.refValue = copy.get(); 4842c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber to->u.refValue->incStrong(msg.get()); 4852c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber break; 4862c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } 4872c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 48872961230a5890071bcca436eb5630172ce84ec41Andreas Huber default: 48972961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 49072961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u = from->u; 49172961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 49272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 49372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 49472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 49572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 49672961230a5890071bcca436eb5630172ce84ec41Andreas Huber return msg; 49772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 49872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 499bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic void appendIndent(AString *s, int32_t indent) { 500bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber static const char kWhitespace[] = 501bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber " " 502bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber " "; 503bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 504bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber CHECK_LT((size_t)indent, sizeof(kWhitespace)); 505bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 506bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s->append(kWhitespace, indent); 507bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 508bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 509bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic bool isFourcc(uint32_t what) { 510bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber return isprint(what & 0xff) 511bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 8) & 0xff) 512bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 16) & 0xff) 513bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 24) & 0xff); 514bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 515bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 516bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas HuberAString AMessage::debugString(int32_t indent) const { 517bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber AString s = "AMessage(what = "; 518bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 519bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber AString tmp; 520bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber if (isFourcc(mWhat)) { 521a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 522bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "'%c%c%c%c'", 523bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)(mWhat >> 24), 524bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)((mWhat >> 16) & 0xff), 525bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)((mWhat >> 8) & 0xff), 526bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)(mWhat & 0xff)); 527bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } else { 528a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf("0x%08x", mWhat); 529bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 530bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 531bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 532bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber if (mTarget != 0) { 533a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf(", target = %d", mTarget); 534bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 535bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 536bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(") = {\n"); 537bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 538bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 539bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber const Item &item = mItems[i]; 540bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 541bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber switch (item.mType) { 542bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeInt32: 543a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 544bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "int32_t %s = %d", item.mName, item.u.int32Value); 545bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 546bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeInt64: 547a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 548bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "int64_t %s = %lld", item.mName, item.u.int64Value); 549bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 550bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeSize: 551a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 552bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "size_t %s = %d", item.mName, item.u.sizeValue); 553bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 554bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeFloat: 555a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 556bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "float %s = %f", item.mName, item.u.floatValue); 557bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 558bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeDouble: 559a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 560bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "double %s = %f", item.mName, item.u.doubleValue); 561bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 562bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypePointer: 563a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 564bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "void *%s = %p", item.mName, item.u.ptrValue); 565bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 566bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeString: 567a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 568bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "string %s = \"%s\"", 569bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.mName, 570bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.u.stringValue->c_str()); 571bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 572bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeObject: 573a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 574bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "RefBase *%s = %p", item.mName, item.u.refValue); 575bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 576bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber case kTypeBuffer: 577840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber { 578840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(item.u.refValue); 579840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 580cf31f1eecf46d599428e115dfee8dd47b76c83fcAndy Hung if (buffer != NULL && buffer->data() != NULL && buffer->size() <= 64) { 581a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf("Buffer %s = {\n", item.mName); 582840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber hexdump(buffer->data(), buffer->size(), indent + 4, &tmp); 583840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber appendIndent(&tmp, indent + 2); 584840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber tmp.append("}"); 585840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } else { 586a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 587840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber "Buffer *%s = %p", item.mName, buffer.get()); 588840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 589bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber break; 590840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 591bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeMessage: 592a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 593bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "AMessage %s = %s", 594bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.mName, 595bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber static_cast<AMessage *>( 596bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.u.refValue)->debugString( 597bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber indent + strlen(item.mName) + 14).c_str()); 598bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 599078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber case kTypeRect: 600a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes tmp = AStringPrintf( 601078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber "Rect %s(%d, %d, %d, %d)", 602078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.mName, 603078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mLeft, 604078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mTop, 605078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mRight, 606078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mBottom); 607078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber break; 608bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber default: 609bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber TRESPASS(); 610bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 611bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 612bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber appendIndent(&s, indent); 613bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(" "); 614bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 615bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append("\n"); 616bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 617bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 618bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber appendIndent(&s, indent); 619bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append("}"); 620bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 621bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber return s; 622bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 623bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 62414acc736e336cbd6026df781d4f411e908831815Andreas Huber// static 6258dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasasp<AMessage> AMessage::FromParcel(const Parcel &parcel, size_t maxNestingLevel) { 62614acc736e336cbd6026df781d4f411e908831815Andreas Huber int32_t what = parcel.readInt32(); 6275804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar sp<AMessage> msg = new AMessage(); 6285804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar msg->setWhat(what); 62914acc736e336cbd6026df781d4f411e908831815Andreas Huber 63014acc736e336cbd6026df781d4f411e908831815Andreas Huber msg->mNumItems = static_cast<size_t>(parcel.readInt32()); 631ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker if (msg->mNumItems > kMaxNumItems) { 632ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker ALOGE("Too large number of items clipped."); 633ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker msg->mNumItems = kMaxNumItems; 634ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker } 635ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker 63614acc736e336cbd6026df781d4f411e908831815Andreas Huber for (size_t i = 0; i < msg->mNumItems; ++i) { 63714acc736e336cbd6026df781d4f411e908831815Andreas Huber Item *item = &msg->mItems[i]; 63814acc736e336cbd6026df781d4f411e908831815Andreas Huber 6397ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar const char *name = parcel.readCString(); 640ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker if (name == NULL) { 641ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker ALOGE("Failed reading name for an item. Parsing aborted."); 642ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker msg->mNumItems = i; 643ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker break; 644ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker } 64514acc736e336cbd6026df781d4f411e908831815Andreas Huber 646ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker item->mType = static_cast<Type>(parcel.readInt32()); 647ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker // setName() happens below so that we don't leak memory when parsing 648ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker // is aborted in the middle. 64914acc736e336cbd6026df781d4f411e908831815Andreas Huber switch (item->mType) { 65014acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt32: 65114acc736e336cbd6026df781d4f411e908831815Andreas Huber { 65214acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.int32Value = parcel.readInt32(); 65314acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 65414acc736e336cbd6026df781d4f411e908831815Andreas Huber } 65514acc736e336cbd6026df781d4f411e908831815Andreas Huber 65614acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt64: 65714acc736e336cbd6026df781d4f411e908831815Andreas Huber { 65814acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.int64Value = parcel.readInt64(); 65914acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 66014acc736e336cbd6026df781d4f411e908831815Andreas Huber } 66114acc736e336cbd6026df781d4f411e908831815Andreas Huber 66214acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeSize: 66314acc736e336cbd6026df781d4f411e908831815Andreas Huber { 66414acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.sizeValue = static_cast<size_t>(parcel.readInt32()); 66514acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 66614acc736e336cbd6026df781d4f411e908831815Andreas Huber } 66714acc736e336cbd6026df781d4f411e908831815Andreas Huber 66814acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeFloat: 66914acc736e336cbd6026df781d4f411e908831815Andreas Huber { 67014acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.floatValue = parcel.readFloat(); 67114acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 67214acc736e336cbd6026df781d4f411e908831815Andreas Huber } 67314acc736e336cbd6026df781d4f411e908831815Andreas Huber 67414acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeDouble: 67514acc736e336cbd6026df781d4f411e908831815Andreas Huber { 67614acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.doubleValue = parcel.readDouble(); 67714acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 67814acc736e336cbd6026df781d4f411e908831815Andreas Huber } 67914acc736e336cbd6026df781d4f411e908831815Andreas Huber 68014acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeString: 68114acc736e336cbd6026df781d4f411e908831815Andreas Huber { 682ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker const char *stringValue = parcel.readCString(); 683ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker if (stringValue == NULL) { 684ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker ALOGE("Failed reading string value from a parcel. " 685ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker "Parsing aborted."); 686ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker msg->mNumItems = i; 687ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker continue; 688ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker // The loop will terminate subsequently. 689ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker } else { 690ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker item->u.stringValue = new AString(stringValue); 691ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker } 69214acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 69314acc736e336cbd6026df781d4f411e908831815Andreas Huber } 69414acc736e336cbd6026df781d4f411e908831815Andreas Huber 69514acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeMessage: 69614acc736e336cbd6026df781d4f411e908831815Andreas Huber { 6978dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa if (maxNestingLevel == 0) { 6988dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa ALOGE("Too many levels of AMessage nesting."); 6998dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa return NULL; 7008dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa } 7018dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa sp<AMessage> subMsg = AMessage::FromParcel( 7028dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa parcel, 7038dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa maxNestingLevel - 1); 7048dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa if (subMsg == NULL) { 7058dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // This condition will be triggered when there exists an 7068dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // object that cannot cross process boundaries or when the 7078dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // level of nested AMessage is too deep. 7088dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa return NULL; 7098dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa } 71014acc736e336cbd6026df781d4f411e908831815Andreas Huber subMsg->incStrong(msg.get()); 71114acc736e336cbd6026df781d4f411e908831815Andreas Huber 71214acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.refValue = subMsg.get(); 71314acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 71414acc736e336cbd6026df781d4f411e908831815Andreas Huber } 71514acc736e336cbd6026df781d4f411e908831815Andreas Huber 71614acc736e336cbd6026df781d4f411e908831815Andreas Huber default: 71714acc736e336cbd6026df781d4f411e908831815Andreas Huber { 71829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("This type of object cannot cross process boundaries."); 7198dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa return NULL; 72014acc736e336cbd6026df781d4f411e908831815Andreas Huber } 72114acc736e336cbd6026df781d4f411e908831815Andreas Huber } 722ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker 723ddd346c7d54519e056b5b8b6d58b647770b3bb01Flanker item->setName(name, strlen(name)); 72414acc736e336cbd6026df781d4f411e908831815Andreas Huber } 72514acc736e336cbd6026df781d4f411e908831815Andreas Huber 72614acc736e336cbd6026df781d4f411e908831815Andreas Huber return msg; 72714acc736e336cbd6026df781d4f411e908831815Andreas Huber} 72814acc736e336cbd6026df781d4f411e908831815Andreas Huber 72914acc736e336cbd6026df781d4f411e908831815Andreas Hubervoid AMessage::writeToParcel(Parcel *parcel) const { 73014acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(mWhat)); 73114acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(mNumItems)); 73214acc736e336cbd6026df781d4f411e908831815Andreas Huber 73314acc736e336cbd6026df781d4f411e908831815Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 73414acc736e336cbd6026df781d4f411e908831815Andreas Huber const Item &item = mItems[i]; 73514acc736e336cbd6026df781d4f411e908831815Andreas Huber 73614acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeCString(item.mName); 73714acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(item.mType)); 73814acc736e336cbd6026df781d4f411e908831815Andreas Huber 73914acc736e336cbd6026df781d4f411e908831815Andreas Huber switch (item.mType) { 74014acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt32: 74114acc736e336cbd6026df781d4f411e908831815Andreas Huber { 74214acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(item.u.int32Value); 74314acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 74414acc736e336cbd6026df781d4f411e908831815Andreas Huber } 74514acc736e336cbd6026df781d4f411e908831815Andreas Huber 74614acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt64: 74714acc736e336cbd6026df781d4f411e908831815Andreas Huber { 74814acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt64(item.u.int64Value); 74914acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 75014acc736e336cbd6026df781d4f411e908831815Andreas Huber } 75114acc736e336cbd6026df781d4f411e908831815Andreas Huber 75214acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeSize: 75314acc736e336cbd6026df781d4f411e908831815Andreas Huber { 75414acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(item.u.sizeValue)); 75514acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 75614acc736e336cbd6026df781d4f411e908831815Andreas Huber } 75714acc736e336cbd6026df781d4f411e908831815Andreas Huber 75814acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeFloat: 75914acc736e336cbd6026df781d4f411e908831815Andreas Huber { 76014acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeFloat(item.u.floatValue); 76114acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 76214acc736e336cbd6026df781d4f411e908831815Andreas Huber } 76314acc736e336cbd6026df781d4f411e908831815Andreas Huber 76414acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeDouble: 76514acc736e336cbd6026df781d4f411e908831815Andreas Huber { 76614acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeDouble(item.u.doubleValue); 76714acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 76814acc736e336cbd6026df781d4f411e908831815Andreas Huber } 76914acc736e336cbd6026df781d4f411e908831815Andreas Huber 77014acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeString: 77114acc736e336cbd6026df781d4f411e908831815Andreas Huber { 77214acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeCString(item.u.stringValue->c_str()); 77314acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 77414acc736e336cbd6026df781d4f411e908831815Andreas Huber } 77514acc736e336cbd6026df781d4f411e908831815Andreas Huber 77614acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeMessage: 77714acc736e336cbd6026df781d4f411e908831815Andreas Huber { 77814acc736e336cbd6026df781d4f411e908831815Andreas Huber static_cast<AMessage *>(item.u.refValue)->writeToParcel(parcel); 77914acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 78014acc736e336cbd6026df781d4f411e908831815Andreas Huber } 78114acc736e336cbd6026df781d4f411e908831815Andreas Huber 78214acc736e336cbd6026df781d4f411e908831815Andreas Huber default: 78314acc736e336cbd6026df781d4f411e908831815Andreas Huber { 78429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("This type of object cannot cross process boundaries."); 78514acc736e336cbd6026df781d4f411e908831815Andreas Huber TRESPASS(); 78614acc736e336cbd6026df781d4f411e908831815Andreas Huber } 78714acc736e336cbd6026df781d4f411e908831815Andreas Huber } 78814acc736e336cbd6026df781d4f411e908831815Andreas Huber } 78914acc736e336cbd6026df781d4f411e908831815Andreas Huber} 79014acc736e336cbd6026df781d4f411e908831815Andreas Huber 7911734c7d01c1567568ced29398b23abd601fd44cbLajos Molnarsp<AMessage> AMessage::changesFrom(const sp<const AMessage> &other, bool deep) const { 7921734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (other == NULL) { 7931734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar return const_cast<AMessage*>(this); 7941734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 7951734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar 7961734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar sp<AMessage> diff = new AMessage; 7971734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (mWhat != other->mWhat) { 7981734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar diff->setWhat(mWhat); 7991734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8001734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (mHandler != other->mHandler) { 8011734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar diff->setTarget(mHandler.promote()); 8021734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8031734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar 8041734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar for (size_t i = 0; i < mNumItems; ++i) { 8051734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar const Item &item = mItems[i]; 8061734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar const Item *oitem = other->findItem(item.mName, item.mType); 8071734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar switch (item.mType) { 8081734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar case kTypeInt32: 8091734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (oitem == NULL || item.u.int32Value != oitem->u.int32Value) { 8101734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar diff->setInt32(item.mName, item.u.int32Value); 8111734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8121734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar break; 8131734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar 8141734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar case kTypeInt64: 8151734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (oitem == NULL || item.u.int64Value != oitem->u.int64Value) { 8161734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar diff->setInt64(item.mName, item.u.int64Value); 8171734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8181734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar break; 8191734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar 8201734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar case kTypeSize: 8211734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (oitem == NULL || item.u.sizeValue != oitem->u.sizeValue) { 8221734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar diff->setSize(item.mName, item.u.sizeValue); 8231734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8241734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar break; 8251734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar 8261734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar case kTypeFloat: 8271734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (oitem == NULL || item.u.floatValue != oitem->u.floatValue) { 8281734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar diff->setFloat(item.mName, item.u.sizeValue); 8291734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8301734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar break; 8311734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar 8321734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar case kTypeDouble: 8331734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (oitem == NULL || item.u.doubleValue != oitem->u.doubleValue) { 8341734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar diff->setDouble(item.mName, item.u.sizeValue); 8351734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8361734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar break; 8371734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar 8381734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar case kTypeString: 8391734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (oitem == NULL || *item.u.stringValue != *oitem->u.stringValue) { 8401734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar diff->setString(item.mName, *item.u.stringValue); 8411734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8421734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar break; 8431734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar 8441734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar case kTypeRect: 8451734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (oitem == NULL || memcmp(&item.u.rectValue, &oitem->u.rectValue, sizeof(Rect))) { 8461734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar diff->setRect( 8471734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar item.mName, item.u.rectValue.mLeft, item.u.rectValue.mTop, 8481734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar item.u.rectValue.mRight, item.u.rectValue.mBottom); 8491734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8501734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar break; 8511734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar 8521734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar case kTypePointer: 8531734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (oitem == NULL || item.u.ptrValue != oitem->u.ptrValue) { 8541734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar diff->setPointer(item.mName, item.u.ptrValue); 8551734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8561734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar break; 8571734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar 8581734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar case kTypeBuffer: 8591734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar { 8601734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar sp<ABuffer> myBuf = static_cast<ABuffer *>(item.u.refValue); 8611734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (myBuf == NULL) { 8621734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (oitem == NULL || oitem->u.refValue != NULL) { 8631734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar diff->setBuffer(item.mName, NULL); 8641734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8651734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar break; 8661734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8671734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar sp<ABuffer> oBuf = oitem == NULL ? NULL : static_cast<ABuffer *>(oitem->u.refValue); 8681734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (oBuf == NULL 8691734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar || myBuf->size() != oBuf->size() 8701734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar || (!myBuf->data() ^ !oBuf->data()) // data nullness differs 8711734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar || (myBuf->data() && memcmp(myBuf->data(), oBuf->data(), myBuf->size()))) { 8721734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar diff->setBuffer(item.mName, myBuf); 8731734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8741734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar break; 8751734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8761734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar 8771734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar case kTypeMessage: 8781734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar { 8791734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar sp<AMessage> myMsg = static_cast<AMessage *>(item.u.refValue); 8801734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (myMsg == NULL) { 8811734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (oitem == NULL || oitem->u.refValue != NULL) { 8821734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar diff->setMessage(item.mName, NULL); 8831734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8841734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar break; 8851734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8861734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar sp<AMessage> oMsg = 8871734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar oitem == NULL ? NULL : static_cast<AMessage *>(oitem->u.refValue); 8881734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar sp<AMessage> changes = myMsg->changesFrom(oMsg, deep); 8891734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (changes->countEntries()) { 8901734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar diff->setMessage(item.mName, deep ? changes : myMsg); 8911734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8921734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar break; 8931734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8941734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar 8951734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar case kTypeObject: 8961734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar if (oitem == NULL || item.u.refValue != oitem->u.refValue) { 8971734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar diff->setObject(item.mName, item.u.refValue); 8981734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 8991734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar break; 9001734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar 9011734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar default: 9021734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar { 9031734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar ALOGE("Unknown type %d", item.mType); 9041734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar TRESPASS(); 9051734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 9061734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 9071734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar } 9081734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar return diff; 9091734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar} 9101734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar 9115778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t AMessage::countEntries() const { 9125778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mNumItems; 9135778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 9145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9155778822d86b0337407514b9372562b86edfa91cdAndreas Huberconst char *AMessage::getEntryNameAt(size_t index, Type *type) const { 9165778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mNumItems) { 9175778822d86b0337407514b9372562b86edfa91cdAndreas Huber *type = kTypeInt32; 9185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9195778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 9205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9225778822d86b0337407514b9372562b86edfa91cdAndreas Huber *type = mItems[index].mType; 9235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9245778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mItems[index].mName; 9255778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 9265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 92772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} // namespace android 928