cache_dumper.h revision c7f5f8508d98d5952d42ed7648c2a8f30a4da156
1// Copyright (c) 2009 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#ifndef NET_TOOLS_DUMP_CACHE_DUMPER_H_
6#define NET_TOOLS_DUMP_CACHE_DUMPER_H_
7
8#include <string>
9#include "base/file_path.h"
10#include "base/file_util.h"
11#include "net/disk_cache/backend_impl.h"
12
13#ifdef WIN32
14// Dumping the cache often creates very large filenames, which are tricky
15// on windows.  Most API calls don't support large filenames, including
16// most of the base library functions.  Unfortunately, adding "\\?\" into
17// the filename support is tricky.  Instead, if WIN32_LARGE_FILENAME_SUPPORT
18// is set, we use direct WIN32 APIs for manipulating the files.
19#define WIN32_LARGE_FILENAME_SUPPORT
20#endif
21
22// An abstract class for writing cache dump data.
23class CacheDumpWriter {
24 public:
25  // Creates an entry to be written.
26  // On success, populates the |entry|.
27  // Returns true on success, false otherwise.
28  virtual bool CreateEntry(const std::string& key,
29                           disk_cache::Entry** entry) = 0;
30
31  // Write to the current entry.
32  // Returns true on success, false otherwise.
33  virtual bool WriteEntry(disk_cache::Entry* entry, int stream, int offset,
34                          net::IOBuffer* buf, int buf_len) = 0;
35
36  // Close the current entry.
37  virtual void CloseEntry(disk_cache::Entry* entry, base::Time last_used,
38                          base::Time last_modified) = 0;
39};
40
41// Writes data to a cache.
42class CacheDumper : public CacheDumpWriter {
43 public:
44  CacheDumper(disk_cache::BackendImpl* cache) : cache_(cache) {};
45
46  virtual bool CreateEntry(const std::string& key, disk_cache::Entry** entry);
47  virtual bool WriteEntry(disk_cache::Entry* entry, int stream, int offset,
48                          net::IOBuffer* buf, int buf_len);
49  virtual void CloseEntry(disk_cache::Entry* entry, base::Time last_used,
50                          base::Time last_modified);
51
52 private:
53  disk_cache::BackendImpl* cache_;
54};
55
56// Writes data to a disk.
57class DiskDumper : public CacheDumpWriter {
58 public:
59  DiskDumper(const std::wstring& path) : path_(path), entry_(NULL) {
60    file_util::CreateDirectory(FilePath(path));
61  };
62  virtual bool CreateEntry(const std::string& key, disk_cache::Entry** entry);
63  virtual bool WriteEntry(disk_cache::Entry* entry, int stream, int offset,
64                          net::IOBuffer* buf, int buf_len);
65  virtual void CloseEntry(disk_cache::Entry* entry, base::Time last_used,
66                          base::Time last_modified);
67
68 private:
69  std::wstring path_;
70  // This is a bit of a hack.  As we get a CreateEntry, we coin the current
71  // entry_path_ where we write that entry to disk.  Subsequent calls to
72  // WriteEntry() utilize this path for writing to disk.
73  FilePath entry_path_;
74  std::string entry_url_;
75#ifdef WIN32_LARGE_FILENAME_SUPPORT
76  HANDLE entry_;
77#else
78  FILE* entry_;
79#endif
80};
81
82#endif  // NET_TOOLS_DUMP_CACHE_DUMPER_H_
83