// Copyright (c) 2011 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 UPDATE_ENGINE_CHROME_BROWSER_PROXY_RESOLVER_H_
#define UPDATE_ENGINE_CHROME_BROWSER_PROXY_RESOLVER_H_

#include <deque>
#include <map>
#include <string>
#include <utility>

#include <dbus/dbus-glib.h>
#include <dbus/dbus-glib-lowlevel.h>
#include <gtest/gtest_prod.h>  // for FRIEND_TEST

#include "update_engine/dbus_wrapper_interface.h"
#include "update_engine/proxy_resolver.h"

namespace chromeos_update_engine {

extern const char kLibCrosServiceName[];
extern const char kLibCrosServicePath[];
extern const char kLibCrosServiceInterface[];
extern const char kLibCrosServiceResolveNetworkProxyMethodName[];
extern const char kLibCrosProxyResolveName[];
extern const char kLibCrosProxyResolveSignalInterface[];
extern const char kLibCrosProxyResolveSignalFilter[];

class ChromeBrowserProxyResolver : public ProxyResolver {
 public:
  explicit ChromeBrowserProxyResolver(DBusWrapperInterface* dbus);
  ~ChromeBrowserProxyResolver() override;
  bool Init();

  bool GetProxiesForUrl(const std::string& url,
                        ProxiesResolvedFn callback,
                        void* data) override;
  void set_timeout(int seconds) { timeout_ = seconds; }

  // Public for test
  static DBusHandlerResult StaticFilterMessage(
      DBusConnection* connection,
      DBusMessage* message,
      void* data) {
    return reinterpret_cast<ChromeBrowserProxyResolver*>(data)->FilterMessage(
        connection, message);
  }

 private:
  FRIEND_TEST(ChromeBrowserProxyResolverTest, ParseTest);
  FRIEND_TEST(ChromeBrowserProxyResolverTest, SuccessTest);
  typedef std::multimap<std::string, std::pair<ProxiesResolvedFn, void*>>
      CallbacksMap;
  typedef std::multimap<std::string, GSource*> TimeoutsMap;

  // Handle a reply from Chrome:
  void HandleReply(const std::string& source_url,
                   const std::string& proxy_list);
  DBusHandlerResult FilterMessage(
      DBusConnection* connection,
      DBusMessage* message);
  // Handle no reply:
  void HandleTimeout(std::string source_url);

  // Parses a string-encoded list of proxies and returns a deque
  // of individual proxies. The last one will always be kNoProxy.
  static std::deque<std::string> ParseProxyString(const std::string& input);

  // Deletes internal state for the first instance of url in the state.
  // If delete_timer is set, calls g_source_destroy on the timer source.
  // Returns the callback in an out parameter. Returns true on success.
  bool DeleteUrlState(const std::string& url,
                      bool delete_timer,
                      std::pair<ProxiesResolvedFn, void*>* callback);

  // Shutdown the dbus proxy object.
  void Shutdown();

  DBusWrapperInterface* dbus_;
  DBusGProxy* proxy_;
  DBusGProxy* peer_proxy_;
  int timeout_;
  TimeoutsMap timers_;
  CallbacksMap callbacks_;
  DISALLOW_COPY_AND_ASSIGN(ChromeBrowserProxyResolver);
};

}  // namespace chromeos_update_engine

#endif  // UPDATE_ENGINE_CHROME_BROWSER_PROXY_RESOLVER_H_
