Home | History | Annotate | Download | only in 1.0
      1 /*
      2  * hidl interface for wpa_supplicant daemon
      3  * Copyright (c) 2004-2016, Jouni Malinen <j (at) w1.fi>
      4  * Copyright (c) 2004-2016, Roshan Pius <rpius (at) 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>
     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>
     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>
     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