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