Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/chromeos/drive/drive_scheduler.h" | 5 #include "chrome/browser/chromeos/drive/drive_scheduler.h" |
| 6 | 6 |
| 7 #include <math.h> | 7 #include <math.h> |
| 8 | 8 |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/rand_util.h" | 10 #include "base/rand_util.h" |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 27 DriveScheduler::JobInfo::JobInfo(JobType in_job_type, FilePath in_file_path) | 27 DriveScheduler::JobInfo::JobInfo(JobType in_job_type, FilePath in_file_path) |
| 28 : job_type(in_job_type), | 28 : job_type(in_job_type), |
| 29 job_id(-1), | 29 job_id(-1), |
| 30 completed_bytes(0), | 30 completed_bytes(0), |
| 31 total_bytes(0), | 31 total_bytes(0), |
| 32 file_path(in_file_path), | 32 file_path(in_file_path), |
| 33 state(STATE_NONE) { | 33 state(STATE_NONE) { |
| 34 } | 34 } |
| 35 | 35 |
| 36 DriveScheduler::QueueEntry::QueueEntry(JobType in_job_type, | 36 DriveScheduler::QueueEntry::QueueEntry(JobType in_job_type, |
| 37 FilePath in_file_path) | 37 FilePath in_file_path, |
| 38 : job_info(TYPE_REMOVE, in_file_path) { | 38 FileOperationCallback in_callback) |
| 39 : job_info(in_job_type, in_file_path), | |
| 40 callback(in_callback), | |
| 41 is_recursive(false) { | |
| 39 } | 42 } |
| 40 | 43 |
| 41 DriveScheduler::QueueEntry::~QueueEntry() { | 44 DriveScheduler::QueueEntry::~QueueEntry() { |
| 42 } | 45 } |
| 43 | 46 |
| 44 DriveScheduler::RemoveJobPrivate::RemoveJobPrivate( | |
| 45 bool in_is_recursive, | |
| 46 FileOperationCallback in_callback) | |
| 47 : is_recursive(in_is_recursive), | |
| 48 callback(in_callback) { | |
| 49 } | |
| 50 | |
| 51 DriveScheduler::RemoveJobPrivate::~RemoveJobPrivate() { | |
| 52 } | |
| 53 | |
| 54 DriveScheduler::DriveScheduler(Profile* profile, | 47 DriveScheduler::DriveScheduler(Profile* profile, |
| 55 file_system::DriveOperations* drive_operations) | 48 file_system::DriveOperations* drive_operations) |
| 56 : job_loop_is_running_(false), | 49 : job_loop_is_running_(false), |
| 57 next_job_id_(0), | 50 next_job_id_(0), |
| 58 throttle_count_(0), | 51 throttle_count_(0), |
| 59 disable_throttling_(false), | 52 disable_throttling_(false), |
| 60 drive_operations_(drive_operations), | 53 drive_operations_(drive_operations), |
| 61 profile_(profile), | 54 profile_(profile), |
| 62 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | 55 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
| 63 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 56 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 64 } | 57 } |
| 65 | 58 |
| 66 DriveScheduler::~DriveScheduler() { | 59 DriveScheduler::~DriveScheduler() { |
| 67 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 60 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 68 | 61 |
| 69 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); | 62 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); |
| 70 } | 63 } |
| 71 | 64 |
| 72 void DriveScheduler::Initialize() { | 65 void DriveScheduler::Initialize() { |
| 73 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 66 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 74 | 67 |
| 75 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); | 68 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); |
| 76 } | 69 } |
| 77 | 70 |
| 71 void DriveScheduler::Move(const FilePath& src_file_path, | |
| 72 const FilePath& dest_file_path, | |
| 73 const FileOperationCallback& callback) { | |
| 74 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 75 | |
| 76 QueueEntry* new_job = new QueueEntry(TYPE_MOVE, src_file_path, callback); | |
|
satorux1
2012/10/16 04:34:01
This made me think how the object is deleted. This
Zachary Kuznia
2012/10/16 04:59:10
Done.
| |
| 77 new_job->dest_file_path = dest_file_path; | |
| 78 | |
| 79 QueueJob(new_job); | |
| 80 | |
| 81 StartJobLoop(); | |
| 82 } | |
| 78 | 83 |
| 79 void DriveScheduler::Remove(const FilePath& file_path, | 84 void DriveScheduler::Remove(const FilePath& file_path, |
| 80 bool is_recursive, | 85 bool is_recursive, |
| 81 const FileOperationCallback& callback) { | 86 const FileOperationCallback& callback) { |
| 82 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 87 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 83 | 88 |
| 84 QueueEntry* new_job = new QueueEntry(TYPE_REMOVE, file_path); | 89 QueueEntry* new_job = new QueueEntry(TYPE_REMOVE, file_path, callback); |
|
satorux1
2012/10/16 04:34:01
ditto.
Zachary Kuznia
2012/10/16 04:59:10
Done.
| |
| 85 new_job->remove_private.reset(new RemoveJobPrivate(is_recursive, callback)); | 90 new_job->is_recursive = is_recursive; |
| 86 | 91 |
| 87 QueueJob(new_job); | 92 QueueJob(new_job); |
| 88 | 93 |
| 89 StartJobLoop(); | 94 StartJobLoop(); |
| 90 } | 95 } |
| 91 | 96 |
| 92 int DriveScheduler::QueueJob(QueueEntry* job) { | 97 int DriveScheduler::QueueJob(QueueEntry* job) { |
| 93 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 98 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 94 | 99 |
| 95 int job_id = next_job_id_; | 100 int job_id = next_job_id_; |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 125 int job_id = queue_.front(); | 130 int job_id = queue_.front(); |
| 126 queue_.pop_front(); | 131 queue_.pop_front(); |
| 127 | 132 |
| 128 JobMap::iterator job_iter = job_info_.find(job_id); | 133 JobMap::iterator job_iter = job_info_.find(job_id); |
| 129 DCHECK(job_iter != job_info_.end()); | 134 DCHECK(job_iter != job_info_.end()); |
| 130 | 135 |
| 131 JobInfo& job_info = job_iter->second->job_info; | 136 JobInfo& job_info = job_iter->second->job_info; |
| 132 job_info.state = STATE_RUNNING; | 137 job_info.state = STATE_RUNNING; |
| 133 | 138 |
| 134 switch (job_info.job_type) { | 139 switch (job_info.job_type) { |
| 135 case TYPE_REMOVE: { | 140 case TYPE_MOVE: { |
| 136 DCHECK(job_iter->second->remove_private.get()); | 141 drive_operations_->Move( |
| 137 | |
| 138 drive_operations_->Remove( | |
| 139 job_info.file_path, | 142 job_info.file_path, |
| 140 job_iter->second->remove_private->is_recursive, | 143 job_iter->second->dest_file_path, |
| 141 base::Bind(&DriveScheduler::OnRemoveDone, | 144 base::Bind(&DriveScheduler::OnJobDone, |
| 142 weak_ptr_factory_.GetWeakPtr(), | 145 weak_ptr_factory_.GetWeakPtr(), |
| 143 job_id)); | 146 job_id)); |
| 144 } | 147 } |
| 148 break; | |
| 149 | |
| 150 case TYPE_REMOVE: { | |
| 151 drive_operations_->Remove( | |
| 152 job_info.file_path, | |
| 153 job_iter->second->is_recursive, | |
| 154 base::Bind(&DriveScheduler::OnJobDone, | |
| 155 weak_ptr_factory_.GetWeakPtr(), | |
| 156 job_id)); | |
| 157 } | |
| 145 break; | 158 break; |
|
satorux1
2012/10/16 04:34:01
Please add:
default:
NOTREACHED() << "Unknown j
Zachary Kuznia
2012/10/16 04:59:10
By leaving out a default case, the compiler will c
satorux1
2012/10/16 05:10:37
I see. Then please add some comment about it.
Zachary Kuznia
2012/11/07 05:46:17
Done.
| |
| 146 } | 159 } |
| 147 | 160 |
| 148 } | 161 } |
| 149 | 162 |
| 150 bool DriveScheduler::ShouldStopJobLoop() { | 163 bool DriveScheduler::ShouldStopJobLoop() { |
| 151 // Should stop if the gdata feature was disabled while running the fetch | 164 // Should stop if the gdata feature was disabled while running the fetch |
| 152 // loop. | 165 // loop. |
| 153 if (profile_->GetPrefs()->GetBoolean(prefs::kDisableGData)) | 166 if (profile_->GetPrefs()->GetBoolean(prefs::kDisableGData)) |
| 154 return true; | 167 return true; |
| 155 | 168 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 190 DCHECK(posted); | 203 DCHECK(posted); |
| 191 } | 204 } |
| 192 | 205 |
| 193 void DriveScheduler::ResetThrottleAndContinueJobLoop() { | 206 void DriveScheduler::ResetThrottleAndContinueJobLoop() { |
| 194 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 207 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 195 | 208 |
| 196 throttle_count_ = 0; | 209 throttle_count_ = 0; |
| 197 DoJobLoop(); | 210 DoJobLoop(); |
| 198 } | 211 } |
| 199 | 212 |
| 200 void DriveScheduler::OnRemoveDone(int job_id, DriveFileError error) { | 213 void DriveScheduler::OnJobDone(int job_id, DriveFileError error) { |
| 201 JobMap::iterator job_iter = job_info_.find(job_id); | 214 JobMap::iterator job_iter = job_info_.find(job_id); |
| 202 DCHECK(job_iter != job_info_.end()); | 215 DCHECK(job_iter != job_info_.end()); |
| 203 | 216 |
| 204 // Retry, depending on the error. | 217 // Retry, depending on the error. |
| 205 if (error == DRIVE_FILE_ERROR_THROTTLED || | 218 if (error == DRIVE_FILE_ERROR_THROTTLED || |
| 206 error == DRIVE_FILE_ERROR_NO_CONNECTION) { | 219 error == DRIVE_FILE_ERROR_NO_CONNECTION) { |
| 207 job_iter->second->job_info.state = STATE_RETRY; | 220 job_iter->second->job_info.state = STATE_RETRY; |
| 208 | 221 |
| 209 // Requeue the job. | 222 // Requeue the job. |
| 210 queue_.push_back(job_id); | 223 queue_.push_back(job_id); |
| 211 ThrottleAndContinueJobLoop(); | 224 ThrottleAndContinueJobLoop(); |
| 212 } else { | 225 } else { |
| 213 DCHECK(job_iter->second->remove_private.get()); | |
| 214 | |
| 215 // Handle the callback. | 226 // Handle the callback. |
| 216 if (!job_iter->second->remove_private->callback.is_null()) { | 227 if (!job_iter->second->callback.is_null()) { |
| 217 MessageLoop::current()->PostTask(FROM_HERE, | 228 MessageLoop::current()->PostTask(FROM_HERE, |
| 218 base::Bind(job_iter->second->remove_private->callback, error)); | 229 base::Bind(job_iter->second->callback, error)); |
| 219 } | 230 } |
| 220 | 231 |
| 221 // Delete the job. | 232 // Delete the job. |
| 222 job_info_.erase(job_id); | 233 job_info_.erase(job_id); |
| 223 ResetThrottleAndContinueJobLoop(); | 234 ResetThrottleAndContinueJobLoop(); |
| 224 } | 235 } |
| 225 } | 236 } |
| 226 | 237 |
| 227 void DriveScheduler::OnConnectionTypeChanged( | 238 void DriveScheduler::OnConnectionTypeChanged( |
| 228 net::NetworkChangeNotifier::ConnectionType type) { | 239 net::NetworkChangeNotifier::ConnectionType type) { |
| 229 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 240 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 230 | 241 |
| 231 // Resume the job loop if the network is back online. Note that we don't | 242 // Resume the job loop if the network is back online. Note that we don't |
| 232 // need to check the type of the network as it will be checked in | 243 // need to check the type of the network as it will be checked in |
| 233 // ShouldStopJobLoop() as soon as the loop is resumed. | 244 // ShouldStopJobLoop() as soon as the loop is resumed. |
| 234 if (!net::NetworkChangeNotifier::IsOffline()) | 245 if (!net::NetworkChangeNotifier::IsOffline()) |
| 235 StartJobLoop(); | 246 StartJobLoop(); |
| 236 } | 247 } |
| 237 | 248 |
| 238 } // namespace drive | 249 } // namespace drive |
| OLD | NEW |