// // Copyright 2015 Google, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at: // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #pragma once #include #include #include #include #include #include "service/gatt_server_old.h" namespace bluetooth { class Adapter; } // namespace bluetooth namespace ipc { // This implements a single threaded event loop which dispatches // reads from a set of FDs (pfds_) to a set of handlers. // Reads from the GATT pipe read end will result in a write to // to the IPC socket, and vise versa. class LinuxIPCHost { public: // LinuxIPCHost owns the passed sockfd. LinuxIPCHost(int sockfd, bluetooth::Adapter* adapter); ~LinuxIPCHost(); // Synchronously handle all events on input FDs. bool EventLoop(); private: // Handler for IPC message receives. // Decodes protocol and dispatches to another handler. bool OnMessage(); // Handler for GATT characteristic writes. // Encodes to protocol and transmits IPC. bool OnGattWrite(); // Applies adapter name changes to stack. bool OnSetAdapterName(const std::string& name); // Handles service creation. bool OnCreateService(const std::string& service_uuid); // Handles service destruction. bool OnDestroyService(const std::string& service_uuid); // Creates a characteristic for a service. bool OnAddCharacteristic(const std::string& service_uuid, const std::string& characteristic_uuid, const std::string& control_uuid, const std::string& options); // Sets the value of a characetistic. bool OnSetCharacteristicValue(const std::string& service_uuid, const std::string& characteristic_uuid, const std::string& value); // Applies settings to service advertisement. bool OnSetAdvertisement(const std::string& service_uuid, const std::string& advertise_uuids, const std::string& advertise_data, const std::string& manufacturer_data, const std::string& transmit_name); // Applies settings to scan response. bool OnSetScanResponse(const std::string& service_uuid, const std::string& advertise_uuids, const std::string& advertise_data, const std::string& manufacturer_data, const std::string& transmit_name); // Starts service (advertisement and connections) bool OnStartService(const std::string& service_uuid); // Stops service. bool OnStopService(const std::string& service_uuid); // weak reference. bluetooth::Adapter* adapter_; // File descripters that we will block against. std::vector pfds_; // Container for multiple GATT servers. Currently only one is supported. // TODO(icoolidge): support many to one for real. std::unordered_map> gatt_servers_; }; } // namespace ipc