1 // 2 // Copyright 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 <bluetooth/uuid.h> 21 #include <memory> 22 #include <string> 23 #include <unordered_map> 24 25 #include "service/gatt_server_old.h" 26 27 namespace bluetooth { 28 class Adapter; 29 } // namespace bluetooth 30 31 namespace 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. 37 class 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