From 605d854057eb470a1d75210193b82eb0b1ad6b53 Mon Sep 17 00:00:00 2001 From: treke Date: Wed, 04 Sep 2002 17:53:12 +0000 Subject: Major modifications to the User Interface 1) Bookmark support added, all options are stored on a per bookmark basis 2) 16 Bit color is now a supported bit depth for the server --- (limited to 'noncore/comm') diff --git a/noncore/comm/keypebble/keypebble.pro b/noncore/comm/keypebble/keypebble.pro index a102381..1017133 100644 --- a/noncore/comm/keypebble/keypebble.pro +++ b/noncore/comm/keypebble/keypebble.pro @@ -7,11 +7,12 @@ HEADERS = d3des.h \ krfbconnection.h \ krfbdecoder.h \ krfblogin.h \ - krfboptions.h \ + krfbserver.h \ krfbserverinfo.h \ kvnc.h \ - kvncconnectdlg.h \ - kvncoptionsdlg.h \ + kvncconndlg.h \ + kvncbookmarkdlg.h \ + version.h \ vncauth.h SOURCES = d3des.c \ vncauth.c \ @@ -20,12 +21,13 @@ SOURCES = d3des.c \ krfbconnection.cpp \ krfbdecoder.cpp \ krfblogin.cpp \ - krfboptions.cpp \ + krfbserver.cpp \ kvnc.cpp \ - kvncconnectdlg.cpp \ - kvncoptionsdlg.cpp \ + kvncconndlg.cpp \ + kvncbookmarkdlg.cpp \ main.cpp -INTERFACES = vncoptionsbase.ui +INTERFACES = kvncconndlgbase.ui \ + kvncbookmarkdlgbase.ui TARGET = keypebble INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include diff --git a/noncore/comm/keypebble/krfbbuffer.cpp b/noncore/comm/keypebble/krfbbuffer.cpp index 4885261..5a52f31 100644 --- a/noncore/comm/keypebble/krfbbuffer.cpp +++ b/noncore/comm/keypebble/krfbbuffer.cpp @@ -150,7 +150,38 @@ void KRFBBuffer::drawRawRectChunk( void *data, *p = qRgb( r,g,b ); } } - } + } else if (decoder->format->bpp == 16 ) { + + CARD16 *d = (CARD16 *) data; + + uint r,g,b; + + for ( int j = 0; j < h; j++ ) { + for ( int i = 0; i < w ; i++ ) { + CARD16 pixel = d[ j * w + i ]; + pixel = Swap16IfLE( pixel ); + + r = pixel; + r = r >> decoder->format->redShift; + r = r & redMax; + + g = pixel; + g = g >> decoder->format->greenShift; + g = g & greenMax; + + b = pixel; + b = b >> decoder->format->blueShift; + b = b & blueMax; + + r = ( r * 255 ) / redMax; + g = ( g * 255 ) / greenMax; + b = ( b * 255 ) / blueMax; + + ulong *p = ( ulong * ) img.scanLine( j ) + i; + *p = qRgb( r,g,b ); + } + } + } else { p.setBrush( QBrush( Qt::black ) ); p.drawRect( x, y, w, h ); diff --git a/noncore/comm/keypebble/krfbcanvas.cpp b/noncore/comm/keypebble/krfbcanvas.cpp index f74ab7b..8b56795 100644 --- a/noncore/comm/keypebble/krfbcanvas.cpp +++ b/noncore/comm/keypebble/krfbcanvas.cpp @@ -1,10 +1,10 @@ -#include "kvncconnectdlg.h" #include "krfbconnection.h" #include "krfbcanvas.h" -#include "krfboptions.h" +#include "krfbserver.h" #include "krfbbuffer.h" #include +#include #include #include @@ -18,12 +18,11 @@ KRFBCanvas::KRFBCanvas( QWidget *parent, const char *name ) : QScrollView( parent, name ) { connection_ = new KRFBConnection(); - connect( connection_, SIGNAL( passwordRequired( KRFBConnection * ) ), - this, SLOT( passwordRequired( KRFBConnection * ) ) ); connect( connection_, SIGNAL( loggedIn() ), this, SLOT( loggedIn() ) ); loggedIn_ = false; + QPEApplication::setStylusOperation(viewport(), QPEApplication::RightOnHold); viewport()->setFocusPolicy( QWidget::StrongFocus ); viewport()->setFocus(); @@ -33,16 +32,17 @@ KRFBCanvas::~KRFBCanvas() { } -void KRFBCanvas::openConnection() + +void KRFBCanvas::openConnection(KRFBServer server) { - KVNCConnectDlg dlg( connection_, this, "connect dialog" ); - if ( dlg.exec() ) { - QCString host = dlg.hostname().latin1(); - password = dlg.password(); - connection_->connectTo( host, dlg.display() ); - } + + + QCString host = server.hostname.latin1(); + password=server.password; + connection_->connectTo( server); } + void KRFBCanvas::openURL( const QUrl &url ) { if ( loggedIn_ ) { @@ -52,10 +52,8 @@ void KRFBCanvas::openURL( const QUrl &url ) QCString host = url.host().latin1(); int display = url.port(); - if ( url.hasPassword() ) - connection_->setPassword( url.password().latin1() ); - connection_->connectTo( host, display ); +// connection_->connectTo( host, display ); } void KRFBCanvas::closeConnection() @@ -69,10 +67,6 @@ void KRFBCanvas::closeConnection() update(); } -void KRFBCanvas::passwordRequired( KRFBConnection *con ) -{ - con->setPassword( password.latin1() ); -} void KRFBCanvas::bell() { @@ -167,3 +161,12 @@ void KRFBCanvas::clipboardChanged() connection_->sendCutText( qApp->clipboard()->text() ); } } +void KRFBCanvas::sendCtlAltDel( void) +{ + + qDebug("Here"); + if ( loggedIn_ ) { + connection_->buffer()->keyPressEvent( &QKeyEvent(QEvent::KeyPress,Qt::Key_Delete, 0x7f,ControlButton|AltButton)); + // connection_->buffer()->keyPressEvent( &QKeyEvent(QEvent::KeyRelease,Qt::Key_Delete, 0x7f,ControlButton|AltButton)); + } +} diff --git a/noncore/comm/keypebble/krfbcanvas.h b/noncore/comm/keypebble/krfbcanvas.h index 7864f1c..cd3047c 100644 --- a/noncore/comm/keypebble/krfbcanvas.h +++ b/noncore/comm/keypebble/krfbcanvas.h @@ -7,6 +7,7 @@ #include class KRFBConnection; +class KRFBServer; /** * Displays data from an KRFBDecoder, and sends events to the @@ -23,13 +24,14 @@ public: KRFBConnection *connection() { return connection_; }; public slots: - void openConnection(); + + void openConnection (KRFBServer); void openURL( const QUrl & ); void closeConnection(); - void passwordRequired( KRFBConnection * ); void refresh(); void bell(); + void sendCtlAltDel(void); protected: virtual void keyPressEvent( QKeyEvent * ); diff --git a/noncore/comm/keypebble/krfbconnection.cpp b/noncore/comm/keypebble/krfbconnection.cpp index c51f18a..389c836 100644 --- a/noncore/comm/keypebble/krfbconnection.cpp +++ b/noncore/comm/keypebble/krfbconnection.cpp @@ -5,238 +5,230 @@ #include "krfbconnection.h" #include "krfblogin.h" -#include "krfboptions.h" +#include "krfbserver.h" #include "krfbdecoder.h" #include "krfbbuffer.h" KRFBConnection::KRFBConnection( QObject *parent ) - : QObject( parent, "KRFBConnection" ) + : QObject( parent, "KRFBConnection" ) { - portBase_ = 5900; - currentState_ = Disconnected; - sock = 0; - minData_ = 0; - options_ = new KRFBOptions(); - updater = 0; - decoder_ = 0; - buffer_ = 0; + portBase_ = 5900; + currentState_ = Disconnected; + sock = 0; + minData_ = 0; + options_ = new KRFBServer(); + updater = 0; + decoder_ = 0; + buffer_ = 0; } KRFBConnection::~KRFBConnection() { - if ( ( currentState_ != Disconnected ) && ( currentState_ != Disconnecting ) && sock ) { - disconnectDone(); - } - delete options_; + if ( ( currentState_ != Disconnected ) && ( currentState_ != Disconnecting ) && sock ) { + disconnectDone(); + } + delete options_; } -void KRFBConnection::connectTo( const QCString &host, int display ) +void KRFBConnection::connectTo( KRFBServer server) { - if ( currentState_ != Disconnected ); - disconnect(); + if ( currentState_ != Disconnected ) + disconnect(); + + (*options_)=server; - this->host_= host; - this->display_ = display; + sock = new QSocket( this, "rfbSocket" ); + CHECK_PTR( sock ); - sock = new QSocket( this, "rfbSocket" ); - CHECK_PTR( sock ); + // Connect to something to notice connection or error + connect( sock, SIGNAL( error( int ) ), SLOT( gotSocketError( int ) ) ); + connect( sock, SIGNAL( connected() ), SLOT( gotSocketConnection() ) ); - // Connect to something to notice connection or error - connect( sock, SIGNAL( error( int ) ), SLOT( gotSocketError( int ) ) ); - connect( sock, SIGNAL( connected() ), SLOT( gotSocketConnection() ) ); + qWarning( "Connecting..." ); - qWarning( "Connecting..." ); - - currentState_ = Connecting; - sock->connectToHost( host_, portBase_ + display_ ); + currentState_ = Connecting; + sock->connectToHost( options_->hostname.latin1(), portBase_ + options_->display ); } void KRFBConnection::disconnect() { - qWarning( "Disconnecting from server" ); + qWarning( "Disconnecting from server" ); - if ( ( currentState_ != Disconnected ) - && ( currentState_ != Disconnecting ) - && sock ) { - currentState_ = Disconnecting; + if ( ( currentState_ != Disconnected ) + && ( currentState_ != Disconnecting ) + && sock ) { + currentState_ = Disconnecting; - connect( sock, SIGNAL( delayedCloseFinished() ), SLOT( disconnectDone() ) ); - sock->close(); + connect( sock, SIGNAL( delayedCloseFinished() ), SLOT( disconnectDone() ) ); + sock->close(); - if ( sock->state() != QSocket::Closing ) - disconnectDone(); - } + if ( sock->state() != QSocket::Closing ) + disconnectDone(); + } } void KRFBConnection::disconnectDone() { - qWarning( "KRFBConnection disconnected" ); - currentState_ = Disconnected; - delete sock; - sock = 0; - minData_ = 0; - delete updater; - delete decoder_; - delete buffer_; - emit disconnected(); + currentState_ = Disconnected; + delete sock; + sock = 0; + minData_ = 0; + delete updater; + delete decoder_; + delete buffer_; + emit disconnected(); } void KRFBConnection::gotSocketConnection() { - currentState_ = LoggingIn; + currentState_ = LoggingIn; - qWarning( "Connected, logging in..." ); + qWarning( "Connected, logging in..." ); - static QString statusMsg = tr( "Connected" ); - emit statusChanged( statusMsg ); + static QString statusMsg = tr( "Connected" ); + emit statusChanged( statusMsg ); - // Do some login stuff - login = new KRFBLogin( this ); + // Do some login stuff + login = new KRFBLogin( this ); } void KRFBConnection::gotRFBConnection() { - qWarning( "Logged into server" ); + qWarning( "Logged into server" ); - currentState_ = Connected; - emit connected(); + currentState_ = Connected; + emit connected(); - // Create the decoder and start doing stuff - decoder_ = new KRFBDecoder( this ); - CHECK_PTR( decoder_ ); + // Create the decoder and start doing stuff + decoder_ = new KRFBDecoder( this ); + CHECK_PTR( decoder_ ); - buffer_ = new KRFBBuffer( decoder_, this, "RFB Buffer" ); - CHECK_PTR( buffer_ ); - decoder_->setBuffer( buffer_ ); + buffer_ = new KRFBBuffer( decoder_, this, "RFB Buffer" ); + CHECK_PTR( buffer_ ); + decoder_->setBuffer( buffer_ ); - connect( decoder_, SIGNAL( status( const QString & ) ), - this, SIGNAL( statusChanged( const QString & ) ) ); - emit loggedIn(); + connect( decoder_, SIGNAL( status( const QString & ) ), + this, SIGNAL( statusChanged( const QString & ) ) ); + emit loggedIn(); - decoder_->start(); + decoder_->start(); - updater = new QTimer; - connect( updater, SIGNAL( timeout() ), SLOT( updateTimer() ) ); - updater->start( options_->updateRate ); + updater = new QTimer; + connect( updater, SIGNAL( timeout() ), SLOT( updateTimer() ) ); + updater->start( options_->updateRate ); } void KRFBConnection::gotSocketError( int err ) { - currentState_ = Error; - - // Do some error handling stuff - qWarning( "KRFBConnection: Socket error %d", err ); - - static QString refused = tr( "Connection Refused" ); - static QString host = tr( "Host not found" ); - static QString read = tr( "Read Error: QSocket reported an error reading\n" - "data, the remote host has probably dropped the\n" - "connection." ); - static QString confused = tr( "QSocket reported an invalid error code" ); - - QString msg; - switch ( err ) { - case QSocket::ErrConnectionRefused: - msg = refused; - break; - case QSocket::ErrHostNotFound: - msg = host; - break; - case QSocket::ErrSocketRead: - msg = read; - break; - default: - msg = confused; - }; - - QObject::disconnect( sock, SIGNAL( readyRead() ), this, SLOT( gotMoreData() ) ); - delete sock; - sock = 0; - currentState_ = Disconnected; - - emit error( msg ); + currentState_ = Error; + + // Do some error handling stuff + qWarning( "KRFBConnection: Socket error %d", err ); + + static QString refused = tr( "Connection Refused" ); + static QString host = tr( "Host not found" ); + static QString read = tr( "Read Error: QSocket reported an error reading\n" + "data, the remote host has probably dropped the\n" + "connection." ); + static QString confused = tr( "QSocket reported an invalid error code" ); + + QString msg; + switch ( err ) { + case QSocket::ErrConnectionRefused: + msg = refused; + break; + case QSocket::ErrHostNotFound: + msg = host; + break; + case QSocket::ErrSocketRead: + msg = read; + break; + default: + msg = confused; + }; + + QObject::disconnect( sock, SIGNAL( readyRead() ), this, SLOT( gotMoreData() ) ); + delete sock; + sock = 0; + currentState_ = Disconnected; + + emit error( msg ); } void KRFBConnection::gotMoreData() { - assert( minData_ > 0 ); + assert( minData_ > 0 ); - if ( sock->size() >= minData_ ) { - minData_ = 0; - QObject::disconnect( sock, SIGNAL( readyRead() ), this, SLOT( gotMoreData() ) ); - emit gotEnoughData(); - } + if ( sock->size() >= minData_ ) { + minData_ = 0; + QObject::disconnect( sock, SIGNAL( readyRead() ), this, SLOT( gotMoreData() ) ); + emit gotEnoughData(); + } } void KRFBConnection::waitForData( unsigned int sz ) { - assert( minData_ == 0 ); - assert( sz > 0 ); - assert( currentState_ != Error ); - - if ( sock->size() >= sz ) { - // qWarning( "No need to wait for data" ); - emit gotEnoughData(); - } - else { - // qWarning( "Waiting for %u bytes", sz ); - - minData_ = sz; - connect( sock, SIGNAL( readyRead() ), SLOT( gotMoreData() ) ); - } + assert( minData_ == 0 ); + assert( sz > 0 ); + assert( currentState_ != Error ); + + if ( sock->size() >= sz ) { + // qWarning( "No need to wait for data" ); + emit gotEnoughData(); + } + else { + // qWarning( "Waiting for %u bytes", sz ); + minData_ = sz; + connect( sock, SIGNAL( readyRead() ), SLOT( gotMoreData() ) ); + } } int KRFBConnection::read( void *buf, int sz ) { - return sock->readBlock( (char *) buf, sz ); + return sock->readBlock( (char *) buf, sz ); } int KRFBConnection::write( void *buf, int sz ) { - return sock->writeBlock( (const char *) buf, sz ); + return sock->writeBlock( (const char *) buf, sz ); } KRFBConnection::State KRFBConnection::state() const { - return currentState_; + return currentState_; } void KRFBConnection::setPortBase( int base ) { - portBase_ = base; + portBase_ = base; } int KRFBConnection::portBase() const { - return portBase_; -} - -void KRFBConnection::setPassword( const QCString &pass ) -{ - this->pass_ = pass; + return portBase_; } void KRFBConnection::updateTimer() { - decoder_->sendUpdateRequest( true ); + decoder_->sendUpdateRequest( true ); } void KRFBConnection::refresh() { - decoder_->sendUpdateRequest( false ); + decoder_->sendUpdateRequest( false ); } void KRFBConnection::sendCutText( const QString &text ) { - decoder_->sendCutEvent( text ); + decoder_->sendCutEvent( text ); } const QUrl &KRFBConnection::url() { - url_.setProtocol( "vnc" ); - url_.setPort( display() ); - url_.setHost( host() ); - url_.setPath( "/" ); + url_.setProtocol( "vnc" ); + url_.setPort( display() ); + url_.setHost( host() ); + url_.setPath( "/" ); - return url_; + return url_; } diff --git a/noncore/comm/keypebble/krfbconnection.h b/noncore/comm/keypebble/krfbconnection.h index fe477c1..a8d3457 100644 --- a/noncore/comm/keypebble/krfbconnection.h +++ b/noncore/comm/keypebble/krfbconnection.h @@ -6,11 +6,12 @@ #include #include #include +#include "krfbserver.h" #include class KRFBLogin; class KRBUpdateHandler; -class KRFBOptions; +class KRFBServer; class QSocket; class KRFBDecoder; class KRFBBuffer; @@ -45,7 +46,7 @@ public: State state() const; //* Get the options for this connection - KRFBOptions *options() const { return options_; }; + KRFBServer *options() const { return options_; }; KRFBBuffer *buffer() const { return buffer_; }; @@ -57,20 +58,17 @@ public: //* Get the base from which the port for a given display is calculated. int portBase() const; - //* Set the password which will be used to login - void setPassword( const QCString &pass ); - //* Open a connection - void connectTo( const QCString &host, int display ); + void connectTo( KRFBServer); //* Close the connection void disconnect(); //* Get the host - const QCString host() const { return host_; }; + const QCString host() const { return options_->hostname.latin1(); }; //* Get the display - int display() const { return display_; }; + int display() const { return options_->display; }; //* Get the current host/display as a URL const QUrl &url(); @@ -133,17 +131,14 @@ private: int write( void *buf, int sz ); private: - QCString host_; int portBase_; - int display_; - QCString pass_; QSocket *sock; State currentState_; unsigned int minData_; QTimer *updater; KRFBLogin *login; KRFBDecoder *decoder_; - KRFBOptions *options_; + KRFBServer *options_; KRFBBuffer *buffer_; QUrl url_; }; diff --git a/noncore/comm/keypebble/krfbdecoder.cpp b/noncore/comm/keypebble/krfbdecoder.cpp index 174dd7b..a964c09 100644 --- a/noncore/comm/keypebble/krfbdecoder.cpp +++ b/noncore/comm/keypebble/krfbdecoder.cpp @@ -1,5 +1,5 @@ #include "krfbconnection.h" -#include "krfboptions.h" +#include "krfbserver.h" #include "krfbserverinfo.h" #include "krfbdecoder.h" #include "krfbbuffer.h" @@ -796,6 +796,7 @@ void KRFBDecoder::sendKeyReleaseEvent( QKeyEvent *event ) } } + int KRFBDecoder::toKeySym( QKeyEvent *k ) { int ke = 0; diff --git a/noncore/comm/keypebble/krfblogin.cpp b/noncore/comm/keypebble/krfblogin.cpp index cc3a8fa..0d2a205 100644 --- a/noncore/comm/keypebble/krfblogin.cpp +++ b/noncore/comm/keypebble/krfblogin.cpp @@ -52,8 +52,6 @@ KRFBLogin::KRFBLogin( KRFBConnection *con ) connect( this, SIGNAL( error( const QString & ) ), con, SIGNAL( error( const QString & ) ) ); - connect( this, SIGNAL( passwordRequired( KRFBConnection * ) ), - con, SIGNAL( passwordRequired( KRFBConnection * ) ) ); qWarning( "Waiting for server version..." ); @@ -183,12 +181,12 @@ void KRFBLogin::getPassword() con->read( challenge, ChallengeLength ); // Last chance to enter a password - if ( con->pass_.isNull() ) { + if ( con->options_->password.isNull() ) { qWarning( "krfblogin needs a password" ); emit passwordRequired( con ); } - if ( con->pass_.isNull() ) { + if ( con->options_->password.isNull() ) { QString msg = tr( "Error: This server requires a password, but none " "has been specified.\n" ); @@ -196,7 +194,7 @@ void KRFBLogin::getPassword() return; } - vncEncryptBytes( (unsigned char *) challenge, con->pass_.data() ); + vncEncryptBytes( (unsigned char *) challenge, QCString(con->options_->password.latin1()).data() ); con->write( challenge, ChallengeLength ); connect( con, SIGNAL( gotEnoughData() ), SLOT( gotAuthResult() ) ); diff --git a/noncore/comm/keypebble/krfboptions.cpp b/noncore/comm/keypebble/krfboptions.cpp deleted file mode 100644 index 8c4320b..0000000 --- a/noncore/comm/keypebble/krfboptions.cpp +++ b/dev/null @@ -1,56 +0,0 @@ -#include -#include -#include "krfboptions.h" - -KRFBOptions::KRFBOptions() -{ - readSettings(); -} - -KRFBOptions::~KRFBOptions() -{ - writeSettings(); -} - -void KRFBOptions::readSettings() -{ - Config config( "keypebble" ); - config.setGroup("Settings"); - hexTile = config.readBoolEntry( "HexTile", 0 ); - corre = config.readBoolEntry( "CORRE", 0 ); - rre = config.readBoolEntry( "RRE", 0 ); - copyrect = config.readBoolEntry( "CopyRect", 1 ); - colors256 = config.readBoolEntry( "Colors256", 0 ); - shared = config.readBoolEntry( "Shared", 0 ); - readOnly = config.readBoolEntry( "ReadOnly", 0 ); - updateRate = config.readNumEntry( "UpdateRate", 50 ); - deIconify = config.readBoolEntry( "DeIconify", 0 ); -} - -void KRFBOptions::writeSettings() -{ - Config config( "keypebble" ); - config.setGroup("Settings"); - config.writeEntry( "HexTile", hexTile ); - config.writeEntry( "CORRE", corre ); - config.writeEntry( "RRE", rre ); - config.writeEntry( "CopyRect", copyrect ); - config.writeEntry( "Colors256", colors256 ); - config.writeEntry( "Shared", shared ); - config.writeEntry( "ReadOnly", readOnly ); - config.writeEntry( "UpdateRate", updateRate ); - config.writeEntry( "DeIconify", deIconify ); -} - -int KRFBOptions::encodings() -{ - // Initially one because we always support raw encoding - int count = 1; - - count += hexTile ? 1 : 0; - count += corre ? 1 : 0; - count += rre ? 1 : 0; - count += copyrect ? 1 : 0; - - return count; -} diff --git a/noncore/comm/keypebble/krfboptions.h b/noncore/comm/keypebble/krfboptions.h deleted file mode 100644 index fd2b65c..0000000 --- a/noncore/comm/keypebble/krfboptions.h +++ b/dev/null @@ -1,31 +0,0 @@ -// -*- c++ -*- - -#ifndef KRFBOPTIONS_H -#define KRFBOPTIONS_H - -class Config; - -class KRFBOptions -{ -public: - KRFBOptions(); - ~KRFBOptions(); - - int encodings(); - void readSettings(); - void writeSettings(); - - bool hexTile; - bool corre; - bool rre; - bool copyrect; - - bool colors256; - bool shared; - bool readOnly; - bool deIconify; - - int updateRate; -}; - -#endif // KRFBOPTIONS_H diff --git a/noncore/comm/keypebble/krfbserver.cpp b/noncore/comm/keypebble/krfbserver.cpp new file mode 100644 index 0000000..5775f09 --- a/dev/null +++ b/noncore/comm/keypebble/krfbserver.cpp @@ -0,0 +1,39 @@ +#include +#include +#include "krfbserver.h" + +KRFBServer::KRFBServer() +{ + QString name; + QString hostname; + QString password; + display=0; + + hexTile=0; + corre=0; + rre=0; + copyrect=1; + + colors256=1; + shared=0; + readOnly=0; + deIconify=0; + + updateRate=0; +} +KRFBServer::~KRFBServer() +{ +} + +int KRFBServer::encodings() +{ + // Initially one because we always support raw encoding + int count = 1; + + count += hexTile ? 1 : 0; + count += corre ? 1 : 0; + count += rre ? 1 : 0; + count += copyrect ? 1 : 0; + + return count; +} diff --git a/noncore/comm/keypebble/kvnc.cpp b/noncore/comm/keypebble/kvnc.cpp index 43cffc5..aa46e2f 100644 --- a/noncore/comm/keypebble/kvnc.cpp +++ b/noncore/comm/keypebble/kvnc.cpp @@ -10,14 +10,27 @@ #include #include #include +#include +#include +#include #include #include +#include +#include + #include #include "kvnc.h" #include "krfbcanvas.h" -#include "kvncoptionsdlg.h" #include "krfbconnection.h" +#include "kvncconndlg.h" +#include "krfbserver.h" + +static int u_id = 1; +static int get_unique_id() +{ + return u_id++; +} /* XPM */ @@ -48,9 +61,19 @@ KVNC::KVNC( const char *name ) : QMainWindow( 0, name ) setCaption( tr("VNC Viewer") ); fullscreen = false; - canvas = new KRFBCanvas( this, "canvas" ); - setCentralWidget( canvas ); + stack = new QWidgetStack( this ); + setCentralWidget( stack ); + bookmarkSelector=new KVNCBookmarkDlg(); + stack->addWidget(bookmarkSelector,get_unique_id()); + stack->raiseWidget( bookmarkSelector ); + + canvas = new KRFBCanvas( stack, "canvas" ); + stack->addWidget(canvas,get_unique_id()); + setCentralWidget( stack ); + + connect( bookmarkSelector->bookmarkList, SIGNAL(doubleClicked(QListBoxItem *)), + this, SLOT(openConnection(QListBoxItem *)) ); connect( canvas->connection(), SIGNAL(statusChanged(const QString &)), this, SLOT(statusMessage(const QString &)) ); connect( canvas->connection(), SIGNAL(error(const QString &)), @@ -66,16 +89,73 @@ KVNC::KVNC( const char *name ) : QMainWindow( 0, name ) connect( cornerButton, SIGNAL(pressed()), this, SLOT(showMenu()) ); canvas->setCornerWidget( cornerButton ); - QTimer::singleShot( 0, canvas, SLOT(openConnection()) ); + stack->raiseWidget( bookmarkSelector ); + + + QPEToolBar *bar = new QPEToolBar( this ); + + QAction *n = new QAction( tr( "New Connection" ), Resource::loadPixmap( "new" ), + QString::null, 0, this, 0 ); + connect( n, SIGNAL( activated() ), + this, SLOT( newConnection() ) ); + n->addTo( bar ); + + QAction *o = new QAction( tr( "Open Bookmark" ), Resource::loadPixmap( "edit" ), + QString::null, 0, this, 0 ); + connect( o, SIGNAL( activated() ), + this, SLOT( openConnection() ) ); + o->addTo( bar ); + + QAction *d = new QAction( tr( "Delete Bookmark" ), Resource::loadPixmap( "trash" ), + QString::null, 0, this, 0 ); + connect( d, SIGNAL( activated() ), + this, SLOT( deleteBookmark() ) ); + d->addTo( bar ); } KVNC::~KVNC() { + +} + +void KVNC::newConnection() +{ + curServer=new KRFBServer; + + KVNCConnDlg dlg( curServer,this); + dlg.showMaximized(); + if ( dlg.exec()) { + if (!curServer->name.isEmpty()) + bookmarkSelector->addBookmark(curServer); + canvas->openConnection(*curServer); + } else + curServer=0; +} + +void KVNC::openConnection( QString name) +{ + curServer=bookmarkSelector->getServer(name); + + if (curServer) { + KVNCConnDlg dlg( curServer,this); + dlg.showMaximized(); + + if ( dlg.exec() ) { + canvas->openConnection(*curServer); + bookmarkSelector->writeBookmarks(); + } else + curServer=0; + } +} + +void KVNC::openConnection( void ) +{ + openConnection( bookmarkSelector->selectedBookmark()); } -void KVNC::openURL( const QUrl &url ) +void KVNC::openConnection( QListBoxItem * item) { - canvas->openURL( url ); + openConnection(item->text()); } void KVNC::setupActions() @@ -88,14 +168,11 @@ void KVNC::setupActions() fullScreenAction->addTo( cornerMenu ); fullScreenAction->setEnabled( false ); - optionsAction = new QAction( tr("Settings"), QString::null, 0, 0 ); - connect( optionsAction, SIGNAL(activated()), this, SLOT( showOptions() ) ); - optionsAction->addTo( cornerMenu ); - - connectAction = new QAction( tr("Connect..."), QString::null, 0, 0 ); - connect( connectAction, SIGNAL(activated()), - canvas, SLOT( openConnection() ) ); - connectAction->addTo( cornerMenu ); + ctlAltDelAction = new QAction( tr("Send Contrl-Alt-Delete"), QString::null, 0, 0 ); + connect( ctlAltDelAction, SIGNAL(activated()), + canvas, SLOT( sendCtlAltDel() ) ); + ctlAltDelAction->addTo( cornerMenu ); + ctlAltDelAction->setEnabled( false ); disconnectAction = new QAction( tr("Disconnect"), QString::null, 0, 0 ); connect( disconnectAction, SIGNAL(activated()), @@ -106,26 +183,31 @@ void KVNC::setupActions() void KVNC::toggleFullScreen() { - if ( fullscreen ) { - canvas->releaseKeyboard(); - canvas->reparent( this, 0, QPoint(0,0), false ); - canvas->setFrameStyle( QFrame::Panel | QFrame::Sunken ); - setCentralWidget( canvas ); - canvas->show(); - fullScreenAction->setText( tr("Full Screen") ); - } else { - canvas->setFrameStyle( QFrame::NoFrame ); - canvas->reparent( 0,WStyle_Tool | WStyle_Customize | WStyle_StaysOnTop, - QPoint(0,0),false); - canvas->resize(qApp->desktop()->width(), qApp->desktop()->height()); - canvas->raise(); - canvas->setFocus(); - canvas->grabKeyboard(); - canvas->show(); - - fullScreenAction->setText( tr("Stop Full Screen") ); - } - + if ( fullscreen ) { + canvas->releaseKeyboard(); + canvas->reparent( stack, 0, QPoint(0,0), false ); + canvas->setFrameStyle( QFrame::Panel | QFrame::Sunken ); + setCentralWidget( stack ); + stack->addWidget(canvas,get_unique_id()); + stack->raiseWidget(canvas); + canvas->show(); + stack->show(); + fullScreenAction->setText( tr("Full Screen") ); + } else { + canvas->setFrameStyle( QFrame::NoFrame ); + stack->removeWidget(canvas); + canvas->reparent( 0,WStyle_Tool | WStyle_Customize | WStyle_StaysOnTop, + QPoint(0,0),false); + canvas->resize(qApp->desktop()->width(), qApp->desktop()->height()); + canvas->raise(); + canvas->setFocus(); + canvas->grabKeyboard(); + canvas->show(); + + fullScreenAction->setText( tr("Stop Full Screen") ); + } + + fullscreen = !fullscreen; } @@ -149,9 +231,10 @@ void KVNC::connected() { static QString msg = tr( "Connected to remote host" ); statusMessage( msg ); - connectAction->setEnabled( false ); + ctlAltDelAction->setEnabled(true); disconnectAction->setEnabled( true ); fullScreenAction->setEnabled( true ); + stack->raiseWidget(canvas); } void KVNC::loggedIn() @@ -162,11 +245,15 @@ void KVNC::loggedIn() void KVNC::disconnected() { + + if ( fullscreen ) + toggleFullScreen(); static QString msg = tr( "Connection closed" ); statusMessage( msg ); - connectAction->setEnabled( true ); + ctlAltDelAction->setEnabled(false); disconnectAction->setEnabled( false ); fullScreenAction->setEnabled( false ); + stack->raiseWidget(bookmarkSelector); } void KVNC::statusMessage( const QString &m ) @@ -179,12 +266,7 @@ void KVNC::error( const QString &msg ) statusMessage( msg ); QMessageBox::warning( this, tr("VNC Viewer"), msg ); } - -void KVNC::showOptions() +void KVNC::deleteBookmark(void) { - KVNCOptionsDlg *wdg = new KVNCOptionsDlg( canvas->connection()->options(), this ); - wdg->showMaximized(); - wdg->exec(); - delete wdg; + bookmarkSelector->deleteBookmark(bookmarkSelector->selectedBookmark()); } - diff --git a/noncore/comm/keypebble/kvnc.h b/noncore/comm/keypebble/kvnc.h index 92666c5..6e0a385 100644 --- a/noncore/comm/keypebble/kvnc.h +++ b/noncore/comm/keypebble/kvnc.h @@ -5,6 +5,8 @@ #include #include +#include +#include "kvncbookmarkdlg.h" class QAction; class KRFBCanvas; @@ -25,10 +27,13 @@ public: ~KVNC(); public slots: + void newConnection(); + void deleteBookmark(); + void openConnection(QListBoxItem *); + void openConnection(QString); + void openConnection(void); void toggleFullScreen(); - void openURL( const QUrl & ); void closeConnection(); - void showOptions(); protected: void setupActions(); @@ -50,7 +55,12 @@ private: QAction *fullScreenAction; QAction *optionsAction; QAction *disconnectAction; + QAction *ctlAltDelAction;; QAction *connectAction; + + KVNCBookmarkDlg * bookmarkSelector; + QWidgetStack * stack; + KRFBServer * curServer; }; #endif // KVNC_H diff --git a/noncore/comm/keypebble/kvncbookmarkdlg.cpp b/noncore/comm/keypebble/kvncbookmarkdlg.cpp new file mode 100644 index 0000000..1f97d13 --- a/dev/null +++ b/noncore/comm/keypebble/kvncbookmarkdlg.cpp @@ -0,0 +1,220 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "krfbserver.h" +#include "kvncbookmarkdlg.h" + +KVNCBookmarkDlg::KVNCBookmarkDlg( QWidget * parent=0, const char * name=0, WFlags f=0 ) + +: KVNCBookmarkDlgBase( parent, name,f) +{ + readBookmarks(); + refresh(); + +} + +KVNCBookmarkDlg::~KVNCBookmarkDlg() +{ +} + +void KVNCBookmarkDlg::addBookmark(KRFBServer * server) +{ + if (server) { + servers.append(server); + bookmarkList->insertItem(server->name); + writeBookmarks(); + refresh(); + } +} + +void KVNCBookmarkDlg::deleteBookmark(QString name) +{ + KRFBServer * server=0; + for ( server=servers.first(); server != 0; server=servers.next() ) { + if (server->name==name) { + servers.remove(servers.at()); + writeBookmarks(); + refresh(); + return; + } + } +} +KRFBServer *KVNCBookmarkDlg::getServer(QString name) +{ + KRFBServer * server=0; + for ( server=servers.first(); server != 0; server=servers.next() ) { + if (server->name==name) + + return server; + } + return 0; +} + + +/* + Note that the degree of protection offered by the encryption here is + only sufficient to avoid the most casual observation of the configuration + files. People with access to the files can write down the contents and + decrypt it using this source code. + + Conceivably, and at some burden to the user, this encryption could + be improved. +*/ +QString KVNCBookmarkDlg::encipher(const QString& plain) +{ + // mainly, we make it long + QString cipher; + int mix=28730492; + for (int i=0; i<(int)plain.length(); i++) { + int u = plain[i].unicode(); + int c = u ^ mix; + QString x = QString::number(c,36); + cipher.append(QChar('a'+x.length())); + cipher.append(x); + mix *= u; + } + return cipher; +} + +QString KVNCBookmarkDlg::decipher(const QString& cipher) +{ + QString plain; + int mix=28730492; + for (int i=0; i<(int)cipher.length();) { + int l = cipher[i].unicode()-'a'; + QString x = cipher.mid(i+1,l); i+=l+1; + int u = x.toInt(0,36) ^ mix; + plain.append(QChar(u)); + mix *= u; + } + return plain; +} + +void KVNCBookmarkDlg::readBookmarks(void) +{ + QFile f(QDir::homeDirPath() + QString("/Applications/keypebble/bookmarks")); + + QStringList entry; + QString key, val; + KRFBServer * server=0; + + if ( f.open(IO_ReadOnly) ) { + QTextStream t( &f ); + QString s; + int n = 1; + while ( !t.eof() ) { + s = t.readLine(); + + + entry=QStringList::split('=',s); + key=entry[0].stripWhiteSpace().lower(); + val=entry[1].stripWhiteSpace(); + + if (key=="server") { + + if (server){ + servers.append(server); + server=0; + } + server = new KRFBServer(); + + if (!server) + return; + server->name=val; + + } + else if (key=="hostname") + server->hostname=val; + else if (key=="password") + server->password=decipher(val); + else if (key=="display") + server->display=val.toInt(); + else if (key=="hextile") + server->hexTile=val.toInt(); + else if (key=="corre") + server->corre=val.toInt(); + else if (key=="rre") + server->rre=val.toInt(); + else if (key=="copyrect") + server->copyrect=val.toInt(); + else if (key=="colors256") + server->colors256=val.toInt(); + else if (key=="shared") + server->shared=val.toInt(); + else if (key=="readonly") + server->readOnly=val.toInt(); + else if (key=="deiconify") + server->deIconify=val.toInt(); + else if (key=="updaterate") + server->updateRate=val.toInt(); + + } + if (server){ + servers.append(server); + server=0; + } + f.close(); + } +} + +void KVNCBookmarkDlg::writeBookmarks(void) +{ + QString filename=Global::applicationFileName("keypebble","bookmarks"); + + QFile f(filename); + + QString key, val; + KRFBServer * server=0; + + if ( f.open(IO_ReadWrite) ) { + QTextStream t( &f ); + QString s; + int n = 1; + KRFBServer *server; + + for ( server=servers.first(); server != 0; server=servers.next() ) { + qDebug(server->name); + t << "server=" << server->name << '\n'; + t << "\thostname=" << server->hostname << '\n'; + t << "\tpassword=" << encipher(server->password )<< '\n'; + t << "\tdisplay=" << server->display << '\n'; + t << "\thextile=" << server->hexTile << '\n'; + t << "\tcorre=" << server->corre << '\n'; + t << "\trre=" << server->rre << '\n'; + t << "\tcopyrect=" << server->copyrect << '\n'; + t << "\tshared=" << server->shared << '\n'; + t << "\treadonly=" << server->readOnly << '\n'; + t << "\tdeiconify=" << server->deIconify << '\n'; + t << "\tupdaterate=" << server->updateRate << '\n'; + + } + f.close(); + } +} +void KVNCBookmarkDlg::refresh(void) +{ + bookmarkList->clear(); + KRFBServer * server=0; + for ( server=servers.first(); server != 0; server=servers.next() ) { + bookmarkList->insertItem(server->name); + } +} + +QString KVNCBookmarkDlg::selectedBookmark() +{ + return bookmarkList->currentText(); +} diff --git a/noncore/comm/keypebble/kvncconndlg.cpp b/noncore/comm/keypebble/kvncconndlg.cpp new file mode 100644 index 0000000..6873feb --- a/dev/null +++ b/noncore/comm/keypebble/kvncconndlg.cpp @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "krfbserver.h" + +#include "kvncconndlg.h" + +KVNCConnDlg::KVNCConnDlg( KRFBServer *options, + QWidget *parent, char *name, bool modal ) +: KVNCConnDlgBase( parent, name, modal ) +{ + this->options=options; + tmpOptions=*options; + + serverHostname->setText(options->hostname); + serverDisplay->setValue(options->display); + serverPassword->setText(options->password); + serverBookmark->setText(options->name); + + hex->setChecked( options->hexTile ); + corre->setChecked( options->corre ); + rre->setChecked( options->rre ); + copyRect->setChecked( options->copyrect ); + + // TODO + hex->setEnabled( false ); + corre->setEnabled( false ); + rre->setEnabled( false ); + // /TODO + + deIconify->setChecked( options->deIconify ); + bit->setChecked( options->colors256 ); + shared->setChecked( options->shared ); + timeBox->setValue( options->updateRate ); + + +} + +KVNCConnDlg::~KVNCConnDlg() +{ +} + +void KVNCConnDlg::accept() +{ + save(); + QDialog::accept(); +} + +void KVNCConnDlg::save() +{ + tmpOptions.hexTile = hex->isChecked(); + tmpOptions.corre = corre->isChecked(); + tmpOptions.rre = rre->isChecked(); + tmpOptions.copyrect = copyRect->isChecked(); + tmpOptions.deIconify = deIconify->isChecked(); + tmpOptions.colors256 = bit->isChecked(); + tmpOptions.shared = shared->isChecked(); + tmpOptions.hostname = serverHostname->text(); + tmpOptions.password = serverPassword->text(); + tmpOptions.display = serverDisplay->value(); + tmpOptions.name = serverBookmark->text(); + + if (!serverBookmark->text().isEmpty()) { + if ( options) { + *options=tmpOptions; + } + } +} diff --git a/noncore/comm/keypebble/kvncconnectdlg.cpp b/noncore/comm/keypebble/kvncconnectdlg.cpp deleted file mode 100644 index 467cebf..0000000 --- a/noncore/comm/keypebble/kvncconnectdlg.cpp +++ b/dev/null @@ -1,79 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "krfbconnection.h" -#include "kvncoptionsdlg.h" -#include "kvncconnectdlg.h" - - -KVNCConnectDlg::KVNCConnectDlg( KRFBConnection *con, - QWidget *parent, const char *name ) - : QDialog( parent, name, true ) -{ - setCaption( tr("Connect to VNC server") ); - assert( con ); - this->con = con; - - QGridLayout *inner = new QGridLayout( this, 3, 2, 6 ); - - QLabel *label = new QLabel( tr("Host Name:"), - this , "hostLabel"); - hostNameCombo = new QComboBox( true, this ); - hostNameCombo->setInsertionPolicy( QComboBox::AtTop ); - hostNameCombo->setMaxCount( 10 ); - hostNameCombo->insertItem( "localhost" ); - hostNameCombo->setFocus(); - - inner->addWidget( label, 0, 0 ); - inner->addWidget( hostNameCombo, 0, 1 ); - - label = new QLabel( tr("Display Number:"), this, "displayNumber" ); - displayNumberEdit = new QSpinBox( this ); - - inner->addWidget( label, 1, 0 ); - inner->addWidget( displayNumberEdit, 1, 1 ); - - // if ( viewer->display() != -1 ) { - // displayNumberEdit->setValue( viewer->display() ); - displayNumberEdit->setValue( 1 ); - // } - - label = new QLabel( tr("Password:"), this ); - inner->addWidget( label, 2, 0 ); - - passwordEdit = new QLineEdit( this ); - passwordEdit->setEchoMode( QLineEdit::Password ); - inner->addWidget( passwordEdit, 2, 1 ); - - inner->setColStretch( 0, 0 ); - inner->setColStretch( 1, 15 ); -} - - -void KVNCConnectDlg::accept() -{ - int dis; - // viewer->setHost(hostNameCombo->currentText()); - QString temp = displayNumberEdit->text(); - if(temp.isEmpty()) - dis = -1; - else - dis = temp.toUInt(); - // viewer->setDisplay(dis); - QDialog::accept(); -} - -void KVNCConnectDlg::options() -{ - KVNCOptionsDlg *wdg = new KVNCOptionsDlg( con->options(), this ); - wdg->exec(); - delete wdg; -} - diff --git a/noncore/comm/keypebble/kvncconnectdlg.h b/noncore/comm/keypebble/kvncconnectdlg.h deleted file mode 100644 index cf34aab..0000000 --- a/noncore/comm/keypebble/kvncconnectdlg.h +++ b/dev/null @@ -1,39 +0,0 @@ -// -*- c++ -*- - -#ifndef KVNCCONNECTDLG_H -#define KVNCCONNECTDLG_H - -#include -#include -#include -#include -#include - -class KRFBConnection; - -class KVNCConnectDlg : public QDialog -{ - Q_OBJECT - -public: - KVNCConnectDlg( KRFBConnection *con, - QWidget *parent = 0, const char *name = 0 ); - - QString hostname() { return hostNameCombo->currentText(); }; - int display() { return displayNumberEdit->value(); }; - QString password() const { return passwordEdit->text(); } - -protected: - void accept(); - -protected slots: - void options(); - -private: - QComboBox *hostNameCombo; - QSpinBox *displayNumberEdit; - QLineEdit *passwordEdit; - KRFBConnection *con; -}; - -#endif // KVNCCONNECTDLG_H diff --git a/noncore/comm/keypebble/kvncoptionsdlg.cpp b/noncore/comm/keypebble/kvncoptionsdlg.cpp deleted file mode 100644 index 9d61c7b..0000000 --- a/noncore/comm/keypebble/kvncoptionsdlg.cpp +++ b/dev/null @@ -1,54 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include "krfboptions.h" - -#include "kvncoptionsdlg.h" - -KVNCOptionsDlg::KVNCOptionsDlg( KRFBOptions *options, - QWidget *parent, char *name, bool modal ) - : VncOptionsBase( parent, name, modal ) -{ - this->options = options; - - hex->setChecked( options->hexTile ); - corre->setChecked( options->corre ); - rre->setChecked( options->rre ); - copyRect->setChecked( options->copyrect ); - - // TODO - hex->setEnabled( false ); - corre->setEnabled( false ); - rre->setEnabled( false ); - // /TODO - - deIconify->setChecked( options->deIconify ); - bit->setChecked( options->colors256 ); - shared->setChecked( options->shared ); - timeBox->setValue( options->updateRate ); -} - -KVNCOptionsDlg::~KVNCOptionsDlg() -{ -} - -void KVNCOptionsDlg::accept() -{ - options->hexTile = hex->isChecked(); - options->corre = corre->isChecked(); - options->rre = rre->isChecked(); - options->copyrect = copyRect->isChecked(); - options->deIconify = deIconify->isChecked(); - options->colors256 = bit->isChecked(); - options->shared = shared->isChecked(); - options->updateRate = timeBox->value(); - options->writeSettings(); - - QDialog::accept(); -} - diff --git a/noncore/comm/keypebble/kvncoptionsdlg.h b/noncore/comm/keypebble/kvncoptionsdlg.h deleted file mode 100644 index a166490..0000000 --- a/noncore/comm/keypebble/kvncoptionsdlg.h +++ b/dev/null @@ -1,30 +0,0 @@ -// -*- c++ -*- - -#ifndef KVNCOPTIONSDIALOG_H -#define KVNCOPTIONSDIALOG_H - -#include "vncoptionsbase.h" - -class KRFBOptions; - -class KVNCOptionsDlg : public VncOptionsBase -{ -Q_OBJECT - -public: - KVNCOptionsDlg( KRFBOptions *options, - QWidget *parent = 0, char *name = 0, bool modal = true ); - ~KVNCOptionsDlg(); - -protected: - void accept(); - -private: - KRFBOptions *options; -}; - -#endif // KVNCOPTIONSDIALOG_H - - - - diff --git a/noncore/comm/keypebble/main.cpp b/noncore/comm/keypebble/main.cpp index ee3cd79..bc7782c 100644 --- a/noncore/comm/keypebble/main.cpp +++ b/noncore/comm/keypebble/main.cpp @@ -10,8 +10,6 @@ int main( int argc, char **argv ) KVNC *view = new KVNC( "Keypebble" ); app.showMainWidget( view ); - if ( argc > 1 ) - view->openURL( QUrl(argv[1]) ); - return app.exec(); } + -- cgit v0.9.0.2