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