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_HARDWARE_IINTERFACE_H
19 #define ANDROID_HARDWARE_IINTERFACE_H
20 
21 #include <hwbinder/Binder.h>
22 
23 namespace android {
24 namespace hardware {
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 protected:
34     virtual                     ~IInterface();
35     virtual IBinder*            onAsBinder() = 0;
36 };
37 
38 // ----------------------------------------------------------------------
39 
40 template<typename INTERFACE>
41 class BpInterface : public INTERFACE, public IInterface, public BpHwRefBase
42 {
43 public:
44     explicit                    BpInterface(const sp<IBinder>& remote);
45     virtual IBinder*            onAsBinder();
46 };
47 
48 // ----------------------------------------------------------------------
49 
50 // ----------------------------------------------------------------------
51 // No user-serviceable parts after this...
52 
53 
54 template<typename INTERFACE>
BpInterface(const sp<IBinder> & remote)55 inline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote)
56     : BpHwRefBase(remote)
57 {
58 }
59 
60 template<typename INTERFACE>
onAsBinder()61 inline IBinder* BpInterface<INTERFACE>::onAsBinder()
62 {
63     return remote();
64 }
65 
66 // ----------------------------------------------------------------------
67 
68 } // namespace hardware
69 } // namespace android
70 
71 #endif // ANDROID_HARDWARE_IINTERFACE_H
72