blob: 959722a4d8af7387bd61d9a9b6d50338f76571f8 [file] [log] [blame]
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2005 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17//
18#ifndef ANDROID_IINTERFACE_H
19#define ANDROID_IINTERFACE_H
20
21#include <utils/Binder.h>
22
23namespace android {
24
25// ----------------------------------------------------------------------
26
27class IInterface : public virtual RefBase
28{
29public:
30 sp<IBinder> asBinder();
31 sp<const IBinder> asBinder() const;
32
33protected:
34 virtual IBinder* onAsBinder() = 0;
35};
36
37// ----------------------------------------------------------------------
38
39template<typename INTERFACE>
40inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
41{
42 return INTERFACE::asInterface(obj);
43}
44
45// ----------------------------------------------------------------------
46
47template<typename INTERFACE>
48class BnInterface : public INTERFACE, public BBinder
49{
50public:
51 virtual sp<IInterface> queryLocalInterface(const String16& _descriptor);
52 virtual String16 getInterfaceDescriptor() const;
53
54protected:
55 virtual IBinder* onAsBinder();
56};
57
58// ----------------------------------------------------------------------
59
60template<typename INTERFACE>
61class BpInterface : public INTERFACE, public BpRefBase
62{
63public:
64 BpInterface(const sp<IBinder>& remote);
65
66protected:
67 virtual IBinder* onAsBinder();
68};
69
70// ----------------------------------------------------------------------
71
72#define DECLARE_META_INTERFACE(INTERFACE) \
73 static const String16 descriptor; \
74 static sp<I##INTERFACE> asInterface(const sp<IBinder>& obj); \
75 virtual String16 getInterfaceDescriptor() const; \
76
77#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \
78 const String16 I##INTERFACE::descriptor(NAME); \
79 String16 I##INTERFACE::getInterfaceDescriptor() const { \
80 return I##INTERFACE::descriptor; \
81 } \
82 sp<I##INTERFACE> I##INTERFACE::asInterface(const sp<IBinder>& obj) \
83 { \
84 sp<I##INTERFACE> intr; \
85 if (obj != NULL) { \
86 intr = static_cast<I##INTERFACE*>( \
87 obj->queryLocalInterface( \
88 I##INTERFACE::descriptor).get()); \
89 if (intr == NULL) { \
90 intr = new Bp##INTERFACE(obj); \
91 } \
92 } \
93 return intr; \
94 } \
95
96// ----------------------------------------------------------------------
97// No user-servicable parts after this...
98
99template<typename INTERFACE>
100inline sp<IInterface> BnInterface<INTERFACE>::queryLocalInterface(
101 const String16& _descriptor)
102{
103 if (_descriptor == INTERFACE::descriptor) return this;
104 return NULL;
105}
106
107template<typename INTERFACE>
108inline String16 BnInterface<INTERFACE>::getInterfaceDescriptor() const
109{
110 return INTERFACE::getInterfaceDescriptor();
111}
112
113template<typename INTERFACE>
114IBinder* BnInterface<INTERFACE>::onAsBinder()
115{
116 return this;
117}
118
119template<typename INTERFACE>
120inline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote)
121 : BpRefBase(remote)
122{
123}
124
125template<typename INTERFACE>
126inline IBinder* BpInterface<INTERFACE>::onAsBinder()
127{
128 return remote();
129}
130
131// ----------------------------------------------------------------------
132
133}; // namespace android
134
135#endif // ANDROID_IINTERFACE_H