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#pragma once
17
18#include <poll.h>
19
20#include <memory>
21#include <string>
22#include <unordered_map>
23
24#include "service/common/bluetooth/uuid.h"
25#include "service/gatt_server_old.h"
26
27namespace bluetooth {
28class Adapter;
29}  // namespace bluetooth
30
31namespace ipc {
32
33// This implements a single threaded event loop which dispatches
34// reads from a set of FDs (pfds_) to a set of handlers.
35// Reads from the GATT pipe read end will result in a write to
36// to the IPC socket, and vise versa.
37class LinuxIPCHost {
38 public:
39  // LinuxIPCHost owns the passed sockfd.
40  LinuxIPCHost(int sockfd, bluetooth::Adapter* adapter);
41  ~LinuxIPCHost();
42
43  // Synchronously handle all events on input FDs.
44  bool EventLoop();
45
46 private:
47  // Handler for IPC message receives.
48  // Decodes protocol and dispatches to another handler.
49  bool OnMessage();
50
51  // Handler for GATT characteristic writes.
52  // Encodes to protocol and transmits IPC.
53  bool OnGattWrite();
54
55  // Applies adapter name changes to stack.
56  bool OnSetAdapterName(const std::string& name);
57
58  // Handles service creation.
59  bool OnCreateService(const std::string& service_uuid);
60
61  // Handles service destruction.
62  bool OnDestroyService(const std::string& service_uuid);
63
64  // Creates a characteristic for a service.
65  bool OnAddCharacteristic(const std::string& service_uuid,
66                           const std::string& characteristic_uuid,
67                           const std::string& control_uuid,
68                           const std::string& options);
69
70  // Sets the value of a characetistic.
71  bool OnSetCharacteristicValue(const std::string& service_uuid,
72                                const std::string& characteristic_uuid,
73                                const std::string& value);
74
75  // Applies settings to service advertisement.
76  bool OnSetAdvertisement(const std::string& service_uuid,
77                          const std::string& advertise_uuids,
78                          const std::string& advertise_data,
79                          const std::string& manufacturer_data,
80                          const std::string& transmit_name);
81
82  // Applies settings to scan response.
83  bool OnSetScanResponse(const std::string& service_uuid,
84                         const std::string& advertise_uuids,
85                         const std::string& advertise_data,
86                         const std::string& manufacturer_data,
87                         const std::string& transmit_name);
88
89  // Starts service (advertisement and connections)
90  bool OnStartService(const std::string& service_uuid);
91
92  // Stops service.
93  bool OnStopService(const std::string& service_uuid);
94
95  // weak reference.
96  bluetooth::Adapter *adapter_;
97
98  // File descripters that we will block against.
99  std::vector<struct pollfd> pfds_;
100
101  // Container for multiple GATT servers. Currently only one is supported.
102  // TODO(icoolidge): support many to one for real.
103  std::unordered_map<std::string, std::unique_ptr<bluetooth::gatt::Server>>
104      gatt_servers_;
105};
106
107}  // namespace ipc
108