aidl_test_service.cpp revision 048b55eeb21d2171c203143da7e329dc85b8c0a0
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
17d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley#include <sstream>
18d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley#include <string>
19d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley
20b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/IInterface.h>
21b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/IPCThreadState.h>
22b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/IServiceManager.h>
23b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/ProcessState.h>
24b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/Errors.h>
25b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/Log.h>
26b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/Looper.h>
27b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/StrongPointer.h>
28b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
29521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wiley#include "android/aidl/tests/BnTestService.h"
30521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wiley#include "android/aidl/tests/ITestService.h"
31b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
32b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// Used implicitly.
33b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#undef LOG_TAG
3433ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley#define LOG_TAG "aidl_native_service"
35b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
36b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// libutils:
37b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::Looper;
38b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::LooperCallback;
39b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::OK;
40b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::sp;
41b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::status_t;
42b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::String16;
43b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
44b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// libbinder:
45b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::BnInterface;
46b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::defaultServiceManager;
47b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::IInterface;
48b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::IPCThreadState;
49b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::Parcel;
50b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::ProcessState;
51b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
52b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// Generated code:
53521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wileyusing android::aidl::tests::BnTestService;
54b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
55b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileynamespace android {
56b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileynamespace generated {
57b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileynamespace {
58b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
59b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyclass BinderCallback : public LooperCallback {
60b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley public:
61b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  BinderCallback() {}
62b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  ~BinderCallback() override {}
63b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
64ad3b806770d3eb833e39ec029925ca2dd6b3c7c7Brian Carlstrom  int handleEvent(int /* fd */, int /* events */, void* /* data */ ) override {
65b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    IPCThreadState::self()->handlePolledCommands();
66b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    return 1;  // Continue receiving callbacks.
67b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  }
68b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley};
69b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
70521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wileyclass NativeService : public BnTestService {
71b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley public:
7233ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley  NativeService() {}
7333ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley  ~NativeService() override {}
74b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
75b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  int Run() {
76b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    sp<Looper> looper(Looper::prepare(0 /* opts */));
77b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
78b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    int binder_fd = -1;
79b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    ProcessState::self()->setThreadPoolMaxThreadCount(0);
80b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    IPCThreadState::self()->disableBackgroundScheduling(true);
81b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    IPCThreadState::self()->setupPolling(&binder_fd);
82b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    ALOGI("Got binder FD %d", binder_fd);
83b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    if (binder_fd < 0) return -1;
84b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
85b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    sp<BinderCallback> cb(new BinderCallback);
86b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    if (looper->addFd(binder_fd, Looper::POLL_CALLBACK, Looper::EVENT_INPUT, cb,
87b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley                      nullptr) != 1) {
88b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley      ALOGE("Failed to add binder FD to Looper");
89b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley      return -1;
90b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    }
91b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
92b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    defaultServiceManager()->addService(getInterfaceDescriptor(), this);
93b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
94b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    ALOGI("Entering loop");
95b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    while (true) {
96b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley      const int result = looper->pollAll(-1 /* timeoutMillis */);
97b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley      ALOGI("Looper returned %d", result);
98b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    }
99b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    return 0;
100b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  }
101b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
102d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  void LogRepeatedStringToken(const String16& token) {
103048b55eeb21d2171c203143da7e329dc85b8c0a0Chih-Hung Hsieh    ALOGI("Repeating '%s' of length=%zu", android::String8(token).string(),
104d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley          token.size());
105d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
106d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley
107d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  template<typename T>
108d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  void LogRepeatedToken(const T& token) {
109d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    std::ostringstream token_str;
110d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    token_str << token;
111d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    ALOGI("Repeating token %s", token_str.str().c_str());
112d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
113d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley
114d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  status_t RepeatBoolean(bool token, bool* _aidl_return) override {
115d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    LogRepeatedToken(token ? 1 : 0);
116d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    *_aidl_return = token;
117d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    return OK;
118d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
119d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  status_t RepeatByte(int8_t token, int8_t* _aidl_return) override {
120d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    LogRepeatedToken(token);
121d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    *_aidl_return = token;
122d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    return OK;
123d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
124d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  status_t RepeatChar(char16_t token, char16_t* _aidl_return) override {
125d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    LogRepeatedStringToken(String16(&token, 1));
126d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    *_aidl_return = token;
127d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    return OK;
128d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
129d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  status_t RepeatInt(int32_t token, int32_t* _aidl_return) override {
130d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    LogRepeatedToken(token);
131d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    *_aidl_return = token;
132d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    return OK;
133d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
134d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  status_t RepeatLong(int64_t token, int64_t* _aidl_return) override {
135d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    LogRepeatedToken(token);
136d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    *_aidl_return = token;
137d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    return OK;
138d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
139d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  status_t RepeatFloat(float token, float* _aidl_return) override {
140d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    LogRepeatedToken(token);
141d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    *_aidl_return = token;
142d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    return OK;
143d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
144d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  status_t RepeatDouble(double token, double* _aidl_return) override {
145d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    LogRepeatedToken(token);
146d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    *_aidl_return = token;
147d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    return OK;
148d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  }
149d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley  status_t RepeatString(String16 token, String16* _aidl_return) override {
150d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    LogRepeatedStringToken(token);
151d6130f24cfdc3ae1247c4ac290e3f282b34e7615Christopher Wiley    *_aidl_return = token;
152b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    return OK;
153b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  }
154b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley};
155b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
156b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}  // namespace
157b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}  // namespace generated
158b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}  // namespace android
159b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
160ad3b806770d3eb833e39ec029925ca2dd6b3c7c7Brian Carlstromint main(int /* argc */, char* /* argv */ []) {
16133ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley  android::generated::NativeService service;
162b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  return service.Run();
163b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}
164