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 247cb9c2585d518f97e1b42bf6b444a3fb69b332bbChristopher Wiley#include <android-base/unique_fd.h> 25b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/IInterface.h> 26b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/IPCThreadState.h> 27b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/IServiceManager.h> 28b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/ProcessState.h> 297621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley#include <binder/Status.h> 30cd8c135d8f4840e628afbb8c83546d94926ef537Robert Quattlebaum#include <binder/Value.h> 31b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/Errors.h> 32b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/Log.h> 33b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/Looper.h> 34b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/StrongPointer.h> 35b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 36521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wiley#include "android/aidl/tests/BnTestService.h" 37521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wiley#include "android/aidl/tests/ITestService.h" 38b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 39389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin#include "android/aidl/tests/BnNamedCallback.h" 40389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin#include "android/aidl/tests/INamedCallback.h" 41389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 42b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// Used implicitly. 43b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#undef LOG_TAG 4433ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley#define LOG_TAG "aidl_native_service" 45b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 467cb9c2585d518f97e1b42bf6b444a3fb69b332bbChristopher Wiley// libbase 477cb9c2585d518f97e1b42bf6b444a3fb69b332bbChristopher Wileyusing android::base::unique_fd; 487cb9c2585d518f97e1b42bf6b444a3fb69b332bbChristopher Wiley 49b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// libutils: 50b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::Looper; 51b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::LooperCallback; 52b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::OK; 53b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::sp; 54b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::String16; 55b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 56b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// libbinder: 57b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::BnInterface; 58b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::defaultServiceManager; 59b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::IInterface; 60b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::IPCThreadState; 61b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::Parcel; 62b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::ProcessState; 63433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyusing android::binder::Status; 64b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 65b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// Generated code: 66389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinusing android::aidl::tests::BnNamedCallback; 6788c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tanusing android::aidl::tests::BnTestService; 68389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinusing android::aidl::tests::INamedCallback; 6995d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wileyusing android::aidl::tests::SimpleParcelable; 7088c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tanusing android::os::PersistableBundle; 71cd8c135d8f4840e628afbb8c83546d94926ef537Robert Quattlebaumusing android::binder::Map; 72b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 73389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin// Standard library 74389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinusing std::map; 75dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wileyusing std::string; 7657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinusing std::unique_ptr; 778949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wileyusing std::vector; 788949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley 79b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileynamespace { 80b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 81b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyclass BinderCallback : public LooperCallback { 82b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley public: 83b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley BinderCallback() {} 84b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley ~BinderCallback() override {} 85b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 8688c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan int handleEvent(int /* fd */, int /* events */, void* /* data */) override { 87b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley IPCThreadState::self()->handlePolledCommands(); 88b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley return 1; // Continue receiving callbacks. 89b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley } 90b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}; 91b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 92389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinclass NamedCallback : public BnNamedCallback { 93389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin public: 94e4fecc7754e3829f09abefcc35630ef0b110b01eChih-Hung Hsieh explicit NamedCallback(String16 name) : name_(name) {} 95389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 96433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status GetName(String16* ret) { 97389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin *ret = name_; 98433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 99389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 100389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 101389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin private: 102389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin String16 name_; 103389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}; 104389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 105521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wileyclass NativeService : public BnTestService { 106b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley public: 10733ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley NativeService() {} 1087621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley virtual ~NativeService() = default; 109b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 110d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley void LogRepeatedStringToken(const String16& token) { 111048b55eeb21d2171c203143da7e329dc85b8c0a0Chih-Hung Hsieh ALOGI("Repeating '%s' of length=%zu", android::String8(token).string(), 112d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley token.size()); 113d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 114d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley 11588c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan template <typename T> 116d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley void LogRepeatedToken(const T& token) { 117d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley std::ostringstream token_str; 118d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley token_str << token; 119d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley ALOGI("Repeating token %s", token_str.str().c_str()); 120d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 121d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley 122cd8c135d8f4840e628afbb8c83546d94926ef537Robert Quattlebaum void LogRepeatedMapToken(const Map& token) { 123cd8c135d8f4840e628afbb8c83546d94926ef537Robert Quattlebaum ALOGI("Repeating Map with %d elements", (int)token.size()); 124cd8c135d8f4840e628afbb8c83546d94926ef537Robert Quattlebaum } 125cd8c135d8f4840e628afbb8c83546d94926ef537Robert Quattlebaum 126433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatBoolean(bool token, bool* _aidl_return) override { 127d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token ? 1 : 0); 128d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 129433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 130d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 131433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatByte(int8_t token, int8_t* _aidl_return) override { 132d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token); 133d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 134433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 135d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 136433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatChar(char16_t token, char16_t* _aidl_return) override { 137d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedStringToken(String16(&token, 1)); 138d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 139433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 140d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 141433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatInt(int32_t token, int32_t* _aidl_return) override { 142d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token); 143d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 144433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 145d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 146433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatLong(int64_t token, int64_t* _aidl_return) override { 147d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token); 148d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 149433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 150d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 151433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatFloat(float token, float* _aidl_return) override { 152d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token); 153d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 154433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 155d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 156433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status RepeatDouble(double token, double* _aidl_return) override { 157d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedToken(token); 158d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 159433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 160d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley } 16188c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan Status RepeatString(const String16& token, String16* _aidl_return) override { 162d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley LogRepeatedStringToken(token); 163d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley *_aidl_return = token; 164433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 165b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley } 166cd8c135d8f4840e628afbb8c83546d94926ef537Robert Quattlebaum Status RepeatMap(const Map& token, Map* _aidl_return) override { 167cd8c135d8f4840e628afbb8c83546d94926ef537Robert Quattlebaum LogRepeatedMapToken(token); 168cd8c135d8f4840e628afbb8c83546d94926ef537Robert Quattlebaum *_aidl_return = token; 169cd8c135d8f4840e628afbb8c83546d94926ef537Robert Quattlebaum return Status::ok(); 170cd8c135d8f4840e628afbb8c83546d94926ef537Robert Quattlebaum } 1718949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley 17288c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan Status RepeatSimpleParcelable(const SimpleParcelable& input, 17388c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan SimpleParcelable* repeat, 17488c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan SimpleParcelable* _aidl_return) override { 17595d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley ALOGI("Repeated a SimpleParcelable %s", input.toString().c_str()); 17695d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley *repeat = input; 17795d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley *_aidl_return = input; 17895d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley return Status::ok(); 17995d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley } 18095d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley 18188c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan Status RepeatPersistableBundle(const PersistableBundle& input, 18288c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan PersistableBundle* _aidl_return) override { 18388c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan ALOGI("Repeated a PersistableBundle"); 18488c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan *_aidl_return = input; 18588c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan return Status::ok(); 18688c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan } 18788c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan 18888c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan template <typename T> 18988c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan Status ReverseArray(const vector<T>& input, vector<T>* repeated, 190a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<T>* _aidl_return) { 1918949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley ALOGI("Reversing array of length %zu", input.size()); 1928949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley *repeated = input; 1938949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley *_aidl_return = input; 1948949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley std::reverse(_aidl_return->begin(), _aidl_return->end()); 195433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 1968949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 1978949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley 19857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin template<typename T> 19957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Status RepeatNullable(const unique_ptr<T>& input, 20057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<T>* _aidl_return) { 20157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin ALOGI("Repeating nullable value"); 20257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 20357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin _aidl_return->reset(); 20457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (input) { 20557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin _aidl_return->reset(new T(*input)); 20657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 20757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 20857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return Status::ok(); 20957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 21057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 211433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseBoolean(const vector<bool>& input, 212a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<bool>* repeated, 213a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<bool>* _aidl_return) override { 2148949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2158949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 216e9e73f120b17bb61c2e012ba273fa18da4fb2feaCasey Dahlin Status ReverseByte(const vector<uint8_t>& input, 217e9e73f120b17bb61c2e012ba273fa18da4fb2feaCasey Dahlin vector<uint8_t>* repeated, 218e9e73f120b17bb61c2e012ba273fa18da4fb2feaCasey Dahlin vector<uint8_t>* _aidl_return) override { 2198949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2208949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 221433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseChar(const vector<char16_t>& input, 222a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<char16_t>* repeated, 223a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<char16_t>* _aidl_return) override { 2248949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2258949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 226433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseInt(const vector<int32_t>& input, 227a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<int32_t>* repeated, 228a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<int32_t>* _aidl_return) override { 2298949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2308949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 231433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseLong(const vector<int64_t>& input, 232a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<int64_t>* repeated, 233a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<int64_t>* _aidl_return) override { 2348949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2358949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 236433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseFloat(const vector<float>& input, 237a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<float>* repeated, 238a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<float>* _aidl_return) override { 2398949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2408949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 241433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseDouble(const vector<double>& input, 242a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<double>* repeated, 243a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<double>* _aidl_return) override { 2448949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2458949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 246433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseString(const vector<String16>& input, 247a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<String16>* repeated, 248a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<String16>* _aidl_return) override { 2498949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 2508949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley } 25188c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan Status ReverseSimpleParcelables( 25288c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan const vector<SimpleParcelable>& input, 25388c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan vector<SimpleParcelable>* repeated, 25488c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan vector<SimpleParcelable>* _aidl_return) override { 25588c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan return ReverseArray(input, repeated, _aidl_return); 25688c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan } 25788c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan Status ReversePersistableBundles( 25888c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan const vector<PersistableBundle>& input, 25988c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan vector<PersistableBundle>* repeated, 26088c320053c5c0f9c45a5700c89b23a9c0c745369Samuel Tan vector<PersistableBundle>* _aidl_return) override { 26195d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 26295d44b08a267e695d1f5ee7c61286fddfb3b83e0Christopher Wiley } 263389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 264433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status GetOtherTestService(const String16& name, 265a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin sp<INamedCallback>* returned_service) override { 266389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin if (service_map_.find(name) == service_map_.end()) { 267389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin sp<INamedCallback> new_item(new NamedCallback(name)); 268389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin service_map_[name] = new_item; 269389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 270389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 271389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin *returned_service = service_map_[name]; 272433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return Status::ok(); 273389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 274389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 275433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status VerifyName(const sp<INamedCallback>& service, const String16& name, 276a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin bool* returned_value) override { 277389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin String16 foundName; 278433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status status = service->GetName(&foundName); 279389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 280433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley if (status.isOk()) { 281389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin *returned_value = foundName == name; 282389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 283389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 284433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley return status; 285389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 286389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 287433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseStringList(const vector<String16>& input, 288a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<String16>* repeated, 289a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<String16>* _aidl_return) override { 29056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 29156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley } 29256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley 293433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley Status ReverseNamedCallbackList(const vector<sp<IBinder>>& input, 294a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<sp<IBinder>>* repeated, 295a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin vector<sp<IBinder>>* _aidl_return) override { 2967ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin return ReverseArray(input, repeated, _aidl_return); 2977ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin } 2987ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin 2997cb9c2585d518f97e1b42bf6b444a3fb69b332bbChristopher Wiley Status RepeatFileDescriptor(const unique_fd& read, 3007cb9c2585d518f97e1b42bf6b444a3fb69b332bbChristopher Wiley unique_fd* _aidl_return) override { 301a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin ALOGE("Repeating file descriptor"); 3027cb9c2585d518f97e1b42bf6b444a3fb69b332bbChristopher Wiley *_aidl_return = unique_fd(dup(read.get())); 303a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin return Status::ok(); 304a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin } 305a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin 3067cb9c2585d518f97e1b42bf6b444a3fb69b332bbChristopher Wiley Status ReverseFileDescriptorArray(const vector<unique_fd>& input, 3077cb9c2585d518f97e1b42bf6b444a3fb69b332bbChristopher Wiley vector<unique_fd>* repeated, 3087cb9c2585d518f97e1b42bf6b444a3fb69b332bbChristopher Wiley vector<unique_fd>* _aidl_return) override { 309a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin ALOGI("Reversing descriptor array of length %zu", input.size()); 310a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin for (const auto& item : input) { 3117cb9c2585d518f97e1b42bf6b444a3fb69b332bbChristopher Wiley repeated->push_back(unique_fd(dup(item.get()))); 3127cb9c2585d518f97e1b42bf6b444a3fb69b332bbChristopher Wiley _aidl_return->push_back(unique_fd(dup(item.get()))); 313a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin } 314a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin std::reverse(_aidl_return->begin(), _aidl_return->end()); 315a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin return Status::ok(); 316a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin } 317a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin 3187621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley Status ThrowServiceException(int code) override { 3197621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley return Status::fromServiceSpecificError(code); 3207621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley } 3217621d4d0592fbf3fb396d0c092a8e41c3c8215cdChristopher Wiley 32257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Status RepeatNullableIntArray(const unique_ptr<vector<int32_t>>& input, 32357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<vector<int32_t>>* _aidl_return) { 32457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return RepeatNullable(input, _aidl_return); 32557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 32657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 32757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Status RepeatNullableStringList( 32857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const unique_ptr<vector<unique_ptr<String16>>>& input, 32957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<vector<unique_ptr<String16>>>* _aidl_return) { 33057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin ALOGI("Repeating nullable string list"); 33157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (!input) { 33257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin _aidl_return->reset(); 33357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return Status::ok(); 33457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 33557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 33657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin _aidl_return->reset(new vector<unique_ptr<String16>>); 33757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 33857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin for (const auto& item : *input) { 33957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin if (!item) { 34057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin (*_aidl_return)->emplace_back(nullptr); 34157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } else { 34257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin (*_aidl_return)->emplace_back(new String16(*item)); 34357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 34457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 34557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 34657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return Status::ok(); 34757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 34857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 34957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Status RepeatNullableString(const unique_ptr<String16>& input, 35057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<String16>* _aidl_return) { 35157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return RepeatNullable(input, _aidl_return); 35257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 35357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 35457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Status RepeatNullableParcelable(const unique_ptr<SimpleParcelable>& input, 35557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin unique_ptr<SimpleParcelable>* _aidl_return) { 35657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return RepeatNullable(input, _aidl_return); 35757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 35857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 35933375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley Status TakesAnIBinder(const sp<IBinder>& input) override { 36033375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley (void)input; 36133375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley return Status::ok(); 36233375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley } 36333375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley Status TakesAnIBinderList(const vector<sp<IBinder>>& input) override { 36433375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley (void)input; 36533375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley return Status::ok(); 36633375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley } 36733375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley Status TakesANullableIBinder(const sp<IBinder>& input) { 36833375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley (void)input; 36933375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley return Status::ok(); 37033375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley } 37133375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley Status TakesANullableIBinderList(const unique_ptr<vector<sp<IBinder>>>& input) { 37233375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley (void)input; 37333375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley return Status::ok(); 37433375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley } 37533375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley 376dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley Status RepeatUtf8CppString(const string& token, 377dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley string* _aidl_return) override { 378dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley ALOGI("Repeating utf8 string '%s' of length=%zu", token.c_str(), token.size()); 379dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley *_aidl_return = token; 380dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley return Status::ok(); 381dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley } 382dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley 383dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley Status RepeatNullableUtf8CppString( 384dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley const unique_ptr<string>& token, 385dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley unique_ptr<string>* _aidl_return) override { 386dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley if (!token) { 387dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley ALOGI("Received null @utf8InCpp string"); 388dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley return Status::ok(); 389dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley } 390dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley ALOGI("Repeating utf8 string '%s' of length=%zu", 391dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley token->c_str(), token->size()); 392dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley _aidl_return->reset(new string(*token)); 393dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley return Status::ok(); 394dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley } 395dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley 396dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley Status ReverseUtf8CppString(const vector<string>& input, 397dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley vector<string>* repeated, 398dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley vector<string>* _aidl_return) { 399dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley return ReverseArray(input, repeated, _aidl_return); 400dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley } 401dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley 40299d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley Status ReverseUtf8CppStringList( 40399d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley const unique_ptr<vector<unique_ptr<::string>>>& input, 40499d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley unique_ptr<vector<unique_ptr<string>>>* repeated, 40599d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley unique_ptr<vector<unique_ptr<string>>>* _aidl_return) { 40699d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley if (!input) { 40799d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley ALOGI("Received null list of utf8 strings"); 40899d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley return Status::ok(); 40999d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley } 41099d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley _aidl_return->reset(new vector<unique_ptr<string>>); 41199d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley repeated->reset(new vector<unique_ptr<string>>); 41299d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley 41399d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley for (const auto& item : *input) { 41499d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley (*repeated)->emplace_back(nullptr); 41599d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley (*_aidl_return)->emplace_back(nullptr); 41699d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley if (item) { 41799d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley (*repeated)->back().reset(new string(*item)); 41899d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley (*_aidl_return)->back().reset(new string(*item)); 41999d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley } 42099d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley } 42199d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley std::reverse((*_aidl_return)->begin(), (*_aidl_return)->end()); 42299d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley 42399d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley return Status::ok(); 42499d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley } 42599d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley 426513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley Status GetCallback(bool return_null, sp<INamedCallback>* ret) { 427513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley if (!return_null) { 428513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley return GetOtherTestService(String16("ABT: always be testing"), ret); 429513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley } 430513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley return Status::ok(); 431513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley } 432513fec62fb714caf60ca18a0ab57d772e38b6f0dChristopher Wiley 433389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin private: 434389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin map<String16, sp<INamedCallback>> service_map_; 435b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}; 436b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 437fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlinint Run() { 438dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley android::sp<NativeService> service = new NativeService; 439fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin sp<Looper> looper(Looper::prepare(0 /* opts */)); 440fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin 441fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin int binder_fd = -1; 442fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin ProcessState::self()->setThreadPoolMaxThreadCount(0); 443fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin IPCThreadState::self()->disableBackgroundScheduling(true); 444fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin IPCThreadState::self()->setupPolling(&binder_fd); 445fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin ALOGI("Got binder FD %d", binder_fd); 446fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin if (binder_fd < 0) return -1; 447fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin 448fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin sp<BinderCallback> cb(new BinderCallback); 449fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin if (looper->addFd(binder_fd, Looper::POLL_CALLBACK, Looper::EVENT_INPUT, cb, 450fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin nullptr) != 1) { 451fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin ALOGE("Failed to add binder FD to Looper"); 452fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin return -1; 453fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin } 454fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin 455fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin defaultServiceManager()->addService(service->getInterfaceDescriptor(), 456fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin service); 457fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin 458fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin ALOGI("Entering loop"); 459fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin while (true) { 460fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin const int result = looper->pollAll(-1 /* timeoutMillis */); 461fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin ALOGI("Looper returned %d", result); 462fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin } 463fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin return 0; 464fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin} 465fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin 466dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley} // namespace 467b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley 468ad3b806770d3eb833e39ec029925ca2dd6b3c7c7Brian Carlstromint main(int /* argc */, char* /* argv */ []) { 469dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley return Run(); 470b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley} 471