Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 585 base::SequencedTaskRunner* blocking_task_runner, | 585 base::SequencedTaskRunner* blocking_task_runner, |
| 586 const base::Closure& request_task, | 586 const base::Closure& request_task, |
| 587 const base::Closure& reply_task) { | 587 const base::Closure& reply_task) { |
| 588 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 588 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 589 | 589 |
| 590 const bool posted = blocking_task_runner->PostTaskAndReply( | 590 const bool posted = blocking_task_runner->PostTaskAndReply( |
| 591 from_here, request_task, reply_task); | 591 from_here, request_task, reply_task); |
| 592 DCHECK(posted); | 592 DCHECK(posted); |
| 593 } | 593 } |
| 594 | 594 |
| 595 // Helper function for binding |path| to GetEntryInfoWithFilePathCallback and | |
| 596 // create GetEntryInfoCallback. | |
| 597 void RunGetEntryInfoWithFilePathCallback( | |
| 598 const GetEntryInfoWithFilePathCallback& callback, | |
| 599 const FilePath& path, | |
| 600 GDataFileError error, | |
| 601 scoped_ptr<GDataEntryProto> entry_proto) { | |
| 602 if (!callback.is_null()) | |
| 603 callback.Run(error, path, entry_proto.Pass()); | |
| 604 } | |
| 605 | |
| 595 } // namespace | 606 } // namespace |
| 596 | 607 |
| 597 // GDataFileSystem::GetDocumentsParams struct implementation. | 608 // GDataFileSystem::GetDocumentsParams struct implementation. |
| 598 struct GDataFileSystem::GetDocumentsParams { | 609 struct GDataFileSystem::GetDocumentsParams { |
| 599 GetDocumentsParams(int start_changestamp, | 610 GetDocumentsParams(int start_changestamp, |
| 600 int root_feed_changestamp, | 611 int root_feed_changestamp, |
| 601 std::vector<DocumentFeed*>* feed_list, | 612 std::vector<DocumentFeed*>* feed_list, |
| 602 bool should_fetch_multiple_feeds, | 613 bool should_fetch_multiple_feeds, |
| 603 const FilePath& search_file_path, | 614 const FilePath& search_file_path, |
| 604 const std::string& search_query, | 615 const std::string& search_query, |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 887 } | 898 } |
| 888 | 899 |
| 889 void GDataFileSystem::GetEntryInfoByEntryOnUIThread( | 900 void GDataFileSystem::GetEntryInfoByEntryOnUIThread( |
| 890 const GetEntryInfoWithFilePathCallback& callback, | 901 const GetEntryInfoWithFilePathCallback& callback, |
| 891 GDataEntry* entry) { | 902 GDataEntry* entry) { |
| 892 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 903 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 893 | 904 |
| 894 if (entry) { | 905 if (entry) { |
| 895 scoped_ptr<GDataEntryProto> entry_proto(new GDataEntryProto); | 906 scoped_ptr<GDataEntryProto> entry_proto(new GDataEntryProto); |
| 896 entry->ToProtoFull(entry_proto.get()); | 907 entry->ToProtoFull(entry_proto.get()); |
| 897 callback.Run(GDATA_FILE_OK, entry->GetFilePath(), entry_proto.Pass()); | 908 ReflectLocalModificationToGDataEntryProto( |
| 909 base::Bind(&RunGetEntryInfoWithFilePathCallback, | |
| 910 callback, entry->GetFilePath()), | |
| 911 entry_proto.Pass()); | |
| 898 } else { | 912 } else { |
| 899 callback.Run(GDATA_FILE_ERROR_NOT_FOUND, | 913 callback.Run(GDATA_FILE_ERROR_NOT_FOUND, |
| 900 FilePath(), | 914 FilePath(), |
| 901 scoped_ptr<GDataEntryProto>()); | 915 scoped_ptr<GDataEntryProto>()); |
| 902 } | 916 } |
| 903 } | 917 } |
| 904 | 918 |
| 905 void GDataFileSystem::FindEntryByPathAsyncOnUIThread( | 919 void GDataFileSystem::FindEntryByPathAsyncOnUIThread( |
| 906 const FilePath& search_file_path, | 920 const FilePath& search_file_path, |
| 907 const FindEntryCallback& callback) { | 921 const FindEntryCallback& callback) { |
| (...skipping 1333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2241 if (error != GDATA_FILE_OK) { | 2255 if (error != GDATA_FILE_OK) { |
| 2242 if (!callback.is_null()) | 2256 if (!callback.is_null()) |
| 2243 callback.Run(error, scoped_ptr<GDataEntryProto>()); | 2257 callback.Run(error, scoped_ptr<GDataEntryProto>()); |
| 2244 return; | 2258 return; |
| 2245 } | 2259 } |
| 2246 DCHECK(entry); | 2260 DCHECK(entry); |
| 2247 | 2261 |
| 2248 scoped_ptr<GDataEntryProto> entry_proto(new GDataEntryProto); | 2262 scoped_ptr<GDataEntryProto> entry_proto(new GDataEntryProto); |
| 2249 entry->ToProtoFull(entry_proto.get()); | 2263 entry->ToProtoFull(entry_proto.get()); |
| 2250 | 2264 |
| 2251 if (!callback.is_null()) | 2265 ReflectLocalModificationToGDataEntryProto(callback, entry_proto.Pass()); |
| 2252 callback.Run(GDATA_FILE_OK, entry_proto.Pass()); | |
| 2253 } | 2266 } |
| 2254 | 2267 |
| 2255 void GDataFileSystem::ReadDirectoryByPath( | 2268 void GDataFileSystem::ReadDirectoryByPath( |
| 2256 const FilePath& file_path, | 2269 const FilePath& file_path, |
| 2257 const ReadDirectoryCallback& callback) { | 2270 const ReadDirectoryCallback& callback) { |
| 2258 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || | 2271 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) || |
| 2259 BrowserThread::CurrentlyOn(BrowserThread::IO)); | 2272 BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 2260 RunTaskOnUIThread( | 2273 RunTaskOnUIThread( |
| 2261 base::Bind(&GDataFileSystem::ReadDirectoryByPathAsyncOnUIThread, | 2274 base::Bind(&GDataFileSystem::ReadDirectoryByPathAsyncOnUIThread, |
| 2262 ui_weak_ptr_, | 2275 ui_weak_ptr_, |
| (...skipping 1847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4110 // All the invocation of |callback| from operations initiated from CloseFile | 4123 // All the invocation of |callback| from operations initiated from CloseFile |
| 4111 // must go through here. Removes the |file_path| from the remembered set so | 4124 // must go through here. Removes the |file_path| from the remembered set so |
| 4112 // that subsequent operations can open the file again. | 4125 // that subsequent operations can open the file again. |
| 4113 open_files_.erase(file_path); | 4126 open_files_.erase(file_path); |
| 4114 | 4127 |
| 4115 // Then invokes the user-supplied callback function. | 4128 // Then invokes the user-supplied callback function. |
| 4116 if (!callback.is_null()) | 4129 if (!callback.is_null()) |
| 4117 callback.Run(result); | 4130 callback.Run(result); |
| 4118 } | 4131 } |
| 4119 | 4132 |
| 4133 void GDataFileSystem::ReflectLocalModificationToGDataEntryProto( | |
|
satorux1
2012/07/25 19:28:45
maybe CheckLocalModificationAndRun() would describ
kinaba
2012/07/26 03:17:53
Done.
| |
| 4134 const GetEntryInfoCallback& callback, | |
| 4135 scoped_ptr<GDataEntryProto> entry_proto) { | |
|
satorux1
2012/07/25 19:28:45
I'd swap these parameters with the new function na
kinaba
2012/07/26 03:17:53
Done.
| |
| 4136 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
|
satorux1
2012/07/25 19:28:45
DCHECK(entry_proto.get()); This should be guarante
kinaba
2012/07/26 03:17:53
Yes. Done.
| |
| 4137 | |
| 4138 // For entries that will never be cached, use the original entry info as is. | |
| 4139 if (!entry_proto.get() || !entry_proto->has_file_specific_info() || | |
|
satorux1
2012/07/25 19:28:45
I'd remove !entry_proto.get()
kinaba
2012/07/26 03:17:53
Done.
| |
| 4140 entry_proto->file_specific_info().file_md5().empty() || | |
|
satorux1
2012/07/25 19:28:45
I think we can remove this line.
kinaba
2012/07/26 03:17:53
Done.
| |
| 4141 entry_proto->file_specific_info().is_hosted_document()) { | |
| 4142 if (!callback.is_null()) | |
| 4143 callback.Run(GDATA_FILE_OK, entry_proto.Pass()); | |
| 4144 return; | |
| 4145 } | |
| 4146 | |
| 4147 // Checks if the file is cached and modified locally. | |
| 4148 const std::string resource_id = entry_proto->resource_id(); | |
| 4149 const std::string md5 = entry_proto->file_specific_info().file_md5(); | |
| 4150 cache_->GetCacheEntryOnUIThread( | |
| 4151 resource_id, | |
| 4152 md5, | |
| 4153 base::Bind(&GDataFileSystem::OnGetCacheEntryForReflectLocalModification, | |
| 4154 ui_weak_ptr_, callback, base::Passed(&entry_proto))); | |
| 4155 } | |
| 4156 | |
| 4157 void GDataFileSystem::OnGetCacheEntryForReflectLocalModification( | |
|
satorux1
2012/07/25 19:28:45
ReflectLocalModificationAfterGetCacheEntry() may b
kinaba
2012/07/26 03:17:53
Done.
| |
| 4158 const GetEntryInfoCallback& callback, | |
| 4159 scoped_ptr<GDataEntryProto> entry_proto, | |
| 4160 bool success, | |
| 4161 const GDataCacheEntry& cache_entry) { | |
| 4162 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 4163 | |
| 4164 // When no dirty cache is found, use the original entry info as is. | |
| 4165 if (!success || !cache_entry.is_dirty()) { | |
| 4166 if (!callback.is_null()) | |
| 4167 callback.Run(GDATA_FILE_OK, entry_proto.Pass()); | |
| 4168 return; | |
| 4169 } | |
| 4170 | |
| 4171 // Gets the cache file path. | |
| 4172 const std::string resource_id = entry_proto->resource_id(); | |
| 4173 const std::string md5 = entry_proto->file_specific_info().file_md5(); | |
|
satorux1
2012/07/25 19:28:45
make them const reference?
kinaba
2012/07/26 03:17:53
Done.
| |
| 4174 cache_->GetFileOnUIThread( | |
| 4175 resource_id, | |
| 4176 md5, | |
| 4177 base::Bind(&GDataFileSystem::OnGetCacheFileForReflectLocalModification, | |
| 4178 ui_weak_ptr_, callback, base::Passed(&entry_proto))); | |
| 4179 } | |
| 4180 | |
| 4181 void GDataFileSystem::OnGetCacheFileForReflectLocalModification( | |
| 4182 const GetEntryInfoCallback& callback, | |
| 4183 scoped_ptr<GDataEntryProto> entry_proto, | |
| 4184 GDataFileError error, | |
| 4185 const std::string& resource_id, | |
| 4186 const std::string& md5, | |
| 4187 const FilePath& local_cache_path) { | |
| 4188 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 4189 | |
| 4190 // When no dirty cache is found, use the original entry info as is. | |
| 4191 if (error != GDATA_FILE_OK) { | |
| 4192 if (!callback.is_null()) | |
| 4193 callback.Run(GDATA_FILE_OK, entry_proto.Pass()); | |
| 4194 return; | |
| 4195 } | |
| 4196 | |
| 4197 // If the cache is dirty, obtain the file info from the cache file itself. | |
| 4198 base::PlatformFileInfo* file_info = new base::PlatformFileInfo; | |
| 4199 bool* get_file_info_result = new bool(false); | |
| 4200 PostBlockingPoolSequencedTaskAndReply( | |
| 4201 FROM_HERE, | |
| 4202 blocking_task_runner_, | |
| 4203 base::Bind(&GetFileInfoOnBlockingPool, | |
| 4204 local_cache_path, | |
| 4205 base::Unretained(file_info), | |
| 4206 base::Unretained(get_file_info_result)), | |
| 4207 base::Bind(&GDataFileSystem::OnGetFileInfoForReflectLocalModification, | |
| 4208 ui_weak_ptr_, | |
| 4209 callback, | |
| 4210 base::Passed(&entry_proto), | |
| 4211 base::Owned(file_info), | |
| 4212 base::Owned(get_file_info_result))); | |
| 4213 } | |
| 4214 | |
| 4215 void GDataFileSystem::OnGetFileInfoForReflectLocalModification( | |
| 4216 const GetEntryInfoCallback& callback, | |
| 4217 scoped_ptr<GDataEntryProto> entry_proto, | |
| 4218 base::PlatformFileInfo* file_info, | |
| 4219 bool* get_file_info_result) { | |
| 4220 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 4221 | |
| 4222 if (*get_file_info_result) { | |
| 4223 PlatformFileInfoProto entry_file_info; | |
| 4224 GDataEntry::ConvertPlatformFileInfoToProto(*file_info, &entry_file_info); | |
| 4225 *entry_proto->mutable_file_info() = entry_file_info; | |
| 4226 } | |
| 4227 if (!callback.is_null()) | |
| 4228 callback.Run(GDATA_FILE_OK, entry_proto.Pass()); | |
|
satorux1
2012/07/25 19:28:45
This looks wrong. The error code should be GDATA_F
kinaba
2012/07/26 03:17:53
Done.
| |
| 4229 } | |
| 4230 | |
| 4120 } // namespace gdata | 4231 } // namespace gdata |
| OLD | NEW |