1 /*
2 * hidl interface for wpa_supplicant daemon
3 * Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi>
4 * Copyright (c) 2004-2016, Roshan Pius <rpius@google.com>
5 *
6 * This software may be distributed under the terms of the BSD license.
7 * See README for more details.
8 */
9
10 #ifndef HIDL_RETURN_UTIL_H_
11 #define HIDL_RETURN_UTIL_H_
12
13 namespace android {
14 namespace hardware {
15 namespace wifi {
16 namespace supplicant {
17 namespace V1_0 {
18 namespace implementation {
19 namespace hidl_return_util {
20
21 /**
22 * These utility functions are used to invoke a method on the provided
23 * HIDL interface object.
24 * These functions checks if the provided HIDL interface object is valid.
25 * a) if valid, Invokes the corresponding internal implementation function of
26 * the HIDL method. It then invokes the HIDL continuation callback with
27 * the status and any returned values.
28 * b) if invalid, invokes the HIDL continuation callback with the
29 * provided error status and default values.
30 */
31 // Use for HIDL methods which return only an instance of SupplicantStatus.
32 template <typename ObjT, typename WorkFuncT, typename... Args>
validateAndCall(ObjT * obj,SupplicantStatusCode status_code_if_invalid,WorkFuncT && work,const std::function<void (const SupplicantStatus &)> & hidl_cb,Args &&...args)33 Return<void> validateAndCall(
34 ObjT* obj, SupplicantStatusCode status_code_if_invalid, WorkFuncT&& work,
35 const std::function<void(const SupplicantStatus&)>& hidl_cb, Args&&... args)
36 {
37 if (obj->isValid()) {
38 hidl_cb((obj->*work)(std::forward<Args>(args)...));
39 } else {
40 hidl_cb({status_code_if_invalid, ""});
41 }
42 return Void();
43 }
44
45 // Use for HIDL methods which return instance of SupplicantStatus and a single
46 // return value.
47 template <typename ObjT, typename WorkFuncT, typename ReturnT, typename... Args>
validateAndCall(ObjT * obj,SupplicantStatusCode status_code_if_invalid,WorkFuncT && work,const std::function<void (const SupplicantStatus &,ReturnT)> & hidl_cb,Args &&...args)48 Return<void> validateAndCall(
49 ObjT* obj, SupplicantStatusCode status_code_if_invalid, WorkFuncT&& work,
50 const std::function<void(const SupplicantStatus&, ReturnT)>& hidl_cb,
51 Args&&... args)
52 {
53 if (obj->isValid()) {
54 const auto& ret_pair =
55 (obj->*work)(std::forward<Args>(args)...);
56 const SupplicantStatus& status = std::get<0>(ret_pair);
57 const auto& ret_value = std::get<1>(ret_pair);
58 hidl_cb(status, ret_value);
59 } else {
60 hidl_cb(
61 {status_code_if_invalid, ""},
62 typename std::remove_reference<ReturnT>::type());
63 }
64 return Void();
65 }
66
67 // Use for HIDL methods which return instance of SupplicantStatus and 2 return
68 // values.
69 template <
70 typename ObjT, typename WorkFuncT, typename ReturnT1, typename ReturnT2,
71 typename... Args>
validateAndCall(ObjT * obj,SupplicantStatusCode status_code_if_invalid,WorkFuncT && work,const std::function<void (const SupplicantStatus &,ReturnT1,ReturnT2)> & hidl_cb,Args &&...args)72 Return<void> validateAndCall(
73 ObjT* obj, SupplicantStatusCode status_code_if_invalid, WorkFuncT&& work,
74 const std::function<void(const SupplicantStatus&, ReturnT1, ReturnT2)>&
75 hidl_cb,
76 Args&&... args)
77 {
78 if (obj->isValid()) {
79 const auto& ret_tuple =
80 (obj->*work)(std::forward<Args>(args)...);
81 const SupplicantStatus& status = std::get<0>(ret_tuple);
82 const auto& ret_value1 = std::get<1>(ret_tuple);
83 const auto& ret_value2 = std::get<2>(ret_tuple);
84 hidl_cb(status, ret_value1, ret_value2);
85 } else {
86 hidl_cb(
87 {status_code_if_invalid, ""},
88 typename std::remove_reference<ReturnT1>::type(),
89 typename std::remove_reference<ReturnT2>::type());
90 }
91 return Void();
92 }
93
94 } // namespace hidl_util
95 } // namespace implementation
96 } // namespace V1_0
97 } // namespace supplicant
98 } // namespace wifi
99 } // namespace hardware
100 } // namespace android
101 #endif // HIDL_RETURN_UTIL_H_
102