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