// Copyright 2018 The Chromium OS 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 SHILL_RPC_TASK_H_
#define SHILL_RPC_TASK_H_

#include <map>
#include <memory>
#include <string>

#include <base/macros.h>

#include "shill/data_types.h"

namespace shill {

// Declared in the header to avoid linking unused code into shims.
static const char kRpcTaskServiceVariable[] = "SHILL_TASK_SERVICE";
static const char kRpcTaskPathVariable[] = "SHILL_TASK_PATH";

class ControlInterface;
class RpcTaskAdaptorInterface;

// TODO(petkov): Switch from delegate interface to registered callbacks
// (crbug.com/212273).
class RpcTaskDelegate {
 public:
  virtual ~RpcTaskDelegate() = default;

  virtual void GetLogin(std::string* user, std::string* password) = 0;
  virtual void Notify(const std::string& reason,
                      const std::map<std::string, std::string>& dict) = 0;
};

// RPC tasks are currently used by VPN drivers for communication with external
// VPN processes. The RPC task should be owned by a single owner -- its
// RpcTaskDelegate -- so no need to be reference counted.
class RpcTask {
 public:
  // A constructor for the RpcTask object.
  RpcTask(ControlInterface* control_interface, RpcTaskDelegate* delegate);
  virtual ~RpcTask();

  virtual void GetLogin(std::string* user, std::string* password) const;
  virtual void Notify(const std::string& reason,
                      const std::map<std::string, std::string>& dict);

  // Returns a string that is guaranteed to uniquely identify this RpcTask
  // instance.
  const std::string& UniqueName() const { return unique_name_; }

  // Generates environment variable strings for a child process to
  // communicate back to us over RPC.
  virtual std::map<std::string, std::string> GetEnvironment() const;
  RpcIdentifier GetRpcIdentifier() const;
  RpcIdentifier GetRpcConnectionIdentifier() const;

 private:
  RpcTaskDelegate* delegate_;
  static unsigned int serial_number_;
  std::string unique_name_;  // MUST be unique amongst RPC task instances
  std::unique_ptr<RpcTaskAdaptorInterface> adaptor_;

  DISALLOW_COPY_AND_ASSIGN(RpcTask);
};

}  // namespace shill

#endif  // SHILL_RPC_TASK_H_
