|
|
@ -21,21 +21,31 @@ BitcoinAddressValidator::BitcoinAddressValidator(QObject *parent) : |
|
|
|
QValidator::State BitcoinAddressValidator::validate(QString &input, int &pos) const |
|
|
|
QValidator::State BitcoinAddressValidator::validate(QString &input, int &pos) const |
|
|
|
{ |
|
|
|
{ |
|
|
|
// Correction
|
|
|
|
// Correction
|
|
|
|
for(int idx=0; idx<input.size(); ++idx) |
|
|
|
for(int idx=0; idx<input.size();) |
|
|
|
{ |
|
|
|
{ |
|
|
|
switch(input.at(idx).unicode()) |
|
|
|
bool removeChar = false; |
|
|
|
|
|
|
|
QChar ch = input.at(idx); |
|
|
|
|
|
|
|
// Corrections made are very conservative on purpose, to avoid
|
|
|
|
|
|
|
|
// users unexpectedly getting away with typos that would normally
|
|
|
|
|
|
|
|
// be detected, and thus sending to the wrong address.
|
|
|
|
|
|
|
|
switch(ch.unicode()) |
|
|
|
{ |
|
|
|
{ |
|
|
|
case 'l': |
|
|
|
// Qt categorizes these as "Other_Format" not "Separator_Space"
|
|
|
|
case 'I': |
|
|
|
case 0x200B: // ZERO WIDTH SPACE
|
|
|
|
input[idx] = QChar('1'); |
|
|
|
case 0xFEFF: // ZERO WIDTH NO-BREAK SPACE
|
|
|
|
break; |
|
|
|
removeChar = true; |
|
|
|
case '0': |
|
|
|
|
|
|
|
case 'O': |
|
|
|
|
|
|
|
input[idx] = QChar('o'); |
|
|
|
|
|
|
|
break; |
|
|
|
break; |
|
|
|
default: |
|
|
|
default: |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Remove whitespace
|
|
|
|
|
|
|
|
if(ch.isSpace()) |
|
|
|
|
|
|
|
removeChar = true; |
|
|
|
|
|
|
|
// To next character
|
|
|
|
|
|
|
|
if(removeChar) |
|
|
|
|
|
|
|
input.remove(idx, 1); |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
++idx; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Validation
|
|
|
|
// Validation
|
|
|
|