19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_BPBINDER_H
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_BPBINDER_H
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
200795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IBinder.h>
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/KeyedVector.h>
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BpBinder : public IBinder
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        BpBinder(int32_t handle);
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    inline  int32_t     handle() const { return mHandle; }
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian    virtual const String16&    getInterfaceDescriptor() const;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool        isBinderAlive() const;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t    pingBinder();
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t    dump(int fd, const Vector<String16>& args);
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t    transact(   uint32_t code,
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    const Parcel& data,
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    Parcel* reply,
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    uint32_t flags = 0);
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t    linkToDeath(const sp<DeathRecipient>& recipient,
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    void* cookie = NULL,
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    uint32_t flags = 0);
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual status_t    unlinkToDeath(  const wp<DeathRecipient>& recipient,
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        void* cookie = NULL,
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        uint32_t flags = 0,
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        wp<DeathRecipient>* outRecipient = NULL);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void        attachObject(   const void* objectID,
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        void* object,
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        void* cleanupCookie,
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        object_cleanup_func func);
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void*       findObject(const void* objectID) const;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void        detachObject(const void* objectID);
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual BpBinder*   remoteBinder();
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            status_t    setConstantData(const void* data, size_t size);
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void        sendObituary();
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class ObjectManager
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public:
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ObjectManager();
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ~ObjectManager();
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void        attach( const void* objectID,
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            void* object,
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            void* cleanupCookie,
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            IBinder::object_cleanup_func func);
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void*       find(const void* objectID) const;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void        detach(const void* objectID);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void        kill();
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private:
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ObjectManager(const ObjectManager&);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ObjectManager& operator=(const ObjectManager&);
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        struct entry_t
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void* object;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void* cleanupCookie;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder::object_cleanup_func func;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        KeyedVector<const void*, entry_t> mObjects;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected:
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual             ~BpBinder();
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void        onFirstRef();
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual void        onLastStrongRef(const void* id);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    virtual bool        onIncStrongAttempted(uint32_t flags, const void* id);
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const   int32_t             mHandle;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    struct Obituary {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wp<DeathRecipient> recipient;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void* cookie;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t flags;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void                reportOneDeath(const Obituary& obit);
109aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian            bool                isDescriptorCached() const;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mutable Mutex               mLock;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            volatile int32_t    mAlive;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            volatile int32_t    mObitsSent;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Vector<Obituary>*   mObituaries;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ObjectManager       mObjects;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel*             mConstantData;
117aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian    mutable String16            mDescriptorCache;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_BPBINDER_H
125