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