// Copyright (c) 2012 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.

// See net/disk_cache/disk_cache.h for the public interface of the cache.

#ifndef NET_DISK_CACHE_BLOCKFILE_BACKEND_WORKER_V3_H_
#define NET_DISK_CACHE_BLOCKFILE_BACKEND_WORKER_V3_H_

#include "base/containers/hash_tables.h"
#include "base/files/file_path.h"
#include "base/memory/ref_counted.h"
#include "net/disk_cache/blockfile/addr.h"
#include "net/disk_cache/blockfile/backend_impl_v3.h"
#include "net/disk_cache/blockfile/block_files.h"

namespace base {
class SingleThreadTaskRunner;
}  // namespace base

namespace disk_cache {

class BackendImplV3::Worker : public base::RefCountedThreadSafe<Worker> {
 public:
  Worker(const base::FilePath& path,
         const scoped_refptr<base::SingleThreadTaskRunner>& main_thread);

  // Performs general initialization for this current instance of the cache.
  int Init(const CompletionCallback& callback);

 private:
  friend class base::RefCountedThreadSafe<Worker>;

  ~Worker();
  void CleanupCache();

  // Returns the full name for an external storage file.
  base::FilePath GetFileName(Addr address) const;

  // Creates a new backing file for the cache index.
  bool CreateBackingStore(disk_cache::File* file);
  bool InitBackingStore(bool* file_created);

  // Performs basic checks on the index file. Returns false on failure.
  bool CheckIndex();

  base::FilePath path_;  // Path to the folder used as backing storage.
  BlockFiles block_files_;  // Set of files used to store all data.
  bool init_;  // controls the initialization of the system.

  DISALLOW_COPY_AND_ASSIGN(Worker);
};

}  // namespace disk_cache

#endif  // NET_DISK_CACHE_BLOCKFILE_BACKEND_WORKER_V3_H_
