blob: d4338e8dd730cda7f9f2b98dbcffca74ed460a91 [file] [log] [blame]
// 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 "webkit/browser/fileapi/external_mount_points.h"
#include "webkit/browser/fileapi/file_observers.h"
#include "webkit/browser/fileapi/file_system_context.h"
#include "webkit/browser/fileapi/sandbox_file_system_backend.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_);
}
} // namespace sync_file_system