// Copyright 2014 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 LIBCHROMEOS_BRILLO_HTTP_CURL_API_H_
#define LIBCHROMEOS_BRILLO_HTTP_CURL_API_H_

#include <curl/curl.h>

#include <string>

#include <base/macros.h>
#include <brillo/brillo_export.h>

namespace brillo {
namespace http {

// Abstract wrapper around libcurl C API that allows us to mock it out in tests.
class CurlInterface {
 public:
  CurlInterface() = default;
  virtual ~CurlInterface() = default;

  // Wrapper around curl_easy_init().
  virtual CURL* EasyInit() = 0;

  // Wrapper around curl_easy_cleanup().
  virtual void EasyCleanup(CURL* curl) = 0;

  // Wrappers around curl_easy_setopt().
  virtual CURLcode EasySetOptInt(CURL* curl, CURLoption option, int value) = 0;
  virtual CURLcode EasySetOptStr(CURL* curl,
                                 CURLoption option,
                                 const std::string& value) = 0;
  virtual CURLcode EasySetOptPtr(CURL* curl,
                                 CURLoption option,
                                 void* value) = 0;
  virtual CURLcode EasySetOptCallback(CURL* curl,
                                      CURLoption option,
                                      intptr_t address) = 0;
  virtual CURLcode EasySetOptOffT(CURL* curl,
                                  CURLoption option,
                                  curl_off_t value) = 0;

  // A type-safe wrapper around function callback options.
  template<typename R, typename... Args>
  inline CURLcode EasySetOptCallback(CURL* curl,
                                     CURLoption option,
                                     R(*callback)(Args...)) {
    return EasySetOptCallback(
        curl, option, reinterpret_cast<intptr_t>(callback));
  }

  // Wrapper around curl_easy_perform().
  virtual CURLcode EasyPerform(CURL* curl) = 0;

  // Wrappers around curl_easy_getinfo().
  virtual CURLcode EasyGetInfoInt(CURL* curl,
                                  CURLINFO info,
                                  int* value) const = 0;
  virtual CURLcode EasyGetInfoDbl(CURL* curl,
                                  CURLINFO info,
                                  double* value) const = 0;
  virtual CURLcode EasyGetInfoStr(CURL* curl,
                                  CURLINFO info,
                                  std::string* value) const = 0;
  virtual CURLcode EasyGetInfoPtr(CURL* curl,
                                  CURLINFO info,
                                  void** value) const = 0;

  // Wrapper around curl_easy_strerror().
  virtual std::string EasyStrError(CURLcode code) const = 0;

  // Wrapper around curl_multi_init().
  virtual CURLM* MultiInit() = 0;

  // Wrapper around curl_multi_cleanup().
  virtual CURLMcode MultiCleanup(CURLM* multi_handle) = 0;

  // Wrapper around curl_multi_info_read().
  virtual CURLMsg* MultiInfoRead(CURLM* multi_handle, int* msgs_in_queue) = 0;

  // Wrapper around curl_multi_add_handle().
  virtual CURLMcode MultiAddHandle(CURLM* multi_handle, CURL* curl_handle) = 0;

  // Wrapper around curl_multi_remove_handle().
  virtual CURLMcode MultiRemoveHandle(CURLM* multi_handle,
                                      CURL* curl_handle) = 0;

  // Wrapper around curl_multi_setopt(CURLMOPT_SOCKETFUNCTION/SOCKETDATA).
  virtual CURLMcode MultiSetSocketCallback(
      CURLM* multi_handle,
      curl_socket_callback socket_callback,
      void* userp) = 0;

  // Wrapper around curl_multi_setopt(CURLMOPT_TIMERFUNCTION/TIMERDATA).
  virtual CURLMcode MultiSetTimerCallback(
      CURLM* multi_handle,
      curl_multi_timer_callback timer_callback,
      void* userp) = 0;

  // Wrapper around curl_multi_assign().
  virtual CURLMcode MultiAssign(CURLM* multi_handle,
                                curl_socket_t sockfd,
                                void* sockp) = 0;

  // Wrapper around curl_multi_socket_action().
  virtual CURLMcode MultiSocketAction(CURLM* multi_handle,
                                      curl_socket_t s,
                                      int ev_bitmask,
                                      int* running_handles) = 0;

  // Wrapper around curl_multi_strerror().
  virtual std::string MultiStrError(CURLMcode code) const = 0;

 private:
  DISALLOW_COPY_AND_ASSIGN(CurlInterface);
};

class BRILLO_EXPORT CurlApi : public CurlInterface {
 public:
  CurlApi();
  ~CurlApi() override;

  // Wrapper around curl_easy_init().
  CURL* EasyInit() override;

  // Wrapper around curl_easy_cleanup().
  void EasyCleanup(CURL* curl) override;

  // Wrappers around curl_easy_setopt().
  CURLcode EasySetOptInt(CURL* curl, CURLoption option, int value) override;
  CURLcode EasySetOptStr(CURL* curl,
                         CURLoption option,
                         const std::string& value) override;
  CURLcode EasySetOptPtr(CURL* curl, CURLoption option, void* value) override;
  CURLcode EasySetOptCallback(CURL* curl,
                              CURLoption option,
                              intptr_t address) override;
  CURLcode EasySetOptOffT(CURL* curl,
                          CURLoption option,
                          curl_off_t value) override;

  // Wrapper around curl_easy_perform().
  CURLcode EasyPerform(CURL* curl) override;

  // Wrappers around curl_easy_getinfo().
  CURLcode EasyGetInfoInt(CURL* curl, CURLINFO info, int* value) const override;
  CURLcode EasyGetInfoDbl(CURL* curl,
                          CURLINFO info,
                          double* value) const override;
  CURLcode EasyGetInfoStr(CURL* curl,
                          CURLINFO info,
                          std::string* value) const override;
  CURLcode EasyGetInfoPtr(CURL* curl,
                          CURLINFO info,
                          void** value) const override;

  // Wrapper around curl_easy_strerror().
  std::string EasyStrError(CURLcode code) const override;

  // Wrapper around curl_multi_init().
  CURLM* MultiInit() override;

  // Wrapper around curl_multi_cleanup().
  CURLMcode MultiCleanup(CURLM* multi_handle) override;

  // Wrapper around curl_multi_info_read().
  CURLMsg* MultiInfoRead(CURLM* multi_handle, int* msgs_in_queue) override;

  // Wrapper around curl_multi_add_handle().
  CURLMcode MultiAddHandle(CURLM* multi_handle, CURL* curl_handle) override;

  // Wrapper around curl_multi_remove_handle().
  CURLMcode MultiRemoveHandle(CURLM* multi_handle, CURL* curl_handle) override;

  // Wrapper around curl_multi_setopt(CURLMOPT_SOCKETFUNCTION/SOCKETDATA).
  CURLMcode MultiSetSocketCallback(
      CURLM* multi_handle,
      curl_socket_callback socket_callback,
      void* userp) override;

  // Wrapper around curl_multi_setopt(CURLMOPT_TIMERFUNCTION/TIMERDATA).
  CURLMcode MultiSetTimerCallback(
      CURLM* multi_handle,
      curl_multi_timer_callback timer_callback,
      void* userp) override;

  // Wrapper around curl_multi_assign().
  CURLMcode MultiAssign(CURLM* multi_handle,
                        curl_socket_t sockfd,
                        void* sockp) override;

  // Wrapper around curl_multi_socket_action().
  CURLMcode MultiSocketAction(CURLM* multi_handle,
                              curl_socket_t s,
                              int ev_bitmask,
                              int* running_handles) override;

  // Wrapper around curl_multi_strerror().
  std::string MultiStrError(CURLMcode code) const override;

 private:
  DISALLOW_COPY_AND_ASSIGN(CurlApi);
};

}  // namespace http
}  // namespace brillo

#endif  // LIBCHROMEOS_BRILLO_HTTP_CURL_API_H_
