| 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 |