1// Copyright (c) 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 "webkit/browser/fileapi/transient_file_util.h"
6
7#include <string>
8
9#include "base/bind.h"
10#include "base/files/file_path.h"
11#include "webkit/browser/fileapi/file_system_operation_context.h"
12#include "webkit/browser/fileapi/file_system_url.h"
13#include "webkit/browser/fileapi/isolated_context.h"
14
15using webkit_blob::ScopedFile;
16
17namespace fileapi {
18
19namespace {
20
21void RevokeFileSystem(const std::string& filesystem_id,
22                      const base::FilePath& /*path*/) {
23  IsolatedContext::GetInstance()->RevokeFileSystem(filesystem_id);
24}
25
26}  // namespace
27
28ScopedFile TransientFileUtil::CreateSnapshotFile(
29    FileSystemOperationContext* context,
30    const FileSystemURL& url,
31    base::PlatformFileError* error,
32    base::PlatformFileInfo* file_info,
33    base::FilePath* platform_path) {
34  DCHECK(file_info);
35  *error = GetFileInfo(context, url, file_info, platform_path);
36  if (*error == base::PLATFORM_FILE_OK && file_info->is_directory)
37    *error = base::PLATFORM_FILE_ERROR_NOT_A_FILE;
38  if (*error != base::PLATFORM_FILE_OK)
39    return ScopedFile();
40
41  // Sets-up a transient filesystem.
42  DCHECK(!platform_path->empty());
43  DCHECK(!url.filesystem_id().empty());
44
45  ScopedFile scoped_file(
46      *platform_path,
47      ScopedFile::DELETE_ON_SCOPE_OUT,
48      context->task_runner());
49  scoped_file.AddScopeOutCallback(
50      base::Bind(&RevokeFileSystem, url.filesystem_id()), NULL);
51
52  return scoped_file.Pass();
53}
54
55}  // namespace fileapi
56