Home | History | Annotate | Download | only in ipc
      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 
     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