IInterface.h revision 83c0446f27b9542d6c2e724817b2b2d8d1f55085
1/* 2 * Copyright (C) 2005 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17// 18#ifndef ANDROID_IINTERFACE_H 19#define ANDROID_IINTERFACE_H 20 21#include <binder/Binder.h> 22 23namespace android { 24 25// ---------------------------------------------------------------------- 26 27class IInterface : public virtual RefBase 28{ 29public: 30 IInterface(); 31 sp<IBinder> asBinder(); 32 sp<const IBinder> asBinder() const; 33 34protected: 35 virtual ~IInterface(); 36 virtual IBinder* onAsBinder() = 0; 37}; 38 39// ---------------------------------------------------------------------- 40 41template<typename INTERFACE> 42inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj) 43{ 44 return INTERFACE::asInterface(obj); 45} 46 47// ---------------------------------------------------------------------- 48 49template<typename INTERFACE> 50class BnInterface : public INTERFACE, public BBinder 51{ 52public: 53 virtual sp<IInterface> queryLocalInterface(const String16& _descriptor); 54 virtual const String16& getInterfaceDescriptor() const; 55 56protected: 57 virtual IBinder* onAsBinder(); 58}; 59 60// ---------------------------------------------------------------------- 61 62template<typename INTERFACE> 63class BpInterface : public INTERFACE, public BpRefBase 64{ 65public: 66 BpInterface(const sp<IBinder>& remote); 67 68protected: 69 virtual IBinder* onAsBinder(); 70}; 71 72// ---------------------------------------------------------------------- 73 74#define DECLARE_META_INTERFACE(INTERFACE) \ 75 static const String16 descriptor; \ 76 static sp<I##INTERFACE> asInterface(const sp<IBinder>& obj); \ 77 virtual const String16& getInterfaceDescriptor() const; \ 78 I##INTERFACE(); \ 79 virtual ~I##INTERFACE(); \ 80 81 82#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \ 83 const String16 I##INTERFACE::descriptor(NAME); \ 84 const String16& I##INTERFACE::getInterfaceDescriptor() const { \ 85 return I##INTERFACE::descriptor; \ 86 } \ 87 sp<I##INTERFACE> I##INTERFACE::asInterface(const sp<IBinder>& obj) \ 88 { \ 89 sp<I##INTERFACE> intr; \ 90 if (obj != NULL) { \ 91 intr = static_cast<I##INTERFACE*>( \ 92 obj->queryLocalInterface( \ 93 I##INTERFACE::descriptor).get()); \ 94 if (intr == NULL) { \ 95 intr = new Bp##INTERFACE(obj); \ 96 } \ 97 } \ 98 return intr; \ 99 } \ 100 I##INTERFACE::I##INTERFACE() { } \ 101 I##INTERFACE::~I##INTERFACE() { } \ 102 103 104#define CHECK_INTERFACE(interface, data, reply) \ 105 if (!data.checkInterface(this)) { return PERMISSION_DENIED; } \ 106 107 108// ---------------------------------------------------------------------- 109// No user-serviceable parts after this... 110 111template<typename INTERFACE> 112inline sp<IInterface> BnInterface<INTERFACE>::queryLocalInterface( 113 const String16& _descriptor) 114{ 115 if (_descriptor == INTERFACE::descriptor) return this; 116 return NULL; 117} 118 119template<typename INTERFACE> 120inline const String16& BnInterface<INTERFACE>::getInterfaceDescriptor() const 121{ 122 return INTERFACE::getInterfaceDescriptor(); 123} 124 125template<typename INTERFACE> 126IBinder* BnInterface<INTERFACE>::onAsBinder() 127{ 128 return this; 129} 130 131template<typename INTERFACE> 132inline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote) 133 : BpRefBase(remote) 134{ 135} 136 137template<typename INTERFACE> 138inline IBinder* BpInterface<INTERFACE>::onAsBinder() 139{ 140 return remote(); 141} 142 143// ---------------------------------------------------------------------- 144 145}; // namespace android 146 147#endif // ANDROID_IINTERFACE_H 148