37 bool decimalPointFound =
false;
41 bool byteSignFound =
false;
42 ValidatorFileSizePrivate::StartsWith startsWith{ValidatorFileSizePrivate::StartsWith::NotSet};
44 for (
const QChar &ch : str) {
46 const char16_t uc = ch.toUpper().unicode();
47 if (((uc >= ValidatorRulePrivate::ascii_0) && (uc <= ValidatorRulePrivate::ascii_9)) ||
48 (ch == decimalPoint)) {
49 if (startsWith == ValidatorFileSizePrivate::StartsWith::NotSet) {
50 startsWith = ValidatorFileSizePrivate::StartsWith::DigitPart;
52 if (ch == decimalPoint) {
53 if (decimalPointFound) {
54 qCDebug(C_VALIDATOR).nospace()
55 <<
"ValidatorFileSize: Validation failed for " <<
value <<
": "
56 <<
"two decimal seperators in a row";
60 decimalPointFound =
true;
64 (startsWith == ValidatorFileSizePrivate::StartsWith::DigitPart)) ||
66 (startsWith == ValidatorFileSizePrivate::StartsWith::SymbolPart))) {
69 qCDebug(C_VALIDATOR).nospace() <<
"ValidatorFileSize: Validation failed for "
70 <<
value <<
": " <<
"symbol inside digit part";
74 }
else if ((uc != ValidatorRulePrivate::asciiTab) &&
75 (uc != ValidatorRulePrivate::asciiSpace)) {
77 if (startsWith == ValidatorFileSizePrivate::StartsWith::NotSet) {
78 startsWith = ValidatorFileSizePrivate::StartsWith::SymbolPart;
81 (startsWith == ValidatorFileSizePrivate::StartsWith::SymbolPart)) ||
83 (startsWith == ValidatorFileSizePrivate::StartsWith::DigitPart))) {
85 case ValidatorFileSizePrivate::ascii_K:
89 qCDebug(C_VALIDATOR).nospace()
90 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
91 <<
"unit symbol K already found";
97 case ValidatorFileSizePrivate::ascii_M:
101 qCDebug(C_VALIDATOR).nospace()
102 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
103 <<
"unit symbol M already found";
109 case ValidatorFileSizePrivate::ascii_G:
111 if (multiplier > 0) {
113 qCDebug(C_VALIDATOR).nospace()
114 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
115 <<
"unit symbol G already found";
121 case ValidatorFileSizePrivate::ascii_T:
123 if (multiplier > 0) {
125 qCDebug(C_VALIDATOR).nospace()
126 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
127 <<
"unit symbol T already found";
133 case ValidatorFileSizePrivate::ascii_P:
135 if (multiplier > 0) {
137 qCDebug(C_VALIDATOR).nospace()
138 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
139 <<
"unit symbol P already found";
145 case ValidatorFileSizePrivate::ascii_E:
147 if (multiplier > 0) {
149 qCDebug(C_VALIDATOR).nospace()
150 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
151 <<
"unit symbol E already found";
157 case ValidatorRulePrivate::ascii_Z:
159 if (multiplier > 0) {
161 qCDebug(C_VALIDATOR).nospace()
162 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
163 <<
"unit symbol Z already found";
169 case ValidatorFileSizePrivate::ascii_Y:
171 if (multiplier > 0) {
173 qCDebug(C_VALIDATOR).nospace()
174 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
175 <<
"unit symbol Y already found";
181 case ValidatorFileSizePrivate::ascii_I:
183 if ((multiplier == 0) || binary) {
185 qCDebug(C_VALIDATOR).nospace()
186 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
187 <<
"binary indicator I already found or no unit symbol given "
194 case ValidatorFileSizePrivate::ascii_B:
198 qCDebug(C_VALIDATOR).nospace()
199 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
200 <<
"byte symbol B already found";
202 byteSignFound =
true;
206 case ValidatorRulePrivate::asciiTab:
207 case ValidatorRulePrivate::asciiSpace:
211 qCDebug(C_VALIDATOR).nospace()
212 <<
"ValdatorFileSize: Validation failed for " <<
value <<
": "
213 <<
"invalid character in symbol part";
238 double size = locale.
toDouble(digitPart, &ok);
242 if (multiplier > 0) {
244 binary ? std::exp2(multiplier * 10) : std::pow(10.0, multiplier * 3);
247 if ((min >= 1.0) && (size < min)) {
250 if ((max >= 1.0) && (size > max)) {
253 if (valid && fileSize) {
275 if (d->min.isValid()) {
276 min = d->extractDouble(c, params, d->min, &ok);
278 qCWarning(C_VALIDATOR).noquote()
279 <<
debugString(c) <<
"Invalid minimum size comparison data";
281 c,
static_cast<int>(ValidatorRulePrivate::ErrorType::InvalidMin));
285 if (ok && d->max.isValid()) {
286 max = d->extractDouble(c, params, d->max, &ok);
288 qCWarning(C_VALIDATOR).noquote()
289 <<
debugString(c) <<
"Invalid maximum size comparison data";
291 c,
static_cast<int>(ValidatorRulePrivate::ErrorType::InvalidMax));
298 if (size <
static_cast<double>(std::numeric_limits<qulonglong>::max())) {
299 result.
value.
setValue<qulonglong>(
static_cast<qulonglong
>(size + 0.5));
305 qCWarning(C_VALIDATOR).noquote()
306 <<
debugString(c) << v <<
"is not a valid data size string";
346 const auto errorType =
static_cast<ValidatorRulePrivate::ErrorType
>(errorData.
toInt());
350 case ValidatorRulePrivate::ErrorType::InvalidMin:
352 return c->
qtTrId(
"cutelyst-valfilesize-genvaldataerr-min");
353 case ValidatorRulePrivate::ErrorType::InvalidMax:
355 return c->
qtTrId(
"cutelyst-valfilesize-genvaldataerr-max");
356 case ValidatorRulePrivate::ErrorType::InvalidType:
363 case ValidatorRulePrivate::ErrorType::InvalidMin:
365 return c->
qtTrId(
"cutelyst-valfilesize-genvaldataerr-min-label").
arg(_label);
366 case ValidatorRulePrivate::ErrorType::InvalidMax:
368 return c->
qtTrId(
"cutelyst-valfilesize-genvaldataerr-max-label").
arg(_label);
369 case ValidatorRulePrivate::ErrorType::InvalidType:
376#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
378 Q_UNREACHABLE_RETURN({});
QLocale locale() const noexcept
void setStash(const QString &key, const QVariant &value)
QString qtTrId(const char *id, int n=-1) const
ValidatorFileSize(const QString &field, Option option=NoOption, const QVariant &min=QVariant(), const QVariant &max=QVariant(), const ValidatorMessages &messages=ValidatorMessages(), const QString &defValKey=QString())
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