IInterface.h revision edbf3b6af777b721cd2a1ef461947e51e88241e1
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 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/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: 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<IBinder> asBinder(); 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<const IBinder> asBinder() const; 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual IBinder* onAsBinder() = 0; 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename INTERFACE> 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline sp<INTERFACE> interface_cast(const sp<IBinder>& obj) 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return INTERFACE::asInterface(obj); 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename INTERFACE> 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BnInterface : public INTERFACE, public BBinder 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual sp<IInterface> queryLocalInterface(const String16& _descriptor); 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual String16 getInterfaceDescriptor() const; 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual IBinder* onAsBinder(); 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename INTERFACE> 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpInterface : public INTERFACE, public BpRefBase 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project BpInterface(const sp<IBinder>& remote); 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprotected: 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual IBinder* onAsBinder(); 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define DECLARE_META_INTERFACE(INTERFACE) \ 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static const String16 descriptor; \ 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project static sp<I##INTERFACE> asInterface(const sp<IBinder>& obj); \ 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual String16 getInterfaceDescriptor() const; \ 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \ 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const String16 I##INTERFACE::descriptor(NAME); \ 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String16 I##INTERFACE::getInterfaceDescriptor() const { \ 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return I##INTERFACE::descriptor; \ 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } \ 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<I##INTERFACE> I##INTERFACE::asInterface(const sp<IBinder>& obj) \ 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { \ 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<I##INTERFACE> intr; \ 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (obj != NULL) { \ 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project intr = static_cast<I##INTERFACE*>( \ 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project obj->queryLocalInterface( \ 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project I##INTERFACE::descriptor).get()); \ 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (intr == NULL) { \ 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project intr = new Bp##INTERFACE(obj); \ 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } \ 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } \ 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return intr; \ 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } \ 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// No user-servicable parts after this... 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename INTERFACE> 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline sp<IInterface> BnInterface<INTERFACE>::queryLocalInterface( 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const String16& _descriptor) 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (_descriptor == INTERFACE::descriptor) return this; 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NULL; 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename INTERFACE> 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline String16 BnInterface<INTERFACE>::getInterfaceDescriptor() const 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return INTERFACE::getInterfaceDescriptor(); 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename INTERFACE> 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIBinder* BnInterface<INTERFACE>::onAsBinder() 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return this; 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename INTERFACE> 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote) 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : BpRefBase(remote) 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename INTERFACE> 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectinline IBinder* BpInterface<INTERFACE>::onAsBinder() 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return remote(); 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_IINTERFACE_H 136