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> 28840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include <media/stagefright/foundation/hexdump.h> 2914acc736e336cbd6026df781d4f411e908831815Andreas Huber 3072961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android { 3172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 325df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberextern ALooperRoster gLooperRoster; 335df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 3472961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::AMessage(uint32_t what, ALooper::handler_id target) 3572961230a5890071bcca436eb5630172ce84ec41Andreas Huber : mWhat(what), 3672961230a5890071bcca436eb5630172ce84ec41Andreas Huber mTarget(target), 3772961230a5890071bcca436eb5630172ce84ec41Andreas Huber mNumItems(0) { 3872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 3972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4072961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::~AMessage() { 4172961230a5890071bcca436eb5630172ce84ec41Andreas Huber clear(); 4272961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 4372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4472961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setWhat(uint32_t what) { 4572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mWhat = what; 4672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 4772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4872961230a5890071bcca436eb5630172ce84ec41Andreas Huberuint32_t AMessage::what() const { 4972961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mWhat; 5072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 5172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5272961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setTarget(ALooper::handler_id handlerID) { 5372961230a5890071bcca436eb5630172ce84ec41Andreas Huber mTarget = handlerID; 5472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 5572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5672961230a5890071bcca436eb5630172ce84ec41Andreas HuberALooper::handler_id AMessage::target() const { 5772961230a5890071bcca436eb5630172ce84ec41Andreas Huber return mTarget; 5872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 5972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::clear() { 6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = &mItems[i]; 6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber freeItem(item); 6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber mNumItems = 0; 6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 6872961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::freeItem(Item *item) { 6972961230a5890071bcca436eb5630172ce84ec41Andreas Huber switch (item->mType) { 7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeString: 7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 7272961230a5890071bcca436eb5630172ce84ec41Andreas Huber delete item->u.stringValue; 7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 7572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 7672961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeObject: 7772961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeMessage: 78bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber case kTypeBuffer: 7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 8072961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item->u.refValue != NULL) { 8172961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue->decStrong(this); 8272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 8472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 8572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber default: 8772961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 8872961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 8972961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 9072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9172961230a5890071bcca436eb5630172ce84ec41Andreas HuberAMessage::Item *AMessage::allocateItem(const char *name) { 9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber name = AAtomizer::Atomize(name); 9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t i = 0; 9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber while (i < mNumItems && mItems[i].mName != name) { 9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber ++i; 9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item; 10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (i < mNumItems) { 10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber item = &mItems[i]; 10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber freeItem(item); 10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } else { 10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber CHECK(mNumItems < kMaxNumItems); 10672961230a5890071bcca436eb5630172ce84ec41Andreas Huber i = mNumItems++; 10772961230a5890071bcca436eb5630172ce84ec41Andreas Huber item = &mItems[i]; 10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10972961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mName = name; 11072961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 11172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return item; 11372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 11472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11572961230a5890071bcca436eb5630172ce84ec41Andreas Huberconst AMessage::Item *AMessage::findItem( 11672961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *name, Type type) const { 11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber name = AAtomizer::Atomize(name); 11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 12072961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = &mItems[i]; 12172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12272961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item->mName == name) { 12372961230a5890071bcca436eb5630172ce84ec41Andreas Huber return item->mType == type ? item : NULL; 12472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 12572961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 12672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12772961230a5890071bcca436eb5630172ce84ec41Andreas Huber return NULL; 12872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 12972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 13072961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define BASIC_TYPE(NAME,FIELDNAME,TYPENAME) \ 13172961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::set##NAME(const char *name, TYPENAME value) { \ 13272961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); \ 13372961230a5890071bcca436eb5630172ce84ec41Andreas Huber \ 13472961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kType##NAME; \ 13572961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.FIELDNAME = value; \ 13672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} \ 13772961230a5890071bcca436eb5630172ce84ec41Andreas Huber \ 13872961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::find##NAME(const char *name, TYPENAME *value) const { \ 13972961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kType##NAME); \ 14072961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { \ 14172961230a5890071bcca436eb5630172ce84ec41Andreas Huber *value = item->u.FIELDNAME; \ 14272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; \ 14372961230a5890071bcca436eb5630172ce84ec41Andreas Huber } \ 14472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; \ 14572961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 14672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 14772961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int32,int32Value,int32_t) 14872961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Int64,int64Value,int64_t) 14972961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Size,sizeValue,size_t) 15072961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Float,floatValue,float) 15172961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Double,doubleValue,double) 15272961230a5890071bcca436eb5630172ce84ec41Andreas HuberBASIC_TYPE(Pointer,ptrValue,void *) 15372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#undef BASIC_TYPE 15572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15672961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setString( 15772961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *name, const char *s, ssize_t len) { 15872961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 15972961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kTypeString; 16072961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.stringValue = new AString(s, len < 0 ? strlen(s) : len); 16172961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 16272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1632d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObjectInternal( 1642d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber const char *name, const sp<RefBase> &obj, Type type) { 16572961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 1662d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber item->mType = type; 16772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 16872961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (obj != NULL) { obj->incStrong(this); } 16972961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue = obj.get(); 17072961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 17172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1722d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setObject(const char *name, const sp<RefBase> &obj) { 1732d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber setObjectInternal(name, obj, kTypeObject); 1742d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber} 1752d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 1762d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Hubervoid AMessage::setBuffer(const char *name, const sp<ABuffer> &buffer) { 1772d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber setObjectInternal(name, sp<RefBase>(buffer), kTypeBuffer); 1782d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber} 1792d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 18072961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::setMessage(const char *name, const sp<AMessage> &obj) { 18172961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *item = allocateItem(name); 18272961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->mType = kTypeMessage; 18372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 18472961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (obj != NULL) { obj->incStrong(this); } 18572961230a5890071bcca436eb5630172ce84ec41Andreas Huber item->u.refValue = obj.get(); 18672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 18772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 18831e2508c75018145a8238925ff1a08cbde4e799aAndreas Hubervoid AMessage::setRect( 18931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const char *name, 19031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t left, int32_t top, int32_t right, int32_t bottom) { 19131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber Item *item = allocateItem(name); 19231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->mType = kTypeRect; 19331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 19431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mLeft = left; 19531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mTop = top; 19631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mRight = right; 19731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber item->u.rectValue.mBottom = bottom; 19831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 19931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 20072961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findString(const char *name, AString *value) const { 20172961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeString); 20272961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber *value = *item->u.stringValue; 20472961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 20572961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 20672961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 20772961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 20872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 20972961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findObject(const char *name, sp<RefBase> *obj) const { 21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeObject); 21172961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 21272961230a5890071bcca436eb5630172ce84ec41Andreas Huber *obj = item->u.refValue; 21372961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 21472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 21572961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 21672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 21772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2182d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huberbool AMessage::findBuffer(const char *name, sp<ABuffer> *buf) const { 2192d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber const Item *item = findItem(name, kTypeBuffer); 2202d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber if (item) { 2212d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber *buf = (ABuffer *)(item->u.refValue); 2222d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber return true; 2232d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber } 2242d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber return false; 2252d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber} 2262d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 22772961230a5890071bcca436eb5630172ce84ec41Andreas Huberbool AMessage::findMessage(const char *name, sp<AMessage> *obj) const { 22872961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *item = findItem(name, kTypeMessage); 22972961230a5890071bcca436eb5630172ce84ec41Andreas Huber if (item) { 23072961230a5890071bcca436eb5630172ce84ec41Andreas Huber *obj = static_cast<AMessage *>(item->u.refValue); 23172961230a5890071bcca436eb5630172ce84ec41Andreas Huber return true; 23272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 23372961230a5890071bcca436eb5630172ce84ec41Andreas Huber return false; 23472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 23572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 23631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huberbool AMessage::findRect( 23731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const char *name, 23831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const { 23931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const Item *item = findItem(name, kTypeRect); 24031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (item == NULL) { 24131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber return false; 24231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 24331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 24431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *left = item->u.rectValue.mLeft; 24531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *top = item->u.rectValue.mTop; 24631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *right = item->u.rectValue.mRight; 24731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber *bottom = item->u.rectValue.mBottom; 24831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 24931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber return true; 25031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 25131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 25272961230a5890071bcca436eb5630172ce84ec41Andreas Hubervoid AMessage::post(int64_t delayUs) { 25372961230a5890071bcca436eb5630172ce84ec41Andreas Huber gLooperRoster.postMessage(this, delayUs); 25472961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 25572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2565df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberstatus_t AMessage::postAndAwaitResponse(sp<AMessage> *response) { 2575df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber return gLooperRoster.postAndAwaitResponse(this, response); 2585df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 2595df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 2605df775d2f509c76e76a46615fca83dba95299f6eAndreas Hubervoid AMessage::postReply(uint32_t replyID) { 2615df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber gLooperRoster.postReply(replyID, this); 2625df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 2635df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 2645df775d2f509c76e76a46615fca83dba95299f6eAndreas Huberbool AMessage::senderAwaitsResponse(uint32_t *replyID) const { 2655df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber int32_t tmp; 2665df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber bool found = findInt32("replyID", &tmp); 2675df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 2685df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber if (!found) { 2695df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber return false; 2705df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber } 2715df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 2725df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber *replyID = static_cast<uint32_t>(tmp); 2735df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 2745df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber return true; 2755df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber} 2765df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 27772961230a5890071bcca436eb5630172ce84ec41Andreas Hubersp<AMessage> AMessage::dup() const { 27872961230a5890071bcca436eb5630172ce84ec41Andreas Huber sp<AMessage> msg = new AMessage(mWhat, mTarget); 27972961230a5890071bcca436eb5630172ce84ec41Andreas Huber msg->mNumItems = mNumItems; 28072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28172961230a5890071bcca436eb5630172ce84ec41Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 28272961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *from = &mItems[i]; 28372961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *to = &msg->mItems[i]; 28472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28572961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->mName = from->mName; 28672961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->mType = from->mType; 28772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 28872961230a5890071bcca436eb5630172ce84ec41Andreas Huber switch (from->mType) { 28972961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeString: 29072961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 29172961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.stringValue = 29272961230a5890071bcca436eb5630172ce84ec41Andreas Huber new AString(*from->u.stringValue); 29372961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 29472961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 29572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 29672961230a5890071bcca436eb5630172ce84ec41Andreas Huber case kTypeObject: 297bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber case kTypeBuffer: 29872961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 29972961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.refValue = from->u.refValue; 30072961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u.refValue->incStrong(msg.get()); 30172961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 30272961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 30372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3042c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber case kTypeMessage: 3052c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber { 3062c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber sp<AMessage> copy = 3072c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber static_cast<AMessage *>(from->u.refValue)->dup(); 3082c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 3092c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber to->u.refValue = copy.get(); 3102c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber to->u.refValue->incStrong(msg.get()); 3112c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber break; 3122c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } 3132c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 31472961230a5890071bcca436eb5630172ce84ec41Andreas Huber default: 31572961230a5890071bcca436eb5630172ce84ec41Andreas Huber { 31672961230a5890071bcca436eb5630172ce84ec41Andreas Huber to->u = from->u; 31772961230a5890071bcca436eb5630172ce84ec41Andreas Huber break; 31872961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 31972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 32072961230a5890071bcca436eb5630172ce84ec41Andreas Huber } 32172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 32272961230a5890071bcca436eb5630172ce84ec41Andreas Huber return msg; 32372961230a5890071bcca436eb5630172ce84ec41Andreas Huber} 32472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 325bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic void appendIndent(AString *s, int32_t indent) { 326bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber static const char kWhitespace[] = 327bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber " " 328bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber " "; 329bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 330bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber CHECK_LT((size_t)indent, sizeof(kWhitespace)); 331bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 332bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s->append(kWhitespace, indent); 333bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 334bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 335bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huberstatic bool isFourcc(uint32_t what) { 336bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber return isprint(what & 0xff) 337bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 8) & 0xff) 338bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 16) & 0xff) 339bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber && isprint((what >> 24) & 0xff); 340bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 341bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 342bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas HuberAString AMessage::debugString(int32_t indent) const { 343bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber AString s = "AMessage(what = "; 344bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 345bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber AString tmp; 346bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber if (isFourcc(mWhat)) { 347bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 348bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "'%c%c%c%c'", 349bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)(mWhat >> 24), 350bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)((mWhat >> 16) & 0xff), 351bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)((mWhat >> 8) & 0xff), 352bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber (char)(mWhat & 0xff)); 353bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } else { 354bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf("0x%08x", mWhat); 355bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 356bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 357bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 358bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber if (mTarget != 0) { 359bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf(", target = %d", mTarget); 360bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 361bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 362bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(") = {\n"); 363bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 364bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 365bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber const Item &item = mItems[i]; 366bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 367bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber switch (item.mType) { 368bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeInt32: 369bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 370bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "int32_t %s = %d", item.mName, item.u.int32Value); 371bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 372bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeInt64: 373bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 374bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "int64_t %s = %lld", item.mName, item.u.int64Value); 375bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 376bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeSize: 377bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 378bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "size_t %s = %d", item.mName, item.u.sizeValue); 379bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 380bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeFloat: 381bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 382bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "float %s = %f", item.mName, item.u.floatValue); 383bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 384bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeDouble: 385bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 386bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "double %s = %f", item.mName, item.u.doubleValue); 387bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 388bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypePointer: 389bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 390bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "void *%s = %p", item.mName, item.u.ptrValue); 391bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 392bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeString: 393bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 394bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "string %s = \"%s\"", 395bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.mName, 396bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.u.stringValue->c_str()); 397bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 398bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeObject: 399bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 400bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "RefBase *%s = %p", item.mName, item.u.refValue); 401bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 402bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber case kTypeBuffer: 403840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber { 404840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(item.u.refValue); 405840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 406840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber if (buffer != NULL && buffer->size() <= 64) { 407840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber tmp = StringPrintf("Buffer %s = {\n", item.mName); 408840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber hexdump(buffer->data(), buffer->size(), indent + 4, &tmp); 409840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber appendIndent(&tmp, indent + 2); 410840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber tmp.append("}"); 411840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } else { 412840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber tmp = StringPrintf( 413840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber "Buffer *%s = %p", item.mName, buffer.get()); 414840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 415bdaa29a9bc63d8d0d86879e40286a06655623322Andreas Huber break; 416840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 417bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber case kTypeMessage: 418bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber tmp = StringPrintf( 419bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber "AMessage %s = %s", 420bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.mName, 421bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber static_cast<AMessage *>( 422bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber item.u.refValue)->debugString( 423bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber indent + strlen(item.mName) + 14).c_str()); 424bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber break; 425078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber case kTypeRect: 426078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber tmp = StringPrintf( 427078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber "Rect %s(%d, %d, %d, %d)", 428078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.mName, 429078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mLeft, 430078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mTop, 431078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mRight, 432078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber item.u.rectValue.mBottom); 433078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber break; 434bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber default: 435bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber TRESPASS(); 436bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 437bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 438bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber appendIndent(&s, indent); 439bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(" "); 440bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append(tmp); 441bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append("\n"); 442bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber } 443bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 444bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber appendIndent(&s, indent); 445bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber s.append("}"); 446bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 447bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber return s; 448bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber} 449bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 45014acc736e336cbd6026df781d4f411e908831815Andreas Huber// static 45114acc736e336cbd6026df781d4f411e908831815Andreas Hubersp<AMessage> AMessage::FromParcel(const Parcel &parcel) { 45214acc736e336cbd6026df781d4f411e908831815Andreas Huber int32_t what = parcel.readInt32(); 45314acc736e336cbd6026df781d4f411e908831815Andreas Huber sp<AMessage> msg = new AMessage(what); 45414acc736e336cbd6026df781d4f411e908831815Andreas Huber 45514acc736e336cbd6026df781d4f411e908831815Andreas Huber msg->mNumItems = static_cast<size_t>(parcel.readInt32()); 45614acc736e336cbd6026df781d4f411e908831815Andreas Huber 45714acc736e336cbd6026df781d4f411e908831815Andreas Huber for (size_t i = 0; i < msg->mNumItems; ++i) { 45814acc736e336cbd6026df781d4f411e908831815Andreas Huber Item *item = &msg->mItems[i]; 45914acc736e336cbd6026df781d4f411e908831815Andreas Huber 46014acc736e336cbd6026df781d4f411e908831815Andreas Huber item->mName = AAtomizer::Atomize(parcel.readCString()); 46114acc736e336cbd6026df781d4f411e908831815Andreas Huber item->mType = static_cast<Type>(parcel.readInt32()); 46214acc736e336cbd6026df781d4f411e908831815Andreas Huber 46314acc736e336cbd6026df781d4f411e908831815Andreas Huber switch (item->mType) { 46414acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt32: 46514acc736e336cbd6026df781d4f411e908831815Andreas Huber { 46614acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.int32Value = parcel.readInt32(); 46714acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 46814acc736e336cbd6026df781d4f411e908831815Andreas Huber } 46914acc736e336cbd6026df781d4f411e908831815Andreas Huber 47014acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt64: 47114acc736e336cbd6026df781d4f411e908831815Andreas Huber { 47214acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.int64Value = parcel.readInt64(); 47314acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 47414acc736e336cbd6026df781d4f411e908831815Andreas Huber } 47514acc736e336cbd6026df781d4f411e908831815Andreas Huber 47614acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeSize: 47714acc736e336cbd6026df781d4f411e908831815Andreas Huber { 47814acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.sizeValue = static_cast<size_t>(parcel.readInt32()); 47914acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 48014acc736e336cbd6026df781d4f411e908831815Andreas Huber } 48114acc736e336cbd6026df781d4f411e908831815Andreas Huber 48214acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeFloat: 48314acc736e336cbd6026df781d4f411e908831815Andreas Huber { 48414acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.floatValue = parcel.readFloat(); 48514acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 48614acc736e336cbd6026df781d4f411e908831815Andreas Huber } 48714acc736e336cbd6026df781d4f411e908831815Andreas Huber 48814acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeDouble: 48914acc736e336cbd6026df781d4f411e908831815Andreas Huber { 49014acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.doubleValue = parcel.readDouble(); 49114acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 49214acc736e336cbd6026df781d4f411e908831815Andreas Huber } 49314acc736e336cbd6026df781d4f411e908831815Andreas Huber 49414acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeString: 49514acc736e336cbd6026df781d4f411e908831815Andreas Huber { 49614acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.stringValue = new AString(parcel.readCString()); 49714acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 49814acc736e336cbd6026df781d4f411e908831815Andreas Huber } 49914acc736e336cbd6026df781d4f411e908831815Andreas Huber 50014acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeMessage: 50114acc736e336cbd6026df781d4f411e908831815Andreas Huber { 50214acc736e336cbd6026df781d4f411e908831815Andreas Huber sp<AMessage> subMsg = AMessage::FromParcel(parcel); 50314acc736e336cbd6026df781d4f411e908831815Andreas Huber subMsg->incStrong(msg.get()); 50414acc736e336cbd6026df781d4f411e908831815Andreas Huber 50514acc736e336cbd6026df781d4f411e908831815Andreas Huber item->u.refValue = subMsg.get(); 50614acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 50714acc736e336cbd6026df781d4f411e908831815Andreas Huber } 50814acc736e336cbd6026df781d4f411e908831815Andreas Huber 50914acc736e336cbd6026df781d4f411e908831815Andreas Huber default: 51014acc736e336cbd6026df781d4f411e908831815Andreas Huber { 51129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("This type of object cannot cross process boundaries."); 51214acc736e336cbd6026df781d4f411e908831815Andreas Huber TRESPASS(); 51314acc736e336cbd6026df781d4f411e908831815Andreas Huber } 51414acc736e336cbd6026df781d4f411e908831815Andreas Huber } 51514acc736e336cbd6026df781d4f411e908831815Andreas Huber } 51614acc736e336cbd6026df781d4f411e908831815Andreas Huber 51714acc736e336cbd6026df781d4f411e908831815Andreas Huber return msg; 51814acc736e336cbd6026df781d4f411e908831815Andreas Huber} 51914acc736e336cbd6026df781d4f411e908831815Andreas Huber 52014acc736e336cbd6026df781d4f411e908831815Andreas Hubervoid AMessage::writeToParcel(Parcel *parcel) const { 52114acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(mWhat)); 52214acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(mNumItems)); 52314acc736e336cbd6026df781d4f411e908831815Andreas Huber 52414acc736e336cbd6026df781d4f411e908831815Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 52514acc736e336cbd6026df781d4f411e908831815Andreas Huber const Item &item = mItems[i]; 52614acc736e336cbd6026df781d4f411e908831815Andreas Huber 52714acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeCString(item.mName); 52814acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(item.mType)); 52914acc736e336cbd6026df781d4f411e908831815Andreas Huber 53014acc736e336cbd6026df781d4f411e908831815Andreas Huber switch (item.mType) { 53114acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt32: 53214acc736e336cbd6026df781d4f411e908831815Andreas Huber { 53314acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(item.u.int32Value); 53414acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 53514acc736e336cbd6026df781d4f411e908831815Andreas Huber } 53614acc736e336cbd6026df781d4f411e908831815Andreas Huber 53714acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeInt64: 53814acc736e336cbd6026df781d4f411e908831815Andreas Huber { 53914acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt64(item.u.int64Value); 54014acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 54114acc736e336cbd6026df781d4f411e908831815Andreas Huber } 54214acc736e336cbd6026df781d4f411e908831815Andreas Huber 54314acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeSize: 54414acc736e336cbd6026df781d4f411e908831815Andreas Huber { 54514acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeInt32(static_cast<int32_t>(item.u.sizeValue)); 54614acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 54714acc736e336cbd6026df781d4f411e908831815Andreas Huber } 54814acc736e336cbd6026df781d4f411e908831815Andreas Huber 54914acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeFloat: 55014acc736e336cbd6026df781d4f411e908831815Andreas Huber { 55114acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeFloat(item.u.floatValue); 55214acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 55314acc736e336cbd6026df781d4f411e908831815Andreas Huber } 55414acc736e336cbd6026df781d4f411e908831815Andreas Huber 55514acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeDouble: 55614acc736e336cbd6026df781d4f411e908831815Andreas Huber { 55714acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeDouble(item.u.doubleValue); 55814acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 55914acc736e336cbd6026df781d4f411e908831815Andreas Huber } 56014acc736e336cbd6026df781d4f411e908831815Andreas Huber 56114acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeString: 56214acc736e336cbd6026df781d4f411e908831815Andreas Huber { 56314acc736e336cbd6026df781d4f411e908831815Andreas Huber parcel->writeCString(item.u.stringValue->c_str()); 56414acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 56514acc736e336cbd6026df781d4f411e908831815Andreas Huber } 56614acc736e336cbd6026df781d4f411e908831815Andreas Huber 56714acc736e336cbd6026df781d4f411e908831815Andreas Huber case kTypeMessage: 56814acc736e336cbd6026df781d4f411e908831815Andreas Huber { 56914acc736e336cbd6026df781d4f411e908831815Andreas Huber static_cast<AMessage *>(item.u.refValue)->writeToParcel(parcel); 57014acc736e336cbd6026df781d4f411e908831815Andreas Huber break; 57114acc736e336cbd6026df781d4f411e908831815Andreas Huber } 57214acc736e336cbd6026df781d4f411e908831815Andreas Huber 57314acc736e336cbd6026df781d4f411e908831815Andreas Huber default: 57414acc736e336cbd6026df781d4f411e908831815Andreas Huber { 57529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("This type of object cannot cross process boundaries."); 57614acc736e336cbd6026df781d4f411e908831815Andreas Huber TRESPASS(); 57714acc736e336cbd6026df781d4f411e908831815Andreas Huber } 57814acc736e336cbd6026df781d4f411e908831815Andreas Huber } 57914acc736e336cbd6026df781d4f411e908831815Andreas Huber } 58014acc736e336cbd6026df781d4f411e908831815Andreas Huber} 58114acc736e336cbd6026df781d4f411e908831815Andreas Huber 5825778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t AMessage::countEntries() const { 5835778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mNumItems; 5845778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5865778822d86b0337407514b9372562b86edfa91cdAndreas Huberconst char *AMessage::getEntryNameAt(size_t index, Type *type) const { 5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mNumItems) { 5885778822d86b0337407514b9372562b86edfa91cdAndreas Huber *type = kTypeInt32; 5895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5905778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 5915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5935778822d86b0337407514b9372562b86edfa91cdAndreas Huber *type = mItems[index].mType; 5945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5955778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mItems[index].mName; 5965778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 59872961230a5890071bcca436eb5630172ce84ec41Andreas Huber} // namespace android 599