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