You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.5 KiB
108 lines
3.5 KiB
//
|
|
// 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
|