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