AMessage.cpp revision 5778822d86b0337407514b9372562b86edfa91cd
172961230a5890071bcca436eb5630172ce84ec41Andreas Huber/* 272961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Copyright (C) 2010 The Android Open Source Project 372961230a5890071bcca436eb5630172ce84ec41Andreas Huber * 472961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 572961230a5890071bcca436eb5630172ce84ec41Andreas Huber * you may not use this file except in compliance with the License. 672961230a5890071bcca436eb5630172ce84ec41Andreas Huber * You may obtain a copy of the License at 772961230a5890071bcca436eb5630172ce84ec41Andreas Huber * 872961230a5890071bcca436eb5630172ce84ec41Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 972961230a5890071bcca436eb5630172ce84ec41Andreas Huber * 1072961230a5890071bcca436eb5630172ce84ec41Andreas Huber * Unless required by applicable law or agreed to in writing, software 1172961230a5890071bcca436eb5630172ce84ec41Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1272961230a5890071bcca436eb5630172ce84ec41Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1372961230a5890071bcca436eb5630172ce84ec41Andreas Huber * See the License for the specific language governing permissions and 1472961230a5890071bcca436eb5630172ce84ec41Andreas Huber * limitations under the License. 1572961230a5890071bcca436eb5630172ce84ec41Andreas Huber */ 1672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1772961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AMessage.h" 1872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber#include <ctype.h> 20bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 2172961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AAtomizer.h" 2272961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ADebug.h" 2372961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ALooperRoster.h" 2472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AString.h" 2572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2614acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <binder/Parcel.h> 2714acc736e336cbd6026df781d4f411e908831815Andreas Huber 2872961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android { 2972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 305df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberextern ALooperRoster gLooperRoster; 315df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 3272961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::AMessage(uint32_t what, ALooper::handler_id target) 3372961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mWhat(what), 3472961230a5890071bcca436eb5630172ce84ec41Andreas Huber mTarget(target), 3572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mNumItems(0) { 3672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 3772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3872961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::~AMessage() { 3972961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 4072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 4172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4272961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setWhat(uint32_t what) { 4372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mWhat = what; 4472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 4572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4672961230a5890071bcca436eb5630172ce84ec41Andreas Huberuint32_t AMessage::what() const { 4772961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mWhat; 4872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 4972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setTarget(ALooper::handler_id handlerID) { 5172961230a5890071bcca436eb5630172ce84ec41Andreas Huber mTarget = handlerID; 5272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 5372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5472961230a5890071bcca436eb5630172ce84ec41Andreas HuberALooper::handler_id AMessage::target() const { 5572961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mTarget; 5672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 5772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::clear() { 5972961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 6072961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = &mItems[i]; 6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber freeItem(item); 6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mNumItems = 0; 6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::freeItem(Item *item) { 6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber switch (item->mType) { 6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeString: 6972961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber delete item->u.stringValue; 7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeObject: 7572961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeMessage: 7672961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 7772961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item->u.refValue != NULL) { 7872961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue->decStrong(this); 7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 8072961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 8172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber default: 8472961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 8572961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 8772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8872961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::Item *AMessage::allocateItem(const char *name) { 8972961230a5890071bcca436eb5630172ce84ec41Andreas Huber name = AAtomizer::Atomize(name); 9072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9172961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t i = 0; 9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber while (i < mNumItems && mItems[i].mName != name) { 9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber ++i; 9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item; 9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (i < mNumItems) { 9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber item = &mItems[i]; 10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber freeItem(item); 10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } else { 10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(mNumItems < kMaxNumItems); 10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber i = mNumItems++; 10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber item = &mItems[i]; 10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10672961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mName = name; 10772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10972961230a5890071bcca436eb5630172ce84ec41Andreas Huber return item; 11072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 11172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11272961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst AMessage::Item *AMessage::findItem( 11372961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *name, Type type) const { 11472961230a5890071bcca436eb5630172ce84ec41Andreas Huber name = AAtomizer::Atomize(name); 11572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11672961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = &mItems[i]; 11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item->mName == name) { 12072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return item->mType == type ? item : NULL; 12172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 12272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 12372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return NULL; 12572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 12672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12772961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define BASIC_TYPE(NAME,FIELDNAME,TYPENAME) \ 12872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::set##NAME(const char *name, TYPENAME value) { \ 12972961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); \ 13072961230a5890071bcca436eb5630172ce84ec41Andreas Huber \ 13172961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kType##NAME; \ 13272961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.FIELDNAME = value; \ 13372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} \ 13472961230a5890071bcca436eb5630172ce84ec41Andreas Huber \ 13572961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::find##NAME(const char *name, TYPENAME *value) const { \ 13672961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kType##NAME); \ 13772961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { \ 13872961230a5890071bcca436eb5630172ce84ec41Andreas Huber *value = item->u.FIELDNAME; \ 13972961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; \ 14072961230a5890071bcca436eb5630172ce84ec41Andreas Huber } \ 14172961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; \ 14272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 14372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 14472961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int32,int32Value,int32_t) 14572961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int64,int64Value,int64_t) 14672961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Size,sizeValue,size_t) 14772961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Float,floatValue,float) 14872961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Double,doubleValue,double) 14972961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Pointer,ptrValue,void *) 15072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15172961230a5890071bcca436eb5630172ce84ec41Andreas Huber#undef BASIC_TYPE 15272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15372961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setString( 15472961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *name, const char *s, ssize_t len) { 15572961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 15672961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kTypeString; 15772961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.stringValue = new AString(s, len < 0 ? strlen(s) : len); 15872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 15972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setObject(const char *name, const sp<RefBase> &obj) { 16172961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 16272961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kTypeObject; 16372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16472961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (obj != NULL) { obj->incStrong(this); } 16572961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue = obj.get(); 16672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 16772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setMessage(const char *name, const sp<AMessage> &obj) { 16972961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 17072961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kTypeMessage; 17172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 17272961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (obj != NULL) { obj->incStrong(this); } 17372961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue = obj.get(); 17472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 17572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 17631e2508c75018145a8238925ff1a08cbde4e799aAndreas Hubervoid AMessage::setRect( 17731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const char *name, 17831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t left, int32_t top, int32_t right, int32_t bottom) { 17931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber Item *item = allocateItem(name); 18031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->mType = kTypeRect; 18131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 18231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mLeft = left; 18331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mTop = top; 18431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mRight = right; 18531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mBottom = bottom; 18631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 18731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 18872961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findString(const char *name, AString *value) const { 18972961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeString); 19072961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 19172961230a5890071bcca436eb5630172ce84ec41Andreas Huber *value = *item->u.stringValue; 19272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 19372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 19472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 19572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 19672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 19772961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findObject(const char *name, sp<RefBase> *obj) const { 19872961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeObject); 19972961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 20072961230a5890071bcca436eb5630172ce84ec41Andreas Huber *obj = item->u.refValue; 20172961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 20272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 20472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 20572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 20672961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findMessage(const char *name, sp<AMessage> *obj) const { 20772961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeMessage); 20872961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 20972961230a5890071bcca436eb5630172ce84ec41Andreas Huber *obj = static_cast<AMessage *>(item->u.refValue); 21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 21172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 21272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 21372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 21472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 21531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huberbool AMessage::findRect( 21631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const char *name, 21731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const { 21831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const Item *item = findItem(name, kTypeRect); 21931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (item == NULL) { 22031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber return false; 22131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 22231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 22331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *left = item->u.rectValue.mLeft; 22431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *top = item->u.rectValue.mTop; 22531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *right = item->u.rectValue.mRight; 22631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *bottom = item->u.rectValue.mBottom; 22731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 22831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber return true; 22931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 23031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 23172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::post(int64_t delayUs) { 23272961230a5890071bcca436eb5630172ce84ec41Andreas Huber gLooperRoster.postMessage(this, delayUs); 23372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 23472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2355df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberstatus_t AMessage::postAndAwaitResponse(sp<AMessage> *response) { 2365df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber return gLooperRoster.postAndAwaitResponse(this, response); 2375df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 2385df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 2395df775d2f509c76e76a46615fca83dba95299f6eAndreas Hubervoid AMessage::postReply(uint32_t replyID) { 2405df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber gLooperRoster.postReply(replyID, this); 2415df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 2425df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 2435df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberbool AMessage::senderAwaitsResponse(uint32_t *replyID) const { 2445df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber int32_t tmp; 2455df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber bool found = findInt32("replyID", &tmp); 2465df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 2475df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber if (!found) { 2485df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber return false; 2495df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber } 2505df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 2515df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber *replyID = static_cast<uint32_t>(tmp); 2525df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 2535df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber return true; 2545df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 2555df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 25672961230a5890071bcca436eb5630172ce84ec41Andreas Hubersp<AMessage> AMessage::dup() const { 25772961230a5890071bcca436eb5630172ce84ec41Andreas Huber sp<AMessage> msg = new AMessage(mWhat, mTarget); 25872961230a5890071bcca436eb5630172ce84ec41Andreas Huber msg->mNumItems = mNumItems; 25972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26072961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 26172961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *from = &mItems[i]; 26272961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *to = &msg->mItems[i]; 26372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26472961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->mName = from->mName; 26572961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->mType = from->mType; 26672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 26772961230a5890071bcca436eb5630172ce84ec41Andreas Huber switch (from->mType) { 26872961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeString: 26972961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 27072961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.stringValue = 27172961230a5890071bcca436eb5630172ce84ec41Andreas Huber new AString(*from->u.stringValue); 27272961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 27372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 27472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 27572961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeObject: 27672961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 27772961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.refValue = from->u.refValue; 27872961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.refValue->incStrong(msg.get()); 27972961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 28072961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 28172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2822c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber case kTypeMessage: 2832c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber { 2842c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber sp<AMessage> copy = 2852c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber static_cast<AMessage *>(from->u.refValue)->dup(); 2862c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 2872c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber to->u.refValue = copy.get(); 2882c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber to->u.refValue->incStrong(msg.get()); 2892c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber break; 2902c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } 2912c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 29272961230a5890071bcca436eb5630172ce84ec41Andreas Huber default: 29372961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 29472961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u = from->u; 29572961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 29672961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 29772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 29872961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 29972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 30072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return msg; 30172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 30272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 303bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic void appendIndent(AString *s, int32_t indent) { 304bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber static const char kWhitespace[] = 305bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber " " 306bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber " "; 307bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 308bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber CHECK_LT((size_t)indent, sizeof(kWhitespace)); 309bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 310bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s->append(kWhitespace, indent); 311bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 312bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 313bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic bool isFourcc(uint32_t what) { 314bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber return isprint(what & 0xff) 315bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 8) & 0xff) 316bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 16) & 0xff) 317bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 24) & 0xff); 318bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 319bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 320bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas HuberAString AMessage::debugString(int32_t indent) const { 321bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber AString s = "AMessage(what = "; 322bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 323bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber AString tmp; 324bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber if (isFourcc(mWhat)) { 325bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 326bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "'%c%c%c%c'", 327bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)(mWhat >> 24), 328bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)((mWhat >> 16) & 0xff), 329bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)((mWhat >> 8) & 0xff), 330bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)(mWhat & 0xff)); 331bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } else { 332bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf("0x%08x", mWhat); 333bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 334bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 335bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 336bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber if (mTarget != 0) { 337bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf(", target = %d", mTarget); 338bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 339bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 340bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(") = {\n"); 341bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 342bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 343bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber const Item &item = mItems[i]; 344bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 345bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber switch (item.mType) { 346bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeInt32: 347bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 348bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "int32_t %s = %d", item.mName, item.u.int32Value); 349bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 350bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeInt64: 351bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 352bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "int64_t %s = %lld", item.mName, item.u.int64Value); 353bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 354bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeSize: 355bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 356bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "size_t %s = %d", item.mName, item.u.sizeValue); 357bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 358bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeFloat: 359bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 360bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "float %s = %f", item.mName, item.u.floatValue); 361bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 362bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeDouble: 363bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 364bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "double %s = %f", item.mName, item.u.doubleValue); 365bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 366bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypePointer: 367bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 368bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "void *%s = %p", item.mName, item.u.ptrValue); 369bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 370bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeString: 371bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 372bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "string %s = \"%s\"", 373bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.mName, 374bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.u.stringValue->c_str()); 375bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 376bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeObject: 377bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 378bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "RefBase *%s = %p", item.mName, item.u.refValue); 379bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 380bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeMessage: 381bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 382bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "AMessage %s = %s", 383bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.mName, 384bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber static_cast<AMessage *>( 385bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.u.refValue)->debugString( 386bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber indent + strlen(item.mName) + 14).c_str()); 387bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 388078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber case kTypeRect: 389078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber tmp = StringPrintf( 390078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber "Rect %s(%d, %d, %d, %d)", 391078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.mName, 392078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mLeft, 393078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mTop, 394078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mRight, 395078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mBottom); 396078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber break; 397bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber default: 398bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber TRESPASS(); 399bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 400bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 401bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber appendIndent(&s, indent); 402bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(" "); 403bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 404bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append("\n"); 405bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 406bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 407bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber appendIndent(&s, indent); 408bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append("}"); 409bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 410bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber return s; 411bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 412bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 41314acc736e336cbd6026df781d4f411e908831815Andreas Huber// static 41414acc736e336cbd6026df781d4f411e908831815Andreas Hubersp<AMessage> AMessage::FromParcel(const Parcel &parcel) { 41514acc736e336cbd6026df781d4f411e908831815Andreas Huber int32_t what = parcel.readInt32(); 41614acc736e336cbd6026df781d4f411e908831815Andreas Huber sp<AMessage> msg = new AMessage(what); 41714acc736e336cbd6026df781d4f411e908831815Andreas Huber 41814acc736e336cbd6026df781d4f411e908831815Andreas Huber msg->mNumItems = static_cast<size_t>(parcel.readInt32()); 41914acc736e336cbd6026df781d4f411e908831815Andreas Huber 42014acc736e336cbd6026df781d4f411e908831815Andreas Huber for (size_t i = 0; i < msg->mNumItems; ++i) { 42114acc736e336cbd6026df781d4f411e908831815Andreas Huber Item *item = &msg->mItems[i]; 42214acc736e336cbd6026df781d4f411e908831815Andreas Huber 42314acc736e336cbd6026df781d4f411e908831815Andreas Huber item->mName = AAtomizer::Atomize(parcel.readCString()); 42414acc736e336cbd6026df781d4f411e908831815Andreas Huber item->mType = static_cast<Type>(parcel.readInt32()); 42514acc736e336cbd6026df781d4f411e908831815Andreas Huber 42614acc736e336cbd6026df781d4f411e908831815Andreas Huber switch (item->mType) { 42714acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt32: 42814acc736e336cbd6026df781d4f411e908831815Andreas Huber { 42914acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.int32Value = parcel.readInt32(); 43014acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 43114acc736e336cbd6026df781d4f411e908831815Andreas Huber } 43214acc736e336cbd6026df781d4f411e908831815Andreas Huber 43314acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt64: 43414acc736e336cbd6026df781d4f411e908831815Andreas Huber { 43514acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.int64Value = parcel.readInt64(); 43614acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 43714acc736e336cbd6026df781d4f411e908831815Andreas Huber } 43814acc736e336cbd6026df781d4f411e908831815Andreas Huber 43914acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeSize: 44014acc736e336cbd6026df781d4f411e908831815Andreas Huber { 44114acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.sizeValue = static_cast<size_t>(parcel.readInt32()); 44214acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 44314acc736e336cbd6026df781d4f411e908831815Andreas Huber } 44414acc736e336cbd6026df781d4f411e908831815Andreas Huber 44514acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeFloat: 44614acc736e336cbd6026df781d4f411e908831815Andreas Huber { 44714acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.floatValue = parcel.readFloat(); 44814acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 44914acc736e336cbd6026df781d4f411e908831815Andreas Huber } 45014acc736e336cbd6026df781d4f411e908831815Andreas Huber 45114acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeDouble: 45214acc736e336cbd6026df781d4f411e908831815Andreas Huber { 45314acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.doubleValue = parcel.readDouble(); 45414acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 45514acc736e336cbd6026df781d4f411e908831815Andreas Huber } 45614acc736e336cbd6026df781d4f411e908831815Andreas Huber 45714acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeString: 45814acc736e336cbd6026df781d4f411e908831815Andreas Huber { 45914acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.stringValue = new AString(parcel.readCString()); 46014acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 46114acc736e336cbd6026df781d4f411e908831815Andreas Huber } 46214acc736e336cbd6026df781d4f411e908831815Andreas Huber 46314acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeMessage: 46414acc736e336cbd6026df781d4f411e908831815Andreas Huber { 46514acc736e336cbd6026df781d4f411e908831815Andreas Huber sp<AMessage> subMsg = AMessage::FromParcel(parcel); 46614acc736e336cbd6026df781d4f411e908831815Andreas Huber subMsg->incStrong(msg.get()); 46714acc736e336cbd6026df781d4f411e908831815Andreas Huber 46814acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.refValue = subMsg.get(); 46914acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 47014acc736e336cbd6026df781d4f411e908831815Andreas Huber } 47114acc736e336cbd6026df781d4f411e908831815Andreas Huber 47214acc736e336cbd6026df781d4f411e908831815Andreas Huber default: 47314acc736e336cbd6026df781d4f411e908831815Andreas Huber { 47429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("This type of object cannot cross process boundaries."); 47514acc736e336cbd6026df781d4f411e908831815Andreas Huber TRESPASS(); 47614acc736e336cbd6026df781d4f411e908831815Andreas Huber } 47714acc736e336cbd6026df781d4f411e908831815Andreas Huber } 47814acc736e336cbd6026df781d4f411e908831815Andreas Huber } 47914acc736e336cbd6026df781d4f411e908831815Andreas Huber 48014acc736e336cbd6026df781d4f411e908831815Andreas Huber return msg; 48114acc736e336cbd6026df781d4f411e908831815Andreas Huber} 48214acc736e336cbd6026df781d4f411e908831815Andreas Huber 48314acc736e336cbd6026df781d4f411e908831815Andreas Hubervoid AMessage::writeToParcel(Parcel *parcel) const { 48414acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(mWhat)); 48514acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(mNumItems)); 48614acc736e336cbd6026df781d4f411e908831815Andreas Huber 48714acc736e336cbd6026df781d4f411e908831815Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 48814acc736e336cbd6026df781d4f411e908831815Andreas Huber const Item &item = mItems[i]; 48914acc736e336cbd6026df781d4f411e908831815Andreas Huber 49014acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeCString(item.mName); 49114acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(item.mType)); 49214acc736e336cbd6026df781d4f411e908831815Andreas Huber 49314acc736e336cbd6026df781d4f411e908831815Andreas Huber switch (item.mType) { 49414acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt32: 49514acc736e336cbd6026df781d4f411e908831815Andreas Huber { 49614acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(item.u.int32Value); 49714acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 49814acc736e336cbd6026df781d4f411e908831815Andreas Huber } 49914acc736e336cbd6026df781d4f411e908831815Andreas Huber 50014acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt64: 50114acc736e336cbd6026df781d4f411e908831815Andreas Huber { 50214acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt64(item.u.int64Value); 50314acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 50414acc736e336cbd6026df781d4f411e908831815Andreas Huber } 50514acc736e336cbd6026df781d4f411e908831815Andreas Huber 50614acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeSize: 50714acc736e336cbd6026df781d4f411e908831815Andreas Huber { 50814acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(item.u.sizeValue)); 50914acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 51014acc736e336cbd6026df781d4f411e908831815Andreas Huber } 51114acc736e336cbd6026df781d4f411e908831815Andreas Huber 51214acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeFloat: 51314acc736e336cbd6026df781d4f411e908831815Andreas Huber { 51414acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeFloat(item.u.floatValue); 51514acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 51614acc736e336cbd6026df781d4f411e908831815Andreas Huber } 51714acc736e336cbd6026df781d4f411e908831815Andreas Huber 51814acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeDouble: 51914acc736e336cbd6026df781d4f411e908831815Andreas Huber { 52014acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeDouble(item.u.doubleValue); 52114acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 52214acc736e336cbd6026df781d4f411e908831815Andreas Huber } 52314acc736e336cbd6026df781d4f411e908831815Andreas Huber 52414acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeString: 52514acc736e336cbd6026df781d4f411e908831815Andreas Huber { 52614acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeCString(item.u.stringValue->c_str()); 52714acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 52814acc736e336cbd6026df781d4f411e908831815Andreas Huber } 52914acc736e336cbd6026df781d4f411e908831815Andreas Huber 53014acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeMessage: 53114acc736e336cbd6026df781d4f411e908831815Andreas Huber { 53214acc736e336cbd6026df781d4f411e908831815Andreas Huber static_cast<AMessage *>(item.u.refValue)->writeToParcel(parcel); 53314acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 53414acc736e336cbd6026df781d4f411e908831815Andreas Huber } 53514acc736e336cbd6026df781d4f411e908831815Andreas Huber 53614acc736e336cbd6026df781d4f411e908831815Andreas Huber default: 53714acc736e336cbd6026df781d4f411e908831815Andreas Huber { 53829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("This type of object cannot cross process boundaries."); 53914acc736e336cbd6026df781d4f411e908831815Andreas Huber TRESPASS(); 54014acc736e336cbd6026df781d4f411e908831815Andreas Huber } 54114acc736e336cbd6026df781d4f411e908831815Andreas Huber } 54214acc736e336cbd6026df781d4f411e908831815Andreas Huber } 54314acc736e336cbd6026df781d4f411e908831815Andreas Huber} 54414acc736e336cbd6026df781d4f411e908831815Andreas Huber 5455778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t AMessage::countEntries() const { 5465778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mNumItems; 5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5495778822d86b0337407514b9372562b86edfa91cdAndreas Huberconst char *AMessage::getEntryNameAt(size_t index, Type *type) const { 5505778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mNumItems) { 5515778822d86b0337407514b9372562b86edfa91cdAndreas Huber *type = kTypeInt32; 5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5535778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 5545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5565778822d86b0337407514b9372562b86edfa91cdAndreas Huber *type = mItems[index].mType; 5575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5585778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mItems[index].mName; 5595778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 56172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} // namespace android 562