mirror of
https://github.com/KDE/krfb
synced 2026-07-01 07:31:16 -07:00
Sync
svn path=/trunk/kdenetwork/krfb/; revision=127504
This commit is contained in:
@@ -25,14 +25,21 @@
|
|||||||
#include <qapplication.h>
|
#include <qapplication.h>
|
||||||
#include <X11/Xutil.h>
|
#include <X11/Xutil.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
RFBConnection::RFBConnection(Display *dpy, int fd) :
|
RFBConnection::RFBConnection(Display *dpy, int fd, const QString &cpassword) :
|
||||||
Server(),
|
Server(),
|
||||||
dpy(dpy),
|
dpy(dpy),
|
||||||
fd(fd),
|
fd(fd),
|
||||||
buttonMask(0)
|
buttonMask(0)
|
||||||
{
|
{
|
||||||
|
memcpy(password, "\0\0\0\0\0\0\0\0", 8);
|
||||||
|
if (!cpassword.isNull())
|
||||||
|
strncpy(password, cpassword.latin1(),
|
||||||
|
8 <= cpassword.length() ? 8 : cpassword.length());
|
||||||
|
|
||||||
bufferedConnection = new BufferedConnection(32768, 32768);
|
bufferedConnection = new BufferedConnection(32768, 32768);
|
||||||
connection = bufferedConnection;
|
connection = bufferedConnection;
|
||||||
|
|
||||||
@@ -134,3 +141,23 @@ void RFBConnection::destroyFramebuffer()
|
|||||||
delete scanner;
|
delete scanner;
|
||||||
XDestroyImage(framebufferImage);
|
XDestroyImage(framebufferImage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RFBConnection::scanUpdates()
|
||||||
|
{
|
||||||
|
list<Hint> hintList;
|
||||||
|
|
||||||
|
scanner->searchUpdates(hintList);
|
||||||
|
list<Hint>::iterator i;
|
||||||
|
for (i = hintList.begin(); i != hintList.end(); i++)
|
||||||
|
handleHint(*i);
|
||||||
|
};
|
||||||
|
|
||||||
|
void RFBConnection::getServerInitialisation( ServerInitialisation &_serverInit )
|
||||||
|
{
|
||||||
|
Server::getServerInitialisation( _serverInit );
|
||||||
|
_serverInit.name_length = strlen( getenv("HOSTNAME") );
|
||||||
|
_serverInit.name_string = (CARD8 *) malloc( _serverInit.name_length + 1 );
|
||||||
|
strcpy( (char*) _serverInit.name_string, getenv( "HOSTNAME" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "rfbconnection.moc"
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
// QT must be first because of conflicts with X11
|
// QT must be first because of conflicts with X11
|
||||||
#include <qobject.h>
|
#include <qobject.h>
|
||||||
|
#include <qstring.h>
|
||||||
|
|
||||||
#include "XUpdateScanner.h"
|
#include "XUpdateScanner.h"
|
||||||
|
|
||||||
@@ -49,10 +50,12 @@ using namespace rfb;
|
|||||||
class RFBConnection : public QObject, public Server {
|
class RFBConnection : public QObject, public Server {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
RFBConnection(Display *dpy, int fd);
|
RFBConnection(Display *dpy, int fd, const QString &cpassword);
|
||||||
~RFBConnection();
|
~RFBConnection();
|
||||||
virtual void handleKeyEvent(KeyEvent &keyEvent);
|
virtual void handleKeyEvent(KeyEvent &keyEvent);
|
||||||
virtual void handlePointerEvent(PointerEvent &pointerEvent);
|
virtual void handlePointerEvent(PointerEvent &pointerEvent);
|
||||||
|
virtual void getServerInitialisation( ServerInitialisation &_serverInitialisation );
|
||||||
|
void scanUpdates();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void createFramebuffer();
|
void createFramebuffer();
|
||||||
|
|||||||
163
krfb/rfbcontroller.cpp
Normal file
163
krfb/rfbcontroller.cpp
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
rfbcontroller.cpp
|
||||||
|
-------------------
|
||||||
|
begin : Sun Dec 9 2001
|
||||||
|
copyright : (C) 2001 by Tim Jansen
|
||||||
|
email : tim@tjansen.de
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* Contains portions & concept from rfb's x0rfbserver.cc
|
||||||
|
* Copyright (C) 2000 heXoNet Support GmbH, D-66424 Homburg.
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* *
|
||||||
|
* This program is free software; you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
|
* (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "rfbcontroller.h"
|
||||||
|
|
||||||
|
#include <kdebug.h>
|
||||||
|
#include <qwindowdef.h>
|
||||||
|
#include <qtimer.h>
|
||||||
|
#include <qglobal.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
RFBController::RFBController(Configuration *c) :
|
||||||
|
configuration(c),
|
||||||
|
idleUpdateScheduled(false)
|
||||||
|
{
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
|
||||||
|
RFBController::~RFBController() {
|
||||||
|
delete serversocket;
|
||||||
|
delete connection;
|
||||||
|
delete socket;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RFBController::start() {
|
||||||
|
serversocket = new KServerSocket(configuration->port, false);
|
||||||
|
connect(serversocket, SIGNAL(accepted()), SLOT(accepted()));
|
||||||
|
serversocket->bindAndListen();
|
||||||
|
// TODO: error message if bindAndListen fails (port in use)
|
||||||
|
}
|
||||||
|
|
||||||
|
void RFBController::rebind() {
|
||||||
|
if (serversocket) {
|
||||||
|
delete serversocket;
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RFBController::idleSlot() {
|
||||||
|
idleUpdateScheduled = false;
|
||||||
|
if (connection) {
|
||||||
|
connection->sendIncrementalFramebufferUpdate();
|
||||||
|
checkWritable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// called when KServerSocket accepted a connection. Closes KServerSocket.
|
||||||
|
void RFBController::accepted() {
|
||||||
|
int sockFd = serversocket->socket;
|
||||||
|
KSocket s;
|
||||||
|
if (sockFd < 0)
|
||||||
|
kdebug("Negative server socket?");
|
||||||
|
|
||||||
|
int one = 1;
|
||||||
|
setsockopt(sockFd, IPPROTO_TCP, TCP_NODELAY,
|
||||||
|
(char *)&one, sizeof(one));
|
||||||
|
fcntl(sockFd, F_SETFL, O_NONBLOCK);
|
||||||
|
s = new KSocket(sockFd);
|
||||||
|
|
||||||
|
// TODO: ASK USER FOR PERMISSION HERE BEFORE GOING ON
|
||||||
|
|
||||||
|
delete serversocket;
|
||||||
|
serversocket = 0;
|
||||||
|
|
||||||
|
socket = s;
|
||||||
|
connect(s, SIGNAL(readEvent(KSocket*)), SLOT(sockedReadable()));
|
||||||
|
connect(s, SIGNAL(writeEvent(KSocket*)), SLOT(sockedWritable()));
|
||||||
|
connect(s, SIGNAL(closeEvent(KSocket*)), SLOT(sockedClosed()));
|
||||||
|
s.enableRead(true);
|
||||||
|
connection = new RFBConnection(qt_xdisplay(), sockFd,
|
||||||
|
configuration->password);
|
||||||
|
setWritable();
|
||||||
|
emit sessionEstablished();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RFBController::checkWritable() {
|
||||||
|
BufferedConnection *bc = connection->bufferedConnection;
|
||||||
|
socket->writeEnable((bc->senderBuffer.end - bc->senderBuffer.pos) > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RFBController::prepareIdleUpdate() {
|
||||||
|
if (!idleUpdateScheduled)
|
||||||
|
QTimer::singleShot(0, this, SLOT(idleSlot()));
|
||||||
|
idleUpdateScheduled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RFBController::socketReadable() {
|
||||||
|
ASSERT(socket);
|
||||||
|
int fd = socket->socket();
|
||||||
|
BufferedConnection *bc = connection->bufferedConnection;
|
||||||
|
prepareIdleUpdate();
|
||||||
|
int count = read(fd,
|
||||||
|
bc->receiverBuffer.data,
|
||||||
|
bc->receiverBuffer.size);
|
||||||
|
if (count >= 0)
|
||||||
|
bc->receiverBuffer.end += count;
|
||||||
|
else {
|
||||||
|
// TODO: what to do if write failed
|
||||||
|
}
|
||||||
|
while (connection->currentState && bc->hasReceiverBufferData()) {
|
||||||
|
connection->update();
|
||||||
|
setWritable();
|
||||||
|
}
|
||||||
|
bc->receiverBuffer.pos = 0;
|
||||||
|
bc->receiverBuffer.end = 0;
|
||||||
|
|
||||||
|
if (!connection->currentState)
|
||||||
|
closeSession();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RFBController::socketWritable() {
|
||||||
|
ASSERT(socket);
|
||||||
|
int fd = socket->socket();
|
||||||
|
BufferedConnection *bc = connection->bufferedConnection;
|
||||||
|
ASSERT((bc->senderBuffer.end - bc->senderBuffer.pos) > 0);
|
||||||
|
// TODO: what to do if fd < 0?
|
||||||
|
prepareIdleUpdate();
|
||||||
|
int count = write(fd,
|
||||||
|
bc->senderBuffer.data + bc->senderBuffer.pos,
|
||||||
|
bc->senderBuffer.end - bc->senderBuffer.pos);
|
||||||
|
if (count >= 0)
|
||||||
|
bc->senderBuffer.pos += count;
|
||||||
|
else {
|
||||||
|
// TODO: what to do if write failed
|
||||||
|
}
|
||||||
|
setWritable();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RFBController::closeSession() {
|
||||||
|
if (!connection)
|
||||||
|
return;
|
||||||
|
delete connection;
|
||||||
|
delete socket;
|
||||||
|
connection = 0;
|
||||||
|
socket = 0;
|
||||||
|
emit sessionFinished();
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RFBController::socketClosed() {
|
||||||
|
closeSession();
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "rfbcontroller.moc"
|
||||||
76
krfb/rfbcontroller.h
Normal file
76
krfb/rfbcontroller.h
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
rfbcontroller.h
|
||||||
|
-------------------
|
||||||
|
begin : Sun Dec 9 2001
|
||||||
|
copyright : (C) 2001 by Tim Jansen
|
||||||
|
email : tim@tjansen.de
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* Contains portions & concept from rfb's x0rfbserver.cc
|
||||||
|
* Copyright (C) 2000 heXoNet Support GmbH, D-66424 Homburg.
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* *
|
||||||
|
* This program is free software; you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
|
* (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#ifndef RFBCONTROLLER_H
|
||||||
|
#define RFBCONTROLLER_H
|
||||||
|
|
||||||
|
#include "rfbconnection.h"
|
||||||
|
#include "configuration.h"
|
||||||
|
#include <ksocket.h>
|
||||||
|
#include <kserversocket.h>
|
||||||
|
#include <qobject.h>
|
||||||
|
|
||||||
|
using namespace rfb;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Manages sockets, drives the RGBConnection and triggers the connection
|
||||||
|
* dialog.
|
||||||
|
* The controller has two states: 'waiting for connection' and 'connected'.
|
||||||
|
* In the former serversocket is set and socket and connection are null, in
|
||||||
|
* the latter serversocket is null and socket and connection are set.
|
||||||
|
* @author Tim Jansen
|
||||||
|
*/
|
||||||
|
class RFBController : public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
RFBController(Configuration *c);
|
||||||
|
~RFBController();
|
||||||
|
|
||||||
|
void closeSession();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void rebind();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void sessionEstablished();
|
||||||
|
void sessionFinished();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void start();
|
||||||
|
void checkWritable();
|
||||||
|
void prepareIdleUpdate();
|
||||||
|
|
||||||
|
Configuration *c;
|
||||||
|
KServerSocket *serversocket;
|
||||||
|
KSocket *socket;
|
||||||
|
RFBConnection *connection;
|
||||||
|
bool idleUpdateScheduled;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void idleSlot();
|
||||||
|
void accepted();
|
||||||
|
void socketReadable();
|
||||||
|
void socketWritable();
|
||||||
|
void socketClosed();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user