#include "base/sequenced_task_runner.h"
#include "chrome/browser/chromeos/drive/drive.pb.h"
-#include "chrome/browser/chromeos/drive/file_system/operation_observer.h"
+#include "chrome/browser/chromeos/drive/file_system/operation_delegate.h"
#include "chrome/browser/chromeos/drive/file_system_util.h"
#include "chrome/browser/chromeos/drive/job_scheduler.h"
#include "chrome/browser/chromeos/drive/resource_entry_conversion.h"
+#include "chrome/browser/chromeos/drive/resource_metadata.h"
#include "chrome/browser/chromeos/drive/sync/entry_revert_performer.h"
+#include "chrome/browser/drive/drive_api_util.h"
#include "content/public/browser/browser_thread.h"
+#include "google_apis/drive/drive_api_parser.h"
using content::BrowserThread;
RemovePerformer::RemovePerformer(
base::SequencedTaskRunner* blocking_task_runner,
- file_system::OperationObserver* observer,
+ file_system::OperationDelegate* delegate,
JobScheduler* scheduler,
ResourceMetadata* metadata)
: blocking_task_runner_(blocking_task_runner),
- observer_(observer),
+ delegate_(delegate),
scheduler_(scheduler),
metadata_(metadata),
entry_revert_performer_(new EntryRevertPerformer(blocking_task_runner,
- observer,
+ delegate,
scheduler,
metadata)),
weak_ptr_factory_(this) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
}
+// Returns |entry| corresponding to |local_id|.
+// Adding to that, removes the entry when it does not exist on the server.
+FileError TryToRemoveLocally(ResourceMetadata* metadata,
+ const std::string& local_id,
+ ResourceEntry* entry) {
+ FileError error = metadata->GetResourceEntryById(local_id, entry);
+ if (error != FILE_ERROR_OK || !entry->resource_id().empty())
+ return error;
+ return metadata->RemoveEntry(local_id);
+}
+
void RemovePerformer::Remove(const std::string& local_id,
const ClientContext& context,
const FileOperationCallback& callback) {
base::PostTaskAndReplyWithResult(
blocking_task_runner_.get(),
FROM_HERE,
- base::Bind(&ResourceMetadata::GetResourceEntryById,
- base::Unretained(metadata_),
- local_id,
- entry),
+ base::Bind(&TryToRemoveLocally, metadata_, local_id, entry),
base::Bind(&RemovePerformer::RemoveAfterGetResourceEntry,
weak_ptr_factory_.GetWeakPtr(),
context,
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(!callback.is_null());
- if (error != FILE_ERROR_OK) {
+ if (error != FILE_ERROR_OK || entry->resource_id().empty()) {
callback.Run(error);
return;
}
if (status == google_apis::HTTP_FORBIDDEN) {
// Editing this entry is not allowed, revert local changes.
entry_revert_performer_->RevertEntry(local_id, context, callback);
- observer_->OnDriveSyncError(
+ delegate_->OnDriveSyncError(
file_system::DRIVE_SYNC_ERROR_DELETE_WITHOUT_PERMISSION, local_id);
return;
}
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(!callback.is_null());
- scheduler_->GetResourceEntry(
+ scheduler_->GetFileResource(
resource_id,
context,
- base::Bind(&RemovePerformer::UnparentResourceAfterGetResourceEntry,
+ base::Bind(&RemovePerformer::UnparentResourceAfterGetFileResource,
weak_ptr_factory_.GetWeakPtr(), context, callback, local_id));
}
-void RemovePerformer::UnparentResourceAfterGetResourceEntry(
+void RemovePerformer::UnparentResourceAfterGetFileResource(
const ClientContext& context,
const FileOperationCallback& callback,
const std::string& local_id,
google_apis::GDataErrorCode status,
- scoped_ptr<google_apis::ResourceEntry> resource_entry) {
+ scoped_ptr<google_apis::FileResource> file_resource) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(!callback.is_null());
ResourceEntry entry;
std::string parent_resource_id;
- if (!ConvertToResourceEntry(*resource_entry, &entry, &parent_resource_id)) {
+ if (!ConvertFileResourceToResourceEntry(*file_resource, &entry,
+ &parent_resource_id)) {
callback.Run(FILE_ERROR_NOT_A_FILE);
return;
}