19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_IINTERFACE_H 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_IINTERFACE_H 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 210795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/Binder.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------- 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass IInterface : public virtual RefBase 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 30aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian IInterface(); 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> asBinder(); 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<const IBinder> asBinder() const; 33aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected: 35aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian virtual ~IInterface(); 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual IBinder* onAsBinder() = 0; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------- 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename INTERFACE> 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline sp<INTERFACE> interface_cast(const sp<IBinder>& obj) 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return INTERFACE::asInterface(obj); 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------- 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename INTERFACE> 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BnInterface : public INTERFACE, public BBinder 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IInterface> queryLocalInterface(const String16& _descriptor); 54aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian virtual const String16& getInterfaceDescriptor() const; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected: 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual IBinder* onAsBinder(); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------- 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename INTERFACE> 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BpInterface : public INTERFACE, public BpRefBase 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BpInterface(const sp<IBinder>& remote); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected: 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual IBinder* onAsBinder(); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------- 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define DECLARE_META_INTERFACE(INTERFACE) \ 755a870fee53ca94c7575503c72574ca0f068d52c7Michael Richardson static const android::String16 descriptor; \ 765a870fee53ca94c7575503c72574ca0f068d52c7Michael Richardson static android::sp<I##INTERFACE> asInterface( \ 775a870fee53ca94c7575503c72574ca0f068d52c7Michael Richardson const android::sp<android::IBinder>& obj); \ 785a870fee53ca94c7575503c72574ca0f068d52c7Michael Richardson virtual const android::String16& getInterfaceDescriptor() const; \ 79aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian I##INTERFACE(); \ 80aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian virtual ~I##INTERFACE(); \ 81aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \ 845a870fee53ca94c7575503c72574ca0f068d52c7Michael Richardson const android::String16 I##INTERFACE::descriptor(NAME); \ 855a870fee53ca94c7575503c72574ca0f068d52c7Michael Richardson const android::String16& \ 865a870fee53ca94c7575503c72574ca0f068d52c7Michael Richardson I##INTERFACE::getInterfaceDescriptor() const { \ 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return I##INTERFACE::descriptor; \ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } \ 895a870fee53ca94c7575503c72574ca0f068d52c7Michael Richardson android::sp<I##INTERFACE> I##INTERFACE::asInterface( \ 905a870fee53ca94c7575503c72574ca0f068d52c7Michael Richardson const android::sp<android::IBinder>& obj) \ 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { \ 925a870fee53ca94c7575503c72574ca0f068d52c7Michael Richardson android::sp<I##INTERFACE> intr; \ 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj != NULL) { \ 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intr = static_cast<I##INTERFACE*>( \ 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obj->queryLocalInterface( \ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project I##INTERFACE::descriptor).get()); \ 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intr == NULL) { \ 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intr = new Bp##INTERFACE(obj); \ 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } \ 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } \ 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return intr; \ 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } \ 103aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian I##INTERFACE::I##INTERFACE() { } \ 104aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian I##INTERFACE::~I##INTERFACE() { } \ 105aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian 106aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian 107aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian#define CHECK_INTERFACE(interface, data, reply) \ 108aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian if (!data.checkInterface(this)) { return PERMISSION_DENIED; } \ 109aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------- 112aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopian// No user-serviceable parts after this... 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename INTERFACE> 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline sp<IInterface> BnInterface<INTERFACE>::queryLocalInterface( 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String16& _descriptor) 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (_descriptor == INTERFACE::descriptor) return this; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename INTERFACE> 123aaf834a284a025cedd8ec1cf01d09e1790c1dcf8Mathias Agopianinline const String16& BnInterface<INTERFACE>::getInterfaceDescriptor() const 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return INTERFACE::getInterfaceDescriptor(); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename INTERFACE> 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectIBinder* BnInterface<INTERFACE>::onAsBinder() 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename INTERFACE> 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote) 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : BpRefBase(remote) 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projecttemplate<typename INTERFACE> 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectinline IBinder* BpInterface<INTERFACE>::onAsBinder() 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return remote(); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------- 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_IINTERFACE_H 151