|  | /* | 
|  | * Copyright (C) 2005 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | #ifndef ANDROID_BPBINDER_H | 
|  | #define ANDROID_BPBINDER_H | 
|  |  | 
|  | #include <binder/IBinder.h> | 
|  | #include <utils/KeyedVector.h> | 
|  | #include <utils/threads.h> | 
|  |  | 
|  | // --------------------------------------------------------------------------- | 
|  | namespace android { | 
|  |  | 
|  | class BpBinder : public IBinder | 
|  | { | 
|  | public: | 
|  | BpBinder(int32_t handle); | 
|  |  | 
|  | inline  int32_t     handle() const { return mHandle; } | 
|  |  | 
|  | virtual const String16&    getInterfaceDescriptor() const; | 
|  | virtual bool        isBinderAlive() const; | 
|  | virtual status_t    pingBinder(); | 
|  | virtual status_t    dump(int fd, const Vector<String16>& args); | 
|  |  | 
|  | virtual status_t    transact(   uint32_t code, | 
|  | const Parcel& data, | 
|  | Parcel* reply, | 
|  | uint32_t flags = 0); | 
|  |  | 
|  | virtual status_t    linkToDeath(const sp<DeathRecipient>& recipient, | 
|  | void* cookie = NULL, | 
|  | uint32_t flags = 0); | 
|  | virtual status_t    unlinkToDeath(  const wp<DeathRecipient>& recipient, | 
|  | void* cookie = NULL, | 
|  | uint32_t flags = 0, | 
|  | wp<DeathRecipient>* outRecipient = NULL); | 
|  |  | 
|  | virtual void        attachObject(   const void* objectID, | 
|  | void* object, | 
|  | void* cleanupCookie, | 
|  | object_cleanup_func func); | 
|  | virtual void*       findObject(const void* objectID) const; | 
|  | virtual void        detachObject(const void* objectID); | 
|  |  | 
|  | virtual BpBinder*   remoteBinder(); | 
|  |  | 
|  | status_t    setConstantData(const void* data, size_t size); | 
|  | void        sendObituary(); | 
|  |  | 
|  | class ObjectManager | 
|  | { | 
|  | public: | 
|  | ObjectManager(); | 
|  | ~ObjectManager(); | 
|  |  | 
|  | void        attach( const void* objectID, | 
|  | void* object, | 
|  | void* cleanupCookie, | 
|  | IBinder::object_cleanup_func func); | 
|  | void*       find(const void* objectID) const; | 
|  | void        detach(const void* objectID); | 
|  |  | 
|  | void        kill(); | 
|  |  | 
|  | private: | 
|  | ObjectManager(const ObjectManager&); | 
|  | ObjectManager& operator=(const ObjectManager&); | 
|  |  | 
|  | struct entry_t | 
|  | { | 
|  | void* object; | 
|  | void* cleanupCookie; | 
|  | IBinder::object_cleanup_func func; | 
|  | }; | 
|  |  | 
|  | KeyedVector<const void*, entry_t> mObjects; | 
|  | }; | 
|  |  | 
|  | protected: | 
|  | virtual             ~BpBinder(); | 
|  | virtual void        onFirstRef(); | 
|  | virtual void        onLastStrongRef(const void* id); | 
|  | virtual bool        onIncStrongAttempted(uint32_t flags, const void* id); | 
|  |  | 
|  | private: | 
|  | const   int32_t             mHandle; | 
|  |  | 
|  | struct Obituary { | 
|  | wp<DeathRecipient> recipient; | 
|  | void* cookie; | 
|  | uint32_t flags; | 
|  | }; | 
|  |  | 
|  | void                reportOneDeath(const Obituary& obit); | 
|  | bool                isDescriptorCached() const; | 
|  |  | 
|  | mutable Mutex               mLock; | 
|  | volatile int32_t    mAlive; | 
|  | volatile int32_t    mObitsSent; | 
|  | Vector<Obituary>*   mObituaries; | 
|  | ObjectManager       mObjects; | 
|  | Parcel*             mConstantData; | 
|  | mutable String16            mDescriptorCache; | 
|  | }; | 
|  |  | 
|  | }; // namespace android | 
|  |  | 
|  | // --------------------------------------------------------------------------- | 
|  |  | 
|  | #endif // ANDROID_BPBINDER_H |