| 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
 | 
| 
 |