syncable_file_system_util.cc revision 2385ea399aae016c0806a4f9ef3c9cfe3d2a39df
1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/sync_file_system/syncable_file_system_util.h" 6 7#include "base/command_line.h" 8#include "webkit/browser/fileapi/external_mount_points.h" 9#include "webkit/browser/fileapi/file_observers.h" 10#include "webkit/browser/fileapi/file_system_context.h" 11#include "webkit/browser/fileapi/sandbox_file_system_backend.h" 12#include "webkit/common/fileapi/file_system_util.h" 13 14using fileapi::ExternalMountPoints; 15using fileapi::FileSystemContext; 16using fileapi::FileSystemURL; 17 18namespace sync_file_system { 19 20namespace { 21 22// A command switch to enable syncing directory operations in Sync FileSystem 23// API. (http://crbug.com/161442) 24// TODO(kinuko): this command-line switch should be temporary. 25const char kEnableSyncFSDirectoryOperation[] = 26 "enable-syncfs-directory-operation"; 27 28const char kSyncableMountName[] = "syncfs"; 29const char kSyncableMountNameForInternalSync[] = "syncfs-internal"; 30 31bool is_directory_operation_enabled = false; 32 33} 34 35void RegisterSyncableFileSystem() { 36 ExternalMountPoints::GetSystemInstance()->RegisterFileSystem( 37 kSyncableMountName, 38 fileapi::kFileSystemTypeSyncable, 39 base::FilePath()); 40 ExternalMountPoints::GetSystemInstance()->RegisterFileSystem( 41 kSyncableMountNameForInternalSync, 42 fileapi::kFileSystemTypeSyncableForInternalSync, 43 base::FilePath()); 44} 45 46void RevokeSyncableFileSystem() { 47 ExternalMountPoints::GetSystemInstance()->RevokeFileSystem( 48 kSyncableMountName); 49 ExternalMountPoints::GetSystemInstance()->RevokeFileSystem( 50 kSyncableMountNameForInternalSync); 51} 52 53GURL GetSyncableFileSystemRootURI(const GURL& origin) { 54 return GURL(fileapi::GetExternalFileSystemRootURIString( 55 origin, kSyncableMountName)); 56} 57 58FileSystemURL CreateSyncableFileSystemURL(const GURL& origin, 59 const base::FilePath& path) { 60 return ExternalMountPoints::GetSystemInstance()->CreateExternalFileSystemURL( 61 origin, kSyncableMountName, path); 62} 63 64FileSystemURL CreateSyncableFileSystemURLForSync( 65 fileapi::FileSystemContext* file_system_context, 66 const FileSystemURL& syncable_url) { 67 return ExternalMountPoints::GetSystemInstance()->CreateExternalFileSystemURL( 68 syncable_url.origin(), 69 kSyncableMountNameForInternalSync, 70 syncable_url.path()); 71} 72 73bool SerializeSyncableFileSystemURL(const FileSystemURL& url, 74 std::string* serialized_url) { 75 if (!url.is_valid() || url.type() != fileapi::kFileSystemTypeSyncable) 76 return false; 77 *serialized_url = 78 GetSyncableFileSystemRootURI(url.origin()).spec() + 79 url.path().AsUTF8Unsafe(); 80 return true; 81} 82 83bool DeserializeSyncableFileSystemURL( 84 const std::string& serialized_url, FileSystemURL* url) { 85#if !defined(FILE_PATH_USES_WIN_SEPARATORS) 86 DCHECK(serialized_url.find('\\') == std::string::npos); 87#endif // FILE_PATH_USES_WIN_SEPARATORS 88 89 FileSystemURL deserialized = 90 ExternalMountPoints::GetSystemInstance()->CrackURL(GURL(serialized_url)); 91 if (!deserialized.is_valid() || 92 deserialized.type() != fileapi::kFileSystemTypeSyncable) { 93 return false; 94 } 95 96 *url = deserialized; 97 return true; 98} 99 100void SetEnableSyncFSDirectoryOperation(bool flag) { 101 is_directory_operation_enabled = flag; 102} 103 104bool IsSyncFSDirectoryOperationEnabled() { 105 return is_directory_operation_enabled || 106 CommandLine::ForCurrentProcess()->HasSwitch( 107 kEnableSyncFSDirectoryOperation); 108} 109 110ScopedEnableSyncFSDirectoryOperation::ScopedEnableSyncFSDirectoryOperation() { 111 was_enabled_ = IsSyncFSDirectoryOperationEnabled(); 112 SetEnableSyncFSDirectoryOperation(true); 113} 114 115ScopedEnableSyncFSDirectoryOperation::~ScopedEnableSyncFSDirectoryOperation() { 116 DCHECK(IsSyncFSDirectoryOperationEnabled()); 117 SetEnableSyncFSDirectoryOperation(was_enabled_); 118} 119 120} // namespace sync_file_system 121