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

krfb

  • sources
  • kde-4.12
  • kdenetwork
  • krfb
  • krfb
tubesrfbserver.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2009-2011 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 
6  This program is free software; you can redistribute it and/or
7  modify it under the terms of the GNU General Public
8  License as published by the Free Software Foundation; either
9  version 2 of the License, or (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  General Public License for more details.
15 
16  You should have received a copy of the GNU Lesser General Public License
17  along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19 #include "tubesrfbserver.h"
20 #include "tubesrfbclient.h"
21 #include "sockethelpers.h"
22 
23 #include <KDebug>
24 #include <KRandom>
25 
26 #include <TelepathyQt/Debug>
27 #include <TelepathyQt/Contact>
28 #include <TelepathyQt/AccountFactory>
29 #include <TelepathyQt/ConnectionFactory>
30 #include <TelepathyQt/ContactFactory>
31 #include <TelepathyQt/ChannelFactory>
32 #include <TelepathyQt/OutgoingStreamTubeChannel>
33 #include <TelepathyQt/StreamTubeServer>
34 
35 
36 struct TubesRfbServer::Private
37 {
38  Tp::StreamTubeServerPtr stubeServer;
39  QHash<quint16, Tp::ContactPtr> contactsPerPort;
40  QHash<quint16, PendingTubesRfbClient*> clientsPerPort;
41 };
42 
43 void TubesRfbServer::init()
44 {
45  new TubesRfbServer();
46  //RfbServerManager takes care of deletion
47 }
48 
49 TubesRfbServer::TubesRfbServer(QObject *parent)
50  : RfbServer(parent), d(new Private)
51 {
52  kDebug() << "starting";
53 
54  Tp::enableDebug(true);
55  Tp::enableWarnings(true);
56  Tp::registerTypes();
57 
58  Tp::AccountFactoryPtr accountFactory = Tp::AccountFactory::create(
59  QDBusConnection::sessionBus(), Tp::Account::FeatureCore);
60 
61  Tp::ConnectionFactoryPtr connectionFactory = Tp::ConnectionFactory::create(
62  QDBusConnection::sessionBus(), Tp::Connection::FeatureCore);
63 
64  Tp::ChannelFactoryPtr channelFactory = Tp::ChannelFactory::create(
65  QDBusConnection::sessionBus());
66 
67  Tp::ContactFactoryPtr contactFactory = Tp::ContactFactory::create(
68  Tp::Contact::FeatureAlias);
69 
70  d->stubeServer = Tp::StreamTubeServer::create(
71  QStringList() << QLatin1String("rfb"),
72  QStringList(),
73  QLatin1String("krfb_rfb_handler"),
74  true,
75  accountFactory,
76  connectionFactory,
77  channelFactory,
78  contactFactory);
79 
80  connect(d->stubeServer.data(),
81  SIGNAL(tubeRequested(Tp::AccountPtr,Tp::OutgoingStreamTubeChannelPtr,
82  QDateTime,Tp::ChannelRequestHints)),
83  SLOT(onTubeRequested()));
84  connect(d->stubeServer.data(),
85  SIGNAL(tubeClosed(Tp::AccountPtr,Tp::OutgoingStreamTubeChannelPtr,QString,QString)),
86  SLOT(onTubeClosed()));
87 
88  connect(d->stubeServer.data(),
89  SIGNAL(newTcpConnection(QHostAddress,quint16,Tp::AccountPtr,
90  Tp::ContactPtr,Tp::OutgoingStreamTubeChannelPtr)),
91  SLOT(onNewTcpConnection(QHostAddress,quint16,Tp::AccountPtr,
92  Tp::ContactPtr,Tp::OutgoingStreamTubeChannelPtr)));
93  connect(d->stubeServer.data(),
94  SIGNAL(tcpConnectionClosed(QHostAddress,quint16,Tp::AccountPtr,Tp::ContactPtr,
95  QString,QString,Tp::OutgoingStreamTubeChannelPtr)),
96  SLOT(onTcpConnectionClosed(QHostAddress,quint16,Tp::AccountPtr,Tp::ContactPtr,
97  QString,QString,Tp::OutgoingStreamTubeChannelPtr)));
98 
99  // Pick a random port in the private range (49152–65535)
100  setListeningPort((KRandom::random() % 16383) + 49152);
101  // Listen only on the loopback network interface
102  setListeningAddress("127.0.0.1");
103  setPasswordRequired(false);
104 
105  QTimer::singleShot(0, this, SLOT(startAndCheck()));
106 }
107 
108 TubesRfbServer::~TubesRfbServer()
109 {
110  kDebug();
111  delete d;
112 }
113 
114 void TubesRfbServer::startAndCheck()
115 {
116  if (!start()) {
117  //try a few times with different ports
118  bool ok = false;
119  for (int i=0; !ok && i<5; i++) {
120  setListeningPort((KRandom::random() % 16383) + 49152);
121  ok = start();
122  }
123 
124  if (!ok) {
125  kError() << "Failed to start tubes rfb server";
126  return;
127  }
128  }
129 
130  //TODO listeningAddress() should be a QHostAddress
131  d->stubeServer->exportTcpSocket(QHostAddress(QString::fromAscii(listeningAddress())),
132  listeningPort());
133 }
134 
135 void TubesRfbServer::onTubeRequested()
136 {
137  kDebug() << "Got a tube";
138 }
139 
140 void TubesRfbServer::onTubeClosed()
141 {
142  kDebug() << "tube closed";
143 }
144 
145 void TubesRfbServer::onNewTcpConnection(const QHostAddress & sourceAddress,
146  quint16 sourcePort,
147  const Tp::AccountPtr & account,
148  const Tp::ContactPtr & contact,
149  const Tp::OutgoingStreamTubeChannelPtr & tube)
150 {
151  Q_UNUSED(account);
152  Q_UNUSED(tube);
153 
154  kDebug() << "CM signaled tube connection from" << sourceAddress << ":" << sourcePort;
155 
156  d->contactsPerPort[sourcePort] = contact;
157  if (d->clientsPerPort.contains(sourcePort)) {
158  kDebug() << "client already exists";
159  d->clientsPerPort[sourcePort]->setContact(contact);
160  }
161 }
162 
163 void TubesRfbServer::onTcpConnectionClosed(const QHostAddress& sourceAddress,
164  quint16 sourcePort,
165  const Tp::AccountPtr& account,
166  const Tp::ContactPtr& contact,
167  const QString& error,
168  const QString& message,
169  const Tp::OutgoingStreamTubeChannelPtr& tube)
170 {
171  Q_UNUSED(account);
172  Q_UNUSED(contact);
173  Q_UNUSED(tube);
174 
175  kDebug() << "Connection from" << sourceAddress << ":" << sourcePort << "closed."
176  << error << message;
177 
178  d->clientsPerPort.remove(sourcePort);
179  d->contactsPerPort.remove(sourcePort);
180 }
181 
182 PendingRfbClient* TubesRfbServer::newClient(rfbClientPtr client)
183 {
184  PendingTubesRfbClient *c = new PendingTubesRfbClient(client, this);
185  quint16 port = peerPort(client->sock);
186 
187  kDebug() << "new tube client on port" << port;
188 
189  d->clientsPerPort[port] = c;
190  if (d->contactsPerPort.contains(port)) {
191  kDebug() << "already have a contact";
192  c->setContact(d->contactsPerPort[port]);
193  }
194 
195  return c;
196 }
197 
198 #include "tubesrfbserver.moc"
RfbServer
Definition: rfbserver.h:27
RfbServer::setListeningPort
void setListeningPort(int port)
Definition: rfbserver.cpp:77
peerPort
unsigned short peerPort(int sock)
Definition: sockethelpers.cpp:54
QObject
_rfbClientRec::sock
SOCKET sock
Definition: libvncserver/rfb/rfb.h:437
_rfbClientRec
Definition: libvncserver/rfb/rfb.h:417
TubesRfbServer::newClient
virtual PendingRfbClient * newClient(rfbClientPtr client)
Definition: tubesrfbserver.cpp:182
RfbServer::listeningPort
int listeningPort() const
Definition: rfbserver.cpp:62
tubesrfbclient.h
RfbServer::start
bool start()
Definition: rfbserver.cpp:87
RfbServer::setPasswordRequired
void setPasswordRequired(bool passwordRequired)
Definition: rfbserver.cpp:82
TubesRfbServer::~TubesRfbServer
virtual ~TubesRfbServer()
Definition: tubesrfbserver.cpp:108
tubesrfbserver.h
TubesRfbServer::init
static void init()
Definition: tubesrfbserver.cpp:43
RfbServer::setListeningAddress
void setListeningAddress(const QByteArray &address)
Definition: rfbserver.cpp:72
PendingRfbClient
Definition: pendingrfbclient.h:24
TubesRfbServer::TubesRfbServer
TubesRfbServer(QObject *parent=0)
Definition: tubesrfbserver.cpp:49
PendingTubesRfbClient::setContact
void setContact(const Tp::ContactPtr &contact)
Definition: tubesrfbclient.cpp:31
RfbServer::listeningAddress
QByteArray listeningAddress() const
Definition: rfbserver.cpp:57
sockethelpers.h
PendingTubesRfbClient
Definition: tubesrfbclient.h:37
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:54:10 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
  • 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