/* * hidl interface for fst manager * Copyright (c) 2019, The Linux Foundation. All rights reserved. * Copyright (c) 2004-2016, Jouni Malinen * Copyright (c) 2004-2016, Roshan Pius * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of The Linux Foundation nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "hidl_manager.h" #include "hidl_return_util.h" #include "FstManager.h" #define FST_MGR_COMPONENT "HIDL" #include "fst_manager.h" #include "fst_cfgmgr.h" #include "fst_ctrl.h" extern "C" { #include "utils/eloop.h" } namespace vendor { namespace qti { namespace hardware { namespace fstman { namespace V1_0 { namespace implementation { using hidl_return_util::validateAndCall; FstManager::FstManager() {} bool FstManager::isValid() { // This top level object cannot be invalidated. return true; } Return FstManager::getGroup( const hidl_string& groupName, getGroup_cb _hidl_cb) { return validateAndCall( this, FstManagerStatusCode::FAILURE_UNKNOWN, &FstManager::getGroupInternal, _hidl_cb, groupName); } Return FstManager::listGroups(listGroups_cb _hidl_cb) { return validateAndCall( this, FstManagerStatusCode::FAILURE_UNKNOWN, &FstManager::listGroupsInternal, _hidl_cb); } Return FstManager::setDebugParams( IFstManager::DebugLevel level, bool show_timestamp, setDebugParams_cb _hidl_cb) { return validateAndCall( this, FstManagerStatusCode::FAILURE_UNKNOWN, &FstManager::setDebugParamsInternal, _hidl_cb, level, show_timestamp); } Return FstManager::getDebugLevel() { // TODO: Add FstManagerStatus in this method return for uniformity with // the other methods in FstManager HIDL interface. return (IFstManager::DebugLevel)wpa_debug_level; } Return FstManager::isDebugShowTimestampEnabled() { // TODO: Add FstManagerStatus in this method return for uniformity with // the other methods in FstManager HIDL interface. return ((wpa_debug_timestamp != 0) ? true : false); } Return FstManager::terminate() { fst_mgr_printf(MSG_INFO, "Terminating..."); fst_manager_terminate(); return Void(); } std::pair> FstManager::getGroupInternal(const hidl_string& groupName) { if (!isGroupExists(groupName.c_str())) { return {{FstManagerStatusCode::FAILURE_GROUP_UNKNOWN, ""}, nullptr}; } HidlManager* hidl_manager = HidlManager::getInstance(); android::sp group; if (!hidl_manager || hidl_manager->getFstGroupHidlObjectByName( groupName, &group)) { return {{FstManagerStatusCode::FAILURE_UNKNOWN, ""}, group}; } return {{FstManagerStatusCode::SUCCESS, ""}, group}; } std::pair> FstManager::listGroupsInternal() { std::vector groupNames; struct fst_group_info *groups = NULL; int res, nof_groups, i; res = fst_cfgmgr_get_groups(&groups); if (res < 0) { goto finish; } nof_groups = res; for (i = 0; i < nof_groups; i++) { groupNames.emplace_back(groups[i].id); } finish: fst_free(groups); return {{FstManagerStatusCode::SUCCESS, ""}, std::move(groupNames)}; } FstManagerStatus FstManager::setDebugParamsInternal( IFstManager::DebugLevel level, bool show_timestamp) { wpa_debug_level = static_cast(level); wpa_debug_timestamp = show_timestamp ? 1 : 0; return {FstManagerStatusCode::SUCCESS, ""}; } bool FstManager::isGroupExists(const char *groupName) { struct fst_group_info *groups = NULL; int res, nof_groups, i; bool found; if (!groupName) return false; res = fst_cfgmgr_get_groups(&groups); if (res < 0) { return false; } nof_groups = res; found = false; for (i = 0; i < nof_groups; i++) { if (!strcmp(groupName, groups[i].id)) { found = true; break; } } fst_free(groups); return found; } } // namespace implementation } // namespace V1_0 } // namespace fstman } // namespace hardware } // namespace qti } // namespace vendor