summaryrefslogtreecommitdiff
path: root/noncore/comm/keypebble/krfbconnection.cpp
authorkergoth <kergoth>2002-01-25 22:14:26 (UTC)
committer kergoth <kergoth>2002-01-25 22:14:26 (UTC)
commit15318cad33835e4e2dc620d033e43cd930676cdd (patch) (unidiff)
treec2fa0399a2c47fda8e2cd0092c73a809d17f68eb /noncore/comm/keypebble/krfbconnection.cpp
downloadopie-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.cpp242
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
12KRFBConnection::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
25KRFBConnection::~KRFBConnection()
26{
27 if ( ( currentState_ != Disconnected ) && ( currentState_ != Disconnecting ) && sock ) {
28 disconnectDone();
29 }
30 delete options_;
31}
32
33void 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
54void 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
71void 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
84void 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
97void 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
123void 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
160void 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
171void 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
189int KRFBConnection::read( void *buf, int sz )
190{
191 return sock->readBlock( (char *) buf, sz );
192}
193
194int KRFBConnection::write( void *buf, int sz )
195{
196 return sock->writeBlock( (const char *) buf, sz );
197}
198
199KRFBConnection::State KRFBConnection::state() const
200{
201 return currentState_;
202}
203
204void KRFBConnection::setPortBase( int base )
205{
206 portBase_ = base;
207}
208
209int KRFBConnection::portBase() const
210{
211 return portBase_;
212}
213
214void KRFBConnection::setPassword( const QCString &pass )
215{
216 this->pass_ = pass;
217}
218
219void KRFBConnection::updateTimer()
220{
221 decoder_->sendUpdateRequest( true );
222}
223
224void KRFBConnection::refresh()
225{
226 decoder_->sendUpdateRequest( false );
227}
228
229void KRFBConnection::sendCutText( const QString &text )
230{
231 decoder_->sendCutEvent( text );
232}
233
234const QUrl &KRFBConnection::url()
235{
236 url_.setProtocol( "vnc" );
237 url_.setPort( display() );
238 url_.setHost( host() );
239 url_.setPath( "/" );
240
241 return url_;
242}