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

Unified Diff: chrome/browser/chromeos/drive/file_system/create_file_operation.cc

Issue 137423010: drive: Support offline file creation (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/drive/file_system/create_file_operation.cc
diff --git a/chrome/browser/chromeos/drive/file_system/create_file_operation.cc b/chrome/browser/chromeos/drive/file_system/create_file_operation.cc
index 36da187d463591abed73cd0c6654ce955ce88cfc..7fe706895c4aad6568b23189fb25de4dfa85945c 100644
--- a/chrome/browser/chromeos/drive/file_system/create_file_operation.cc
+++ b/chrome/browser/chromeos/drive/file_system/create_file_operation.cc
@@ -8,11 +8,7 @@
#include "base/file_util.h"
#include "chrome/browser/chromeos/drive/drive.pb.h"
-#include "chrome/browser/chromeos/drive/file_cache.h"
#include "chrome/browser/chromeos/drive/file_system/operation_observer.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 "content/public/browser/browser_thread.h"
#include "net/base/mime_util.h"
@@ -26,108 +22,46 @@ namespace {
const char kMimeTypeOctetStream[] = "application/octet-stream";
-// Part of CreateFileOperation::CreateFile(), runs on |blocking_task_runner_|
-// of the operation, before server-side file creation.
-FileError CheckPreConditionForCreateFile(internal::ResourceMetadata* metadata,
- const base::FilePath& file_path,
- bool is_exclusive,
- std::string* parent_resource_id,
- std::string* mime_type) {
+// Updates local state.
+FileError UpdateLocalState(internal::ResourceMetadata* metadata,
+ const base::FilePath& file_path,
+ const std::string& mime_type_in,
+ ResourceEntry* entry) {
DCHECK(metadata);
- DCHECK(parent_resource_id);
- DCHECK(mime_type);
- ResourceEntry entry;
- FileError error = metadata->GetResourceEntryByPath(file_path, &entry);
- if (error == FILE_ERROR_OK) {
- // Error if an exclusive mode is requested, or the entry is not a file.
- return (is_exclusive ||
- entry.file_info().is_directory() ||
- entry.file_specific_info().is_hosted_document()) ?
- FILE_ERROR_EXISTS : FILE_ERROR_OK;
- }
+ FileError error = metadata->GetResourceEntryByPath(file_path, entry);
+ if (error == FILE_ERROR_OK)
+ return FILE_ERROR_EXISTS;
- // If the file is not found, an actual request to create a new file will be
- // sent to the server.
- if (error == FILE_ERROR_NOT_FOUND) {
- // If parent path is not a directory, it is an error.
- ResourceEntry parent;
- if (metadata->GetResourceEntryByPath(
- file_path.DirName(), &parent) != FILE_ERROR_OK ||
- !parent.file_info().is_directory())
- return FILE_ERROR_NOT_A_DIRECTORY;
-
- // In the request, parent_resource_id and mime_type are needed.
- // Here, populate them.
- *parent_resource_id = parent.resource_id();
-
- // If mime_type is not set or "application/octet-stream", guess from the
- // |file_path|. If it is still unsure, use octet-stream by default.
- if ((mime_type->empty() || *mime_type == kMimeTypeOctetStream) &&
- !net::GetMimeTypeFromFile(file_path, mime_type)) {
- *mime_type = kMimeTypeOctetStream;
- }
- }
+ if (error != FILE_ERROR_NOT_FOUND)
+ return error;
- return error;
-}
+ // If parent path is not a directory, it is an error.
+ ResourceEntry parent;
+ if (metadata->GetResourceEntryByPath(
+ file_path.DirName(), &parent) != FILE_ERROR_OK ||
+ !parent.file_info().is_directory())
+ return FILE_ERROR_NOT_A_DIRECTORY;
-// Part of CreateFileOperation::CreateFile(), runs on |blocking_task_runner_|
-// of the operation, after server side file creation.
-FileError UpdateLocalStateForCreateFile(
- internal::ResourceMetadata* metadata,
- internal::FileCache* cache,
- scoped_ptr<google_apis::ResourceEntry> resource_entry,
- base::FilePath* file_path) {
- DCHECK(metadata);
- DCHECK(cache);
- DCHECK(resource_entry);
- DCHECK(file_path);
+ // If mime_type is not set or "application/octet-stream", guess from the
+ // |file_path|. If it is still unsure, use octet-stream by default.
+ std::string mime_type = mime_type_in;
+ if ((mime_type.empty() || mime_type == kMimeTypeOctetStream) &&
+ !net::GetMimeTypeFromFile(file_path, &mime_type))
+ mime_type = kMimeTypeOctetStream;
// Add the entry to the local resource metadata.
- ResourceEntry entry;
- std::string parent_resource_id;
- if (!ConvertToResourceEntry(*resource_entry, &entry, &parent_resource_id) ||
- parent_resource_id.empty())
- return FILE_ERROR_NOT_A_FILE;
-
- std::string parent_local_id;
- FileError error = metadata->GetIdByResourceId(parent_resource_id,
- &parent_local_id);
- if (error != FILE_ERROR_OK)
- return error;
- entry.set_parent_local_id(parent_local_id);
+ const base::Time now = base::Time::Now();
+ entry->mutable_file_info()->set_last_modified(now.ToInternalValue());
+ entry->mutable_file_info()->set_last_accessed(now.ToInternalValue());
+ entry->set_title(file_path.BaseName().AsUTF8Unsafe());
+ entry->set_parent_local_id(parent.local_id());
+ entry->set_metadata_edit_state(ResourceEntry::DIRTY);
+ entry->mutable_file_specific_info()->set_content_mime_type(mime_type);
std::string 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);
-
- if (error == FILE_ERROR_OK) {
- // At this point, upload to the server is fully succeeded.
- // Populate the |file_path| which will be used to notify the observer.
- *file_path = metadata->GetFilePath(local_id);
-
- // Also store an empty file to the cache.
- // Here, failure is not a fatal error, so ignore the returned code.
- FileError cache_store_error = FILE_ERROR_FAILED;
- base::FilePath empty_file;
- if (base::CreateTemporaryFile(&empty_file)) {
- cache_store_error = cache->Store(
- local_id,
- entry.file_specific_info().md5(),
- empty_file,
- internal::FileCache::FILE_OPERATION_MOVE);
- }
- DLOG_IF(WARNING, cache_store_error != FILE_ERROR_OK)
- << "Failed to store a cache file: "
- << FileErrorToString(cache_store_error)
- << ", local_id: " << local_id;
- }
-
+ error = metadata->AddEntry(*entry, &local_id);
+ entry->set_local_id(local_id);
return error;
}
@@ -136,14 +70,10 @@ FileError UpdateLocalStateForCreateFile(
CreateFileOperation::CreateFileOperation(
base::SequencedTaskRunner* blocking_task_runner,
OperationObserver* observer,
- JobScheduler* scheduler,
- internal::ResourceMetadata* metadata,
- internal::FileCache* cache)
+ internal::ResourceMetadata* metadata)
: blocking_task_runner_(blocking_task_runner),
observer_(observer),
- scheduler_(scheduler),
metadata_(metadata),
- cache_(cache),
weak_ptr_factory_(this) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
}
@@ -159,95 +89,43 @@ void CreateFileOperation::CreateFile(const base::FilePath& file_path,
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(!callback.is_null());
- std::string* parent_resource_id = new std::string;
- std::string* determined_mime_type = new std::string(mime_type);
+ ResourceEntry* entry = new ResourceEntry;
base::PostTaskAndReplyWithResult(
blocking_task_runner_.get(),
FROM_HERE,
- base::Bind(&CheckPreConditionForCreateFile,
+ base::Bind(&UpdateLocalState,
metadata_,
file_path,
- is_exclusive,
- parent_resource_id,
- determined_mime_type),
- base::Bind(&CreateFileOperation::CreateFileAfterCheckPreCondition,
- weak_ptr_factory_.GetWeakPtr(),
- file_path,
- callback,
- base::Owned(parent_resource_id),
- base::Owned(determined_mime_type)));
-}
-
-void CreateFileOperation::CreateFileAfterCheckPreCondition(
- const base::FilePath& file_path,
- const FileOperationCallback& callback,
- std::string* parent_resource_id,
- std::string* mime_type,
- FileError error) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- DCHECK(!callback.is_null());
- DCHECK(parent_resource_id);
- DCHECK(mime_type);
-
- // If the file is found, or an error other than "not found" is found,
- // runs callback and quit the operation.
- if (error != FILE_ERROR_NOT_FOUND) {
- callback.Run(error);
- return;
- }
-
- scheduler_->CreateFile(
- *parent_resource_id,
- file_path,
- file_path.BaseName().value(),
- *mime_type,
- ClientContext(USER_INITIATED),
- base::Bind(&CreateFileOperation::CreateFileAfterUpload,
- weak_ptr_factory_.GetWeakPtr(),
- callback));
-}
-
-void CreateFileOperation::CreateFileAfterUpload(
- const FileOperationCallback& callback,
- google_apis::GDataErrorCode gdata_error,
- scoped_ptr<google_apis::ResourceEntry> resource_entry) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- DCHECK(!callback.is_null());
-
- FileError error = GDataToFileError(gdata_error);
- if (error != FILE_ERROR_OK) {
- callback.Run(error);
- return;
- }
- DCHECK(resource_entry);
-
- base::FilePath* file_path = new base::FilePath;
- base::PostTaskAndReplyWithResult(
- blocking_task_runner_.get(),
- FROM_HERE,
- base::Bind(&UpdateLocalStateForCreateFile,
- metadata_,
- cache_,
- base::Passed(&resource_entry),
- file_path),
+ mime_type,
+ entry),
base::Bind(&CreateFileOperation::CreateFileAfterUpdateLocalState,
weak_ptr_factory_.GetWeakPtr(),
callback,
- base::Owned(file_path)));
+ file_path,
+ is_exclusive,
+ base::Owned(entry)));
}
void CreateFileOperation::CreateFileAfterUpdateLocalState(
const FileOperationCallback& callback,
- base::FilePath* file_path,
+ const base::FilePath& file_path,
+ bool is_exclusive,
+ ResourceEntry* entry,
FileError error) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(!callback.is_null());
- DCHECK(file_path);
-
- // Notify observer if the file creation process is successfully done.
- if (error == FILE_ERROR_OK)
- observer_->OnDirectoryChangedByOperation(file_path->DirName());
+ if (error == FILE_ERROR_EXISTS) {
+ // Error if an exclusive mode is requested, or the entry is not a file.
+ error = (is_exclusive ||
+ entry->file_info().is_directory() ||
+ entry->file_specific_info().is_hosted_document()) ?
+ FILE_ERROR_EXISTS : FILE_ERROR_OK;
+ } else if (error == FILE_ERROR_OK) {
+ // Notify observer if the file was newly created.
+ observer_->OnDirectoryChangedByOperation(file_path.DirName());
+ observer_->OnEntryUpdatedByOperation(entry->local_id());
+ }
callback.Run(error);
}

Powered by Google App Engine
This is Rietveld 408576698