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