Diffstat (limited to 'noncore/comm/keypebble/krfblogin.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/comm/keypebble/krfblogin.cpp | 1 |
1 files changed, 0 insertions, 1 deletions
diff --git a/noncore/comm/keypebble/krfblogin.cpp b/noncore/comm/keypebble/krfblogin.cpp index 0d2a205..0b4a757 100644 --- a/noncore/comm/keypebble/krfblogin.cpp +++ b/noncore/comm/keypebble/krfblogin.cpp | |||
@@ -1,107 +1,106 @@ | |||
1 | #include <assert.h> | 1 | #include <assert.h> |
2 | 2 | ||
3 | 3 | ||
4 | extern "C" { | 4 | extern "C" { |
5 | #include "vncauth.h" | 5 | #include "vncauth.h" |
6 | } | 6 | } |
7 | 7 | ||
8 | #include "krfblogin.h" | 8 | #include "krfblogin.h" |
9 | #include "krfbconnection.h" | 9 | #include "krfbconnection.h" |
10 | #include <qtimer.h> | 10 | #include <qtimer.h> |
11 | #include <qregexp.h> | ||
12 | 11 | ||
13 | // The length of the various messages (used to decide how many bytes to | 12 | // The length of the various messages (used to decide how many bytes to |
14 | // wait for). | 13 | // wait for). |
15 | const int ServerVersionLength = 12; | 14 | const int ServerVersionLength = 12; |
16 | const int ClientVersionLength = 12; | 15 | const int ClientVersionLength = 12; |
17 | const int AuthSchemeLength = 4; | 16 | const int AuthSchemeLength = 4; |
18 | const int FailureReasonSizeLength = 4; | 17 | const int FailureReasonSizeLength = 4; |
19 | const int ChallengeLength = 16; | 18 | const int ChallengeLength = 16; |
20 | const int AuthResultLength = 4; | 19 | const int AuthResultLength = 4; |
21 | 20 | ||
22 | // Authentication results | 21 | // Authentication results |
23 | enum AuthResult { | 22 | enum AuthResult { |
24 | AuthOk, | 23 | AuthOk, |
25 | AuthFailed, | 24 | AuthFailed, |
26 | AuthTooMany | 25 | AuthTooMany |
27 | }; | 26 | }; |
28 | 27 | ||
29 | typedef unsigned char CARD8; | 28 | typedef unsigned char CARD8; |
30 | typedef unsigned short CARD16; | 29 | typedef unsigned short CARD16; |
31 | typedef unsigned long CARD32; | 30 | typedef unsigned long CARD32; |
32 | 31 | ||
33 | const int endianTest = 1; | 32 | const int endianTest = 1; |
34 | 33 | ||
35 | // Endian stuff | 34 | // Endian stuff |
36 | #define Swap16IfLE(s) \ | 35 | #define Swap16IfLE(s) \ |
37 | (*(char *)&endianTest ? ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff)) : (s)) | 36 | (*(char *)&endianTest ? ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff)) : (s)) |
38 | 37 | ||
39 | #define Swap32IfLE(l) \ | 38 | #define Swap32IfLE(l) \ |
40 | (*(char *)&endianTest ? ((((l) & 0xff000000) >> 24) | \ | 39 | (*(char *)&endianTest ? ((((l) & 0xff000000) >> 24) | \ |
41 | (((l) & 0x00ff0000) >> 8) | \ | 40 | (((l) & 0x00ff0000) >> 8) | \ |
42 | (((l) & 0x0000ff00) << 8) | \ | 41 | (((l) & 0x0000ff00) << 8) | \ |
43 | (((l) & 0x000000ff) << 24)) : (l)) | 42 | (((l) & 0x000000ff) << 24)) : (l)) |
44 | 43 | ||
45 | KRFBLogin::KRFBLogin( KRFBConnection *con ) | 44 | KRFBLogin::KRFBLogin( KRFBConnection *con ) |
46 | : QObject( con, "RFB login manager" ) | 45 | : QObject( con, "RFB login manager" ) |
47 | { | 46 | { |
48 | assert( con ); | 47 | assert( con ); |
49 | this->con = con; | 48 | this->con = con; |
50 | currentState = AwaitingServerVersion; | 49 | currentState = AwaitingServerVersion; |
51 | 50 | ||
52 | connect( this, SIGNAL( error( const QString & ) ), | 51 | connect( this, SIGNAL( error( const QString & ) ), |
53 | con, SIGNAL( error( const QString & ) ) ); | 52 | con, SIGNAL( error( const QString & ) ) ); |
54 | 53 | ||
55 | 54 | ||
56 | qWarning( "Waiting for server version..." ); | 55 | qWarning( "Waiting for server version..." ); |
57 | 56 | ||
58 | static QString statusMsg = tr( "Waiting for server version..." ); | 57 | static QString statusMsg = tr( "Waiting for server version..." ); |
59 | emit status( statusMsg ); | 58 | emit status( statusMsg ); |
60 | 59 | ||
61 | // Kick off the state machine | 60 | // Kick off the state machine |
62 | connect( con, SIGNAL( gotEnoughData() ), SLOT( gotServerVersion() ) ); | 61 | connect( con, SIGNAL( gotEnoughData() ), SLOT( gotServerVersion() ) ); |
63 | con->waitForData( ServerVersionLength ); | 62 | con->waitForData( ServerVersionLength ); |
64 | } | 63 | } |
65 | 64 | ||
66 | KRFBLogin::~KRFBLogin() | 65 | KRFBLogin::~KRFBLogin() |
67 | { | 66 | { |
68 | 67 | ||
69 | } | 68 | } |
70 | 69 | ||
71 | KRFBLogin::State KRFBLogin::state() const | 70 | KRFBLogin::State KRFBLogin::state() const |
72 | { | 71 | { |
73 | return currentState; | 72 | return currentState; |
74 | } | 73 | } |
75 | 74 | ||
76 | void KRFBLogin::gotServerVersion() | 75 | void KRFBLogin::gotServerVersion() |
77 | { | 76 | { |
78 | qWarning( "Got server version" ); | 77 | qWarning( "Got server version" ); |
79 | 78 | ||
80 | disconnect( con, SIGNAL( gotEnoughData() ), | 79 | disconnect( con, SIGNAL( gotEnoughData() ), |
81 | this, SLOT( gotServerVersion() ) ); | 80 | this, SLOT( gotServerVersion() ) ); |
82 | 81 | ||
83 | // Read the server's version message | 82 | // Read the server's version message |
84 | char serverVersion[ ServerVersionLength + 1 ]; | 83 | char serverVersion[ ServerVersionLength + 1 ]; |
85 | con->read( serverVersion, ServerVersionLength ); | 84 | con->read( serverVersion, ServerVersionLength ); |
86 | serverVersion[ ServerVersionLength ] = '\0'; | 85 | serverVersion[ ServerVersionLength ] = '\0'; |
87 | 86 | ||
88 | QCString rfbString( serverVersion, ServerVersionLength + 1 ); | 87 | QCString rfbString( serverVersion, ServerVersionLength + 1 ); |
89 | versionString = rfbString; | 88 | versionString = rfbString; |
90 | 89 | ||
91 | QRegExp regexp( "RFB [0-9][0-9][0-9]\\.[0-9][0-9][0-9]\n" ); | 90 | QRegExp regexp( "RFB [0-9][0-9][0-9]\\.[0-9][0-9][0-9]\n" ); |
92 | 91 | ||
93 | if ( rfbString.find( regexp ) == -1 ) { | 92 | if ( rfbString.find( regexp ) == -1 ) { |
94 | static QString msg = tr( "Error: Invalid server version, %1" ).arg( rfbString ); | 93 | static QString msg = tr( "Error: Invalid server version, %1" ).arg( rfbString ); |
95 | 94 | ||
96 | qWarning( msg ); | 95 | qWarning( msg ); |
97 | emit error( msg ); | 96 | emit error( msg ); |
98 | currentState = Error; | 97 | currentState = Error; |
99 | return; | 98 | return; |
100 | } | 99 | } |
101 | 100 | ||
102 | // Calculate the actual version number | 101 | // Calculate the actual version number |
103 | serverMajor = (serverVersion[4] - '0') * 100 | 102 | serverMajor = (serverVersion[4] - '0') * 100 |
104 | + (serverVersion[5] - '0') * 10 | 103 | + (serverVersion[5] - '0') * 10 |
105 | + (serverVersion[6] - '0'); | 104 | + (serverVersion[6] - '0'); |
106 | serverMinor = (serverVersion[8] - '0') * 100 | 105 | serverMinor = (serverVersion[8] - '0') * 100 |
107 | + (serverVersion[9] - '0') * 10 | 106 | + (serverVersion[9] - '0') * 10 |