Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / media_galleries / fileapi / picasa_file_util.cc
index 423a8cb..65a2c3c 100644 (file)
 #include "chrome/browser/media_galleries/imported_media_gallery_registry.h"
 #include "chrome/common/media_galleries/picasa_types.h"
 #include "content/public/browser/browser_thread.h"
-#include "webkit/browser/fileapi/file_system_operation_context.h"
-#include "webkit/browser/fileapi/file_system_url.h"
-#include "webkit/browser/fileapi/native_file_util.h"
-#include "webkit/common/fileapi/file_system_util.h"
+#include "storage/browser/fileapi/file_system_operation_context.h"
+#include "storage/browser/fileapi/file_system_url.h"
+#include "storage/browser/fileapi/native_file_util.h"
+#include "storage/common/fileapi/file_system_util.h"
 
 using base::FilePath;
-using fileapi::DirectoryEntry;
-using fileapi::FileSystemOperationContext;
-using fileapi::FileSystemURL;
+using storage::DirectoryEntry;
+using storage::FileSystemOperationContext;
+using storage::FileSystemURL;
 
 namespace picasa {
 
 namespace {
 
-base::PlatformFileError FindAlbumInfo(const std::string& key,
-                                      const AlbumMap* map,
-                                      AlbumInfo* album_info) {
+base::File::Error FindAlbumInfo(const std::string& key,
+                                const AlbumMap* map,
+                                AlbumInfo* album_info) {
   if (!map)
-    return base::PLATFORM_FILE_ERROR_FAILED;
+    return base::File::FILE_ERROR_FAILED;
 
   AlbumMap::const_iterator it = map->find(key);
 
   if (it == map->end())
-    return base::PLATFORM_FILE_ERROR_NOT_FOUND;
+    return base::File::FILE_ERROR_NOT_FOUND;
 
   if (album_info != NULL)
     *album_info = it->second;
 
-  return base::PLATFORM_FILE_OK;
+  return base::File::FILE_OK;
 }
 
-PicasaDataProvider::DataType GetDataTypeForURL(
-    const fileapi::FileSystemURL& url) {
-  std::vector<std::string> components;
-  fileapi::VirtualPath::GetComponentsUTF8Unsafe(url.path(), &components);
+std::vector<std::string> GetVirtualPathComponents(
+    const storage::FileSystemURL& url) {
+  ImportedMediaGalleryRegistry* imported_registry =
+      ImportedMediaGalleryRegistry::GetInstance();
+  base::FilePath root = imported_registry->ImportedRoot().AppendASCII("picasa");
+
+  DCHECK(root.IsParent(url.path()) || root == url.path());
+  base::FilePath virtual_path;
+  root.AppendRelativePath(url.path(), &virtual_path);
+
+  std::vector<std::string> result;
+  storage::VirtualPath::GetComponentsUTF8Unsafe(virtual_path, &result);
+  return result;
+}
 
+PicasaDataProvider::DataType GetDataTypeForURL(
+    const storage::FileSystemURL& url) {
+  std::vector<std::string> components = GetVirtualPathComponents(url);
   if (components.size() >= 2 && components[0] == kPicasaDirAlbums)
     return PicasaDataProvider::ALBUMS_IMAGES_DATA;
 
@@ -73,66 +86,79 @@ PicasaFileUtil::PicasaFileUtil(MediaPathFilter* media_path_filter)
 PicasaFileUtil::~PicasaFileUtil() {}
 
 void PicasaFileUtil::GetFileInfoOnTaskRunnerThread(
-    scoped_ptr<fileapi::FileSystemOperationContext> context,
-    const fileapi::FileSystemURL& url,
+    scoped_ptr<storage::FileSystemOperationContext> context,
+    const storage::FileSystemURL& url,
     const GetFileInfoCallback& callback) {
-  GetDataProvider()->RefreshData(
-      GetDataTypeForURL(url),
-      base::Bind(&PicasaFileUtil::GetFileInfoWithFreshDataProvider,
-                 weak_factory_.GetWeakPtr(),
-                 base::Passed(&context),
-                 url,
-                 callback));
+  PicasaDataProvider* data_provider = GetDataProvider();
+  // |data_provider| may be NULL if the file system was revoked before this
+  // operation had a chance to run.
+  if (!data_provider) {
+    GetFileInfoWithFreshDataProvider(context.Pass(), url, callback, false);
+  } else {
+    data_provider->RefreshData(
+        GetDataTypeForURL(url),
+        base::Bind(&PicasaFileUtil::GetFileInfoWithFreshDataProvider,
+                   weak_factory_.GetWeakPtr(),
+                   base::Passed(&context),
+                   url,
+                   callback));
+  }
 }
 
 void PicasaFileUtil::ReadDirectoryOnTaskRunnerThread(
-    scoped_ptr<fileapi::FileSystemOperationContext> context,
-    const fileapi::FileSystemURL& url,
+    scoped_ptr<storage::FileSystemOperationContext> context,
+    const storage::FileSystemURL& url,
     const ReadDirectoryCallback& callback) {
-  GetDataProvider()->RefreshData(
-      GetDataTypeForURL(url),
-      base::Bind(&PicasaFileUtil::ReadDirectoryWithFreshDataProvider,
-                 weak_factory_.GetWeakPtr(),
-                 base::Passed(&context),
-                 url,
-                 callback));
+  PicasaDataProvider* data_provider = GetDataProvider();
+  // |data_provider| may be NULL if the file system was revoked before this
+  // operation had a chance to run.
+  if (!data_provider) {
+    ReadDirectoryWithFreshDataProvider(context.Pass(), url, callback, false);
+  } else {
+    data_provider->RefreshData(
+        GetDataTypeForURL(url),
+        base::Bind(&PicasaFileUtil::ReadDirectoryWithFreshDataProvider,
+                   weak_factory_.GetWeakPtr(),
+                   base::Passed(&context),
+                   url,
+                   callback));
+  }
 }
 
-base::PlatformFileError PicasaFileUtil::GetFileInfoSync(
+base::File::Error PicasaFileUtil::GetFileInfoSync(
     FileSystemOperationContext* context, const FileSystemURL& url,
-    base::PlatformFileInfo* file_info, base::FilePath* platform_path) {
+    base::File::Info* file_info, base::FilePath* platform_path) {
   DCHECK(context);
   DCHECK(file_info);
 
   if (platform_path)
     *platform_path = base::FilePath();
 
-  std::vector<std::string> components;
-  fileapi::VirtualPath::GetComponentsUTF8Unsafe(url.path(), &components);
+  std::vector<std::string> components = GetVirtualPathComponents(url);
 
   switch (components.size()) {
     case 0:
       // Root directory.
       file_info->is_directory = true;
-      return base::PLATFORM_FILE_OK;
+      return base::File::FILE_OK;
     case 1:
       if (components[0] == kPicasaDirAlbums ||
           components[0] == kPicasaDirFolders) {
         file_info->is_directory = true;
-        return base::PLATFORM_FILE_OK;
+        return base::File::FILE_OK;
       }
 
       break;
     case 2:
       if (components[0] == kPicasaDirAlbums) {
         scoped_ptr<AlbumMap> album_map = GetDataProvider()->GetAlbums();
-        base::PlatformFileError error =
+        base::File::Error error =
             FindAlbumInfo(components[1], album_map.get(), NULL);
-        if (error != base::PLATFORM_FILE_OK)
+        if (error != base::File::FILE_OK)
           return error;
 
         file_info->is_directory = true;
-        return base::PLATFORM_FILE_OK;
+        return base::File::FILE_OK;
       }
 
       if (components[0] == kPicasaDirFolders) {
@@ -144,41 +170,39 @@ base::PlatformFileError PicasaFileUtil::GetFileInfoSync(
       // NativeMediaFileUtil::GetInfo calls into virtual function
       // PicasaFileUtil::GetLocalFilePath, and that will handle both
       // album contents and folder contents.
-      base::PlatformFileError result = NativeMediaFileUtil::GetFileInfoSync(
+      base::File::Error result = NativeMediaFileUtil::GetFileInfoSync(
           context, url, file_info, platform_path);
 
       DCHECK(components[0] == kPicasaDirAlbums ||
              components[0] == kPicasaDirFolders ||
-             result == base::PLATFORM_FILE_ERROR_NOT_FOUND);
+             result == base::File::FILE_ERROR_NOT_FOUND);
 
       return result;
   }
 
-  return base::PLATFORM_FILE_ERROR_NOT_FOUND;
+  return base::File::FILE_ERROR_NOT_FOUND;
 }
 
-base::PlatformFileError PicasaFileUtil::ReadDirectorySync(
-    fileapi::FileSystemOperationContext* context,
-    const fileapi::FileSystemURL& url,
+base::File::Error PicasaFileUtil::ReadDirectorySync(
+    storage::FileSystemOperationContext* context,
+    const storage::FileSystemURL& url,
     EntryList* file_list) {
   DCHECK(context);
   DCHECK(file_list);
   DCHECK(file_list->empty());
 
-  base::PlatformFileInfo file_info;
+  base::File::Info file_info;
   base::FilePath platform_directory_path;
-  base::PlatformFileError error = GetFileInfoSync(
+  base::File::Error error = GetFileInfoSync(
       context, url, &file_info, &platform_directory_path);
 
-  if (error != base::PLATFORM_FILE_OK)
+  if (error != base::File::FILE_OK)
     return error;
 
   if (!file_info.is_directory)
-    return base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY;
-
-  std::vector<std::string> components;
-  fileapi::VirtualPath::GetComponentsUTF8Unsafe(url.path(), &components);
+    return base::File::FILE_ERROR_NOT_A_DIRECTORY;
 
+  std::vector<std::string> components = GetVirtualPathComponents(url);
   switch (components.size()) {
     case 0: {
       // Root directory.
@@ -194,7 +218,7 @@ base::PlatformFileError PicasaFileUtil::ReadDirectorySync(
       if (components[0] == kPicasaDirAlbums) {
         scoped_ptr<AlbumMap> albums = GetDataProvider()->GetAlbums();
         if (!albums)
-          return base::PLATFORM_FILE_ERROR_NOT_FOUND;
+          return base::File::FILE_ERROR_NOT_FOUND;
 
         for (AlbumMap::const_iterator it = albums->begin();
              it != albums->end(); ++it) {
@@ -205,7 +229,7 @@ base::PlatformFileError PicasaFileUtil::ReadDirectorySync(
       } else if (components[0] == kPicasaDirFolders) {
         scoped_ptr<AlbumMap> folders = GetDataProvider()->GetFolders();
         if (!folders)
-          return base::PLATFORM_FILE_ERROR_NOT_FOUND;
+          return base::File::FILE_ERROR_NOT_FOUND;
 
         for (AlbumMap::const_iterator it = folders->begin();
              it != folders->end(); ++it) {
@@ -219,25 +243,25 @@ base::PlatformFileError PicasaFileUtil::ReadDirectorySync(
       if (components[0] == kPicasaDirAlbums) {
         scoped_ptr<AlbumMap> album_map = GetDataProvider()->GetAlbums();
         AlbumInfo album_info;
-        base::PlatformFileError error =
+        base::File::Error error =
             FindAlbumInfo(components[1], album_map.get(), &album_info);
-        if (error != base::PLATFORM_FILE_OK)
+        if (error != base::File::FILE_OK)
           return error;
 
         scoped_ptr<AlbumImages> album_images =
             GetDataProvider()->FindAlbumImages(album_info.uid, &error);
-        if (error != base::PLATFORM_FILE_OK)
+        if (error != base::File::FILE_OK)
           return error;
 
         for (AlbumImages::const_iterator it = album_images->begin();
              it != album_images->end();
              ++it) {
-          fileapi::DirectoryEntry entry;
-          base::PlatformFileInfo info;
+          storage::DirectoryEntry entry;
+          base::File::Info info;
 
           // Simply skip files that we can't get info on.
-          if (fileapi::NativeFileUtil::GetFileInfo(it->second, &info) !=
-              base::PLATFORM_FILE_OK) {
+          if (storage::NativeFileUtil::GetFileInfo(it->second, &info) !=
+              base::File::FILE_OK) {
             continue;
           }
 
@@ -248,9 +272,9 @@ base::PlatformFileError PicasaFileUtil::ReadDirectorySync(
 
       if (components[0] == kPicasaDirFolders) {
         EntryList super_list;
-        base::PlatformFileError error =
+        base::File::Error error =
             NativeMediaFileUtil::ReadDirectorySync(context, url, &super_list);
-        if (error != base::PLATFORM_FILE_OK)
+        if (error != base::File::FILE_OK)
           return error;
 
         for (EntryList::const_iterator it = super_list.begin();
@@ -263,87 +287,97 @@ base::PlatformFileError PicasaFileUtil::ReadDirectorySync(
       break;
   }
 
-  return base::PLATFORM_FILE_OK;
+  return base::File::FILE_OK;
+}
+
+base::File::Error PicasaFileUtil::DeleteDirectorySync(
+    storage::FileSystemOperationContext* context,
+    const storage::FileSystemURL& url) {
+  return base::File::FILE_ERROR_SECURITY;
+}
+
+base::File::Error PicasaFileUtil::DeleteFileSync(
+    storage::FileSystemOperationContext* context,
+    const storage::FileSystemURL& url) {
+  return base::File::FILE_ERROR_SECURITY;
 }
 
-base::PlatformFileError PicasaFileUtil::GetLocalFilePath(
+base::File::Error PicasaFileUtil::GetLocalFilePath(
     FileSystemOperationContext* context, const FileSystemURL& url,
     base::FilePath* local_file_path) {
   DCHECK(local_file_path);
   DCHECK(url.is_valid());
-  std::vector<std::string> components;
-  fileapi::VirtualPath::GetComponentsUTF8Unsafe(url.path(), &components);
+  std::vector<std::string> components = GetVirtualPathComponents(url);
 
   switch (components.size()) {
     case 2:
       if (components[0] == kPicasaDirFolders) {
         scoped_ptr<AlbumMap> album_map = GetDataProvider()->GetFolders();
         AlbumInfo album_info;
-        base::PlatformFileError error =
+        base::File::Error error =
             FindAlbumInfo(components[1], album_map.get(), &album_info);
-        if (error != base::PLATFORM_FILE_OK)
+        if (error != base::File::FILE_OK)
           return error;
 
         *local_file_path = album_info.path;
-        return base::PLATFORM_FILE_OK;
+        return base::File::FILE_OK;
       }
       break;
     case 3:
       if (components[0] == kPicasaDirAlbums) {
         scoped_ptr<AlbumMap> album_map = GetDataProvider()->GetAlbums();
         AlbumInfo album_info;
-        base::PlatformFileError error =
+        base::File::Error error =
             FindAlbumInfo(components[1], album_map.get(), &album_info);
-        if (error != base::PLATFORM_FILE_OK)
+        if (error != base::File::FILE_OK)
           return error;
 
         scoped_ptr<AlbumImages> album_images =
             GetDataProvider()->FindAlbumImages(album_info.uid, &error);
-        if (error != base::PLATFORM_FILE_OK)
+        if (error != base::File::FILE_OK)
           return error;
 
         AlbumImages::const_iterator it = album_images->find(components[2]);
         if (it == album_images->end())
-          return base::PLATFORM_FILE_ERROR_NOT_FOUND;
+          return base::File::FILE_ERROR_NOT_FOUND;
 
         *local_file_path = it->second;
-        return base::PLATFORM_FILE_OK;
+        return base::File::FILE_OK;
       }
 
       if (components[0] == kPicasaDirFolders) {
         scoped_ptr<AlbumMap> album_map = GetDataProvider()->GetFolders();
         AlbumInfo album_info;
-        base::PlatformFileError error =
+        base::File::Error error =
             FindAlbumInfo(components[1], album_map.get(), &album_info);
-        if (error != base::PLATFORM_FILE_OK)
+        if (error != base::File::FILE_OK)
           return error;
 
         // Not part of this class's mandate to check that it actually exists.
         *local_file_path = album_info.path.Append(url.path().BaseName());
-        return base::PLATFORM_FILE_OK;
+        return base::File::FILE_OK;
       }
 
-      return base::PLATFORM_FILE_ERROR_NOT_FOUND;
+      return base::File::FILE_ERROR_NOT_FOUND;
       break;
   }
 
   // All other cases don't have a local path. The valid cases should be
   // intercepted by GetFileInfo()/CreateFileEnumerator(). Invalid cases
   // return a NOT_FOUND error.
-  return base::PLATFORM_FILE_ERROR_NOT_FOUND;
+  return base::File::FILE_ERROR_NOT_FOUND;
 }
 
 void PicasaFileUtil::GetFileInfoWithFreshDataProvider(
-    scoped_ptr<fileapi::FileSystemOperationContext> context,
-    const fileapi::FileSystemURL& url,
+    scoped_ptr<storage::FileSystemOperationContext> context,
+    const storage::FileSystemURL& url,
     const GetFileInfoCallback& callback,
     bool success) {
   if (!success) {
     content::BrowserThread::PostTask(
         content::BrowserThread::IO,
         FROM_HERE,
-        base::Bind(
-            callback, base::PLATFORM_FILE_ERROR_IO, base::PlatformFileInfo()));
+        base::Bind(callback, base::File::FILE_ERROR_IO, base::File::Info()));
     return;
   }
   NativeMediaFileUtil::GetFileInfoOnTaskRunnerThread(
@@ -351,15 +385,15 @@ void PicasaFileUtil::GetFileInfoWithFreshDataProvider(
 }
 
 void PicasaFileUtil::ReadDirectoryWithFreshDataProvider(
-    scoped_ptr<fileapi::FileSystemOperationContext> context,
-    const fileapi::FileSystemURL& url,
+    scoped_ptr<storage::FileSystemOperationContext> context,
+    const storage::FileSystemURL& url,
     const ReadDirectoryCallback& callback,
     bool success) {
   if (!success) {
     content::BrowserThread::PostTask(
         content::BrowserThread::IO,
         FROM_HERE,
-        base::Bind(callback, base::PLATFORM_FILE_ERROR_IO, EntryList(), false));
+        base::Bind(callback, base::File::FILE_ERROR_IO, EntryList(), false));
     return;
   }
   NativeMediaFileUtil::ReadDirectoryOnTaskRunnerThread(