Index: chrome/browser/chromeos/gdata/gdata_operation_registry.cc |
diff --git a/chrome/browser/chromeos/gdata/gdata_operation_registry.cc b/chrome/browser/chromeos/gdata/gdata_operation_registry.cc |
deleted file mode 100644 |
index 287691fba62f01337b9115133f6ef50d50ead0e9..0000000000000000000000000000000000000000 |
--- a/chrome/browser/chromeos/gdata/gdata_operation_registry.cc |
+++ /dev/null |
@@ -1,348 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/chromeos/gdata/gdata_operation_registry.h" |
- |
-#include "base/string_number_conversions.h" |
-#include "content/public/browser/browser_thread.h" |
- |
-using content::BrowserThread; |
- |
-namespace { |
- |
-const int64 kNotificationFrequencyInMilliseconds = 1000; |
- |
-} // namespace |
- |
-namespace gdata { |
- |
-// static |
-std::string GDataOperationRegistry::OperationTypeToString(OperationType type) { |
- switch (type) { |
- case OPERATION_UPLOAD: return "upload"; |
- case OPERATION_DOWNLOAD: return "download"; |
- case OPERATION_OTHER: return "other"; |
- } |
- NOTREACHED(); |
- return "unknown_transfer_state"; |
-} |
- |
-// static |
-std::string GDataOperationRegistry::OperationTransferStateToString( |
- OperationTransferState state) { |
- switch (state) { |
- case OPERATION_NOT_STARTED: return "not_started"; |
- case OPERATION_STARTED: return "started"; |
- case OPERATION_IN_PROGRESS: return "in_progress"; |
- case OPERATION_COMPLETED: return "completed"; |
- case OPERATION_FAILED: return "failed"; |
- // Suspended state is opaque to users and looks as same as "in_progress". |
- case OPERATION_SUSPENDED: return "in_progress"; |
- } |
- NOTREACHED(); |
- return "unknown_transfer_state"; |
-} |
- |
-GDataOperationRegistry::ProgressStatus::ProgressStatus(OperationType type, |
- const FilePath& path) |
- : operation_id(-1), |
- operation_type(type), |
- file_path(path), |
- transfer_state(OPERATION_NOT_STARTED), |
- progress_current(0), |
- progress_total(-1) { |
-} |
- |
-std::string GDataOperationRegistry::ProgressStatus::DebugString() const { |
- std::string str; |
- str += "id="; |
- str += base::IntToString(operation_id); |
- str += " type="; |
- str += OperationTypeToString(operation_type); |
- str += " path="; |
- str += file_path.AsUTF8Unsafe(); |
- str += " state="; |
- str += OperationTransferStateToString(transfer_state); |
- str += " progress="; |
- str += base::Int64ToString(progress_current); |
- str += "/"; |
- str += base::Int64ToString(progress_total); |
- return str; |
-} |
- |
-GDataOperationRegistry::Operation::Operation(GDataOperationRegistry* registry) |
- : registry_(registry), |
- progress_status_(GDataOperationRegistry::OPERATION_OTHER, FilePath()) { |
-} |
- |
-GDataOperationRegistry::Operation::Operation(GDataOperationRegistry* registry, |
- OperationType type, |
- const FilePath& path) |
- : registry_(registry), |
- progress_status_(type, path) { |
-} |
- |
-GDataOperationRegistry::Operation::~Operation() { |
- DCHECK(progress_status_.transfer_state == OPERATION_COMPLETED || |
- progress_status_.transfer_state == OPERATION_SUSPENDED || |
- progress_status_.transfer_state == OPERATION_FAILED); |
-} |
- |
-void GDataOperationRegistry::Operation::Cancel() { |
- DoCancel(); |
- NotifyFinish(OPERATION_FAILED); |
-} |
- |
-void GDataOperationRegistry::Operation::NotifyStart() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- // Some operations may be restarted. Report only the first "start". |
- if (progress_status_.transfer_state == OPERATION_NOT_STARTED) { |
- progress_status_.transfer_state = OPERATION_STARTED; |
- progress_status_.start_time = base::Time::Now(); |
- registry_->OnOperationStart(this, &progress_status_.operation_id); |
- } |
-} |
- |
-void GDataOperationRegistry::Operation::NotifyProgress( |
- int64 current, int64 total) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(progress_status_.transfer_state >= OPERATION_STARTED); |
- progress_status_.transfer_state = OPERATION_IN_PROGRESS; |
- progress_status_.progress_current = current; |
- progress_status_.progress_total = total; |
- registry_->OnOperationProgress(progress_status().operation_id); |
-} |
- |
-void GDataOperationRegistry::Operation::NotifyFinish( |
- OperationTransferState status) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(progress_status_.transfer_state >= OPERATION_STARTED); |
- DCHECK(status == OPERATION_COMPLETED || status == OPERATION_FAILED); |
- progress_status_.transfer_state = status; |
- registry_->OnOperationFinish(progress_status().operation_id); |
-} |
- |
-void GDataOperationRegistry::Operation::NotifySuspend() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- DCHECK(progress_status_.transfer_state >= OPERATION_STARTED); |
- progress_status_.transfer_state = OPERATION_SUSPENDED; |
- registry_->OnOperationSuspend(progress_status().operation_id); |
-} |
- |
-void GDataOperationRegistry::Operation::NotifyResume() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- if (progress_status_.transfer_state == OPERATION_NOT_STARTED) { |
- progress_status_.transfer_state = OPERATION_IN_PROGRESS; |
- registry_->OnOperationResume(this, &progress_status_); |
- } |
-} |
- |
-void GDataOperationRegistry::Operation::NotifyAuthFailed() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- registry_->OnOperationAuthFailed(); |
-} |
- |
-GDataOperationRegistry::GDataOperationRegistry() |
- : do_notification_frequency_control_(true) { |
- in_flight_operations_.set_check_on_null_data(true); |
-} |
- |
-GDataOperationRegistry::~GDataOperationRegistry() { |
- DCHECK(in_flight_operations_.IsEmpty()); |
-} |
- |
-void GDataOperationRegistry::AddObserver(Observer* observer) { |
- observer_list_.AddObserver(observer); |
-} |
- |
-void GDataOperationRegistry::RemoveObserver(Observer* observer) { |
- observer_list_.RemoveObserver(observer); |
-} |
- |
-void GDataOperationRegistry::DisableNotificationFrequencyControlForTest() { |
- do_notification_frequency_control_ = false; |
-} |
- |
-void GDataOperationRegistry::CancelAll() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- for (OperationIDMap::iterator iter(&in_flight_operations_); |
- !iter.IsAtEnd(); |
- iter.Advance()) { |
- Operation* operation = iter.GetCurrentValue(); |
- operation->Cancel(); |
- // Cancel() may immediately trigger OnOperationFinish and remove the |
- // operation from the map, but IDMap is designed to be safe on such remove |
- // while iteration. |
- } |
-} |
- |
-bool GDataOperationRegistry::CancelForFilePath(const FilePath& file_path) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- for (OperationIDMap::iterator iter(&in_flight_operations_); |
- !iter.IsAtEnd(); |
- iter.Advance()) { |
- Operation* operation = iter.GetCurrentValue(); |
- if (operation->progress_status().file_path == file_path) { |
- operation->Cancel(); |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-void GDataOperationRegistry::OnOperationStart( |
- GDataOperationRegistry::Operation* operation, |
- OperationID* id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- *id = in_flight_operations_.Add(operation); |
- DVLOG(1) << "GDataOperation[" << *id << "] started."; |
- if (IsFileTransferOperation(operation)) |
- NotifyStatusToObservers(); |
-} |
- |
-void GDataOperationRegistry::OnOperationProgress(OperationID id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- Operation* operation = in_flight_operations_.Lookup(id); |
- DCHECK(operation); |
- |
- DVLOG(1) << "GDataOperation[" << id << "] " |
- << operation->progress_status().DebugString(); |
- if (IsFileTransferOperation(operation)) |
- NotifyStatusToObservers(); |
-} |
- |
-void GDataOperationRegistry::OnOperationFinish(OperationID id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- Operation* operation = in_flight_operations_.Lookup(id); |
- DCHECK(operation); |
- |
- DVLOG(1) << "GDataOperation[" << id << "] finished."; |
- if (IsFileTransferOperation(operation)) |
- NotifyStatusToObservers(); |
- in_flight_operations_.Remove(id); |
-} |
- |
-void GDataOperationRegistry::OnOperationResume( |
- GDataOperationRegistry::Operation* operation, |
- GDataOperationRegistry::ProgressStatus* new_status) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- // Find the corresponding suspended task. |
- Operation* suspended = NULL; |
- for (OperationIDMap::iterator iter(&in_flight_operations_); |
- !iter.IsAtEnd(); |
- iter.Advance()) { |
- Operation* in_flight_operation = iter.GetCurrentValue(); |
- const ProgressStatus& status = in_flight_operation->progress_status(); |
- if (status.transfer_state == OPERATION_SUSPENDED && |
- status.file_path == operation->progress_status().file_path) { |
- suspended = in_flight_operation; |
- break; |
- } |
- } |
- DCHECK(suspended); |
- |
- // Copy the progress status. |
- const ProgressStatus& old_status = suspended->progress_status(); |
- OperationID old_id = old_status.operation_id; |
- |
- new_status->progress_current = old_status.progress_current; |
- new_status->progress_total = old_status.progress_total; |
- new_status->start_time = old_status.start_time; |
- |
- // Remove the old one and initiate the new operation. |
- in_flight_operations_.Remove(old_id); |
- new_status->operation_id = in_flight_operations_.Add(operation); |
- DVLOG(1) << "GDataOperation[" << old_id << " -> " << |
- new_status->operation_id << "] resumed."; |
- if (IsFileTransferOperation(operation)) |
- NotifyStatusToObservers(); |
-} |
- |
-void GDataOperationRegistry::OnOperationSuspend(OperationID id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- Operation* operation = in_flight_operations_.Lookup(id); |
- DCHECK(operation); |
- |
- DVLOG(1) << "GDataOperation[" << id << "] suspended."; |
- if (IsFileTransferOperation(operation)) |
- NotifyStatusToObservers(); |
-} |
- |
-void GDataOperationRegistry::OnOperationAuthFailed() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- DVLOG(1) << "GDataOperation authentication failed."; |
- FOR_EACH_OBSERVER(Observer, observer_list_, OnAuthenticationFailed()); |
-} |
- |
-bool GDataOperationRegistry::IsFileTransferOperation( |
- const Operation* operation) const { |
- OperationType type = operation->progress_status().operation_type; |
- return type == OPERATION_UPLOAD || type == OPERATION_DOWNLOAD; |
-} |
- |
-GDataOperationRegistry::ProgressStatusList |
-GDataOperationRegistry::GetProgressStatusList() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
- |
- ProgressStatusList status_list; |
- for (OperationIDMap::const_iterator iter(&in_flight_operations_); |
- !iter.IsAtEnd(); |
- iter.Advance()) { |
- const Operation* operation = iter.GetCurrentValue(); |
- if (IsFileTransferOperation(operation)) |
- status_list.push_back(operation->progress_status()); |
- } |
- return status_list; |
-} |
- |
-bool GDataOperationRegistry::ShouldNotifyStatusNow( |
- const ProgressStatusList& list) { |
- if (!do_notification_frequency_control_) |
- return true; |
- |
- base::Time now = base::Time::Now(); |
- |
- // If it is a first event, or some time abnormality is detected, we should |
- // not skip this notification. |
- if (last_notification_.is_null() || now < last_notification_) { |
- last_notification_ = now; |
- return true; |
- } |
- |
- // If sufficiently long time has elapsed since the previous event, we should |
- // not skip this notification. |
- if ((now - last_notification_).InMilliseconds() >= |
- kNotificationFrequencyInMilliseconds) { |
- last_notification_ = now; |
- return true; |
- } |
- |
- // If important events (OPERATION_STARTED, COMPLETED, or FAILED) are there, |
- // we should not skip this notification. |
- for (size_t i = 0; i < list.size(); ++i) { |
- if (list[i].transfer_state != OPERATION_IN_PROGRESS) { |
- last_notification_ = now; |
- return true; |
- } |
- } |
- |
- // Otherwise we can skip it. |
- return false; |
-} |
- |
-void GDataOperationRegistry::NotifyStatusToObservers() { |
- ProgressStatusList list(GetProgressStatusList()); |
- if (ShouldNotifyStatusNow(list)) |
- FOR_EACH_OBSERVER(Observer, observer_list_, OnProgressUpdate(list)); |
-} |
- |
-} // namespace gdata |