AMessage.h revision 31e2508c75018145a8238925ff1a08cbde4e799a
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
2872961230a5890071bcca436eb5630172ce84ec41Andreas Huberstruct AString;
2914acc736e336cbd6026df781d4f411e908831815Andreas Huberstruct Parcel;
3072961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3172961230a5890071bcca436eb5630172ce84ec41Andreas Huberstruct AMessage : public RefBase {
3272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    AMessage(uint32_t what = 0, ALooper::handler_id target = 0);
3372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
3414acc736e336cbd6026df781d4f411e908831815Andreas Huber    static sp<AMessage> FromParcel(const Parcel &parcel);
3514acc736e336cbd6026df781d4f411e908831815Andreas Huber    void writeToParcel(Parcel *parcel) const;
3614acc736e336cbd6026df781d4f411e908831815Andreas Huber
3772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void setWhat(uint32_t what);
3872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    uint32_t what() const;
3972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
4072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void setTarget(ALooper::handler_id target);
4172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    ALooper::handler_id target() const;
4272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    void clear();
44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void setInt32(const char *name, int32_t value);
4672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void setInt64(const char *name, int64_t value);
4772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void setSize(const char *name, size_t value);
4872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void setFloat(const char *name, float value);
4972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void setDouble(const char *name, double value);
5072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void setPointer(const char *name, void *value);
5172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void setString(const char *name, const char *s, ssize_t len = -1);
5272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void setObject(const char *name, const sp<RefBase> &obj);
5372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void setMessage(const char *name, const sp<AMessage> &obj);
5472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
5531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    void setRect(
5631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber            const char *name,
5731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber            int32_t left, int32_t top, int32_t right, int32_t bottom);
5831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
5972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findInt32(const char *name, int32_t *value) const;
6072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findInt64(const char *name, int64_t *value) const;
6172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findSize(const char *name, size_t *value) const;
6272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findFloat(const char *name, float *value) const;
6372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findDouble(const char *name, double *value) const;
6472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findPointer(const char *name, void **value) const;
6572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findString(const char *name, AString *value) const;
6672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findObject(const char *name, sp<RefBase> *obj) const;
6772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    bool findMessage(const char *name, sp<AMessage> *obj) const;
6872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
6931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    bool findRect(
7031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber            const char *name,
7131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber            int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const;
7231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
7372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void post(int64_t delayUs = 0);
7472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
752c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber    // Performs a deep-copy of "this", contained messages are in turn "dup'ed".
762c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber    // Warning: RefBase items, i.e. "objects" are _not_ copied but only have
772c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber    // their refcount incremented.
7872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    sp<AMessage> dup() const;
7972961230a5890071bcca436eb5630172ce84ec41Andreas Huber
80bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    AString debugString(int32_t indent = 0) const;
81bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
8272961230a5890071bcca436eb5630172ce84ec41Andreas Huberprotected:
8372961230a5890071bcca436eb5630172ce84ec41Andreas Huber    virtual ~AMessage();
8472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
8572961230a5890071bcca436eb5630172ce84ec41Andreas Huberprivate:
8672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    enum Type {
8772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeInt32,
8872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeInt64,
8972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeSize,
9072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeFloat,
9172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeDouble,
9272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypePointer,
9372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeString,
9472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeObject,
9572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeMessage,
9631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        kTypeRect,
9772961230a5890071bcca436eb5630172ce84ec41Andreas Huber    };
9872961230a5890071bcca436eb5630172ce84ec41Andreas Huber
9972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    uint32_t mWhat;
10072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    ALooper::handler_id mTarget;
10172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
10231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    struct Rect {
10331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        int32_t mLeft, mTop, mRight, mBottom;
10431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    };
10531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
10672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    struct Item {
10772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        union {
10872961230a5890071bcca436eb5630172ce84ec41Andreas Huber            int32_t int32Value;
10972961230a5890071bcca436eb5630172ce84ec41Andreas Huber            int64_t int64Value;
11072961230a5890071bcca436eb5630172ce84ec41Andreas Huber            size_t sizeValue;
11172961230a5890071bcca436eb5630172ce84ec41Andreas Huber            float floatValue;
11272961230a5890071bcca436eb5630172ce84ec41Andreas Huber            double doubleValue;
11372961230a5890071bcca436eb5630172ce84ec41Andreas Huber            void *ptrValue;
11472961230a5890071bcca436eb5630172ce84ec41Andreas Huber            RefBase *refValue;
11572961230a5890071bcca436eb5630172ce84ec41Andreas Huber            AString *stringValue;
11631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber            Rect rectValue;
11772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        } u;
11872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const char *mName;
11972961230a5890071bcca436eb5630172ce84ec41Andreas Huber        Type mType;
12072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    };
12172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
12272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    enum {
12372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kMaxNumItems = 16
12472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    };
12572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item mItems[kMaxNumItems];
12672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    size_t mNumItems;
12772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
12872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *allocateItem(const char *name);
12972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    void freeItem(Item *item);
13072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *findItem(const char *name, Type type) const;
13172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
13272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(AMessage);
13372961230a5890071bcca436eb5630172ce84ec41Andreas Huber};
13472961230a5890071bcca436eb5630172ce84ec41Andreas Huber
13572961230a5890071bcca436eb5630172ce84ec41Andreas Huber}  // namespace android
13672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
13772961230a5890071bcca436eb5630172ce84ec41Andreas Huber#endif  // A_MESSAGE_H_
138