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