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

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: 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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 client_id_ == other.client_id_ && 58 client_id_ == other.client_id_ &&
59 client_name_ == other.client_name_ && 59 client_name_ == other.client_name_ &&
60 shared_secret_ == other.shared_secret_; 60 shared_secret_ == other.shared_secret_;
61 } 61 }
62 62
63 bool PairingRegistry::Pairing::is_valid() const { 63 bool PairingRegistry::Pairing::is_valid() const {
64 return !client_id_.empty() && !shared_secret_.empty(); 64 return !client_id_.empty() && !shared_secret_.empty();
65 } 65 }
66 66
67 PairingRegistry::PairingRegistry(scoped_ptr<Delegate> delegate) 67 PairingRegistry::PairingRegistry(scoped_ptr<Delegate> delegate)
68 : delegate_(delegate.Pass()) { 68 : delegate_(delegate.Pass()),
69 servicing_request_(false) {
69 DCHECK(delegate_); 70 DCHECK(delegate_);
70 } 71 }
71 72
72 PairingRegistry::~PairingRegistry() { 73 PairingRegistry::~PairingRegistry() {
73 } 74 }
74 75
75 PairingRegistry::Pairing PairingRegistry::CreatePairing( 76 PairingRegistry::Pairing PairingRegistry::CreatePairing(
76 const std::string& client_name) { 77 const std::string& client_name) {
77 DCHECK(CalledOnValidThread()); 78 DCHECK(CalledOnValidThread());
78 Pairing result = Pairing::Create(client_name); 79 Pairing result = Pairing::Create(client_name);
79 AddPairing(result); 80 AddPairing(result);
80 return result; 81 return result;
81 } 82 }
82 83
83 void PairingRegistry::GetPairing(const std::string& client_id, 84 void PairingRegistry::GetPairing(const std::string& client_id,
84 const GetPairingCallback& callback) { 85 const GetPairingCallback& callback) {
85 DCHECK(CalledOnValidThread()); 86 DCHECK(CalledOnValidThread());
87 GetPairingCallback wrapped_callback = base::Bind(
88 &PairingRegistry::InvokeGetPairingCallbackAndScheduleNext,
89 this, callback);
90 base::Closure request = base::Bind(
91 &PairingRegistry::GetPairingAndScheduleNext,
92 this, client_id, wrapped_callback);
93 ServiceOrQueueRequest(request);
94 }
95
96 void PairingRegistry::GetAllPairings(
97 const GetAllPairingsCallback& callback) {
98 DCHECK(CalledOnValidThread());
99 GetAllPairingsCallback wrapped_callback = base::Bind(
100 &PairingRegistry::InvokeGetAllPairingsCallbackAndScheduleNext,
101 this, callback);
102 base::Closure request = base::Bind(
103 &PairingRegistry::GetAllPairingsAndScheduleNext,
104 this, wrapped_callback);
105 ServiceOrQueueRequest(request);
106 }
107
108 void PairingRegistry::DeletePairing(
109 const std::string& client_id, const SaveCallback& callback) {
110 DCHECK(CalledOnValidThread());
111 SaveCallback wrapped_callback = base::Bind(
112 &PairingRegistry::InvokeSaveCallbackAndScheduleNext,
113 this, callback);
114 base::Closure request = base::Bind(
115 &PairingRegistry::DeletePairingAndScheduleNext,
116 this, client_id, wrapped_callback);
117 ServiceOrQueueRequest(request);
118 }
119
120 void PairingRegistry::ClearAllPairings(
121 const SaveCallback& callback) {
122 DCHECK(CalledOnValidThread());
123 SaveCallback wrapped_callback = base::Bind(
124 &PairingRegistry::InvokeSaveCallbackAndScheduleNext,
125 this, callback);
126 base::Closure request = base::Bind(
127 &PairingRegistry::ClearAllPairingsAndScheduleNext,
128 this, wrapped_callback);
129 ServiceOrQueueRequest(request);
130 }
131
132 void PairingRegistry::AddPairing(const Pairing& pairing) {
133 SaveCallback callback = base::Bind(
134 &PairingRegistry::InvokeSaveCallbackAndScheduleNext,
135 this, SaveCallback());
136 base::Closure request = base::Bind(
137 &PairingRegistry::SavePairingAndScheduleNext,
138 this, pairing, callback);
139 ServiceOrQueueRequest(request);
140 }
141
142 void PairingRegistry::SavePairingAndScheduleNext(Pairing pairing,
143 const SaveCallback& callback) {
144 DCHECK(CalledOnValidThread());
145 delegate_->Load(
146 base::Bind(&PairingRegistry::MergePairingAndSave,
147 this, pairing, callback));
148 }
149
150 void PairingRegistry::GetPairingAndScheduleNext(
151 const std::string& client_id, const GetPairingCallback& callback) {
152 DCHECK(CalledOnValidThread());
86 delegate_->Load( 153 delegate_->Load(
87 base::Bind(&PairingRegistry::DoGetPairing, this, client_id, callback)); 154 base::Bind(&PairingRegistry::DoGetPairing, this, client_id, callback));
88 } 155 }
89 156
90 void PairingRegistry::GetAllPairings(const GetAllPairingsCallback& callback) { 157 void PairingRegistry::GetAllPairingsAndScheduleNext(
158 const GetAllPairingsCallback& callback) {
91 DCHECK(CalledOnValidThread()); 159 DCHECK(CalledOnValidThread());
92 delegate_->Load( 160 delegate_->Load(
93 base::Bind(&PairingRegistry::SanitizePairings, this, callback)); 161 base::Bind(&PairingRegistry::SanitizePairings, this, callback));
94 } 162 }
95 163
96 void PairingRegistry::DeletePairing(const std::string& client_id, 164 void PairingRegistry::DeletePairingAndScheduleNext(
97 const SaveCallback& callback) { 165 const std::string& client_id, const SaveCallback& callback) {
98 DCHECK(CalledOnValidThread()); 166 DCHECK(CalledOnValidThread());
99 delegate_->Load( 167 delegate_->Load(
100 base::Bind(&PairingRegistry::DoDeletePairing, 168 base::Bind(&PairingRegistry::DoDeletePairing,
101 this, client_id, callback)); 169 this, client_id, callback));
102 } 170 }
103 171
104 void PairingRegistry::ClearAllPairings(const SaveCallback& callback) { 172 void PairingRegistry::ClearAllPairingsAndScheduleNext(
173 const SaveCallback& callback) {
105 DCHECK(CalledOnValidThread()); 174 DCHECK(CalledOnValidThread());
106 delegate_->Save(EncodeJson(PairedClients()), callback); 175 delegate_->Save(EncodeJson(PairedClients()), callback);
107 } 176 }
108 177
109 void PairingRegistry::AddPairing(const Pairing& pairing) {
110 delegate_->Load(
111 base::Bind(&PairingRegistry::MergePairingAndSave, this, pairing));
112 }
113
114 void PairingRegistry::MergePairingAndSave(const Pairing& pairing, 178 void PairingRegistry::MergePairingAndSave(const Pairing& pairing,
179 const SaveCallback& callback,
115 const std::string& pairings_json) { 180 const std::string& pairings_json) {
116 DCHECK(CalledOnValidThread()); 181 DCHECK(CalledOnValidThread());
117 PairedClients clients = DecodeJson(pairings_json); 182 PairedClients clients = DecodeJson(pairings_json);
118 clients[pairing.client_id()] = pairing; 183 clients[pairing.client_id()] = pairing;
119 std::string new_pairings_json = EncodeJson(clients); 184 std::string new_pairings_json = EncodeJson(clients);
120 delegate_->Save(new_pairings_json, SaveCallback()); 185 delegate_->Save(new_pairings_json, callback);
121 } 186 }
122 187
123 void PairingRegistry::DoGetPairing(const std::string& client_id, 188 void PairingRegistry::DoGetPairing(const std::string& client_id,
124 const GetPairingCallback& callback, 189 const GetPairingCallback& callback,
125 const std::string& pairings_json) { 190 const std::string& pairings_json) {
126 PairedClients clients = DecodeJson(pairings_json); 191 PairedClients clients = DecodeJson(pairings_json);
127 Pairing result = clients[client_id]; 192 Pairing result = clients[client_id];
128 callback.Run(result); 193 callback.Run(result);
129 } 194 }
130 195
131 void PairingRegistry::SanitizePairings(const GetAllPairingsCallback& callback, 196 void PairingRegistry::SanitizePairings(const GetAllPairingsCallback& callback,
132 const std::string& pairings_json) { 197 const std::string& pairings_json) {
133 PairedClients clients = DecodeJson(pairings_json); 198 PairedClients clients = DecodeJson(pairings_json);
134 callback.Run(ConvertToListValue(clients, false)); 199 callback.Run(ConvertToListValue(clients, false));
135 } 200 }
136 201
137 void PairingRegistry::DoDeletePairing(const std::string& client_id, 202 void PairingRegistry::DoDeletePairing(const std::string& client_id,
138 const SaveCallback& callback, 203 const SaveCallback& callback,
139 const std::string& pairings_json) { 204 const std::string& pairings_json) {
140 PairedClients clients = DecodeJson(pairings_json); 205 PairedClients clients = DecodeJson(pairings_json);
141 clients.erase(client_id); 206 clients.erase(client_id);
142 std::string new_pairings_json = EncodeJson(clients); 207 std::string new_pairings_json = EncodeJson(clients);
143 delegate_->Save(new_pairings_json, callback); 208 delegate_->Save(new_pairings_json, callback);
144 } 209 }
145 210
211 void PairingRegistry::InvokeLoadCallbackAndScheduleNext(
212 const LoadCallback& callback, const std::string& pairings_json) {
213 callback.Run(pairings_json);
214 servicing_request_ = false;
215 ServiceNextRequest();
216 }
217
218 void PairingRegistry::InvokeSaveCallbackAndScheduleNext(
219 const SaveCallback& callback, bool success) {
220 // CreatePairing doesn't have a callback, so the callback can be null.
221 if (!callback.is_null()) {
222 callback.Run(success);
223 }
224 servicing_request_ = false;
225 ServiceNextRequest();
226 }
227
228 void PairingRegistry::InvokeGetPairingCallbackAndScheduleNext(
229 const GetPairingCallback& callback, Pairing pairing) {
230 callback.Run(pairing);
231 servicing_request_ = false;
232 ServiceNextRequest();
233 }
234
235 void PairingRegistry::InvokeGetAllPairingsCallbackAndScheduleNext(
236 const GetAllPairingsCallback& callback,
237 scoped_ptr<base::ListValue> pairings) {
238 callback.Run(pairings.Pass());
239 servicing_request_ = false;
240 ServiceNextRequest();
241 }
242
146 // static 243 // static
147 PairingRegistry::PairedClients PairingRegistry::DecodeJson( 244 PairingRegistry::PairedClients PairingRegistry::DecodeJson(
148 const std::string& pairings_json) { 245 const std::string& pairings_json) {
149 PairedClients result; 246 PairedClients result;
150 247
151 if (pairings_json.empty()) { 248 if (pairings_json.empty()) {
152 return result; 249 return result;
153 } 250 }
154 251
155 JSONStringValueSerializer registry(pairings_json); 252 JSONStringValueSerializer registry(pairings_json);
(...skipping 26 matching lines...) Expand all
182 result[client_id] = Pairing( 279 result[client_id] = Pairing(
183 created_time, client_name, client_id, shared_secret); 280 created_time, client_name, client_id, shared_secret);
184 } else { 281 } else {
185 LOG(ERROR) << "Paired client " << i << " has unexpected format."; 282 LOG(ERROR) << "Paired client " << i << " has unexpected format.";
186 } 283 }
187 } 284 }
188 285
189 return result; 286 return result;
190 } 287 }
191 288
289 void PairingRegistry::ServiceOrQueueRequest(const base::Closure& request) {
290 pending_requests_.push(request);
291 if (!servicing_request_) {
292 ServiceNextRequest();
293 }
294 }
295
296 void PairingRegistry::ServiceNextRequest() {
297 if (pending_requests_.empty()) {
298 return;
299 }
300 servicing_request_ = true;
301 base::Closure request = pending_requests_.front();
302 pending_requests_.pop();
303 request.Run();
304 }
305
192 // static 306 // static
193 std::string PairingRegistry::EncodeJson(const PairedClients& clients) { 307 std::string PairingRegistry::EncodeJson(const PairedClients& clients) {
194 scoped_ptr<base::ListValue> root = ConvertToListValue(clients, true); 308 scoped_ptr<base::ListValue> root = ConvertToListValue(clients, true);
195 std::string result; 309 std::string result;
196 JSONStringValueSerializer serializer(&result); 310 JSONStringValueSerializer serializer(&result);
197 serializer.Serialize(*root); 311 serializer.Serialize(*root);
198 312
199 return result; 313 return result;
200 } 314 }
201 315
(...skipping 11 matching lines...) Expand all
213 if (include_shared_secrets) { 327 if (include_shared_secrets) {
214 pairing->SetString(kSharedSecretKey, i->second.shared_secret()); 328 pairing->SetString(kSharedSecretKey, i->second.shared_secret());
215 } 329 }
216 root->Append(pairing); 330 root->Append(pairing);
217 } 331 }
218 return root.Pass(); 332 return root.Pass();
219 } 333 }
220 334
221 } // namespace protocol 335 } // namespace protocol
222 } // namespace remoting 336 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698