source: nscp/modules/CheckDisk/filter.hpp @ 79f191a

stable
Last change on this file since 79f191a was 79f191a, checked in by Michael Medin <michael@…>, 2 years ago

Release of 0.3.9

  • Property mode set to 100644
File size: 8.2 KB
Line 
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
20namespace 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}
Note: See TracBrowser for help on using the repository browser.