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 {
3440d8899f60c5212af9d727ba0ffaaecf676ebd1dChih-Hung Hsieh    explicit 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
12601c10f8cdcd58d1e7025f426a72e6e75ba5d7fc2Lajos Molnar    // finds signed integer types cast to int64_t
12701c10f8cdcd58d1e7025f426a72e6e75ba5d7fc2Lajos Molnar    bool findAsInt64(const char *name, int64_t *value) const;
12801c10f8cdcd58d1e7025f426a72e6e75ba5d7fc2Lajos Molnar
12963a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar    // finds any numeric type cast to a float
13063a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar    bool findAsFloat(const char *name, float *value) const;
13163a4d50f472ca67b3174ae51911091e44db6956eLajos Molnar
13231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    bool findRect(
13331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber            const char *name,
13431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber            int32_t *left, int32_t *top, int32_t *right, int32_t *bottom) const;
13531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
1365804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    status_t post(int64_t delayUs = 0);
13772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1385df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    // Posts the message to its target and waits for a response (or error)
1395df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    // before returning.
1405df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    status_t postAndAwaitResponse(sp<AMessage> *response);
1415df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
1425df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber    // If this returns true, the sender of this message is synchronously
1433f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // awaiting a response and the reply token is consumed from the message
1443f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // and stored into replyID. The reply token must be used to send the response
1453f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // using "postReply" below.
1463f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    bool senderAwaitsResponse(sp<AReplyToken> *replyID);
1473f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar
1483f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // Posts the message as a response to a reply token.  A reply token can
1493f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // only be used once. Returns OK if the response could be posted; otherwise,
1503f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    // an error.
1513f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    status_t postReply(const sp<AReplyToken> &replyID);
1525df775d2f509c76e76a46615fca83dba95299f6eAndreas Huber
1532c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber    // Performs a deep-copy of "this", contained messages are in turn "dup'ed".
1542c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber    // Warning: RefBase items, i.e. "objects" are _not_ copied but only have
1552c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber    // their refcount incremented.
15672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    sp<AMessage> dup() const;
15772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1581734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar    // Performs a shallow or deep comparison of |this| and |other| and returns
1591734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar    // an AMessage with the differences.
1601734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar    // Warning: RefBase items, i.e. "objects" are _not_ copied but only have
1611734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar    // their refcount incremented.
1621734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar    // This is true for AMessages that have no corresponding AMessage equivalent in |other|.
1631734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar    // (E.g. there is no such key or the type is different.) On the other hand, changes in
1641734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar    // the AMessage (or AMessages if deep is |false|) are returned in new objects.
1651734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar    sp<AMessage> changesFrom(const sp<const AMessage> &other, bool deep = false) const;
1661734c7d01c1567568ced29398b23abd601fd44cbLajos Molnar
167bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber    AString debugString(int32_t indent = 0) const;
168bbc2b8289458cfde931b133bad0c9d1026674ee7Andreas Huber
16972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    enum Type {
17072961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeInt32,
17172961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeInt64,
17272961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeSize,
17372961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeFloat,
17472961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeDouble,
17572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypePointer,
17672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeString,
17772961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeObject,
17872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        kTypeMessage,
17931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        kTypeRect,
1802d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        kTypeBuffer,
18172961230a5890071bcca436eb5630172ce84ec41Andreas Huber    };
18272961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t countEntries() const;
1845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    const char *getEntryNameAt(size_t index, Type *type) const;
1855778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1865778822d86b0337407514b9372562b86edfa91cdAndreas Huberprotected:
1875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    virtual ~AMessage();
1885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1895778822d86b0337407514b9372562b86edfa91cdAndreas Huberprivate:
1905804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    friend struct ALooper; // deliver()
1915804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar
19272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    uint32_t mWhat;
1935804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar
1945804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    // used only for debugging
19572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    ALooper::handler_id mTarget;
19672961230a5890071bcca436eb5630172ce84ec41Andreas Huber
1975804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    wp<AHandler> mHandler;
1985804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    wp<ALooper> mLooper;
1995804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar
20031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    struct Rect {
20131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber        int32_t mLeft, mTop, mRight, mBottom;
20231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber    };
20331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
20472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    struct Item {
20572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        union {
20672961230a5890071bcca436eb5630172ce84ec41Andreas Huber            int32_t int32Value;
20772961230a5890071bcca436eb5630172ce84ec41Andreas Huber            int64_t int64Value;
20872961230a5890071bcca436eb5630172ce84ec41Andreas Huber            size_t sizeValue;
20972961230a5890071bcca436eb5630172ce84ec41Andreas Huber            float floatValue;
21072961230a5890071bcca436eb5630172ce84ec41Andreas Huber            double doubleValue;
21172961230a5890071bcca436eb5630172ce84ec41Andreas Huber            void *ptrValue;
21272961230a5890071bcca436eb5630172ce84ec41Andreas Huber            RefBase *refValue;
21372961230a5890071bcca436eb5630172ce84ec41Andreas Huber            AString *stringValue;
21431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber            Rect rectValue;
21572961230a5890071bcca436eb5630172ce84ec41Andreas Huber        } u;
21672961230a5890071bcca436eb5630172ce84ec41Andreas Huber        const char *mName;
2177ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        size_t      mNameLength;
21872961230a5890071bcca436eb5630172ce84ec41Andreas Huber        Type mType;
2197ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar        void setName(const char *name, size_t len);
22072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    };
22172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
22272961230a5890071bcca436eb5630172ce84ec41Andreas Huber    enum {
223e370bb62b89d2f2980f519392010ea08a24c558eAndreas Huber        kMaxNumItems = 64
22472961230a5890071bcca436eb5630172ce84ec41Andreas Huber    };
22572961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item mItems[kMaxNumItems];
22672961230a5890071bcca436eb5630172ce84ec41Andreas Huber    size_t mNumItems;
22772961230a5890071bcca436eb5630172ce84ec41Andreas Huber
22872961230a5890071bcca436eb5630172ce84ec41Andreas Huber    Item *allocateItem(const char *name);
2297ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    void freeItemValue(Item *item);
23072961230a5890071bcca436eb5630172ce84ec41Andreas Huber    const Item *findItem(const char *name, Type type) const;
23172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
2322d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    void setObjectInternal(
2332d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber            const char *name, const sp<RefBase> &obj, Type type);
2342d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber
2357ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar    size_t findItemIndex(const char *name, size_t len) const;
2367ea429295a2eb31f2d9256c36c1ef53a195456acLajos Molnar
2375804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar    void deliver();
2385804a76ac5f9f3c311f1bbbcc5ebdc8f8568ae14Lajos Molnar
23972961230a5890071bcca436eb5630172ce84ec41Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(AMessage);
24072961230a5890071bcca436eb5630172ce84ec41Andreas Huber};
24172961230a5890071bcca436eb5630172ce84ec41Andreas Huber
24272961230a5890071bcca436eb5630172ce84ec41Andreas Huber}  // namespace android
24372961230a5890071bcca436eb5630172ce84ec41Andreas Huber
24472961230a5890071bcca436eb5630172ce84ec41Andreas Huber#endif  // A_MESSAGE_H_
245