touch_operation.cc revision 3551c9c881056c480085172ff9840cab31610854
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/chromeos/drive/file_system/touch_operation.h"
6
7#include "base/bind.h"
8#include "base/files/file_path.h"
9#include "base/sequenced_task_runner.h"
10#include "base/time/time.h"
11#include "chrome/browser/chromeos/drive/file_errors.h"
12#include "chrome/browser/chromeos/drive/file_system/operation_observer.h"
13#include "chrome/browser/chromeos/drive/file_system_util.h"
14#include "chrome/browser/chromeos/drive/job_scheduler.h"
15#include "chrome/browser/chromeos/drive/resource_entry_conversion.h"
16#include "chrome/browser/chromeos/drive/resource_metadata.h"
17#include "content/public/browser/browser_thread.h"
18
19using content::BrowserThread;
20
21namespace drive {
22namespace file_system {
23
24TouchOperation::TouchOperation(base::SequencedTaskRunner* blocking_task_runner,
25                               OperationObserver* observer,
26                               JobScheduler* scheduler,
27                               internal::ResourceMetadata* metadata)
28    : blocking_task_runner_(blocking_task_runner),
29      observer_(observer),
30      scheduler_(scheduler),
31      metadata_(metadata),
32      weak_ptr_factory_(this) {
33}
34
35TouchOperation::~TouchOperation() {
36}
37
38void TouchOperation::TouchFile(const base::FilePath& file_path,
39                               const base::Time& last_access_time,
40                               const base::Time& last_modified_time,
41                               const FileOperationCallback& callback) {
42  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
43  DCHECK(!callback.is_null());
44
45  ResourceEntry* entry = new ResourceEntry;
46  base::PostTaskAndReplyWithResult(
47      blocking_task_runner_.get(),
48      FROM_HERE,
49      base::Bind(&internal::ResourceMetadata::GetResourceEntryByPath,
50                 base::Unretained(metadata_),
51                 file_path,
52                 entry),
53      base::Bind(&TouchOperation::TouchFileAfterGetResourceEntry,
54                 weak_ptr_factory_.GetWeakPtr(),
55                 file_path,
56                 last_access_time,
57                 last_modified_time,
58                 callback,
59                 base::Owned(entry)));
60}
61
62void TouchOperation::TouchFileAfterGetResourceEntry(
63    const base::FilePath& file_path,
64    const base::Time& last_access_time,
65    const base::Time& last_modified_time,
66    const FileOperationCallback& callback,
67    ResourceEntry* entry,
68    FileError error) {
69  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
70  DCHECK(!callback.is_null());
71  DCHECK(entry);
72
73  if (error != FILE_ERROR_OK) {
74    callback.Run(error);
75    return;
76  }
77
78  // Note: |last_modified_time| is mapped to modifiedDate, |last_access_time|
79  // is mapped to lastViewedByMeDate. See also ConvertToResourceEntry().
80  scheduler_->TouchResource(
81      entry->resource_id(), last_modified_time, last_access_time,
82      base::Bind(&TouchOperation::TouchFileAfterServerTimeStampUpdated,
83                 weak_ptr_factory_.GetWeakPtr(),
84                 file_path, callback));
85}
86
87void TouchOperation::TouchFileAfterServerTimeStampUpdated(
88    const base::FilePath& file_path,
89    const FileOperationCallback& callback,
90    google_apis::GDataErrorCode gdata_error,
91    scoped_ptr<google_apis::ResourceEntry> resource_entry) {
92  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
93  DCHECK(!callback.is_null());
94
95  FileError error = GDataToFileError(gdata_error);
96  if (error != FILE_ERROR_OK) {
97    callback.Run(error);
98    return;
99  }
100
101  DCHECK(resource_entry);
102  ResourceEntry entry;
103  if (!ConvertToResourceEntry(*resource_entry, &entry)) {
104    callback.Run(FILE_ERROR_NOT_A_FILE);
105    return;
106  }
107
108  base::PostTaskAndReplyWithResult(
109      blocking_task_runner_.get(),
110      FROM_HERE,
111      base::Bind(&internal::ResourceMetadata::RefreshEntry,
112                 base::Unretained(metadata_),
113                 entry.resource_id(),
114                 entry),
115      base::Bind(&TouchOperation::TouchFileAfterRefreshMetadata,
116                 weak_ptr_factory_.GetWeakPtr(),
117                 file_path,
118                 callback));
119}
120
121void TouchOperation::TouchFileAfterRefreshMetadata(
122    const base::FilePath& file_path,
123    const FileOperationCallback& callback,
124    FileError error) {
125  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
126  DCHECK(!callback.is_null());
127
128  if (error == FILE_ERROR_OK)
129    observer_->OnDirectoryChangedByOperation(file_path.DirName());
130
131  callback.Run(error);
132}
133
134}  // namespace file_system
135}  // namespace drive
136