author | kergoth <kergoth> | 2002-01-25 22:14:26 (UTC) |
---|---|---|
committer | kergoth <kergoth> | 2002-01-25 22:14:26 (UTC) |
commit | 15318cad33835e4e2dc620d033e43cd930676cdd (patch) (unidiff) | |
tree | c2fa0399a2c47fda8e2cd0092c73a809d17f68eb /noncore/comm/keypebble/krfbconnection.cpp | |
download | opie-15318cad33835e4e2dc620d033e43cd930676cdd.zip opie-15318cad33835e4e2dc620d033e43cd930676cdd.tar.gz opie-15318cad33835e4e2dc620d033e43cd930676cdd.tar.bz2 |
Initial revision
Diffstat (limited to 'noncore/comm/keypebble/krfbconnection.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/comm/keypebble/krfbconnection.cpp | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/noncore/comm/keypebble/krfbconnection.cpp b/noncore/comm/keypebble/krfbconnection.cpp new file mode 100644 index 0000000..c413186 --- a/dev/null +++ b/noncore/comm/keypebble/krfbconnection.cpp | |||
@@ -0,0 +1,242 @@ | |||
1 | #include <assert.h> | ||
2 | #include <qsocket.h> | ||
3 | #include <qtimer.h> | ||
4 | #include <string.h> | ||
5 | |||
6 | #include "krfbconnection.h" | ||
7 | #include "krfblogin.h" | ||
8 | #include "krfboptions.h" | ||
9 | #include "krfbdecoder.h" | ||
10 | #include "krfbbuffer.h" | ||
11 | |||
12 | KRFBConnection::KRFBConnection( QObject *parent ) | ||
13 | : QObject( parent, "KRFBConnection" ) | ||
14 | { | ||
15 | portBase_ = 5900; | ||
16 | currentState_ = Disconnected; | ||
17 | sock = 0; | ||
18 | minData_ = 0; | ||
19 | options_ = new KRFBOptions(); | ||
20 | updater = 0; | ||
21 | decoder_ = 0; | ||
22 | buffer_ = 0; | ||
23 | } | ||
24 | |||
25 | KRFBConnection::~KRFBConnection() | ||
26 | { | ||
27 | if ( ( currentState_ != Disconnected ) && ( currentState_ != Disconnecting ) && sock ) { | ||
28 | disconnectDone(); | ||
29 | } | ||
30 | delete options_; | ||
31 | } | ||
32 | |||
33 | void KRFBConnection::connectTo( const QCString &host, int display ) | ||
34 | { | ||
35 | if ( currentState_ != Disconnected ); | ||
36 | disconnect(); | ||
37 | |||
38 | this->host_= host; | ||
39 | this->display_ = display; | ||
40 | |||
41 | sock = new QSocket( this, "rfbSocket" ); | ||
42 | CHECK_PTR( sock ); | ||
43 | |||
44 | // Connect to something to notice connection or error | ||
45 | connect( sock, SIGNAL( error( int ) ), SLOT( gotSocketError( int ) ) ); | ||
46 | connect( sock, SIGNAL( connected() ), SLOT( gotSocketConnection() ) ); | ||
47 | |||
48 | qWarning( "Connecting..." ); | ||
49 | |||
50 | currentState_ = Connecting; | ||
51 | sock->connectToHost( host_, portBase_ + display_ ); | ||
52 | } | ||
53 | |||
54 | void KRFBConnection::disconnect() | ||
55 | { | ||
56 | qWarning( "Disconnecting from server" ); | ||
57 | |||
58 | if ( ( currentState_ != Disconnected ) | ||
59 | && ( currentState_ != Disconnecting ) | ||
60 | && sock ) { | ||
61 | currentState_ = Disconnecting; | ||
62 | |||
63 | connect( sock, SIGNAL( delayedCloseFinished() ), SLOT( disconnectDone() ) ); | ||
64 | sock->close(); | ||
65 | |||
66 | if ( sock->state() != QSocket::Closing ) | ||
67 | disconnectDone(); | ||
68 | } | ||
69 | } | ||
70 | |||
71 | void KRFBConnection::disconnectDone() | ||
72 | { | ||
73 | qWarning( "KRFBConnection disconnected" ); | ||
74 | currentState_ = Disconnected; | ||
75 | delete sock; | ||
76 | sock = 0; | ||
77 | minData_ = 0; | ||
78 | delete updater; | ||
79 | delete decoder_; | ||
80 | delete buffer_; | ||
81 | emit disconnected(); | ||
82 | } | ||
83 | |||
84 | void KRFBConnection::gotSocketConnection() | ||
85 | { | ||
86 | currentState_ = LoggingIn; | ||
87 | |||
88 | qWarning( "Connected, logging in..." ); | ||
89 | |||
90 | static QString statusMsg = tr( "Connected" ); | ||
91 | emit statusChanged( statusMsg ); | ||
92 | |||
93 | // Do some login stuff | ||
94 | login = new KRFBLogin( this ); | ||
95 | } | ||
96 | |||
97 | void KRFBConnection::gotRFBConnection() | ||
98 | { | ||
99 | qWarning( "Logged into server" ); | ||
100 | |||
101 | currentState_ = Connected; | ||
102 | emit connected(); | ||
103 | |||
104 | // Create the decoder and start doing stuff | ||
105 | decoder_ = new KRFBDecoder( this ); | ||
106 | CHECK_PTR( decoder_ ); | ||
107 | |||
108 | buffer_ = new KRFBBuffer( decoder_, this, "RFB Buffer" ); | ||
109 | CHECK_PTR( buffer_ ); | ||
110 | decoder_->setBuffer( buffer_ ); | ||
111 | |||
112 | connect( decoder_, SIGNAL( status( const QString & ) ), | ||
113 | this, SIGNAL( statusChanged( const QString & ) ) ); | ||
114 | emit loggedIn(); | ||
115 | |||
116 | decoder_->start(); | ||
117 | |||
118 | updater = new QTimer; | ||
119 | connect( updater, SIGNAL( timeout() ), SLOT( updateTimer() ) ); | ||
120 | updater->start( options_->updateRate ); | ||
121 | } | ||
122 | |||
123 | void KRFBConnection::gotSocketError( int errno ) | ||
124 | { | ||
125 | currentState_ = Error; | ||
126 | |||
127 | // Do some error handling stuff | ||
128 | qWarning( "KRFBConnection: Socket error %d", errno ); | ||
129 | |||
130 | static QString refused = tr( "Connection Refused" ); | ||
131 | static QString host = tr( "Host not found" ); | ||
132 | static QString read = tr( "Read Error: QSocket reported an error reading\n" | ||
133 | "data, the remote host has probably dropped the\n" | ||
134 | "connection." ); | ||
135 | static QString confused = tr( "QSocket reported an invalid error code" ); | ||
136 | |||
137 | QString msg; | ||
138 | switch ( errno ) { | ||
139 | case QSocket::ErrConnectionRefused: | ||
140 | msg = refused; | ||
141 | break; | ||
142 | case QSocket::ErrHostNotFound: | ||
143 | msg = host; | ||
144 | break; | ||
145 | case QSocket::ErrSocketRead: | ||
146 | msg = read; | ||
147 | break; | ||
148 | default: | ||
149 | msg = confused; | ||
150 | }; | ||
151 | |||
152 | QObject::disconnect( sock, SIGNAL( readyRead() ), this, SLOT( gotMoreData() ) ); | ||
153 | delete sock; | ||
154 | sock = 0; | ||
155 | currentState_ = Disconnected; | ||
156 | |||
157 | emit error( msg ); | ||
158 | } | ||
159 | |||
160 | void KRFBConnection::gotMoreData() | ||
161 | { | ||
162 | assert( minData_ > 0 ); | ||
163 | |||
164 | if ( sock->size() >= minData_ ) { | ||
165 | minData_ = 0; | ||
166 | QObject::disconnect( sock, SIGNAL( readyRead() ), this, SLOT( gotMoreData() ) ); | ||
167 | emit gotEnoughData(); | ||
168 | } | ||
169 | } | ||
170 | |||
171 | void KRFBConnection::waitForData( unsigned int sz ) | ||
172 | { | ||
173 | assert( minData_ == 0 ); | ||
174 | assert( sz > 0 ); | ||
175 | assert( currentState_ != Error ); | ||
176 | |||
177 | if ( sock->size() >= sz ) { | ||
178 | // qWarning( "No need to wait for data" ); | ||
179 | emit gotEnoughData(); | ||
180 | } | ||
181 | else { | ||
182 | // qWarning( "Waiting for %u bytes", sz ); | ||
183 | |||
184 | minData_ = sz; | ||
185 | connect( sock, SIGNAL( readyRead() ), SLOT( gotMoreData() ) ); | ||
186 | } | ||
187 | } | ||
188 | |||
189 | int KRFBConnection::read( void *buf, int sz ) | ||
190 | { | ||
191 | return sock->readBlock( (char *) buf, sz ); | ||
192 | } | ||
193 | |||
194 | int KRFBConnection::write( void *buf, int sz ) | ||
195 | { | ||
196 | return sock->writeBlock( (const char *) buf, sz ); | ||
197 | } | ||
198 | |||
199 | KRFBConnection::State KRFBConnection::state() const | ||
200 | { | ||
201 | return currentState_; | ||
202 | } | ||
203 | |||
204 | void KRFBConnection::setPortBase( int base ) | ||
205 | { | ||
206 | portBase_ = base; | ||
207 | } | ||
208 | |||
209 | int KRFBConnection::portBase() const | ||
210 | { | ||
211 | return portBase_; | ||
212 | } | ||
213 | |||
214 | void KRFBConnection::setPassword( const QCString &pass ) | ||
215 | { | ||
216 | this->pass_ = pass; | ||
217 | } | ||
218 | |||
219 | void KRFBConnection::updateTimer() | ||
220 | { | ||
221 | decoder_->sendUpdateRequest( true ); | ||
222 | } | ||
223 | |||
224 | void KRFBConnection::refresh() | ||
225 | { | ||
226 | decoder_->sendUpdateRequest( false ); | ||
227 | } | ||
228 | |||
229 | void KRFBConnection::sendCutText( const QString &text ) | ||
230 | { | ||
231 | decoder_->sendCutEvent( text ); | ||
232 | } | ||
233 | |||
234 | const QUrl &KRFBConnection::url() | ||
235 | { | ||
236 | url_.setProtocol( "vnc" ); | ||
237 | url_.setPort( display() ); | ||
238 | url_.setHost( host() ); | ||
239 | url_.setPath( "/" ); | ||
240 | |||
241 | return url_; | ||
242 | } | ||