aidl_test_service.cpp revision 389781f56bb6b4363e9eb03acf915ba297f607d5
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
22b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/IInterface.h>
23b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/IPCThreadState.h>
24b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/IServiceManager.h>
25b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/ProcessState.h>
26b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/Errors.h>
27b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/Log.h>
28b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/Looper.h>
29b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/StrongPointer.h>
30b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
31521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wiley#include "android/aidl/tests/BnTestService.h"
32521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wiley#include "android/aidl/tests/ITestService.h"
33b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
34389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin#include "android/aidl/tests/BnNamedCallback.h"
35389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin#include "android/aidl/tests/INamedCallback.h"
36389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin
37b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// Used implicitly.
38b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#undef LOG_TAG
3933ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley#define LOG_TAG "aidl_native_service"
40b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
41b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// libutils:
42b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::Looper;
43b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::LooperCallback;
44b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::OK;
45b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::sp;
46b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::status_t;
47b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::String16;
48b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
49b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// libbinder:
50b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::BnInterface;
51b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::defaultServiceManager;
52b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::IInterface;
53b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::IPCThreadState;
54b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::Parcel;
55b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::ProcessState;
56b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
57b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// Generated code:
58521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wileyusing android::aidl::tests::BnTestService;
59389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinusing android::aidl::tests::BnNamedCallback;
60389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinusing android::aidl::tests::INamedCallback;
61b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
62389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin// Standard library
63389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinusing std::map;
648949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wileyusing std::vector;
658949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley
66b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileynamespace android {
67b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileynamespace generated {
68b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileynamespace {
69b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
70b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyclass BinderCallback : public LooperCallback {
71b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley public:
72b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  BinderCallback() {}
73b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  ~BinderCallback() override {}
74b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
75ad3b806770d3eb833e39ec029925ca2dd6b3c7c7Brian Carlstrom  int handleEvent(int /* fd */, int /* events */, void* /* data */ ) override {
76b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    IPCThreadState::self()->handlePolledCommands();
77b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    return 1;  // Continue receiving callbacks.
78b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  }
79b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley};
80b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
81389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinclass NamedCallback : public BnNamedCallback {
82389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin public:
83389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  NamedCallback(String16 name) : name_(name) {}
84389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin
85389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  status_t GetName(String16* ret) {
86389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    *ret = name_;
87389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    return OK;
88389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  }
89389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin
90389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin private:
91389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  String16 name_;
92389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin};
93389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin
94521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wileyclass NativeService : public BnTestService {
95b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley public:
9633ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley  NativeService() {}
9733ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley  ~NativeService() override {}
98b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
99b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  int Run() {
100b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    sp<Looper> looper(Looper::prepare(0 /* opts */));
101b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
102b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    int binder_fd = -1;
103b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    ProcessState::self()->setThreadPoolMaxThreadCount(0);
104b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    IPCThreadState::self()->disableBackgroundScheduling(true);
105b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    IPCThreadState::self()->setupPolling(&binder_fd);
106b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    ALOGI("Got binder FD %d", binder_fd);
107b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    if (binder_fd < 0) return -1;
108b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
109b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    sp<BinderCallback> cb(new BinderCallback);
110b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    if (looper->addFd(binder_fd, Looper::POLL_CALLBACK, Looper::EVENT_INPUT, cb,
111b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley                      nullptr) != 1) {
112b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley      ALOGE("Failed to add binder FD to Looper");
113b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley      return -1;
114b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    }
115b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
116b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    defaultServiceManager()->addService(getInterfaceDescriptor(), this);
117b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
118b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    ALOGI("Entering loop");
119b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    while (true) {
120b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley      const int result = looper->pollAll(-1 /* timeoutMillis */);
121b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley      ALOGI("Looper returned %d", result);
122b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    }
123b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    return 0;
124b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  }
125b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
126d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  void LogRepeatedStringToken(const String16& token) {
127048b55eeb21d2171c203143da7e329dc85b8c0a0Chih-Hung Hsieh    ALOGI("Repeating '%s' of length=%zu", android::String8(token).string(),
128d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley          token.size());
129d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
130d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley
131d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  template<typename T>
132d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  void LogRepeatedToken(const T& token) {
133d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    std::ostringstream token_str;
134d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    token_str << token;
135d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    ALOGI("Repeating token %s", token_str.str().c_str());
136d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
137d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley
138d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  status_t RepeatBoolean(bool token, bool* _aidl_return) override {
139d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    LogRepeatedToken(token ? 1 : 0);
140d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    *_aidl_return = token;
141d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    return OK;
142d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
143d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  status_t RepeatByte(int8_t token, int8_t* _aidl_return) override {
144d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    LogRepeatedToken(token);
145d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    *_aidl_return = token;
146d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    return OK;
147d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
148d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  status_t RepeatChar(char16_t token, char16_t* _aidl_return) override {
149d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    LogRepeatedStringToken(String16(&token, 1));
150d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    *_aidl_return = token;
151d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    return OK;
152d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
153d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  status_t RepeatInt(int32_t token, int32_t* _aidl_return) override {
154d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    LogRepeatedToken(token);
155d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    *_aidl_return = token;
156d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    return OK;
157d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
158d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  status_t RepeatLong(int64_t token, int64_t* _aidl_return) override {
159d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    LogRepeatedToken(token);
160d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    *_aidl_return = token;
161d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    return OK;
162d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
163d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  status_t RepeatFloat(float token, float* _aidl_return) override {
164d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    LogRepeatedToken(token);
165d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    *_aidl_return = token;
166d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    return OK;
167d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
168d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  status_t RepeatDouble(double token, double* _aidl_return) override {
169d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    LogRepeatedToken(token);
170d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    *_aidl_return = token;
171d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    return OK;
172d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
173b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley  status_t RepeatString(
174b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley      const String16& token, String16* _aidl_return) override {
175d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    LogRepeatedStringToken(token);
176d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    *_aidl_return = token;
177b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    return OK;
178b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  }
1798949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley
1808949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  template<typename T>
1818949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  status_t ReverseArray(const vector<T>& input,
1828949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                        vector<T>* repeated,
18347964b084c06ad3ab79040ce6586a15a3edca380Christopher Wiley                        vector<T>* _aidl_return) {
1848949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley    ALOGI("Reversing array of length %zu", input.size());
1858949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley    *repeated = input;
1868949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley    *_aidl_return = input;
1878949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley    std::reverse(_aidl_return->begin(), _aidl_return->end());
1888949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley    return OK;
1898949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  }
1908949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley
1918949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  status_t ReverseBoolean(const vector<bool>& input,
1928949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                          vector<bool>* repeated,
1938949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                          vector<bool>* _aidl_return) override {
1948949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley    return ReverseArray(input, repeated, _aidl_return);
1958949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  }
1968949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  status_t ReverseByte(const vector<int8_t>& input,
1978949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                       vector<int8_t>* repeated,
1988949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                       vector<int8_t>* _aidl_return) override {
1998949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley    return ReverseArray(input, repeated, _aidl_return);
2008949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  }
2018949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  status_t ReverseChar(const vector<char16_t>& input,
2028949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                       vector<char16_t>* repeated,
2038949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                       vector<char16_t>* _aidl_return) override {
2048949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley    return ReverseArray(input, repeated, _aidl_return);
2058949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  }
2068949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  status_t ReverseInt(const vector<int32_t>& input,
2078949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                      vector<int32_t>* repeated,
2088949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                      vector<int32_t>* _aidl_return) override {
2098949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley    return ReverseArray(input, repeated, _aidl_return);
2108949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  }
2118949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  status_t ReverseLong(const vector<int64_t>& input,
2128949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                       vector<int64_t>* repeated,
2138949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                       vector<int64_t>* _aidl_return) override {
2148949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley    return ReverseArray(input, repeated, _aidl_return);
2158949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  }
2168949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  status_t ReverseFloat(const vector<float>& input,
2178949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                        vector<float>* repeated,
2188949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                        vector<float>* _aidl_return) override {
2198949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley    return ReverseArray(input, repeated, _aidl_return);
2208949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  }
2218949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  status_t ReverseDouble(const vector<double>& input,
2228949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                         vector<double>* repeated,
2238949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                         vector<double>* _aidl_return) override {
2248949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley    return ReverseArray(input, repeated, _aidl_return);
2258949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  }
2268949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  status_t ReverseString(const vector<String16>& input,
2278949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                         vector<String16>* repeated,
2288949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley                         vector<String16>* _aidl_return) override {
2298949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley    return ReverseArray(input, repeated, _aidl_return);
2308949f838b881fe52e8fc6be527ab25806f4cc4e6Christopher Wiley  }
231389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin
232389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  status_t GetOtherTestService(const String16& name,
233389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin                               sp<INamedCallback>* returned_service) override {
234389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    if (service_map_.find(name) == service_map_.end()) {
235389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin      sp<INamedCallback> new_item(new NamedCallback(name));
236389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin      service_map_[name] = new_item;
237389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    }
238389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin
239389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    *returned_service = service_map_[name];
240389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    return OK;
241389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  }
242389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin
243389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  status_t VerifyName(const sp<INamedCallback>& service, const String16& name,
244389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin                      bool* returned_value) override {
245389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    String16 foundName;
246389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    status_t err = service->GetName(&foundName);
247389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin
248389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    if (err == OK) {
249389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin      *returned_value = foundName == name;
250389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    }
251389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin
252389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    return err;
253389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  }
254389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin
255389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin private:
256389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  map<String16, sp<INamedCallback>> service_map_;
257b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley};
258b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
259b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}  // namespace
260b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}  // namespace generated
261b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}  // namespace android
262b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
263ad3b806770d3eb833e39ec029925ca2dd6b3c7c7Brian Carlstromint main(int /* argc */, char* /* argv */ []) {
26433ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley  android::generated::NativeService service;
265b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  return service.Run();
266b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}
267