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