AMessage.cpp revision ae9d5072534de65d9ea41def2e1b4258a1731ca4
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 307d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberAMessage::AMessage(uint32_t what, ALooper::handler_id target) 317d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber : mWhat(what), 327d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber mTarget(target), 337d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber mNumItems(0) { 347d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 357d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 367d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberAMessage::~AMessage() { 377d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber clear(); 387d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 397d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 407d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setWhat(uint32_t what) { 417d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber mWhat = what; 427d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 437d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 447d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberuint32_t AMessage::what() const { 457d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return mWhat; 467d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 477d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 487d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setTarget(ALooper::handler_id handlerID) { 497d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber mTarget = handlerID; 507d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 517d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 527d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberALooper::handler_id AMessage::target() const { 537d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return mTarget; 547d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 557d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 567d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::clear() { 577d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 587d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber Item *item = &mItems[i]; 597d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber freeItem(item); 607d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 617d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber mNumItems = 0; 627d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 637d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 647d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::freeItem(Item *item) { 657d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber switch (item->mType) { 667d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber case kTypeString: 677d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber { 687d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber delete item->u.stringValue; 697d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber break; 707d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 717d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 727d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber case kTypeObject: 737d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber case kTypeMessage: 747d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber { 757d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (item->u.refValue != NULL) { 767d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->u.refValue->decStrong(this); 777d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 787d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber break; 797d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 807d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 817d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber default: 827d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber break; 837d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 847d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 857d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 867d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberAMessage::Item *AMessage::allocateItem(const char *name) { 877d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber name = AAtomizer::Atomize(name); 887d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 897d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber size_t i = 0; 907d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber while (i < mNumItems && mItems[i].mName != name) { 917d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber ++i; 927d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 937d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 947d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber Item *item; 957d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 967d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (i < mNumItems) { 977d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item = &mItems[i]; 987d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber freeItem(item); 997d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } else { 1007d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber CHECK(mNumItems < kMaxNumItems); 1017d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber i = mNumItems++; 1027d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item = &mItems[i]; 1037d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1047d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->mName = name; 1057d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 1067d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1077d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return item; 1087d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 1097d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1107d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberconst AMessage::Item *AMessage::findItem( 1117d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber const char *name, Type type) const { 1127d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber name = AAtomizer::Atomize(name); 1137d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1147d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 1157d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber const Item *item = &mItems[i]; 1167d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1177d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (item->mName == name) { 1187d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return item->mType == type ? item : NULL; 1197d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 1207d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 1217d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1227d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return NULL; 1237d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 1247d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1257d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#define BASIC_TYPE(NAME,FIELDNAME,TYPENAME) \ 1267d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::set##NAME(const char *name, TYPENAME value) { \ 1277d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber Item *item = allocateItem(name); \ 1287d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber \ 1297d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->mType = kType##NAME; \ 1307d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->u.FIELDNAME = value; \ 1317d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} \ 1327d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber \ 1337d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberbool AMessage::find##NAME(const char *name, TYPENAME *value) const { \ 1347d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber const Item *item = findItem(name, kType##NAME); \ 1357d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (item) { \ 1367d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber *value = item->u.FIELDNAME; \ 1377d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return true; \ 1387d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } \ 1397d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return false; \ 1407d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 1417d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1427d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Int32,int32Value,int32_t) 1437d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Int64,int64Value,int64_t) 1447d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Size,sizeValue,size_t) 1457d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Float,floatValue,float) 1467d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Double,doubleValue,double) 1477d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas HuberBASIC_TYPE(Pointer,ptrValue,void *) 1487d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1497d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber#undef BASIC_TYPE 1507d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1517d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setString( 1527d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber const char *name, const char *s, ssize_t len) { 1537d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber Item *item = allocateItem(name); 1547d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->mType = kTypeString; 1557d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->u.stringValue = new AString(s, len < 0 ? strlen(s) : len); 1567d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 1577d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1587d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setObject(const char *name, const sp<RefBase> &obj) { 1597d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber Item *item = allocateItem(name); 1607d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->mType = kTypeObject; 1617d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1627d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (obj != NULL) { obj->incStrong(this); } 1637d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->u.refValue = obj.get(); 1647d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 1657d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1667d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::setMessage(const char *name, const sp<AMessage> &obj) { 1677d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber Item *item = allocateItem(name); 1687d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->mType = kTypeMessage; 1697d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1707d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (obj != NULL) { obj->incStrong(this); } 1717d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber item->u.refValue = obj.get(); 1727d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 1737d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1747d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberbool AMessage::findString(const char *name, AString *value) const { 1757d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber const Item *item = findItem(name, kTypeString); 1767d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (item) { 1777d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber *value = *item->u.stringValue; 1787d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return true; 1797d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 1807d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return false; 1817d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 1827d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1837d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberbool AMessage::findObject(const char *name, sp<RefBase> *obj) const { 1847d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber const Item *item = findItem(name, kTypeObject); 1857d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (item) { 1867d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber *obj = item->u.refValue; 1877d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return true; 1887d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 1897d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return false; 1907d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 1917d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 1927d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huberbool AMessage::findMessage(const char *name, sp<AMessage> *obj) const { 1937d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber const Item *item = findItem(name, kTypeMessage); 1947d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber if (item) { 1957d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber *obj = static_cast<AMessage *>(item->u.refValue); 1967d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return true; 1977d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 1987d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return false; 1997d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 2007d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 2017d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubervoid AMessage::post(int64_t delayUs) { 2027d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber extern ALooperRoster gLooperRoster; 2037d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 2047d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber gLooperRoster.postMessage(this, delayUs); 2057d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 2067d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 2077d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Hubersp<AMessage> AMessage::dup() const { 2087d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber sp<AMessage> msg = new AMessage(mWhat, mTarget); 2097d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber msg->mNumItems = mNumItems; 2107d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 2117d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 2127d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber const Item *from = &mItems[i]; 2137d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber Item *to = &msg->mItems[i]; 2147d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 2157d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber to->mName = from->mName; 2167d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber to->mType = from->mType; 2177d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 2187d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber switch (from->mType) { 2197d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber case kTypeString: 2207d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber { 2217d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber to->u.stringValue = 2227d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber new AString(*from->u.stringValue); 2237d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber break; 2247d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 2257d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 2267d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber case kTypeObject: 2277d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber case kTypeMessage: 2287d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber { 2297d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber to->u.refValue = from->u.refValue; 2307d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber to->u.refValue->incStrong(msg.get()); 2317d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber break; 2327d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 2337d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 2347d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber default: 2357d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber { 2367d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber to->u = from->u; 2377d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber break; 2387d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 2397d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 2407d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber } 2417d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 2427d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber return msg; 2437d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} 2447d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber 24503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huberstatic void appendIndent(AString *s, int32_t indent) { 24603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber static const char kWhitespace[] = 24703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber " " 24803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber " "; 24903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 25003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber CHECK_LT((size_t)indent, sizeof(kWhitespace)); 25103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 25203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber s->append(kWhitespace, indent); 25303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber} 25403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 25503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huberstatic bool isFourcc(uint32_t what) { 25603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber return isprint(what & 0xff) 25703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber && isprint((what >> 8) & 0xff) 25803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber && isprint((what >> 16) & 0xff) 25903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber && isprint((what >> 24) & 0xff); 26003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber} 26103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 26203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas HuberAString AMessage::debugString(int32_t indent) const { 26303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber AString s = "AMessage(what = "; 26403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 26503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber AString tmp; 26603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber if (isFourcc(mWhat)) { 26703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 26803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "'%c%c%c%c'", 26903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber (char)(mWhat >> 24), 27003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber (char)((mWhat >> 16) & 0xff), 27103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber (char)((mWhat >> 8) & 0xff), 27203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber (char)(mWhat & 0xff)); 27303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber } else { 27403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf("0x%08x", mWhat); 27503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber } 27603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber s.append(tmp); 27703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 27803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber if (mTarget != 0) { 27903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf(", target = %d", mTarget); 28003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber s.append(tmp); 28103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber } 28203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber s.append(") = {\n"); 28303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 28403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber for (size_t i = 0; i < mNumItems; ++i) { 28503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber const Item &item = mItems[i]; 28603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 28703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber switch (item.mType) { 28803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypeInt32: 28903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 29003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "int32_t %s = %d", item.mName, item.u.int32Value); 29103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 29203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypeInt64: 29303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 29403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "int64_t %s = %lld", item.mName, item.u.int64Value); 29503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 29603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypeSize: 29703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 29803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "size_t %s = %d", item.mName, item.u.sizeValue); 29903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 30003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypeFloat: 30103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 30203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "float %s = %f", item.mName, item.u.floatValue); 30303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 30403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypeDouble: 30503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 30603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "double %s = %f", item.mName, item.u.doubleValue); 30703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 30803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypePointer: 30903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 31003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "void *%s = %p", item.mName, item.u.ptrValue); 31103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 31203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypeString: 31303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 31403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "string %s = \"%s\"", 31503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber item.mName, 31603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber item.u.stringValue->c_str()); 31703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 31803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypeObject: 31903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 32003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "RefBase *%s = %p", item.mName, item.u.refValue); 32103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 32203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber case kTypeMessage: 32303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber tmp = StringPrintf( 32403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber "AMessage %s = %s", 32503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber item.mName, 32603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber static_cast<AMessage *>( 32703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber item.u.refValue)->debugString( 32803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber indent + strlen(item.mName) + 14).c_str()); 32903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber break; 33003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber default: 33103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber TRESPASS(); 33203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber } 33303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 33403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber appendIndent(&s, indent); 33503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber s.append(" "); 33603431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber s.append(tmp); 33703431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber s.append("\n"); 33803431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber } 33903431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 34003431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber appendIndent(&s, indent); 34103431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber s.append("}"); 34203431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 34303431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber return s; 34403431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber} 34503431d2fa6ee51c122a987322cf1dbd4f89a077bAndreas Huber 346ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber// static 347ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Hubersp<AMessage> AMessage::FromParcel(const Parcel &parcel) { 348ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber int32_t what = parcel.readInt32(); 349ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber sp<AMessage> msg = new AMessage(what); 350ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 351ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber msg->mNumItems = static_cast<size_t>(parcel.readInt32()); 352ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 353ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber for (size_t i = 0; i < msg->mNumItems; ++i) { 354ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber Item *item = &msg->mItems[i]; 355ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 356ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->mName = AAtomizer::Atomize(parcel.readCString()); 357ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->mType = static_cast<Type>(parcel.readInt32()); 358ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 359ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber switch (item->mType) { 360ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeInt32: 361ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 362ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->u.int32Value = parcel.readInt32(); 363ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 364ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 365ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 366ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeInt64: 367ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 368ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->u.int64Value = parcel.readInt64(); 369ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 370ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 371ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 372ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeSize: 373ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 374ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->u.sizeValue = static_cast<size_t>(parcel.readInt32()); 375ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 376ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 377ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 378ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeFloat: 379ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 380ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->u.floatValue = parcel.readFloat(); 381ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 382ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 383ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 384ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeDouble: 385ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 386ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->u.doubleValue = parcel.readDouble(); 387ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 388ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 389ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 390ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeString: 391ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 392ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->u.stringValue = new AString(parcel.readCString()); 393ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 394ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 395ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 396ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeMessage: 397ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 398ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber sp<AMessage> subMsg = AMessage::FromParcel(parcel); 399ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber subMsg->incStrong(msg.get()); 400ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 401ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber item->u.refValue = subMsg.get(); 402ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 403ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 404ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 405ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber default: 406ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 407ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber LOGE("This type of object cannot cross process boundaries."); 408ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber TRESPASS(); 409ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 410ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 411ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 412ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 413ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber return msg; 414ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber} 415ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 416ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Hubervoid AMessage::writeToParcel(Parcel *parcel) const { 417ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeInt32(static_cast<int32_t>(mWhat)); 418ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeInt32(static_cast<int32_t>(mNumItems)); 419ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 420ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber for (size_t i = 0; i < mNumItems; ++i) { 421ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber const Item &item = mItems[i]; 422ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 423ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeCString(item.mName); 424ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeInt32(static_cast<int32_t>(item.mType)); 425ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 426ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber switch (item.mType) { 427ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeInt32: 428ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 429ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeInt32(item.u.int32Value); 430ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 431ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 432ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 433ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeInt64: 434ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 435ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeInt64(item.u.int64Value); 436ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 437ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 438ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 439ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeSize: 440ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 441ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeInt32(static_cast<int32_t>(item.u.sizeValue)); 442ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 443ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 444ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 445ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeFloat: 446ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 447ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeFloat(item.u.floatValue); 448ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 449ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 450ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 451ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeDouble: 452ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 453ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeDouble(item.u.doubleValue); 454ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 455ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 456ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 457ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeString: 458ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 459ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber parcel->writeCString(item.u.stringValue->c_str()); 460ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 461ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 462ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 463ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber case kTypeMessage: 464ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 465ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber static_cast<AMessage *>(item.u.refValue)->writeToParcel(parcel); 466ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber break; 467ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 468ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 469ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber default: 470ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber { 471ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber LOGE("This type of object cannot cross process boundaries."); 472ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber TRESPASS(); 473ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 474ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 475ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber } 476ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber} 477ae9d5072534de65d9ea41def2e1b4258a1731ca4Andreas Huber 4787d2f703649e270b635018f8b7219bb0e1d62a2e5Andreas Huber} // namespace android 479