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