// Copyright 2019 The TAL Authors. All rights reserved.
#ifndef LIB_OWCR_EXTENSION_PUBLIC_IEXTENSION_NETWORK_DELEGATE_
#define LIB_OWCR_EXTENSION_PUBLIC_IEXTENSION_NETWORK_DELEGATE_

namespace owcr {
namespace extension {

class IExtensionNetworkDelegate {
 public:
  IExtensionNetworkDelegate() {}
  virtual ~IExtensionNetworkDelegate() {}

  class RequestClient {
   public:
    RequestClient() {}
    virtual ~RequestClient() {}

    // Notifies the client that the request has completed. Use the
    // |code| determine if the request was successful or not.
    /*|code| is one of the follow value{
      ERR_NONE = 0,
      ERR_FAILED = -2,
      ERR_ABORTED = -3,
      ERR_INVALID_ARGUMENT = -4,
      ERR_INVALID_HANDLE = -5,
      ERR_FILE_NOT_FOUND = -6,
      ERR_TIMED_OUT = -7,
      ERR_FILE_TOO_BIG = -8,
      ERR_UNEXPECTED = -9,
      ERR_ACCESS_DENIED = -10,
      ERR_NOT_IMPLEMENTED = -11,
      ERR_CONNECTION_CLOSED = -100,
      ERR_CONNECTION_RESET = -101,
      ERR_CONNECTION_REFUSED = -102,
      ERR_CONNECTION_ABORTED = -103,
      ERR_CONNECTION_FAILED = -104,
      ERR_NAME_NOT_RESOLVED = -105,
      ERR_INTERNET_DISCONNECTED = -106,
      ERR_SSL_PROTOCOL_ERROR = -107,
      ERR_ADDRESS_INVALID = -108,
      ERR_ADDRESS_UNREACHABLE = -109,
      ERR_SSL_CLIENT_AUTH_CERT_NEEDED = -110,
      ERR_TUNNEL_CONNECTION_FAILED = -111,
      ERR_NO_SSL_VERSIONS_ENABLED = -112,
      ERR_SSL_VERSION_OR_CIPHER_MISMATCH = -113,
      ERR_SSL_RENEGOTIATION_REQUESTED = -114,
      ERR_CERT_COMMON_NAME_INVALID = -200,
      ERR_CERT_BEGIN = ERR_CERT_COMMON_NAME_INVALID,
      ERR_CERT_DATE_INVALID = -201,
      ERR_CERT_AUTHORITY_INVALID = -202,
      ERR_CERT_CONTAINS_ERRORS = -203,
      ERR_CERT_NO_REVOCATION_MECHANISM = -204,
      ERR_CERT_UNABLE_TO_CHECK_REVOCATION = -205,
      ERR_CERT_REVOKED = -206,
      ERR_CERT_INVALID = -207,
      ERR_CERT_WEAK_SIGNATURE_ALGORITHM = -208,
      // -209 is available: was ERR_CERT_NOT_IN_DNS.
      ERR_CERT_NON_UNIQUE_NAME = -210,
      ERR_CERT_WEAK_KEY = -211,
      ERR_CERT_NAME_CONSTRAINT_VIOLATION = -212,
      ERR_CERT_VALIDITY_TOO_LONG = -213,
      ERR_CERT_END = ERR_CERT_VALIDITY_TOO_LONG,
      ERR_INVALID_URL = -300,
      ERR_DISALLOWED_URL_SCHEME = -301,
      ERR_UNKNOWN_URL_SCHEME = -302,
      ERR_TOO_MANY_REDIRECTS = -310,
      ERR_UNSAFE_REDIRECT = -311,
      ERR_UNSAFE_PORT = -312,
      ERR_INVALID_RESPONSE = -320,
      ERR_INVALID_CHUNKED_ENCODING = -321,
      ERR_METHOD_NOT_SUPPORTED = -322,
      ERR_UNEXPECTED_PROXY_AUTH = -323,
      ERR_EMPTY_RESPONSE = -324,
      ERR_RESPONSE_HEADERS_TOO_BIG = -325,
      ERR_CACHE_MISS = -400,
      ERR_INSECURE_RESPONSE = -501,
    }*/

    // \brief 此次请求完成
    // \param code 请求状态码，参见上面注释
    // \param json_header 请求响应头
    // \param json_header_length json_header长度
    virtual void OnRequestComplete(int code,
                                   const char* json_header,
                                   int json_header_length) = 0;

    // Called when some part of the response is read.|data| contains the current
    // bytes received since the last call. |data_length| is |data|'s length
    virtual void OnDataReceived(const void* data, int data_length) = 0;

    // \brief 下载进度
    // \param current 当前接收的数据
    // \param total 总共需要接收的数据，未知为-1
    virtual void OnDownloadProgress(long long current, long long total) = 0;
  };

  // \brief 返回唯一id标记一个请求，若取消或销毁请求传递此id给API
  // \param request_url 请求url
  // \param request_url_length request_url长度
  // \param json_header 请求方法和请求头，以json形式传递，键值["method"]="GET";
  // \param json_header_len json_header长度
  // \param post_data POST请求参数
  // \param post_data_length post_data_length长度
  // \param RequestClient 回调指针
  // return 返回请求唯一id
  virtual int StartHttpRequest(const char* request_url,
                               int request_url_length,
                               const char* json_header,
                               int json_header_len,
                               const void* post_data,
                               int post_data_length,
                               RequestClient* client) = 0;

  // \brief 用于取消对应的请求
  // \param net_request_id StartHttpRequest返回的请求唯一id
  virtual void CancelHttpRequest(int net_request_id) = 0;

  // \brief 销毁此次id网络请求，不再接收数据回调,若使用网络请求，
  // 必须在OnRequestComplete或卸载扩展时调用
  // \param net_request_id StartHttpRequest返回的请求唯一id
  virtual void DestroyRequestClient(int net_request_id) = 0;
};
}  // namespace extension
}  // namespace owcr
#endif  // LIB_OWCR_EXTENSION_PUBLIC_IEXTENSION_NETWORK_DELEGATE_
