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

Side by Side Diff: chrome/browser/chromeos/drive/file_system/open_file_operation.cc

Issue 19596003: Remove CloseFile from FileSystem. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 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 2013 The Chromium Authors. All rights reserved. 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 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/file_system/open_file_operation.h" 5 #include "chrome/browser/chromeos/drive/file_system/open_file_operation.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/files/file_path.h" 8 #include "base/files/file_path.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/message_loop/message_loop_proxy.h" 10 #include "base/message_loop/message_loop_proxy.h"
11 #include "base/task_runner_util.h" 11 #include "base/task_runner_util.h"
12 #include "chrome/browser/chromeos/drive/drive.pb.h" 12 #include "chrome/browser/chromeos/drive/drive.pb.h"
13 #include "chrome/browser/chromeos/drive/file_cache.h" 13 #include "chrome/browser/chromeos/drive/file_cache.h"
14 #include "chrome/browser/chromeos/drive/file_errors.h" 14 #include "chrome/browser/chromeos/drive/file_errors.h"
15 #include "chrome/browser/chromeos/drive/file_system/create_file_operation.h" 15 #include "chrome/browser/chromeos/drive/file_system/create_file_operation.h"
16 #include "chrome/browser/chromeos/drive/file_system/download_operation.h" 16 #include "chrome/browser/chromeos/drive/file_system/download_operation.h"
17 #include "chrome/browser/chromeos/drive/file_system/operation_observer.h"
17 #include "chrome/browser/chromeos/drive/file_system_interface.h" 18 #include "chrome/browser/chromeos/drive/file_system_interface.h"
18 #include "content/public/browser/browser_thread.h" 19 #include "content/public/browser/browser_thread.h"
19 20
20 using content::BrowserThread; 21 using content::BrowserThread;
21 22
22 namespace drive { 23 namespace drive {
23 namespace file_system { 24 namespace file_system {
24 namespace { 25 namespace {
25 26
26 FileError UpdateFileLocalState(internal::FileCache* cache, 27 FileError UpdateFileLocalState(internal::FileCache* cache,
27 const std::string& resource_id, 28 const std::string& resource_id,
28 const std::string& md5, 29 const std::string& md5,
29 base::FilePath* local_file_path) { 30 base::FilePath* local_file_path) {
30 FileError error = cache->MarkDirty(resource_id, md5); 31 FileError error = cache->MarkDirty(resource_id, md5);
31 if (error != FILE_ERROR_OK) 32 if (error != FILE_ERROR_OK)
32 return error; 33 return error;
33 34
34 return cache->GetFile(resource_id, md5, local_file_path); 35 return cache->GetFile(resource_id, md5, local_file_path);
35 } 36 }
36 37
37 } // namespace 38 } // namespace
38 39
39 OpenFileOperation::OpenFileOperation( 40 OpenFileOperation::OpenFileOperation(
40 base::SequencedTaskRunner* blocking_task_runner, 41 base::SequencedTaskRunner* blocking_task_runner,
41 OperationObserver* observer, 42 OperationObserver* observer,
42 JobScheduler* scheduler, 43 JobScheduler* scheduler,
43 internal::ResourceMetadata* metadata, 44 internal::ResourceMetadata* metadata,
44 internal::FileCache* cache, 45 internal::FileCache* cache,
45 const base::FilePath& temporary_file_directory, 46 const base::FilePath& temporary_file_directory)
46 std::map<base::FilePath, int>* open_files)
47 : blocking_task_runner_(blocking_task_runner), 47 : blocking_task_runner_(blocking_task_runner),
48 observer_(observer),
48 cache_(cache), 49 cache_(cache),
49 create_file_operation_(new CreateFileOperation( 50 create_file_operation_(new CreateFileOperation(
50 blocking_task_runner, observer, scheduler, metadata, cache)), 51 blocking_task_runner, observer, scheduler, metadata, cache)),
51 download_operation_(new DownloadOperation( 52 download_operation_(new DownloadOperation(
52 blocking_task_runner, observer, scheduler, 53 blocking_task_runner, observer, scheduler,
53 metadata, cache, temporary_file_directory)), 54 metadata, cache, temporary_file_directory)),
54 open_files_(open_files),
55 weak_ptr_factory_(this) { 55 weak_ptr_factory_(this) {
56 DCHECK(open_files);
57 } 56 }
58 57
59 OpenFileOperation::~OpenFileOperation() { 58 OpenFileOperation::~OpenFileOperation() {
60 } 59 }
61 60
62 void OpenFileOperation::OpenFile(const base::FilePath& file_path, 61 void OpenFileOperation::OpenFile(const base::FilePath& file_path,
63 OpenMode open_mode, 62 OpenMode open_mode,
64 const OpenFileCallback& callback) { 63 const OpenFileCallback& callback) {
65 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 64 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
66 DCHECK(!callback.is_null()); 65 DCHECK(!callback.is_null());
(...skipping 23 matching lines...) Expand all
90 } 89 }
91 90
92 void OpenFileOperation::OpenFileAfterCreateFile( 91 void OpenFileOperation::OpenFileAfterCreateFile(
93 const base::FilePath& file_path, 92 const base::FilePath& file_path,
94 const OpenFileCallback& callback, 93 const OpenFileCallback& callback,
95 FileError error) { 94 FileError error) {
96 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 95 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
97 DCHECK(!callback.is_null()); 96 DCHECK(!callback.is_null());
98 97
99 if (error != FILE_ERROR_OK) { 98 if (error != FILE_ERROR_OK) {
100 callback.Run(error, base::FilePath()); 99 callback.Run(error, base::FilePath(), base::Closure());
101 return; 100 return;
102 } 101 }
103 102
104 download_operation_->EnsureFileDownloadedByPath( 103 download_operation_->EnsureFileDownloadedByPath(
105 file_path, 104 file_path,
106 ClientContext(USER_INITIATED), 105 ClientContext(USER_INITIATED),
107 GetFileContentInitializedCallback(), 106 GetFileContentInitializedCallback(),
108 google_apis::GetContentCallback(), 107 google_apis::GetContentCallback(),
109 base::Bind( 108 base::Bind(
110 &OpenFileOperation::OpenFileAfterFileDownloaded, 109 &OpenFileOperation::OpenFileAfterFileDownloaded,
111 weak_ptr_factory_.GetWeakPtr(), file_path, callback)); 110 weak_ptr_factory_.GetWeakPtr(), callback));
112 } 111 }
113 112
114 void OpenFileOperation::OpenFileAfterFileDownloaded( 113 void OpenFileOperation::OpenFileAfterFileDownloaded(
115 const base::FilePath& file_path,
116 const OpenFileCallback& callback, 114 const OpenFileCallback& callback,
117 FileError error, 115 FileError error,
118 const base::FilePath& local_file_path, 116 const base::FilePath& local_file_path,
119 scoped_ptr<ResourceEntry> entry) { 117 scoped_ptr<ResourceEntry> entry) {
120 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 118 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
121 DCHECK(!callback.is_null()); 119 DCHECK(!callback.is_null());
122 120
123 if (error == FILE_ERROR_OK) { 121 if (error == FILE_ERROR_OK) {
124 DCHECK(entry); 122 DCHECK(entry);
125 DCHECK(entry->has_file_specific_info()); 123 DCHECK(entry->has_file_specific_info());
126 if (entry->file_specific_info().is_hosted_document()) 124 if (entry->file_specific_info().is_hosted_document())
127 // No support for opening a hosted document. 125 // No support for opening a hosted document.
128 error = FILE_ERROR_INVALID_OPERATION; 126 error = FILE_ERROR_INVALID_OPERATION;
129 } 127 }
130 128
131 if (error != FILE_ERROR_OK) { 129 if (error != FILE_ERROR_OK) {
132 callback.Run(error, base::FilePath()); 130 callback.Run(error, base::FilePath(), base::Closure());
133 return; 131 return;
134 } 132 }
135 133
136 // Note: after marking the file dirty, the local file path may be changed. 134 // Note: after marking the file dirty, the local file path may be changed.
137 // So, it is necessary to take the path again. 135 // So, it is necessary to take the path again.
138 base::FilePath* new_local_file_path = new base::FilePath; 136 base::FilePath* new_local_file_path = new base::FilePath;
139 base::PostTaskAndReplyWithResult( 137 base::PostTaskAndReplyWithResult(
140 blocking_task_runner_.get(), 138 blocking_task_runner_.get(),
141 FROM_HERE, 139 FROM_HERE,
142 base::Bind(&UpdateFileLocalState, 140 base::Bind(&UpdateFileLocalState,
143 cache_, 141 cache_,
144 entry->resource_id(), 142 entry->resource_id(),
145 entry->file_specific_info().md5(), 143 entry->file_specific_info().md5(),
146 new_local_file_path), 144 new_local_file_path),
147 base::Bind(&OpenFileOperation::OpenFileAfterUpdateLocalState, 145 base::Bind(&OpenFileOperation::OpenFileAfterUpdateLocalState,
148 weak_ptr_factory_.GetWeakPtr(), 146 weak_ptr_factory_.GetWeakPtr(),
149 file_path, 147 entry->resource_id(),
150 callback, 148 callback,
151 base::Owned(new_local_file_path))); 149 base::Owned(new_local_file_path)));
152 } 150 }
153 151
154 void OpenFileOperation::OpenFileAfterUpdateLocalState( 152 void OpenFileOperation::OpenFileAfterUpdateLocalState(
155 const base::FilePath& file_path, 153 const std::string& resource_id,
156 const OpenFileCallback& callback, 154 const OpenFileCallback& callback,
157 const base::FilePath* local_file_path, 155 const base::FilePath* local_file_path,
158 FileError error) { 156 FileError error) {
159 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 157 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
160 DCHECK(!callback.is_null()); 158 DCHECK(!callback.is_null());
161 159
162 if (error == FILE_ERROR_OK) 160 if (error != FILE_ERROR_OK) {
163 ++(*open_files_)[file_path]; 161 callback.Run(error, base::FilePath(), base::Closure());
164 callback.Run(error, *local_file_path); 162 return;
163 }
164
165 ++open_files_[resource_id];
166 callback.Run(error, *local_file_path,
167 base::Bind(&OpenFileOperation::CloseFile,
168 weak_ptr_factory_.GetWeakPtr(), resource_id));
169 }
170
171 void OpenFileOperation::CloseFile(const std::string& resource_id) {
172 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
173 DCHECK_GT(open_files_[resource_id], 0);
174
175 if (--open_files_[resource_id] == 0) {
176 // All clients closes this file, so notify to upload the file.
177 open_files_.erase(resource_id);
178 observer_->OnCacheFileUploadNeededByOperation(resource_id);
179 }
165 } 180 }
166 181
167 } // namespace file_system 182 } // namespace file_system
168 } // namespace drive 183 } // namespace drive
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698