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

Unified Diff: chrome/browser/chromeos/gdata/gdata_util.cc

Issue 10543037: gdata: Convert public synchronous functions in GDataFileSystem to asynchronous. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address Toni's comments @ 06/08/12 10:59AM PDT. Created 8 years, 6 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
« no previous file with comments | « chrome/browser/chromeos/gdata/gdata_util.h ('k') | chrome/browser/chromeos/gdata/mock_gdata_file_system.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/chromeos/gdata/gdata_util.cc
diff --git a/chrome/browser/chromeos/gdata/gdata_util.cc b/chrome/browser/chromeos/gdata/gdata_util.cc
index a4635acca5ebee1162d8c7b27688eb9e34ffc340..722441ace590dbf952cc7dfe12be6279c9cf0637 100644
--- a/chrome/browser/chromeos/gdata/gdata_util.cc
+++ b/chrome/browser/chromeos/gdata/gdata_util.cc
@@ -21,6 +21,7 @@
#include "chrome/common/chrome_version_info.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
+#include "chrome/browser/chromeos/gdata/gdata.pb.h"
#include "chrome/browser/chromeos/gdata/gdata_file_system.h"
#include "chrome/browser/chromeos/gdata/gdata_system_service.h"
#include "chrome/browser/chromeos/login/user.h"
@@ -93,6 +94,58 @@ void OpenEditURLUIThread(Profile* profile, GURL* edit_url) {
}
}
+// Invoked upon completion of GetFileInfoByPathAsync initiated by
+// InsertGDataCachePathPermissions.
+void OnGetFileInfoForInsertGDataCachePathsPermissions(
+ Profile* profile,
+ std::vector<std::pair<FilePath, int> >* cache_paths,
+ const base::Closure& callback,
+ base::PlatformFileError error,
+ scoped_ptr<GDataFileProto> file_info) {
+ DCHECK(profile);
+ DCHECK(cache_paths);
+ DCHECK(!callback.is_null());
+
+ GDataFileSystem* file_system = GetGDataFileSystem(profile);
+ if (!file_system || error != base::PLATFORM_FILE_OK) {
+ callback.Run();
+ return;
+ }
+
+ DCHECK(file_info.get());
+ std::string resource_id = file_info->gdata_entry().resource_id();
+ std::string file_md5 = file_info->file_md5();
+
+ // We check permissions for raw cache file paths only for read-only
+ // operations (when fileEntry.file() is called), so read only permissions
+ // should be sufficient for all cache paths. For the rest of supported
+ // operations the file access check is done for drive/ paths.
+ cache_paths->push_back(std::make_pair(
+ file_system->GetCacheFilePath(resource_id, file_md5,
+ GDataCache::CACHE_TYPE_PERSISTENT,
+ GDataCache::CACHED_FILE_FROM_SERVER),
+ kReadOnlyFilePermissions));
+ // TODO(tbarzic): When we start supporting openFile operation, we may have to
+ // change permission for localy modified files to match handler's permissions.
+ cache_paths->push_back(std::make_pair(
+ file_system->GetCacheFilePath(resource_id, file_md5,
+ GDataCache::CACHE_TYPE_PERSISTENT,
+ GDataCache::CACHED_FILE_LOCALLY_MODIFIED),
+ kReadOnlyFilePermissions));
+ cache_paths->push_back(std::make_pair(
+ file_system->GetCacheFilePath(resource_id, file_md5,
+ GDataCache::CACHE_TYPE_PERSISTENT,
+ GDataCache::CACHED_FILE_MOUNTED),
+ kReadOnlyFilePermissions));
+ cache_paths->push_back(std::make_pair(
+ file_system->GetCacheFilePath(resource_id, file_md5,
+ GDataCache::CACHE_TYPE_TMP,
+ GDataCache::CACHED_FILE_FROM_SERVER),
+ kReadOnlyFilePermissions));
+
+ callback.Run();
+}
+
} // namespace
const FilePath& GetGDataMountPointPath() {
@@ -231,47 +284,40 @@ FilePath ExtractGDataPath(const FilePath& path) {
void InsertGDataCachePathsPermissions(
Profile* profile,
- const FilePath& gdata_path,
- std::vector<std::pair<FilePath, int> >* cache_paths ) {
+ scoped_ptr<std::vector<FilePath> > gdata_paths,
+ std::vector<std::pair<FilePath, int> >* cache_paths,
+ const base::Closure& callback) {
+ DCHECK(profile);
+ DCHECK(gdata_paths.get());
DCHECK(cache_paths);
+ DCHECK(!callback.is_null());
GDataFileSystem* file_system = GetGDataFileSystem(profile);
- if (!file_system)
+ if (!file_system || gdata_paths->empty()) {
+ callback.Run();
return;
+ }
- GDataFileProperties file_properties;
- if (!file_system->GetFileInfoByPath(gdata_path, &file_properties))
- return;
-
- std::string resource_id = file_properties.resource_id;
- std::string file_md5 = file_properties.file_md5;
-
- // We check permissions for raw cache file paths only for read-only
- // operations (when fileEntry.file() is called), so read only permissions
- // should be sufficient for all cache paths. For the rest of supported
- // operations the file access check is done for drive/ paths.
- cache_paths->push_back(std::make_pair(
- file_system->GetCacheFilePath(resource_id, file_md5,
- GDataCache::CACHE_TYPE_PERSISTENT,
- GDataCache::CACHED_FILE_FROM_SERVER),
- kReadOnlyFilePermissions));
- // TODO(tbarzic): When we start supporting openFile operation, we may have to
- // change permission for localy modified files to match handler's permissions.
- cache_paths->push_back(std::make_pair(
- file_system->GetCacheFilePath(resource_id, file_md5,
- GDataCache::CACHE_TYPE_PERSISTENT,
- GDataCache::CACHED_FILE_LOCALLY_MODIFIED),
- kReadOnlyFilePermissions));
- cache_paths->push_back(std::make_pair(
- file_system->GetCacheFilePath(resource_id, file_md5,
- GDataCache::CACHE_TYPE_PERSISTENT,
- GDataCache::CACHED_FILE_MOUNTED),
- kReadOnlyFilePermissions));
- cache_paths->push_back(std::make_pair(
- file_system->GetCacheFilePath(resource_id, file_md5,
- GDataCache::CACHE_TYPE_TMP,
- GDataCache::CACHED_FILE_FROM_SERVER),
- kReadOnlyFilePermissions));
+ // Remove one file path entry from the back of the input vector |gdata_paths|.
+ FilePath gdata_path = gdata_paths->back();
+ gdata_paths->pop_back();
+
+ // Call GetFileInfoByPathAsync() to get file info for |gdata_path| then insert
+ // all possible cache paths to the output vector |cache_paths|.
+ // Note that we can only process one file path at a time. Upon completion
+ // of OnGetFileInfoForInsertGDataCachePathsPermissions(), we recursively call
+ // InsertGDataCachePathsPermissions() to process the next file path from the
+ // back of the input vector |gdata_paths| until it is empty.
+ file_system->GetFileInfoByPathAsync(
+ gdata_path,
+ base::Bind(&OnGetFileInfoForInsertGDataCachePathsPermissions,
+ profile,
+ cache_paths,
+ base::Bind(&InsertGDataCachePathsPermissions,
+ profile,
+ base::Passed(&gdata_paths),
+ cache_paths,
+ callback)));
}
bool IsGDataAvailable(Profile* profile) {
« no previous file with comments | « chrome/browser/chromeos/gdata/gdata_util.h ('k') | chrome/browser/chromeos/gdata/mock_gdata_file_system.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698