@ -1,9 +1,11 @@
// Copyright (c) 2011-2013 The Bitcoin developers
// Copyright (c) 2011-2014 The Bitcoin developers
// Distributed under the MIT/X11 software license, see the accompanying
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
# include "bitcoinaddressvalidator.h"
# include "bitcoinaddressvalidator.h"
# include "base58.h"
/* Base58 characters are:
/* Base58 characters are:
" 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz "
" 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz "
@ -11,21 +13,23 @@
- All numbers except for ' 0 '
- All numbers except for ' 0 '
- All upper - case letters except for ' I ' and ' O '
- All upper - case letters except for ' I ' and ' O '
- All lower - case letters except for ' l '
- All lower - case letters except for ' l '
User friendly Base58 input can map
- ' l ' and ' I ' to ' 1 '
- ' 0 ' and ' O ' to ' o '
*/
*/
BitcoinAddressValidator : : BitcoinAddressValidator ( QObject * parent ) :
BitcoinAddressEntryValidator : : BitcoinAddressEntryValidator ( QObject * parent ) :
QValidator ( parent )
QValidator ( parent )
{
{
}
}
QValidator : : State BitcoinAddressValidator : : validate ( QString & input , int & pos ) const
QValidator : : State BitcoinAddressEntry Validator : : validate ( QString & input , int & pos ) const
{
{
Q_UNUSED ( pos ) ;
// Empty address is "intermediate" input
if ( input . isEmpty ( ) )
return QValidator : : Intermediate ;
// Correction
// Correction
for ( int idx = 0 ; idx < input . size ( ) ; )
for ( int idx = 0 ; idx < input . size ( ) ; )
{
{
bool removeChar = false ;
bool removeChar = false ;
QChar ch = input . at ( idx ) ;
QChar ch = input . at ( idx ) ;
@ -42,11 +46,13 @@ QValidator::State BitcoinAddressValidator::validate(QString &input, int &pos) co
default :
default :
break ;
break ;
}
}
// Remove whitespace
// Remove whitespace
if ( ch . isSpace ( ) )
if ( ch . isSpace ( ) )
removeChar = true ;
removeChar = true ;
// To next character
// To next character
if ( removeChar )
if ( removeChar )
input . remove ( idx , 1 ) ;
input . remove ( idx , 1 ) ;
else
else
+ + idx ;
+ + idx ;
@ -54,14 +60,14 @@ QValidator::State BitcoinAddressValidator::validate(QString &input, int &pos) co
// Validation
// Validation
QValidator : : State state = QValidator : : Acceptable ;
QValidator : : State state = QValidator : : Acceptable ;
for ( int idx = 0 ; idx < input . size ( ) ; + + idx )
for ( int idx = 0 ; idx < input . size ( ) ; + + idx )
{
{
int ch = input . at ( idx ) . unicode ( ) ;
int ch = input . at ( idx ) . unicode ( ) ;
if ( ( ( ch > = ' 0 ' & & ch < = ' 9 ' ) | |
if ( ( ( ch > = ' 0 ' & & ch < = ' 9 ' ) | |
( ch > = ' a ' & & ch < = ' z ' ) | |
( ch > = ' a ' & & ch < = ' z ' ) | |
( ch > = ' A ' & & ch < = ' Z ' ) ) & &
( ch > = ' A ' & & ch < = ' Z ' ) ) & &
ch ! = ' l ' & & ch ! = ' I ' & & ch ! = ' 0 ' & & ch ! = ' O ' )
ch ! = ' l ' & & ch ! = ' I ' & & ch ! = ' 0 ' & & ch ! = ' O ' )
{
{
// Alphanumeric and not a 'forbidden' character
// Alphanumeric and not a 'forbidden' character
}
}
@ -71,11 +77,21 @@ QValidator::State BitcoinAddressValidator::validate(QString &input, int &pos) co
}
}
}
}
// Empty address is "intermediate" input
if ( input . isEmpty ( ) )
{
state = QValidator : : Intermediate ;
}
return state ;
return state ;
}
}
BitcoinAddressCheckValidator : : BitcoinAddressCheckValidator ( QObject * parent ) :
QValidator ( parent )
{
}
QValidator : : State BitcoinAddressCheckValidator : : validate ( QString & input , int & pos ) const
{
Q_UNUSED ( pos ) ;
// Validate the passed Bitcoin address
CBitcoinAddress addr ( input . toStdString ( ) ) ;
if ( addr . IsValid ( ) )
return QValidator : : Acceptable ;
return QValidator : : Invalid ;
}