// Copyright (c) 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 "storage/browser/fileapi/transient_file_util.h"

#include <string>

#include "base/bind.h"
#include "base/files/file_path.h"
#include "storage/browser/fileapi/file_system_operation_context.h"
#include "storage/browser/fileapi/file_system_url.h"
#include "storage/browser/fileapi/isolated_context.h"

using storage::ScopedFile;

namespace storage {

namespace {

void RevokeFileSystem(const std::string& filesystem_id,
                      const base::FilePath& /*path*/) {
  IsolatedContext::GetInstance()->RevokeFileSystem(filesystem_id);
}

}  // namespace

ScopedFile TransientFileUtil::CreateSnapshotFile(
    FileSystemOperationContext* context,
    const FileSystemURL& url,
    base::File::Error* error,
    base::File::Info* file_info,
    base::FilePath* platform_path) {
  DCHECK(file_info);
  *error = GetFileInfo(context, url, file_info, platform_path);
  if (*error == base::File::FILE_OK && file_info->is_directory)
    *error = base::File::FILE_ERROR_NOT_A_FILE;
  if (*error != base::File::FILE_OK)
    return ScopedFile();

  // Sets-up a transient filesystem.
  DCHECK(!platform_path->empty());
  DCHECK(!url.filesystem_id().empty());

  ScopedFile scoped_file(
      *platform_path,
      ScopedFile::DELETE_ON_SCOPE_OUT,
      context->task_runner());
  scoped_file.AddScopeOutCallback(
      base::BindOnce(&RevokeFileSystem, url.filesystem_id()), nullptr);

  return scoped_file;
}

}  // namespace storage
