aidl_test_service.cpp revision 33375d7e672c854b3691ae5fd17af782ff49b3aa
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  }
202e9e73f120b17bb61c2e012ba273fa18da4fb2feaCasey Dahlin  Status ReverseByte(const vector<uint8_t>& input,
203e9e73f120b17bb61c2e012ba273fa18da4fb2feaCasey Dahlin                     vector<uint8_t>* repeated,
204e9e73f120b17bb61c2e012ba273fa18da4fb2feaCasey Dahlin                     vector<uint8_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
34533375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley  Status TakesAnIBinder(const sp<IBinder>& input) override {
34633375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley    (void)input;
34733375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley    return Status::ok();
34833375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley  }
34933375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley  Status TakesAnIBinderList(const vector<sp<IBinder>>& input) override {
35033375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley    (void)input;
35133375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley    return Status::ok();
35233375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley  }
35333375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley  Status TakesANullableIBinder(const sp<IBinder>& input) {
35433375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley    (void)input;
35533375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley    return Status::ok();
35633375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley  }
35733375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley  Status TakesANullableIBinderList(const unique_ptr<vector<sp<IBinder>>>& input) {
35833375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley    (void)input;
35933375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley    return Status::ok();
36033375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley  }
36133375d7e672c854b3691ae5fd17af782ff49b3aaChristopher Wiley
362dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley  Status RepeatUtf8CppString(const string& token,
363dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley                             string* _aidl_return) override {
364dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley    ALOGI("Repeating utf8 string '%s' of length=%zu", token.c_str(), token.size());
365dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley    *_aidl_return = token;
366dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley    return Status::ok();
367dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley  }
368dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley
369dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley  Status RepeatNullableUtf8CppString(
370dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley      const unique_ptr<string>& token,
371dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley      unique_ptr<string>* _aidl_return) override {
372dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley    if (!token) {
373dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley      ALOGI("Received null @utf8InCpp string");
374dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley      return Status::ok();
375dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley    }
376dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley    ALOGI("Repeating utf8 string '%s' of length=%zu",
377dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley          token->c_str(), token->size());
378dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley    _aidl_return->reset(new string(*token));
379dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley    return Status::ok();
380dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley  }
381dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley
382dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley  Status ReverseUtf8CppString(const vector<string>& input,
383dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley                              vector<string>* repeated,
384dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley                              vector<string>* _aidl_return) {
385dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley    return ReverseArray(input, repeated, _aidl_return);
386dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley  }
387dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley
38899d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley  Status ReverseUtf8CppStringList(
38999d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley      const unique_ptr<vector<unique_ptr<::string>>>& input,
39099d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley      unique_ptr<vector<unique_ptr<string>>>* repeated,
39199d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley      unique_ptr<vector<unique_ptr<string>>>* _aidl_return) {
39299d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley    if (!input) {
39399d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley      ALOGI("Received null list of utf8 strings");
39499d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley      return Status::ok();
39599d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley    }
39699d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley    _aidl_return->reset(new vector<unique_ptr<string>>);
39799d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley    repeated->reset(new vector<unique_ptr<string>>);
39899d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley
39999d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley    for (const auto& item : *input) {
40099d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley      (*repeated)->emplace_back(nullptr);
40199d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley      (*_aidl_return)->emplace_back(nullptr);
40299d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley      if (item) {
40399d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley        (*repeated)->back().reset(new string(*item));
40499d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley        (*_aidl_return)->back().reset(new string(*item));
40599d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley      }
40699d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley    }
40799d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley    std::reverse((*_aidl_return)->begin(), (*_aidl_return)->end());
40899d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley
40999d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley    return Status::ok();
41099d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley  }
41199d699bef10f2455931fdd46861a25742a8fd7eaChristopher Wiley
412389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin private:
413389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  map<String16, sp<INamedCallback>> service_map_;
414b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley};
415b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
416fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlinint Run() {
417dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley  android::sp<NativeService> service = new NativeService;
418fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin  sp<Looper> looper(Looper::prepare(0 /* opts */));
419fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin
420fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin  int binder_fd = -1;
421fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin  ProcessState::self()->setThreadPoolMaxThreadCount(0);
422fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin  IPCThreadState::self()->disableBackgroundScheduling(true);
423fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin  IPCThreadState::self()->setupPolling(&binder_fd);
424fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin  ALOGI("Got binder FD %d", binder_fd);
425fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin  if (binder_fd < 0) return -1;
426fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin
427fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin  sp<BinderCallback> cb(new BinderCallback);
428fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin  if (looper->addFd(binder_fd, Looper::POLL_CALLBACK, Looper::EVENT_INPUT, cb,
429fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin                    nullptr) != 1) {
430fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin    ALOGE("Failed to add binder FD to Looper");
431fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin    return -1;
432fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin  }
433fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin
434fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin  defaultServiceManager()->addService(service->getInterfaceDescriptor(),
435fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin                                      service);
436fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin
437fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin  ALOGI("Entering loop");
438fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin  while (true) {
439fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin    const int result = looper->pollAll(-1 /* timeoutMillis */);
440fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin    ALOGI("Looper returned %d", result);
441fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin  }
442fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin  return 0;
443fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin}
444fc465468a55047324dd5ecef9282ff41f3d8b542Casey Dahlin
445dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley}  // namespace
446b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
447ad3b806770d3eb833e39ec029925ca2dd6b3c7c7Brian Carlstromint main(int /* argc */, char* /* argv */ []) {
448dca2ecf2883771b4c895e52a9f07e2467d603f77Christopher Wiley  return Run();
449b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}
450