| 1 | #pragma once
|
|---|
| 2 |
|
|---|
| 3 | #include <map>
|
|---|
| 4 | #include <string>
|
|---|
| 5 |
|
|---|
| 6 | #include <parsers/where_parser.hpp>
|
|---|
| 7 | #include <boost/optional.hpp>
|
|---|
| 8 | #include <boost/shared_ptr.hpp>
|
|---|
| 9 |
|
|---|
| 10 | #include <error.hpp>
|
|---|
| 11 |
|
|---|
| 12 | #include <parsers/where/expression_ast.hpp>
|
|---|
| 13 | #include <parsers/where/varible_handler.hpp>
|
|---|
| 14 |
|
|---|
| 15 | #include <parsers/filter/where_filter.hpp>
|
|---|
| 16 |
|
|---|
| 17 | #include "file_info.hpp"
|
|---|
| 18 |
|
|---|
| 19 |
|
|---|
| 20 | namespace file_filter {
|
|---|
| 21 | struct filter_obj_handler;
|
|---|
| 22 | struct filter_obj {
|
|---|
| 23 | typedef parsers::where::expression_ast<filter_obj_handler> ast_expr_type;
|
|---|
| 24 |
|
|---|
| 25 |
|
|---|
| 26 | filter_obj()
|
|---|
| 27 | : ullCreationTime(0)
|
|---|
| 28 | , ullLastAccessTime(0)
|
|---|
| 29 | , ullLastWriteTime(0)
|
|---|
| 30 | , ullSize(0)
|
|---|
| 31 | , ullNow(0)
|
|---|
| 32 | {}
|
|---|
| 33 | filter_obj(std::wstring path_, std::wstring filename_, __int64 now = 0, __int64 creationTime = 0, __int64 lastAccessTime = 0, __int64 lastWriteTime = 0, __int64 size = 0, DWORD attributes = 0)
|
|---|
| 34 | : path(path_)
|
|---|
| 35 | , filename(filename_)
|
|---|
| 36 | , ullCreationTime(creationTime)
|
|---|
| 37 | , ullLastAccessTime(lastAccessTime)
|
|---|
| 38 | , ullLastWriteTime(lastWriteTime)
|
|---|
| 39 | , ullSize(size)
|
|---|
| 40 | , ullNow(now)
|
|---|
| 41 | , attributes(attributes)
|
|---|
| 42 | {};
|
|---|
| 43 |
|
|---|
| 44 | static filter_obj get(unsigned long long now, const WIN32_FILE_ATTRIBUTE_DATA info, std::wstring path, std::wstring filename);
|
|---|
| 45 | static filter_obj get(unsigned long long now, const BY_HANDLE_FILE_INFORMATION info, std::wstring path, std::wstring filename);
|
|---|
| 46 | static filter_obj get(unsigned long long now, const WIN32_FIND_DATA info, std::wstring path);
|
|---|
| 47 | static filter_obj get(unsigned long long now, std::wstring path, std::wstring filename);
|
|---|
| 48 | static filter_obj get(unsigned long long now, std::wstring file);
|
|---|
| 49 | static filter_obj get(std::wstring file);
|
|---|
| 50 |
|
|---|
| 51 | //filter_obj(file_info &record);
|
|---|
| 52 | std::wstring get_filename() { return filename; }
|
|---|
| 53 | std::wstring get_path() { return path; }
|
|---|
| 54 | //std::wstring get_version();
|
|---|
| 55 | //long long get_line_count();
|
|---|
| 56 | //long long get_access();
|
|---|
| 57 | //long long get_creation();
|
|---|
| 58 | //long long get_write();
|
|---|
| 59 |
|
|---|
| 60 | long long get_creation() {
|
|---|
| 61 | return (ullNow-ullCreationTime)/MSECS_TO_100NS;
|
|---|
| 62 | }
|
|---|
| 63 | long long get_access() {
|
|---|
| 64 | return (ullNow-ullLastAccessTime)/MSECS_TO_100NS;
|
|---|
| 65 | }
|
|---|
| 66 | long long get_write() {
|
|---|
| 67 | //std::wcout << _T("written: ") << (ullNow-ullLastWriteTime)/MSECS_TO_100NS;
|
|---|
| 68 | //return (ullNow-ullLastWriteTime)/MSECS_TO_100NS;
|
|---|
| 69 | return strEx::filetime_to_time(ullLastWriteTime);
|
|---|
| 70 | //return ullLastWriteTime / windows_tick - sec_to_unix_epoch;
|
|---|
| 71 | //return ullLastWriteTime/MSECS_TO_100NS;
|
|---|
| 72 | }
|
|---|
| 73 | unsigned long long get_size() { return ullSize; }
|
|---|
| 74 | std::wstring render(std::wstring syntax, std::wstring datesyntax);
|
|---|
| 75 | std::wstring get_version();
|
|---|
| 76 | unsigned long get_line_count();
|
|---|
| 77 |
|
|---|
| 78 |
|
|---|
| 79 | public:
|
|---|
| 80 | void error(std::wstring err) { errors.push_back(err); }
|
|---|
| 81 | bool has_error() { return !errors.empty(); }
|
|---|
| 82 | std::wstring get_error() { return strEx::joinEx(errors, _T(", ")); }
|
|---|
| 83 |
|
|---|
| 84 | private:
|
|---|
| 85 | std::list<std::wstring> errors;
|
|---|
| 86 | //file_info &record;
|
|---|
| 87 |
|
|---|
| 88 |
|
|---|
| 89 | public:
|
|---|
| 90 |
|
|---|
| 91 | filter_obj( const filter_obj& other)
|
|---|
| 92 | : ullSize(other.ullSize)
|
|---|
| 93 | , ullCreationTime(other.ullCreationTime)
|
|---|
| 94 | , ullLastAccessTime(other.ullLastAccessTime)
|
|---|
| 95 | , ullLastWriteTime(other.ullLastWriteTime)
|
|---|
| 96 | , ullNow(other.ullNow)
|
|---|
| 97 | , filename(other.filename)
|
|---|
| 98 | , path(other.path)
|
|---|
| 99 | , cached_version(other.cached_version)
|
|---|
| 100 | , cached_count(other.cached_count)
|
|---|
| 101 | , attributes(other.attributes)
|
|---|
| 102 | {}
|
|---|
| 103 |
|
|---|
| 104 | const filter_obj& operator=( const filter_obj&other ) {
|
|---|
| 105 | ullSize = other.ullSize;
|
|---|
| 106 | ullCreationTime = other.ullCreationTime;
|
|---|
| 107 | ullLastAccessTime = other.ullLastAccessTime;
|
|---|
| 108 | ullLastWriteTime = other.ullLastWriteTime;
|
|---|
| 109 | ullNow = other.ullNow;
|
|---|
| 110 | filename = other.filename;
|
|---|
| 111 | path = other.path;
|
|---|
| 112 | cached_version = other.cached_version;
|
|---|
| 113 | cached_count = other.cached_count;
|
|---|
| 114 | attributes = other.attributes;
|
|---|
| 115 | }
|
|---|
| 116 |
|
|---|
| 117 |
|
|---|
| 118 | unsigned long long ullSize;
|
|---|
| 119 | __int64 ullCreationTime;
|
|---|
| 120 | __int64 ullLastAccessTime;
|
|---|
| 121 | __int64 ullLastWriteTime;
|
|---|
| 122 | __int64 ullNow;
|
|---|
| 123 | std::wstring filename;
|
|---|
| 124 | std::wstring path;
|
|---|
| 125 | boost::optional<std::wstring> cached_version;
|
|---|
| 126 | boost::optional<unsigned long> cached_count;
|
|---|
| 127 | DWORD attributes;
|
|---|
| 128 |
|
|---|
| 129 | static const __int64 MSECS_TO_100NS = 10000;
|
|---|
| 130 | static const long long windows_tick = 10000000;
|
|---|
| 131 | static const long long sec_to_unix_epoch = 11644473600;
|
|---|
| 132 |
|
|---|
| 133 | };
|
|---|
| 134 |
|
|---|
| 135 | typedef filter_obj flyweight_type;
|
|---|
| 136 | struct filter_obj_handler : public parsers::where::varible_handler<filter_obj_handler, filter_obj> {
|
|---|
| 137 |
|
|---|
| 138 | static const parsers::where::value_type type_custom_severity = parsers::where::type_custom_int_1;
|
|---|
| 139 | static const parsers::where::value_type type_custom_type = parsers::where::type_custom_int_2;
|
|---|
| 140 |
|
|---|
| 141 | typedef parsers::where::varible_handler<filter_obj_handler, filter_obj> handler;
|
|---|
| 142 | typedef parsers::where::expression_ast<filter_obj_handler> ast_expr_type;
|
|---|
| 143 | typedef std::map<std::wstring,parsers::where::value_type> types_type;
|
|---|
| 144 | typedef std::list<std::wstring> error_type;
|
|---|
| 145 | typedef filter_obj object_type;
|
|---|
| 146 |
|
|---|
| 147 | filter_obj_handler();
|
|---|
| 148 |
|
|---|
| 149 | handler::bound_string_type bind_string(std::wstring key);
|
|---|
| 150 | handler::bound_int_type bind_int(std::wstring key);
|
|---|
| 151 | bool has_function(parsers::where::value_type to, std::wstring name, ast_expr_type subject);
|
|---|
| 152 | handler::bound_function_type bind_function(parsers::where::value_type to, std::wstring name, ast_expr_type subject);
|
|---|
| 153 |
|
|---|
| 154 | bool has_variable(std::wstring key);
|
|---|
| 155 | parsers::where::value_type get_type(std::wstring key);
|
|---|
| 156 | bool can_convert(parsers::where::value_type from, parsers::where::value_type to);
|
|---|
| 157 |
|
|---|
| 158 | flyweight_type static_record;
|
|---|
| 159 | object_type get_static_object() {
|
|---|
| 160 | return object_type(static_record);
|
|---|
| 161 | }
|
|---|
| 162 |
|
|---|
| 163 | public:
|
|---|
| 164 | void error(std::wstring err) { errors.push_back(err); }
|
|---|
| 165 | bool has_error() { return !errors.empty(); }
|
|---|
| 166 | std::wstring get_error() { return strEx::joinEx(errors, _T(", ")); }
|
|---|
| 167 | private:
|
|---|
| 168 | std::list<std::wstring> errors;
|
|---|
| 169 |
|
|---|
| 170 | private:
|
|---|
| 171 | types_type types;
|
|---|
| 172 |
|
|---|
| 173 | };
|
|---|
| 174 |
|
|---|
| 175 |
|
|---|
| 176 | struct file_finder_data_arguments : public where_filter::argument_interface<flyweight_type> {
|
|---|
| 177 |
|
|---|
| 178 | typedef where_filter::argument_interface<flyweight_type> parent_type;
|
|---|
| 179 | enum filter_types {
|
|---|
| 180 | filter_plus = 1,
|
|---|
| 181 | filter_minus = 2,
|
|---|
| 182 | filter_normal = 3
|
|---|
| 183 | };
|
|---|
| 184 | bool bFilterAll;
|
|---|
| 185 | bool bFilterIn;
|
|---|
| 186 |
|
|---|
| 187 | int max_level;
|
|---|
| 188 | int debugThreshold;
|
|---|
| 189 |
|
|---|
| 190 | bool bShowDescriptions;
|
|---|
| 191 | std::wstring pattern;
|
|---|
| 192 | unsigned long long now;
|
|---|
| 193 |
|
|---|
| 194 | std::list<file_finder::filter> filter_chain;
|
|---|
| 195 |
|
|---|
| 196 | file_finder_data_arguments(std::wstring pattern, int max_depth, parent_type::error_type error, std::wstring syntax, std::wstring datesyntax, bool debug = false);
|
|---|
| 197 |
|
|---|
| 198 |
|
|---|
| 199 | bool is_valid_level(int current_level) {
|
|---|
| 200 | return (max_level == -1) || (current_level <= max_level);
|
|---|
| 201 | }
|
|---|
| 202 |
|
|---|
| 203 | typedef std::pair<int,file_finder::filter> filteritem_type;
|
|---|
| 204 | typedef std::list<filteritem_type > filterlist_type;
|
|---|
| 205 |
|
|---|
| 206 | filterlist_type old_chain;
|
|---|
| 207 |
|
|---|
| 208 | };
|
|---|
| 209 | typedef where_filter::engine_interface<flyweight_type> filter_engine_type;
|
|---|
| 210 | //typedef where_filter::argument_interface<flyweight_type> filter_argument_type;
|
|---|
| 211 | typedef file_finder_data_arguments filter_argument_type;
|
|---|
| 212 | typedef where_filter::result_counter_interface<flyweight_type> filter_result_type;
|
|---|
| 213 |
|
|---|
| 214 | struct filesize_engine_interface_type : public filter_engine_type {
|
|---|
| 215 | virtual unsigned long long get_size() = 0;
|
|---|
| 216 | };
|
|---|
| 217 |
|
|---|
| 218 |
|
|---|
| 219 | typedef boost::shared_ptr<filter_engine_type> filter_engine;
|
|---|
| 220 | typedef boost::shared_ptr<filesize_engine_interface_type> filesize_engine_interface;
|
|---|
| 221 | typedef boost::shared_ptr<filter_argument_type> filter_argument;
|
|---|
| 222 | typedef boost::shared_ptr<filter_result_type> filter_result;
|
|---|
| 223 |
|
|---|
| 224 | struct factories {
|
|---|
| 225 | static filter_engine create_engine(filter_argument arg);
|
|---|
| 226 | static filter_engine create_old_engine(filter_argument arg);
|
|---|
| 227 | static filesize_engine_interface create_size_engine();
|
|---|
| 228 | static filter_result create_result(filter_argument arg);
|
|---|
| 229 | static filter_argument create_argument(std::wstring pattern, int max_depth, std::wstring syntax, std::wstring datesyntax);
|
|---|
| 230 | };
|
|---|
| 231 |
|
|---|
| 232 |
|
|---|
| 233 | /*
|
|---|
| 234 | struct where_mode_filter : public file_finder::file_engine_interface {
|
|---|
| 235 | file_finder::file_finder_arguments &data;
|
|---|
| 236 | std::string message;
|
|---|
| 237 | parsers::where::parser<file_filter_obj_handler> ast_parser;
|
|---|
| 238 | file_filter_obj_handler object_handler;
|
|---|
| 239 |
|
|---|
| 240 | where_mode_filter(file_finder::file_finder_arguments &data) : data(data) {}
|
|---|
| 241 | bool boot() {return true; }
|
|---|
| 242 |
|
|---|
| 243 | bool validate(std::wstring &message);
|
|---|
| 244 | bool match(file_info &record);
|
|---|
| 245 | std::wstring get_name() {
|
|---|
| 246 | return _T("where");
|
|---|
| 247 | }
|
|---|
| 248 | std::wstring get_subject() { return data.filter; }
|
|---|
| 249 | };
|
|---|
| 250 | */
|
|---|
| 251 |
|
|---|
| 252 |
|
|---|
| 253 | }
|
|---|