/*
 * 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
