// 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.

#ifndef NET_TOOLS_DUMP_CACHE_SIMPLE_CACHE_DUMPER_H_
#define NET_TOOLS_DUMP_CACHE_SIMPLE_CACHE_DUMPER_H_

#include "base/files/file_path.h"
#include "base/memory/scoped_ptr.h"
#include "base/threading/thread.h"
#include "net/base/completion_callback.h"
#include "net/disk_cache/disk_cache.h"

class DiskDumper;

namespace net {

class IOBufferWithSize;

// A class for dumping the contents of a disk cache to a series of text
// files.  The files will contain the response headers, followed by the
// response body, as if the HTTP response were written directly to disk.
class SimpleCacheDumper {
 public:
  SimpleCacheDumper(base::FilePath input_path, base::FilePath output_path);
  ~SimpleCacheDumper();

  // Dumps the cache to disk. Returns OK if the operation was successful,
  // and a net error code otherwise.
  int Run();

 private:
  enum State {
    STATE_NONE,
    STATE_CREATE_CACHE,
    STATE_CREATE_CACHE_COMPLETE,
    STATE_OPEN_ENTRY,
    STATE_OPEN_ENTRY_COMPLETE,
    STATE_CREATE_ENTRY,
    STATE_CREATE_ENTRY_COMPLETE,
    STATE_READ_HEADERS,
    STATE_READ_HEADERS_COMPLETE,
    STATE_WRITE_HEADERS,
    STATE_WRITE_HEADERS_COMPLETE,
    STATE_READ_BODY,
    STATE_READ_BODY_COMPLETE,
    STATE_WRITE_BODY,
    STATE_WRITE_BODY_COMPLETE,
    STATE_DONE,
  };

  int DoLoop(int rv);

  int DoCreateCache();
  int DoCreateCacheComplete(int rv);
  int DoOpenEntry();
  int DoOpenEntryComplete(int rv);
  int DoCreateEntry();
  int DoCreateEntryComplete(int rv);
  int DoReadHeaders();
  int DoReadHeadersComplete(int rv);
  int DoWriteHeaders();
  int DoWriteHeadersComplete(int rv);
  int DoReadBody();
  int DoReadBodyComplete(int rv);
  int DoWriteBody();
  int DoWriteBodyComplete(int rv);
  int DoDone();

  void OnIOComplete(int rv);

  State state_;
  base::FilePath input_path_;
  base::FilePath output_path_;
  scoped_ptr<disk_cache::Backend> cache_;
  scoped_ptr<DiskDumper> writer_;
  base::Thread* cache_thread_;
  scoped_ptr<disk_cache::Backend::Iterator> iter_;
  disk_cache::Entry* src_entry_;
  disk_cache::Entry* dst_entry_;
  CompletionCallback io_callback_;
  scoped_refptr<IOBufferWithSize> buf_;
  int rv_;

  DISALLOW_COPY_AND_ASSIGN(SimpleCacheDumper);
};

}  // namespace net

#endif  // NET_TOOLS_DUMP_CACHE_SIMPLE_CACHE_DUMPER_H_
