/*
 *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_BASE_AUTODETECTPROXY_H_
#define WEBRTC_BASE_AUTODETECTPROXY_H_

#include <string>

#include "webrtc/base/constructormagic.h"
#include "webrtc/base/cryptstring.h"
#include "webrtc/base/proxydetect.h"
#include "webrtc/base/proxyinfo.h"
#include "webrtc/base/signalthread.h"

namespace rtc {

///////////////////////////////////////////////////////////////////////////////
// AutoDetectProxy
///////////////////////////////////////////////////////////////////////////////

class AsyncResolverInterface;
class AsyncSocket;

class AutoDetectProxy : public SignalThread {
 public:
  explicit AutoDetectProxy(const std::string& user_agent);

  const ProxyInfo& proxy() const { return proxy_; }

  void set_server_url(const std::string& url) {
    server_url_ = url;
  }
  void set_proxy(const SocketAddress& proxy) {
    proxy_.type = PROXY_UNKNOWN;
    proxy_.address = proxy;
  }
  void set_auth_info(bool use_auth, const std::string& username,
                     const CryptString& password) {
    if (use_auth) {
      proxy_.username = username;
      proxy_.password = password;
    }
  }
  // Default implementation of GetProxySettingsForUrl. Override for special
  // implementation.
  virtual bool GetProxyForUrl(const char* agent,
                              const char* url,
                              rtc::ProxyInfo* proxy);
  enum { MSG_TIMEOUT = SignalThread::ST_MSG_FIRST_AVAILABLE,
         MSG_UNRESOLVABLE,
         ADP_MSG_FIRST_AVAILABLE};

 protected:
  ~AutoDetectProxy() override;

  // SignalThread Interface
  void DoWork() override;
  void OnMessage(Message* msg) override;

  void Next();
  void Complete(ProxyType type);

  void OnConnectEvent(AsyncSocket * socket);
  void OnReadEvent(AsyncSocket * socket);
  void OnCloseEvent(AsyncSocket * socket, int error);
  void OnTimeout();
  void OnResolveResult(AsyncResolverInterface* resolver);
  bool DoConnect();

 private:
  std::string agent_;
  std::string server_url_;
  ProxyInfo proxy_;
  AsyncResolverInterface* resolver_;
  AsyncSocket* socket_;
  int next_;

  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(AutoDetectProxy);
};

}  // namespace rtc

#endif  // WEBRTC_BASE_AUTODETECTPROXY_H_
