• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdenetwork API Reference
  • KDE Home
  • Contact Us
 

krfb

  • sources
  • kde-4.14
  • kdenetwork
  • krfb
  • krfb
rfbservermanager.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2009-2010 Collabora Ltd <info@collabora.co.uk>
3  @author George Goldberg <george.goldberg@collabora.co.uk>
4  @author George Kiagiadakis <george.kiagiadakis@collabora.co.uk>
5  Copyright (C) 2007 Alessandro Praduroux <pradu@pradu.it>
6  Copyright (C) 2001-2003 by Tim Jansen <tim@tjansen.de>
7 
8  This program is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public
10  License as published by the Free Software Foundation; either
11  version 2 of the License, or (at your option) any later version.
12 
13  This program is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU Lesser General Public License
19  along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21 #include "rfbservermanager.h"
22 #include "rfbserver.h"
23 #include "framebuffer.h"
24 #include "framebuffermanager.h"
25 #include "sockethelpers.h"
26 #include "krfbconfig.h"
27 #include <QtCore/QTimer>
28 #include <QtGui/QApplication>
29 #include <QtGui/QDesktopWidget>
30 #include <QtNetwork/QHostInfo>
31 #include <KGlobal>
32 #include <KDebug>
33 #include <KLocale>
34 #include <KUser>
35 #include <KNotification>
36 
37 static const char *cur =
38  " "
39  " x "
40  " xx "
41  " xxx "
42  " xxxx "
43  " xxxxx "
44  " xxxxxx "
45  " xxxxxxx "
46  " xxxxxxxx "
47  " xxxxxxxxx "
48  " xxxxxxxxxx "
49  " xxxxx "
50  " xx xxx "
51  " x xxx "
52  " xxx "
53  " xxx "
54  " xxx "
55  " xxx "
56  " ";
57 
58 static const char *mask =
59  "xx "
60  "xxx "
61  "xxxx "
62  "xxxxx "
63  "xxxxxx "
64  "xxxxxxx "
65  "xxxxxxxx "
66  "xxxxxxxxx "
67  "xxxxxxxxxx "
68  "xxxxxxxxxxx "
69  "xxxxxxxxxxxx "
70  "xxxxxxxxxx "
71  "xxxxxxxx "
72  "xxxxxxxx "
73  "xx xxxxx "
74  " xxxxx "
75  " xxxxx "
76  " xxxxx "
77  " xxx ";
78 
79 
80 struct RfbServerManagerStatic
81 {
82  RfbServerManager server;
83 };
84 
85 K_GLOBAL_STATIC(RfbServerManagerStatic, s_instance)
86 
87 RfbServerManager* RfbServerManager::instance()
88 {
89  return &s_instance->server;
90 }
91 
92 
93 struct RfbServerManager::Private
94 {
95  QSharedPointer<FrameBuffer> fb;
96  rfbCursorPtr myCursor;
97  QByteArray desktopName;
98  QTimer rfbUpdateTimer;
99  QSet<RfbServer*> servers;
100  QSet<RfbClient*> clients;
101 };
102 
103 
104 RfbServerManager::RfbServerManager()
105  : QObject(), d(new Private)
106 {
107  init();
108 }
109 
110 RfbServerManager::~RfbServerManager()
111 {
112  delete d;
113 }
114 
115 void RfbServerManager::init()
116 {
117  kDebug();
118 
119  d->fb = FrameBufferManager::instance()->frameBuffer(QApplication::desktop()->winId());
120  d->myCursor = rfbMakeXCursor(19, 19, (char *) cur, (char *) mask);
121  d->myCursor->cleanup = false;
122  d->desktopName = QString("%1@%2 (shared desktop)") //FIXME check if we can use utf8
123  .arg(KUser().loginName(),QHostInfo::localHostName()).toLatin1();
124 
125  connect(&d->rfbUpdateTimer, SIGNAL(timeout()), SLOT(updateScreens()));
126  connect(qApp, SIGNAL(aboutToQuit()), SLOT(cleanup()));
127 }
128 
129 void RfbServerManager::updateScreens()
130 {
131  QList<QRect> rects = d->fb->modifiedTiles();
132  QPoint currentCursorPos = QCursor::pos();
133 
134  Q_FOREACH(RfbServer *server, d->servers) {
135  server->updateScreen(rects);
136  server->updateCursorPosition(currentCursorPos);
137  }
138 
139  //update() might disconnect some of the clients, which will synchronously
140  //call the removeClient() method and will change d->clients, so we need
141  //to copy the set here to avoid problems.
142  QSet<RfbClient*> clients = d->clients;
143  Q_FOREACH(RfbClient *client, clients) {
144  client->update();
145  }
146 }
147 
148 void RfbServerManager::cleanup()
149 {
150  kDebug();
151 
152  //copy because d->servers is going to be modified while we delete the servers
153  QSet<RfbServer*> servers = d->servers;
154  Q_FOREACH(RfbServer *server, servers) {
155  delete server;
156  }
157 
158  Q_ASSERT(d->servers.isEmpty());
159  Q_ASSERT(d->clients.isEmpty());
160 
161  d->myCursor->cleanup = true;
162  rfbFreeCursor(d->myCursor);
163  d->fb.clear();
164 }
165 
166 void RfbServerManager::registerServer(RfbServer* server)
167 {
168  d->servers.insert(server);
169 }
170 
171 void RfbServerManager::unregisterServer(RfbServer* server)
172 {
173  d->servers.remove(server);
174 }
175 
176 rfbScreenInfoPtr RfbServerManager::newScreen()
177 {
178  rfbScreenInfoPtr screen = NULL;
179 
180  if (!d->fb.isNull()) {
181  int w = d->fb->width();
182  int h = d->fb->height();
183  int depth = d->fb->depth();
184  int bpp = depth >> 3;
185 
186  if (bpp != 1 && bpp != 2 && bpp != 4) {
187  bpp = 4;
188  }
189 
190  kDebug() << "bpp: " << bpp;
191 
192  rfbLogEnable(0);
193 
194  screen = rfbGetScreen(0, 0, w, h, 8, 3, bpp);
195  screen->paddedWidthInBytes = d->fb->paddedWidth();
196  d->fb->getServerFormat(screen->serverFormat);
197  screen->frameBuffer = d->fb->data();
198 
199  screen->desktopName = d->desktopName.constData();
200  screen->cursor = d->myCursor;
201  }
202 
203  return screen;
204 }
205 
206 void RfbServerManager::addClient(RfbClient* cc)
207 {
208  if (d->clients.size() == 0) {
209  kDebug() << "Starting framebuffer monitor";
210  d->fb->startMonitor();
211  d->rfbUpdateTimer.start(50);
212  }
213  d->clients.insert(cc);
214 
215  KNotification::event("UserAcceptsConnection",
216  i18n("The remote user %1 is now connected.", cc->name()));
217 
218  Q_EMIT clientConnected(cc);
219 }
220 
221 void RfbServerManager::removeClient(RfbClient* cc)
222 {
223  d->clients.remove(cc);
224  if (d->clients.size() == 0) {
225  kDebug() << "Stopping framebuffer monitor";
226  d->fb->stopMonitor();
227  d->rfbUpdateTimer.stop();
228  }
229 
230  KNotification::event("ConnectionClosed", i18n("The remote user %1 disconnected.", cc->name()));
231 
232  Q_EMIT clientDisconnected(cc);
233 }
234 
235 #include "rfbservermanager.moc"
_rfbScreenInfo::paddedWidthInBytes
int paddedWidthInBytes
Definition: libvncserver/rfb/rfb.h:233
FrameBufferManager::frameBuffer
QSharedPointer< FrameBuffer > frameBuffer(WId id)
Definition: framebuffermanager.cpp:90
framebuffer.h
RfbServer
Definition: rfbserver.h:27
mask
static const char * mask
Definition: rfbservermanager.cpp:58
rfbMakeXCursor
rfbCursorPtr rfbMakeXCursor(int width, int height, char *cursorString, char *maskString)
rfbserver.h
RfbServerManager::clientConnected
void clientConnected(RfbClient *cc)
QByteArray
RfbServer::updateScreen
void updateScreen(const QList< QRect > &modifiedTiles)
Definition: rfbserver.cpp:158
QPoint
framebuffermanager.h
_rfbScreenInfo::desktopName
const char * desktopName
Definition: libvncserver/rfb/rfb.h:253
QTimer
QSharedPointer< FrameBuffer >
krfbconfig.h
RfbServerManager
Definition: rfbservermanager.h:30
QObject
RfbServerManager::clientDisconnected
void clientDisconnected(RfbClient *cc)
FrameBufferManager::instance
static FrameBufferManager * instance()
Definition: framebuffermanager.cpp:52
QSet< RfbServer * >
QString
QList< QRect >
_rfbScreenInfo
Per-screen (framebuffer) structure.
Definition: libvncserver/rfb/rfb.h:226
RfbClient
Definition: krfb/rfbclient.h:26
QString::toLatin1
QByteArray toLatin1() const
QCursor::pos
QPoint pos()
_rfbScreenInfo::cursor
struct rfbCursor * cursor
Definition: libvncserver/rfb/rfb.h:312
rfbLogEnable
void rfbLogEnable(int enabled)
rfbFreeCursor
void rfbFreeCursor(rfbCursorPtr cursor)
QApplication::desktop
QDesktopWidget * desktop()
_rfbScreenInfo::serverFormat
rfbPixelFormat serverFormat
Definition: libvncserver/rfb/rfb.h:251
_rfbScreenInfo::frameBuffer
char * frameBuffer
the frameBuffer has to be supplied by the serving process.
Definition: libvncserver/rfb/rfb.h:318
RfbClient::name
virtual QString name() const
Returns a name for the client, to be shown to the user.
Definition: rfbclient.cpp:61
QHostInfo::localHostName
QString localHostName()
rfbGetScreen
rfbScreenInfoPtr rfbGetScreen(int *argc, char **argv, int width, int height, int bitsPerSample, int samplesPerPixel, int bytesPerPixel)
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
rfbservermanager.h
rfbCursor
Definition: libvncserver/rfb/rfb.h:819
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
cur
static const char * cur
Definition: rfbservermanager.cpp:37
sockethelpers.h
RfbServer::updateCursorPosition
void updateCursorPosition(const QPoint &position)
Definition: rfbserver.cpp:200
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:29:40 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

krfb

Skip menu "krfb"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules
  • Related Pages

kdenetwork API Reference

Skip menu "kdenetwork API Reference"
  • kget
  • kopete
  •   kopete
  •   libkopete
  • krdc
  • krfb

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal