OLD | NEW |
| (Empty) |
1 // Copyright 2014 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 "chromeos/pairing/fake_host_pairing_controller.h" | |
6 | |
7 #include <map> | |
8 #include <vector> | |
9 | |
10 #include "base/bind.h" | |
11 #include "base/logging.h" | |
12 #include "base/message_loop/message_loop.h" | |
13 #include "base/rand_util.h" | |
14 #include "base/strings/string_number_conversions.h" | |
15 #include "base/strings/string_split.h" | |
16 | |
17 namespace { | |
18 | |
19 const int kUpdateStepsNumber = 10; | |
20 const int kDefaultAsyncDurationMs = 3000; | |
21 const size_t kCodeLength = 6; | |
22 | |
23 } // namespace | |
24 | |
25 namespace chromeos { | |
26 | |
27 FakeHostPairingController::FakeHostPairingController(const std::string& config) | |
28 : current_stage_(STAGE_NONE), | |
29 enrollment_should_fail_(false), | |
30 start_after_update_(false) { | |
31 ApplyConfig(config); | |
32 AddObserver(this); | |
33 } | |
34 | |
35 FakeHostPairingController::~FakeHostPairingController() { | |
36 RemoveObserver(this); | |
37 } | |
38 | |
39 void FakeHostPairingController::ApplyConfig(const std::string& config) { | |
40 typedef std::vector<std::string> Tokens; | |
41 | |
42 base::StringPairs kv_pairs; | |
43 CHECK(base::SplitStringIntoKeyValuePairs(config, ':', ',', &kv_pairs)) | |
44 << "Wrong config format."; | |
45 std::map<std::string, std::string> dict(kv_pairs.begin(), kv_pairs.end()); | |
46 | |
47 if (dict.count("async_duration")) { | |
48 int ms = 0; | |
49 CHECK(base::StringToInt(dict["async_duration"], &ms)) | |
50 << "Wrong 'async_duration' format."; | |
51 async_duration_ = base::TimeDelta::FromMilliseconds(ms); | |
52 } else { | |
53 async_duration_ = | |
54 base::TimeDelta::FromMilliseconds(kDefaultAsyncDurationMs); | |
55 } | |
56 | |
57 start_after_update_ = dict["start_after_update"] == "1"; | |
58 | |
59 enrollment_should_fail_ = dict["fail_enrollment"] == "1"; | |
60 | |
61 if (dict.count("code")) { | |
62 confirmation_code_ = dict["code"]; | |
63 } else { | |
64 confirmation_code_.clear(); | |
65 for (size_t i = 0; i < kCodeLength; ++i) | |
66 confirmation_code_.push_back(base::RandInt('0', '9')); | |
67 } | |
68 CHECK(confirmation_code_.length() == kCodeLength && | |
69 confirmation_code_.find_first_not_of("0123456789") == std::string::npos) | |
70 << "Wrong 'code' format."; | |
71 | |
72 device_name_ = | |
73 dict.count("device_name") ? dict["device_name"] : "Chromebox-01"; | |
74 | |
75 enrollment_domain_ = dict.count("domain") ? dict["domain"] : "example.com"; | |
76 } | |
77 | |
78 void FakeHostPairingController::ChangeStage(Stage new_stage) { | |
79 if (current_stage_ == new_stage) | |
80 return; | |
81 current_stage_ = new_stage; | |
82 FOR_EACH_OBSERVER(Observer, observers_, PairingStageChanged(new_stage)); | |
83 } | |
84 | |
85 void FakeHostPairingController::ChangeStageLater(Stage new_stage) { | |
86 base::MessageLoop::current()->PostDelayedTask( | |
87 FROM_HERE, | |
88 base::Bind(&FakeHostPairingController::ChangeStage, | |
89 base::Unretained(this), | |
90 new_stage), | |
91 async_duration_); | |
92 } | |
93 | |
94 void FakeHostPairingController::SetUpdateProgress(int step) { | |
95 UpdateProgress progress; | |
96 progress.progress = double(step) / kUpdateStepsNumber; | |
97 FOR_EACH_OBSERVER(Observer, observers_, UpdateAdvanced(progress)); | |
98 base::Closure task; | |
99 if (step >= kUpdateStepsNumber) { | |
100 task = base::Bind(&FakeHostPairingController::ChangeStage, | |
101 base::Unretained(this), | |
102 STAGE_WAITING_FOR_CONTROLLER_AFTER_UPDATE); | |
103 } else { | |
104 task = base::Bind(&FakeHostPairingController::SetUpdateProgress, | |
105 base::Unretained(this), | |
106 step + 1); | |
107 } | |
108 base::MessageLoop::current()->PostDelayedTask( | |
109 FROM_HERE, task, async_duration_ / kUpdateStepsNumber); | |
110 } | |
111 | |
112 void FakeHostPairingController::AddObserver(Observer* observer) { | |
113 observers_.AddObserver(observer); | |
114 } | |
115 | |
116 void FakeHostPairingController::RemoveObserver(Observer* observer) { | |
117 observers_.RemoveObserver(observer); | |
118 } | |
119 | |
120 HostPairingController::Stage FakeHostPairingController::GetCurrentStage() { | |
121 return current_stage_; | |
122 } | |
123 | |
124 void FakeHostPairingController::StartPairing() { | |
125 CHECK(current_stage_ == STAGE_NONE); | |
126 if (start_after_update_) { | |
127 ChangeStage(STAGE_WAITING_FOR_CONTROLLER_AFTER_UPDATE); | |
128 } else { | |
129 ChangeStage(STAGE_WAITING_FOR_CONTROLLER); | |
130 } | |
131 } | |
132 | |
133 std::string FakeHostPairingController::GetDeviceName() { | |
134 return device_name_; | |
135 } | |
136 | |
137 std::string FakeHostPairingController::GetConfirmationCode() { | |
138 CHECK(current_stage_ == STAGE_WAITING_FOR_CODE_CONFIRMATION); | |
139 return confirmation_code_; | |
140 } | |
141 | |
142 std::string FakeHostPairingController::GetEnrollmentDomain() { | |
143 return enrollment_domain_; | |
144 } | |
145 | |
146 void FakeHostPairingController::PairingStageChanged(Stage new_stage) { | |
147 switch (new_stage) { | |
148 case STAGE_WAITING_FOR_CONTROLLER: { | |
149 ChangeStageLater(STAGE_WAITING_FOR_CODE_CONFIRMATION); | |
150 break; | |
151 } | |
152 case STAGE_WAITING_FOR_CODE_CONFIRMATION: { | |
153 ChangeStageLater(STAGE_UPDATING); | |
154 break; | |
155 } | |
156 case STAGE_UPDATING: { | |
157 SetUpdateProgress(0); | |
158 break; | |
159 } | |
160 case STAGE_WAITING_FOR_CONTROLLER_AFTER_UPDATE: { | |
161 ChangeStageLater(STAGE_WAITING_FOR_CREDENTIALS); | |
162 break; | |
163 } | |
164 case STAGE_WAITING_FOR_CREDENTIALS: { | |
165 ChangeStageLater(STAGE_ENROLLING); | |
166 break; | |
167 } | |
168 case STAGE_ENROLLING: { | |
169 if (enrollment_should_fail_) { | |
170 enrollment_should_fail_ = false; | |
171 ChangeStageLater(STAGE_ENROLLMENT_ERROR); | |
172 } else { | |
173 ChangeStageLater(STAGE_PAIRING_DONE); | |
174 } | |
175 break; | |
176 } | |
177 case STAGE_ENROLLMENT_ERROR: { | |
178 ChangeStageLater(STAGE_WAITING_FOR_CONTROLLER_AFTER_UPDATE); | |
179 break; | |
180 } | |
181 case STAGE_PAIRING_DONE: { | |
182 ChangeStageLater(STAGE_FINISHED); | |
183 break; | |
184 } | |
185 default: { break; } | |
186 } | |
187 } | |
188 | |
189 void FakeHostPairingController::UpdateAdvanced(const UpdateProgress& progress) { | |
190 } | |
191 | |
192 } // namespace chromeos | |
OLD | NEW |