aidl_test_service.cpp revision 7621d4d0592fbf3fb396d0c092a8e41c3c8215cd
1b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley/* 2b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley * Copyright (C) 2015 The Android Open Source Project 3b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley * 4b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley * Licensed under the Apache License, Version 2.0 (the "License"); 5b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley * you may not use this file except in compliance with the License. 6b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley * You may obtain a copy of the License at 7b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley * 8b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley * http://www.apache.org/licenses/LICENSE-2.0 9b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley * 10b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley * Unless required by applicable law or agreed to in writing, software 11b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley * distributed under the License is distributed on an "AS IS" BASIS, 12b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley * See the License for the specific language governing permissions and 14b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley * limitations under the License. 15b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley */ 16b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 17389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin#include <map> 18d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley#include <sstream> 19d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley#include <string> 208949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley#include <vector> 21d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley 22a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin#include <unistd.h> 23a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin 24b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/IInterface.h> 25b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/IPCThreadState.h> 26b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/IServiceManager.h> 27b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/ProcessState.h> 287621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley#include <binder/Status.h> 29a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin#include <nativehelper/ScopedFd.h> 30b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/Errors.h> 31b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/Log.h> 32b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/Looper.h> 33b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/StrongPointer.h> 34b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 35521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wiley#include "android/aidl/tests/BnTestService.h" 36521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wiley#include "android/aidl/tests/ITestService.h" 37b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 38389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin#include "android/aidl/tests/BnNamedCallback.h" 39389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin#include "android/aidl/tests/INamedCallback.h" 40389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 41b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// Used implicitly. 42b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#undef LOG_TAG 4333ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley#define LOG_TAG "aidl_native_service" 44b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 45b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// libutils: 46b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::Looper; 47b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::LooperCallback; 48b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::OK; 49b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::sp; 50b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::String16; 51b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 52b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// libbinder: 53b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::BnInterface; 54b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::defaultServiceManager; 55b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::IInterface; 56b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::IPCThreadState; 57b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::Parcel; 58b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::ProcessState; 59433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyusing android::binder::Status; 60b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 61b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// Generated code: 62521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wileyusing android::aidl::tests::BnTestService; 63389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinusing android::aidl::tests::BnNamedCallback; 64389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinusing android::aidl::tests::INamedCallback; 6595d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wileyusing android::aidl::tests::SimpleParcelable; 66b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 67389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin// Standard library 68389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinusing std::map; 698949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wileyusing std::vector; 708949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley 71b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileynamespace android { 72b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileynamespace generated { 73b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileynamespace { 74b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 75b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyclass BinderCallback : public LooperCallback { 76b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley public: 77b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley BinderCallback() {} 78b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley ~BinderCallback() override {} 79b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 80ad3b806770d3eb833e39ec029925ca2dd6b3c7c7Brian Carlstrom int handleEvent(int /* fd */, int /* events */, void* /* data */ ) override { 81b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley IPCThreadState::self()->handlePolledCommands(); 82b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley return 1; // Continue receiving callbacks. 83b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley } 84b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}; 85b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 86389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinclass NamedCallback : public BnNamedCallback { 87389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin public: 88389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin NamedCallback(String16 name) : name_(name) {} 89389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 90433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status GetName(String16* ret) { 91389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin *ret = name_; 92433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 93389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 94389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 95389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin private: 96389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin String16 name_; 97389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}; 98389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 99521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wileyclass NativeService : public BnTestService { 100b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley public: 10133ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley NativeService() {} 1027621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley virtual ~NativeService() = default; 103b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 104b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley int Run() { 105b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley sp<Looper> looper(Looper::prepare(0 /* opts */)); 106b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 107b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley int binder_fd = -1; 108b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley ProcessState::self()->setThreadPoolMaxThreadCount(0); 109b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley IPCThreadState::self()->disableBackgroundScheduling(true); 110b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley IPCThreadState::self()->setupPolling(&binder_fd); 111b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley ALOGI("Got binder FD %d", binder_fd); 112b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley if (binder_fd < 0) return -1; 113b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 114b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley sp<BinderCallback> cb(new BinderCallback); 115b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley if (looper->addFd(binder_fd, Looper::POLL_CALLBACK, Looper::EVENT_INPUT, cb, 116b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley nullptr) != 1) { 117b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley ALOGE("Failed to add binder FD to Looper"); 118b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley return -1; 119b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley } 120b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 121b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley defaultServiceManager()->addService(getInterfaceDescriptor(), this); 122b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 123b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley ALOGI("Entering loop"); 124b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley while (true) { 125b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley const int result = looper->pollAll(-1 /* timeoutMillis */); 126b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley ALOGI("Looper returned %d", result); 127b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley } 128b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley return 0; 129b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley } 130b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 131d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley void LogRepeatedStringToken(const String16& token) { 132048b55eeb21d2171c203143da7e329dc85b8c0a0Chih-Hung Hsieh ALOGI("Repeating '%s' of length=%zu", android::String8(token).string(), 133d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley token.size()); 134d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 135d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley 136d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley template<typename T> 137d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley void LogRepeatedToken(const T& token) { 138d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley std::ostringstream token_str; 139d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley token_str << token; 140d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley ALOGI("Repeating token %s", token_str.str().c_str()); 141d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 142d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley 143433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatBoolean(bool token, bool* _aidl_return) override { 144d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token ? 1 : 0); 145d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 146433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 147d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 148433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatByte(int8_t token, int8_t* _aidl_return) override { 149d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token); 150d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 151433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 152d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 153433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatChar(char16_t token, char16_t* _aidl_return) override { 154d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedStringToken(String16(&token, 1)); 155d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 156433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 157d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 158433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatInt(int32_t token, int32_t* _aidl_return) override { 159d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token); 160d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 161433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 162d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 163433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatLong(int64_t token, int64_t* _aidl_return) override { 164d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token); 165d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 166433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 167d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 168433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatFloat(float token, float* _aidl_return) override { 169d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token); 170d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 171433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 172d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 173433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatDouble(double token, double* _aidl_return) override { 174d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token); 175d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 176433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 177d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 178433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatString( 179b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley const String16& token, String16* _aidl_return) override { 180d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedStringToken(token); 181d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 182433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 183b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley } 1848949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley 18595d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley Status RepeatParcelable(const SimpleParcelable& input, 186a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin SimpleParcelable* repeat, 187a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin SimpleParcelable* _aidl_return) override { 18895d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley ALOGI("Repeated a SimpleParcelable %s", input.toString().c_str()); 18995d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley *repeat = input; 19095d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley *_aidl_return = input; 19195d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley return Status::ok(); 19295d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley } 19395d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley 1948949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley template<typename T> 195433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseArray(const vector<T>& input, 196a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<T>* repeated, 197a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<T>* _aidl_return) { 1988949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley ALOGI("Reversing array of length %zu", input.size()); 1998949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley *repeated = input; 2008949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley *_aidl_return = input; 2018949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley std::reverse(_aidl_return->begin(), _aidl_return->end()); 202433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 2038949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 2048949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley 205433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseBoolean(const vector<bool>& input, 206a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<bool>* repeated, 207a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<bool>* _aidl_return) override { 2088949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2098949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 210433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseByte(const vector<int8_t>& input, 211a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<int8_t>* repeated, 212a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<int8_t>* _aidl_return) override { 2138949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2148949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 215433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseChar(const vector<char16_t>& input, 216a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<char16_t>* repeated, 217a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<char16_t>* _aidl_return) override { 2188949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2198949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 220433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseInt(const vector<int32_t>& input, 221a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<int32_t>* repeated, 222a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<int32_t>* _aidl_return) override { 2238949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2248949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 225433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseLong(const vector<int64_t>& input, 226a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<int64_t>* repeated, 227a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<int64_t>* _aidl_return) override { 2288949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2298949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 230433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseFloat(const vector<float>& input, 231a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<float>* repeated, 232a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<float>* _aidl_return) override { 2338949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2348949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 235433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseDouble(const vector<double>& input, 236a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<double>* repeated, 237a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<double>* _aidl_return) override { 2388949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2398949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 240433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseString(const vector<String16>& input, 241a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<String16>* repeated, 242a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<String16>* _aidl_return) override { 2438949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2448949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 24595d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley Status ReverseParcelables(const vector<SimpleParcelable>& input, 246a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<SimpleParcelable>* repeated, 247a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<SimpleParcelable>* _aidl_return) override { 24895d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 24995d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley } 250389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 251433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status GetOtherTestService(const String16& name, 252a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin sp<INamedCallback>* returned_service) override { 253389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin if (service_map_.find(name) == service_map_.end()) { 254389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin sp<INamedCallback> new_item(new NamedCallback(name)); 255389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin service_map_[name] = new_item; 256389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 257389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 258389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin *returned_service = service_map_[name]; 259433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 260389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 261389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 262433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status VerifyName(const sp<INamedCallback>& service, const String16& name, 263a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin bool* returned_value) override { 264389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin String16 foundName; 265433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status status = service->GetName(&foundName); 266389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 267433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley if (status.isOk()) { 268389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin *returned_value = foundName == name; 269389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 270389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 271433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return status; 272389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 273389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 274433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseStringList(const vector<String16>& input, 275a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<String16>* repeated, 276a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<String16>* _aidl_return) override { 27756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 27856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley } 27956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley 280433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseNamedCallbackList(const vector<sp<IBinder>>& input, 281a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<sp<IBinder>>* repeated, 282a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<sp<IBinder>>* _aidl_return) override { 2837ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin return ReverseArray(input, repeated, _aidl_return); 2847ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin } 2857ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin 286a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin Status RepeatFileDescriptor(const ScopedFd& read, 287a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin ScopedFd* _aidl_return) override { 288a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin ALOGE("Repeating file descriptor"); 289a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin *_aidl_return = ScopedFd(dup(read.get())); 290a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin return Status::ok(); 291a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin } 292a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin 293a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin Status ReverseFileDescriptorArray(const vector<ScopedFd>& input, 294a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<ScopedFd>* repeated, 295a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<ScopedFd>* _aidl_return) override { 296a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin ALOGI("Reversing descriptor array of length %zu", input.size()); 297a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin for (const auto& item : input) { 298a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin repeated->push_back(ScopedFd(dup(item.get()))); 299a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin _aidl_return->push_back(ScopedFd(dup(item.get()))); 300a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin } 301a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin std::reverse(_aidl_return->begin(), _aidl_return->end()); 302a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin return Status::ok(); 303a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin } 304a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin 3057621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley Status ThrowServiceException(int code) override { 3067621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley return Status::fromServiceSpecificError(code); 3077621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley } 3087621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley 309389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin private: 310389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin map<String16, sp<INamedCallback>> service_map_; 311b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}; 312b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 313b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley} // namespace 314b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley} // namespace generated 315b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley} // namespace android 316b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 317ad3b806770d3eb833e39ec029925ca2dd6b3c7c7Brian Carlstromint main(int /* argc */, char* /* argv */ []) { 31833ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley android::generated::NativeService service; 319b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley return service.Run(); 320b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley} 321