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(); |
| 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 |