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);
53513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar    void setString(const char *name, const AString &s);
5472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void setObject(const char *name, const sp<RefBase> &obj);
552d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    void setBuffer(const char *name, const sp<ABuffer> &buffer);
5672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void setMessage(const char *name, const sp<AMessage> &obj);
5772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    void setRect(
5931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber            const char *name,
6031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber            int32_t left, int32_t top, int32_t right, int32_t bottom);
6131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
62513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar    bool contains(const char *name) const;
63513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar
6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findInt32(const char *name, int32_t *value) const;
6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findInt64(const char *name, int64_t *value) const;
6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findSize(const char *name, size_t *value) const;
6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findFloat(const char *name, float *value) const;
6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findDouble(const char *name, double *value) const;
6972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findPointer(const char *name, void **value) const;
7072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findString(const char *name, AString *value) const;
7172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findObject(const char *name, sp<RefBase> *obj) const;
722d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    bool findBuffer(const char *name, sp<ABuffer> *buffer) const;
7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findMessage(const char *name, sp<AMessage> *obj) const;
7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
7531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    bool findRect(
7631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber            const char *name,
7731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber            int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const;
7831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void post(int64_t delayUs = 0);
8072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
815df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    // Posts the message to its target and waits for a response (or error)
825df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    // before returning.
835df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    status_t postAndAwaitResponse(sp<AMessage> *response);
845df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
855df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    // If this returns true, the sender of this message is synchronously
865df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    // awaiting a response, the "replyID" can be used to send the response
875df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    // via "postReply" below.
885df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    bool senderAwaitsResponse(uint32_t *replyID) const;
895df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
905df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    void postReply(uint32_t replyID);
915df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
922c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber    // Performs a deep-copy of "this", contained messages are in turn "dup'ed".
932c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber    // Warning: RefBase items, i.e. "objects" are _not_ copied but only have
942c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber    // their refcount incremented.
9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    sp<AMessage> dup() const;
9672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
97bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    AString debugString(int32_t indent = 0) const;
98bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    enum Type {
10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeInt32,
10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeInt64,
10272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeSize,
10372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeFloat,
10472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeDouble,
10572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypePointer,
10672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeString,
10772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeObject,
10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeMessage,
10931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        kTypeRect,
1102d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        kTypeBuffer,
11172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    };
11272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t countEntries() const;
1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber    const char *getEntryNameAt(size_t index, Type *type) const;
1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1165778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected:
1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual ~AMessage();
1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1195778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate:
12072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    uint32_t mWhat;
12172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    ALooper::handler_id mTarget;
12272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
12331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    struct Rect {
12431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        int32_t mLeft, mTop, mRight, mBottom;
12531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    };
12631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
12772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    struct Item {
12872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        union {
12972961230a5890071bcca436eb5630172ce84ec41Andreas Huber            int32_t int32Value;
13072961230a5890071bcca436eb5630172ce84ec41Andreas Huber            int64_t int64Value;
13172961230a5890071bcca436eb5630172ce84ec41Andreas Huber            size_t sizeValue;
13272961230a5890071bcca436eb5630172ce84ec41Andreas Huber            float floatValue;
13372961230a5890071bcca436eb5630172ce84ec41Andreas Huber            double doubleValue;
13472961230a5890071bcca436eb5630172ce84ec41Andreas Huber            void *ptrValue;
13572961230a5890071bcca436eb5630172ce84ec41Andreas Huber            RefBase *refValue;
13672961230a5890071bcca436eb5630172ce84ec41Andreas Huber            AString *stringValue;
13731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber            Rect rectValue;
13872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        } u;
13972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const char *mName;
1407ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        size_t      mNameLength;
14172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        Type mType;
1427ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        void setName(const char *name, size_t len);
14372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    };
14472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
14572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    enum {
146e370bb62b89d2f2980f519392010ea08a24c558eAndreas Huber        kMaxNumItems = 64
14772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    };
14872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item mItems[kMaxNumItems];
14972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    size_t mNumItems;
15072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
15172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *allocateItem(const char *name);
1527ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    void freeItemValue(Item *item);
15372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *findItem(const char *name, Type type) const;
15472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1552d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    void setObjectInternal(
1562d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber            const char *name, const sp<RefBase> &obj, Type type);
1572d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber
1587ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    size_t findItemIndex(const char *name, size_t len) const;
1597ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar
16072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(AMessage);
16172961230a5890071bcca436eb5630172ce84ec41Andreas Huber};
16272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
16372961230a5890071bcca436eb5630172ce84ec41Andreas Huber}  // namespace android
16472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
16572961230a5890071bcca436eb5630172ce84ec41Andreas Huber#endif  // A_MESSAGE_H_
166