| /* |
| * 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 "common/libs/fs/shared_fd.h" |
| #include "common/libs/usbforward/protocol.h" |
| |
| namespace vadb { |
| // USBCommand is an abstraction of a proxied USB command. |
| // Instances of this object all share the following life cycle: |
| // 1) A specific instance (COMMAND) is being created. |
| // 2) Instance owner (OWNER) sends RequestHeader. |
| // 3) OWNER calls COMMAND.OnRequest() to send any relevant, additional |
| // information. |
| // 4) OWNER queues COMMAND until response arrives. |
| // |
| // At this point instance owner can process next command in queue. Then, |
| // eventually: |
| // |
| // 5) OWNER receives matching ResponseHeader. |
| // 6) OWNER calls COMMAND.OnResponse(), supplying FD that carries additional |
| // data. |
| // 7) OWNER dequeues and deletes COMMAND. |
| class USBCommand { |
| public: |
| USBCommand() = default; |
| virtual ~USBCommand() = default; |
| |
| // Command returns a specific usbforward command ID associated with this |
| // request. |
| virtual usb_forward::Command Command() = 0; |
| |
| // OnRequest is called whenever additional data relevant to this command |
| // (other than RequestHeader) should be sent. |
| // Returns false, if communication with remote host failed (and should be |
| // terminated). |
| virtual bool OnRequest(const cvd::SharedFD& data) = 0; |
| |
| // OnResponse is called whenever additional data relevant to this command |
| // (other than ResponseHeader) should be received. |
| // Returns false, if communication with remote host failed (and should be |
| // terminated). |
| virtual bool OnResponse(bool is_success, const cvd::SharedFD& data) = 0; |
| |
| private: |
| USBCommand(const USBCommand& other) = delete; |
| USBCommand& operator=(const USBCommand& other) = delete; |
| }; |
| |
| } // namespace vadb |