Index: chrome/browser/chromeos/drive/file_system/copy_operation.cc |
diff --git a/chrome/browser/chromeos/drive/file_system/copy_operation.cc b/chrome/browser/chromeos/drive/file_system/copy_operation.cc |
index 08045398a4449de7ed6e65fff51b27df7a856821..0e42f7be4dfcdcfbcf95c9790baa24b5623030d6 100644 |
--- a/chrome/browser/chromeos/drive/file_system/copy_operation.cc |
+++ b/chrome/browser/chromeos/drive/file_system/copy_operation.cc |
@@ -10,6 +10,7 @@ |
#include "base/task_runner_util.h" |
#include "chrome/browser/chromeos/drive/drive.pb.h" |
#include "chrome/browser/chromeos/drive/file_cache.h" |
+#include "chrome/browser/chromeos/drive/file_change.h" |
#include "chrome/browser/chromeos/drive/file_system/create_file_operation.h" |
#include "chrome/browser/chromeos/drive/file_system/operation_observer.h" |
#include "chrome/browser/chromeos/drive/file_system_util.h" |
@@ -163,13 +164,13 @@ FileError TryToCopyLocally(internal::ResourceMetadata* metadata, |
FileError UpdateLocalStateForServerSideOperation( |
internal::ResourceMetadata* metadata, |
scoped_ptr<google_apis::FileResource> file_resource, |
+ ResourceEntry* entry, |
base::FilePath* file_path) { |
DCHECK(file_resource); |
- ResourceEntry entry; |
std::string parent_resource_id; |
- if (!ConvertFileResourceToResourceEntry(*file_resource, &entry, |
- &parent_resource_id) || |
+ if (!ConvertFileResourceToResourceEntry( |
+ *file_resource, entry, &parent_resource_id) || |
parent_resource_id.empty()) |
return FILE_ERROR_NOT_A_FILE; |
@@ -178,14 +179,14 @@ FileError UpdateLocalStateForServerSideOperation( |
&parent_local_id); |
if (error != FILE_ERROR_OK) |
return error; |
- entry.set_parent_local_id(parent_local_id); |
+ entry->set_parent_local_id(parent_local_id); |
std::string local_id; |
- error = metadata->AddEntry(entry, &local_id); |
+ error = metadata->AddEntry(*entry, &local_id); |
// Depending on timing, the metadata may have inserted via change list |
// already. So, FILE_ERROR_EXISTS is not an error. |
if (error == FILE_ERROR_EXISTS) |
- error = metadata->GetIdByResourceId(entry.resource_id(), &local_id); |
+ error = metadata->GetIdByResourceId(entry->resource_id(), &local_id); |
if (error != FILE_ERROR_OK) |
return error; |
@@ -200,13 +201,13 @@ FileError UpdateLocalStateForScheduleTransfer( |
internal::FileCache* cache, |
const base::FilePath& local_src_path, |
const base::FilePath& remote_dest_path, |
+ ResourceEntry* entry, |
std::string* local_id) { |
FileError error = metadata->GetIdByPath(remote_dest_path, local_id); |
if (error != FILE_ERROR_OK) |
return error; |
- ResourceEntry entry; |
- error = metadata->GetResourceEntryById(*local_id, &entry); |
+ error = metadata->GetResourceEntryById(*local_id, entry); |
if (error != FILE_ERROR_OK) |
return error; |
@@ -336,8 +337,14 @@ void CopyOperation::CopyAfterTryToCopyLocally( |
for (size_t i = 0; i < updated_local_ids->size(); ++i) |
observer_->OnEntryUpdatedByOperation((*updated_local_ids)[i]); |
- if (*directory_changed) |
- observer_->OnDirectoryChangedByOperation(params->dest_file_path.DirName()); |
+ if (*directory_changed) { |
+ FileChange changed_file; |
+ DCHECK(!params->src_entry.file_info().is_directory()); |
+ changed_file.Update(params->dest_file_path, |
+ FileChange::FILE_TYPE_FILE, |
+ FileChange::ADD_OR_UPDATE); |
+ observer_->OnFileChangedByOperation(changed_file); |
+ } |
if (error != FILE_ERROR_OK || !*should_copy_on_server) { |
params->callback.Run(error); |
@@ -449,12 +456,19 @@ void CopyOperation::TransferJsonGdocFileAfterLocalWork( |
// When |resource_id| has no parent, we just set the new destination folder |
// as the parent, for sharing the document between the original source. |
// This reparenting is already done in LocalWorkForTransferJsonGdocFile(). |
- case IS_ORPHAN: |
+ case IS_ORPHAN: { |
DCHECK(!params->changed_path.empty()); |
observer_->OnEntryUpdatedByOperation(params->local_id); |
- observer_->OnDirectoryChangedByOperation(params->changed_path.DirName()); |
+ |
+ FileChange changed_file; |
+ changed_file.Update( |
+ params->changed_path, |
+ FileChange::FILE_TYPE_FILE, // This must be a hosted document. |
+ FileChange::ADD_OR_UPDATE); |
+ observer_->OnFileChangedByOperation(changed_file); |
params->callback.Run(error); |
break; |
+ } |
// When the |resource_id| is not in the local metadata, assume it to be a |
// document just now shared on the server but not synced locally. |
// Same as the IS_ORPHAN case, we want to deal the case by setting parent, |
@@ -503,6 +517,8 @@ void CopyOperation::UpdateAfterServerSideOperation( |
return; |
} |
+ ResourceEntry* resource_entry = new ResourceEntry; |
+ |
// The copy on the server side is completed successfully. Update the local |
// metadata. |
base::FilePath* file_path = new base::FilePath; |
@@ -510,21 +526,30 @@ void CopyOperation::UpdateAfterServerSideOperation( |
blocking_task_runner_.get(), |
FROM_HERE, |
base::Bind(&UpdateLocalStateForServerSideOperation, |
- metadata_, base::Passed(&entry), file_path), |
+ metadata_, |
+ base::Passed(&entry), |
+ resource_entry, |
+ file_path), |
base::Bind(&CopyOperation::UpdateAfterLocalStateUpdate, |
weak_ptr_factory_.GetWeakPtr(), |
- callback, base::Owned(file_path))); |
+ callback, |
+ base::Owned(file_path), |
+ base::Owned(resource_entry))); |
} |
void CopyOperation::UpdateAfterLocalStateUpdate( |
const FileOperationCallback& callback, |
base::FilePath* file_path, |
+ const ResourceEntry* entry, |
FileError error) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(!callback.is_null()); |
- if (error == FILE_ERROR_OK) |
- observer_->OnDirectoryChangedByOperation(file_path->DirName()); |
+ if (error == FILE_ERROR_OK) { |
+ FileChange changed_file; |
+ changed_file.Update(*file_path, *entry, FileChange::ADD_OR_UPDATE); |
+ observer_->OnFileChangedByOperation(changed_file); |
+ } |
callback.Run(error); |
} |
@@ -558,28 +583,39 @@ void CopyOperation::ScheduleTransferRegularFileAfterCreate( |
} |
std::string* local_id = new std::string; |
+ ResourceEntry* entry = new ResourceEntry; |
base::PostTaskAndReplyWithResult( |
blocking_task_runner_.get(), |
FROM_HERE, |
- base::Bind( |
- &UpdateLocalStateForScheduleTransfer, |
- metadata_, cache_, local_src_path, remote_dest_path, local_id), |
+ base::Bind(&UpdateLocalStateForScheduleTransfer, |
+ metadata_, |
+ cache_, |
+ local_src_path, |
+ remote_dest_path, |
+ entry, |
+ local_id), |
base::Bind( |
&CopyOperation::ScheduleTransferRegularFileAfterUpdateLocalState, |
- weak_ptr_factory_.GetWeakPtr(), callback, remote_dest_path, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ callback, |
+ remote_dest_path, |
+ base::Owned(entry), |
base::Owned(local_id))); |
} |
void CopyOperation::ScheduleTransferRegularFileAfterUpdateLocalState( |
const FileOperationCallback& callback, |
const base::FilePath& remote_dest_path, |
+ const ResourceEntry* entry, |
std::string* local_id, |
FileError error) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(!callback.is_null()); |
if (error == FILE_ERROR_OK) { |
- observer_->OnDirectoryChangedByOperation(remote_dest_path.DirName()); |
+ FileChange changed_file; |
+ changed_file.Update(remote_dest_path, *entry, FileChange::ADD_OR_UPDATE); |
+ observer_->OnFileChangedByOperation(changed_file); |
observer_->OnEntryUpdatedByOperation(*local_id); |
} |
callback.Run(error); |