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

Side by Side Diff: chrome/browser/chromeos/gdata/gdata_file_system.cc

Issue 10826006: gdata: File info of dirty files should be get from the cached file. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rename Created 8 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 (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/gdata/gdata_file_system.h" 5 #include "chrome/browser/chromeos/gdata/gdata_file_system.h"
6 6
7 #include <set> 7 #include <set>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 base::SequencedTaskRunner* blocking_task_runner, 598 base::SequencedTaskRunner* blocking_task_runner,
599 const base::Closure& request_task, 599 const base::Closure& request_task,
600 const base::Closure& reply_task) { 600 const base::Closure& reply_task) {
601 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 601 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
602 602
603 const bool posted = blocking_task_runner->PostTaskAndReply( 603 const bool posted = blocking_task_runner->PostTaskAndReply(
604 from_here, request_task, reply_task); 604 from_here, request_task, reply_task);
605 DCHECK(posted); 605 DCHECK(posted);
606 } 606 }
607 607
608 // Helper function for binding |path| to GetEntryInfoWithFilePathCallback and
609 // create GetEntryInfoCallback.
610 void RunGetEntryInfoWithFilePathCallback(
611 const GetEntryInfoWithFilePathCallback& callback,
612 const FilePath& path,
613 GDataFileError error,
614 scoped_ptr<GDataEntryProto> entry_proto) {
615 if (!callback.is_null())
616 callback.Run(error, path, entry_proto.Pass());
617 }
618
608 } // namespace 619 } // namespace
609 620
610 // GDataFileSystem::GetDocumentsParams struct implementation. 621 // GDataFileSystem::GetDocumentsParams struct implementation.
611 struct GDataFileSystem::GetDocumentsParams { 622 struct GDataFileSystem::GetDocumentsParams {
612 GetDocumentsParams(int start_changestamp, 623 GetDocumentsParams(int start_changestamp,
613 int root_feed_changestamp, 624 int root_feed_changestamp,
614 std::vector<DocumentFeed*>* feed_list, 625 std::vector<DocumentFeed*>* feed_list,
615 bool should_fetch_multiple_feeds, 626 bool should_fetch_multiple_feeds,
616 const FilePath& search_file_path, 627 const FilePath& search_file_path,
617 const std::string& search_query, 628 const std::string& search_query,
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
900 } 911 }
901 912
902 void GDataFileSystem::GetEntryInfoByEntryOnUIThread( 913 void GDataFileSystem::GetEntryInfoByEntryOnUIThread(
903 const GetEntryInfoWithFilePathCallback& callback, 914 const GetEntryInfoWithFilePathCallback& callback,
904 GDataEntry* entry) { 915 GDataEntry* entry) {
905 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 916 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
906 917
907 if (entry) { 918 if (entry) {
908 scoped_ptr<GDataEntryProto> entry_proto(new GDataEntryProto); 919 scoped_ptr<GDataEntryProto> entry_proto(new GDataEntryProto);
909 entry->ToProtoFull(entry_proto.get()); 920 entry->ToProtoFull(entry_proto.get());
910 callback.Run(GDATA_FILE_OK, entry->GetFilePath(), entry_proto.Pass()); 921 CheckLocalModificationAndRun(
922 entry_proto.Pass(),
923 base::Bind(&RunGetEntryInfoWithFilePathCallback,
924 callback, entry->GetFilePath()));
911 } else { 925 } else {
912 callback.Run(GDATA_FILE_ERROR_NOT_FOUND, 926 callback.Run(GDATA_FILE_ERROR_NOT_FOUND,
913 FilePath(), 927 FilePath(),
914 scoped_ptr<GDataEntryProto>()); 928 scoped_ptr<GDataEntryProto>());
915 } 929 }
916 } 930 }
917 931
918 void GDataFileSystem::FindEntryByPathAsyncOnUIThread( 932 void GDataFileSystem::FindEntryByPathAsyncOnUIThread(
919 const FilePath& search_file_path, 933 const FilePath& search_file_path,
920 const FindEntryCallback& callback) { 934 const FindEntryCallback& callback) {
(...skipping 1333 matching lines...) Expand 10 before | Expand all | Expand 10 after
2254 if (error != GDATA_FILE_OK) { 2268 if (error != GDATA_FILE_OK) {
2255 if (!callback.is_null()) 2269 if (!callback.is_null())
2256 callback.Run(error, scoped_ptr<GDataEntryProto>()); 2270 callback.Run(error, scoped_ptr<GDataEntryProto>());
2257 return; 2271 return;
2258 } 2272 }
2259 DCHECK(entry); 2273 DCHECK(entry);
2260 2274
2261 scoped_ptr<GDataEntryProto> entry_proto(new GDataEntryProto); 2275 scoped_ptr<GDataEntryProto> entry_proto(new GDataEntryProto);
2262 entry->ToProtoFull(entry_proto.get()); 2276 entry->ToProtoFull(entry_proto.get());
2263 2277
2264 if (!callback.is_null()) 2278 CheckLocalModificationAndRun(entry_proto.Pass(), callback);
2265 callback.Run(GDATA_FILE_OK, entry_proto.Pass());
2266 } 2279 }
2267 2280
2268 void GDataFileSystem::ReadDirectoryByPath( 2281 void GDataFileSystem::ReadDirectoryByPath(
2269 const FilePath& file_path, 2282 const FilePath& file_path,
2270 const ReadDirectoryCallback& callback) { 2283 const ReadDirectoryCallback& callback) {
2271 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || 2284 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) ||
2272 BrowserThread::CurrentlyOn(BrowserThread::IO)); 2285 BrowserThread::CurrentlyOn(BrowserThread::IO));
2273 RunTaskOnUIThread( 2286 RunTaskOnUIThread(
2274 base::Bind(&GDataFileSystem::ReadDirectoryByPathAsyncOnUIThread, 2287 base::Bind(&GDataFileSystem::ReadDirectoryByPathAsyncOnUIThread,
2275 ui_weak_ptr_, 2288 ui_weak_ptr_,
(...skipping 1885 matching lines...) Expand 10 before | Expand all | Expand 10 after
4161 // All the invocation of |callback| from operations initiated from CloseFile 4174 // All the invocation of |callback| from operations initiated from CloseFile
4162 // must go through here. Removes the |file_path| from the remembered set so 4175 // must go through here. Removes the |file_path| from the remembered set so
4163 // that subsequent operations can open the file again. 4176 // that subsequent operations can open the file again.
4164 open_files_.erase(file_path); 4177 open_files_.erase(file_path);
4165 4178
4166 // Then invokes the user-supplied callback function. 4179 // Then invokes the user-supplied callback function.
4167 if (!callback.is_null()) 4180 if (!callback.is_null())
4168 callback.Run(result); 4181 callback.Run(result);
4169 } 4182 }
4170 4183
4184 void GDataFileSystem::CheckLocalModificationAndRun(
4185 scoped_ptr<GDataEntryProto> entry_proto,
4186 const GetEntryInfoCallback& callback) {
4187 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
4188 DCHECK(entry_proto.get());
4189
4190 // For entries that will never be cached, use the original entry info as is.
4191 if (!entry_proto->has_file_specific_info() ||
4192 entry_proto->file_specific_info().is_hosted_document()) {
4193 if (!callback.is_null())
4194 callback.Run(GDATA_FILE_OK, entry_proto.Pass());
4195 return;
4196 }
4197
4198 // Checks if the file is cached and modified locally.
4199 const std::string resource_id = entry_proto->resource_id();
4200 const std::string md5 = entry_proto->file_specific_info().file_md5();
4201 cache_->GetCacheEntryOnUIThread(
4202 resource_id,
4203 md5,
4204 base::Bind(
4205 &GDataFileSystem::CheckLocalModificationAndRunAfterGetCacheEntry,
4206 ui_weak_ptr_, base::Passed(&entry_proto), callback));
4207 }
4208
4209 void GDataFileSystem::CheckLocalModificationAndRunAfterGetCacheEntry(
4210 scoped_ptr<GDataEntryProto> entry_proto,
4211 const GetEntryInfoCallback& callback,
4212 bool success,
4213 const GDataCacheEntry& cache_entry) {
4214 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
4215
4216 // When no dirty cache is found, use the original entry info as is.
4217 if (!success || !cache_entry.is_dirty()) {
4218 if (!callback.is_null())
4219 callback.Run(GDATA_FILE_OK, entry_proto.Pass());
4220 return;
4221 }
4222
4223 // Gets the cache file path.
4224 const std::string& resource_id = entry_proto->resource_id();
4225 const std::string& md5 = entry_proto->file_specific_info().file_md5();
4226 cache_->GetFileOnUIThread(
4227 resource_id,
4228 md5,
4229 base::Bind(
4230 &GDataFileSystem::CheckLocalModificationAndRunAfterGetCacheFile,
4231 ui_weak_ptr_, base::Passed(&entry_proto), callback));
4232 }
4233
4234 void GDataFileSystem::CheckLocalModificationAndRunAfterGetCacheFile(
4235 scoped_ptr<GDataEntryProto> entry_proto,
4236 const GetEntryInfoCallback& callback,
4237 GDataFileError error,
4238 const std::string& resource_id,
4239 const std::string& md5,
4240 const FilePath& local_cache_path) {
4241 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
4242
4243 // When no dirty cache is found, use the original entry info as is.
4244 if (error != GDATA_FILE_OK) {
4245 if (!callback.is_null())
4246 callback.Run(GDATA_FILE_OK, entry_proto.Pass());
4247 return;
4248 }
4249
4250 // If the cache is dirty, obtain the file info from the cache file itself.
4251 base::PlatformFileInfo* file_info = new base::PlatformFileInfo;
4252 bool* get_file_info_result = new bool(false);
4253 PostBlockingPoolSequencedTaskAndReply(
4254 FROM_HERE,
4255 blocking_task_runner_,
4256 base::Bind(&GetFileInfoOnBlockingPool,
4257 local_cache_path,
4258 base::Unretained(file_info),
4259 base::Unretained(get_file_info_result)),
4260 base::Bind(&GDataFileSystem::CheckLocalModificationAndRunAfterGetFileInfo,
4261 ui_weak_ptr_,
4262 base::Passed(&entry_proto),
4263 callback,
4264 base::Owned(file_info),
4265 base::Owned(get_file_info_result)));
4266 }
4267
4268 void GDataFileSystem::CheckLocalModificationAndRunAfterGetFileInfo(
4269 scoped_ptr<GDataEntryProto> entry_proto,
4270 const GetEntryInfoCallback& callback,
4271 base::PlatformFileInfo* file_info,
4272 bool* get_file_info_result) {
4273 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
4274
4275 if (!*get_file_info_result) {
4276 if (!callback.is_null())
4277 callback.Run(GDATA_FILE_ERROR_NOT_FOUND, scoped_ptr<GDataEntryProto>());
4278 return;
4279 }
4280
4281 PlatformFileInfoProto entry_file_info;
4282 GDataEntry::ConvertPlatformFileInfoToProto(*file_info, &entry_file_info);
4283 *entry_proto->mutable_file_info() = entry_file_info;
4284 if (!callback.is_null())
4285 callback.Run(GDATA_FILE_OK, entry_proto.Pass());
4286 }
4287
4171 } // namespace gdata 4288 } // namespace gdata
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/gdata/gdata_file_system.h ('k') | chrome/browser/chromeos/gdata/gdata_file_system_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698