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