Update CMakeLists.txt - play with openssl
[novacoin.git] / src / qt / bitcoinaddressvalidator.cpp
index 92d7dae..5136ea0 100644 (file)
@@ -1,14 +1,12 @@
 #include "bitcoinaddressvalidator.h"
 
-#include <QDebug>
-
 /* Base58 characters are:
      "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
 
   This is:
   - All numbers except for '0'
-  - All uppercase letters except for 'I' and 'O'
-  - All lowercase letters except for 'l'
+  - All upper-case letters except for 'I' and 'O'
+  - All lower-case letters except for 'l'
 
   User friendly Base58 input can map
   - 'l' and 'I' to '1'
@@ -23,21 +21,31 @@ BitcoinAddressValidator::BitcoinAddressValidator(QObject *parent) :
 QValidator::State BitcoinAddressValidator::validate(QString &input, int &pos) const
 {
     // 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':
-        case 'I':
-            input[idx] = QChar('1');
-            break;
-        case '0':
-        case 'O':
-            input[idx] = QChar('o');
+        // Qt categorizes these as "Other_Format" not "Separator_Space"
+        case 0x200B: // ZERO WIDTH SPACE
+        case 0xFEFF: // ZERO WIDTH NO-BREAK SPACE
+            removeChar = true;
             break;
         default:
             break;
         }
+        // Remove whitespace
+        if(ch.isSpace())
+            removeChar = true;
+        // To next character
+        if(removeChar)
+            input.remove(idx, 1);
+        else
+            ++idx;
     }
 
     // Validation
@@ -59,5 +67,11 @@ QValidator::State BitcoinAddressValidator::validate(QString &input, int &pos) co
         }
     }
 
+    // Empty address is "intermediate" input
+    if(input.isEmpty())
+    {
+        state = QValidator::Intermediate;
+    }
+
     return state;
 }