OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/protocol/pairing_registry.h" | 5 #include "remoting/protocol/pairing_registry.h" |
6 | 6 |
7 #include "base/base64.h" | 7 #include "base/base64.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/guid.h" | 9 #include "base/guid.h" |
10 #include "base/json/json_string_value_serializer.h" | 10 #include "base/json/json_string_value_serializer.h" |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
76 const std::string& client_name) { | 76 const std::string& client_name) { |
77 DCHECK(CalledOnValidThread()); | 77 DCHECK(CalledOnValidThread()); |
78 Pairing result = Pairing::Create(client_name); | 78 Pairing result = Pairing::Create(client_name); |
79 AddPairing(result); | 79 AddPairing(result); |
80 return result; | 80 return result; |
81 } | 81 } |
82 | 82 |
83 void PairingRegistry::GetPairing(const std::string& client_id, | 83 void PairingRegistry::GetPairing(const std::string& client_id, |
84 const GetPairingCallback& callback) { | 84 const GetPairingCallback& callback) { |
85 DCHECK(CalledOnValidThread()); | 85 DCHECK(CalledOnValidThread()); |
86 delegate_->Load( | 86 GetPairingCallback wrapped_callback = base::Bind( |
87 base::Bind(&PairingRegistry::DoGetPairing, this, client_id, callback)); | 87 &PairingRegistry::InvokeGetPairingCallbackAndScheduleNext, |
88 this, callback); | |
89 LoadCallback load_callback = base::Bind( | |
90 &PairingRegistry::DoGetPairing, this, client_id, wrapped_callback); | |
91 // |Unretained| and |get| are both safe here because the delegate is owned | |
92 // by the pairing registry and so is guaranteed to exist when the request | |
93 // is serviced. | |
94 base::Closure request = base::Bind( | |
95 &PairingRegistry::Delegate::Load, | |
96 base::Unretained(delegate_.get()), load_callback); | |
97 ServiceOrQueueRequest(request); | |
88 } | 98 } |
89 | 99 |
90 void PairingRegistry::GetAllPairings(const GetAllPairingsCallback& callback) { | 100 void PairingRegistry::GetAllPairings( |
101 const GetAllPairingsCallback& callback) { | |
91 DCHECK(CalledOnValidThread()); | 102 DCHECK(CalledOnValidThread()); |
92 delegate_->Load( | 103 GetAllPairingsCallback wrapped_callback = base::Bind( |
93 base::Bind(&PairingRegistry::SanitizePairings, this, callback)); | 104 &PairingRegistry::InvokeGetAllPairingsCallbackAndScheduleNext, |
105 this, callback); | |
106 LoadCallback load_callback = base::Bind( | |
107 &PairingRegistry::SanitizePairings, this, wrapped_callback); | |
108 base::Closure request = base::Bind( | |
109 &PairingRegistry::Delegate::Load, | |
110 base::Unretained(delegate_.get()), load_callback); | |
111 ServiceOrQueueRequest(request); | |
94 } | 112 } |
95 | 113 |
96 void PairingRegistry::DeletePairing(const std::string& client_id, | 114 void PairingRegistry::DeletePairing( |
97 const SaveCallback& callback) { | 115 const std::string& client_id, const SaveCallback& callback) { |
98 DCHECK(CalledOnValidThread()); | 116 DCHECK(CalledOnValidThread()); |
99 delegate_->Load( | 117 SaveCallback wrapped_callback = base::Bind( |
100 base::Bind(&PairingRegistry::DoDeletePairing, | 118 &PairingRegistry::InvokeSaveCallbackAndScheduleNext, |
101 this, client_id, callback)); | 119 this, callback); |
120 LoadCallback load_callback = base::Bind( | |
121 &PairingRegistry::DoDeletePairing, this, client_id, wrapped_callback); | |
122 base::Closure request = base::Bind( | |
123 &PairingRegistry::Delegate::Load, | |
124 base::Unretained(delegate_.get()), load_callback); | |
125 ServiceOrQueueRequest(request); | |
102 } | 126 } |
103 | 127 |
104 void PairingRegistry::ClearAllPairings(const SaveCallback& callback) { | 128 void PairingRegistry::ClearAllPairings( |
129 const SaveCallback& callback) { | |
105 DCHECK(CalledOnValidThread()); | 130 DCHECK(CalledOnValidThread()); |
106 delegate_->Save(EncodeJson(PairedClients()), callback); | 131 SaveCallback wrapped_callback = base::Bind( |
132 &PairingRegistry::InvokeSaveCallbackAndScheduleNext, | |
133 this, callback); | |
134 base::Closure request = base::Bind( | |
135 &PairingRegistry::Delegate::Save, | |
136 base::Unretained(delegate_.get()), | |
137 EncodeJson(PairedClients()), | |
138 wrapped_callback); | |
139 ServiceOrQueueRequest(request); | |
107 } | 140 } |
108 | 141 |
109 void PairingRegistry::AddPairing(const Pairing& pairing) { | 142 void PairingRegistry::AddPairing(const Pairing& pairing) { |
110 delegate_->Load( | 143 SaveCallback callback = base::Bind( |
111 base::Bind(&PairingRegistry::MergePairingAndSave, this, pairing)); | 144 &PairingRegistry::InvokeSaveCallbackAndScheduleNext, |
145 this, SaveCallback()); | |
146 LoadCallback load_callback = base::Bind( | |
147 &PairingRegistry::MergePairingAndSave, this, pairing, callback); | |
148 base::Closure request = base::Bind( | |
149 &PairingRegistry::Delegate::Load, | |
150 base::Unretained(delegate_.get()), load_callback); | |
151 ServiceOrQueueRequest(request); | |
112 } | 152 } |
113 | 153 |
114 void PairingRegistry::MergePairingAndSave(const Pairing& pairing, | 154 void PairingRegistry::MergePairingAndSave(const Pairing& pairing, |
155 const SaveCallback& callback, | |
115 const std::string& pairings_json) { | 156 const std::string& pairings_json) { |
116 DCHECK(CalledOnValidThread()); | 157 DCHECK(CalledOnValidThread()); |
117 PairedClients clients = DecodeJson(pairings_json); | 158 PairedClients clients = DecodeJson(pairings_json); |
118 clients[pairing.client_id()] = pairing; | 159 clients[pairing.client_id()] = pairing; |
119 std::string new_pairings_json = EncodeJson(clients); | 160 std::string new_pairings_json = EncodeJson(clients); |
120 delegate_->Save(new_pairings_json, SaveCallback()); | 161 delegate_->Save(new_pairings_json, callback); |
121 } | 162 } |
122 | 163 |
123 void PairingRegistry::DoGetPairing(const std::string& client_id, | 164 void PairingRegistry::DoGetPairing(const std::string& client_id, |
124 const GetPairingCallback& callback, | 165 const GetPairingCallback& callback, |
125 const std::string& pairings_json) { | 166 const std::string& pairings_json) { |
126 PairedClients clients = DecodeJson(pairings_json); | 167 PairedClients clients = DecodeJson(pairings_json); |
127 Pairing result = clients[client_id]; | 168 Pairing result = clients[client_id]; |
128 callback.Run(result); | 169 callback.Run(result); |
129 } | 170 } |
130 | 171 |
131 void PairingRegistry::SanitizePairings(const GetAllPairingsCallback& callback, | 172 void PairingRegistry::SanitizePairings(const GetAllPairingsCallback& callback, |
132 const std::string& pairings_json) { | 173 const std::string& pairings_json) { |
133 PairedClients clients = DecodeJson(pairings_json); | 174 PairedClients clients = DecodeJson(pairings_json); |
134 callback.Run(ConvertToListValue(clients, false)); | 175 callback.Run(ConvertToListValue(clients, false)); |
135 } | 176 } |
136 | 177 |
137 void PairingRegistry::DoDeletePairing(const std::string& client_id, | 178 void PairingRegistry::DoDeletePairing(const std::string& client_id, |
138 const SaveCallback& callback, | 179 const SaveCallback& callback, |
139 const std::string& pairings_json) { | 180 const std::string& pairings_json) { |
140 PairedClients clients = DecodeJson(pairings_json); | 181 PairedClients clients = DecodeJson(pairings_json); |
141 clients.erase(client_id); | 182 clients.erase(client_id); |
142 std::string new_pairings_json = EncodeJson(clients); | 183 std::string new_pairings_json = EncodeJson(clients); |
143 delegate_->Save(new_pairings_json, callback); | 184 delegate_->Save(new_pairings_json, callback); |
144 } | 185 } |
145 | 186 |
187 void PairingRegistry::InvokeLoadCallbackAndScheduleNext( | |
188 const LoadCallback& callback, const std::string& pairings_json) { | |
189 callback.Run(pairings_json); | |
190 pending_requests_.pop(); | |
191 ServiceNextRequest(); | |
192 } | |
193 | |
194 void PairingRegistry::InvokeSaveCallbackAndScheduleNext( | |
195 const SaveCallback& callback, bool success) { | |
196 // CreatePairing doesn't have a callback, so the callback can be null. | |
197 if (!callback.is_null()) { | |
198 callback.Run(success); | |
199 } | |
200 pending_requests_.pop(); | |
201 ServiceNextRequest(); | |
202 } | |
203 | |
204 void PairingRegistry::InvokeGetPairingCallbackAndScheduleNext( | |
205 const GetPairingCallback& callback, Pairing pairing) { | |
206 callback.Run(pairing); | |
207 pending_requests_.pop(); | |
208 ServiceNextRequest(); | |
209 } | |
210 | |
211 void PairingRegistry::InvokeGetAllPairingsCallbackAndScheduleNext( | |
212 const GetAllPairingsCallback& callback, | |
213 scoped_ptr<base::ListValue> pairings) { | |
214 callback.Run(pairings.Pass()); | |
215 pending_requests_.pop(); | |
216 ServiceNextRequest(); | |
217 } | |
218 | |
146 // static | 219 // static |
147 PairingRegistry::PairedClients PairingRegistry::DecodeJson( | 220 PairingRegistry::PairedClients PairingRegistry::DecodeJson( |
148 const std::string& pairings_json) { | 221 const std::string& pairings_json) { |
149 PairedClients result; | 222 PairedClients result; |
150 | 223 |
151 if (pairings_json.empty()) { | 224 if (pairings_json.empty()) { |
152 return result; | 225 return result; |
153 } | 226 } |
154 | 227 |
155 JSONStringValueSerializer registry(pairings_json); | 228 JSONStringValueSerializer registry(pairings_json); |
(...skipping 26 matching lines...) Expand all Loading... | |
182 result[client_id] = Pairing( | 255 result[client_id] = Pairing( |
183 created_time, client_name, client_id, shared_secret); | 256 created_time, client_name, client_id, shared_secret); |
184 } else { | 257 } else { |
185 LOG(ERROR) << "Paired client " << i << " has unexpected format."; | 258 LOG(ERROR) << "Paired client " << i << " has unexpected format."; |
186 } | 259 } |
187 } | 260 } |
188 | 261 |
189 return result; | 262 return result; |
190 } | 263 } |
191 | 264 |
265 void PairingRegistry::ServiceOrQueueRequest(const base::Closure& request) { | |
266 bool servicing_request = !pending_requests_.empty(); | |
267 pending_requests_.push(request); | |
268 if (!servicing_request) { | |
269 ServiceNextRequest(); | |
270 } | |
271 } | |
272 | |
273 void PairingRegistry::ServiceNextRequest() { | |
274 if (pending_requests_.empty()) { | |
275 return; | |
276 } | |
277 base::Closure request = pending_requests_.front(); | |
278 request.Run(); | |
Lambros
2013/07/19 01:54:21
|request| temporary not needed anymore?
Jamie
2013/07/19 02:10:13
I think it's a bit clearer than running it togethe
| |
279 } | |
280 | |
192 // static | 281 // static |
193 std::string PairingRegistry::EncodeJson(const PairedClients& clients) { | 282 std::string PairingRegistry::EncodeJson(const PairedClients& clients) { |
194 scoped_ptr<base::ListValue> root = ConvertToListValue(clients, true); | 283 scoped_ptr<base::ListValue> root = ConvertToListValue(clients, true); |
195 std::string result; | 284 std::string result; |
196 JSONStringValueSerializer serializer(&result); | 285 JSONStringValueSerializer serializer(&result); |
197 serializer.Serialize(*root); | 286 serializer.Serialize(*root); |
198 | 287 |
199 return result; | 288 return result; |
200 } | 289 } |
201 | 290 |
(...skipping 11 matching lines...) Expand all Loading... | |
213 if (include_shared_secrets) { | 302 if (include_shared_secrets) { |
214 pairing->SetString(kSharedSecretKey, i->second.shared_secret()); | 303 pairing->SetString(kSharedSecretKey, i->second.shared_secret()); |
215 } | 304 } |
216 root->Append(pairing); | 305 root->Append(pairing); |
217 } | 306 } |
218 return root.Pass(); | 307 return root.Pass(); |
219 } | 308 } |
220 | 309 |
221 } // namespace protocol | 310 } // namespace protocol |
222 } // namespace remoting | 311 } // namespace remoting |
OLD | NEW |