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// 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_IINTERFACE_H 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_IINTERFACE_H 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/Binder.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass IInterface : public virtual RefBase 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 3083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian IInterface(); 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<IBinder> asBinder(); 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<const IBinder> asBinder() const; 3383c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 3583c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian virtual ~IInterface(); 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual IBinder* onAsBinder() = 0; 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename INTERFACE> 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline sp<INTERFACE> interface_cast(const sp<IBinder>& obj) 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return INTERFACE::asInterface(obj); 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename INTERFACE> 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BnInterface : public INTERFACE, public BBinder 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual sp<IInterface> queryLocalInterface(const String16& _descriptor); 5483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian virtual const String16& getInterfaceDescriptor() const; 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual IBinder* onAsBinder(); 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename INTERFACE> 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpInterface : public INTERFACE, public BpRefBase 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project BpInterface(const sp<IBinder>& remote); 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual IBinder* onAsBinder(); 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define DECLARE_META_INTERFACE(INTERFACE) \ 75a3a884d9e298557b1540b33cab69271f521653c2Michael Richardson static const android::String16 descriptor; \ 76a3a884d9e298557b1540b33cab69271f521653c2Michael Richardson static android::sp<I##INTERFACE> asInterface( \ 77a3a884d9e298557b1540b33cab69271f521653c2Michael Richardson const android::sp<android::IBinder>& obj); \ 78a3a884d9e298557b1540b33cab69271f521653c2Michael Richardson virtual const android::String16& getInterfaceDescriptor() const; \ 7983c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian I##INTERFACE(); \ 8083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian virtual ~I##INTERFACE(); \ 8183c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \ 84a3a884d9e298557b1540b33cab69271f521653c2Michael Richardson const android::String16 I##INTERFACE::descriptor(NAME); \ 85a3a884d9e298557b1540b33cab69271f521653c2Michael Richardson const android::String16& \ 86a3a884d9e298557b1540b33cab69271f521653c2Michael Richardson I##INTERFACE::getInterfaceDescriptor() const { \ 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return I##INTERFACE::descriptor; \ 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } \ 89a3a884d9e298557b1540b33cab69271f521653c2Michael Richardson android::sp<I##INTERFACE> I##INTERFACE::asInterface( \ 90a3a884d9e298557b1540b33cab69271f521653c2Michael Richardson const android::sp<android::IBinder>& obj) \ 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { \ 92a3a884d9e298557b1540b33cab69271f521653c2Michael Richardson android::sp<I##INTERFACE> intr; \ 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (obj != NULL) { \ 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project intr = static_cast<I##INTERFACE*>( \ 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project obj->queryLocalInterface( \ 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project I##INTERFACE::descriptor).get()); \ 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (intr == NULL) { \ 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project intr = new Bp##INTERFACE(obj); \ 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } \ 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } \ 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return intr; \ 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } \ 10383c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian I##INTERFACE::I##INTERFACE() { } \ 10483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian I##INTERFACE::~I##INTERFACE() { } \ 10583c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian 10683c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian 10783c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian#define CHECK_INTERFACE(interface, data, reply) \ 10883c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian if (!data.checkInterface(this)) { return PERMISSION_DENIED; } \ 10983c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 11283c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian// No user-serviceable parts after this... 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename INTERFACE> 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline sp<IInterface> BnInterface<INTERFACE>::queryLocalInterface( 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const String16& _descriptor) 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (_descriptor == INTERFACE::descriptor) return this; 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NULL; 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename INTERFACE> 12383c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopianinline const String16& BnInterface<INTERFACE>::getInterfaceDescriptor() const 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return INTERFACE::getInterfaceDescriptor(); 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename INTERFACE> 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIBinder* BnInterface<INTERFACE>::onAsBinder() 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return this; 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename INTERFACE> 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote) 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : BpRefBase(remote) 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename INTERFACE> 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline IBinder* BpInterface<INTERFACE>::onAsBinder() 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return remote(); 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_IINTERFACE_H 151