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

Side by Side Diff: remoting/protocol/pairing_registry.cc

Issue 19714002: Add serialization to PairingRegistry. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Reviewer feedback. Created 7 years, 5 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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698