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

Unified Diff: chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_api.cc

Issue 194693002: [fsp] Add requestUnmount() method together with the request manager. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed some too strict thread checks. Created 6 years, 8 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/extensions/file_system_provider/file_system_provider_api.cc
diff --git a/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_api.cc b/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_api.cc
index e891b1cd92d9016a80a6b4d0b5fe49d7ab29820e..29b08b26c0724829f2facb3b4ccf3618dd6a746d 100644
--- a/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_api.cc
+++ b/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_api.cc
@@ -4,8 +4,12 @@
#include "chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_api.h"
+#include <string>
+
+#include "base/values.h"
#include "chrome/browser/chromeos/file_system_provider/service.h"
#include "chrome/common/extensions/api/file_system_provider.h"
+#include "chrome/common/extensions/api/file_system_provider_internal.h"
namespace extensions {
namespace {
@@ -16,8 +20,10 @@ const char kSecurityErrorName[] = "SecurityError";
// Error messages.
const char kEmptyNameErrorMessage[] = "Empty display name is not allowed.";
-const char kRegisteringFailedErrorMessage[] =
- "Registering the file system failed.";
+const char kMountFailedErrorMessage[] = "Mounting the file system failed.";
+const char kUnmountFailedErrorMessage[] = "Unmounting the file system failed.";
+const char kResponseFailedErrorMessage[] =
+ "Sending a response for the request failed.";
// Creates a dictionary, which looks like a DOMError. The returned dictionary
// will be converted to a real DOMError object in
@@ -30,10 +36,53 @@ base::DictionaryValue* CreateError(const std::string& name,
return error;
}
+// Converts ProviderError to base::File::Error. This could be redundant, if it
+// was possible to create DOMError instances in Javascript easily.
+base::File::Error ProviderErrorToFileError(
+ api::file_system_provider::ProviderError error) {
+ switch (error) {
+ case api::file_system_provider::PROVIDER_ERROR_OK:
+ return base::File::FILE_OK;
+ case api::file_system_provider::PROVIDER_ERROR_IN_USE:
+ return base::File::FILE_ERROR_IN_USE;
+ case api::file_system_provider::PROVIDER_ERROR_EXISTS:
+ return base::File::FILE_ERROR_EXISTS;
+ case api::file_system_provider::PROVIDER_ERROR_NOT_FOUND:
+ return base::File::FILE_ERROR_NOT_FOUND;
+ case api::file_system_provider::PROVIDER_ERROR_ACCESS_DENIED:
+ return base::File::FILE_ERROR_ACCESS_DENIED;
+ case api::file_system_provider::PROVIDER_ERROR_TOO_MANY_OPENED:
+ return base::File::FILE_ERROR_TOO_MANY_OPENED;
+ case api::file_system_provider::PROVIDER_ERROR_NO_MEMORY:
+ return base::File::FILE_ERROR_NO_MEMORY;
+ case api::file_system_provider::PROVIDER_ERROR_NO_SPACE:
+ return base::File::FILE_ERROR_NO_SPACE;
+ case api::file_system_provider::PROVIDER_ERROR_NOT_A_DIRECTORY:
+ return base::File::FILE_ERROR_NOT_A_DIRECTORY;
+ case api::file_system_provider::PROVIDER_ERROR_INVALID_OPERATION:
+ return base::File::FILE_ERROR_INVALID_OPERATION;
+ case api::file_system_provider::PROVIDER_ERROR_SECURITY:
+ return base::File::FILE_ERROR_SECURITY;
+ case api::file_system_provider::PROVIDER_ERROR_ABORT:
+ return base::File::FILE_ERROR_ABORT;
+ case api::file_system_provider::PROVIDER_ERROR_NOT_A_FILE:
+ return base::File::FILE_ERROR_NOT_A_FILE;
+ case api::file_system_provider::PROVIDER_ERROR_NOT_EMPTY:
+ return base::File::FILE_ERROR_NOT_EMPTY;
+ case api::file_system_provider::PROVIDER_ERROR_INVALID_URL:
+ return base::File::FILE_ERROR_INVALID_URL;
+ case api::file_system_provider::PROVIDER_ERROR_IO:
+ return base::File::FILE_ERROR_IO;
+ default:
+ NOTREACHED();
+ }
+ return base::File::FILE_ERROR_FAILED;
+}
+
} // namespace
bool FileSystemProviderMountFunction::RunImpl() {
- using extensions::api::file_system_provider::Mount::Params;
+ using api::file_system_provider::Mount::Params;
const scoped_ptr<Params> params(Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params);
@@ -52,7 +101,7 @@ bool FileSystemProviderMountFunction::RunImpl() {
DCHECK(service);
int file_system_id =
- service->RegisterFileSystem(extension_id(), params->display_name);
+ service->MountFileSystem(extension_id(), params->display_name);
// If the |file_system_id| is zero, then it means that registering the file
// system failed.
@@ -60,8 +109,7 @@ bool FileSystemProviderMountFunction::RunImpl() {
if (!file_system_id) {
base::ListValue* result = new base::ListValue();
result->Append(new base::FundamentalValue(0));
- result->Append(
- CreateError(kSecurityErrorName, kRegisteringFailedErrorMessage));
+ result->Append(CreateError(kSecurityErrorName, kMountFailedErrorMessage));
SetResult(result);
return false;
}
@@ -75,4 +123,90 @@ bool FileSystemProviderMountFunction::RunImpl() {
return true;
}
+bool FileSystemProviderUnmountFunction::RunImpl() {
+ using api::file_system_provider::Unmount::Params;
+ const scoped_ptr<Params> params(Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params);
+
+ chromeos::file_system_provider::Service* service =
+ chromeos::file_system_provider::Service::Get(GetProfile());
+ DCHECK(service);
+
+ if (!service->UnmountFileSystem(extension_id(), params->file_system_id)) {
+ // TODO(mtomasz): Pass more detailed errors, rather than just a bool.
+ base::ListValue* result = new base::ListValue();
+ result->Append(CreateError(kSecurityErrorName, kUnmountFailedErrorMessage));
+ SetResult(result);
+ return false;
+ }
+
+ base::ListValue* result = new base::ListValue();
+ SetResult(result);
+ SendResponse(true);
+ return true;
+}
+
+bool FileSystemProviderInternalUnmountRequestedSuccessFunction::RunImpl() {
+ using api::file_system_provider_internal::UnmountRequestedSuccess::Params;
+ const scoped_ptr<Params> params(Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params);
+
+ chromeos::file_system_provider::Service* service =
+ chromeos::file_system_provider::Service::Get(GetProfile());
+ DCHECK(service);
+
+ if (!service->FulfillRequest(extension_id(),
+ params->file_system_id,
+ params->request_id,
+ scoped_ptr<base::DictionaryValue>(),
+ false /* has_more */)) {
+ // TODO(mtomasz): Pass more detailed errors, rather than just a bool.
+ base::ListValue* result = new base::ListValue();
+ result->Append(
+ CreateError(kSecurityErrorName, kResponseFailedErrorMessage));
+ SetResult(result);
+ return false;
+ }
+
+ base::ListValue* result = new base::ListValue();
+ SetResult(result);
+ SendResponse(true);
+ return true;
+}
+
+bool FileSystemProviderInternalUnmountRequestedErrorFunction::RunImpl() {
+ using api::file_system_provider_internal::UnmountRequestedError::Params;
+ const scoped_ptr<Params> params(Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params);
+
+ chromeos::file_system_provider::Service* service =
+ chromeos::file_system_provider::Service::Get(GetProfile());
+ DCHECK(service);
+
+ // Currently it is not possible to refer to types/enums defined in a different
+ // IDL file. Therefore we need to convert DOMString to ProviderError, since
+ // UnmountRequestedErrorFunction() is defined in a different namespace than
+ // ProvidedError.
+ // TODO(mtomasz): Remove this trick, once IDL supports namespaces correctly.
+ const api::file_system_provider::ProviderError provider_error =
+ api::file_system_provider::ParseProviderError(params->error);
+
+ if (!service->RejectRequest(extension_id(),
+ params->file_system_id,
+ params->request_id,
+ ProviderErrorToFileError(provider_error))) {
+ // TODO(mtomasz): Pass more detailed errors, rather than just a bool.
+ base::ListValue* result = new base::ListValue();
+ result->Append(
+ CreateError(kSecurityErrorName, kResponseFailedErrorMessage));
+ SetResult(result);
+ return false;
+ }
+
+ base::ListValue* result = new base::ListValue();
+ SetResult(result);
+ SendResponse(true);
+ return true;
+}
+
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698