// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/sync_file_system/syncable_file_system_util.h" #include "base/command_line.h" #include "base/location.h" #include "webkit/browser/fileapi/external_mount_points.h" #include "webkit/browser/fileapi/file_observers.h" #include "webkit/browser/fileapi/file_system_context.h" #include "webkit/common/fileapi/file_system_util.h" using fileapi::ExternalMountPoints; using fileapi::FileSystemContext; using fileapi::FileSystemURL; namespace sync_file_system { namespace { // A command switch to enable syncing directory operations in Sync FileSystem // API. (http://crbug.com/161442) // TODO(kinuko): this command-line switch should be temporary. const char kEnableSyncFSDirectoryOperation[] = "enable-syncfs-directory-operation"; const char kSyncableMountName[] = "syncfs"; const char kSyncableMountNameForInternalSync[] = "syncfs-internal"; const base::FilePath::CharType kSyncFileSystemDir[] = FILE_PATH_LITERAL("Sync FileSystem"); const base::FilePath::CharType kSyncFileSystemDirDev[] = FILE_PATH_LITERAL("Sync FileSystem Dev"); bool is_directory_operation_enabled = false; } // namespace void RegisterSyncableFileSystem() { ExternalMountPoints::GetSystemInstance()->RegisterFileSystem( kSyncableMountName, fileapi::kFileSystemTypeSyncable, base::FilePath()); ExternalMountPoints::GetSystemInstance()->RegisterFileSystem( kSyncableMountNameForInternalSync, fileapi::kFileSystemTypeSyncableForInternalSync, base::FilePath()); } void RevokeSyncableFileSystem() { ExternalMountPoints::GetSystemInstance()->RevokeFileSystem( kSyncableMountName); ExternalMountPoints::GetSystemInstance()->RevokeFileSystem( kSyncableMountNameForInternalSync); } GURL GetSyncableFileSystemRootURI(const GURL& origin) { return GURL(fileapi::GetExternalFileSystemRootURIString( origin, kSyncableMountName)); } FileSystemURL CreateSyncableFileSystemURL(const GURL& origin, const base::FilePath& path) { return ExternalMountPoints::GetSystemInstance()->CreateExternalFileSystemURL( origin, kSyncableMountName, path); } FileSystemURL CreateSyncableFileSystemURLForSync( fileapi::FileSystemContext* file_system_context, const FileSystemURL& syncable_url) { return ExternalMountPoints::GetSystemInstance()->CreateExternalFileSystemURL( syncable_url.origin(), kSyncableMountNameForInternalSync, syncable_url.path()); } bool SerializeSyncableFileSystemURL(const FileSystemURL& url, std::string* serialized_url) { if (!url.is_valid() || url.type() != fileapi::kFileSystemTypeSyncable) return false; *serialized_url = GetSyncableFileSystemRootURI(url.origin()).spec() + url.path().AsUTF8Unsafe(); return true; } bool DeserializeSyncableFileSystemURL( const std::string& serialized_url, FileSystemURL* url) { #if !defined(FILE_PATH_USES_WIN_SEPARATORS) DCHECK(serialized_url.find('\\') == std::string::npos); #endif // FILE_PATH_USES_WIN_SEPARATORS FileSystemURL deserialized = ExternalMountPoints::GetSystemInstance()->CrackURL(GURL(serialized_url)); if (!deserialized.is_valid() || deserialized.type() != fileapi::kFileSystemTypeSyncable) { return false; } *url = deserialized; return true; } void SetEnableSyncFSDirectoryOperation(bool flag) { is_directory_operation_enabled = flag; } bool IsSyncFSDirectoryOperationEnabled() { return is_directory_operation_enabled || CommandLine::ForCurrentProcess()->HasSwitch( kEnableSyncFSDirectoryOperation); } base::FilePath GetSyncFileSystemDir(const base::FilePath& profile_base_dir) { return profile_base_dir.Append( IsSyncFSDirectoryOperationEnabled() ? kSyncFileSystemDirDev : kSyncFileSystemDir); } ScopedEnableSyncFSDirectoryOperation::ScopedEnableSyncFSDirectoryOperation() { was_enabled_ = IsSyncFSDirectoryOperationEnabled(); SetEnableSyncFSDirectoryOperation(true); } ScopedEnableSyncFSDirectoryOperation::~ScopedEnableSyncFSDirectoryOperation() { DCHECK(IsSyncFSDirectoryOperationEnabled()); SetEnableSyncFSDirectoryOperation(was_enabled_); } void RunSoon(const tracked_objects::Location& from_here, const base::Closure& callback) { base::MessageLoop::current()->PostTask(from_here, callback); } } // namespace sync_file_system