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#ifndef A_MESSAGE_H_ 1872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1972961230a5890071bcca436eb5630172ce84ec41Andreas Huber#define A_MESSAGE_H_ 2072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2172961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <media/stagefright/foundation/ABase.h> 2272961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <media/stagefright/foundation/ALooper.h> 2372961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <utils/KeyedVector.h> 2472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#include <utils/RefBase.h> 2572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2672961230a5890071bcca436eb5630172ce84ec41Andreas Hubernamespace android { 2772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 282d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huberstruct ABuffer; 295804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnarstruct AHandler; 3072961230a5890071bcca436eb5630172ce84ec41Andreas Huberstruct AString; 316d339f1f764bbd32e3381dae7bfa7c6c575bb493Lajos Molnarclass Parcel; 3272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 333f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstruct AReplyToken : public RefBase { 343f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar AReplyToken(const sp<ALooper> &looper) 353f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar : mLooper(looper), 363f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar mReplied(false) { 373f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar } 383f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar 393f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarprivate: 403f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar friend struct AMessage; 413f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar friend struct ALooper; 423f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar wp<ALooper> mLooper; 433f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AMessage> mReply; 443f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar bool mReplied; 453f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar 463f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<ALooper> getLooper() const { 473f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return mLooper.promote(); 483f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar } 493f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar // if reply is not set, returns false; otherwise, it retrieves the reply and returns true 503f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar bool retrieveReply(sp<AMessage> *reply) { 513f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar if (mReplied) { 523f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar *reply = mReply; 533f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar mReply.clear(); 543f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar } 553f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar return mReplied; 563f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar } 573f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar // sets the reply for this token. returns OK or error 583f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar status_t setReply(const sp<AMessage> &reply); 593f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar}; 603f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar 6172961230a5890071bcca436eb5630172ce84ec41Andreas Huberstruct AMessage : public RefBase { 625804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar AMessage(); 635804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar AMessage(uint32_t what, const sp<const AHandler> &handler); 6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 658dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // Construct an AMessage from a parcel. 668dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // nestingAllowed determines how many levels AMessage can be nested inside 678dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // AMessage. The default value here is arbitrarily set to 255. 688dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // FromParcel() returns NULL on error, which occurs when the input parcel 698dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // contains 708dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // - an AMessage nested deeper than maxNestingLevel; or 718dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // - an item whose type is not recognized by this function. 728dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // Types currently recognized by this function are: 738dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // Item types set/find function suffixes 748dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // ========================================== 758dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // int32_t Int32 768dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // int64_t Int64 778dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // size_t Size 788dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // float Float 798dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // double Double 808dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // AString String 818dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // AMessage Message 828dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa static sp<AMessage> FromParcel(const Parcel &parcel, 838dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa size_t maxNestingLevel = 255); 848dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa 858dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // Write this AMessage to a parcel. 868dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // All items in the AMessage must have types that are recognized by 878dab17305ff72298e2b4874592ac72c004c392d8Pawin Vongmasa // FromParcel(); otherwise, TRESPASS error will occur. 8814acc736e336cbd6026df781d4f411e908831815Andreas Huber void writeToParcel(Parcel *parcel) const; 8914acc736e336cbd6026df781d4f411e908831815Andreas Huber 9072961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setWhat(uint32_t what); 9172961230a5890071bcca436eb5630172ce84ec41Andreas Huber uint32_t what() const; 9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber 935804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar void setTarget(const sp<const AHandler> &handler); 9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void clear(); 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setInt32(const char *name, int32_t value); 9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setInt64(const char *name, int64_t value); 9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setSize(const char *name, size_t value); 10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setFloat(const char *name, float value); 10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setDouble(const char *name, double value); 10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setPointer(const char *name, void *value); 10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setString(const char *name, const char *s, ssize_t len = -1); 104513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar void setString(const char *name, const AString &s); 10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setObject(const char *name, const sp<RefBase> &obj); 1062d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber void setBuffer(const char *name, const sp<ABuffer> &buffer); 10772961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setMessage(const char *name, const sp<AMessage> &obj); 10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber 10931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber void setRect( 11031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const char *name, 11131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t left, int32_t top, int32_t right, int32_t bottom); 11231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 113513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar bool contains(const char *name) const; 114513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar 11572961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findInt32(const char *name, int32_t *value) const; 11672961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findInt64(const char *name, int64_t *value) const; 11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findSize(const char *name, size_t *value) const; 11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findFloat(const char *name, float *value) const; 11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findDouble(const char *name, double *value) const; 12072961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findPointer(const char *name, void **value) const; 12172961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findString(const char *name, AString *value) const; 12272961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findObject(const char *name, sp<RefBase> *obj) const; 1232d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber bool findBuffer(const char *name, sp<ABuffer> *buffer) const; 12472961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findMessage(const char *name, sp<AMessage> *obj) const; 12572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber bool findRect( 12731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const char *name, 12831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const; 12931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 1305804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar status_t post(int64_t delayUs = 0); 13172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1325df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber // Posts the message to its target and waits for a response (or error) 1335df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber // before returning. 1345df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber status_t postAndAwaitResponse(sp<AMessage> *response); 1355df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 1365df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber // If this returns true, the sender of this message is synchronously 1373f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar // awaiting a response and the reply token is consumed from the message 1383f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar // and stored into replyID. The reply token must be used to send the response 1393f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar // using "postReply" below. 1403f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar bool senderAwaitsResponse(sp<AReplyToken> *replyID); 1413f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar 1423f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar // Posts the message as a response to a reply token. A reply token can 1433f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar // only be used once. Returns OK if the response could be posted; otherwise, 1443f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar // an error. 1453f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar status_t postReply(const sp<AReplyToken> &replyID); 1465df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 1472c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber // Performs a deep-copy of "this", contained messages are in turn "dup'ed". 1482c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber // Warning: RefBase items, i.e. "objects" are _not_ copied but only have 1492c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber // their refcount incremented. 15072961230a5890071bcca436eb5630172ce84ec41Andreas Huber sp<AMessage> dup() const; 15172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1521734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar // Performs a shallow or deep comparison of |this| and |other| and returns 1531734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar // an AMessage with the differences. 1541734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar // Warning: RefBase items, i.e. "objects" are _not_ copied but only have 1551734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar // their refcount incremented. 1561734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar // This is true for AMessages that have no corresponding AMessage equivalent in |other|. 1571734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar // (E.g. there is no such key or the type is different.) On the other hand, changes in 1581734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar // the AMessage (or AMessages if deep is |false|) are returned in new objects. 1591734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar sp<AMessage> changesFrom(const sp<const AMessage> &other, bool deep = false) const; 1601734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar 161bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber AString debugString(int32_t indent = 0) const; 162bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 16372961230a5890071bcca436eb5630172ce84ec41Andreas Huber enum Type { 16472961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypeInt32, 16572961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypeInt64, 16672961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypeSize, 16772961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypeFloat, 16872961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypeDouble, 16972961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypePointer, 17072961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypeString, 17172961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypeObject, 17272961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypeMessage, 17331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber kTypeRect, 1742d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber kTypeBuffer, 17572961230a5890071bcca436eb5630172ce84ec41Andreas Huber }; 17672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t countEntries() const; 1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber const char *getEntryNameAt(size_t index, Type *type) const; 1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1805778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected: 1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber virtual ~AMessage(); 1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1835778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate: 1845804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar friend struct ALooper; // deliver() 1855804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar 18672961230a5890071bcca436eb5630172ce84ec41Andreas Huber uint32_t mWhat; 1875804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar 1885804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar // used only for debugging 18972961230a5890071bcca436eb5630172ce84ec41Andreas Huber ALooper::handler_id mTarget; 19072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1915804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar wp<AHandler> mHandler; 1925804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar wp<ALooper> mLooper; 1935804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar 19431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber struct Rect { 19531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t mLeft, mTop, mRight, mBottom; 19631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber }; 19731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 19872961230a5890071bcca436eb5630172ce84ec41Andreas Huber struct Item { 19972961230a5890071bcca436eb5630172ce84ec41Andreas Huber union { 20072961230a5890071bcca436eb5630172ce84ec41Andreas Huber int32_t int32Value; 20172961230a5890071bcca436eb5630172ce84ec41Andreas Huber int64_t int64Value; 20272961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t sizeValue; 20372961230a5890071bcca436eb5630172ce84ec41Andreas Huber float floatValue; 20472961230a5890071bcca436eb5630172ce84ec41Andreas Huber double doubleValue; 20572961230a5890071bcca436eb5630172ce84ec41Andreas Huber void *ptrValue; 20672961230a5890071bcca436eb5630172ce84ec41Andreas Huber RefBase *refValue; 20772961230a5890071bcca436eb5630172ce84ec41Andreas Huber AString *stringValue; 20831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber Rect rectValue; 20972961230a5890071bcca436eb5630172ce84ec41Andreas Huber } u; 21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *mName; 2117ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar size_t mNameLength; 21272961230a5890071bcca436eb5630172ce84ec41Andreas Huber Type mType; 2137ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar void setName(const char *name, size_t len); 21472961230a5890071bcca436eb5630172ce84ec41Andreas Huber }; 21572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 21672961230a5890071bcca436eb5630172ce84ec41Andreas Huber enum { 217e370bb62b89d2f2980f519392010ea08a24c558eAndreas Huber kMaxNumItems = 64 21872961230a5890071bcca436eb5630172ce84ec41Andreas Huber }; 21972961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item mItems[kMaxNumItems]; 22072961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t mNumItems; 22172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 22272961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *allocateItem(const char *name); 2237ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar void freeItemValue(Item *item); 22472961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *findItem(const char *name, Type type) const; 22572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 2262d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber void setObjectInternal( 2272d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber const char *name, const sp<RefBase> &obj, Type type); 2282d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 2297ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar size_t findItemIndex(const char *name, size_t len) const; 2307ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar 2315804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar void deliver(); 2325804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar 23372961230a5890071bcca436eb5630172ce84ec41Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(AMessage); 23472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}; 23572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 23672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} // namespace android 23772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 23872961230a5890071bcca436eb5630172ce84ec41Andreas Huber#endif // A_MESSAGE_H_ 239