blob: 8b47672c47f32d9ca778841d706ba591fbe6ef26 [file] [log] [blame]
// 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_