30 const QLocale &locale,
35 const QString str =
value.simplified();
38 bool decimalPointFound =
false;
39 const QString decimalPoint(locale.decimalPoint());
42 bool byteSignFound =
false;
43 ValidatorFileSizePrivate::StartsWith startsWith{ValidatorFileSizePrivate::StartsWith::NotSet};
45 for (
const QChar &ch : str) {
47 const char16_t uc = ch.toUpper().unicode();
48 if (((uc >= ValidatorRulePrivate::ascii_0) && (uc <= ValidatorRulePrivate::ascii_9)) ||
49 (ch == decimalPoint)) {
50 if (startsWith == ValidatorFileSizePrivate::StartsWith::NotSet) {
51 startsWith = ValidatorFileSizePrivate::StartsWith::DigitPart;
53 if (ch == decimalPoint) {
54 if (decimalPointFound) {
55 qCDebug(C_VALIDATOR).nospace()
56 <<
"ValidatorFileSize: Validation failed for " <<
value <<
": "
57 <<
"two decimal seperators in a row";
61 decimalPointFound =
true;
64 if ((symbolPart.isEmpty() &&
65 (startsWith == ValidatorFileSizePrivate::StartsWith::DigitPart)) ||
66 (!symbolPart.isEmpty() &&
67 (startsWith == ValidatorFileSizePrivate::StartsWith::SymbolPart))) {
70 qCDebug(C_VALIDATOR).nospace() <<
"ValidatorFileSize: Validation failed for "
71 <<
value <<
": " <<
"symbol inside digit part";
75 }
else if ((uc != ValidatorRulePrivate::asciiTab) &&
76 (uc != ValidatorRulePrivate::asciiSpace)) {
78 if (startsWith == ValidatorFileSizePrivate::StartsWith::NotSet) {
79 startsWith = ValidatorFileSizePrivate::StartsWith::SymbolPart;
81 if ((digitPart.isEmpty() &&
82 (startsWith == ValidatorFileSizePrivate::StartsWith::SymbolPart)) ||
83 (!digitPart.isEmpty() &&
84 (startsWith == ValidatorFileSizePrivate::StartsWith::DigitPart))) {
86 case ValidatorFileSizePrivate::ascii_K:
90 qCDebug(C_VALIDATOR).nospace()
91 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
92 <<
"unit symbol K already found";
95 symbolPart.append(ch);
98 case ValidatorFileSizePrivate::ascii_M:
100 if (multiplier > 0) {
102 qCDebug(C_VALIDATOR).nospace()
103 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
104 <<
"unit symbol M already found";
107 symbolPart.append(ch);
110 case ValidatorFileSizePrivate::ascii_G:
112 if (multiplier > 0) {
114 qCDebug(C_VALIDATOR).nospace()
115 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
116 <<
"unit symbol G already found";
119 symbolPart.append(ch);
122 case ValidatorFileSizePrivate::ascii_T:
124 if (multiplier > 0) {
126 qCDebug(C_VALIDATOR).nospace()
127 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
128 <<
"unit symbol T already found";
131 symbolPart.append(ch);
134 case ValidatorFileSizePrivate::ascii_P:
136 if (multiplier > 0) {
138 qCDebug(C_VALIDATOR).nospace()
139 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
140 <<
"unit symbol P already found";
143 symbolPart.append(ch);
146 case ValidatorFileSizePrivate::ascii_E:
148 if (multiplier > 0) {
150 qCDebug(C_VALIDATOR).nospace()
151 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
152 <<
"unit symbol E already found";
155 symbolPart.append(ch);
158 case ValidatorRulePrivate::ascii_Z:
160 if (multiplier > 0) {
162 qCDebug(C_VALIDATOR).nospace()
163 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
164 <<
"unit symbol Z already found";
167 symbolPart.append(ch);
170 case ValidatorFileSizePrivate::ascii_Y:
172 if (multiplier > 0) {
174 qCDebug(C_VALIDATOR).nospace()
175 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
176 <<
"unit symbol Y already found";
179 symbolPart.append(ch);
182 case ValidatorFileSizePrivate::ascii_I:
184 if ((multiplier == 0) || binary) {
186 qCDebug(C_VALIDATOR).nospace()
187 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
188 <<
"binary indicator I already found or no unit symbol given "
192 symbolPart.append(ch);
195 case ValidatorFileSizePrivate::ascii_B:
199 qCDebug(C_VALIDATOR).nospace()
200 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
201 <<
"byte symbol B already found";
203 byteSignFound =
true;
204 symbolPart.append(ch);
207 case ValidatorRulePrivate::asciiTab:
208 case ValidatorRulePrivate::asciiSpace:
212 qCDebug(C_VALIDATOR).nospace()
213 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
214 <<
"invalid character in symbol part";
239 double size = locale.toDouble(digitPart, &ok);
243 if (multiplier > 0) {
245 binary ? std::exp2(multiplier * 10) : std::pow(10.0, multiplier * 3);
248 if ((min >= 1.0) && (size < min)) {
251 if ((max >= 1.0) && (size > max)) {
254 if (valid && fileSize) {
269 const QString v =
value(params);
276 if (d->min.isValid()) {
277 min = ValidatorFileSizePrivate::extractDouble(c, params, d->min, &ok);
279 qCWarning(C_VALIDATOR).noquote()
280 <<
debugString(c) <<
"Invalid minimum size comparison data";
282 c,
static_cast<int>(ValidatorRulePrivate::ErrorType::InvalidMin));
286 if (ok && d->max.isValid()) {
287 max = ValidatorFileSizePrivate::extractDouble(c, params, d->max, &ok);
289 qCWarning(C_VALIDATOR).noquote()
290 <<
debugString(c) <<
"Invalid maximum size comparison data";
292 c,
static_cast<int>(ValidatorRulePrivate::ErrorType::InvalidMax));
299 if (size <
static_cast<double>(std::numeric_limits<qulonglong>::max())) {
304 result.
value.setValue<qulonglong>(
static_cast<qulonglong
>(size + 0.5));
306 result.
value.setValue(size);
310 qCWarning(C_VALIDATOR).noquote()
311 <<
debugString(c) << v <<
"is not a valid data size string";
354 const QString _label =
label(c);
356 const auto errorType =
static_cast<ValidatorRulePrivate::ErrorType
>(errorData.toInt());
358 if (_label.isEmpty()) {
360 case ValidatorRulePrivate::ErrorType::InvalidMin:
362 return c->
qtTrId(
"cutelyst-valfilesize-genvaldataerr-min");
363 case ValidatorRulePrivate::ErrorType::InvalidMax:
365 return c->
qtTrId(
"cutelyst-valfilesize-genvaldataerr-max");
366 case ValidatorRulePrivate::ErrorType::InvalidType:
373 case ValidatorRulePrivate::ErrorType::InvalidMin:
375 return c->
qtTrId(
"cutelyst-valfilesize-genvaldataerr-min-label").arg(_label);
376 case ValidatorRulePrivate::ErrorType::InvalidMax:
378 return c->
qtTrId(
"cutelyst-valfilesize-genvaldataerr-max-label").arg(_label);
379 case ValidatorRulePrivate::ErrorType::InvalidType:
386#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
388 Q_UNREACHABLE_RETURN({});
QLocale locale() const noexcept
void setStash(const QString &key, const QVariant &value)
QString qtTrId(const char *id, int n=-1) const
static bool validate(const QString &value, double min=-1, double max=-1, Option option=NoOption, const QLocale &locale=QLocale(), double *fileSize=nullptr)
Returns true if value is a valid file size string.