AMessage.cpp revision 2d8bedd05437b6fccdbc6bf70f673ffd86744d59
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" 222d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber#include "ABuffer.h" 2372961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ADebug.h" 2472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "ALooperRoster.h" 2572961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include "AString.h" 2672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2714acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <binder/Parcel.h> 2814acc736e336cbd6026df781d4f411e908831815Andreas Huber 2972961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android { 3072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 315df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberextern ALooperRoster gLooperRoster; 325df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 3372961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::AMessage(uint32_t what, ALooper::handler_id target) 3472961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mWhat(what), 3572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mTarget(target), 3672961230a5890071bcca436eb5630172ce84ec41Andreas Huber mNumItems(0) { 3772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 3872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3972961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::~AMessage() { 4072961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 4172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 4272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4372961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setWhat(uint32_t what) { 4472961230a5890071bcca436eb5630172ce84ec41Andreas Huber mWhat = what; 4572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 4672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4772961230a5890071bcca436eb5630172ce84ec41Andreas Huberuint32_t AMessage::what() const { 4872961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mWhat; 4972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 5072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setTarget(ALooper::handler_id handlerID) { 5272961230a5890071bcca436eb5630172ce84ec41Andreas Huber mTarget = handlerID; 5372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 5472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5572961230a5890071bcca436eb5630172ce84ec41Andreas HuberALooper::handler_id AMessage::target() const { 5672961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mTarget; 5772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 5872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::clear() { 6072961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = &mItems[i]; 6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber freeItem(item); 6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber mNumItems = 0; 6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6772961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::freeItem(Item *item) { 6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber switch (item->mType) { 6972961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeString: 7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber delete item->u.stringValue; 7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 7572961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeObject: 7672961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeMessage: 7772961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 7872961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item->u.refValue != NULL) { 7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue->decStrong(this); 8072961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 8172961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8472961230a5890071bcca436eb5630172ce84ec41Andreas Huber default: 8572961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 8772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 8872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8972961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::Item *AMessage::allocateItem(const char *name) { 9072961230a5890071bcca436eb5630172ce84ec41Andreas Huber name = AAtomizer::Atomize(name); 9172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t i = 0; 9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber while (i < mNumItems && mItems[i].mName != name) { 9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber ++i; 9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item; 9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (i < mNumItems) { 10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber item = &mItems[i]; 10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber freeItem(item); 10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } else { 10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(mNumItems < kMaxNumItems); 10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber i = mNumItems++; 10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber item = &mItems[i]; 10672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10772961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mName = name; 10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 10972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return item; 11172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 11272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11372961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst AMessage::Item *AMessage::findItem( 11472961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *name, Type type) const { 11572961230a5890071bcca436eb5630172ce84ec41Andreas Huber name = AAtomizer::Atomize(name); 11672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = &mItems[i]; 11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12072961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item->mName == name) { 12172961230a5890071bcca436eb5630172ce84ec41Andreas Huber return item->mType == type ? item : NULL; 12272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 12372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 12472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12572961230a5890071bcca436eb5630172ce84ec41Andreas Huber return NULL; 12672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 12772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12872961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define BASIC_TYPE(NAME,FIELDNAME,TYPENAME) \ 12972961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::set##NAME(const char *name, TYPENAME value) { \ 13072961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); \ 13172961230a5890071bcca436eb5630172ce84ec41Andreas Huber \ 13272961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kType##NAME; \ 13372961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.FIELDNAME = value; \ 13472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} \ 13572961230a5890071bcca436eb5630172ce84ec41Andreas Huber \ 13672961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::find##NAME(const char *name, TYPENAME *value) const { \ 13772961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kType##NAME); \ 13872961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { \ 13972961230a5890071bcca436eb5630172ce84ec41Andreas Huber *value = item->u.FIELDNAME; \ 14072961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; \ 14172961230a5890071bcca436eb5630172ce84ec41Andreas Huber } \ 14272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; \ 14372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 14472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 14572961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int32,int32Value,int32_t) 14672961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int64,int64Value,int64_t) 14772961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Size,sizeValue,size_t) 14872961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Float,floatValue,float) 14972961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Double,doubleValue,double) 15072961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Pointer,ptrValue,void *) 15172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15272961230a5890071bcca436eb5630172ce84ec41Andreas Huber#undef BASIC_TYPE 15372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setString( 15572961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *name, const char *s, ssize_t len) { 15672961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 15772961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kTypeString; 15872961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.stringValue = new AString(s, len < 0 ? strlen(s) : len); 15972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 16072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1612d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObjectInternal( 1622d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber const char *name, const sp<RefBase> &obj, Type type) { 16372961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 1642d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber item->mType = type; 16572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16672961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (obj != NULL) { obj->incStrong(this); } 16772961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue = obj.get(); 16872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 16972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1702d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObject(const char *name, const sp<RefBase> &obj) { 1712d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber setObjectInternal(name, obj, kTypeObject); 1722d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber} 1732d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 1742d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setBuffer(const char *name, const sp<ABuffer> &buffer) { 1752d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber setObjectInternal(name, sp<RefBase>(buffer), kTypeBuffer); 1762d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber} 1772d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 17872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setMessage(const char *name, const sp<AMessage> &obj) { 17972961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 18072961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kTypeMessage; 18172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 18272961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (obj != NULL) { obj->incStrong(this); } 18372961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue = obj.get(); 18472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 18572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 18631e2508c75018145a8238925ff1a08cbde4e799aAndreas Hubervoid AMessage::setRect( 18731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const char *name, 18831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t left, int32_t top, int32_t right, int32_t bottom) { 18931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber Item *item = allocateItem(name); 19031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->mType = kTypeRect; 19131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 19231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mLeft = left; 19331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mTop = top; 19431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mRight = right; 19531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mBottom = bottom; 19631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 19731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 19872961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findString(const char *name, AString *value) const { 19972961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeString); 20072961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 20172961230a5890071bcca436eb5630172ce84ec41Andreas Huber *value = *item->u.stringValue; 20272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 20472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 20572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 20672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 20772961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findObject(const char *name, sp<RefBase> *obj) const { 20872961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeObject); 20972961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber *obj = item->u.refValue; 21172961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 21272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 21372961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 21472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 21572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2162d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huberbool AMessage::findBuffer(const char *name, sp<ABuffer> *buf) const { 2172d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber const Item *item = findItem(name, kTypeBuffer); 2182d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber if (item) { 2192d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber *buf = (ABuffer *)(item->u.refValue); 2202d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber return true; 2212d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber } 2222d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber return false; 2232d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber} 2242d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 22572961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findMessage(const char *name, sp<AMessage> *obj) const { 22672961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeMessage); 22772961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 22872961230a5890071bcca436eb5630172ce84ec41Andreas Huber *obj = static_cast<AMessage *>(item->u.refValue); 22972961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 23072961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 23172961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 23272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 23372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 23431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huberbool AMessage::findRect( 23531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const char *name, 23631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const { 23731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const Item *item = findItem(name, kTypeRect); 23831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (item == NULL) { 23931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber return false; 24031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 24131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 24231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *left = item->u.rectValue.mLeft; 24331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *top = item->u.rectValue.mTop; 24431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *right = item->u.rectValue.mRight; 24531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *bottom = item->u.rectValue.mBottom; 24631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 24731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber return true; 24831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 24931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 25072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::post(int64_t delayUs) { 25172961230a5890071bcca436eb5630172ce84ec41Andreas Huber gLooperRoster.postMessage(this, delayUs); 25272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 25372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2545df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberstatus_t AMessage::postAndAwaitResponse(sp<AMessage> *response) { 2555df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber return gLooperRoster.postAndAwaitResponse(this, response); 2565df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 2575df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 2585df775d2f509c76e76a46615fca83dba95299f6eAndreas Hubervoid AMessage::postReply(uint32_t replyID) { 2595df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber gLooperRoster.postReply(replyID, this); 2605df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 2615df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 2625df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberbool AMessage::senderAwaitsResponse(uint32_t *replyID) const { 2635df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber int32_t tmp; 2645df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber bool found = findInt32("replyID", &tmp); 2655df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 2665df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber if (!found) { 2675df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber return false; 2685df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber } 2695df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 2705df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber *replyID = static_cast<uint32_t>(tmp); 2715df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 2725df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber return true; 2735df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 2745df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 27572961230a5890071bcca436eb5630172ce84ec41Andreas Hubersp<AMessage> AMessage::dup() const { 27672961230a5890071bcca436eb5630172ce84ec41Andreas Huber sp<AMessage> msg = new AMessage(mWhat, mTarget); 27772961230a5890071bcca436eb5630172ce84ec41Andreas Huber msg->mNumItems = mNumItems; 27872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 27972961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 28072961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *from = &mItems[i]; 28172961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *to = &msg->mItems[i]; 28272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28372961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->mName = from->mName; 28472961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->mType = from->mType; 28572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28672961230a5890071bcca436eb5630172ce84ec41Andreas Huber switch (from->mType) { 28772961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeString: 28872961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 28972961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.stringValue = 29072961230a5890071bcca436eb5630172ce84ec41Andreas Huber new AString(*from->u.stringValue); 29172961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 29272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 29372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 29472961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeObject: 29572961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 29672961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.refValue = from->u.refValue; 29772961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.refValue->incStrong(msg.get()); 29872961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 29972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 30072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3012c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber case kTypeMessage: 3022c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber { 3032c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber sp<AMessage> copy = 3042c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber static_cast<AMessage *>(from->u.refValue)->dup(); 3052c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 3062c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber to->u.refValue = copy.get(); 3072c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber to->u.refValue->incStrong(msg.get()); 3082c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber break; 3092c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } 3102c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 31172961230a5890071bcca436eb5630172ce84ec41Andreas Huber default: 31272961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 31372961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u = from->u; 31472961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 31572961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 31672961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 31772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 31872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 31972961230a5890071bcca436eb5630172ce84ec41Andreas Huber return msg; 32072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 32172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 322bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic void appendIndent(AString *s, int32_t indent) { 323bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber static const char kWhitespace[] = 324bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber " " 325bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber " "; 326bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 327bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber CHECK_LT((size_t)indent, sizeof(kWhitespace)); 328bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 329bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s->append(kWhitespace, indent); 330bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 331bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 332bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic bool isFourcc(uint32_t what) { 333bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber return isprint(what & 0xff) 334bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 8) & 0xff) 335bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 16) & 0xff) 336bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 24) & 0xff); 337bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 338bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 339bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas HuberAString AMessage::debugString(int32_t indent) const { 340bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber AString s = "AMessage(what = "; 341bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 342bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber AString tmp; 343bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber if (isFourcc(mWhat)) { 344bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 345bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "'%c%c%c%c'", 346bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)(mWhat >> 24), 347bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)((mWhat >> 16) & 0xff), 348bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)((mWhat >> 8) & 0xff), 349bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)(mWhat & 0xff)); 350bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } else { 351bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf("0x%08x", mWhat); 352bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 353bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 354bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 355bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber if (mTarget != 0) { 356bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf(", target = %d", mTarget); 357bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 358bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 359bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(") = {\n"); 360bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 361bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 362bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber const Item &item = mItems[i]; 363bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 364bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber switch (item.mType) { 365bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeInt32: 366bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 367bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "int32_t %s = %d", item.mName, item.u.int32Value); 368bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 369bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeInt64: 370bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 371bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "int64_t %s = %lld", item.mName, item.u.int64Value); 372bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 373bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeSize: 374bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 375bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "size_t %s = %d", item.mName, item.u.sizeValue); 376bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 377bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeFloat: 378bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 379bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "float %s = %f", item.mName, item.u.floatValue); 380bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 381bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeDouble: 382bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 383bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "double %s = %f", item.mName, item.u.doubleValue); 384bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 385bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypePointer: 386bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 387bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "void *%s = %p", item.mName, item.u.ptrValue); 388bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 389bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeString: 390bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 391bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "string %s = \"%s\"", 392bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.mName, 393bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.u.stringValue->c_str()); 394bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 395bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeObject: 396bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 397bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "RefBase *%s = %p", item.mName, item.u.refValue); 398bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 399bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeMessage: 400bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 401bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "AMessage %s = %s", 402bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.mName, 403bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber static_cast<AMessage *>( 404bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.u.refValue)->debugString( 405bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber indent + strlen(item.mName) + 14).c_str()); 406bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 407078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber case kTypeRect: 408078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber tmp = StringPrintf( 409078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber "Rect %s(%d, %d, %d, %d)", 410078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.mName, 411078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mLeft, 412078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mTop, 413078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mRight, 414078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mBottom); 415078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber break; 416bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber default: 417bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber TRESPASS(); 418bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 419bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 420bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber appendIndent(&s, indent); 421bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(" "); 422bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 423bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append("\n"); 424bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 425bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 426bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber appendIndent(&s, indent); 427bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append("}"); 428bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 429bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber return s; 430bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 431bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 43214acc736e336cbd6026df781d4f411e908831815Andreas Huber// static 43314acc736e336cbd6026df781d4f411e908831815Andreas Hubersp<AMessage> AMessage::FromParcel(const Parcel &parcel) { 43414acc736e336cbd6026df781d4f411e908831815Andreas Huber int32_t what = parcel.readInt32(); 43514acc736e336cbd6026df781d4f411e908831815Andreas Huber sp<AMessage> msg = new AMessage(what); 43614acc736e336cbd6026df781d4f411e908831815Andreas Huber 43714acc736e336cbd6026df781d4f411e908831815Andreas Huber msg->mNumItems = static_cast<size_t>(parcel.readInt32()); 43814acc736e336cbd6026df781d4f411e908831815Andreas Huber 43914acc736e336cbd6026df781d4f411e908831815Andreas Huber for (size_t i = 0; i < msg->mNumItems; ++i) { 44014acc736e336cbd6026df781d4f411e908831815Andreas Huber Item *item = &msg->mItems[i]; 44114acc736e336cbd6026df781d4f411e908831815Andreas Huber 44214acc736e336cbd6026df781d4f411e908831815Andreas Huber item->mName = AAtomizer::Atomize(parcel.readCString()); 44314acc736e336cbd6026df781d4f411e908831815Andreas Huber item->mType = static_cast<Type>(parcel.readInt32()); 44414acc736e336cbd6026df781d4f411e908831815Andreas Huber 44514acc736e336cbd6026df781d4f411e908831815Andreas Huber switch (item->mType) { 44614acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt32: 44714acc736e336cbd6026df781d4f411e908831815Andreas Huber { 44814acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.int32Value = parcel.readInt32(); 44914acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 45014acc736e336cbd6026df781d4f411e908831815Andreas Huber } 45114acc736e336cbd6026df781d4f411e908831815Andreas Huber 45214acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt64: 45314acc736e336cbd6026df781d4f411e908831815Andreas Huber { 45414acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.int64Value = parcel.readInt64(); 45514acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 45614acc736e336cbd6026df781d4f411e908831815Andreas Huber } 45714acc736e336cbd6026df781d4f411e908831815Andreas Huber 45814acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeSize: 45914acc736e336cbd6026df781d4f411e908831815Andreas Huber { 46014acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.sizeValue = static_cast<size_t>(parcel.readInt32()); 46114acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 46214acc736e336cbd6026df781d4f411e908831815Andreas Huber } 46314acc736e336cbd6026df781d4f411e908831815Andreas Huber 46414acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeFloat: 46514acc736e336cbd6026df781d4f411e908831815Andreas Huber { 46614acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.floatValue = parcel.readFloat(); 46714acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 46814acc736e336cbd6026df781d4f411e908831815Andreas Huber } 46914acc736e336cbd6026df781d4f411e908831815Andreas Huber 47014acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeDouble: 47114acc736e336cbd6026df781d4f411e908831815Andreas Huber { 47214acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.doubleValue = parcel.readDouble(); 47314acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 47414acc736e336cbd6026df781d4f411e908831815Andreas Huber } 47514acc736e336cbd6026df781d4f411e908831815Andreas Huber 47614acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeString: 47714acc736e336cbd6026df781d4f411e908831815Andreas Huber { 47814acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.stringValue = new AString(parcel.readCString()); 47914acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 48014acc736e336cbd6026df781d4f411e908831815Andreas Huber } 48114acc736e336cbd6026df781d4f411e908831815Andreas Huber 48214acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeMessage: 48314acc736e336cbd6026df781d4f411e908831815Andreas Huber { 48414acc736e336cbd6026df781d4f411e908831815Andreas Huber sp<AMessage> subMsg = AMessage::FromParcel(parcel); 48514acc736e336cbd6026df781d4f411e908831815Andreas Huber subMsg->incStrong(msg.get()); 48614acc736e336cbd6026df781d4f411e908831815Andreas Huber 48714acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.refValue = subMsg.get(); 48814acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 48914acc736e336cbd6026df781d4f411e908831815Andreas Huber } 49014acc736e336cbd6026df781d4f411e908831815Andreas Huber 49114acc736e336cbd6026df781d4f411e908831815Andreas Huber default: 49214acc736e336cbd6026df781d4f411e908831815Andreas Huber { 49329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("This type of object cannot cross process boundaries."); 49414acc736e336cbd6026df781d4f411e908831815Andreas Huber TRESPASS(); 49514acc736e336cbd6026df781d4f411e908831815Andreas Huber } 49614acc736e336cbd6026df781d4f411e908831815Andreas Huber } 49714acc736e336cbd6026df781d4f411e908831815Andreas Huber } 49814acc736e336cbd6026df781d4f411e908831815Andreas Huber 49914acc736e336cbd6026df781d4f411e908831815Andreas Huber return msg; 50014acc736e336cbd6026df781d4f411e908831815Andreas Huber} 50114acc736e336cbd6026df781d4f411e908831815Andreas Huber 50214acc736e336cbd6026df781d4f411e908831815Andreas Hubervoid AMessage::writeToParcel(Parcel *parcel) const { 50314acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(mWhat)); 50414acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(mNumItems)); 50514acc736e336cbd6026df781d4f411e908831815Andreas Huber 50614acc736e336cbd6026df781d4f411e908831815Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 50714acc736e336cbd6026df781d4f411e908831815Andreas Huber const Item &item = mItems[i]; 50814acc736e336cbd6026df781d4f411e908831815Andreas Huber 50914acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeCString(item.mName); 51014acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(item.mType)); 51114acc736e336cbd6026df781d4f411e908831815Andreas Huber 51214acc736e336cbd6026df781d4f411e908831815Andreas Huber switch (item.mType) { 51314acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt32: 51414acc736e336cbd6026df781d4f411e908831815Andreas Huber { 51514acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(item.u.int32Value); 51614acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 51714acc736e336cbd6026df781d4f411e908831815Andreas Huber } 51814acc736e336cbd6026df781d4f411e908831815Andreas Huber 51914acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt64: 52014acc736e336cbd6026df781d4f411e908831815Andreas Huber { 52114acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt64(item.u.int64Value); 52214acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 52314acc736e336cbd6026df781d4f411e908831815Andreas Huber } 52414acc736e336cbd6026df781d4f411e908831815Andreas Huber 52514acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeSize: 52614acc736e336cbd6026df781d4f411e908831815Andreas Huber { 52714acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(item.u.sizeValue)); 52814acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 52914acc736e336cbd6026df781d4f411e908831815Andreas Huber } 53014acc736e336cbd6026df781d4f411e908831815Andreas Huber 53114acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeFloat: 53214acc736e336cbd6026df781d4f411e908831815Andreas Huber { 53314acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeFloat(item.u.floatValue); 53414acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 53514acc736e336cbd6026df781d4f411e908831815Andreas Huber } 53614acc736e336cbd6026df781d4f411e908831815Andreas Huber 53714acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeDouble: 53814acc736e336cbd6026df781d4f411e908831815Andreas Huber { 53914acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeDouble(item.u.doubleValue); 54014acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 54114acc736e336cbd6026df781d4f411e908831815Andreas Huber } 54214acc736e336cbd6026df781d4f411e908831815Andreas Huber 54314acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeString: 54414acc736e336cbd6026df781d4f411e908831815Andreas Huber { 54514acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeCString(item.u.stringValue->c_str()); 54614acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 54714acc736e336cbd6026df781d4f411e908831815Andreas Huber } 54814acc736e336cbd6026df781d4f411e908831815Andreas Huber 54914acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeMessage: 55014acc736e336cbd6026df781d4f411e908831815Andreas Huber { 55114acc736e336cbd6026df781d4f411e908831815Andreas Huber static_cast<AMessage *>(item.u.refValue)->writeToParcel(parcel); 55214acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 55314acc736e336cbd6026df781d4f411e908831815Andreas Huber } 55414acc736e336cbd6026df781d4f411e908831815Andreas Huber 55514acc736e336cbd6026df781d4f411e908831815Andreas Huber default: 55614acc736e336cbd6026df781d4f411e908831815Andreas Huber { 55729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("This type of object cannot cross process boundaries."); 55814acc736e336cbd6026df781d4f411e908831815Andreas Huber TRESPASS(); 55914acc736e336cbd6026df781d4f411e908831815Andreas Huber } 56014acc736e336cbd6026df781d4f411e908831815Andreas Huber } 56114acc736e336cbd6026df781d4f411e908831815Andreas Huber } 56214acc736e336cbd6026df781d4f411e908831815Andreas Huber} 56314acc736e336cbd6026df781d4f411e908831815Andreas Huber 5645778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t AMessage::countEntries() const { 5655778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mNumItems; 5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5685778822d86b0337407514b9372562b86edfa91cdAndreas Huberconst char *AMessage::getEntryNameAt(size_t index, Type *type) const { 5695778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mNumItems) { 5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber *type = kTypeInt32; 5715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5725778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber *type = mItems[index].mType; 5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5775778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mItems[index].mName; 5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 58072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} // namespace android 581