#include "chrome/browser/chromeos/drive/file_system_observer.h"
#include "chrome/browser/chromeos/drive/file_system_util.h"
#include "chrome/browser/chromeos/drive/job_scheduler.h"
-#include "chrome/browser/chromeos/drive/logging.h"
#include "chrome/browser/chromeos/drive/remove_stale_cache_files.h"
#include "chrome/browser/chromeos/drive/resource_entry_conversion.h"
#include "chrome/browser/chromeos/drive/search_metadata.h"
entry->file_specific_info().is_hosted_document())
return FILE_ERROR_OK;
- // When no dirty cache is found, use the original resource entry as is.
+ // When cache is not found, use the original resource entry as is.
FileCacheEntry cache_entry;
- if (!cache->GetCacheEntry(local_id, &cache_entry) || !cache_entry.is_dirty())
+ if (!cache->GetCacheEntry(local_id, &cache_entry))
return FILE_ERROR_OK;
- // If the cache is dirty, obtain the file info from the cache file itself.
+ // When cache is non-dirty and obsolete (old hash), use the original entry.
+ if (!cache_entry.is_dirty() &&
+ entry->file_specific_info().md5() != cache_entry.md5())
+ return FILE_ERROR_OK;
+
+ // If there's a valid cache, obtain the file info from the cache file itself.
base::FilePath local_cache_path;
error = cache->GetFile(local_id, &local_cache_path);
if (error != FILE_ERROR_OK)
return error;
- // TODO(rvargas): Convert this code to use base::File::Info.
base::File::Info file_info;
- if (!base::GetFileInfo(local_cache_path,
- reinterpret_cast<base::File::Info*>(&file_info))) {
+ if (!base::GetFileInfo(local_cache_path, &file_info))
return FILE_ERROR_NOT_FOUND;
- }
- SetPlatformFileInfoToResourceEntry(file_info, entry);
+ // TODO(hashimoto): crbug.com/346625. Also reflect timestamps.
+ entry->mutable_file_info()->set_size(file_info.size);
return FILE_ERROR_OK;
}
FileSystem::FileSystem(
PrefService* pref_service,
+ EventLogger* logger,
internal::FileCache* cache,
DriveServiceInterface* drive_service,
JobScheduler* scheduler,
base::SequencedTaskRunner* blocking_task_runner,
const base::FilePath& temporary_file_directory)
: pref_service_(pref_service),
+ logger_(logger),
cache_(cache),
drive_service_(drive_service),
scheduler_(scheduler),
void FileSystem::ResetComponents() {
file_system::OperationObserver* observer = this;
+
+ about_resource_loader_.reset(new internal::AboutResourceLoader(scheduler_));
+ loader_controller_.reset(new internal::LoaderController);
+ change_list_loader_.reset(new internal::ChangeListLoader(
+ logger_,
+ blocking_task_runner_.get(),
+ resource_metadata_,
+ scheduler_,
+ drive_service_,
+ about_resource_loader_.get(),
+ loader_controller_.get()));
+ change_list_loader_->AddObserver(this);
+
+ sync_client_.reset(new internal::SyncClient(blocking_task_runner_.get(),
+ observer,
+ scheduler_,
+ resource_metadata_,
+ cache_,
+ loader_controller_.get(),
+ temporary_file_directory_));
+
copy_operation_.reset(
new file_system::CopyOperation(
blocking_task_runner_.get(),
cache_,
drive_service_->GetResourceIdCanonicalizer()));
create_directory_operation_.reset(new file_system::CreateDirectoryOperation(
- blocking_task_runner_.get(), observer, scheduler_, resource_metadata_));
+ blocking_task_runner_.get(), observer, resource_metadata_));
create_file_operation_.reset(
new file_system::CreateFileOperation(blocking_task_runner_.get(),
observer,
- scheduler_,
- resource_metadata_,
- cache_));
+ resource_metadata_));
move_operation_.reset(
new file_system::MoveOperation(blocking_task_runner_.get(),
observer,
cache_,
temporary_file_directory_));
search_operation_.reset(new file_system::SearchOperation(
- blocking_task_runner_.get(), scheduler_, resource_metadata_));
+ blocking_task_runner_.get(), scheduler_, resource_metadata_,
+ loader_controller_.get()));
get_file_for_saving_operation_.reset(
- new file_system::GetFileForSavingOperation(blocking_task_runner_.get(),
+ new file_system::GetFileForSavingOperation(logger_,
+ blocking_task_runner_.get(),
observer,
scheduler_,
resource_metadata_,
cache_,
temporary_file_directory_));
-
- sync_client_.reset(new internal::SyncClient(blocking_task_runner_.get(),
- observer,
- scheduler_,
- resource_metadata_,
- cache_,
- temporary_file_directory_));
-
- change_list_loader_.reset(new internal::ChangeListLoader(
- blocking_task_runner_.get(),
- resource_metadata_,
- scheduler_,
- drive_service_));
- change_list_loader_->AddObserver(this);
}
void FileSystem::CheckForUpdates() {
DVLOG_IF(1, error != FILE_ERROR_OK) << "LoadDirectoryIfNeeded failed. "
<< FileErrorToString(error);
- resource_metadata_->ReadDirectoryByPathOnUIThread(
- directory_path,
+ ResourceEntryVector* entries = new ResourceEntryVector;
+ base::PostTaskAndReplyWithResult(
+ blocking_task_runner_.get(),
+ FROM_HERE,
+ base::Bind(&internal::ResourceMetadata::ReadDirectoryByPath,
+ base::Unretained(resource_metadata_),
+ directory_path,
+ entries),
base::Bind(&FileSystem::ReadDirectoryAfterRead,
weak_ptr_factory_.GetWeakPtr(),
directory_path,
- callback));
+ callback,
+ base::Owned(entries)));
}
-void FileSystem::ReadDirectoryAfterRead(
- const base::FilePath& directory_path,
- const ReadDirectoryCallback& callback,
- FileError error,
- scoped_ptr<ResourceEntryVector> entries) {
+void FileSystem::ReadDirectoryAfterRead(const base::FilePath& directory_path,
+ const ReadDirectoryCallback& callback,
+ const ResourceEntryVector* entries,
+ FileError error) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(!callback.is_null());
if (error != FILE_ERROR_OK) {
- callback.Run(error, scoped_ptr<ResourceEntryVector>());
+ callback.Run(error, scoped_ptr<ResourceEntryVector>(), false);
return;
}
- DCHECK(entries.get()); // This is valid for empty directories too.
// TODO(satorux): Stop handling hide_hosted_docs here. crbug.com/256520.
const bool hide_hosted_docs =
filtered->push_back(entries->at(i));
}
- callback.Run(FILE_ERROR_OK, filtered.Pass());
+ callback.Run(FILE_ERROR_OK, filtered.Pass(), false);
}
void FileSystem::GetAvailableSpace(
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(!callback.is_null());
- change_list_loader_->GetAboutResource(
+ about_resource_loader_->GetAboutResource(
base::Bind(&FileSystem::OnGetAboutResource,
weak_ptr_factory_.GetWeakPtr(),
callback));