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