File indexing completed on 2024-04-28 17:06:03
0001 /* 0002 SPDX-FileCopyrightText: 2003 Shie Erlich <krusader@users.sourceforge.net> 0003 SPDX-FileCopyrightText: 2003 Rafi Yanai <krusader@users.sourceforge.net> 0004 SPDX-FileCopyrightText: 2003 Csaba Karai <krusader@users.sourceforge.net> 0005 SPDX-FileCopyrightText: 2011 Jan Lepper <jan_lepper@gmx.de> 0006 SPDX-FileCopyrightText: 2004-2022 Krusader Krew <https://krusader.org> 0007 0008 SPDX-License-Identifier: GPL-2.0-or-later 0009 */ 0010 0011 #include "filtersettings.h" 0012 0013 #include "../krservices.h" 0014 0015 #include <QDebug> 0016 0017 #include <KCodecs/KCharsets> 0018 0019 FilterSettings::FileSize::FileSize(const FileSize &other) = default; 0020 0021 FilterSettings::FileSize &FilterSettings::FileSize::operator=(const FileSize &other) = default; 0022 0023 KIO::filesize_t FilterSettings::FileSize::size() const 0024 { 0025 switch (unit) { 0026 case Byte: 0027 return amount; 0028 case KiloByte: 0029 return amount * 1024; 0030 case MegaByte: 0031 return amount * 1024 * 1024; 0032 case GigaByte: 0033 return amount * 1024 * 1024 * 1024; 0034 default: 0035 qWarning() << "invalid size unit: " << unit; 0036 return amount; 0037 } 0038 } 0039 0040 FilterSettings::TimeSpan::TimeSpan(const TimeSpan &other) = default; 0041 0042 FilterSettings::TimeSpan &FilterSettings::TimeSpan::operator=(const TimeSpan &other) = default; 0043 0044 int FilterSettings::TimeSpan::days() const 0045 { 0046 switch (unit) { 0047 case Day: 0048 return amount; 0049 case Week: 0050 return amount * 7; 0051 case Month: 0052 return amount * 30; 0053 case Year: 0054 return amount * 365; 0055 default: 0056 qWarning() << "invalid time unit: " << unit; 0057 return amount; 0058 } 0059 } 0060 0061 FilterSettings::FilterSettings() 0062 : valid(false) 0063 , searchFor("*") 0064 , searchForCase(false) 0065 , searchInArchives(false) 0066 , recursive(false) 0067 , followLinks(false) 0068 , containsTextCase(false) 0069 , containsWholeWord(false) 0070 , containsRegExp(false) 0071 , minSizeEnabled(false) 0072 , maxSizeEnabled(false) 0073 , modifiedBetweenEnabled(false) 0074 , notModifiedAfterEnabled(false) 0075 , modifiedInTheLastEnabled(false) 0076 , ownerEnabled(false) 0077 , groupEnabled(false) 0078 , permissionsEnabled(false) 0079 { 0080 } 0081 0082 FilterSettings::FilterSettings(const FilterSettings &other) = default; 0083 0084 FilterSettings &FilterSettings::operator=(const FilterSettings &other) = default; 0085 0086 void FilterSettings::load(const KConfigGroup &cfg) 0087 { 0088 *this = FilterSettings(); 0089 #define LOAD(key, var) \ 0090 { \ 0091 var = cfg.readEntry(key, var); \ 0092 } 0093 LOAD("IsValid", valid); 0094 if (!isValid()) 0095 return; 0096 LOAD("SearchFor", searchFor); 0097 LOAD("MimeType", mimeType); 0098 LOAD("SearchInArchives", searchInArchives); 0099 LOAD("Recursive", recursive); 0100 LOAD("FollowLinks", followLinks); 0101 searchIn = KrServices::toUrlList(cfg.readEntry("SearchIn", QStringList())); 0102 dontSearchIn = KrServices::toUrlList(cfg.readEntry("DontSearchIn", QStringList())); 0103 excludeFolderNames = QStringList(); 0104 LOAD("ContentEncoding", contentEncoding); 0105 LOAD("ContainsText", containsText); 0106 LOAD("ContainsTextCase", containsTextCase); 0107 LOAD("ContainsWholeWord", containsWholeWord); 0108 LOAD("ContainsRegExp", containsRegExp); 0109 LOAD("MinSizeEnabled", minSizeEnabled); 0110 LOAD("MinSizeAmount", minSize.amount); 0111 minSize.unit = static_cast<SizeUnit>(cfg.readEntry("MinSizeUnit", 0)); 0112 LOAD("MaxSizeEnabled", maxSizeEnabled); 0113 LOAD("MaxSizeAmount", maxSize.amount); 0114 maxSize.unit = static_cast<SizeUnit>(cfg.readEntry("MaxSizeUnit", 0)); 0115 LOAD("ModifiedBetweenEnabled", modifiedBetweenEnabled); 0116 LOAD("ModifiedBetween1", modifiedBetween1); 0117 LOAD("ModifiedBetween2", modifiedBetween2); 0118 LOAD("NotModifiedAfterEnabled", notModifiedAfterEnabled); 0119 LOAD("NotModifiedAfter", notModifiedAfter); 0120 LOAD("ModifiedInTheLastEnabled", modifiedInTheLastEnabled); 0121 LOAD("ModifiedInTheLastAmount", modifiedInTheLast.amount); 0122 modifiedInTheLast.unit = static_cast<TimeUnit>(cfg.readEntry("ModifiedInTheLastUnit", 0)); 0123 LOAD("NotModifiedInTheLastAmount", notModifiedInTheLast.amount); 0124 notModifiedInTheLast.unit = static_cast<TimeUnit>(cfg.readEntry("NotModifiedInTheLastUnit", 0)); 0125 LOAD("OwnerEnabled", ownerEnabled); 0126 LOAD("Owner", owner); 0127 LOAD("GroupEnabled", groupEnabled); 0128 LOAD("Group", group); 0129 LOAD("PermissionsEnabled", permissionsEnabled); 0130 LOAD("Permissions", permissions); 0131 #undef LOAD 0132 } 0133 0134 void FilterSettings::saveDate(const QString &key, const QDate &date, KConfigGroup &cfg) 0135 { 0136 if (date.isValid()) 0137 cfg.writeEntry(key, date); 0138 else 0139 cfg.deleteEntry(key); 0140 } 0141 0142 void FilterSettings::save(KConfigGroup cfg) const 0143 { 0144 cfg.writeEntry("IsValid", valid); 0145 if (!isValid()) 0146 return; 0147 cfg.writeEntry("SearchFor", searchFor); 0148 cfg.writeEntry("MimeType", mimeType); 0149 cfg.writeEntry("SearchInArchives", searchInArchives); 0150 cfg.writeEntry("Recursive", recursive); 0151 cfg.writeEntry("FollowLinks", followLinks); 0152 cfg.writeEntry("SearchIn", KrServices::toStringList(searchIn)); 0153 cfg.writeEntry("DontSearchIn", KrServices::toStringList(dontSearchIn)); 0154 cfg.writeEntry("ContentEncoding", contentEncoding); 0155 cfg.writeEntry("ContainsText", containsText); 0156 cfg.writeEntry("ContainsTextCase", containsTextCase); 0157 cfg.writeEntry("ContainsWholeWord", containsWholeWord); 0158 cfg.writeEntry("ContainsRegExp", containsRegExp); 0159 cfg.writeEntry("MinSizeEnabled", minSizeEnabled); 0160 cfg.writeEntry("MinSizeAmount", minSize.amount); 0161 cfg.writeEntry("MinSizeUnit", static_cast<int>(minSize.unit)); 0162 cfg.writeEntry("MaxSizeEnabled", maxSizeEnabled); 0163 cfg.writeEntry("MaxSizeAmount", maxSize.amount); 0164 cfg.writeEntry("MaxSizeUnit", static_cast<int>(maxSize.unit)); 0165 cfg.writeEntry("ModifiedBetweenEnabled", modifiedBetweenEnabled); 0166 saveDate("ModifiedBetween1", modifiedBetween1, cfg); 0167 saveDate("ModifiedBetween2", modifiedBetween2, cfg); 0168 cfg.writeEntry("NotModifiedAfterEnabled", notModifiedAfterEnabled); 0169 saveDate("NotModifiedAfter", notModifiedAfter, cfg); 0170 cfg.writeEntry("ModifiedInTheLastEnabled", modifiedInTheLastEnabled); 0171 cfg.writeEntry("ModifiedInTheLastAmount", modifiedInTheLast.amount); 0172 cfg.writeEntry("ModifiedInTheLastUnit", static_cast<int>(modifiedInTheLast.unit)); 0173 cfg.writeEntry("NotModifiedInTheLastAmount", notModifiedInTheLast.amount); 0174 cfg.writeEntry("NotModifiedInTheLastUnit", static_cast<int>(notModifiedInTheLast.unit)); 0175 cfg.writeEntry("OwnerEnabled", ownerEnabled); 0176 cfg.writeEntry("Owner", owner); 0177 cfg.writeEntry("GroupEnabled", groupEnabled); 0178 cfg.writeEntry("Group", group); 0179 cfg.writeEntry("PermissionsEnabled", permissionsEnabled); 0180 cfg.writeEntry("Permissions", permissions); 0181 } 0182 0183 // bool start: set it to true if this date is the beginning of the search, 0184 // if it's the end, set it to false 0185 time_t FilterSettings::qdate2time_t(QDate d, bool start) 0186 { 0187 struct tm t; 0188 t.tm_sec = (start ? 0 : 59); 0189 t.tm_min = (start ? 0 : 59); 0190 t.tm_hour = (start ? 0 : 23); 0191 t.tm_mday = d.day(); 0192 t.tm_mon = d.month() - 1; 0193 t.tm_year = d.year() - 1900; 0194 t.tm_wday = d.dayOfWeek() - 1; // actually ignored by mktime 0195 t.tm_yday = d.dayOfYear() - 1; // actually ignored by mktime 0196 t.tm_isdst = -1; // daylight saving time information isn't available 0197 0198 return mktime(&t); 0199 } 0200 0201 KrQuery FilterSettings::toQuery() const 0202 { 0203 if (!isValid()) 0204 return KrQuery(); 0205 0206 KrQuery query; 0207 0208 ////////////// General Options ////////////// 0209 0210 query.setNameFilter(searchFor, searchForCase); 0211 0212 query.setMimeType(mimeType); 0213 0214 QString charset; 0215 if (!contentEncoding.isEmpty()) 0216 charset = KCharsets::charsets()->encodingForName(contentEncoding); 0217 0218 if (!containsText.isEmpty()) { 0219 query.setContent(containsText, containsTextCase, containsWholeWord, charset, containsRegExp); 0220 } 0221 0222 query.setRecursive(recursive); 0223 query.setSearchInArchives(searchInArchives); 0224 query.setFollowLinks(followLinks); 0225 0226 if (!searchIn.isEmpty()) 0227 query.setSearchInDirs(searchIn); 0228 0229 if (!dontSearchIn.isEmpty()) 0230 query.setDontSearchInDirs(dontSearchIn); 0231 0232 query.setExcludeFolderNames(excludeFolderNames); 0233 0234 ////////////// Advanced Options ////////////// 0235 0236 if (minSizeEnabled) 0237 query.setMinimumFileSize(minSize.size()); 0238 0239 if (maxSizeEnabled) 0240 query.setMaximumFileSize(maxSize.size()); 0241 0242 if (modifiedBetweenEnabled) { 0243 if (modifiedBetween1.isValid()) 0244 query.setNewerThan(qdate2time_t(modifiedBetween1, true)); 0245 if (modifiedBetween2.isValid()) 0246 query.setOlderThan(qdate2time_t(modifiedBetween2, false)); 0247 } else if (notModifiedAfterEnabled && notModifiedAfter.isValid()) { 0248 query.setOlderThan(qdate2time_t(notModifiedAfter, false)); 0249 } else if (modifiedInTheLastEnabled) { 0250 if (modifiedInTheLast.amount) { 0251 QDate d = QDate::currentDate().addDays((-1) * modifiedInTheLast.days()); 0252 query.setNewerThan(qdate2time_t(d, true)); 0253 } 0254 if (notModifiedInTheLast.amount) { 0255 QDate d = QDate::currentDate().addDays((-1) * notModifiedInTheLast.days()); 0256 query.setOlderThan(qdate2time_t(d, true)); 0257 } 0258 } 0259 0260 if (ownerEnabled && !owner.isEmpty()) 0261 query.setOwner(owner); 0262 if (groupEnabled && !group.isEmpty()) 0263 query.setGroup(group); 0264 if (permissionsEnabled && !permissions.isEmpty()) 0265 query.setPermissions(permissions); 0266 0267 return query; 0268 }