Index: chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.cc |
diff --git a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.cc b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.cc |
index c5085d2d2bfd439cf98ec7d64f6f44259703f374..ee7418ffc824f9594168b78451cd9a3b6eb43448 100644 |
--- a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.cc |
+++ b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.cc |
@@ -30,76 +30,35 @@ const char kPermitTypeLicence[] = "licence"; |
} // namespace |
EasyUnlockKeyManager::EasyUnlockKeyManager() |
- : operation_id_(0), |
- weak_ptr_factory_(this) { |
+ : operation_in_progress_(false), weak_ptr_factory_(this) { |
} |
EasyUnlockKeyManager::~EasyUnlockKeyManager() { |
- STLDeleteContainerPairSecondPointers(get_keys_ops_.begin(), |
- get_keys_ops_.end()); |
} |
void EasyUnlockKeyManager::RefreshKeys(const UserContext& user_context, |
const base::ListValue& remote_devices, |
const RefreshKeysCallback& callback) { |
- // Must have the secret. |
- DCHECK(!user_context.GetKey()->GetSecret().empty()); |
- |
EasyUnlockDeviceKeyDataList devices; |
if (!RemoteDeviceListToDeviceDataList(remote_devices, &devices)) |
devices.clear(); |
- // Only one pending request. |
- DCHECK(!HasPendingOperations()); |
- create_keys_op_.reset(new EasyUnlockCreateKeysOperation( |
- user_context, |
- devices, |
- base::Bind(&EasyUnlockKeyManager::OnKeysCreated, |
- weak_ptr_factory_.GetWeakPtr(), |
- devices.size(), |
- callback))); |
- create_keys_op_->Start(); |
-} |
- |
-void EasyUnlockKeyManager::RemoveKeys(const UserContext& user_context, |
- size_t start_index, |
- const RemoveKeysCallback& callback) { |
- // Must have the secret. |
- DCHECK(!user_context.GetKey()->GetSecret().empty()); |
- // Only one pending request. |
- DCHECK(!HasPendingOperations()); |
- |
- remove_keys_op_.reset( |
- new EasyUnlockRemoveKeysOperation( |
- user_context, |
- start_index, |
- base::Bind(&EasyUnlockKeyManager::OnKeysRemoved, |
- weak_ptr_factory_.GetWeakPtr(), |
- callback))); |
- remove_keys_op_->Start(); |
+ write_operation_queue_.push_back( |
+ make_scoped_ptr(new EasyUnlockRefreshKeysOperation( |
+ user_context, devices, |
+ base::Bind(&EasyUnlockKeyManager::OnKeysRefreshed, |
+ weak_ptr_factory_.GetWeakPtr(), callback)))); |
+ RunNextOperation(); |
xiyuan
2014/12/17 00:23:14
What happens if there is a running operation? This
Tim Song
2014/12/17 02:05:14
Done. Sorry, I meant to check operation_in_progres
|
} |
void EasyUnlockKeyManager::GetDeviceDataList( |
const UserContext& user_context, |
const GetDeviceDataListCallback& callback) { |
- // Defer the get operation if there is pending write operations. |
- if (create_keys_op_ || remove_keys_op_) { |
- pending_ops_.push_back(base::Bind(&EasyUnlockKeyManager::GetDeviceDataList, |
- weak_ptr_factory_.GetWeakPtr(), |
- user_context, |
- callback)); |
- return; |
- } |
- |
- const int op_id = GetNextOperationId(); |
- scoped_ptr<EasyUnlockGetKeysOperation> op(new EasyUnlockGetKeysOperation( |
- user_context, |
- base::Bind(&EasyUnlockKeyManager::OnKeysFetched, |
- weak_ptr_factory_.GetWeakPtr(), |
- op_id, |
- callback))); |
- op->Start(); |
- get_keys_ops_[op_id] = op.release(); |
+ read_operation_queue_.push_back( |
+ make_scoped_ptr(new EasyUnlockGetKeysOperation( |
+ user_context, base::Bind(&EasyUnlockKeyManager::OnKeysFetched, |
+ weak_ptr_factory_.GetWeakPtr(), callback)))); |
+ RunNextOperation(); |
xiyuan
2014/12/17 00:23:14
same here.
Tim Song
2014/12/17 02:05:14
Done.
|
} |
// static |
@@ -181,64 +140,41 @@ std::string EasyUnlockKeyManager::GetKeyLabel(size_t key_index) { |
return base::StringPrintf("%s%zu", kKeyLabelPrefix, key_index); |
} |
-bool EasyUnlockKeyManager::HasPendingOperations() const { |
- return create_keys_op_ || remove_keys_op_ || !get_keys_ops_.empty(); |
-} |
- |
-int EasyUnlockKeyManager::GetNextOperationId() { |
- return ++operation_id_; |
-} |
- |
-void EasyUnlockKeyManager::RunNextPendingOp() { |
- if (pending_ops_.empty()) |
- return; |
- |
- pending_ops_.front().Run(); |
- pending_ops_.pop_front(); |
-} |
- |
-void EasyUnlockKeyManager::OnKeysCreated( |
- size_t remove_start_index, |
- const RefreshKeysCallback& callback, |
- bool create_success) { |
- scoped_ptr<EasyUnlockCreateKeysOperation> op = create_keys_op_.Pass(); |
- if (!callback.is_null()) |
- callback.Run(create_success); |
- |
- // Remove extra existing keys. |
- RemoveKeys(op->user_context(), remove_start_index, RemoveKeysCallback()); |
+void EasyUnlockKeyManager::RunNextOperation() { |
+ // The front operation will be removed upon completion. |
+ if (!write_operation_queue_.empty()) { |
+ operation_in_progress_ = true; |
+ write_operation_queue_.front()->Start(); |
+ } else if (!read_operation_queue_.empty()) { |
+ operation_in_progress_ = true; |
+ read_operation_queue_.front()->Start(); |
+ } |
} |
-void EasyUnlockKeyManager::OnKeysRemoved(const RemoveKeysCallback& callback, |
- bool remove_success) { |
- scoped_ptr<EasyUnlockRemoveKeysOperation> op = remove_keys_op_.Pass(); |
+void EasyUnlockKeyManager::OnKeysRefreshed(const RefreshKeysCallback& callback, |
+ bool refresh_success) { |
if (!callback.is_null()) |
- callback.Run(remove_success); |
+ callback.Run(refresh_success); |
- if (!HasPendingOperations()) |
- RunNextPendingOp(); |
+ operation_in_progress_ = false; |
+ DCHECK(!write_operation_queue_.empty()); |
+ if (!write_operation_queue_.empty()) |
+ write_operation_queue_.pop_front(); |
+ RunNextOperation(); |
} |
void EasyUnlockKeyManager::OnKeysFetched( |
- int op_id, |
const GetDeviceDataListCallback& callback, |
bool fetch_success, |
const EasyUnlockDeviceKeyDataList& fetched_data) { |
- std::map<int, EasyUnlockGetKeysOperation*>::iterator it = |
- get_keys_ops_.find(op_id); |
- scoped_ptr<EasyUnlockGetKeysOperation> op; |
- if (it != get_keys_ops_.end()) { |
- op.reset(it->second); |
- get_keys_ops_.erase(it); |
- } else { |
- NOTREACHED(); |
- } |
- |
if (!callback.is_null()) |
callback.Run(fetch_success, fetched_data); |
- if (!HasPendingOperations()) |
- RunNextPendingOp(); |
+ operation_in_progress_ = false; |
+ DCHECK(!read_operation_queue_.empty()); |
+ if (!read_operation_queue_.empty()) |
+ read_operation_queue_.pop_front(); |
+ RunNextOperation(); |
} |
} // namespace chromeos |