OSDN Git Service

Add guest mode functionality (2/5)
[android-x86/system-bt.git] / service / ipc / binder / bluetooth_binder_server.cpp
1 //
2 //  Copyright (C) 2015 Google, Inc.
3 //
4 //  Licensed under the Apache License, Version 2.0 (the "License");
5 //  you may not use this file except in compliance with the License.
6 //  You may obtain a copy of the License at:
7 //
8 //  http://www.apache.org/licenses/LICENSE-2.0
9 //
10 //  Unless required by applicable law or agreed to in writing, software
11 //  distributed under the License is distributed on an "AS IS" BASIS,
12 //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 //  See the License for the specific language governing permissions and
14 //  limitations under the License.
15 //
16
17 #include "service/ipc/binder/bluetooth_binder_server.h"
18
19 #include <base/logging.h>
20
21 #include "service/ipc/binder/bluetooth_gatt_client_binder_server.h"
22 #include "service/ipc/binder/bluetooth_gatt_server_binder_server.h"
23 #include "service/ipc/binder/bluetooth_low_energy_binder_server.h"
24
25 #include "service/hal/bluetooth_interface.h"
26
27 using android::sp;
28
29 namespace ipc {
30 namespace binder {
31
32 BluetoothBinderServer::BluetoothBinderServer(bluetooth::Adapter* adapter)
33     : adapter_(adapter) {
34   CHECK(adapter_);
35   adapter_->AddObserver(this);
36 }
37
38 BluetoothBinderServer::~BluetoothBinderServer() {
39   adapter_->RemoveObserver(this);
40 }
41
42 // binder::BnBluetooth overrides:
43 bool BluetoothBinderServer::IsEnabled() {
44   VLOG(2) << __func__;
45   return adapter_->IsEnabled();
46 }
47
48 int BluetoothBinderServer::GetState() {
49   VLOG(2) << __func__;
50   return adapter_->GetState();
51 }
52
53 bool BluetoothBinderServer::Enable(bool start_restricted) {
54   VLOG(2) << __func__;
55   return adapter_->Enable(start_restricted);
56 }
57
58 bool BluetoothBinderServer::EnableNoAutoConnect() {
59   VLOG(2) << __func__;
60   // TODO(armansito): Implement.
61   return false;
62 }
63
64 bool BluetoothBinderServer::Disable() {
65   VLOG(2) << __func__;
66   return adapter_->Disable();
67 }
68
69 std::string BluetoothBinderServer::GetAddress() {
70   VLOG(2) << __func__;
71   return adapter_->GetAddress();
72 }
73
74 std::vector<bluetooth::UUID> BluetoothBinderServer::GetUUIDs() {
75   VLOG(2) << __func__;
76   // TODO(armansito): Implement.
77   return std::vector<bluetooth::UUID>();
78 }
79
80 bool BluetoothBinderServer::SetName(const std::string& name) {
81   VLOG(2) << __func__;
82   return adapter_->SetName(name);
83 }
84
85 std::string BluetoothBinderServer::GetName() {
86   VLOG(2) << __func__;
87   return adapter_->GetName();
88 }
89
90 void BluetoothBinderServer::RegisterCallback(
91     const sp<IBluetoothCallback>& callback) {
92   VLOG(2) << __func__;
93   if (!callback.get() ) {
94     LOG(ERROR) << "RegisterCallback called with NULL binder. Ignoring.";
95     return;
96   }
97   callbacks_.Register(callback);
98 }
99
100 void BluetoothBinderServer::UnregisterCallback(
101     const sp<IBluetoothCallback>& callback) {
102   VLOG(2) << __func__;
103   if (!callback.get() ) {
104     LOG(ERROR) << "UnregisterCallback called with NULL binder. Ignoring.";
105     return;
106   }
107   callbacks_.Unregister(callback);
108 }
109
110 bool BluetoothBinderServer::IsMultiAdvertisementSupported() {
111   VLOG(2) << __func__;
112   return adapter_->IsMultiAdvertisementSupported();
113 }
114
115 sp<IBluetoothLowEnergy>
116 BluetoothBinderServer::GetLowEnergyInterface() {
117   VLOG(2) << __func__;
118
119   if (!adapter_->IsEnabled()) {
120     LOG(ERROR) << "Cannot obtain IBluetoothLowEnergy interface while disabled";
121     return nullptr;
122   }
123
124   if (!low_energy_interface_.get())
125     low_energy_interface_ = new BluetoothLowEnergyBinderServer(adapter_);
126
127   return low_energy_interface_;
128 }
129
130 sp<IBluetoothGattClient>
131 BluetoothBinderServer::GetGattClientInterface() {
132   VLOG(2) << __func__;
133
134   if (!adapter_->IsEnabled()) {
135     LOG(ERROR) << "Cannot obtain IBluetoothGattClient interface while disabled";
136     return nullptr;
137   }
138
139   if (!gatt_client_interface_.get())
140     gatt_client_interface_ = new BluetoothGattClientBinderServer(adapter_);
141
142   return gatt_client_interface_;
143 }
144
145 sp<IBluetoothGattServer>
146 BluetoothBinderServer::GetGattServerInterface() {
147   VLOG(2) << __func__;
148
149   if (!adapter_->IsEnabled()) {
150     LOG(ERROR) << "Cannot obtain IBluetoothGattServer interface while disabled";
151     return nullptr;
152   }
153
154   if (!gatt_server_interface_.get())
155     gatt_server_interface_ = new BluetoothGattServerBinderServer(adapter_);
156
157   return gatt_server_interface_;
158 }
159
160 android::status_t BluetoothBinderServer::dump(int fd, const android::Vector<android::String16>& args) {
161   VLOG(2) << __func__ << " called with fd " << fd;
162   if  (args.size() > 0) {
163     // TODO (jamuraa): Parse arguments and switch on --proto, --proto_text
164     for (auto x : args) {
165       VLOG(2) << __func__ << "argument: " << x.string();
166     }
167   }
168   // TODO (jamuraa): enumerate profiles and dump profile information
169   const bt_interface_t *iface = bluetooth::hal::BluetoothInterface::Get()->GetHALInterface();
170   iface->dump(fd, NULL);
171   return android::NO_ERROR;
172 }
173
174 void BluetoothBinderServer::OnAdapterStateChanged(
175     bluetooth::Adapter* adapter,
176     bluetooth::AdapterState prev_state,
177     bluetooth::AdapterState new_state) {
178   CHECK_EQ(adapter, adapter_);
179   VLOG(2) << "Received adapter state update - prev: " << prev_state
180           << " new: " << new_state;
181   callbacks_.ForEach([prev_state, new_state](IBluetoothCallback* callback) {
182     callback->OnBluetoothStateChange(prev_state, new_state);
183   });
184 }
185
186 }  // namespace binder
187 }  // namespace ipc