AMessage.h revision e370bb62b89d2f2980f519392010ea08a24c558e
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; 2972961230a5890071bcca436eb5630172ce84ec41Andreas Huberstruct AString; 3014acc736e336cbd6026df781d4f411e908831815Andreas Huberstruct Parcel; 3172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3272961230a5890071bcca436eb5630172ce84ec41Andreas Huberstruct AMessage : public RefBase { 3372961230a5890071bcca436eb5630172ce84ec41Andreas Huber AMessage(uint32_t what = 0, ALooper::handler_id target = 0); 3472961230a5890071bcca436eb5630172ce84ec41Andreas Huber 3514acc736e336cbd6026df781d4f411e908831815Andreas Huber static sp<AMessage> FromParcel(const Parcel &parcel); 3614acc736e336cbd6026df781d4f411e908831815Andreas Huber void writeToParcel(Parcel *parcel) const; 3714acc736e336cbd6026df781d4f411e908831815Andreas Huber 3872961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setWhat(uint32_t what); 3972961230a5890071bcca436eb5630172ce84ec41Andreas Huber uint32_t what() const; 4072961230a5890071bcca436eb5630172ce84ec41Andreas Huber 4172961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setTarget(ALooper::handler_id target); 4272961230a5890071bcca436eb5630172ce84ec41Andreas Huber ALooper::handler_id target() const; 4372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void clear(); 45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4672961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setInt32(const char *name, int32_t value); 4772961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setInt64(const char *name, int64_t value); 4872961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setSize(const char *name, size_t value); 4972961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setFloat(const char *name, float value); 5072961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setDouble(const char *name, double value); 5172961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setPointer(const char *name, void *value); 5272961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setString(const char *name, const char *s, ssize_t len = -1); 5372961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setObject(const char *name, const sp<RefBase> &obj); 542d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber void setBuffer(const char *name, const sp<ABuffer> &buffer); 5572961230a5890071bcca436eb5630172ce84ec41Andreas Huber void setMessage(const char *name, const sp<AMessage> &obj); 5672961230a5890071bcca436eb5630172ce84ec41Andreas Huber 5731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber void setRect( 5831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const char *name, 5931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t left, int32_t top, int32_t right, int32_t bottom); 6031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findInt32(const char *name, int32_t *value) const; 6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findInt64(const char *name, int64_t *value) const; 6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findSize(const char *name, size_t *value) const; 6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findFloat(const char *name, float *value) const; 6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findDouble(const char *name, double *value) const; 6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findPointer(const char *name, void **value) const; 6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findString(const char *name, AString *value) const; 6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findObject(const char *name, sp<RefBase> *obj) const; 692d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber bool findBuffer(const char *name, sp<ABuffer> *buffer) const; 7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber bool findMessage(const char *name, sp<AMessage> *obj) const; 7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber 7231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber bool findRect( 7331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber const char *name, 7431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const; 7531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 7672961230a5890071bcca436eb5630172ce84ec41Andreas Huber void post(int64_t delayUs = 0); 7772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 785df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber // Posts the message to its target and waits for a response (or error) 795df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber // before returning. 805df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber status_t postAndAwaitResponse(sp<AMessage> *response); 815df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 825df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber // If this returns true, the sender of this message is synchronously 835df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber // awaiting a response, the "replyID" can be used to send the response 845df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber // via "postReply" below. 855df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber bool senderAwaitsResponse(uint32_t *replyID) const; 865df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 875df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber void postReply(uint32_t replyID); 885df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber 892c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber // Performs a deep-copy of "this", contained messages are in turn "dup'ed". 902c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber // Warning: RefBase items, i.e. "objects" are _not_ copied but only have 912c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber // their refcount incremented. 9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber sp<AMessage> dup() const; 9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber 94bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber AString debugString(int32_t indent = 0) const; 95bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber 9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber enum Type { 9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypeInt32, 9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypeInt64, 9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypeSize, 10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypeFloat, 10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypeDouble, 10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypePointer, 10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypeString, 10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypeObject, 10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber kTypeMessage, 10631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber kTypeRect, 1072d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber kTypeBuffer, 10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber }; 10972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1105778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t countEntries() const; 1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber const char *getEntryNameAt(size_t index, Type *type) const; 1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1135778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected: 1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber virtual ~AMessage(); 1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1165778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate: 11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber uint32_t mWhat; 11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber ALooper::handler_id mTarget; 11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 12031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber struct Rect { 12131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t mLeft, mTop, mRight, mBottom; 12231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber }; 12331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 12472961230a5890071bcca436eb5630172ce84ec41Andreas Huber struct Item { 12572961230a5890071bcca436eb5630172ce84ec41Andreas Huber union { 12672961230a5890071bcca436eb5630172ce84ec41Andreas Huber int32_t int32Value; 12772961230a5890071bcca436eb5630172ce84ec41Andreas Huber int64_t int64Value; 12872961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t sizeValue; 12972961230a5890071bcca436eb5630172ce84ec41Andreas Huber float floatValue; 13072961230a5890071bcca436eb5630172ce84ec41Andreas Huber double doubleValue; 13172961230a5890071bcca436eb5630172ce84ec41Andreas Huber void *ptrValue; 13272961230a5890071bcca436eb5630172ce84ec41Andreas Huber RefBase *refValue; 13372961230a5890071bcca436eb5630172ce84ec41Andreas Huber AString *stringValue; 13431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber Rect rectValue; 13572961230a5890071bcca436eb5630172ce84ec41Andreas Huber } u; 13672961230a5890071bcca436eb5630172ce84ec41Andreas Huber const char *mName; 13772961230a5890071bcca436eb5630172ce84ec41Andreas Huber Type mType; 13872961230a5890071bcca436eb5630172ce84ec41Andreas Huber }; 13972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 14072961230a5890071bcca436eb5630172ce84ec41Andreas Huber enum { 141e370bb62b89d2f2980f519392010ea08a24c558eAndreas Huber kMaxNumItems = 64 14272961230a5890071bcca436eb5630172ce84ec41Andreas Huber }; 14372961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item mItems[kMaxNumItems]; 14472961230a5890071bcca436eb5630172ce84ec41Andreas Huber size_t mNumItems; 14572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 14672961230a5890071bcca436eb5630172ce84ec41Andreas Huber Item *allocateItem(const char *name); 14772961230a5890071bcca436eb5630172ce84ec41Andreas Huber void freeItem(Item *item); 14872961230a5890071bcca436eb5630172ce84ec41Andreas Huber const Item *findItem(const char *name, Type type) const; 14972961230a5890071bcca436eb5630172ce84ec41Andreas Huber 1502d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber void setObjectInternal( 1512d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber const char *name, const sp<RefBase> &obj, Type type); 1522d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber 15372961230a5890071bcca436eb5630172ce84ec41Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(AMessage); 15472961230a5890071bcca436eb5630172ce84ec41Andreas Huber}; 15572961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15672961230a5890071bcca436eb5630172ce84ec41Andreas Huber} // namespace android 15772961230a5890071bcca436eb5630172ce84ec41Andreas Huber 15872961230a5890071bcca436eb5630172ce84ec41Andreas Huber#endif // A_MESSAGE_H_ 159