blob: 012f70ecd815cb7cb72af0d90259335b17aacf23 [file] [log] [blame]
//
// 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 <poll.h>
#include <bluetooth/uuid.h>
#include <memory>
#include <string>
#include <unordered_map>
#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<struct pollfd> pfds_;
// Container for multiple GATT servers. Currently only one is supported.
// TODO(icoolidge): support many to one for real.
std::unordered_map<std::string, std::unique_ptr<bluetooth::gatt::Server>>
gatt_servers_;
};
} // namespace ipc