aidl_test_service.cpp revision 521bb618fa16d0b88ae88b8dcd98b72e579f1ed4
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
17b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/IInterface.h>
18b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/IPCThreadState.h>
19b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/IServiceManager.h>
20b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <binder/ProcessState.h>
21b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/Errors.h>
22b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/Log.h>
23b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/Looper.h>
24b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#include <utils/StrongPointer.h>
25b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
26521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wiley#include "android/aidl/tests/BnTestService.h"
27521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wiley#include "android/aidl/tests/ITestService.h"
28b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
29b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// Used implicitly.
30b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley#undef LOG_TAG
3133ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley#define LOG_TAG "aidl_native_service"
32b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
33b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// libutils:
34b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::Looper;
35b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::LooperCallback;
36b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::OK;
37b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::sp;
38b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::status_t;
39b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::String16;
40b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
41b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// libbinder:
42b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::BnInterface;
43b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::defaultServiceManager;
44b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::IInterface;
45b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::IPCThreadState;
46b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::Parcel;
47b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyusing android::ProcessState;
48b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
49b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley// Generated code:
50521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wileyusing android::aidl::tests::BnTestService;
51b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
52b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileynamespace android {
53b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileynamespace generated {
54b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileynamespace {
55b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
56b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wileyclass BinderCallback : public LooperCallback {
57b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley public:
58b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  BinderCallback() {}
59b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  ~BinderCallback() override {}
60b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
61ad3b806770d3eb833e39ec029925ca2dd6b3c7c7Brian Carlstrom  int handleEvent(int /* fd */, int /* events */, void* /* data */ ) override {
62b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    IPCThreadState::self()->handlePolledCommands();
63b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    return 1;  // Continue receiving callbacks.
64b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  }
65b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley};
66b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
67521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wileyclass NativeService : public BnTestService {
68b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley public:
6933ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley  NativeService() {}
7033ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley  ~NativeService() override {}
71b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
72b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  int Run() {
73b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    sp<Looper> looper(Looper::prepare(0 /* opts */));
74b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
75b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    int binder_fd = -1;
76b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    ProcessState::self()->setThreadPoolMaxThreadCount(0);
77b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    IPCThreadState::self()->disableBackgroundScheduling(true);
78b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    IPCThreadState::self()->setupPolling(&binder_fd);
79b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    ALOGI("Got binder FD %d", binder_fd);
80b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    if (binder_fd < 0) return -1;
81b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
82b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    sp<BinderCallback> cb(new BinderCallback);
83b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    if (looper->addFd(binder_fd, Looper::POLL_CALLBACK, Looper::EVENT_INPUT, cb,
84b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley                      nullptr) != 1) {
85b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley      ALOGE("Failed to add binder FD to Looper");
86b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley      return -1;
87b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    }
88b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
89b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    defaultServiceManager()->addService(getInterfaceDescriptor(), this);
90b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
91b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    ALOGI("Entering loop");
92b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    while (true) {
93b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley      const int result = looper->pollAll(-1 /* timeoutMillis */);
94b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley      ALOGI("Looper returned %d", result);
95b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    }
96b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    return 0;
97b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  }
98b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
99521bb618fa16d0b88ae88b8dcd98b72e579f1ed4Christopher Wiley  // BnTestService:
100b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  status_t Ping(int32_t token, int32_t* returned_token) override {
101b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    ALOGI("Got ping with token %d", token);
102b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    *returned_token = token;
103b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley    return OK;
104b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  }
105b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley};
106b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
107b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}  // namespace
108b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}  // namespace generated
109b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}  // namespace android
110b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley
111ad3b806770d3eb833e39ec029925ca2dd6b3c7c7Brian Carlstromint main(int /* argc */, char* /* argv */ []) {
11233ad81e306649cb769e02d10ccf77520b68c7742Christopher Wiley  android::generated::NativeService service;
113b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley  return service.Run();
114b5e698c8bf4efc7bcbe5fd24685968db10e62735Christopher Wiley}
115