1861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius/* 2861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius * hidl interface for wpa_supplicant daemon 3861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius * Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi> 4861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius * Copyright (c) 2004-2016, Roshan Pius <rpius@google.com> 5861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius * 6861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius * This software may be distributed under the terms of the BSD license. 7861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius * See README for more details. 8861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius */ 9861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius 10861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius#ifndef HIDL_RETURN_UTIL_H_ 11861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius#define HIDL_RETURN_UTIL_H_ 12861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius 13861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Piusnamespace android { 14861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Piusnamespace hardware { 15861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Piusnamespace wifi { 16861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Piusnamespace supplicant { 17861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Piusnamespace V1_0 { 18861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Piusnamespace implementation { 19861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Piusnamespace hidl_return_util { 20861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius 21861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius/** 22861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius * These utility functions are used to invoke a method on the provided 23861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius * HIDL interface object. 24861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius * These functions checks if the provided HIDL interface object is valid. 25861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius * a) if valid, Invokes the corresponding internal implementation function of 26861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius * the HIDL method. It then invokes the HIDL continuation callback with 27861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius * the status and any returned values. 28861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius * b) if invalid, invokes the HIDL continuation callback with the 29861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius * provided error status and default values. 30861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius */ 31861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius// Use for HIDL methods which return only an instance of SupplicantStatus. 32861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Piustemplate <typename ObjT, typename WorkFuncT, typename... Args> 33861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan PiusReturn<void> validateAndCall( 34861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius ObjT* obj, SupplicantStatusCode status_code_if_invalid, WorkFuncT&& work, 35861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius const std::function<void(const SupplicantStatus&)>& hidl_cb, Args&&... args) 36861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius{ 37861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius if (obj->isValid()) { 38861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius hidl_cb((obj->*work)(std::forward<Args>(args)...)); 39861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius } else { 40861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius hidl_cb({status_code_if_invalid, ""}); 41861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius } 42861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius return Void(); 43861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius} 44861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius 45861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius// Use for HIDL methods which return instance of SupplicantStatus and a single 46861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius// return value. 47861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Piustemplate <typename ObjT, typename WorkFuncT, typename ReturnT, typename... Args> 48861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan PiusReturn<void> validateAndCall( 49861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius ObjT* obj, SupplicantStatusCode status_code_if_invalid, WorkFuncT&& work, 50861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius const std::function<void(const SupplicantStatus&, ReturnT)>& hidl_cb, 51861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius Args&&... args) 52861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius{ 53861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius if (obj->isValid()) { 54861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius const auto& ret_pair = 55861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius (obj->*work)(std::forward<Args>(args)...); 56861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius const SupplicantStatus& status = std::get<0>(ret_pair); 57861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius const auto& ret_value = std::get<1>(ret_pair); 58861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius hidl_cb(status, ret_value); 59861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius } else { 60861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius hidl_cb( 61861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius {status_code_if_invalid, ""}, 62861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius typename std::remove_reference<ReturnT>::type()); 63861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius } 64861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius return Void(); 65861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius} 66861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius 67861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius// Use for HIDL methods which return instance of SupplicantStatus and 2 return 68861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius// values. 69861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Piustemplate < 70861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius typename ObjT, typename WorkFuncT, typename ReturnT1, typename ReturnT2, 71861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius typename... Args> 72861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan PiusReturn<void> validateAndCall( 73861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius ObjT* obj, SupplicantStatusCode status_code_if_invalid, WorkFuncT&& work, 74861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius const std::function<void(const SupplicantStatus&, ReturnT1, ReturnT2)>& 75861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius hidl_cb, 76861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius Args&&... args) 77861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius{ 78861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius if (obj->isValid()) { 79861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius const auto& ret_tuple = 80861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius (obj->*work)(std::forward<Args>(args)...); 81861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius const SupplicantStatus& status = std::get<0>(ret_tuple); 82861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius const auto& ret_value1 = std::get<1>(ret_tuple); 83861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius const auto& ret_value2 = std::get<2>(ret_tuple); 84861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius hidl_cb(status, ret_value1, ret_value2); 85861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius } else { 86861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius hidl_cb( 87861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius {status_code_if_invalid, ""}, 88861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius typename std::remove_reference<ReturnT1>::type(), 89861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius typename std::remove_reference<ReturnT2>::type()); 90861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius } 91861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius return Void(); 92861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius} 93861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius 94861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius} // namespace hidl_util 95861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius} // namespace implementation 96861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius} // namespace V1_0 97861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius} // namespace supplicant 98861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius} // namespace wifi 99861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius} // namespace hardware 100861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius} // namespace android 101861eb6b7961e671ec85d564cbb7c86e1f0ef838cRoshan Pius#endif // HIDL_RETURN_UTIL_H_ 102