Index: remoting/protocol/pairing_registry.cc |
diff --git a/remoting/protocol/pairing_registry.cc b/remoting/protocol/pairing_registry.cc |
index 24875aa1ba5b43eb2a74c7adbeb74627f432ad3b..05b7d38f41b2121c95839c19336a2b5236f9fd7c 100644 |
--- a/remoting/protocol/pairing_registry.cc |
+++ b/remoting/protocol/pairing_registry.cc |
@@ -65,7 +65,8 @@ bool PairingRegistry::Pairing::is_valid() const { |
} |
PairingRegistry::PairingRegistry(scoped_ptr<Delegate> delegate) |
- : delegate_(delegate.Pass()) { |
+ : delegate_(delegate.Pass()), |
+ servicing_request_(false) { |
DCHECK(delegate_); |
} |
@@ -83,41 +84,105 @@ PairingRegistry::Pairing PairingRegistry::CreatePairing( |
void PairingRegistry::GetPairing(const std::string& client_id, |
const GetPairingCallback& callback) { |
DCHECK(CalledOnValidThread()); |
+ GetPairingCallback wrapped_callback = base::Bind( |
+ &PairingRegistry::InvokeGetPairingCallbackAndScheduleNext, |
+ this, callback); |
+ base::Closure request = base::Bind( |
+ &PairingRegistry::GetPairingAndScheduleNext, |
+ this, client_id, wrapped_callback); |
+ ServiceOrQueueRequest(request); |
+} |
+ |
+void PairingRegistry::GetAllPairings( |
+ const GetAllPairingsCallback& callback) { |
+ DCHECK(CalledOnValidThread()); |
+ GetAllPairingsCallback wrapped_callback = base::Bind( |
+ &PairingRegistry::InvokeGetAllPairingsCallbackAndScheduleNext, |
+ this, callback); |
+ base::Closure request = base::Bind( |
+ &PairingRegistry::GetAllPairingsAndScheduleNext, |
+ this, wrapped_callback); |
+ ServiceOrQueueRequest(request); |
+} |
+ |
+void PairingRegistry::DeletePairing( |
+ const std::string& client_id, const SaveCallback& callback) { |
+ DCHECK(CalledOnValidThread()); |
+ SaveCallback wrapped_callback = base::Bind( |
+ &PairingRegistry::InvokeSaveCallbackAndScheduleNext, |
+ this, callback); |
+ base::Closure request = base::Bind( |
+ &PairingRegistry::DeletePairingAndScheduleNext, |
+ this, client_id, wrapped_callback); |
+ ServiceOrQueueRequest(request); |
+} |
+ |
+void PairingRegistry::ClearAllPairings( |
+ const SaveCallback& callback) { |
+ DCHECK(CalledOnValidThread()); |
+ SaveCallback wrapped_callback = base::Bind( |
+ &PairingRegistry::InvokeSaveCallbackAndScheduleNext, |
+ this, callback); |
+ base::Closure request = base::Bind( |
+ &PairingRegistry::ClearAllPairingsAndScheduleNext, |
+ this, wrapped_callback); |
+ ServiceOrQueueRequest(request); |
+} |
+ |
+void PairingRegistry::AddPairing(const Pairing& pairing) { |
+ SaveCallback callback = base::Bind( |
+ &PairingRegistry::InvokeSaveCallbackAndScheduleNext, |
+ this, SaveCallback()); |
+ base::Closure request = base::Bind( |
+ &PairingRegistry::SavePairingAndScheduleNext, |
+ this, pairing, callback); |
+ ServiceOrQueueRequest(request); |
+} |
+ |
+void PairingRegistry::SavePairingAndScheduleNext(Pairing pairing, |
+ const SaveCallback& callback) { |
+ DCHECK(CalledOnValidThread()); |
+ delegate_->Load( |
+ base::Bind(&PairingRegistry::MergePairingAndSave, |
+ this, pairing, callback)); |
+} |
+ |
+void PairingRegistry::GetPairingAndScheduleNext( |
+ const std::string& client_id, const GetPairingCallback& callback) { |
+ DCHECK(CalledOnValidThread()); |
delegate_->Load( |
base::Bind(&PairingRegistry::DoGetPairing, this, client_id, callback)); |
} |
-void PairingRegistry::GetAllPairings(const GetAllPairingsCallback& callback) { |
+void PairingRegistry::GetAllPairingsAndScheduleNext( |
+ const GetAllPairingsCallback& callback) { |
DCHECK(CalledOnValidThread()); |
delegate_->Load( |
base::Bind(&PairingRegistry::SanitizePairings, this, callback)); |
} |
-void PairingRegistry::DeletePairing(const std::string& client_id, |
- const SaveCallback& callback) { |
+void PairingRegistry::DeletePairingAndScheduleNext( |
+ const std::string& client_id, const SaveCallback& callback) { |
DCHECK(CalledOnValidThread()); |
delegate_->Load( |
base::Bind(&PairingRegistry::DoDeletePairing, |
this, client_id, callback)); |
} |
-void PairingRegistry::ClearAllPairings(const SaveCallback& callback) { |
+void PairingRegistry::ClearAllPairingsAndScheduleNext( |
+ const SaveCallback& callback) { |
DCHECK(CalledOnValidThread()); |
delegate_->Save(EncodeJson(PairedClients()), callback); |
} |
-void PairingRegistry::AddPairing(const Pairing& pairing) { |
- delegate_->Load( |
- base::Bind(&PairingRegistry::MergePairingAndSave, this, pairing)); |
-} |
- |
void PairingRegistry::MergePairingAndSave(const Pairing& pairing, |
+ const SaveCallback& callback, |
const std::string& pairings_json) { |
DCHECK(CalledOnValidThread()); |
PairedClients clients = DecodeJson(pairings_json); |
clients[pairing.client_id()] = pairing; |
std::string new_pairings_json = EncodeJson(clients); |
- delegate_->Save(new_pairings_json, SaveCallback()); |
+ delegate_->Save(new_pairings_json, callback); |
} |
void PairingRegistry::DoGetPairing(const std::string& client_id, |
@@ -143,6 +208,38 @@ void PairingRegistry::DoDeletePairing(const std::string& client_id, |
delegate_->Save(new_pairings_json, callback); |
} |
+void PairingRegistry::InvokeLoadCallbackAndScheduleNext( |
+ const LoadCallback& callback, const std::string& pairings_json) { |
+ callback.Run(pairings_json); |
+ servicing_request_ = false; |
+ ServiceNextRequest(); |
+} |
+ |
+void PairingRegistry::InvokeSaveCallbackAndScheduleNext( |
+ const SaveCallback& callback, bool success) { |
+ // CreatePairing doesn't have a callback, so the callback can be null. |
+ if (!callback.is_null()) { |
+ callback.Run(success); |
+ } |
+ servicing_request_ = false; |
+ ServiceNextRequest(); |
+} |
+ |
+void PairingRegistry::InvokeGetPairingCallbackAndScheduleNext( |
+ const GetPairingCallback& callback, Pairing pairing) { |
+ callback.Run(pairing); |
+ servicing_request_ = false; |
+ ServiceNextRequest(); |
+} |
+ |
+void PairingRegistry::InvokeGetAllPairingsCallbackAndScheduleNext( |
+ const GetAllPairingsCallback& callback, |
+ scoped_ptr<base::ListValue> pairings) { |
+ callback.Run(pairings.Pass()); |
+ servicing_request_ = false; |
+ ServiceNextRequest(); |
+} |
+ |
// static |
PairingRegistry::PairedClients PairingRegistry::DecodeJson( |
const std::string& pairings_json) { |
@@ -189,6 +286,23 @@ PairingRegistry::PairedClients PairingRegistry::DecodeJson( |
return result; |
} |
+void PairingRegistry::ServiceOrQueueRequest(const base::Closure& request) { |
+ pending_requests_.push(request); |
+ if (!servicing_request_) { |
+ ServiceNextRequest(); |
+ } |
+} |
+ |
+void PairingRegistry::ServiceNextRequest() { |
+ if (pending_requests_.empty()) { |
+ return; |
+ } |
+ servicing_request_ = true; |
+ base::Closure request = pending_requests_.front(); |
+ pending_requests_.pop(); |
+ request.Run(); |
+} |
+ |
// static |
std::string PairingRegistry::EncodeJson(const PairedClients& clients) { |
scoped_ptr<base::ListValue> root = ConvertToListValue(clients, true); |