• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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