1108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland/* 2108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland * Copyright (C) 2016 The Android Open Source Project 3108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland * 4108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland * Licensed under the Apache License, Version 2.0 (the "License"); 5108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland * you may not use this file except in compliance with the License. 6108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland * You may obtain a copy of the License at 7108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland * 8108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland * http://www.apache.org/licenses/LICENSE-2.0 9108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland * 10108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland * Unless required by applicable law or agreed to in writing, software 11108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland * distributed under the License is distributed on an "AS IS" BASIS, 12108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland * See the License for the specific language governing permissions and 14108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland * limitations under the License. 15108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland */ 16108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland 17108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland#include <hidl/HidlTransportUtils.h> 18108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland 191ab461334d1e3a05a8b906e6c6efa74d6cf45f61Steven Moreland#include <android/hidl/base/1.0/IBase.h> 201ab461334d1e3a05a8b906e6c6efa74d6cf45f61Steven Moreland 21108d09d4eae07cd1d70a76187a929dc61548a229Steven Morelandnamespace android { 22108d09d4eae07cd1d70a76187a929dc61548a229Steven Morelandnamespace hardware { 23108d09d4eae07cd1d70a76187a929dc61548a229Steven Morelandnamespace details { 24108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland 251ab461334d1e3a05a8b906e6c6efa74d6cf45f61Steven Morelandusing ::android::hidl::base::V1_0::IBase; 261ab461334d1e3a05a8b906e6c6efa74d6cf45f61Steven Moreland 271ab461334d1e3a05a8b906e6c6efa74d6cf45f61Steven MorelandReturn<bool> canCastInterface(IBase* interface, const char* castTo, bool emitError) { 28108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland if (interface == nullptr) { 29108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland return false; 30108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland } 31108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland 321ab461334d1e3a05a8b906e6c6efa74d6cf45f61Steven Moreland // b/68217907 331ab461334d1e3a05a8b906e6c6efa74d6cf45f61Steven Moreland // Every HIDL interface is a base interface. 341ab461334d1e3a05a8b906e6c6efa74d6cf45f61Steven Moreland if (std::string(IBase::descriptor) == castTo) { 351ab461334d1e3a05a8b906e6c6efa74d6cf45f61Steven Moreland return true; 361ab461334d1e3a05a8b906e6c6efa74d6cf45f61Steven Moreland } 371ab461334d1e3a05a8b906e6c6efa74d6cf45f61Steven Moreland 38108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland bool canCast = false; 39108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland auto chainRet = interface->interfaceChain([&](const hidl_vec<hidl_string> &types) { 40108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland for (size_t i = 0; i < types.size(); i++) { 41108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland if (types[i] == castTo) { 42108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland canCast = true; 43108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland break; 44108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland } 45108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland } 46108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland }); 47108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland 48108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland if (!chainRet.isOk()) { 49108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland // call fails, propagate the error if emitError 50108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland return emitError 51108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland ? details::StatusOf<void, bool>(chainRet) 52108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland : Return<bool>(false); 53108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland } 54108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland 55108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland return canCast; 56108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland} 57108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland 581ab461334d1e3a05a8b906e6c6efa74d6cf45f61Steven Morelandstd::string getDescriptor(IBase* interface) { 59108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland std::string myDescriptor{}; 60108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland auto ret = interface->interfaceDescriptor([&](const hidl_string &types) { 61108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland myDescriptor = types.c_str(); 62108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland }); 63108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland ret.isOk(); // ignored, return empty string if not isOk() 64108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland return myDescriptor; 65108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland} 66108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland 67108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland} // namespace details 68108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland} // namespace hardware 69108d09d4eae07cd1d70a76187a929dc61548a229Steven Moreland} // namespace android 70