aboutsummaryrefslogtreecommitdiff
path: root/devel/electron23/files/patch-services_device_hid_hid__connection__fido.cc
diff options
context:
space:
mode:
Diffstat (limited to 'devel/electron23/files/patch-services_device_hid_hid__connection__fido.cc')
-rw-r--r--devel/electron23/files/patch-services_device_hid_hid__connection__fido.cc221
1 files changed, 0 insertions, 221 deletions
diff --git a/devel/electron23/files/patch-services_device_hid_hid__connection__fido.cc b/devel/electron23/files/patch-services_device_hid_hid__connection__fido.cc
deleted file mode 100644
index 590b1dbc5c78..000000000000
--- a/devel/electron23/files/patch-services_device_hid_hid__connection__fido.cc
+++ /dev/null
@@ -1,221 +0,0 @@
---- services/device/hid/hid_connection_fido.cc.orig 2022-10-28 16:39:00 UTC
-+++ services/device/hid/hid_connection_fido.cc
-@@ -0,0 +1,218 @@
-+// Copyright 2014 The Chromium Authors
-+// Use of this source code is governed by a BSD-style license that can be
-+// found in the LICENSE file.
-+
-+#include "services/device/hid/hid_connection_fido.h"
-+
-+#include <errno.h>
-+#include <sys/ioctl.h>
-+
-+#include <memory>
-+#include <string>
-+#include <utility>
-+
-+#include "base/bind.h"
-+#include "base/files/file_descriptor_watcher_posix.h"
-+#include "base/memory/ref_counted_memory.h"
-+#include "base/posix/eintr_wrapper.h"
-+#include "base/threading/scoped_blocking_call.h"
-+#include "base/threading/sequenced_task_runner_handle.h"
-+#include "components/device_event_log/device_event_log.h"
-+#include "services/device/hid/hid_service.h"
-+
-+namespace device {
-+
-+class HidConnectionFido::BlockingTaskRunnerHelper {
-+ public:
-+ BlockingTaskRunnerHelper(base::ScopedFD fd,
-+ scoped_refptr<HidDeviceInfo> device_info,
-+ base::WeakPtr<HidConnectionFido> connection)
-+ : fd_(std::move(fd)),
-+ connection_(connection),
-+ origin_task_runner_(base::SequencedTaskRunnerHandle::Get()) {
-+ DETACH_FROM_SEQUENCE(sequence_checker_);
-+ // Report buffers must always have room for the report ID.
-+ report_buffer_size_ = device_info->max_input_report_size() + 1;
-+ has_report_id_ = device_info->has_report_id();
-+ }
-+
-+ BlockingTaskRunnerHelper(const BlockingTaskRunnerHelper&) = delete;
-+ BlockingTaskRunnerHelper& operator=(const BlockingTaskRunnerHelper&) = delete;
-+
-+ ~BlockingTaskRunnerHelper() {
-+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-+ }
-+
-+ // Starts the FileDescriptorWatcher that reads input events from the device.
-+ // Must be called on a thread that has a base::MessageLoopForIO.
-+ void Start() {
-+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-+
-+ file_watcher_ = base::FileDescriptorWatcher::WatchReadable(
-+ fd_.get(), base::BindRepeating(
-+ &BlockingTaskRunnerHelper::OnFileCanReadWithoutBlocking,
-+ base::Unretained(this)));
-+ }
-+
-+ void Write(scoped_refptr<base::RefCountedBytes> buffer,
-+ WriteCallback callback) {
-+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-+ base::ScopedBlockingCall scoped_blocking_call(
-+ FROM_HERE, base::BlockingType::MAY_BLOCK);
-+
-+ auto data = buffer->front();
-+ size_t size = buffer->size();
-+ // if report id is 0, it shouldn't be included
-+ if (data[0] == 0) {
-+ data++;
-+ size--;
-+ }
-+
-+ ssize_t result =
-+ HANDLE_EINTR(write(fd_.get(), data, size));
-+ if (result < 0) {
-+ HID_PLOG(EVENT) << "Write failed";
-+ origin_task_runner_->PostTask(FROM_HERE,
-+ base::BindOnce(std::move(callback), false));
-+ } else {
-+ if (static_cast<size_t>(result) != size) {
-+ HID_LOG(EVENT) << "Incomplete HID write: " << result
-+ << " != " << buffer->size();
-+ }
-+ origin_task_runner_->PostTask(FROM_HERE,
-+ base::BindOnce(std::move(callback), true));
-+ }
-+ }
-+
-+ void GetFeatureReport(uint8_t report_id,
-+ scoped_refptr<base::RefCountedBytes> buffer,
-+ ReadCallback callback) {
-+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-+ base::ScopedBlockingCall scoped_blocking_call(
-+ FROM_HERE, base::BlockingType::MAY_BLOCK);
-+ HID_PLOG(EVENT) << "GendFeatureReport not implemented on OpenBSD";
-+ origin_task_runner_->PostTask(
-+ FROM_HERE, base::BindOnce(std::move(callback), false, nullptr, 0));
-+ }
-+
-+ void SendFeatureReport(scoped_refptr<base::RefCountedBytes> buffer,
-+ WriteCallback callback) {
-+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-+ base::ScopedBlockingCall scoped_blocking_call(
-+ FROM_HERE, base::BlockingType::MAY_BLOCK);
-+ HID_PLOG(EVENT) << "SendFeatureReport not implemented on OpenBSD";
-+ origin_task_runner_->PostTask(FROM_HERE,
-+ base::BindOnce(std::move(callback), false));
-+ }
-+
-+ private:
-+ void OnFileCanReadWithoutBlocking() {
-+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-+
-+ auto buffer =
-+ base::MakeRefCounted<base::RefCountedBytes>(report_buffer_size_);
-+ uint8_t* data = buffer->front();
-+ size_t length = report_buffer_size_;
-+ if (!has_report_id_) {
-+ // Fido will not prefix the buffer with a report ID if report IDs are not
-+ // used by the device. Prefix the buffer with 0.
-+ *data++ = 0;
-+ length--;
-+ }
-+
-+ ssize_t bytes_read = HANDLE_EINTR(read(fd_.get(), data, length));
-+ if (bytes_read < 0) {
-+ if (errno != EAGAIN) {
-+ HID_PLOG(EVENT) << "Read failed";
-+ // This assumes that the error is unrecoverable and disables reading
-+ // from the device until it has been re-opened.
-+ // TODO(reillyg): Investigate starting and stopping the file descriptor
-+ // watcher in response to pending read requests so that per-request
-+ // errors can be returned to the client.
-+ file_watcher_.reset();
-+ }
-+ return;
-+ }
-+ if (!has_report_id_) {
-+ // Behave as if the byte prefixed above as the the report ID was read.
-+ bytes_read++;
-+ }
-+
-+ origin_task_runner_->PostTask(
-+ FROM_HERE, base::BindOnce(&HidConnectionFido::ProcessInputReport,
-+ connection_, buffer, bytes_read));
-+ }
-+
-+ SEQUENCE_CHECKER(sequence_checker_);
-+ base::ScopedFD fd_;
-+ size_t report_buffer_size_;
-+ bool has_report_id_;
-+ base::WeakPtr<HidConnectionFido> connection_;
-+ const scoped_refptr<base::SequencedTaskRunner> origin_task_runner_;
-+ std::unique_ptr<base::FileDescriptorWatcher::Controller> file_watcher_;
-+};
-+
-+HidConnectionFido::HidConnectionFido(
-+ scoped_refptr<HidDeviceInfo> device_info,
-+ base::ScopedFD fd,
-+ scoped_refptr<base::SequencedTaskRunner> blocking_task_runner,
-+ bool allow_protected_reports,
-+ bool allow_fido_reports)
-+ : HidConnection(device_info, allow_protected_reports, allow_fido_reports),
-+ helper_(nullptr, base::OnTaskRunnerDeleter(blocking_task_runner)),
-+ blocking_task_runner_(std::move(blocking_task_runner)) {
-+ helper_.reset(new BlockingTaskRunnerHelper(std::move(fd), device_info,
-+ weak_factory_.GetWeakPtr()));
-+ blocking_task_runner_->PostTask(
-+ FROM_HERE, base::BindOnce(&BlockingTaskRunnerHelper::Start,
-+ base::Unretained(helper_.get())));
-+}
-+
-+HidConnectionFido::~HidConnectionFido() {}
-+
-+void HidConnectionFido::PlatformClose() {
-+ // By closing the device on the blocking task runner 1) the requirement that
-+ // base::ScopedFD is destroyed on a thread where I/O is allowed is satisfied
-+ // and 2) any tasks posted to this task runner that refer to this file will
-+ // complete before it is closed.
-+ helper_.reset();
-+}
-+
-+void HidConnectionFido::PlatformWrite(
-+ scoped_refptr<base::RefCountedBytes> buffer,
-+ WriteCallback callback) {
-+ // Fido expects the first byte of the buffer to always be a report ID so the
-+ // buffer can be used directly.
-+ blocking_task_runner_->PostTask(
-+ FROM_HERE, base::BindOnce(&BlockingTaskRunnerHelper::Write,
-+ base::Unretained(helper_.get()), buffer,
-+ std::move(callback)));
-+}
-+
-+void HidConnectionFido::PlatformGetFeatureReport(uint8_t report_id,
-+ ReadCallback callback) {
-+ // The first byte of the destination buffer is the report ID being requested
-+ // and is overwritten by the feature report.
-+ DCHECK_GT(device_info()->max_feature_report_size(), 0u);
-+ auto buffer = base::MakeRefCounted<base::RefCountedBytes>(
-+ device_info()->max_feature_report_size() + 1);
-+ buffer->data()[0] = report_id;
-+
-+ blocking_task_runner_->PostTask(
-+ FROM_HERE, base::BindOnce(&BlockingTaskRunnerHelper::GetFeatureReport,
-+ base::Unretained(helper_.get()), report_id,
-+ buffer, std::move(callback)));
-+}
-+
-+void HidConnectionFido::PlatformSendFeatureReport(
-+ scoped_refptr<base::RefCountedBytes> buffer,
-+ WriteCallback callback) {
-+ // Fido expects the first byte of the buffer to always be a report ID so the
-+ // buffer can be used directly.
-+ blocking_task_runner_->PostTask(
-+ FROM_HERE, base::BindOnce(&BlockingTaskRunnerHelper::SendFeatureReport,
-+ base::Unretained(helper_.get()), buffer,
-+ std::move(callback)));
-+}
-+
-+} // namespace device