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

Side by Side Diff: chrome/browser/google_apis/operation_registry.cc

Issue 10939011: Reland "Revert 156830 - drive: Stop exposing operation_registry() from DriveServiceInterface" (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 3 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 (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/google_apis/operation_registry.h" 5 #include "chrome/browser/google_apis/operation_registry.h"
6 6
7 #include "base/string_number_conversions.h" 7 #include "base/string_number_conversions.h"
8 #include "content/public/browser/browser_thread.h" 8 #include "content/public/browser/browser_thread.h"
9 9
10 using content::BrowserThread; 10 using content::BrowserThread;
11 11
12 namespace { 12 namespace {
13 13
14 const int64 kNotificationFrequencyInMilliseconds = 1000; 14 const int64 kNotificationFrequencyInMilliseconds = 1000;
15 15
16 } // namespace 16 } // namespace
17 17
18 namespace gdata { 18 namespace gdata {
19 19
20 // static 20 std::string OperationTypeToString(OperationType type) {
21 std::string OperationRegistry::OperationTypeToString(OperationType type) {
22 switch (type) { 21 switch (type) {
23 case OPERATION_UPLOAD: return "upload"; 22 case OPERATION_UPLOAD: return "upload";
24 case OPERATION_DOWNLOAD: return "download"; 23 case OPERATION_DOWNLOAD: return "download";
25 case OPERATION_OTHER: return "other"; 24 case OPERATION_OTHER: return "other";
26 } 25 }
27 NOTREACHED(); 26 NOTREACHED();
28 return "unknown_transfer_state"; 27 return "unknown_transfer_state";
29 } 28 }
30 29
31 // static 30 std::string OperationTransferStateToString(OperationTransferState state) {
32 std::string OperationRegistry::OperationTransferStateToString(
33 OperationTransferState state) {
34 switch (state) { 31 switch (state) {
35 case OPERATION_NOT_STARTED: return "not_started"; 32 case OPERATION_NOT_STARTED: return "not_started";
36 case OPERATION_STARTED: return "started"; 33 case OPERATION_STARTED: return "started";
37 case OPERATION_IN_PROGRESS: return "in_progress"; 34 case OPERATION_IN_PROGRESS: return "in_progress";
38 case OPERATION_COMPLETED: return "completed"; 35 case OPERATION_COMPLETED: return "completed";
39 case OPERATION_FAILED: return "failed"; 36 case OPERATION_FAILED: return "failed";
40 // Suspended state is opaque to users and looks as same as "in_progress". 37 // Suspended state is opaque to users and looks as same as "in_progress".
41 case OPERATION_SUSPENDED: return "in_progress"; 38 case OPERATION_SUSPENDED: return "in_progress";
42 } 39 }
43 NOTREACHED(); 40 NOTREACHED();
44 return "unknown_transfer_state"; 41 return "unknown_transfer_state";
45 } 42 }
46 43
47 OperationRegistry::ProgressStatus::ProgressStatus(OperationType type, 44 OperationProgressStatus::OperationProgressStatus(OperationType type,
48 const FilePath& path) 45 const FilePath& path)
49 : operation_id(-1), 46 : operation_id(-1),
50 operation_type(type), 47 operation_type(type),
51 file_path(path), 48 file_path(path),
52 transfer_state(OPERATION_NOT_STARTED), 49 transfer_state(OPERATION_NOT_STARTED),
53 progress_current(0), 50 progress_current(0),
54 progress_total(-1) { 51 progress_total(-1) {
55 } 52 }
56 53
57 std::string OperationRegistry::ProgressStatus::DebugString() const { 54 std::string OperationProgressStatus::DebugString() const {
58 std::string str; 55 std::string str;
59 str += "id="; 56 str += "id=";
60 str += base::IntToString(operation_id); 57 str += base::IntToString(operation_id);
61 str += " type="; 58 str += " type=";
62 str += OperationTypeToString(operation_type); 59 str += OperationTypeToString(operation_type);
63 str += " path="; 60 str += " path=";
64 str += file_path.AsUTF8Unsafe(); 61 str += file_path.AsUTF8Unsafe();
65 str += " state="; 62 str += " state=";
66 str += OperationTransferStateToString(transfer_state); 63 str += OperationTransferStateToString(transfer_state);
67 str += " progress="; 64 str += " progress=";
68 str += base::Int64ToString(progress_current); 65 str += base::Int64ToString(progress_current);
69 str += "/"; 66 str += "/";
70 str += base::Int64ToString(progress_total); 67 str += base::Int64ToString(progress_total);
71 return str; 68 return str;
72 } 69 }
73 70
74 OperationRegistry::Operation::Operation(OperationRegistry* registry) 71 OperationRegistry::Operation::Operation(OperationRegistry* registry)
75 : registry_(registry), 72 : registry_(registry),
76 progress_status_(OperationRegistry::OPERATION_OTHER, FilePath()) { 73 progress_status_(OPERATION_OTHER, FilePath()) {
77 } 74 }
78 75
79 OperationRegistry::Operation::Operation(OperationRegistry* registry, 76 OperationRegistry::Operation::Operation(OperationRegistry* registry,
80 OperationType type, 77 OperationType type,
81 const FilePath& path) 78 const FilePath& path)
82 : registry_(registry), 79 : registry_(registry),
83 progress_status_(type, path) { 80 progress_status_(type, path) {
84 } 81 }
85 82
86 OperationRegistry::Operation::~Operation() { 83 OperationRegistry::Operation::~Operation() {
87 DCHECK(progress_status_.transfer_state == OPERATION_COMPLETED || 84 DCHECK(progress_status_.transfer_state == OPERATION_COMPLETED ||
88 progress_status_.transfer_state == OPERATION_SUSPENDED || 85 progress_status_.transfer_state == OPERATION_SUSPENDED ||
89 progress_status_.transfer_state == OPERATION_FAILED); 86 progress_status_.transfer_state == OPERATION_FAILED);
90 } 87 }
91 88
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 DCHECK(operation); 220 DCHECK(operation);
224 221
225 DVLOG(1) << "GDataOperation[" << id << "] finished."; 222 DVLOG(1) << "GDataOperation[" << id << "] finished.";
226 if (IsFileTransferOperation(operation)) 223 if (IsFileTransferOperation(operation))
227 NotifyStatusToObservers(); 224 NotifyStatusToObservers();
228 in_flight_operations_.Remove(id); 225 in_flight_operations_.Remove(id);
229 } 226 }
230 227
231 void OperationRegistry::OnOperationResume( 228 void OperationRegistry::OnOperationResume(
232 OperationRegistry::Operation* operation, 229 OperationRegistry::Operation* operation,
233 OperationRegistry::ProgressStatus* new_status) { 230 OperationProgressStatus* new_status) {
234 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 231 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
235 232
236 // Find the corresponding suspended task. 233 // Find the corresponding suspended task.
237 Operation* suspended = NULL; 234 Operation* suspended = NULL;
238 for (OperationIDMap::iterator iter(&in_flight_operations_); 235 for (OperationIDMap::iterator iter(&in_flight_operations_);
239 !iter.IsAtEnd(); 236 !iter.IsAtEnd();
240 iter.Advance()) { 237 iter.Advance()) {
241 Operation* in_flight_operation = iter.GetCurrentValue(); 238 Operation* in_flight_operation = iter.GetCurrentValue();
242 const ProgressStatus& status = in_flight_operation->progress_status(); 239 const OperationProgressStatus& status =
240 in_flight_operation->progress_status();
243 if (status.transfer_state == OPERATION_SUSPENDED && 241 if (status.transfer_state == OPERATION_SUSPENDED &&
244 status.file_path == operation->progress_status().file_path) { 242 status.file_path == operation->progress_status().file_path) {
245 suspended = in_flight_operation; 243 suspended = in_flight_operation;
246 break; 244 break;
247 } 245 }
248 } 246 }
249 DCHECK(suspended); 247 DCHECK(suspended);
250 248
251 // Copy the progress status. 249 // Copy the progress status.
252 const ProgressStatus& old_status = suspended->progress_status(); 250 const OperationProgressStatus& old_status = suspended->progress_status();
253 OperationID old_id = old_status.operation_id; 251 OperationID old_id = old_status.operation_id;
254 252
255 new_status->progress_current = old_status.progress_current; 253 new_status->progress_current = old_status.progress_current;
256 new_status->progress_total = old_status.progress_total; 254 new_status->progress_total = old_status.progress_total;
257 new_status->start_time = old_status.start_time; 255 new_status->start_time = old_status.start_time;
258 256
259 // Remove the old one and initiate the new operation. 257 // Remove the old one and initiate the new operation.
260 in_flight_operations_.Remove(old_id); 258 in_flight_operations_.Remove(old_id);
261 new_status->operation_id = in_flight_operations_.Add(operation); 259 new_status->operation_id = in_flight_operations_.Add(operation);
262 DVLOG(1) << "GDataOperation[" << old_id << " -> " << 260 DVLOG(1) << "GDataOperation[" << old_id << " -> " <<
(...skipping 19 matching lines...) Expand all
282 DVLOG(1) << "GDataOperation authentication failed."; 280 DVLOG(1) << "GDataOperation authentication failed.";
283 FOR_EACH_OBSERVER(Observer, observer_list_, OnAuthenticationFailed()); 281 FOR_EACH_OBSERVER(Observer, observer_list_, OnAuthenticationFailed());
284 } 282 }
285 283
286 bool OperationRegistry::IsFileTransferOperation( 284 bool OperationRegistry::IsFileTransferOperation(
287 const Operation* operation) const { 285 const Operation* operation) const {
288 OperationType type = operation->progress_status().operation_type; 286 OperationType type = operation->progress_status().operation_type;
289 return type == OPERATION_UPLOAD || type == OPERATION_DOWNLOAD; 287 return type == OPERATION_UPLOAD || type == OPERATION_DOWNLOAD;
290 } 288 }
291 289
292 OperationRegistry::ProgressStatusList 290 OperationProgressStatusList OperationRegistry::GetProgressStatusList() {
293 OperationRegistry::GetProgressStatusList() {
294 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 291 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
295 292
296 ProgressStatusList status_list; 293 OperationProgressStatusList status_list;
297 for (OperationIDMap::const_iterator iter(&in_flight_operations_); 294 for (OperationIDMap::const_iterator iter(&in_flight_operations_);
298 !iter.IsAtEnd(); 295 !iter.IsAtEnd();
299 iter.Advance()) { 296 iter.Advance()) {
300 const Operation* operation = iter.GetCurrentValue(); 297 const Operation* operation = iter.GetCurrentValue();
301 if (IsFileTransferOperation(operation)) 298 if (IsFileTransferOperation(operation))
302 status_list.push_back(operation->progress_status()); 299 status_list.push_back(operation->progress_status());
303 } 300 }
304 return status_list; 301 return status_list;
305 } 302 }
306 303
307 bool OperationRegistry::ShouldNotifyStatusNow( 304 bool OperationRegistry::ShouldNotifyStatusNow(
308 const ProgressStatusList& list) { 305 const OperationProgressStatusList& list) {
309 if (!do_notification_frequency_control_) 306 if (!do_notification_frequency_control_)
310 return true; 307 return true;
311 308
312 base::Time now = base::Time::Now(); 309 base::Time now = base::Time::Now();
313 310
314 // If it is a first event, or some time abnormality is detected, we should 311 // If it is a first event, or some time abnormality is detected, we should
315 // not skip this notification. 312 // not skip this notification.
316 if (last_notification_.is_null() || now < last_notification_) { 313 if (last_notification_.is_null() || now < last_notification_) {
317 last_notification_ = now; 314 last_notification_ = now;
318 return true; 315 return true;
(...skipping 14 matching lines...) Expand all
333 last_notification_ = now; 330 last_notification_ = now;
334 return true; 331 return true;
335 } 332 }
336 } 333 }
337 334
338 // Otherwise we can skip it. 335 // Otherwise we can skip it.
339 return false; 336 return false;
340 } 337 }
341 338
342 void OperationRegistry::NotifyStatusToObservers() { 339 void OperationRegistry::NotifyStatusToObservers() {
343 ProgressStatusList list(GetProgressStatusList()); 340 OperationProgressStatusList list(GetProgressStatusList());
344 if (ShouldNotifyStatusNow(list)) 341 if (ShouldNotifyStatusNow(list))
345 FOR_EACH_OBSERVER(Observer, observer_list_, OnProgressUpdate(list)); 342 FOR_EACH_OBSERVER(Observer, observer_list_, OnProgressUpdate(list));
346 } 343 }
347 344
348 } // namespace gdata 345 } // namespace gdata
OLDNEW
« no previous file with comments | « chrome/browser/google_apis/operation_registry.h ('k') | chrome/browser/google_apis/operation_registry_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698