• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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             sp<IBinder>         asBinder();
32             sp<const IBinder>   asBinder() const;
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 String16 descriptor;                                   \
76     static sp<I##INTERFACE> asInterface(const sp<IBinder>& obj);        \
77     virtual const String16& getInterfaceDescriptor() const;             \
78     I##INTERFACE();                                                     \
79     virtual ~I##INTERFACE();                                            \
80 
81 
82 #define IMPLEMENT_META_INTERFACE(INTERFACE, NAME)                       \
83     const String16 I##INTERFACE::descriptor(NAME);                      \
84     const String16& I##INTERFACE::getInterfaceDescriptor() const {      \
85         return I##INTERFACE::descriptor;                                \
86     }                                                                   \
87     sp<I##INTERFACE> I##INTERFACE::asInterface(const sp<IBinder>& obj)  \
88     {                                                                   \
89         sp<I##INTERFACE> intr;                                          \
90         if (obj != NULL) {                                              \
91             intr = static_cast<I##INTERFACE*>(                          \
92                 obj->queryLocalInterface(                               \
93                         I##INTERFACE::descriptor).get());               \
94             if (intr == NULL) {                                         \
95                 intr = new Bp##INTERFACE(obj);                          \
96             }                                                           \
97         }                                                               \
98         return intr;                                                    \
99     }                                                                   \
100     I##INTERFACE::I##INTERFACE() { }                                    \
101     I##INTERFACE::~I##INTERFACE() { }                                   \
102 
103 
104 #define CHECK_INTERFACE(interface, data, reply)                         \
105     if (!data.checkInterface(this)) { return PERMISSION_DENIED; }       \
106 
107 
108 // ----------------------------------------------------------------------
109 // No user-serviceable parts after this...
110 
111 template<typename INTERFACE>
queryLocalInterface(const String16 & _descriptor)112 inline sp<IInterface> BnInterface<INTERFACE>::queryLocalInterface(
113         const String16& _descriptor)
114 {
115     if (_descriptor == INTERFACE::descriptor) return this;
116     return NULL;
117 }
118 
119 template<typename INTERFACE>
getInterfaceDescriptor()120 inline const String16& BnInterface<INTERFACE>::getInterfaceDescriptor() const
121 {
122     return INTERFACE::getInterfaceDescriptor();
123 }
124 
125 template<typename INTERFACE>
onAsBinder()126 IBinder* BnInterface<INTERFACE>::onAsBinder()
127 {
128     return this;
129 }
130 
131 template<typename INTERFACE>
BpInterface(const sp<IBinder> & remote)132 inline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote)
133     : BpRefBase(remote)
134 {
135 }
136 
137 template<typename INTERFACE>
onAsBinder()138 inline IBinder* BpInterface<INTERFACE>::onAsBinder()
139 {
140     return remote();
141 }
142 
143 // ----------------------------------------------------------------------
144 
145 }; // namespace android
146 
147 #endif // ANDROID_IINTERFACE_H
148