| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * |
| * 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 <functional> |
| #include <memory> |
| |
| #include <stdint.h> |
| #include <libusb/libusb.h> |
| #include "common/libs/usbforward/protocol.h" |
| |
| namespace usb_forward { |
| |
| // TransportRequest represents a libusb asynchronous transport request. |
| // This class encapsulates everything that is necessary to complete |
| // transfer. |
| class TransportRequest final { |
| public: |
| // CallbackType describes what kind of function can receive call when this |
| // asynchronous call is complete. |
| // Parameters passed to callback, in order: |
| // - success indicator (true = success), |
| // - buffer with data (in or out), |
| // - actual length transferred. |
| using CallbackType = std::function<void(bool, const uint8_t*, int32_t)>; |
| |
| TransportRequest(std::shared_ptr<libusb_device_handle> device, |
| CallbackType callback, const ControlTransfer& transfer); |
| TransportRequest(std::shared_ptr<libusb_device_handle> device, |
| CallbackType callback, const DataTransfer& transfer); |
| ~TransportRequest() = default; |
| |
| uint8_t* Buffer(); |
| |
| // Submit sends an asynchronous data exchange requests. |
| // Returns true only if operation was successful. At this point |
| // ownership of this structure is passed to libusb and user |
| // must not release the underlying structure. |
| bool Submit(); |
| |
| // Executes corresponding callback with execution results. |
| // This is a static call to ensure that the callback being invoked |
| // can dispose of this instance. |
| static void OnTransferComplete(libusb_transfer* req); |
| |
| private: |
| std::shared_ptr<libusb_device_handle> handle_; |
| CallbackType callback_; |
| bool is_control_; |
| std::unique_ptr<libusb_transfer, void (*)(libusb_transfer*)> transfer_; |
| std::unique_ptr<uint8_t[]> buffer_; |
| |
| TransportRequest(const TransportRequest& other) = delete; |
| TransportRequest& operator=(const TransportRequest& other) = delete; |
| }; |
| |
| } // namespace usb_forward |