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