You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							124 lines
						
					
					
						
							4.1 KiB
						
					
					
				
			
		
		
	
	
							124 lines
						
					
					
						
							4.1 KiB
						
					
					
				/*
 | 
						|
 * 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
 | 
						|
 |