aidl_test_service.cpp revision dca2ecf2883771b4c895e52a9f07e2467d603f77
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: 62389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinusing android::aidl::tests::BnNamedCallback; 6388c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tanusing android::aidl::tests::BnTestService; 64389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinusing android::aidl::tests::INamedCallback; 6595d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wileyusing android::aidl::tests::SimpleParcelable; 6688c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tanusing android::os::PersistableBundle; 67b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 68389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin// Standard library 69389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinusing std::map; 70dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wileyusing std::string; 7157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinusing std::unique_ptr; 728949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wileyusing std::vector; 738949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley 74b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileynamespace { 75b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 76b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyclass BinderCallback : public LooperCallback { 77b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley public: 78b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley BinderCallback() {} 79b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley ~BinderCallback() override {} 80b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 8188c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan int handleEvent(int /* fd */, int /* events */, void* /* data */) override { 82b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley IPCThreadState::self()->handlePolledCommands(); 83b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley return 1; // Continue receiving callbacks. 84b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley } 85b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}; 86b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 87389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinclass NamedCallback : public BnNamedCallback { 88389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin public: 89389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin NamedCallback(String16 name) : name_(name) {} 90389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 91433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status GetName(String16* ret) { 92389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin *ret = name_; 93433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 94389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 95389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 96389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin private: 97389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin String16 name_; 98389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}; 99389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 100521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wileyclass NativeService : public BnTestService { 101b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley public: 10233ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley NativeService() {} 1037621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley virtual ~NativeService() = default; 104b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 105d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley void LogRepeatedStringToken(const String16& token) { 106048b55eeb21d2171c203143da7e329dc85b8c0a0Chih-Hung Hsieh ALOGI("Repeating '%s' of length=%zu", android::String8(token).string(), 107d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley token.size()); 108d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 109d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley 11088c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan template <typename T> 111d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley void LogRepeatedToken(const T& token) { 112d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley std::ostringstream token_str; 113d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley token_str << token; 114d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley ALOGI("Repeating token %s", token_str.str().c_str()); 115d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 116d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley 117433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatBoolean(bool token, bool* _aidl_return) override { 118d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token ? 1 : 0); 119d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 120433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 121d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 122433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatByte(int8_t token, int8_t* _aidl_return) override { 123d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token); 124d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 125433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 126d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 127433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatChar(char16_t token, char16_t* _aidl_return) override { 128d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedStringToken(String16(&token, 1)); 129d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 130433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 131d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 132433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatInt(int32_t token, int32_t* _aidl_return) override { 133d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token); 134d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 135433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 136d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 137433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatLong(int64_t token, int64_t* _aidl_return) override { 138d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token); 139d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 140433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 141d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 142433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatFloat(float token, float* _aidl_return) override { 143d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token); 144d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 145433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 146d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 147433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatDouble(double token, double* _aidl_return) override { 148d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token); 149d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 150433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 151d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 15288c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan Status RepeatString(const String16& token, String16* _aidl_return) override { 153d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedStringToken(token); 154d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 155433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 156b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley } 1578949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley 15888c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan Status RepeatSimpleParcelable(const SimpleParcelable& input, 15988c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan SimpleParcelable* repeat, 16088c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan SimpleParcelable* _aidl_return) override { 16195d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley ALOGI("Repeated a SimpleParcelable %s", input.toString().c_str()); 16295d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley *repeat = input; 16395d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley *_aidl_return = input; 16495d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley return Status::ok(); 16595d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley } 16695d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley 16788c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan Status RepeatPersistableBundle(const PersistableBundle& input, 16888c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan PersistableBundle* _aidl_return) override { 16988c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan ALOGI("Repeated a PersistableBundle"); 17088c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan *_aidl_return = input; 17188c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan return Status::ok(); 17288c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan } 17388c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan 17488c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan template <typename T> 17588c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan Status ReverseArray(const vector<T>& input, vector<T>* repeated, 176a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<T>* _aidl_return) { 1778949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley ALOGI("Reversing array of length %zu", input.size()); 1788949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley *repeated = input; 1798949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley *_aidl_return = input; 1808949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley std::reverse(_aidl_return->begin(), _aidl_return->end()); 181433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 1828949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 1838949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley 18457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin template<typename T> 18557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Status RepeatNullable(const unique_ptr<T>& input, 18657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<T>* _aidl_return) { 18757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin ALOGI("Repeating nullable value"); 18857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 18957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin _aidl_return->reset(); 19057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (input) { 19157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin _aidl_return->reset(new T(*input)); 19257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 19357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 19457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return Status::ok(); 19557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 19657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 197433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseBoolean(const vector<bool>& input, 198a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<bool>* repeated, 199a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<bool>* _aidl_return) override { 2008949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2018949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 202433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseByte(const vector<int8_t>& input, 203a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<int8_t>* repeated, 204a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<int8_t>* _aidl_return) override { 2058949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2068949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 207433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseChar(const vector<char16_t>& input, 208a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<char16_t>* repeated, 209a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<char16_t>* _aidl_return) override { 2108949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2118949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 212433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseInt(const vector<int32_t>& input, 213a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<int32_t>* repeated, 214a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<int32_t>* _aidl_return) override { 2158949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2168949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 217433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseLong(const vector<int64_t>& input, 218a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<int64_t>* repeated, 219a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<int64_t>* _aidl_return) override { 2208949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2218949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 222433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseFloat(const vector<float>& input, 223a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<float>* repeated, 224a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<float>* _aidl_return) override { 2258949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2268949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 227433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseDouble(const vector<double>& input, 228a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<double>* repeated, 229a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<double>* _aidl_return) override { 2308949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2318949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 232433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseString(const vector<String16>& input, 233a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<String16>* repeated, 234a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<String16>* _aidl_return) override { 2358949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2368949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 23788c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan Status ReverseSimpleParcelables( 23888c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan const vector<SimpleParcelable>& input, 23988c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan vector<SimpleParcelable>* repeated, 24088c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan vector<SimpleParcelable>* _aidl_return) override { 24188c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan return ReverseArray(input, repeated, _aidl_return); 24288c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan } 24388c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan Status ReversePersistableBundles( 24488c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan const vector<PersistableBundle>& input, 24588c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan vector<PersistableBundle>* repeated, 24688c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan vector<PersistableBundle>* _aidl_return) override { 24795d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 24895d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley } 249389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 250433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status GetOtherTestService(const String16& name, 251a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin sp<INamedCallback>* returned_service) override { 252389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin if (service_map_.find(name) == service_map_.end()) { 253389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin sp<INamedCallback> new_item(new NamedCallback(name)); 254389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin service_map_[name] = new_item; 255389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 256389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 257389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin *returned_service = service_map_[name]; 258433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 259389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 260389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 261433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status VerifyName(const sp<INamedCallback>& service, const String16& name, 262a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin bool* returned_value) override { 263389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin String16 foundName; 264433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status status = service->GetName(&foundName); 265389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 266433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley if (status.isOk()) { 267389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin *returned_value = foundName == name; 268389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 269389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 270433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return status; 271389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 272389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 273433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseStringList(const vector<String16>& input, 274a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<String16>* repeated, 275a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<String16>* _aidl_return) override { 27656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 27756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley } 27856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley 279433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseNamedCallbackList(const vector<sp<IBinder>>& input, 280a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<sp<IBinder>>* repeated, 281a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<sp<IBinder>>* _aidl_return) override { 2827ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin return ReverseArray(input, repeated, _aidl_return); 2837ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin } 2847ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin 285a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin Status RepeatFileDescriptor(const ScopedFd& read, 286a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin ScopedFd* _aidl_return) override { 287a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin ALOGE("Repeating file descriptor"); 288a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin *_aidl_return = ScopedFd(dup(read.get())); 289a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin return Status::ok(); 290a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin } 291a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin 292a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin Status ReverseFileDescriptorArray(const vector<ScopedFd>& input, 293a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<ScopedFd>* repeated, 294a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<ScopedFd>* _aidl_return) override { 295a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin ALOGI("Reversing descriptor array of length %zu", input.size()); 296a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin for (const auto& item : input) { 297a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin repeated->push_back(ScopedFd(dup(item.get()))); 298a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin _aidl_return->push_back(ScopedFd(dup(item.get()))); 299a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin } 300a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin std::reverse(_aidl_return->begin(), _aidl_return->end()); 301a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin return Status::ok(); 302a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin } 303a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin 3047621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley Status ThrowServiceException(int code) override { 3057621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley return Status::fromServiceSpecificError(code); 3067621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley } 3077621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley 30857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Status RepeatNullableIntArray(const unique_ptr<vector<int32_t>>& input, 30957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<vector<int32_t>>* _aidl_return) { 31057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return RepeatNullable(input, _aidl_return); 31157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 31257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 31357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Status RepeatNullableStringList( 31457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const unique_ptr<vector<unique_ptr<String16>>>& input, 31557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<vector<unique_ptr<String16>>>* _aidl_return) { 31657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin ALOGI("Repeating nullable string list"); 31757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (!input) { 31857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin _aidl_return->reset(); 31957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return Status::ok(); 32057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 32157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 32257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin _aidl_return->reset(new vector<unique_ptr<String16>>); 32357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 32457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin for (const auto& item : *input) { 32557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (!item) { 32657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin (*_aidl_return)->emplace_back(nullptr); 32757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } else { 32857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin (*_aidl_return)->emplace_back(new String16(*item)); 32957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 33057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 33157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 33257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return Status::ok(); 33357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 33457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 33557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Status RepeatNullableString(const unique_ptr<String16>& input, 33657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<String16>* _aidl_return) { 33757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return RepeatNullable(input, _aidl_return); 33857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 33957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 34057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Status RepeatNullableParcelable(const unique_ptr<SimpleParcelable>& input, 34157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<SimpleParcelable>* _aidl_return) { 34257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return RepeatNullable(input, _aidl_return); 34357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 34457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 345dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley Status RepeatUtf8CppString(const string& token, 346dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley string* _aidl_return) override { 347dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley ALOGI("Repeating utf8 string '%s' of length=%zu", token.c_str(), token.size()); 348dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley *_aidl_return = token; 349dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley return Status::ok(); 350dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley } 351dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley 352dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley Status RepeatNullableUtf8CppString( 353dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley const unique_ptr<string>& token, 354dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley unique_ptr<string>* _aidl_return) override { 355dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley if (!token) { 356dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley ALOGI("Received null @utf8InCpp string"); 357dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley return Status::ok(); 358dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley } 359dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley ALOGI("Repeating utf8 string '%s' of length=%zu", 360dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley token->c_str(), token->size()); 361dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley _aidl_return->reset(new string(*token)); 362dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley return Status::ok(); 363dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley } 364dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley 365dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley Status ReverseUtf8CppString(const vector<string>& input, 366dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley vector<string>* repeated, 367dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley vector<string>* _aidl_return) { 368dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 369dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley } 370dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley 371389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin private: 372389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin map<String16, sp<INamedCallback>> service_map_; 373b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}; 374b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 375fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlinint Run() { 376dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley android::sp<NativeService> service = new NativeService; 377fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin sp<Looper> looper(Looper::prepare(0 /* opts */)); 378fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin 379fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin int binder_fd = -1; 380fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin ProcessState::self()->setThreadPoolMaxThreadCount(0); 381fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin IPCThreadState::self()->disableBackgroundScheduling(true); 382fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin IPCThreadState::self()->setupPolling(&binder_fd); 383fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin ALOGI("Got binder FD %d", binder_fd); 384fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin if (binder_fd < 0) return -1; 385fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin 386fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin sp<BinderCallback> cb(new BinderCallback); 387fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin if (looper->addFd(binder_fd, Looper::POLL_CALLBACK, Looper::EVENT_INPUT, cb, 388fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin nullptr) != 1) { 389fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin ALOGE("Failed to add binder FD to Looper"); 390fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin return -1; 391fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin } 392fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin 393fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin defaultServiceManager()->addService(service->getInterfaceDescriptor(), 394fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin service); 395fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin 396fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin ALOGI("Entering loop"); 397fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin while (true) { 398fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin const int result = looper->pollAll(-1 /* timeoutMillis */); 399fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin ALOGI("Looper returned %d", result); 400fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin } 401fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin return 0; 402fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin} 403fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin 404dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley} // namespace 405b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 406ad3b806770d3eb833e39ec029925ca2dd6b3c7c7Brian Carlstromint main(int /* argc */, char* /* argv */ []) { 407dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley return Run(); 408b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley} 409