1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/proxy/proxy_server.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <CoreFoundation/CoreFoundation.h>
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string>
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h"
123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/mac/mac_util.h"
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/sys_string_conversions.h"
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net {
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottProxyServer ProxyServer::FromDictionary(Scheme scheme,
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        CFDictionaryRef dict,
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        CFStringRef host_key,
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        CFStringRef port_key) {
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (scheme == SCHEME_INVALID || scheme == SCHEME_DIRECT) {
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // No hostname port to extract; we are done.
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return ProxyServer(scheme, HostPortPair());
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CFStringRef host_ref =
283f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      (CFStringRef)base::mac::GetValueFromDictionary(dict, host_key,
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                    CFStringGetTypeID());
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!host_ref) {
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    LOG(WARNING) << "Could not find expected key "
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                 << base::SysCFStringRefToUTF8(host_key)
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                 << " in the proxy dictionary";
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return ProxyServer();  // Invalid.
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string host = base::SysCFStringRefToUTF8(host_ref);
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CFNumberRef port_ref =
393f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      (CFNumberRef)base::mac::GetValueFromDictionary(dict, port_key,
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                    CFNumberGetTypeID());
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int port;
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (port_ref) {
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    CFNumberGetValue(port_ref, kCFNumberIntType, &port);
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } else {
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    port = GetDefaultPortForScheme(scheme);
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return ProxyServer(scheme, HostPortPair(host, port));
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace net
52