C++程序  |  99行  |  3.43 KB

//
// Copyright (C) 2011 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#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 <gtest/gtest_prod.h>  // for FRIEND_TEST

#include <brillo/message_loops/message_loop.h>

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

namespace chromeos_update_engine {

extern const char kLibCrosServiceName[];
extern const char kLibCrosProxyResolveName[];
extern const char kLibCrosProxyResolveSignalInterface[];

class ChromeBrowserProxyResolver : public ProxyResolver {
 public:
  explicit ChromeBrowserProxyResolver(LibCrosProxy* libcros_proxy);
  ~ChromeBrowserProxyResolver() override;

  // Initialize the ProxyResolver using the provided DBus proxies.
  bool Init();

  bool GetProxiesForUrl(const std::string& url,
                        ProxiesResolvedFn callback,
                        void* data) override;

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

  // Called when the signal in UpdateEngineLibcrosProxyResolvedInterface is
  // connected.
  void OnSignalConnected(const std::string& interface_name,
                         const std::string& signal_name,
                         bool successful);

  // Handle a reply from Chrome:
  void OnProxyResolvedSignal(const std::string& source_url,
                             const std::string& proxy_info,
                             const std::string& error_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 CancelTask on the timer id.
  // 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();

  // DBus proxies to request a HTTP proxy resolution. The request is done in the
  // service_interface_proxy() interface and the response is received as a
  // signal in the ue_proxy_resolved_interface().
  LibCrosProxy* libcros_proxy_;

  int timeout_;
  TimeoutsMap timers_;
  CallbacksMap callbacks_;
  DISALLOW_COPY_AND_ASSIGN(ChromeBrowserProxyResolver);
};

}  // namespace chromeos_update_engine

#endif  // UPDATE_ENGINE_CHROME_BROWSER_PROXY_RESOLVER_H_