BpBinder.h revision edbf3b6af777b721cd2a1ef461947e51e88241e1
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_BPBINDER_H
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_BPBINDER_H
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/IBinder.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/KeyedVector.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpBinder : public IBinder
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        BpBinder(int32_t handle);
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline  int32_t     handle() const { return mHandle; }
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual String16    getInterfaceDescriptor() const;
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual bool        isBinderAlive() const;
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t    pingBinder();
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t    dump(int fd, const Vector<String16>& args);
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t    transact(   uint32_t code,
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    const Parcel& data,
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    Parcel* reply,
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    uint32_t flags = 0);
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t    linkToDeath(const sp<DeathRecipient>& recipient,
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    void* cookie = NULL,
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    uint32_t flags = 0);
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual status_t    unlinkToDeath(  const wp<DeathRecipient>& recipient,
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                        void* cookie = NULL,
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                        uint32_t flags = 0,
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                        wp<DeathRecipient>* outRecipient = NULL);
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void        attachObject(   const void* objectID,
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                        void* object,
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                        void* cleanupCookie,
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                        object_cleanup_func func);
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void*       findObject(const void* objectID) const;
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void        detachObject(const void* objectID);
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual BpBinder*   remoteBinder();
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            status_t    setConstantData(const void* data, size_t size);
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void        sendObituary();
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    class ObjectManager
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public:
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    ObjectManager();
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    ~ObjectManager();
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        void        attach( const void* objectID,
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            void* object,
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            void* cleanupCookie,
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            IBinder::object_cleanup_func func);
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        void*       find(const void* objectID) const;
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        void        detach(const void* objectID);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        void        kill();
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    private:
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    ObjectManager(const ObjectManager&);
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        ObjectManager& operator=(const ObjectManager&);
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        struct entry_t
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        {
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void* object;
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void* cleanupCookie;
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            IBinder::object_cleanup_func func;
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        };
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        KeyedVector<const void*, entry_t> mObjects;
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected:
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual             ~BpBinder();
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void        onFirstRef();
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual void        onLastStrongRef(const void* id);
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    virtual bool        onIncStrongAttempted(uint32_t flags, const void* id);
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate:
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const   int32_t             mHandle;
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    struct Obituary {
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        wp<DeathRecipient> recipient;
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        void* cookie;
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t flags;
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            void                reportOneDeath(const Obituary& obit);
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mutable Mutex               mLock;
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            volatile int32_t    mAlive;
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            volatile int32_t    mObitsSent;
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Vector<Obituary>*   mObituaries;
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            ObjectManager       mObjects;
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Parcel*             mConstantData;
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_BPBINDER_H
123