Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(221)

Side by Side Diff: chrome/browser/sync/notifier/communicator/connection_settings.cc

Issue 1956001: Moved XMPP notifier library from chrome/browser/sync to chrome/common.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <algorithm>
6 #include <deque>
7 #include <string>
8 #include <vector>
9
10 #include "chrome/browser/sync/notifier/communicator/connection_settings.h"
11 #include "talk/base/helpers.h"
12 #include "talk/xmpp/xmppclientsettings.h"
13
14 namespace notifier {
15
16 class RandomGenerator {
17 public:
18 int operator()(int ceiling) {
19 return static_cast<int>(cricket::CreateRandomId() % ceiling);
20 }
21 };
22
23 void ConnectionSettings::FillXmppClientSettings(
24 buzz::XmppClientSettings* xcs) const {
25 assert(xcs);
26 xcs->set_protocol(protocol_);
27 xcs->set_server(server_);
28 xcs->set_proxy(proxy_.type);
29 if (proxy_.type != talk_base::PROXY_NONE) {
30 xcs->set_proxy_host(proxy_.address.IPAsString());
31 xcs->set_proxy_port(proxy_.address.port());
32 }
33 if ((proxy_.type != talk_base::PROXY_NONE) && !proxy_.username.empty()) {
34 xcs->set_use_proxy_auth(true);
35 xcs->set_proxy_user(proxy_.username);
36 xcs->set_proxy_pass(proxy_.password);
37 } else {
38 xcs->set_use_proxy_auth(false);
39 }
40 }
41
42 void ConnectionSettingsList::AddPermutations(const std::string& hostname,
43 const std::vector<uint32>& iplist,
44 int16 port,
45 bool special_port_magic,
46 bool proxy_only) {
47 // randomize the list. This ensures the iplist isn't always
48 // evaluated in the order returned by DNS
49 std::vector<uint32> iplist_random = iplist;
50 RandomGenerator rg;
51 std::random_shuffle(iplist_random.begin(), iplist_random.end(), rg);
52
53 // Put generated addresses in a new deque, then append on the list_, since
54 // there are order dependencies and AddPermutations() may be called more
55 // than once.
56 std::deque<ConnectionSettings> list_temp;
57
58 // Permute addresses for this server. In some cases we haven't resolved the
59 // to ip addresses.
60 talk_base::SocketAddress server(hostname, port, false);
61 if (iplist_random.empty()) {
62 // We couldn't pre-resolve the hostname, so let's hope it will resolve
63 // further down the pipeline (by a proxy, for example).
64 PermuteForAddress(server, special_port_magic, proxy_only, &list_temp);
65 } else {
66 // Generate a set of possibilities for each server address.
67 // Don't do permute duplicates.
68 for (size_t index = 0; index < iplist_random.size(); ++index) {
69 if (std::find(iplist_seen_.begin(), iplist_seen_.end(),
70 iplist_random[index]) != iplist_seen_.end()) {
71 continue;
72 }
73 iplist_seen_.push_back(iplist_random[index]);
74 server.SetResolvedIP(iplist_random[index]);
75 PermuteForAddress(server, special_port_magic, proxy_only, &list_temp);
76 }
77 }
78
79 // Add this list to the instance list
80 while (list_temp.size() != 0) {
81 list_.push_back(list_temp[0]);
82 list_temp.pop_front();
83 }
84 }
85
86
87 void ConnectionSettingsList::PermuteForAddress(
88 const talk_base::SocketAddress& server,
89 bool special_port_magic,
90 bool proxy_only,
91 std::deque<ConnectionSettings>* list_temp) {
92 assert(list_temp);
93 *(template_.mutable_server()) = server;
94
95 // Use all of the original settings
96 list_temp->push_back(template_);
97
98 // Try alternate port
99 if (special_port_magic) {
100 ConnectionSettings settings(template_);
101 settings.set_protocol(cricket::PROTO_SSLTCP);
102 settings.mutable_server()->SetPort(443);
103 // HTTPS proxies usually require port 443, so try it first
104 if ((template_.proxy().type == talk_base::PROXY_HTTPS) ||
105 (template_.proxy().type == talk_base::PROXY_UNKNOWN)) {
106 list_temp->push_front(settings);
107 } else {
108 list_temp->push_back(settings);
109 }
110 }
111
112 if (!proxy_only) {
113 // Try without the proxy
114 if (template_.proxy().type != talk_base::PROXY_NONE) {
115 ConnectionSettings settings(template_);
116 settings.mutable_proxy()->type = talk_base::PROXY_NONE;
117 list_temp->push_back(settings);
118
119 if (special_port_magic) {
120 settings.set_protocol(cricket::PROTO_SSLTCP);
121 settings.mutable_server()->SetPort(443);
122 list_temp->push_back(settings);
123 }
124 }
125 }
126 }
127 } // namespace notifier
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698