touch_operation.cc revision 868fa2fe829687343ffae624259930155e16dbd8
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.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_,
48      FROM_HERE,
49      base::Bind(&internal::ResourceMetadata::GetResourceEntryByPath,
50                 base::Unretained(metadata_), file_path, entry),
51      base::Bind(&TouchOperation::TouchFileAfterGetResourceEntry,
52                 weak_ptr_factory_.GetWeakPtr(),
53                 file_path, last_access_time, last_modified_time, callback,
54                 base::Owned(entry)));
55}
56
57void TouchOperation::TouchFileAfterGetResourceEntry(
58    const base::FilePath& file_path,
59    const base::Time& last_access_time,
60    const base::Time& last_modified_time,
61    const FileOperationCallback& callback,
62    ResourceEntry* entry,
63    FileError error) {
64  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
65  DCHECK(!callback.is_null());
66  DCHECK(entry);
67
68  if (error != FILE_ERROR_OK) {
69    callback.Run(error);
70    return;
71  }
72
73  // Note: |last_modified_time| is mapped to modifiedDate, |last_access_time|
74  // is mapped to lastViewedByMeDate. See also ConvertToResourceEntry().
75  scheduler_->TouchResource(
76      entry->resource_id(), last_modified_time, last_access_time,
77      base::Bind(&TouchOperation::TouchFileAfterServerTimeStampUpdated,
78                 weak_ptr_factory_.GetWeakPtr(),
79                 file_path, callback));
80}
81
82void TouchOperation::TouchFileAfterServerTimeStampUpdated(
83    const base::FilePath& file_path,
84    const FileOperationCallback& callback,
85    google_apis::GDataErrorCode gdata_error,
86    scoped_ptr<google_apis::ResourceEntry> resource_entry) {
87  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
88  DCHECK(!callback.is_null());
89
90  FileError error = util::GDataToFileError(gdata_error);
91  if (error != FILE_ERROR_OK) {
92    callback.Run(error);
93    return;
94  }
95
96  base::PostTaskAndReplyWithResult(
97      blocking_task_runner_,
98      FROM_HERE,
99      base::Bind(&internal::ResourceMetadata::RefreshEntry,
100                 base::Unretained(metadata_),
101                 ConvertToResourceEntry(*resource_entry)),
102      base::Bind(&TouchOperation::TouchFileAfterRefreshMetadata,
103                 weak_ptr_factory_.GetWeakPtr(), file_path, callback));
104}
105
106void TouchOperation::TouchFileAfterRefreshMetadata(
107    const base::FilePath& file_path,
108    const FileOperationCallback& callback,
109    FileError error) {
110  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
111  DCHECK(!callback.is_null());
112
113  if (error == FILE_ERROR_OK)
114    observer_->OnDirectoryChangedByOperation(file_path.DirName());
115
116  callback.Run(error);
117}
118
119}  // namespace file_system
120}  // namespace drive
121