1 // Copyright 2013 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 CHROME_BROWSER_DEVTOOLS_DEVTOOLS_FILE_SYSTEM_INDEXER_H_ 6 #define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_FILE_SYSTEM_INDEXER_H_ 7 8 #include <map> 9 #include <string> 10 #include <vector> 11 12 #include "base/callback.h" 13 #include "base/memory/ref_counted.h" 14 #include "base/platform_file.h" 15 16 class Profile; 17 18 namespace base { 19 class FilePath; 20 class FileEnumerator; 21 class Time; 22 } 23 24 namespace content { 25 class WebContents; 26 } 27 28 class DevToolsFileSystemIndexer 29 : public base::RefCountedThreadSafe<DevToolsFileSystemIndexer> { 30 public: 31 32 typedef base::Callback<void(int)> TotalWorkCallback; 33 typedef base::Callback<void(int)> WorkedCallback; 34 typedef base::Callback<void()> DoneCallback; 35 typedef base::Callback<void(const std::vector<std::string>&)> SearchCallback; 36 37 class FileSystemIndexingJob : public base::RefCounted<FileSystemIndexingJob> { 38 public: 39 void Stop(); 40 41 private: 42 friend class base::RefCounted<FileSystemIndexingJob>; 43 friend class DevToolsFileSystemIndexer; 44 FileSystemIndexingJob(const base::FilePath& file_system_path, 45 const TotalWorkCallback& total_work_callback, 46 const WorkedCallback& worked_callback, 47 const DoneCallback& done_callback); 48 virtual ~FileSystemIndexingJob(); 49 50 void Start(); 51 void StopOnFileThread(); 52 void CollectFilesToIndex(); 53 void IndexFiles(); 54 void StartFileIndexing(base::PlatformFileError error, 55 base::PassPlatformFile pass_file, 56 bool); 57 void ReadFromFile(); 58 void OnRead(base::PlatformFileError error, 59 const char* data, 60 int bytes_read); 61 void FinishFileIndexing(bool success); 62 void CloseFile(); 63 void CloseCallback(base::PlatformFileError error); 64 void ReportWorked(); 65 66 base::FilePath file_system_path_; 67 TotalWorkCallback total_work_callback_; 68 WorkedCallback worked_callback_; 69 DoneCallback done_callback_; 70 scoped_ptr<base::FileEnumerator> file_enumerator_; 71 typedef std::map<base::FilePath, base::Time> FilePathTimesMap; 72 FilePathTimesMap file_path_times_; 73 FilePathTimesMap::const_iterator indexing_it_; 74 base::PlatformFile current_file_; 75 int64 current_file_offset_; 76 typedef int32 Trigram; 77 std::vector<Trigram> current_trigrams_; 78 // The index in this vector is the trigram id. 79 std::vector<bool> current_trigrams_set_; 80 base::TimeTicks last_worked_notification_time_; 81 int files_indexed_; 82 bool stopped_; 83 }; 84 85 DevToolsFileSystemIndexer(); 86 87 // Performs file system indexing for given |file_system_path| and sends 88 // progress callbacks. 89 scoped_refptr<FileSystemIndexingJob> IndexPath( 90 const std::string& file_system_path, 91 const TotalWorkCallback& total_work_callback, 92 const WorkedCallback& worked_callback, 93 const DoneCallback& done_callback); 94 95 // Performs trigram search for given |query| in |file_system_path|. 96 void SearchInPath(const std::string& file_system_path, 97 const std::string& query, 98 const SearchCallback& callback); 99 100 private: 101 friend class base::RefCountedThreadSafe<DevToolsFileSystemIndexer>; 102 103 virtual ~DevToolsFileSystemIndexer(); 104 105 void SearchInPathOnFileThread(const std::string& file_system_path, 106 const std::string& query, 107 const SearchCallback& callback); 108 109 DISALLOW_COPY_AND_ASSIGN(DevToolsFileSystemIndexer); 110 }; 111 112 #endif // CHROME_BROWSER_DEVTOOLS_DEVTOOLS_FILE_SYSTEM_INDEXER_H_ 113