1 /*
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 <binder/Binder.h>
22 
23 namespace android {
24 
25 // ----------------------------------------------------------------------
26 
27 class IInterface : public virtual RefBase
28 {
29 public:
30             IInterface();
31             static sp<IBinder>  asBinder(const IInterface*);
32             static sp<IBinder>  asBinder(const sp<IInterface>&);
33 
34 protected:
35     virtual                     ~IInterface();
36     virtual IBinder*            onAsBinder() = 0;
37 };
38 
39 // ----------------------------------------------------------------------
40 
41 template<typename INTERFACE>
interface_cast(const sp<IBinder> & obj)42 inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
43 {
44     return INTERFACE::asInterface(obj);
45 }
46 
47 // ----------------------------------------------------------------------
48 
49 template<typename INTERFACE>
50 class BnInterface : public INTERFACE, public BBinder
51 {
52 public:
53     virtual sp<IInterface>      queryLocalInterface(const String16& _descriptor);
54     virtual const String16&     getInterfaceDescriptor() const;
55 
56 protected:
57     virtual IBinder*            onAsBinder();
58 };
59 
60 // ----------------------------------------------------------------------
61 
62 template<typename INTERFACE>
63 class BpInterface : public INTERFACE, public BpRefBase
64 {
65 public:
66                                 BpInterface(const sp<IBinder>& remote);
67 
68 protected:
69     virtual IBinder*            onAsBinder();
70 };
71 
72 // ----------------------------------------------------------------------
73 
74 #define DECLARE_META_INTERFACE(INTERFACE)                               \
75     static const android::String16 descriptor;                          \
76     static android::sp<I##INTERFACE> asInterface(                       \
77             const android::sp<android::IBinder>& obj);                  \
78     virtual const android::String16& getInterfaceDescriptor() const;    \
79     I##INTERFACE();                                                     \
80     virtual ~I##INTERFACE();                                            \
81 
82 
83 #define IMPLEMENT_META_INTERFACE(INTERFACE, NAME)                       \
84     const android::String16 I##INTERFACE::descriptor(NAME);             \
85     const android::String16&                                            \
86             I##INTERFACE::getInterfaceDescriptor() const {              \
87         return I##INTERFACE::descriptor;                                \
88     }                                                                   \
89     android::sp<I##INTERFACE> I##INTERFACE::asInterface(                \
90             const android::sp<android::IBinder>& obj)                   \
91     {                                                                   \
92         android::sp<I##INTERFACE> intr;                                 \
93         if (obj != NULL) {                                              \
94             intr = static_cast<I##INTERFACE*>(                          \
95                 obj->queryLocalInterface(                               \
96                         I##INTERFACE::descriptor).get());               \
97             if (intr == NULL) {                                         \
98                 intr = new Bp##INTERFACE(obj);                          \
99             }                                                           \
100         }                                                               \
101         return intr;                                                    \
102     }                                                                   \
103     I##INTERFACE::I##INTERFACE() { }                                    \
104     I##INTERFACE::~I##INTERFACE() { }                                   \
105 
106 
107 #define CHECK_INTERFACE(interface, data, reply)                         \
108     if (!data.checkInterface(this)) { return PERMISSION_DENIED; }       \
109 
110 
111 // ----------------------------------------------------------------------
112 // No user-serviceable parts after this...
113 
114 template<typename INTERFACE>
queryLocalInterface(const String16 & _descriptor)115 inline sp<IInterface> BnInterface<INTERFACE>::queryLocalInterface(
116         const String16& _descriptor)
117 {
118     if (_descriptor == INTERFACE::descriptor) return this;
119     return NULL;
120 }
121 
122 template<typename INTERFACE>
getInterfaceDescriptor()123 inline const String16& BnInterface<INTERFACE>::getInterfaceDescriptor() const
124 {
125     return INTERFACE::getInterfaceDescriptor();
126 }
127 
128 template<typename INTERFACE>
onAsBinder()129 IBinder* BnInterface<INTERFACE>::onAsBinder()
130 {
131     return this;
132 }
133 
134 template<typename INTERFACE>
BpInterface(const sp<IBinder> & remote)135 inline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote)
136     : BpRefBase(remote)
137 {
138 }
139 
140 template<typename INTERFACE>
onAsBinder()141 inline IBinder* BpInterface<INTERFACE>::onAsBinder()
142 {
143     return remote();
144 }
145 
146 // ----------------------------------------------------------------------
147 
148 }; // namespace android
149 
150 #endif // ANDROID_IINTERFACE_H
151