17d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber/* 27d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * Copyright (C) 2010 The Android Open Source Project 37d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * 47d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 57d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * you may not use this file except in compliance with the License. 67d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * You may obtain a copy of the License at 77d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * 87d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 97d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * 107d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * Unless required by applicable law or agreed to in writing, software 117d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 127d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * See the License for the specific language governing permissions and 147d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber * limitations under the License. 157d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber */ 167d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 177d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#include "AMessage.h" 187d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber#include <ctype.h> 2003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 217d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#include "AAtomizer.h" 227d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#include "ADebug.h" 237d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#include "ALooperRoster.h" 247d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#include "AString.h" 257d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 26ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber#include <binder/Parcel.h> 27ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 287d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubernamespace android { 297d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 30e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huberextern ALooperRoster gLooperRoster; 31e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber 327d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberAMessage::AMessage(uint32_t what, ALooper::handler_id target) 337d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber : mWhat(what), 347d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber mTarget(target), 357d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber mNumItems(0) { 367d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 377d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 387d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberAMessage::~AMessage() { 397d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber clear(); 407d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 417d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 427d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setWhat(uint32_t what) { 437d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber mWhat = what; 447d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 457d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 467d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberuint32_t AMessage::what() const { 477d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return mWhat; 487d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 497d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 507d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setTarget(ALooper::handler_id handlerID) { 517d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber mTarget = handlerID; 527d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 537d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 547d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberALooper::handler_id AMessage::target() const { 557d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return mTarget; 567d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 577d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 587d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::clear() { 597d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 607d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber Item *item = &mItems[i]; 617d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber freeItem(item); 627d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 637d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber mNumItems = 0; 647d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 657d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 667d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::freeItem(Item *item) { 677d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber switch (item->mType) { 687d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber case kTypeString: 697d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber { 707d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber delete item->u.stringValue; 717d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber break; 727d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 737d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 747d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber case kTypeObject: 757d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber case kTypeMessage: 767d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber { 777d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (item->u.refValue != NULL) { 787d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->u.refValue->decStrong(this); 797d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 807d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber break; 817d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 827d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 837d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber default: 847d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber break; 857d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 867d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 877d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 887d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberAMessage::Item *AMessage::allocateItem(const char *name) { 897d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber name = AAtomizer::Atomize(name); 907d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 917d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber size_t i = 0; 927d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber while (i < mNumItems && mItems[i].mName != name) { 937d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber ++i; 947d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 957d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 967d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber Item *item; 977d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 987d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (i < mNumItems) { 997d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item = &mItems[i]; 1007d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber freeItem(item); 1017d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } else { 1027d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber CHECK(mNumItems < kMaxNumItems); 1037d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber i = mNumItems++; 1047d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item = &mItems[i]; 1057d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1067d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->mName = name; 1077d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 1087d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1097d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return item; 1107d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 1117d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1127d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberconst AMessage::Item *AMessage::findItem( 1137d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber const char *name, Type type) const { 1147d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber name = AAtomizer::Atomize(name); 1157d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1167d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 1177d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber const Item *item = &mItems[i]; 1187d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1197d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (item->mName == name) { 1207d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return item->mType == type ? item : NULL; 1217d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 1227d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 1237d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1247d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return NULL; 1257d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 1267d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1277d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#define BASIC_TYPE(NAME,FIELDNAME,TYPENAME) \ 1287d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::set##NAME(const char *name, TYPENAME value) { \ 1297d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber Item *item = allocateItem(name); \ 1307d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber \ 1317d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->mType = kType##NAME; \ 1327d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->u.FIELDNAME = value; \ 1337d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} \ 1347d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber \ 1357d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberbool AMessage::find##NAME(const char *name, TYPENAME *value) const { \ 1367d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber const Item *item = findItem(name, kType##NAME); \ 1377d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (item) { \ 1387d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber *value = item->u.FIELDNAME; \ 1397d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return true; \ 1407d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } \ 1417d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return false; \ 1427d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 1437d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1447d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Int32,int32Value,int32_t) 1457d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Int64,int64Value,int64_t) 1467d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Size,sizeValue,size_t) 1477d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Float,floatValue,float) 1487d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Double,doubleValue,double) 1497d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Pointer,ptrValue,void *) 1507d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1517d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#undef BASIC_TYPE 1527d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1537d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setString( 1547d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber const char *name, const char *s, ssize_t len) { 1557d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber Item *item = allocateItem(name); 1567d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->mType = kTypeString; 1577d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->u.stringValue = new AString(s, len < 0 ? strlen(s) : len); 1587d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 1597d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1607d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setObject(const char *name, const sp<RefBase> &obj) { 1617d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber Item *item = allocateItem(name); 1627d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->mType = kTypeObject; 1637d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1647d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (obj != NULL) { obj->incStrong(this); } 1657d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->u.refValue = obj.get(); 1667d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 1677d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1687d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setMessage(const char *name, const sp<AMessage> &obj) { 1697d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber Item *item = allocateItem(name); 1707d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->mType = kTypeMessage; 1717d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1727d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (obj != NULL) { obj->incStrong(this); } 1737d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->u.refValue = obj.get(); 1747d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 1757d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1767caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Hubervoid AMessage::setRect( 1777caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber const char *name, 1787caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber int32_t left, int32_t top, int32_t right, int32_t bottom) { 1797caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber Item *item = allocateItem(name); 1807caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber item->mType = kTypeRect; 1817caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber 1827caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber item->u.rectValue.mLeft = left; 1837caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber item->u.rectValue.mTop = top; 1847caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber item->u.rectValue.mRight = right; 1857caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber item->u.rectValue.mBottom = bottom; 1867caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber} 1877caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber 1887d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberbool AMessage::findString(const char *name, AString *value) const { 1897d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber const Item *item = findItem(name, kTypeString); 1907d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (item) { 1917d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber *value = *item->u.stringValue; 1927d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return true; 1937d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 1947d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return false; 1957d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 1967d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1977d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberbool AMessage::findObject(const char *name, sp<RefBase> *obj) const { 1987d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber const Item *item = findItem(name, kTypeObject); 1997d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (item) { 2007d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber *obj = item->u.refValue; 2017d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return true; 2027d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 2037d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return false; 2047d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 2057d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 2067d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberbool AMessage::findMessage(const char *name, sp<AMessage> *obj) const { 2077d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber const Item *item = findItem(name, kTypeMessage); 2087d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (item) { 2097d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber *obj = static_cast<AMessage *>(item->u.refValue); 2107d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return true; 2117d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 2127d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return false; 2137d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 2147d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 2157caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huberbool AMessage::findRect( 2167caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber const char *name, 2177caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const { 2187caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber const Item *item = findItem(name, kTypeRect); 2197caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber if (item == NULL) { 2207caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber return false; 2217caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber } 2227caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber 2237caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber *left = item->u.rectValue.mLeft; 2247caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber *top = item->u.rectValue.mTop; 2257caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber *right = item->u.rectValue.mRight; 2267caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber *bottom = item->u.rectValue.mBottom; 2277caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber 2287caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber return true; 2297caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber} 2307caa130a98baa64768dcd409bc110ce9acb0cbffAndreas Huber 2317d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::post(int64_t delayUs) { 2327d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber gLooperRoster.postMessage(this, delayUs); 2337d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 2347d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 235e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huberstatus_t AMessage::postAndAwaitResponse(sp<AMessage> *response) { 236e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber return gLooperRoster.postAndAwaitResponse(this, response); 237e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber} 238e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber 239e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Hubervoid AMessage::postReply(uint32_t replyID) { 240e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber gLooperRoster.postReply(replyID, this); 241e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber} 242e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber 243e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huberbool AMessage::senderAwaitsResponse(uint32_t *replyID) const { 244e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber int32_t tmp; 245e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber bool found = findInt32("replyID", &tmp); 246e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber 247e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber if (!found) { 248e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber return false; 249e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber } 250e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber 251e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber *replyID = static_cast<uint32_t>(tmp); 252e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber 253e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber return true; 254e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber} 255e688257456c315cbd2d5fd4f32bd52eac0b98195Andreas Huber 2567d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubersp<AMessage> AMessage::dup() const { 2577d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber sp<AMessage> msg = new AMessage(mWhat, mTarget); 2587d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber msg->mNumItems = mNumItems; 2597d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 2607d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 2617d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber const Item *from = &mItems[i]; 2627d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber Item *to = &msg->mItems[i]; 2637d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 2647d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber to->mName = from->mName; 2657d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber to->mType = from->mType; 2667d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 2677d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber switch (from->mType) { 2687d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber case kTypeString: 2697d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber { 2707d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber to->u.stringValue = 2717d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber new AString(*from->u.stringValue); 2727d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber break; 2737d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 2747d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 2757d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber case kTypeObject: 2767d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber { 2777d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber to->u.refValue = from->u.refValue; 2787d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber to->u.refValue->incStrong(msg.get()); 2797d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber break; 2807d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 2817d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 282687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber case kTypeMessage: 283687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber { 284687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber sp<AMessage> copy = 285687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber static_cast<AMessage *>(from->u.refValue)->dup(); 286687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber 287687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber to->u.refValue = copy.get(); 288687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber to->u.refValue->incStrong(msg.get()); 289687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber break; 290687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber } 291687b32d83e0145b0a684e3a9704ab50939260d60Andreas Huber 2927d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber default: 2937d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber { 2947d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber to->u = from->u; 2957d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber break; 2967d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 2977d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 2987d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 2997d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 3007d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return msg; 3017d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 3027d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 30303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huberstatic void appendIndent(AString *s, int32_t indent) { 30403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber static const char kWhitespace[] = 30503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber " " 30603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber " "; 30703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 30803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber CHECK_LT((size_t)indent, sizeof(kWhitespace)); 30903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 31003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber s->append(kWhitespace, indent); 31103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber} 31203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 31303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huberstatic bool isFourcc(uint32_t what) { 31403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber return isprint(what & 0xff) 31503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber && isprint((what >> 8) & 0xff) 31603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber && isprint((what >> 16) & 0xff) 31703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber && isprint((what >> 24) & 0xff); 31803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber} 31903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 32003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas HuberAString AMessage::debugString(int32_t indent) const { 32103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber AString s = "AMessage(what = "; 32203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 32303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber AString tmp; 32403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber if (isFourcc(mWhat)) { 32503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 32603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "'%c%c%c%c'", 32703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber (char)(mWhat >> 24), 32803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber (char)((mWhat >> 16) & 0xff), 32903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber (char)((mWhat >> 8) & 0xff), 33003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber (char)(mWhat & 0xff)); 33103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber } else { 33203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf("0x%08x", mWhat); 33303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber } 33403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber s.append(tmp); 33503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 33603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber if (mTarget != 0) { 33703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf(", target = %d", mTarget); 33803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber s.append(tmp); 33903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber } 34003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber s.append(") = {\n"); 34103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 34203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber for (size_t i = 0; i < mNumItems; ++i) { 34303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber const Item &item = mItems[i]; 34403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 34503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber switch (item.mType) { 34603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypeInt32: 34703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 34803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "int32_t %s = %d", item.mName, item.u.int32Value); 34903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 35003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypeInt64: 35103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 35203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "int64_t %s = %lld", item.mName, item.u.int64Value); 35303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 35403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypeSize: 35503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 35603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "size_t %s = %d", item.mName, item.u.sizeValue); 35703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 35803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypeFloat: 35903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 36003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "float %s = %f", item.mName, item.u.floatValue); 36103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 36203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypeDouble: 36303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 36403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "double %s = %f", item.mName, item.u.doubleValue); 36503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 36603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypePointer: 36703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 36803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "void *%s = %p", item.mName, item.u.ptrValue); 36903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 37003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypeString: 37103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 37203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "string %s = \"%s\"", 37303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber item.mName, 37403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber item.u.stringValue->c_str()); 37503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 37603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypeObject: 37703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 37803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "RefBase *%s = %p", item.mName, item.u.refValue); 37903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 38003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypeMessage: 38103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 38203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "AMessage %s = %s", 38303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber item.mName, 38403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber static_cast<AMessage *>( 38503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber item.u.refValue)->debugString( 38603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber indent + strlen(item.mName) + 14).c_str()); 38703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 388115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber case kTypeRect: 389115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber tmp = StringPrintf( 390115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber "Rect %s(%d, %d, %d, %d)", 391115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber item.mName, 392115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber item.u.rectValue.mLeft, 393115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber item.u.rectValue.mTop, 394115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber item.u.rectValue.mRight, 395115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber item.u.rectValue.mBottom); 396115cac8131e9b2a599ac5f10f9e973487c8fd25cAndreas Huber break; 39703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber default: 39803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber TRESPASS(); 39903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber } 40003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 40103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber appendIndent(&s, indent); 40203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber s.append(" "); 40303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber s.append(tmp); 40403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber s.append("\n"); 40503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber } 40603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 40703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber appendIndent(&s, indent); 40803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber s.append("}"); 40903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 41003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber return s; 41103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber} 41203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 413ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber// static 414ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Hubersp<AMessage> AMessage::FromParcel(const Parcel &parcel) { 415ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber int32_t what = parcel.readInt32(); 416ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber sp<AMessage> msg = new AMessage(what); 417ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 418ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber msg->mNumItems = static_cast<size_t>(parcel.readInt32()); 419ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 420ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber for (size_t i = 0; i < msg->mNumItems; ++i) { 421ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber Item *item = &msg->mItems[i]; 422ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 423ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->mName = AAtomizer::Atomize(parcel.readCString()); 424ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->mType = static_cast<Type>(parcel.readInt32()); 425ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 426ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber switch (item->mType) { 427ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeInt32: 428ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 429ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->u.int32Value = parcel.readInt32(); 430ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 431ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 432ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 433ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeInt64: 434ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 435ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->u.int64Value = parcel.readInt64(); 436ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 437ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 438ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 439ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeSize: 440ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 441ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->u.sizeValue = static_cast<size_t>(parcel.readInt32()); 442ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 443ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 444ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 445ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeFloat: 446ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 447ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->u.floatValue = parcel.readFloat(); 448ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 449ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 450ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 451ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeDouble: 452ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 453ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->u.doubleValue = parcel.readDouble(); 454ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 455ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 456ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 457ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeString: 458ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 459ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->u.stringValue = new AString(parcel.readCString()); 460ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 461ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 462ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 463ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeMessage: 464ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 465ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber sp<AMessage> subMsg = AMessage::FromParcel(parcel); 466ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber subMsg->incStrong(msg.get()); 467ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 468ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->u.refValue = subMsg.get(); 469ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 470ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 471ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 472ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber default: 473ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 474ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber LOGE("This type of object cannot cross process boundaries."); 475ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber TRESPASS(); 476ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 477ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 478ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 479ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 480ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber return msg; 481ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber} 482ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 483ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Hubervoid AMessage::writeToParcel(Parcel *parcel) const { 484ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeInt32(static_cast<int32_t>(mWhat)); 485ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeInt32(static_cast<int32_t>(mNumItems)); 486ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 487ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 488ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber const Item &item = mItems[i]; 489ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 490ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeCString(item.mName); 491ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeInt32(static_cast<int32_t>(item.mType)); 492ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 493ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber switch (item.mType) { 494ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeInt32: 495ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 496ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeInt32(item.u.int32Value); 497ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 498ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 499ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 500ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeInt64: 501ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 502ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeInt64(item.u.int64Value); 503ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 504ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 505ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 506ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeSize: 507ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 508ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeInt32(static_cast<int32_t>(item.u.sizeValue)); 509ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 510ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 511ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 512ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeFloat: 513ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 514ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeFloat(item.u.floatValue); 515ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 516ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 517ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 518ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeDouble: 519ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 520ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeDouble(item.u.doubleValue); 521ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 522ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 523ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 524ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeString: 525ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 526ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeCString(item.u.stringValue->c_str()); 527ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 528ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 529ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 530ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeMessage: 531ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 532ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber static_cast<AMessage *>(item.u.refValue)->writeToParcel(parcel); 533ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 534ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 535ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 536ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber default: 537ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 538ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber LOGE("This type of object cannot cross process boundaries."); 539ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber TRESPASS(); 540ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 541ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 542ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 543ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber} 544ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 5457d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} // namespace android 546