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