#ifndef SERVICES_DEVICE_HID_HID_CONNECTION_WIN_H_
#define SERVICES_DEVICE_HID_HID_CONNECTION_WIN_H_
#include <windows.h>
#include <stddef.h>
#include <stdint.h>
#include <list>
#include "base/containers/flat_set.h"
#include "base/win/scoped_handle.h"
#include "services/device/hid/hid_connection.h"
namespace device {
class PendingHidTransfer;
class HidConnectionWin : public HidConnection {
public:
struct HidDeviceEntry {
HidDeviceEntry(base::flat_set<uint8_t> report_ids,
base::win::ScopedHandle file_handle);
~HidDeviceEntry();
base::flat_set<uint8_t> report_ids;
base::win::ScopedHandle file_handle;
};
static scoped_refptr<HidConnection> Create(
scoped_refptr<HidDeviceInfo> device_info,
std::vector<std::unique_ptr<HidDeviceEntry>> file_handles,
bool allow_protected_reports,
bool allow_fido_reports);
HidConnectionWin(HidConnectionWin&) = delete;
HidConnectionWin& operator=(HidConnectionWin&) = delete;
private:
friend class HidServiceWin;
friend class PendingHidTransfer;
HidConnectionWin(scoped_refptr<HidDeviceInfo> device_info,
std::vector<std::unique_ptr<HidDeviceEntry>> file_handles,
bool allow_protected_reports,
bool allow_fido_reports);
~HidConnectionWin() override;
void PlatformClose() override;
void PlatformWrite(scoped_refptr<base::RefCountedBytes> buffer,
WriteCallback callback) override;
void PlatformGetFeatureReport(uint8_t report_id,
ReadCallback callback) override;
void PlatformSendFeatureReport(scoped_refptr<base::RefCountedBytes> buffer,
WriteCallback callback) override;
void SetUpInitialReads();
void ReadNextInputReportOnHandle(HANDLE file_handle);
void OnReadInputReport(HANDLE file_handle,
scoped_refptr<base::RefCountedBytes> buffer,
PendingHidTransfer* transfer,
bool signaled);
void OnReadFeatureComplete(HANDLE file_handle,
scoped_refptr<base::RefCountedBytes> buffer,
ReadCallback callback,
PendingHidTransfer* transfer,
bool signaled);
void OnWriteComplete(HANDLE file_handle,
WriteCallback callback,
PendingHidTransfer* transfer,
bool signaled);
std::unique_ptr<PendingHidTransfer> UnlinkTransfer(
PendingHidTransfer* transfer);
HANDLE GetHandleForReportId(uint8_t report_id) const;
std::vector<std::unique_ptr<HidDeviceEntry>> file_handles_;
std::list<std::unique_ptr<PendingHidTransfer>> transfers_;
};
}
#endif