1b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray// 2b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray// Copyright (C) 2015 Google, Inc. 3b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray// 4b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray// Licensed under the Apache License, Version 2.0 (the "License"); 5b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray// you may not use this file except in compliance with the License. 6b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray// You may obtain a copy of the License at: 7b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray// 8b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray// http://www.apache.org/licenses/LICENSE-2.0 9b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray// 10b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray// Unless required by applicable law or agreed to in writing, software 11b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray// distributed under the License is distributed on an "AS IS" BASIS, 12b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray// See the License for the specific language governing permissions and 14b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray// limitations under the License. 15b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray// 16b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray 17b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray#include "service/ipc/binder/ipc_handler_binder.h" 18b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray 19b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray#include <base/bind.h> 20b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray#include <base/logging.h> 21b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray#include <base/message_loop/message_loop.h> 22b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray#include <binder/IPCThreadState.h> 23b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray#include <binder/IServiceManager.h> 24b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray#include <binder/ProcessState.h> 25b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray 26b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray#include "service/ipc/binder/bluetooth_binder_server.h" 27b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray 28b2286f386e20a45b5f19a199d0981f4952216fa3Arman Ugurayusing android::defaultServiceManager; 29b2286f386e20a45b5f19a199d0981f4952216fa3Arman Ugurayusing android::sp; 30b2286f386e20a45b5f19a199d0981f4952216fa3Arman Ugurayusing android::status_t; 31a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowskiusing android::String8; 32b2286f386e20a45b5f19a199d0981f4952216fa3Arman Ugurayusing android::String16; 33b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray 34b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguraynamespace ipc { 35b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray 36a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowskistd::string kServiceName = "bluetooth-service"; 37a4bd0d2370bd469942e92e724cfc9c7c01d3da74Jakub Pawlowski 38911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsonIPCHandlerBinder::IPCHandlerBinder(bluetooth::Adapter* adapter, 39911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson IPCManager::Delegate* delegate) 40911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : IPCHandler(adapter, delegate) {} 41b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray 42911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsonIPCHandlerBinder::~IPCHandlerBinder() {} 43b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray 44b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguraybool IPCHandlerBinder::Run() { 45d6a4b0c950f44d3eab34825880d26c19e362d22bArman Uguray CHECK(adapter()); 46b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray 47b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray // Register the IBluetooth service with the Android ServiceManager. 4867ab1c856dfc0ca9fb44b94b3621d4183a693a5aArman Uguray android::sp<binder::BluetoothBinderServer> bt_server = 4967ab1c856dfc0ca9fb44b94b3621d4183a693a5aArman Uguray new binder::BluetoothBinderServer(adapter()); 50b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray status_t status = defaultServiceManager()->addService( 51911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson String16(String8(kServiceName.c_str())), bt_server); 52b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray if (status != android::NO_ERROR) { 53b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray LOG(ERROR) << "Failed to register Bluetooth service with ServiceManager"; 54b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray return false; 55b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray } 56b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray 57b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray // Notify the delegate. We do this in the message loop to avoid reentrancy. 58b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray if (delegate()) { 59b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray base::MessageLoop::current()->task_runner()->PostTask( 60911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson FROM_HERE, base::Bind(&IPCHandlerBinder::NotifyStarted, this)); 61b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray } 62b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray 63b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray android::ProcessState::self()->startThreadPool(); 64b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray 65b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray return true; 66b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray} 67b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray 68b2286f386e20a45b5f19a199d0981f4952216fa3Arman Ugurayvoid IPCHandlerBinder::Stop() { 69b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray // TODO(armansito): There are several methods in android::IPCThreadState that 70b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray // are related to shutting down the threadpool, however I haven't been able to 71b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray // make them shut things down cleanly. Figure out the right way to stop the 72b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray // Binder IPC here. 73b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray} 74b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray 75b2286f386e20a45b5f19a199d0981f4952216fa3Arman Ugurayvoid IPCHandlerBinder::NotifyStarted() { 76911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (delegate()) delegate()->OnIPCHandlerStarted(IPCManager::TYPE_BINDER); 77b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray} 78b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray 79b2286f386e20a45b5f19a199d0981f4952216fa3Arman Uguray} // namespace ipc 80