38 bool decimalPointFound =
false;
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;
65 (startsWith == ValidatorFileSizePrivate::StartsWith::DigitPart)) ||
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;
82 (startsWith == ValidatorFileSizePrivate::StartsWith::SymbolPart)) ||
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";
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";
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";
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";
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";
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";
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";
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";
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 "
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;
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) {
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));
310 qCWarning(C_VALIDATOR).noquote()
311 <<
debugString(c) << v <<
"is not a valid data size string";
356 const auto errorType =
static_cast<ValidatorRulePrivate::ErrorType
>(errorData.
toInt());
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.
Qt::LayoutDirection textDirection() const const