// Copyright (c) 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef DEVICE_HID_HID_CONNECTION_WIN_H_ #define DEVICE_HID_HID_CONNECTION_WIN_H_ #include #include #include "base/callback.h" #include "base/memory/ref_counted.h" #include "base/message_loop/message_loop.h" #include "base/threading/thread_checker.h" #include "base/win/object_watcher.h" #include "device/hid/hid_connection.h" #include "device/hid/hid_device_info.h" #include "net/base/io_buffer.h" namespace device { class HidConnectionWin : public HidConnection { public: struct PendingTransfer : public base::RefCounted, public base::win::ObjectWatcher::Delegate, public base::MessageLoop::DestructionObserver { public: PendingTransfer(scoped_refptr conn, scoped_refptr target, scoped_refptr receiving, bool is_input, IOCallback callback); void TakeResultFromWindowsAPI(BOOL result); OVERLAPPED* GetOverlapped() { return &overlapped_; } // Implements base::win::ObjectWatcher::Delegate. virtual void OnObjectSignaled(HANDLE object) OVERRIDE; // Implements base::MessageLoop::DestructionObserver virtual void WillDestroyCurrentMessageLoop() OVERRIDE; private: friend class base::RefCounted; friend class HidConnectionWin; virtual ~PendingTransfer(); scoped_refptr conn_; bool is_input_; scoped_refptr target_; scoped_refptr receiving_; IOCallback callback_; OVERLAPPED overlapped_; base::win::ScopedHandle event_; base::win::ObjectWatcher watcher_; DISALLOW_COPY_AND_ASSIGN(PendingTransfer); }; HidConnectionWin(HidDeviceInfo device_info); virtual void Read(scoped_refptr buffer, size_t size, const IOCallback& callback) OVERRIDE; virtual void Write(scoped_refptr buffer, size_t size, const IOCallback& callback) OVERRIDE; virtual void GetFeatureReport(scoped_refptr buffer, size_t size, const IOCallback& callback) OVERRIDE; virtual void SendFeatureReport(scoped_refptr buffer, size_t size, const IOCallback& callback) OVERRIDE; void OnTransferFinished(scoped_refptr transfer); void OnTransferCanceled(scoped_refptr transfer); bool available() const { return available_; } private: ~HidConnectionWin(); base::win::ScopedHandle file_; std::set > transfers_; DISALLOW_COPY_AND_ASSIGN(HidConnectionWin); bool available_; }; } // namespace device #endif // DEVICE_HID_HID_CONNECTION_WIN_H_