1
0
mirror of https://github.com/KDE/krfb synced 2026-07-01 15:51:18 -07:00

Compare commits

...

338 Commits

Author SHA1 Message Date
Script Kiddy
b1101ff3cb SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=957599
2009-04-22 15:13:49 +00:00
Christoph Feck
4933c61d2a SVN_SILENT Cleanup .ui files
This removes (as discussed on k-c-d)
* obsolete <pixmapfunction>
* deprecated <layoutdefault>
* empty <author>, <comment>, <exportmacro>


svn path=/trunk/KDE/kdenetwork/krfb/; revision=957382
2009-04-21 21:59:58 +00:00
Script Kiddy
5f91e53004 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=955786
2009-04-18 14:40:58 +00:00
Laurent Montel
e99a257a41 Fix crash when interface return empty list
svn path=/trunk/KDE/kdenetwork/krfb/; revision=940747
2009-03-18 08:34:42 +00:00
George Kiagiadakis
383e6cef4c Add an option to hide the invitations management dialog at startup.
Some advanced users may not like r877454.
BUG: 187143

svn path=/trunk/KDE/kdenetwork/krfb/; revision=939310
2009-03-14 16:03:50 +00:00
Laurent Montel
03b494aa1a not necessary
svn path=/trunk/KDE/kdenetwork/krfb/; revision=938584
2009-03-12 12:24:54 +00:00
Andrew Coles
04e5768db5 Proof-reading.
svn path=/trunk/KDE/kdenetwork/krfb/; revision=936908
2009-03-08 16:27:30 +00:00
Script Kiddy
173a43f3d2 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=936845
2009-03-08 14:42:17 +00:00
Script Kiddy
366c99e7ec SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=935174
2009-03-04 15:52:01 +00:00
Script Kiddy
c540fa79a7 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=917794
2009-01-28 15:07:38 +00:00
Nick Shaforostoff
42d395da7d add fine-grained categories in (compliance with xdg menu spec)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=915866
2009-01-24 01:00:48 +00:00
Script Kiddy
44a3596ade SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=903845
2008-12-31 14:36:39 +00:00
Allen Winter
a7517c6444 add nice logging messages for missing X11 XTest
svn path=/trunk/KDE/kdenetwork/krfb/; revision=897377
2008-12-15 21:58:23 +00:00
Script Kiddy
be2e9e1671 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=895335
2008-12-10 13:49:18 +00:00
Script Kiddy
9879f90714 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=893869
2008-12-07 13:52:21 +00:00
Script Kiddy
199514dcb0 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=883252
2008-11-12 13:45:49 +00:00
George Kiagiadakis
b874281010 Show the ManageInvitationsDialog on startup, so that users are not confused
by the absence of a main window.
BUG: 167953


svn path=/trunk/KDE/kdenetwork/krfb/; revision=877454
2008-10-29 15:29:15 +00:00
George Kiagiadakis
7216c5e59c Integrate the rfb event system with qt's event loop instead of running a custom event loop in KrfbServer.
This fixes the major problem that modal dialogs were closing immediately after they were shown,
which caused huge usability issues.
BUG: 167955


svn path=/trunk/KDE/kdenetwork/krfb/; revision=877254
2008-10-28 23:58:35 +00:00
Script Kiddy
e3a3993b96 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=874351
2008-10-21 11:50:21 +00:00
Script Kiddy
de016de12d SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=871263
2008-10-14 11:16:22 +00:00
Laurent Montel
55a40ee55a Fix mem leak
svn path=/trunk/KDE/kdenetwork/krfb/; revision=843076
2008-08-06 11:41:57 +00:00
Script Kiddy
5ff4f3d0f9 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=843051
2008-08-06 11:16:39 +00:00
Script Kiddy
b84107555e SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=839177
2008-07-29 13:28:13 +00:00
Jakub Stachowski
dc2c6f0db7 Remove SLP bits from buildsystem. Code itself was removed long ago anyway.
svn path=/trunk/KDE/kdenetwork/krfb/; revision=826942
2008-07-01 20:45:46 +00:00
Laurent Montel
c7fda197fd Translate
svn path=/trunk/KDE/kdenetwork/krfb/; revision=822166
2008-06-19 11:31:52 +00:00
Script Kiddy
9e372bc6b5 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=817871
2008-06-06 21:50:23 +00:00
Script Kiddy
b3be22f5aa SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=817023
2008-06-05 02:26:24 +00:00
Script Kiddy
e76e391c4f SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=815784
2008-06-02 15:16:19 +00:00
Script Kiddy
1eb1b7a053 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=814787
2008-05-31 09:43:22 +00:00
Laurent Montel
32769b41e5 Use INSTALL_TARGETS_DEFAULT_ARGS
svn path=/trunk/KDE/kdenetwork/krfb/; revision=813293
2008-05-27 11:14:39 +00:00
Script Kiddy
d551495469 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=808732
2008-05-17 12:48:23 +00:00
Script Kiddy
0e39f8c09e SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=803891
2008-05-04 12:28:40 +00:00
Friedrich W. H. Kossebau
9befaf6f6a removed unnessecary explicit setting of the application icon
svn path=/trunk/KDE/kdenetwork/krfb/; revision=799270
2008-04-20 22:50:58 +00:00
Script Kiddy
e5326e218f SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=788508
2008-03-21 17:48:42 +00:00
Script Kiddy
fe5e724bd1 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=784312
2008-03-10 22:15:23 +00:00
Urs Wolfer
74fe120ea8 Fix typo. Patch by crazy.
BUG:155173

svn path=/trunk/KDE/kdenetwork/krfb/; revision=783749
2008-03-09 14:11:27 +00:00
Script Kiddy
80d794873c SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=780677
2008-02-29 19:02:40 +00:00
Script Kiddy
bef509ac05 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=779685
2008-02-26 19:55:06 +00:00
Script Kiddy
b17a0b5815 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=774942
2008-02-14 13:05:43 +00:00
Script Kiddy
2709312471 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=774170
2008-02-12 16:55:33 +00:00
Albert Astals Cid
a6f727d990 microoptimization
const & in foreach

svn path=/trunk/KDE/kdenetwork/krfb/; revision=772847
2008-02-09 15:56:10 +00:00
Script Kiddy
d641dc702b SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=771196
2008-02-05 13:33:12 +00:00
Script Kiddy
ad824b9b80 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=767678
2008-01-28 14:23:45 +00:00
Script Kiddy
35d083a674 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=765168
2008-01-23 11:39:45 +00:00
Script Kiddy
d571aaf062 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=764654
2008-01-22 10:07:15 +00:00
Urs Wolfer
af216dabe1 * fix help buttons
* fix some strings
* do not set the main dialog modal; that will cause trouble for example with about and quit dialog sometimes

svn path=/trunk/KDE/kdenetwork/krfb/; revision=762755
2008-01-17 20:17:01 +00:00
Laurent Montel
ce4d5c60ee Fix help button
svn path=/trunk/KDE/kdenetwork/krfb/; revision=760517
2008-01-12 21:14:03 +00:00
Script Kiddy
5a04b9ef09 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=760329
2008-01-12 12:20:38 +00:00
Script Kiddy
073257304d SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=758824
2008-01-09 10:39:07 +00:00
Urs Wolfer
01eab2a02f Krazy fixes
svn path=/trunk/KDE/kdenetwork/krfb/; revision=758702
2008-01-08 21:14:52 +00:00
Urs Wolfer
b77d07c08d this should work again...(old one did not anymore)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=757767
2008-01-05 21:14:07 +00:00
Urs Wolfer
0fb20dfff0 Fix: Make quit working when krfb has been started from menu
Fix icons.
Patch by crazy.

svn path=/trunk/KDE/kdenetwork/krfb/; revision=757206
2008-01-04 13:14:35 +00:00
Script Kiddy
a9ff5ffc8b SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=757117
2008-01-04 08:42:10 +00:00
Script Kiddy
d30bdd7404 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=756425
2008-01-03 08:35:06 +00:00
Script Kiddy
9cafe806a4 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=755853
2008-01-02 08:28:53 +00:00
Jakob Petsovits
6fdad54a7a Icon naming spec compliance (code changes - KDE/):
network -> network-workgroup, or whatever fits best.
Plus some other icon name fixes.

svn path=/trunk/KDE/kdenetwork/krfb/; revision=754310
2007-12-29 14:44:22 +00:00
Script Kiddy
0432b60d4f SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=754157
2007-12-29 08:22:18 +00:00
Script Kiddy
9beb3ac122 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=752704
2007-12-25 08:11:26 +00:00
Script Kiddy
aad4a17674 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=751147
2007-12-21 07:56:46 +00:00
Script Kiddy
78fd984dd8 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=750406
2007-12-19 08:09:37 +00:00
Script Kiddy
77dfcd28d8 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=747948
2007-12-13 08:04:25 +00:00
Script Kiddy
9ba02362f7 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=743875
2007-12-02 08:05:56 +00:00
Script Kiddy
376357337c SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=743233
2007-11-30 07:56:37 +00:00
Script Kiddy
a5be8fc33b SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=742560
2007-11-28 07:46:42 +00:00
Script Kiddy
2cbb930877 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=742121
2007-11-27 07:46:56 +00:00
Giovanni Venturi
7e41e3c244 fixed compiling, thanks to Laurent and David
CCMAIL:faure@kde.org,montel@kde.org

svn path=/trunk/KDE/kdenetwork/krfb/; revision=741971
2007-11-26 20:59:39 +00:00
Script Kiddy
c021cd6d42 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=741705
2007-11-26 08:06:14 +00:00
Script Kiddy
d2f1a0e3f8 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=741243
2007-11-25 07:48:46 +00:00
Script Kiddy
2e13247d25 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=738181
2007-11-18 07:52:37 +00:00
Laurent Montel
21d8285fb9 Remove "endl;" not necessary now
svn path=/trunk/KDE/kdenetwork/krfb/; revision=737505
2007-11-16 12:01:49 +00:00
Allen Winter
924a4af066 various fixes:
- replace DocPath with X-DocPath
 - replace Keywords with X-KDE-Keywords
 - replace ServicesTypes with X-KDE-ServiceTypes
 - remove deprecated Encoding
 - minor stuff

svn path=/trunk/KDE/kdenetwork/krfb/; revision=737252
2007-11-15 21:40:29 +00:00
Script Kiddy
ad0d5f8a9f SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=735600
2007-11-12 08:08:54 +00:00
Dirk Mueller
6061ed71fd fix FSF address
svn path=/trunk/KDE/kdenetwork/krfb/; revision=734468
2007-11-08 22:49:41 +00:00
Urs Wolfer
24edd4302d Relicense GPLv2 only code to GPLv2+.
All these files have been added to SVN by Alessandro Praduroux. He agreed on this change.

CCMAIL: pradu@pradu.it

svn path=/trunk/KDE/kdenetwork/krfb/; revision=734376
2007-11-08 18:50:58 +00:00
Script Kiddy
d54df82b05 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=733797
2007-11-07 07:59:50 +00:00
David Faure
d045784353 Ported to KPluginFactory -- and then realized it was disabled from compilation...
svn path=/trunk/KDE/kdenetwork/krfb/; revision=733078
2007-11-05 12:37:48 +00:00
Dirk Mueller
279324047a only increase the reference counter if it is zero? That
doesn't make sense. a counter is a counter, not a boolean.

svn path=/trunk/KDE/kdenetwork/krfb/; revision=731746
2007-11-01 19:27:53 +00:00
Script Kiddy
f2fed6edcf SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=730930
2007-10-30 07:54:29 +00:00
Pino Toscano
cd6d5722ef icon renamings:
- encrypted -> security-high/document-encrypt
- decrypted -> security-low/document-decrypt
- halfencrypted -> security-medium

svn path=/trunk/KDE/kdenetwork/krfb/; revision=728147
2007-10-22 14:52:36 +00:00
David Faure
b790fb3b93 Test for it before linking to it
svn path=/trunk/KDE/kdenetwork/krfb/; revision=728112
2007-10-22 12:43:43 +00:00
Script Kiddy
394ca0ed8c SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=727590
2007-10-21 06:13:10 +00:00
Script Kiddy
9dd7c3ba49 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=726888
2007-10-19 06:34:10 +00:00
Script Kiddy
0acc8b0a6b SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=725779
2007-10-16 06:15:53 +00:00
David Faure
bf3dfe5887 kcmshell renamed to kcmshell4 to fix co-installability between kdelibs3 and kdebase4-runtime
svn path=/trunk/KDE/kdenetwork/krfb/; revision=725652
2007-10-15 22:24:08 +00:00
Script Kiddy
51b7cc67ed SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=722867
2007-10-08 06:41:29 +00:00
Script Kiddy
47cc317131 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=722374
2007-10-07 07:08:53 +00:00
Andreas Pakulat
f7b1527fb8 Fix includes
svn path=/trunk/KDE/kdenetwork/krfb/; revision=721980
2007-10-06 11:40:58 +00:00
Pino Toscano
54f664ea8f needed includes
svn path=/trunk/KDE/kdenetwork/krfb/; revision=721969
2007-10-06 11:26:27 +00:00
Script Kiddy
ba0437cbea SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=720542
2007-10-03 06:40:38 +00:00
Script Kiddy
6c728b9633 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=719471
2007-10-01 06:26:12 +00:00
Script Kiddy
7c6186ed2f SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=719028
2007-09-30 06:19:16 +00:00
Dirk Mueller
3ff2c20690 don't pass port as an integer to i18n, it will call KLocale localisation
on it, which breaks havoc. novell bug 325543.

svn path=/trunk/KDE/kdenetwork/krfb/; revision=718332
2007-09-28 13:31:59 +00:00
Script Kiddy
043d610833 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=718164
2007-09-28 06:45:03 +00:00
Script Kiddy
f7d1f89ea9 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=717661
2007-09-27 09:34:18 +00:00
Script Kiddy
45cf2161b5 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=716134
2007-09-24 05:47:43 +00:00
Urs Wolfer
5571224cca Fix two issues reported by Dirk:
* don't crash after deleting the first invitation in the list if there are more than one
* be able to connect to the VNC server right after the invitation has been created; don't wait until the dialog has been closed

svn path=/trunk/KDE/kdenetwork/krfb/; revision=715692
2007-09-22 22:34:39 +00:00
Laurent Montel
882bb7dc0b Fix ui files
svn path=/trunk/KDE/kdenetwork/krfb/; revision=715073
2007-09-21 07:30:03 +00:00
Script Kiddy
379acfaec3 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=713873
2007-09-18 06:23:39 +00:00
Dirk Mueller
ddc5ef5d1d don't write the password to the syslog!
svn path=/trunk/KDE/kdenetwork/krfb/; revision=713404
2007-09-17 12:22:42 +00:00
Dirk Mueller
fdd4ea25f8 don't crash on exit all the time
svn path=/trunk/KDE/kdenetwork/krfb/; revision=713403
2007-09-17 12:20:03 +00:00
Script Kiddy
0e8fbe34ab SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=713329
2007-09-17 05:48:38 +00:00
Urs Wolfer
d11198cbd4 port away from KDE3 support: K3StaticDeleter -> K_GLOBAL_STATIC. Krfb is now KDE3 support free again.
svn path=/trunk/KDE/kdenetwork/krfb/; revision=712838
2007-09-15 13:11:12 +00:00
Mickael Marchand
4e3efb7760 compile
svn path=/trunk/KDE/kdenetwork/krfb/; revision=710005
2007-09-08 21:02:57 +00:00
Pino Toscano
0ca62a4705 DocPath -> X-DocPath for .desktop of type Application
svn path=/trunk/KDE/kdenetwork/krfb/; revision=709118
2007-09-06 15:37:56 +00:00
Dirk Mueller
ed7d58d8dc KStaticDeleter -> K3StaticDeleter
svn path=/trunk/KDE/kdenetwork/krfb/; revision=706314
2007-08-29 22:36:51 +00:00
Matthias Kretz
1b1a07fdc4 KDE3_SUPPORT for KCModules and K3StaticDeleter + link to libkde3support for krfb
svn path=/trunk/KDE/kdenetwork/krfb/; revision=705634
2007-08-28 08:16:15 +00:00
Script Kiddy
84160b9b6e SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=705079
2007-08-27 06:10:11 +00:00
Script Kiddy
a4b7c1d852 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=702205
2007-08-20 07:39:22 +00:00
Laurent Montel
033e5453f2 Use an uniq macro to create/install doc
svn path=/trunk/KDE/kdenetwork/doc/krfb/; revision=702124
2007-08-20 06:32:53 +00:00
Script Kiddy
956a22ae9c SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=701740
2007-08-19 06:12:59 +00:00
Laurent Montel
e55a29888e Adapt to new cmake macro
svn path=/trunk/KDE/kdenetwork/doc/krfb/; revision=699457
2007-08-13 06:25:24 +00:00
Rafael Fernández López
1404f0bf3c Fix .desktop entries and code where needed related to revision change 699388
svn path=/trunk/KDE/kdenetwork/krfb/; revision=699394
2007-08-12 22:10:16 +00:00
Stephan Binner
2f1c8fa8bd i18n style guide fixes
svn path=/trunk/KDE/kdenetwork/krfb/; revision=699178
2007-08-12 07:21:58 +00:00
Laurent Montel
1e5cc5662f Fix extract message
svn path=/trunk/KDE/kdenetwork/krfb/; revision=698716
2007-08-10 20:11:51 +00:00
Pino Toscano
a9988c4a61 fixuifiles
svn path=/trunk/KDE/kdenetwork/krfb/; revision=696264
2007-08-04 11:23:12 +00:00
Urs Wolfer
a1a2c1bb38 * Use everywhere the nice new oxygen artwork.
* Cleanup and improve some code.
* Fix some UI layouts.

svn path=/trunk/KDE/kdenetwork/krfb/; revision=696140
2007-08-03 22:49:22 +00:00
Laurent Montel
9a8d94d26b Adapt to new KWarning/kFatal/kDebug api
svn path=/trunk/KDE/kdenetwork/krfb/; revision=695881
2007-08-03 07:19:24 +00:00
Script Kiddy
0ec1666748 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=694583
2007-07-31 05:36:58 +00:00
Richard Johnson
616f5e2776 BUG:134948
Thanks Sander for the patch.

svn path=/trunk/KDE/kdenetwork/doc/krfb/; revision=693725
2007-07-28 20:21:47 +00:00
Urs Wolfer
09c31cd387 * fix crash in PersonalInviteDialog
* fix all krazy issues (exclude not used folder from krazy checks)

svn path=/trunk/KDE/kdenetwork/krfb/; revision=691982
2007-07-24 19:31:30 +00:00
Laurent Montel
345afdd423 change XDG_APPS_DIR -> XDG_APPS_INSTALL_DIR, XDG_DIRECTORY_DIR->XDG_DIRECTORY_INSTALL_DIR, DBUS_INTERFACES_DIR->DBUS_INTERFACES_INSTALL_ DIR, DBUS_SERVICES_DIR->DBUS_SERVICES_INSTALL_DIR to have same naming convention as discussed with Alex.
svn path=/trunk/KDE/kdenetwork/krfb/; revision=691226
2007-07-23 07:07:44 +00:00
Allen Winter
3dddc13164 remove kde4_automoc()
svn path=/trunk/KDE/kdenetwork/krfb/; revision=686208
2007-07-10 20:21:21 +00:00
Laurent Montel
2f10504666 Now dcop is dead
svn path=/trunk/KDE/kdenetwork/krfb/; revision=686104
2007-07-10 17:49:44 +00:00
Urs Wolfer
467d74df80 remove kde4_automoc()
Thanks Stefan Nikolaus for the nice 'script'.

svn path=/trunk/KDE/kdenetwork/krfb/; revision=685985
2007-07-10 09:15:45 +00:00
Script Kiddy
91513e82f5 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=685145
2007-07-08 04:45:18 +00:00
Script Kiddy
3088d3f418 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=684086
2007-07-06 05:08:40 +00:00
Chusslove Illich
040f4de26a Auto-conversion to new KCmdLineArgs/KAboutData/KComponentData API (trunk/KDE). Watch for the few remaining QString to QByteArray assignments that will not compile without extra specification (typically needs .toLocal8Bit() or .toUtf8()).
svn path=/trunk/KDE/kdenetwork/krfb/; revision=682260
2007-07-02 08:52:55 +00:00
Script Kiddy
495e6e4df3 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=681737
2007-06-30 04:35:43 +00:00
Pino Toscano
5d317a1a5e - add the Encoding key where missing
- end the lists with the separator

svn path=/trunk/KDE/kdenetwork/krfb/; revision=676264
2007-06-16 13:26:33 +00:00
Script Kiddy
8373bed91d SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=676136
2007-06-16 05:24:39 +00:00
Laurent Montel
36967e26ae Remove not necessary "class classname;"
svn path=/trunk/KDE/kdenetwork/krfb/; revision=671258
2007-06-04 10:29:37 +00:00
Nicolas Lécureuil
1499de61e8 Forward port of Helio and Boiko concerning Categories on Desktop files
CCMAIL: boiko@mandriva.com

svn path=/trunk/KDE/kdenetwork/krfb/; revision=669772
2007-05-30 11:15:04 +00:00
Script Kiddy
f97cf472bf SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=669349
2007-05-29 05:16:38 +00:00
Alessandro Praduroux
b0da7c0ce0 removed unused dependency on QT3 support and KIO
svn path=/trunk/KDE/kdenetwork/krfb/; revision=665042
2007-05-15 16:45:27 +00:00
Laurent Montel
fed4fc82fa Link
svn path=/trunk/KDE/kdenetwork/krfb/; revision=664926
2007-05-15 07:27:38 +00:00
Script Kiddy
4cd8a24c14 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=664091
2007-05-13 06:02:42 +00:00
Alessandro Praduroux
c5a3a89721 - email invitation now working
- determine the peer address when we get a new connection
- use the configured port from kconfig insteand of the fixed :5900 value in 
  personal invitation dialog


svn path=/trunk/KDE/kdenetwork/krfb/; revision=662656
2007-05-08 20:37:36 +00:00
Laurent Montel
a09868a7be Fix compile with enable final
svn path=/trunk/KDE/kdenetwork/krfb/; revision=662203
2007-05-07 16:25:58 +00:00
Marcus Hufgard
f49be4ebf5 #added include X11/keysym.h
svn path=/trunk/KDE/kdenetwork/krfb/; revision=662066
2007-05-07 12:20:19 +00:00
Alessandro Praduroux
ac0a5e8240 correctly set announced desktop name
svn path=/trunk/KDE/kdenetwork/krfb/; revision=660813
2007-05-03 20:55:41 +00:00
Urs Wolfer
4590552394 ability to generate API docs in kdenetwork
svn path=/trunk/KDE/kdenetwork/krfb/; revision=658860
2007-04-28 17:16:20 +00:00
Christian Ehrlicher
237de1114d compile++
svn path=/trunk/KDE/kdenetwork/krfb/; revision=656823
2007-04-22 12:58:29 +00:00
Pino Toscano
64adae5bee qtooltip.h is needed
svn path=/trunk/KDE/kdenetwork/krfb/; revision=656790
2007-04-22 11:30:19 +00:00
Laurent Montel
7d9645c389 Remove not necessary include
svn path=/trunk/KDE/kdenetwork/krfb/; revision=656757
2007-04-22 10:15:21 +00:00
Laurent Montel
77dc9c5560 Remove not necessary include
svn path=/trunk/KDE/kdenetwork/krfb/; revision=656734
2007-04-22 08:42:25 +00:00
Urs Wolfer
ed0efd6c64 does not need DQT3_SUPPORT
svn path=/trunk/KDE/kdenetwork/krfb/; revision=656478
2007-04-21 14:06:31 +00:00
Pino Toscano
949e814f55 move the QT3_SUPPORT definition where needed
svn path=/trunk/KDE/kdenetwork/krfb/; revision=656468
2007-04-21 13:41:55 +00:00
Alessandro Praduroux
f36b9aca9b - finished invitation dialog (delete and deleteall now work)
- some cleanup on the trayicon code
- fixed crash on exit
- dnssd support 

svn path=/trunk/KDE/kdenetwork/krfb/; revision=655612
2007-04-18 21:42:12 +00:00
Laurent Montel
fc4be7c478 add include
svn path=/trunk/KDE/kdenetwork/krfb/; revision=654544
2007-04-16 14:10:59 +00:00
Laurent Montel
a514fc0a63 Kapplication-> Qapplication
svn path=/trunk/KDE/kdenetwork/krfb/; revision=654537
2007-04-16 13:13:27 +00:00
Alessandro Praduroux
6fd05b3a2a X11 framebuffer implementation based on XDamage and XShm completed.
Still has some weirdness when updating large portions of the screen 

svn path=/trunk/KDE/kdenetwork/krfb/; revision=654248
2007-04-15 15:53:18 +00:00
Alessandro Praduroux
47c089f937 Preliminary optional support for XDamage, checked both at compile and run time.
Uses less cpu than Qt approach, but visually sucks. I suspect there are too many updates sent to the client, I need to group the rects and create a bigger one when sending the event to the client. 

svn path=/trunk/KDE/kdenetwork/krfb/; revision=653073
2007-04-12 16:12:37 +00:00
Laurent Montel
803f4b8c4d SVN_SILENT: minor clean
svn path=/trunk/KDE/kdenetwork/krfb/; revision=653060
2007-04-12 15:53:49 +00:00
Urs Wolfer
d825ad5c12 make the icons again available
svn path=/trunk/KDE/kdenetwork/krfb/; revision=652744
2007-04-11 23:49:57 +00:00
Alessandro Praduroux
a7a7633438 remove unused files, ebn--
svn path=/trunk/KDE/kdenetwork/krfb/; revision=652659
2007-04-11 17:32:22 +00:00
Alessandro Praduroux
0bc68de645 correct handling of authentication and remote desktop control
svn path=/trunk/KDE/kdenetwork/krfb/; revision=652375
2007-04-10 20:40:44 +00:00
Alessandro Praduroux
67cac2140a use KConfig XT
svn path=/trunk/KDE/kdenetwork/krfb/; revision=651410
2007-04-07 16:16:51 +00:00
Alessandro Praduroux
cb1280f2b7 libvncserver wants to handle the tcp connection itself, so drop QTcpServer & friends
svn path=/trunk/KDE/kdenetwork/krfb/; revision=651193
2007-04-06 21:45:19 +00:00
Alessandro Praduroux
379d4d2fc0 When code starts to become too complex, add some new classes...
- FrameBuffer to encapsulate screen buffer and updates
- handle events
- avoid a timer for the rfb event loop, just use a real loop and qApp->processEvents()

svn path=/trunk/KDE/kdenetwork/krfb/; revision=650928
2007-04-05 20:21:15 +00:00
Alessandro Praduroux
e21768e2f6 why use a separate event loop when we have Qt one?
svn path=/trunk/KDE/kdenetwork/krfb/; revision=650878
2007-04-05 17:16:17 +00:00
Script Kiddy
13b9f36d33 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=650660
2007-04-05 04:46:06 +00:00
Alessandro Praduroux
f048313d43 using QImage as framebuffer instead of XImage, but it's slow as hell
svn path=/trunk/KDE/kdenetwork/krfb/; revision=650595
2007-04-04 22:15:08 +00:00
Alessandro Praduroux
94d6110dcd - added single connection controller in separate thread
- added hooks to manage vnc events
- moved events out of rfbcontroller.cpp/.h into their own source file


svn path=/trunk/KDE/kdenetwork/krfb/; revision=650434
2007-04-04 14:57:27 +00:00
Script Kiddy
358cc5ee54 - do not try to extract files with .cc extension, as there is not any.
- do not explicitely try to extract rc.cpp, as it is already extracted by *.cpp
  (This is to avoid a double reference for each message.)
(goutte)

svn path=/trunk/KDE/kdenetwork/krfb/; revision=649888
2007-04-03 10:51:01 +00:00
Alessandro Praduroux
cecfaa69b6 -include cleanups
-invitationmanager now really manages invitations
-invitation dialog displays invitations too
-start porting the real server code


svn path=/trunk/KDE/kdenetwork/krfb/; revision=649569
2007-04-02 20:44:39 +00:00
Alessandro Praduroux
171ffcfc95 check for libvncserver, enable krfb compilation and add link to libvncserver
svn path=/trunk/KDE/kdenetwork/krfb/; revision=649565
2007-04-02 20:41:10 +00:00
Alessandro Praduroux
5cc6c452e8 big code reorganization:
- removed old libvncserver, we will depend on external lib
- removed krfb, srvloc, krfb_http subdirs, now everything is 
  in krfb main dir instead 

svn path=/trunk/KDE/kdenetwork/krfb/; revision=649168
2007-04-02 07:13:22 +00:00
Urs Wolfer
fa6995f39f * make host address and password label selectable
* use bugs.kde.org as reporting address
* do not link anymore agains kde3_support
* make trayicon contextmenu actions working
* make left dialog images better looking (and use KStandardDirs::locate for loading)

svn path=/trunk/KDE/kdenetwork/krfb/; revision=648414
2007-03-31 09:44:33 +00:00
Alessandro Praduroux
8d98087e83 - Get rid of K3ActiveLabel
- invitation manager 
- some functionality added to invitation dialog
- personal invitation dialog shows correctly using QtNetwork classes
- tray icon LMB displays invitation dialog 

svn path=/trunk/KDE/kdenetwork/krfb/; revision=648286
2007-03-30 21:54:18 +00:00
Laurent Montel
001fac3e87 Remove duplicate entries
svn path=/trunk/KDE/kdenetwork/krfb/; revision=648141
2007-03-30 15:54:04 +00:00
Urs Wolfer
c1575a5074 try to fix dashboard
svn path=/trunk/KDE/kdenetwork/krfb/; revision=648083
2007-03-30 13:39:48 +00:00
Alessandro Praduroux
dbaed9a9e3 disable kcm_krfb until the code reorg in krfb is done
svn path=/trunk/KDE/kdenetwork/krfb/; revision=648056
2007-03-30 11:51:45 +00:00
Urs Wolfer
f26a93f5a4 * use KIcon
* remove obsolete code

svn path=/trunk/KDE/kdenetwork/krfb/; revision=647923
2007-03-29 21:52:57 +00:00
Alessandro Praduroux
ea7be8ba0a SVN_SILENT: license
svn path=/trunk/KDE/kdenetwork/krfb/; revision=647910
2007-03-29 21:07:43 +00:00
Alessandro Praduroux
48226e5c79 porting to KDE4/Refactoring of krfb
- remove kinetd dependency
- implement internal TCP server
- reorganization of dialog (unfinished)
- removed dcop/qdbus interface for now, will see if it's needed in the future or not
- porting of dialogs to uic4 (unfinished)

svn path=/trunk/KDE/kdenetwork/krfb/; revision=647907
2007-03-29 20:54:53 +00:00
Dirk Mueller
67684a17e9 fix format string warning
svn path=/trunk/KDE/kdenetwork/krfb/; revision=647260
2007-03-27 20:08:39 +00:00
Oswald Buddenhagen
3a85d368dd KProcess -> K3Process
KShellProcess -> K3ShellProcess
KProcIO -> K3ProcIO
KProcessController -> K3ProcessController

not deprecating, as we don't have a replacement yet.
not moving yet, as kdelibs still has heavy dependencies on it.

agreed upon with dfaure.


svn path=/trunk/KDE/kdenetwork/krfb/; revision=646732
2007-03-26 15:07:10 +00:00
Script Kiddy
2fd67a450a SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=645850
2007-03-23 18:35:51 +00:00
Script Kiddy
c0612ab2e9 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=640793
2007-03-09 08:08:58 +00:00
Script Kiddy
180b464a6d SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=639991
2007-03-06 13:57:24 +00:00
Bram Schoenmakers
2cc331b03f Forward port r636245:
Replace Mac newlines with Unix newlines, and the problem of 100% CPU utilization with the first connection disappeared. Credits go to Reinhold and Modestas.


svn path=/trunk/KDE/kdenetwork/krfb/; revision=636247
2007-02-22 15:35:21 +00:00
Urs Wolfer
6cfc27b67f port KAboutApplication -> KAboutApplicationDialog, KAboutKDE -> KAboutKDEDialog
svn path=/trunk/KDE/kdenetwork/krfb/; revision=628395
2007-01-29 23:28:40 +00:00
Matthias Kretz
771495dc6f merge the kinstance-redesign branch back to trunk.
svn path=/trunk/KDE/kdenetwork/krfb/; revision=628304
2007-01-29 18:01:48 +00:00
David Faure
9de81c5664 fix include path
svn path=/trunk/KDE/kdenetwork/krfb/; revision=627483
2007-01-26 19:06:39 +00:00
David Faure
fce4ebbb4f Get rid of module-wide config.h mess, use per-directory equivalents (although config-kopete.h is still quite a mess in itself)
Many configuration-related cleanups.

svn path=/trunk/KDE/kdenetwork/krfb/; revision=627480
2007-01-26 18:56:02 +00:00
Laurent Montel
9fe1ef9099 Try to fix compile
svn path=/trunk/KDE/kdenetwork/krfb/; revision=626280
2007-01-22 18:15:27 +00:00
Laurent Montel
18c741e625 Install doc
Cleanup

svn path=/trunk/KDE/kdenetwork/doc/krfb/; revision=626193
2007-01-22 12:49:38 +00:00
Laurent Montel
1117ebb747 SVN_SILENT: minor
svn path=/trunk/KDE/kdenetwork/krfb/; revision=626128
2007-01-22 09:11:36 +00:00
Laurent Montel
9cb088cfad Not necessary
svn path=/trunk/KDE/kdenetwork/krfb/; revision=626127
2007-01-22 09:06:31 +00:00
Laurent Montel
fd512171bc D-Bus port++
svn path=/trunk/KDE/kdenetwork/krfb/; revision=626126
2007-01-22 09:02:49 +00:00
Laurent Montel
d80c5803ec Fix install it as service
svn path=/trunk/KDE/kdenetwork/krfb/; revision=626124
2007-01-22 08:57:01 +00:00
Laurent Montel
73ddb17d52 Remove not necessary files (port to cmake check)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=626121
2007-01-22 08:40:48 +00:00
Laurent Montel
1fda4b4f4c Port++
svn path=/trunk/KDE/kdenetwork/krfb/; revision=626032
2007-01-21 21:45:12 +00:00
Laurent Montel
63148c4613 oops forgot to commit it
svn path=/trunk/KDE/kdenetwork/krfb/; revision=626027
2007-01-21 21:34:44 +00:00
Laurent Montel
3ce1258cb8 not necessary
svn path=/trunk/KDE/kdenetwork/krfb/; revision=626026
2007-01-21 21:31:43 +00:00
Laurent Montel
59d82ef5b6 D-Bus port++
svn path=/trunk/KDE/kdenetwork/krfb/; revision=626024
2007-01-21 21:26:43 +00:00
Laurent Montel
6891e92369 Adapt
svn path=/trunk/KDE/kdenetwork/krfb/; revision=626020
2007-01-21 21:15:56 +00:00
Dirk Mueller
f4dc94825e at least initialize them somehow
svn path=/trunk/KDE/kdenetwork/krfb/; revision=626018
2007-01-21 21:13:37 +00:00
Laurent Montel
f16e3cdf4c Not necessary to create static lib (which create some pb on x86_64)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=626017
2007-01-21 21:12:26 +00:00
Urs Wolfer
23d5c0008f generate moc
svn path=/trunk/KDE/kdenetwork/krfb/; revision=625952
2007-01-21 18:06:20 +00:00
Urs Wolfer
120bd94f22 use cmake lib names
svn path=/trunk/KDE/kdenetwork/krfb/; revision=625937
2007-01-21 17:07:26 +00:00
Urs Wolfer
6b2329e8ac readd krfb
* make it compile (without kinetd subfolder)
* left out DCOP->DBUS port
=> the cmake conversation for this app was quite bad. the libvncserver and srvloc were not created.
* some changes in FindSLP.cmake. i am not sure if they are correct. Laurent can you please check?
CCMAIL: montel@kde.org

svn path=/trunk/KDE/kdenetwork/krfb/; revision=625859
2007-01-21 12:51:14 +00:00
Script Kiddy
2ab02f7d89 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=624053
2007-01-16 07:35:09 +00:00
Burkhard Lück
7d6c29d3db fixed wrong link in khelpcenter
svn path=/trunk/KDE/kdenetwork/krfb/; revision=620549
2007-01-06 15:28:40 +00:00
Aaron J. Seigo
1813f696b4 KStdAction->KStandardAction
svn path=/trunk/KDE/kdenetwork/krfb/; revision=614800
2006-12-18 23:18:31 +00:00
Pino Toscano
a00075dc62 Make them a bit more freedesktop.org compliant.
svn path=/trunk/KDE/kdenetwork/krfb/; revision=613962
2006-12-15 21:06:11 +00:00
Alexander Neundorf
ad51e6a120 remove old Makefile.am contents
Alex

svn path=/trunk/KDE/kdenetwork/doc/krfb/; revision=604195
2006-11-11 23:06:09 +00:00
Alexander Neundorf
6b8f53fc2a -remove kde4_install_libtool_file(), not required anymore since we switched away from libltdl
-some cleanups 
-add JPEG_INCLUDE_DIRECTORY where required

Alex



svn path=/trunk/KDE/kdenetwork/krfb/; revision=602264
2006-11-05 15:19:05 +00:00
Laurent Montel
64f3616cde Apply Alex patch (now we can use enable-final argument
some module compiles with enable-final now)
As discussed with Alex it's not necessary to have program name
into automoc macro

svn path=/trunk/KDE/kdenetwork/krfb/; revision=598296
2006-10-23 07:12:29 +00:00
Laurent Montel
5518eb135b Necessary to change KDE4_AUTOMOC macro to support
enable-final argument

(there was not a dependancy between <name>_final.cpp file and
moc generated files => moc files were never created)

Not necessary to rebuild all kdelibs just cp kdelibs/cmake/modules/KDE4Macros.cmake <path_kde4>/share/apps/cmake/modules

I ported and tested all kde module (without enable-final argument, it compiles fines (test and program))
Don't try to use enable-final argument for the moment it doesn't compile (but dependancy works)

Regards

svn path=/trunk/KDE/kdenetwork/krfb/; revision=595050
2006-10-13 08:01:52 +00:00
Laurent Montel
d0bf3af30a Use cmake macro
svn path=/trunk/KDE/kdenetwork/krfb/; revision=591280
2006-10-02 09:06:07 +00:00
Laurent Montel
d7a2a8d778 Fix wordwrap
svn path=/trunk/KDE/kdenetwork/krfb/; revision=589493
2006-09-28 07:20:38 +00:00
Thomas Häber
7b0d8fe050 SVN_SILENT:
replaced depreciated assignment to QString::null with QString() in return context (EBN)

svn path=/trunk/KDE/kdenetwork/krfb/; revision=589332
2006-09-27 23:46:56 +00:00
Thomas Häber
1662794c65 SVN_SILENT:
changed single chars from QString to QChar in add to QString context -> faster (EBN)

svn path=/trunk/KDE/kdenetwork/krfb/; revision=589331
2006-09-27 23:45:58 +00:00
Laurent Montel
d8f557a836 Clean up
Fix svn file attribute (remove excutable attribute)
Remove not necessary files

svn path=/trunk/KDE/kdenetwork/krfb/; revision=579690
2006-09-01 12:41:54 +00:00
Laurent Montel
91e715a0fb Adapt with new KDE4_INSTALL_ICONS
(automatic detect of icons theme)


svn path=/trunk/KDE/kdenetwork/krfb/; revision=572967
2006-08-14 13:31:07 +00:00
Laurent Montel
677bbcd796 Fix install binary
svn path=/trunk/KDE/kdenetwork/krfb/; revision=572577
2006-08-13 09:52:28 +00:00
Laurent Montel
685df6b16f Cleanup
svn path=/trunk/KDE/kdenetwork/krfb/; revision=567292
2006-07-28 13:45:00 +00:00
Laurent Montel
9dce8277b8 Clean up CMakeLists.txt
svn path=/trunk/KDE/kdenetwork/krfb/; revision=564751
2006-07-21 07:46:40 +00:00
Alexander Neundorf
d91e8a2c97 -adapt to the new install dir scheme
Alex


svn path=/trunk/KDE/kdenetwork/krfb/; revision=558213
2006-07-04 22:03:28 +00:00
Jaison Lee
a311552ca9 EBN corrections.
svn path=/trunk/KDE/kdenetwork/krfb/; revision=551588
2006-06-15 02:47:32 +00:00
Jaison Lee
2793ecf8be Follow license policy on copyright notices.
svn path=/trunk/KDE/kdenetwork/krfb/; revision=550455
2006-06-11 20:08:05 +00:00
Jaison Lee
248a5d9f22 EBN update.
svn path=/trunk/KDE/kdenetwork/krfb/; revision=549564
2006-06-09 04:15:52 +00:00
Alexander Neundorf
f940a77e9e kde4_header and kde4_footer() are gone now
svn path=/trunk/KDE/kdenetwork/krfb/; revision=540226
2006-05-12 18:33:35 +00:00
Laurent Montel
81eaed4163 Remove Makefile.am, all is into CMakeLists.txt
Keep for the moment configure.in.in (need for avoid to lose check)

svn path=/trunk/KDE/kdenetwork/krfb/; revision=539990
2006-05-12 08:48:46 +00:00
Alexander Neundorf
34ac7aedad cleanup the toplevel CMakeLists.txt a bit
-remove include_directories( CMAKE_CURRENT_SOURCE_DIR CMAKE_CURRENT_BINARY_DIR)
in the subdirs, since this is done now automatically by cmake (the CMAKE_INCLUDE_CURRENT_DIR option
-include_directories(KDE4_INCLUDES) in the toplevel CMakeLists.txt, so it
doesn't have to be done in every subdir

Alex


svn path=/trunk/KDE/kdenetwork/krfb/; revision=539887
2006-05-11 22:49:47 +00:00
Laurent Montel
bbc790e2f2 KPixmap->QPixmap
svn path=/trunk/KDE/kdenetwork/krfb/; revision=538602
2006-05-08 12:27:07 +00:00
Stephan Kulow
08b27f474c deprecated--
svn path=/trunk/KDE/kdenetwork/krfb/; revision=537029
2006-05-03 19:01:57 +00:00
Stephan Kulow
29ee58e17b moved messages targets
svn path=/trunk/KDE/kdenetwork/krfb/; revision=536316
2006-05-01 20:03:39 +00:00
Tom Albers
05df948016 This fixes all docbook issues for kdenetwork mentioned at ebn.
svn path=/trunk/KDE/kdenetwork/doc/krfb/; revision=532373
2006-04-21 19:41:49 +00:00
Laurent Montel
285e31c454 better use
svn path=/trunk/KDE/kdenetwork/krfb/; revision=530949
2006-04-18 07:53:32 +00:00
Chusslove Illich
8fa14c8b56 Conversion to new i18n API (see KDE4PORTING.html->I18N->i18n calls).
svn path=/trunk/KDE/kdenetwork/krfb/; revision=528186
2006-04-10 11:45:42 +00:00
Laurent Montel
15001e9894 adapt to new kdelibs api
svn path=/trunk/KDE/kdenetwork/krfb/; revision=521401
2006-03-22 14:09:46 +00:00
Laurent Montel
10f5e80601 Adapt to new cmake variable from new kdelibs snapshot
svn path=/trunk/KDE/kdenetwork/krfb/; revision=521399
2006-03-22 14:05:36 +00:00
Laurent Montel
3b465c1a2d klistview->k3listview
svn path=/trunk/KDE/kdenetwork/krfb/; revision=520934
2006-03-21 10:25:12 +00:00
Laurent Montel
bddf9e2d3d Adapt to new kde4 api
svn path=/trunk/KDE/kdenetwork/krfb/; revision=518183
2006-03-13 11:16:11 +00:00
Fabio Pedretti
8784fcb0c8 Losslessly optimize file size of *.png files in /trunk/KDE/kdenetwork with optipng -i0 -o5 and advdef -z -4.
Losslessly optimize file size of *.mng and *gz files in /trunk/KDE/kdenetwork with advdef -z -4.
Total *.png file size goes to 2746375 from 3357534 (-18.20%).
Total *.mng file size goes to 114658 from 115504 (-0.73%).
Total *gz file size goes to 24786 from 25939 (-4.45%).
For more info see bug 122897.

svn path=/trunk/KDE/kdenetwork/doc/krfb/; revision=518176
2006-03-13 10:57:38 +00:00
Laurent Montel
a82f9c7404 Add cmake support
svn path=/trunk/KDE/kdenetwork/doc/krfb/; revision=517205
2006-03-10 11:11:07 +00:00
Script Kiddy
2244c564cd SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=511226
2006-02-19 08:05:59 +00:00
Laurent Montel
6a0dccb067 Deprecated--
svn path=/trunk/KDE/kdenetwork/krfb/; revision=510437
2006-02-17 10:06:16 +00:00
Laurent Montel
3cde21088a Deprecated--
svn path=/trunk/KDE/kdenetwork/krfb/; revision=509838
2006-02-15 17:36:43 +00:00
Laurent Montel
6a59d9610c Adapt to kde4 api
svn path=/trunk/KDE/kdenetwork/krfb/; revision=508601
2006-02-12 12:28:15 +00:00
Laurent Montel
8064fc26fc deprecated--
svn path=/trunk/KDE/kdenetwork/krfb/; revision=507123
2006-02-08 15:56:52 +00:00
Laurent Montel
0ede5f885c KURL->KUrl
svn path=/trunk/KDE/kdenetwork/krfb/; revision=503500
2006-01-29 13:20:56 +00:00
Caleb Tennis
b4f6c211b1 Change head call so it works with latest coreutils
svn path=/trunk/KDE/kdenetwork/krfb/; revision=502435
2006-01-25 23:24:25 +00:00
Script Kiddy
458c90d1ec Improve portability by using #! /usr/bin/env bash
(Bug #95475)
(goutte)

svn path=/trunk/KDE/kdenetwork/krfb/; revision=499198
2006-01-17 08:55:56 +00:00
Script Kiddy
d7bc527cf3 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=495182
2006-01-07 12:20:28 +00:00
Laurent Montel
7c0933f206 Q3ValueList--
svn path=/trunk/KDE/kdenetwork/krfb/; revision=494952
2006-01-06 17:02:44 +00:00
Laurent Montel
ad47c47b20 Fix compile
svn path=/trunk/KDE/kdenetwork/krfb/; revision=494951
2006-01-06 17:01:02 +00:00
Script Kiddy
d8b288f071 Remove svn:executable from some typical non-executable files
(goutte)

svn path=/trunk/KDE/kdenetwork/doc/krfb/; revision=492795
2005-12-31 07:56:08 +00:00
André Wöbbeking
a44ca51c4c - removed not supported %m
- removed %i if not needed (app name == icon name)

svn path=/trunk/KDE/kdenetwork/krfb/; revision=492086
2005-12-28 18:56:40 +00:00
Laurent Montel
e89e2989f4 Q3ValueVector->QVector
svn path=/trunk/KDE/kdenetwork/krfb/; revision=486648
2005-12-08 09:28:50 +00:00
Laurent Montel
5699651d71 Minor fix
svn path=/trunk/KDE/kdenetwork/krfb/; revision=484419
2005-11-30 18:15:39 +00:00
Laurent Montel
290f76eab1 Compile/link
svn path=/trunk/KDE/kdenetwork/krfb/; revision=484418
2005-11-30 18:13:41 +00:00
Laurent Montel
4353c27742 Minor fix
svn path=/trunk/KDE/kdenetwork/krfb/; revision=484416
2005-11-30 18:08:23 +00:00
Laurent Montel
e226d0fe93 Continue to fix compile
svn path=/trunk/KDE/kdenetwork/krfb/; revision=484413
2005-11-30 18:02:48 +00:00
Laurent Montel
d0a0acc68d Fix compile/link
svn path=/trunk/KDE/kdenetwork/krfb/; revision=484411
2005-11-30 17:59:41 +00:00
Laurent Montel
0b5bec27af Use DCOPCString
svn path=/trunk/KDE/kdenetwork/krfb/; revision=479704
2005-11-11 13:37:51 +00:00
Laurent Montel
2334a40699 Qt3support--
svn path=/trunk/KDE/kdenetwork/krfb/; revision=478970
2005-11-08 16:10:18 +00:00
Laurent Montel
14dcfe340d Launch script to adapt to new kdelibs api
svn path=/trunk/KDE/kdenetwork/krfb/; revision=472335
2005-10-20 13:29:56 +00:00
Dirk Mueller
48f165396a SVN_SILENT: fix typo
svn path=/trunk/KDE/kdenetwork/krfb/; revision=467420
2005-10-05 09:03:00 +00:00
Stephan Binner
31a8c98fda add small icon
svn path=/trunk/KDE/kdenetwork/krfb/; revision=453645
2005-08-26 18:25:13 +00:00
Dirk Mueller
9ee62b7612 update FSF address
svn path=/trunk/KDE/kdenetwork/krfb/; revision=439840
2005-07-29 02:40:16 +00:00
Stephan Kulow
05a5475fa4 merge kde4 into trunk / ignoring kopete - hope it will
get ported now too

svn path=/trunk/KDE/kdenetwork/krfb/; revision=439726
2005-07-28 19:15:32 +00:00
Script Kiddy
60ecb10298 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=436121
2005-07-19 04:05:24 +00:00
Script Kiddy
f059eedd88 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=434433
2005-07-14 04:03:30 +00:00
Script Kiddy
fe4cd8c787 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=434157
2005-07-13 04:05:45 +00:00
Script Kiddy
0ab660525e SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=425586
2005-06-15 04:25:55 +00:00
Script Kiddy
7ecfdbbad1 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=424487
2005-06-12 03:54:41 +00:00
Script Kiddy
2c068866bf SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=424186
2005-06-11 03:32:04 +00:00
Script Kiddy
f301b9c443 SVN_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=421949
2005-06-04 03:45:23 +00:00
Script Kiddy
690a53c590 CVS_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=413567
2005-05-14 03:40:12 +00:00
Script Kiddy
5cb29d745f CVS_SILENT made messages (.desktop file)
svn path=/trunk/KDE/kdenetwork/krfb/; revision=410634
2005-05-08 07:11:34 +00:00
Script Kiddy
a812ef6393 CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=401169
2005-03-28 03:34:02 +00:00
Script Kiddy
0ef8f2d453 CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=400397
2005-03-25 04:09:59 +00:00
Script Kiddy
c5b1b80c7d CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=392535
2005-02-23 05:08:44 +00:00
Aaron J. Seigo
c207e3bb73 fix frame
CCBUG:99396

svn path=/trunk/kdenetwork/krfb/; revision=389454
2005-02-14 21:03:08 +00:00
Script Kiddy
c936f30db9 CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=388264
2005-02-11 04:54:21 +00:00
Stephan Kulow
4f703bf678 characters can be unsigned too
svn path=/trunk/kdenetwork/krfb/; revision=388040
2005-02-10 14:12:16 +00:00
Stephan Binner
9b59119cf3 CVS_SILENT i18n style guide fixes, first run
svn path=/trunk/kdenetwork/krfb/; revision=385798
2005-02-03 10:49:53 +00:00
Script Kiddy
69bd756bb7 CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=384484
2005-01-31 08:38:42 +00:00
Script Kiddy
d3fac404e0 CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=382809
2005-01-27 04:10:52 +00:00
Stephan Binner
b72740d994 fix menu entries
svn path=/trunk/kdenetwork/krfb/; revision=378969
2005-01-16 08:28:22 +00:00
Script Kiddy
f067112601 CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=378951
2005-01-16 04:04:50 +00:00
Edwin Schepers
153c22d929 Give labels a NoFocus policy, so that it is not selected at startup of the dialog and is not in the tab sequence.
BUG: 92032

svn path=/trunk/kdenetwork/krfb/; revision=378279
2005-01-13 22:40:35 +00:00
Laurent Montel
bea44ed778 Fix export
svn path=/trunk/kdenetwork/krfb/; revision=377514
2005-01-11 16:35:05 +00:00
Script Kiddy
385d4455a9 CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=376742
2005-01-09 04:06:23 +00:00
Script Kiddy
7c29d37323 CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=375595
2005-01-05 04:03:22 +00:00
Script Kiddy
eaa39967b3 CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=375379
2005-01-04 03:51:03 +00:00
Script Kiddy
b80715e14a CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=374823
2005-01-02 03:44:29 +00:00
Script Kiddy
b751d5529e CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=374569
2005-01-01 03:35:52 +00:00
Albert Astals Cid
fdaa7d29c1 fixuifiles
svn path=/trunk/kdenetwork/krfb/; revision=374524
2004-12-31 17:47:59 +00:00
Script Kiddy
f41085f9d2 CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=374048
2004-12-29 17:55:25 +00:00
Laurent Montel
93abc31703 Use krun to launch kcm module
svn path=/trunk/kdenetwork/krfb/; revision=371072
2004-12-16 14:04:42 +00:00
Laurent Montel
de51a27501 Backport reload config
svn path=/trunk/kdenetwork/krfb/; revision=370499
2004-12-14 10:17:16 +00:00
Script Kiddy
6b2da6a798 CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=370471
2004-12-14 03:41:19 +00:00
Script Kiddy
68351df3b4 CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=369788
2004-12-11 06:41:41 +00:00
Jakub Stachowski
a7808c2433 Add DNS-SD based service publishing to kinetd and enable it in krfb.
svn path=/trunk/kdenetwork/krfb/; revision=369499
2004-12-09 20:10:23 +00:00
Stephan Binner
b66e85cb4a knewsticker/knewstickerstub/Makefile.am: KDE_ICON used but no icons present
krfb/kinetd/Makefile.am: KDE_ICON used but no icons present

svn path=/trunk/kdenetwork/krfb/; revision=367795
2004-12-02 09:47:55 +00:00
Script Kiddy
d5fedd911c CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=365706
2004-11-24 04:17:20 +00:00
Script Kiddy
7f6af1accf CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=364999
2004-11-22 04:42:34 +00:00
Dirk Mueller
988edb72ba fix export's
svn path=/trunk/kdenetwork/krfb/; revision=364991
2004-11-22 03:58:56 +00:00
Chris Howells
8e6c5ce5f8 s/whatever/whichever
svn path=/trunk/kdenetwork/krfb/; revision=362004
2004-11-10 14:08:23 +00:00
Script Kiddy
997ef4a6ff CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=361625
2004-11-09 03:39:00 +00:00
Script Kiddy
7e14c20337 CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=359745
2004-11-02 04:22:33 +00:00
Script Kiddy
eaeea7803a CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=357783
2004-10-26 02:51:12 +00:00
Script Kiddy
2b02a82b11 CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=356372
2004-10-21 03:02:16 +00:00
Benjamin Meyer
499b09de92 Terminal=0 -> Terminal=false
Terminal=1 -> Terminal=true
Add missing ';' to Categories
Remove depreceted: TerminalOptions, BinaryPattern, MiniIcon
(double checked)

svn path=/trunk/kdenetwork/krfb/; revision=355834
2004-10-19 03:49:14 +00:00
Albert Astals Cid
6029bcfdc5 Even more fixuifiles
svn path=/trunk/kdenetwork/krfb/; revision=355797
2004-10-18 21:42:05 +00:00
Script Kiddy
b4d7816864 CVS_SILENT made messages (.desktop file)
svn path=/trunk/kdenetwork/krfb/; revision=353574
2004-10-11 03:13:35 +00:00
Script Kiddy
7a7b70d192 CVS_SILENT made messages (desktop files)
svn path=/trunk/kdenetwork/krfb/; revision=353053
2004-10-09 02:33:51 +00:00
Script Kiddy
5d3cf54649 CVS_SILENT made messages
svn path=/trunk/kdenetwork/krfb/; revision=350701
2004-10-01 06:51:58 +00:00
Nadeem Hasan
3f01551a08 Use KDialogBase.
svn path=/trunk/kdenetwork/krfb/; revision=349503
2004-09-26 17:10:32 +00:00
Laurent Montel
54a7625438 QString(i18n(...)) -> i18n(...)
svn path=/trunk/kdenetwork/krfb/; revision=347601
2004-09-19 11:52:23 +00:00
Nadeem Hasan
75f35ea664 Port to KDialogBase.
svn path=/trunk/kdenetwork/krfb/; revision=347549
2004-09-19 06:36:43 +00:00
Script Kiddy
671433402e CVS_SILENT made messages
svn path=/trunk/kdenetwork/krfb/; revision=342856
2004-08-30 23:28:00 +00:00
Tim Jansen
c05a9b9d9f #67519: adjust applet name, patch by Allen Rouse
svn path=/trunk/kdenetwork/krfb/; revision=341875
2004-08-27 17:09:16 +00:00
Script Kiddy
d5b080ec40 CVS_SILENT made messages
svn path=/trunk/kdenetwork/krfb/; revision=340251
2004-08-23 22:08:42 +00:00
Script Kiddy
e1e3d04465 CVS_SILENT made messages
svn path=/trunk/kdenetwork/krfb/; revision=335843
2004-08-04 06:49:47 +00:00
Tim Jansen
f4e494094d solaris compile patch by Peter A Jonsson, thanks.
svn path=/trunk/kdenetwork/krfb/; revision=333276
2004-07-27 16:04:10 +00:00
Frans Englich
aeb23861a0 Avoid leaking KAboutData by using the new KCModule::setAboutData() function.
svn path=/trunk/kdenetwork/krfb/; revision=330749
2004-07-19 01:15:44 +00:00
Frans Englich
a246d1e7be Revert the third list of changes in the XDG mail. If anything more is to be reverted/changed, you will have to explicitly tell me so.
svn path=/trunk/kdenetwork/krfb/; revision=329375
2004-07-14 22:24:24 +00:00
Frans Englich
92e1ff56d2 Do the OnlyShowIn/NotShowIn hiding as discussed on the XDG list:
http://freedesktop.org/pipermail/xdg/2004-March/003619.html

svn path=/trunk/kdenetwork/krfb/; revision=328800
2004-07-13 17:05:56 +00:00
Stephan Binner
37f93609e9 CVS_SILENT No punctuation in command line descriptions
svn path=/trunk/kdenetwork/krfb/; revision=322582
2004-06-21 19:03:29 +00:00
Script Kiddy
c51a4e7d32 CVS_SILENT made messages
svn path=/trunk/kdenetwork/krfb/; revision=321869
2004-06-19 07:00:27 +00:00
Script Kiddy
e3a6f4c656 CVS_SILENT made messages
svn path=/trunk/kdenetwork/krfb/; revision=318114
2004-06-06 06:37:29 +00:00
Script Kiddy
757e8b6e44 CVS_SILENT made messages
svn path=/trunk/kdenetwork/krfb/; revision=316985
2004-06-02 06:49:00 +00:00
Script Kiddy
8c19095ab6 CVS_SILENT made messages
svn path=/trunk/kdenetwork/krfb/; revision=316289
2004-05-31 06:55:49 +00:00
Script Kiddy
7ddac51f20 CVS_SILENT made messages
svn path=/trunk/kdenetwork/krfb/; revision=315004
2004-05-27 07:48:20 +00:00
Stephan Binner
9ba79d5aa6 setCheckedState++
svn path=/trunk/kdenetwork/krfb/; revision=311694
2004-05-15 20:18:25 +00:00
Script Kiddy
4c5e9487f9 CVS_SILENT made messages
svn path=/trunk/kdenetwork/krfb/; revision=310227
2004-05-11 05:54:52 +00:00
Tim Jansen
5adc329b02 May solve #60229, thanks to Christian Krause.
svn path=/trunk/kdenetwork/krfb/; revision=304986
2004-04-19 19:21:29 +00:00
Tim Jansen
ffbe9e6a81 Fixes bug #77412, thanks Waldo!
svn path=/trunk/kdenetwork/krfb/; revision=300240
2004-03-31 21:45:52 +00:00
Brad Hards
5a2060c645 Fix web link for bugs. Thanks to Damien Raude-Morvan for reporting.
CCMAIL: 78648-done@bugs.kde.org

svn path=/trunk/kdenetwork/doc/krfb/; revision=299466
2004-03-29 11:13:32 +00:00
Script Kiddy
24c5afcc9f CVS_SILENT made messages
svn path=/trunk/kdenetwork/krfb/; revision=294128
2004-03-07 06:47:14 +00:00
Script Kiddy
75a6ded81e CVS_SILENT made messages
svn path=/trunk/kdenetwork/krfb/; revision=292456
2004-02-29 07:23:35 +00:00
Script Kiddy
252c969c68 CVS_SILENT made messages
svn path=/trunk/kdenetwork/krfb/; revision=284419
2004-02-02 04:05:03 +00:00
Tim Jansen
96a3ab8d83 Fix for #73288, patch by brad <bkn@ithryn.net>
svn path=/trunk/kdenetwork/krfb/; revision=283309
2004-01-28 16:30:37 +00:00
167 changed files with 5717 additions and 25691 deletions

1
.krazy Normal file
View File

@@ -0,0 +1 @@
SKIP /kinetd/

60
CMakeLists.txt Normal file
View File

@@ -0,0 +1,60 @@
project(krfb)
check_symbol_exists(rfbInitServer "rfb/rfb.h" HAVE_LIBVNCSERVER)
macro_bool_to_01(X11_Xdamage_FOUND HAVE_XDAMAGE)
macro_bool_to_01(X11_XShm_FOUND HAVE_XSHM)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config-krfb.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-krfb.h )
include_directories(${CMAKE_CURRENT_BINARY_DIR}) # for config-krfb.h
if(Q_WS_X11)
if(NOT X11_XTest_FOUND)
macro_log_feature(X11_XTest_FOUND "libXtst" "X11 Testing Resource extension library" "http://xorg.freedesktop.org" FALSE "" "useful for automated testing of X clients.")
endif(NOT X11_XTest_FOUND)
endif(Q_WS_X11)
#add_subdirectory(kinetd)
#add_subdirectory(kcm_krfb)
if (HAVE_LIBVNCSERVER)
set(krfb_SRCS
main.cpp
trayicon.cpp
krfbserver.cpp
manageinvitationsdialog.cpp
invitationmanager.cpp
invitedialog.cpp
invitation.cpp
connectiondialog.cpp
personalinvitedialog.cpp
connectioncontroller.cpp
events.cpp
framebuffer.cpp
qtframebuffer.cpp
x11framebuffer.cpp
)
kde4_add_kcfg_files(krfb_SRCS krfbconfig.kcfgc)
kde4_add_ui_files(krfb_SRCS connectionwidget.ui
manageinvitations.ui
personalinvitewidget.ui
invitewidget.ui
configtcp.ui
configsecurity.ui
)
kde4_add_executable(krfb ${krfb_SRCS})
target_link_libraries(krfb ${JPEG_LIBRARIES} ${LIBVNCSERVER_LIBRARIES} ${X11_Xdamage_LIB} ${KDE4_KDNSSD_LIBS})
if(X11_XTest_FOUND)
target_link_libraries(krfb ${X11_XTest_LIB})
endif(X11_XTest_FOUND)
install(TARGETS krfb ${INSTALL_TARGETS_DEFAULT_ARGS})
########### install files ###############
install(FILES krfb.desktop DESTINATION ${XDG_APPS_INSTALL_DIR})
install(FILES krfb.notifyrc DESTINATION ${DATA_INSTALL_DIR}/krfb)
endif (HAVE_LIBVNCSERVER)

View File

@@ -1,9 +0,0 @@
DCOP Interfaces:
// Exits the application, disconnects clients
void exit()
// Set the desktop to be controlable from remote clients
void setAllowDesktopControl(bool)

5
Mainpage.dox Normal file
View File

@@ -0,0 +1,5 @@
/** @mainpage Krfb API Reference
*
* Krfb provides a VNC-compatible server to share KDE desktops.
*
*/

View File

@@ -1,8 +0,0 @@
SUBDIRS = srvloc kinetd libvncserver krfb kcm_krfb krfb_httpd
EXTRA_DIST = AUTHORS README TODO NOTES DCOP-INTERFACE
# not a GNU package. You can remove this line, if
# have all needed files, that a GNU package needs
AUTOMAKE_OPTIONS = foreign

2
Messages.sh Normal file
View File

@@ -0,0 +1,2 @@
#! /bin/sh
$XGETTEXT *.cpp -o $podir/krfb.pot

11
config-krfb.h.cmake Normal file
View File

@@ -0,0 +1,11 @@
/* Define to 1 if you have the `getifaddrs' function. */
#cmakedefine HAVE_GETIFADDRS 1
/* Define if SLP is available */
#cmakedefine HAVE_SLP 1
/* Define if XDamage is available */
#cmakedefine HAVE_XDAMAGE 1
/* Define if XShm is available */
#cmakedefine HAVE_XSHM 1

139
configsecurity.ui Normal file
View File

@@ -0,0 +1,139 @@
<ui version="4.0" >
<class>Security</class>
<widget class="QWidget" name="Security" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>507</width>
<height>201</height>
</rect>
</property>
<layout class="QVBoxLayout" >
<item>
<widget class="QCheckBox" name="kcfg_allowUninvitedConnections" >
<property name="text" >
<string>Allow uninvited connections</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="kcfg_allowDesktopControl" >
<property name="text" >
<string>Allow remote connections to control your desktop</string>
</property>
<property name="checked" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="kcfg_askOnConnect" >
<property name="enabled" >
<bool>false</bool>
</property>
<property name="text" >
<string>Ask before accepting an uninvited connection</string>
</property>
<property name="checked" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label" >
<property name="enabled" >
<bool>false</bool>
</property>
<property name="text" >
<string>Uninvited connections password:</string>
</property>
<property name="buddy" >
<cstring>kcfg_uninvitedConnectionPassword</cstring>
</property>
</widget>
</item>
<item>
<widget class="KLineEdit" name="kcfg_uninvitedConnectionPassword" >
<property name="enabled" >
<bool>false</bool>
</property>
<property name="echoMode" >
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item>
<spacer>
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" >
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KLineEdit</class>
<extends>QLineEdit</extends>
<header>klineedit.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>
<sender>kcfg_allowUninvitedConnections</sender>
<signal>toggled(bool)</signal>
<receiver>kcfg_askOnConnect</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel" >
<x>22</x>
<y>24</y>
</hint>
<hint type="destinationlabel" >
<x>29</x>
<y>80</y>
</hint>
</hints>
</connection>
<connection>
<sender>kcfg_allowUninvitedConnections</sender>
<signal>toggled(bool)</signal>
<receiver>kcfg_uninvitedConnectionPassword</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel" >
<x>98</x>
<y>21</y>
</hint>
<hint type="destinationlabel" >
<x>192</x>
<y>137</y>
</hint>
</hints>
</connection>
<connection>
<sender>kcfg_allowUninvitedConnections</sender>
<signal>toggled(bool)</signal>
<receiver>label</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel" >
<x>117</x>
<y>20</y>
</hint>
<hint type="destinationlabel" >
<x>120</x>
<y>94</y>
</hint>
</hints>
</connection>
</connections>
</ui>

94
configtcp.ui Normal file
View File

@@ -0,0 +1,94 @@
<ui version="4.0" >
<class>TCP</class>
<widget class="QWidget" name="TCP" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>169</height>
</rect>
</property>
<layout class="QVBoxLayout" >
<property name="margin" >
<number>9</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<widget class="QCheckBox" name="kcfg_publishService" >
<property name="text" >
<string>Announce the service on the local network</string>
</property>
<property name="checked" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="kcfg_useDefaultPort" >
<property name="text" >
<string>Use default port</string>
</property>
<property name="checked" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" >
<property name="margin" >
<number>0</number>
</property>
<property name="spacing" >
<number>6</number>
</property>
<item>
<widget class="QLabel" name="label" >
<property name="text" >
<string>Listening port:</string>
</property>
<property name="buddy" >
<cstring>kcfg_port</cstring>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="kcfg_port" >
<property name="enabled" >
<bool>false</bool>
</property>
<property name="maximum" >
<number>65535</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<tabstops>
<tabstop>kcfg_useDefaultPort</tabstop>
<tabstop>kcfg_port</tabstop>
</tabstops>
<resources/>
<connections>
<connection>
<sender>kcfg_useDefaultPort</sender>
<signal>toggled(bool)</signal>
<receiver>kcfg_port</receiver>
<slot>setDisabled(bool)</slot>
<hints>
<hint type="sourcelabel" >
<x>120</x>
<y>53</y>
</hint>
<hint type="destinationlabel" >
<x>277</x>
<y>122</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@@ -1,21 +0,0 @@
KDE_CHECK_HEADER(X11/extensions/XTest.h,
[],
AC_MSG_ERROR([XTest extension header not found / no xlib headers]))
#check for getifaddrs(3) (as in glibc >= 2.3 and newer bsds)
AC_MSG_CHECKING(for getifaddrs support)
AC_TRY_LINK( [
#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>
],[
getifaddrs(0);
],[
AC_DEFINE(HAVE_GETIFADDRS,1,[Define if getifaddrs is available])
AC_MSG_RESULT(yes)
COMPILE_GETIFADDRS=""
],[
AC_MSG_RESULT(no)
COMPILE_GETIFADDRS="getifaddrs.cpp"
])
AC_SUBST(COMPILE_GETIFADDRS)

231
connectioncontroller.cpp Normal file
View File

@@ -0,0 +1,231 @@
/* This file is part of the KDE project
Copyright (C) 2007 Alessandro Praduroux <pradu@pradu.it>
(C) 2001-2003 by Tim Jansen <tim@tjansen.de>
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 "connectioncontroller.h"
#include "connectioncontroller.moc"
#include <QX11Info>
#include <QHostInfo>
#include <QApplication>
#include <QDesktopWidget>
#include <QTcpSocket>
#include <QTimer>
#include <KConfig>
#include <KGlobal>
#include <KUser>
#include <KNotification>
#include <KLocale>
#include <KDebug>
#include "invitationmanager.h"
#include "connectiondialog.h"
#include "events.h"
#include "krfbserver.h"
#include "krfbconfig.h"
#include <X11/Xutil.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
static QString peerAddress(int sock) {
const int ADDR_SIZE = 50;
struct sockaddr sa;
socklen_t salen = sizeof(struct sockaddr);
if (getpeername(sock, &sa, &salen) == 0) {
if (sa.sa_family == AF_INET) {
struct sockaddr_in *si = (struct sockaddr_in *)&sa;
return QString(inet_ntoa(si->sin_addr));
}
if (sa.sa_family == AF_INET6) {
char inetbuf[ADDR_SIZE];
inet_ntop(sa.sa_family, &sa, inetbuf, ADDR_SIZE);
return QString(inetbuf);
}
return QString("not a network address");
}
return QString("unable to determine...");
}
static void clientGoneHook(rfbClientPtr cl)
{
ConnectionController *cc = static_cast<ConnectionController *>(cl->clientData);
cc->handleClientGone();
}
static bool checkPassword(const QString &p, unsigned char *ochallenge, const char *response, int len)
{
if ((len == 0) && (p.length() == 0)) {
return true;
}
char passwd[MAXPWLEN];
unsigned char challenge[CHALLENGESIZE];
memcpy(challenge, ochallenge, CHALLENGESIZE);
bzero(passwd, MAXPWLEN);
if (!p.isNull()) {
strncpy(passwd, p.toLatin1(),
(MAXPWLEN <= p.length()) ? MAXPWLEN : p.length());
}
rfbEncryptBytes(challenge, passwd);
return memcmp(challenge, response, len) == 0;
}
ConnectionController::ConnectionController(struct _rfbClientRec *_cl, KrfbServer * parent)
: QObject(parent), cl(_cl)
{
cl->clientData = (void*)this;
}
ConnectionController::~ConnectionController()
{
}
enum rfbNewClientAction ConnectionController::handleNewClient()
{
bool askOnConnect = KrfbConfig::askOnConnect();
bool allowUninvited = KrfbConfig::allowUninvitedConnections();
remoteIp = peerAddress(cl->sock);
if (!allowUninvited && InvitationManager::self()->activeInvitations() == 0) {
KNotification::event("ConnectionAttempted",
i18n("Refused uninvited connection attempt from %1",
remoteIp));
return RFB_CLIENT_REFUSE;
}
if (!askOnConnect && InvitationManager::self()->activeInvitations() == 0) {
KNotification::event("NewConnectionAutoAccepted",
i18n("Accepted uninvited connection from %1",
remoteIp));
emit sessionEstablished(remoteIp);
return RFB_CLIENT_ACCEPT;
}
KNotification::event("NewConnectionOnHold",
i18n("Received connection from %1, on hold (waiting for confirmation)",
remoteIp));
cl->clientGoneHook = clientGoneHook;
ConnectionDialog *dialog = new ConnectionDialog(0);
dialog->setRemoteHost(remoteIp);
dialog->setAllowRemoteControl( true );
connect(dialog, SIGNAL(okClicked()), SLOT(dialogAccepted()));
connect(dialog, SIGNAL(cancelClicked()), SLOT(dialogRejected()));
dialog->show();
return RFB_CLIENT_ON_HOLD;
}
bool ConnectionController::handleCheckPassword(rfbClientPtr cl, const char *response, int len)
{
bool allowUninvited = KrfbConfig::allowUninvitedConnections();
QString password = KrfbConfig::uninvitedConnectionPassword();
bool authd = false;
kDebug() << "about to start autentication";
if (allowUninvited) {
authd = checkPassword(password, cl->authChallenge, response, len);
}
if (!authd) {
QList<Invitation> invlist = InvitationManager::self()->invitations();
foreach(const Invitation &it, invlist) {
kDebug() << "checking password";
if (checkPassword(it.password(), cl->authChallenge, response, len) && it.isValid()) {
authd = true;
InvitationManager::self()->removeInvitation(it);
break;
}
}
}
if (!authd) {
if (InvitationManager::self()->invitations().size() > 0) {
KNotification::event("InvalidPasswordInvitations",
i18n("Failed login attempt from %1: wrong password",
remoteIp));
} else {
KNotification::event("InvalidPassword",
i18n("Failed login attempt from %1: wrong password",
remoteIp));
}
return false;
}
return true;
}
void ConnectionController::handleKeyEvent(bool down, rfbKeySym keySym)
{
if (controlEnabled) {
KeyboardEvent ev(down, keySym);
ev.exec();
}
}
void ConnectionController::handlePointerEvent(int bm, int x, int y)
{
if (controlEnabled) {
PointerEvent ev(bm, x, y);
ev.exec();
}
}
void ConnectionController::handleClientGone()
{
emit clientDisconnected(this);
kDebug() << "client gone";
deleteLater();
}
void ConnectionController::clipboardToServer(const QString &s)
{
ClipboardEvent ev(this, s);
ev.exec();
}
void ConnectionController::dialogAccepted()
{
// rfbStartOnHoldClient(cl);
cl->onHold = false;
}
void ConnectionController::dialogRejected()
{
kDebug() << "refused connection";
rfbRefuseOnHoldClient(cl);
}
void ConnectionController::setControlEnabled(bool enable)
{
controlEnabled = enable;
}

64
connectioncontroller.h Normal file
View File

@@ -0,0 +1,64 @@
/* This file is part of the KDE project
Copyright (C) 2007 Alessandro Praduroux <pradu@pradu.it>
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 CONNECTIONCONTROLLER_H
#define CONNECTIONCONTROLLER_H
#include <QObject>
#include <rfb/rfb.h>
class KrfbServer;
/**
@author Alessandro Praduroux <pradu@pradu.it>
*/
class ConnectionController : public QObject
{
Q_OBJECT
public:
ConnectionController(struct _rfbClientRec *_cl, KrfbServer *parent);
~ConnectionController();
bool handleCheckPassword(rfbClientPtr cl, const char *response, int len);
void handleNegotiationFinished(struct _rfbClientRec *cl);
void handleKeyEvent(bool down , rfbKeySym keySym );
void handlePointerEvent( int bm, int x, int y);
void handleClientGone();
void clipboardToServer(const QString &);
enum rfbNewClientAction handleNewClient();
void setControlEnabled(bool enable);
Q_SIGNALS:
void sessionEstablished(QString);
void notification(QString, QString);
void clientDisconnected(ConnectionController *);
protected Q_SLOTS:
void dialogAccepted();
void dialogRejected();
private:
QString remoteIp;
struct _rfbClientRec *cl;
bool controlEnabled;
/*
int fd;
KrfbServer *server;
rfbScreenInfoPtr screen;
rfbClientPtr client;
QTcpSocket *tcpConn;
*/
};
#endif

70
connectiondialog.cpp Normal file
View File

@@ -0,0 +1,70 @@
/* This file is part of the KDE project
Copyright (C) 2004 Nadeem Hasan <nhasan@kde.org>
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.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "connectiondialog.h"
#include <QCheckBox>
#include <QLabel>
#include <KIconLoader>
#include <KLocale>
#include <KStandardGuiItem>
ConnectionDialog::ConnectionDialog( QWidget *parent )
: KDialog( parent )
{
setCaption(i18n("New Connection"));
setButtons(Ok|Cancel);
setDefaultButton(Cancel);
setModal(true);
setMinimumSize(500, 200);
m_connectWidget = new QWidget( this );
setupUi(m_connectWidget);
pixmapLabel->setPixmap(KIcon("krfb").pixmap(128));
KGuiItem accept = KStandardGuiItem::ok();
accept.setText( i18n( "Accept Connection" ) );
setButtonGuiItem(Ok, accept);
KGuiItem refuse = KStandardGuiItem::cancel();
refuse.setText( i18n( "Refuse Connection" ) );
setButtonGuiItem(Cancel, refuse);
setMainWidget( m_connectWidget );
}
void ConnectionDialog::setRemoteHost( const QString &host )
{
remoteHost->setText( host );
}
void ConnectionDialog::setAllowRemoteControl( bool b )
{
cbAllowRemoteControl->setChecked( b );
}
bool ConnectionDialog::allowRemoteControl()
{
return cbAllowRemoteControl->isChecked();
}
#include "connectiondialog.moc"

45
connectiondialog.h Normal file
View File

@@ -0,0 +1,45 @@
/* This file is part of the KDE project
Copyright (C) 2004 Nadeem Hasan <nhasan@kde.org>
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.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef CONNECTIONDIALOG_H
#define CONNECTIONDIALOG_H
#include <KDialog>
#include "ui_connectionwidget.h"
class QWidget;
class ConnectionDialog : public KDialog, public Ui::ConnectionWidget
{
Q_OBJECT
public:
ConnectionDialog( QWidget *parent );
~ConnectionDialog() {};
void setRemoteHost( const QString &host );
void setAllowRemoteControl( bool b );
bool allowRemoteControl();
protected:
QWidget *m_connectWidget;
};
#endif // CONNECTIONDIALOG_H

149
connectionwidget.ui Normal file
View File

@@ -0,0 +1,149 @@
<ui version="4.0" >
<class>ConnectionWidget</class>
<widget class="QWidget" name="ConnectionWidget" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>500</width>
<height>212</height>
</rect>
</property>
<layout class="QHBoxLayout" >
<item>
<widget class="QLabel" name="pixmapLabel" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize" >
<size>
<width>128</width>
<height>128</height>
</size>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" >
<item>
<widget class="QLabel" name="TextLabel5" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Minimum" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font" >
<font>
<pointsize>13</pointsize>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text" >
<string>Attention</string>
</property>
<property name="wordWrap" >
<bool>false</bool>
</property>
<property name="indent" >
<number>0</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="mainTextLabel" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="lineWidth" >
<number>-1</number>
</property>
<property name="midLineWidth" >
<number>5</number>
</property>
<property name="text" >
<string>Somebody is requesting a connection to your computer. Granting this will allow the remote user to watch your desktop. </string>
</property>
<property name="textFormat" >
<enum>Qt::AutoText</enum>
</property>
<property name="alignment" >
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="wordWrap" >
<bool>true</bool>
</property>
<property name="margin" >
<number>0</number>
</property>
<property name="indent" >
<number>0</number>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" >
<item>
<widget class="QLabel" name="TextLabel1" >
<property name="font" >
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text" >
<string>Remote system:</string>
</property>
<property name="wordWrap" >
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="remoteHost" >
<property name="font" >
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text" >
<string>123.234.123.234</string>
</property>
<property name="wordWrap" >
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QCheckBox" name="cbAllowRemoteControl" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Minimum" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="whatsThis" >
<string>If you turn this option on, the remote user can enter keystrokes and use your mouse pointer. This gives them full control over your computer, so be careful. When the option is disabled the remote user can only watch your screen.</string>
</property>
<property name="text" >
<string>Allow remote user to &amp;control keyboard and mouse</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

2
doc/CMakeLists.txt Normal file
View File

@@ -0,0 +1,2 @@
########### install files ###############
kde4_create_handbook(index.docbook INSTALL_DESTINATION ${HTML_INSTALL_DIR}/en)

View File

@@ -1,4 +0,0 @@
KDE_LANG = en
KDE_DOCS = AUTO

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 39 KiB

15
doc/index.docbook Executable file → Normal file
View File

@@ -25,9 +25,8 @@ as Authors, publish date, the abstract, and Keywords -->
&Brad.Hards;
&Brad.Hards.mail;
</author>
</authorgroup>
<!-- TRANS:ROLES_OF_TRANSLATORS -->
</authorgroup>
<copyright>
<year>2003</year>
@@ -113,7 +112,7 @@ to help you perform a task.
<para>
Please report any problems or feature requests to the &kde; mailing
lists or file a bug at <ulink
url="http://bugs.kde.org">http://www.bugs.kde.org</ulink>.
url="http://bugs.kde.org">http://bugs.kde.org</ulink>.
</para>
</chapter>
@@ -140,7 +139,7 @@ the frame-buffer level, which roughly corresponds to the rendered
screen image, which means that it can be applied to all windowing
systems (including X11, &MacOS; and &Microsoft; &Windows;). Remote
Frame Buffer applications exist for many platforms, and can often be
free re-distributed.
freely re-distributed.
</para>
<para>
@@ -369,10 +368,10 @@ as &krdc;.
</para>
<para>
The <guilabel>Allow uninvited connections</guilabel> checkbox controls
The <guilabel>Allow uninvited connections</guilabel> check box controls
whether &krfb; allows connection without an invitation. If uninvited
connections are allowed, then you should probably specify a
password. You can also use the checkboxes here to choose whether you
password. You can also use the check boxes here to choose whether you
have to confirm the connection before it proceeds, and whether the
person connecting can control the desktop, or only view.
</para>
@@ -397,7 +396,7 @@ password is securely guarded.
<para>
&krfb; allows you to control whether the background image is passed to
the client, or not. This is controlled using a checkbox in the
the client, or not. This is controlled using a check box in the
<guilabel>Session</guilabel> tab, as shown below.
</para>
@@ -493,7 +492,7 @@ Connection</guibutton>, then the attempt to connect will be terminated.
<para>
The <guilabel>Allow remote user to control keyboard and
mouse</guilabel> checkbox determines whether this client can only
mouse</guilabel> check box determines whether this client can only
observe, or can take control of your machine.
</para>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 79 KiB

197
events.cpp Normal file
View File

@@ -0,0 +1,197 @@
/* This file is part of the KDE project
Copyright (C) 2007 Alessandro Praduroux <pradu@pradu.it>
(C) 2001-2003 by Tim Jansen <tim@tjansen.de>
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 "events.h"
#include <QApplication>
#include <QX11Info>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <X11/extensions/XTest.h>
Display *KeyboardEvent::dpy;
signed char KeyboardEvent::modifiers[0x100];
KeyCode KeyboardEvent::keycodes[0x100];
KeyCode KeyboardEvent::leftShiftCode;
KeyCode KeyboardEvent::rightShiftCode;
KeyCode KeyboardEvent::altGrCode;
const int KeyboardEvent::LEFTSHIFT = 1;
const int KeyboardEvent::RIGHTSHIFT = 2;
const int KeyboardEvent::ALTGR = 4;
char KeyboardEvent::ModifierState;
bool KeyboardEvent::initDone = false;
KeyboardEvent::KeyboardEvent(bool d, KeySym k)
: down(d), keySym(k)
{
initKeycodes();
}
void KeyboardEvent::initKeycodes()
{
if (initDone) return;
initDone = true;
KeySym key,*keymap;
int i,j,minkey,maxkey,syms_per_keycode;
dpy = QX11Info::display();
memset(modifiers,-1,sizeof(modifiers));
XDisplayKeycodes(dpy,&minkey,&maxkey);
Q_ASSERT(minkey >= 8);
Q_ASSERT(maxkey < 256);
keymap = (KeySym*) XGetKeyboardMapping(dpy, minkey,
(maxkey - minkey + 1),
&syms_per_keycode);
Q_ASSERT(keymap);
for (i = minkey; i <= maxkey; i++) {
for (j=0; j<syms_per_keycode; j++) {
key = keymap[(i-minkey)*syms_per_keycode+j];
if (key>=' ' && key<0x100 && i==XKeysymToKeycode(dpy,key)) {
keycodes[key]=i;
modifiers[key]=j;
}
}
}
leftShiftCode = XKeysymToKeycode(dpy, XK_Shift_L);
rightShiftCode = XKeysymToKeycode(dpy, XK_Shift_R);
altGrCode = XKeysymToKeycode(dpy, XK_Mode_switch);
XFree ((char *)keymap);
}
/* this function adjusts the modifiers according to mod (as from modifiers) and ModifierState */
void KeyboardEvent::tweakModifiers(signed char mod, bool down)
{
bool isShift = ModifierState & (LEFTSHIFT|RIGHTSHIFT);
if(mod < 0)
return;
if(isShift && mod != 1) {
if(ModifierState & LEFTSHIFT) {
XTestFakeKeyEvent(dpy, leftShiftCode,
!down, CurrentTime);
}
if(ModifierState & RIGHTSHIFT) {
XTestFakeKeyEvent(dpy, rightShiftCode,
!down, CurrentTime);
}
}
if(!isShift && mod==1) {
XTestFakeKeyEvent(dpy, leftShiftCode,
down, CurrentTime);
}
if((ModifierState&ALTGR) && mod != 2) {
XTestFakeKeyEvent(dpy, altGrCode,
!down, CurrentTime);
}
if(!(ModifierState&ALTGR) && mod==2) {
XTestFakeKeyEvent(dpy, altGrCode,
down, CurrentTime);
}
}
void KeyboardEvent::exec() {
#define ADJUSTMOD(sym,state) \
if(keySym==sym) { if(down) ModifierState|=state; else ModifierState&=~state; }
ADJUSTMOD(XK_Shift_L,LEFTSHIFT);
ADJUSTMOD(XK_Shift_R,RIGHTSHIFT);
ADJUSTMOD(XK_Mode_switch,ALTGR);
if(keySym>=' ' && keySym<0x100) {
KeyCode k;
if (down) {
tweakModifiers(modifiers[keySym],True);
}
k = keycodes[keySym];
if (k != NoSymbol) {
XTestFakeKeyEvent(dpy, k, down, CurrentTime);
}
if (down) {
tweakModifiers(modifiers[keySym],False);
}
} else {
KeyCode k = XKeysymToKeycode(dpy, keySym );
if (k != NoSymbol) {
XTestFakeKeyEvent(dpy, k, down, CurrentTime);
}
}
}
bool PointerEvent::initialized = false;
Display *PointerEvent::dpy;
int PointerEvent::buttonMask = 0;
PointerEvent::PointerEvent(int b, int _x, int _y)
: button_mask(b),x(_x),y(_y)
{
if (!initialized) {
initialized = true;
dpy = QX11Info::display();
buttonMask = 0;
}
}
void PointerEvent::exec() {
QDesktopWidget *desktopWidget = QApplication::desktop();
int screen = desktopWidget->screenNumber();
if (screen < 0)
screen = 0;
XTestFakeMotionEvent(dpy, screen, x, y, CurrentTime);
for(int i = 0; i < 5; i++) {
if ((buttonMask&(1<<i))!=(button_mask&(1<<i))) {
XTestFakeButtonEvent(dpy,
i+1,
(button_mask&(1<<i))?True:False,
CurrentTime);
}
}
buttonMask = button_mask;
}
ClipboardEvent::ClipboardEvent(ConnectionController *c, const QString &ctext)
:controller(c),text(ctext)
{
}
void ClipboardEvent::exec()
{
#if 0
if ((controller->lastClipboardDirection == ConnectionController::LAST_SYNC_TO_CLIENT) &&
(controller->lastClipboardText == text)) {
return;
}
controller->lastClipboardDirection = ConnectionController::LAST_SYNC_TO_SERVER;
controller->lastClipboardText = text;
controller->clipboard->setText(text, QClipboard::Clipboard);
controller->clipboard->setText(text, QClipboard::Selection);
#endif
}
VNCEvent::~ VNCEvent()
{
}

70
events.h Normal file
View File

@@ -0,0 +1,70 @@
/* This file is part of the KDE project
Copyright (C) 2007 Alessandro Praduroux <pradu@pradu.it>
(C) 2001-2003 by Tim Jansen <tim@tjansen.de>
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 EVENTS_H
#define EVENTS_H
#include <QDesktopWidget>
#include <QEvent>
#include <QString>
#include <X11/Xlib.h>
class ConnectionController;
class QCursor;
class VNCEvent {
public:
virtual void exec() = 0;
virtual ~VNCEvent();
};
class KeyboardEvent : public VNCEvent {
bool down;
KeySym keySym;
static Display *dpy;
static signed char modifiers[0x100];
static KeyCode keycodes[0x100], leftShiftCode, rightShiftCode, altGrCode;
static const int LEFTSHIFT;
static const int RIGHTSHIFT;
static const int ALTGR;
static char ModifierState;
static bool initDone;
static void tweakModifiers(signed char mod, bool down);
public:
static void initKeycodes();
KeyboardEvent(bool d, KeySym k);
virtual void exec();
};
class PointerEvent : public VNCEvent {
int button_mask, x, y;
static bool initialized;
static Display *dpy;
static int buttonMask;
public:
PointerEvent(int b, int _x, int _y);
virtual void exec();
};
class ClipboardEvent : public VNCEvent {
ConnectionController *controller;
QString text;
public:
ClipboardEvent(ConnectionController *c, const QString &text);
virtual void exec();
};
#endif

96
framebuffer.cpp Normal file
View File

@@ -0,0 +1,96 @@
/* This file is part of the KDE project
Copyright (C) 2007 Alessandro Praduroux <pradu@pradu.it>
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 "framebuffer.h"
#include "framebuffer.moc"
#include <config-krfb.h>
#include <QX11Info>
#include "qtframebuffer.h"
#include "x11framebuffer.h"
#include <X11/Xutil.h>
#ifdef HAVE_XDAMAGE
#include <X11/extensions/Xdamage.h>
#endif
FrameBuffer::FrameBuffer(WId id, QObject *parent)
: QObject(parent), win(id)
{
//TODO: implement reference counting to avoid update the screen
// while no client is connected.
}
FrameBuffer::~FrameBuffer()
{
delete fb;
}
char * FrameBuffer::data()
{
return fb;
}
QList< QRect > FrameBuffer::modifiedTiles()
{
QList<QRect> ret = tiles;
tiles.clear();
return ret;
}
int FrameBuffer::width()
{
return 0;
}
int FrameBuffer::height()
{
return 0;
}
void FrameBuffer::getServerFormat(rfbPixelFormat &)
{
}
int FrameBuffer::depth()
{
return 32;
}
FrameBuffer * FrameBuffer::getFrameBuffer(WId id, QObject * parent)
{
#ifdef HAVE_XDAMAGE
int tmp, er;
if (XDamageQueryExtension(QX11Info::display(), &tmp, &er)) {
return new X11FrameBuffer(id, parent);
}
#endif
return new QtFrameBuffer(id, parent);
}
int FrameBuffer::paddedWidth()
{
return width() * depth() / 8;
}
void FrameBuffer::startMonitor()
{
}
void FrameBuffer::stopMonitor()
{
}

54
framebuffer.h Normal file
View File

@@ -0,0 +1,54 @@
/* This file is part of the KDE project
Copyright (C) 2007 Alessandro Praduroux <pradu@pradu.it>
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 FRAMEBUFFER_H
#define FRAMEBUFFER_H
#include <QObject>
#include <QRect>
#include <QList>
#include <QWidget>
#include <rfb/rfb.h>
class FrameBuffer;
/**
@author Alessandro Praduroux <pradu@pradu.it>
*/
class FrameBuffer : public QObject
{
Q_OBJECT
public:
static FrameBuffer* getFrameBuffer(WId id, QObject *parent);
virtual ~FrameBuffer();
char * data();
virtual QList<QRect> modifiedTiles();
virtual int paddedWidth();
virtual int width();
virtual int height();
virtual int depth();
virtual void startMonitor();
virtual void stopMonitor();
virtual void getServerFormat(rfbPixelFormat &format);
protected:
explicit FrameBuffer(WId id, QObject *parent = 0);
WId win;
char *fb;
QList<QRect> tiles;
};
#endif

103
invitation.cpp Normal file
View File

@@ -0,0 +1,103 @@
/***************************************************************************
Copyright 2002 Tim Jansen <tim@tjansen.de>
Copyright 2002 Stefan Taferner <taferner@kde.org>
***************************************************************************/
/***************************************************************************
* *
* 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 "invitation.h"
#include <KConfigGroup>
#include <KDebug>
#include <KRandom>
#include <KStringHandler>
// a random string that doesn't contain i, I, o, O, 1, 0
// based on KRandom::randomString()
static QString readableRandomString(int length) {
QString str;
while (length)
{
int r = KRandom::random() % 62;
r += 48;
if (r > 57)
r += 7;
if (r > 90)
r += 6;
char c = char(r);
if ((c == 'i') ||
(c == 'I') ||
(c == '1') ||
(c == 'o') ||
(c == 'O') ||
(c == '0'))
continue;
str += c;
length--;
}
return str;
}
Invitation::Invitation()
{
m_password = readableRandomString(4)+'-'+readableRandomString(3);
m_creationTime = QDateTime::currentDateTime();
m_expirationTime = QDateTime::currentDateTime().addSecs(INVITATION_DURATION);
}
Invitation::Invitation(const Invitation &x)
: m_password(x.m_password), m_creationTime(x.m_creationTime), m_expirationTime(x.m_expirationTime)
{
}
Invitation::Invitation(const KConfigGroup &config) {
m_password = KStringHandler::obscure(config.readEntry("password", QString()));
kDebug() << "read: " << config.readEntry("password", QString()) << " = " << m_password;
m_creationTime = config.readEntry("creation", QDateTime());
m_expirationTime = config.readEntry("expiration", QDateTime());
}
Invitation::~Invitation() {
}
Invitation &Invitation::operator= (const Invitation&x) {
m_password = x.m_password;
m_creationTime = x.m_creationTime;
m_expirationTime = x.m_expirationTime;
return *this;
}
void Invitation::save(KConfigGroup &config) const
{
config.writeEntry("password", KStringHandler::obscure(m_password));
config.writeEntry("creation", m_creationTime);
config.writeEntry("expiration", m_expirationTime);
}
QString Invitation::password() const {
return m_password;
}
QDateTime Invitation::expirationTime() const {
return m_expirationTime;
}
QDateTime Invitation::creationTime() const {
return m_creationTime;
}
bool Invitation::isValid() const {
return m_expirationTime > QDateTime::currentDateTime();
}
bool Invitation::operator ==(const Invitation & ot)
{
return m_creationTime == ot.m_creationTime && m_password == ot.m_password;
}

View File

@@ -18,40 +18,36 @@
#ifndef INVITATION_H
#define INVITATION_H
#include <kapplication.h>
#include <klistview.h>
#include <kconfig.h>
#include <qobject.h>
#include <qstring.h>
#include <qdatetime.h>
#include <KApplication>
#include <KConfig>
#include <QObject>
#include <QDateTime>
const int INVITATION_DURATION = 60*60;
QString cryptStr(const QString &aStr);
class Invitation {
public:
Invitation();
~Invitation();
Invitation(KConfig* config, int num);
Invitation(const KConfigGroup &config);
Invitation(const Invitation &x);
Invitation &operator= (const Invitation&x);
bool operator == (const Invitation &ot);
QString password() const;
QDateTime expirationTime() const;
QDateTime creationTime() const;
bool isValid() const;
void setViewItem(KListViewItem*);
KListViewItem* getViewItem() const;
void save(KConfig *config, int num) const;
void save(KConfigGroup &config) const;
private:
QString m_password;
QDateTime m_creationTime;
QDateTime m_expirationTime;
KListViewItem *m_viewItem;
};
#endif

123
invitationmanager.cpp Normal file
View File

@@ -0,0 +1,123 @@
/* This file is part of the KDE project
Copyright (C) 2007 Alessandro Praduroux <pradu@pradu.it>
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 "invitationmanager.h"
#include "invitationmanager.moc"
#include <KConfigGroup>
#include <KConfig>
#include <KGlobal>
#include <QTimer>
class InvitationManagerPrivate
{
public:
InvitationManager instance;
};
K_GLOBAL_STATIC(InvitationManagerPrivate, invitationManagerPrivate)
InvitationManager * InvitationManager::self() {
return &invitationManagerPrivate->instance;
}
InvitationManager::InvitationManager()
{
loadInvitations();
QTimer *refreshTimer = new QTimer(this);
connect(refreshTimer, SIGNAL(timeout()), SLOT(loadInvitations()));
refreshTimer->start(1000*60);
}
InvitationManager::~InvitationManager()
{
}
void InvitationManager::invalidateOldInvitations() {
int invNum = invitationList.size();
while(invNum--) {
if (!invitationList[invNum].isValid()) {
invitationList.removeAt(invNum);
}
}
saveInvitations();
}
void InvitationManager::loadInvitations()
{
int invNum = invitationList.size();
KSharedConfigPtr conf = KGlobal::config();
KConfigGroup invitationConfig(conf, "Invitations");
int numInv = invitationConfig.readEntry("invitation_num",0);
invitationList.clear();
for (int i = 0; i < numInv; i++) {
KConfigGroup ic(conf, QString("Invitation_%1").arg(i));
invitationList.append(Invitation(ic));
}
invalidateOldInvitations();
if (numInv != invNum) {
emit invitationNumChanged(invitationList.size());
}
}
Invitation InvitationManager::addInvitation()
{
Invitation i;
invitationList.append(i);
emit invitationNumChanged(invitationList.size());
saveInvitations();
return i;
}
const QList< Invitation > & InvitationManager::invitations()
{
return invitationList;
}
void InvitationManager::saveInvitations()
{
KSharedConfigPtr conf = KGlobal::config();
KConfigGroup invitationConfig(conf, "Invitations");
int invNum = invitationList.size();
invitationConfig.writeEntry("invitation_num",invNum);
for (int i = 0; i < invNum; i++) {
KConfigGroup ic(conf, QString("Invitation_%1").arg(i));
invitationList[i].save(ic);
}
conf->sync();
}
int InvitationManager::activeInvitations()
{
invalidateOldInvitations();
return invitationList.size();
}
void InvitationManager::removeInvitation(const Invitation & inv)
{
invitationList.removeAll(inv);
saveInvitations();
emit invitationNumChanged(invitationList.size());
}
void InvitationManager::removeAllInvitations()
{
invitationList.clear();
saveInvitations();
emit invitationNumChanged(invitationList.size());
}

58
invitationmanager.h Normal file
View File

@@ -0,0 +1,58 @@
/* This file is part of the KDE project
Copyright (C) 2007 Alessandro Praduroux <pradu@pradu.it>
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 INVITATIONMANAGER_H
#define INVITATIONMANAGER_H
#include <QObject>
#include <QList>
#include "invitation.h"
class InvitationManagerPrivate;
/**
@author Alessandro Praduroux <pradu@pradu.it>
*/
class InvitationManager : public QObject
{
Q_OBJECT
friend class InvitationManagerPrivate;
public:
static InvitationManager *self();
~InvitationManager();
Invitation addInvitation();
int activeInvitations();
void removeInvitation(const Invitation &inv);
void removeAllInvitations();
const QList<Invitation> &invitations();
signals:
void invitationNumChanged(int);
public Q_SLOTS:
void loadInvitations();
void saveInvitations();
private:
void invalidateOldInvitations();
InvitationManager();
static InvitationManager *_self;
QList<Invitation> invitationList;
};
#endif

87
invitedialog.cpp Normal file
View File

@@ -0,0 +1,87 @@
/* This file is part of the KDE project
Copyright (C) 2004 Nadeem Hasan <nhasan@kde.org>
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.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "invitedialog.h"
#include <kiconloader.h>
#include <klocale.h>
#include <KStandardGuiItem>
#include <QtGui/QLabel>
#include <QtGui/QPushButton>
#include <QtGui/QToolTip>
#include <QtGui/QCursor>
InviteDialog::InviteDialog( QWidget *parent )
: KDialog( parent )
{
setCaption(i18n("Invitation"));
setButtons(User1|Close|Help);
setHelp(QString(), "krfb");
setDefaultButton(NoDefault);
setMinimumSize(500, 300);
m_inviteWidget = new QWidget( this );
setupUi(m_inviteWidget);
pixmapLabel->setPixmap(KIcon("krfb").pixmap(128));
setMainWidget( m_inviteWidget );
setButtonGuiItem( User1, KStandardGuiItem::configure() );
connect( btnCreateInvite, SIGNAL( clicked() ),
SIGNAL( createInviteClicked() ) );
connect( btnEmailInvite, SIGNAL( clicked() ),
SIGNAL( emailInviteClicked() ) );
connect( btnManageInvite, SIGNAL( clicked() ),
SIGNAL( manageInviteClicked() ) );
connect( helpLabel, SIGNAL( linkActivated ( QString ) ),
SLOT( showWhatsthis() ));
}
void InviteDialog::slotUser1()
{
emit configureClicked();
}
void InviteDialog::enableInviteButton( bool enable )
{
btnCreateInvite->setEnabled( enable );
}
void InviteDialog::setInviteCount( int count )
{
btnManageInvite->setText(
i18n( "&Manage Invitations (%1)...", count ) );
}
void InviteDialog::showWhatsthis()
{
QToolTip::showText(QCursor::pos(),
i18n("An invitation creates a one-time password that allows the receiver to connect to your desktop.\n"
"It is valid for only one successful connection and will expire after an hour if it has not been used. \n"
"When somebody connects to your computer a dialog will appear and ask you for permission.\n "
"The connection will not be established before you accept it. In this dialog you can also\n restrict "
"the other person to view your desktop only, without the ability to move your\n mouse pointer or press "
"keys.\nIf you want to create a permanent password for Desktop Sharing, allow 'Uninvited Connections' \n"
"in the configuration."));
}
#include "invitedialog.moc"

57
invitedialog.h Normal file
View File

@@ -0,0 +1,57 @@
/* This file is part of the KDE project
Copyright (C) 2004 Nadeem Hasan <nhasan@kde.org>
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.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef INVITEDIALOG_H
#define INVITEDIALOG_H
#include "ui_invitewidget.h"
#include <KDialog>
class QWidget;
class InviteDialog : public KDialog, public Ui::InviteWidget
{
Q_OBJECT
public:
InviteDialog( QWidget *parent );
~InviteDialog() {}
void enableInviteButton( bool enable );
public Q_SLOTS:
void setInviteCount( int count );
void showWhatsthis();
signals:
void createInviteClicked();
void emailInviteClicked();
void manageInviteClicked();
void configureClicked();
protected Q_SLOTS:
void slotUser1();
protected:
QWidget *m_inviteWidget;
};
#endif // INVITEDIALOG_H

171
invitewidget.ui Normal file
View File

@@ -0,0 +1,171 @@
<ui version="4.0" >
<class>InviteWidget</class>
<widget class="QWidget" name="InviteWidget" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>603</width>
<height>364</height>
</rect>
</property>
<layout class="QHBoxLayout" >
<item>
<widget class="QLabel" name="pixmapLabel" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize" >
<size>
<width>128</width>
<height>128</height>
</size>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" >
<item>
<widget class="QLabel" name="TextLabel2" >
<property name="font" >
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text" >
<string>Welcome to KDE Desktop Sharing</string>
</property>
<property name="wordWrap" >
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="helpLabel" >
<property name="text" >
<string>KDE Desktop Sharing allows you to invite somebody at a remote location to watch and possibly control your desktop. &lt;a href="whatsthis">More about invitations...&lt;/a></string>
</property>
<property name="textFormat" >
<enum>Qt::RichText</enum>
</property>
<property name="wordWrap" >
<bool>true</bool>
</property>
<property name="textInteractionFlags" >
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::NoTextInteraction</set>
</property>
</widget>
</item>
<item>
<spacer>
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::MinimumExpanding</enum>
</property>
<property name="sizeHint" >
<size>
<width>215</width>
<height>101</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" >
<item>
<spacer>
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" >
<size>
<width>90</width>
<height>26</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QVBoxLayout" >
<item>
<widget class="QPushButton" name="btnCreateInvite" >
<property name="toolTip" >
<string/>
</property>
<property name="whatsThis" >
<string>Create a new invitation and display the connection data. Use this option if you want to invite somebody personally, for example, to give the connection data over the phone.</string>
</property>
<property name="text" >
<string>Create &amp;Personal Invitation...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnEmailInvite" >
<property name="whatsThis" >
<string>This button will start your email application with a pre-configured text that explains to the recipient how to connect to your computer. </string>
</property>
<property name="text" >
<string>Invite via &amp;Email...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnManageInvite" >
<property name="text" >
<string>&amp;Manage Invitations (%1)...</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer>
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" >
<size>
<width>90</width>
<height>26</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<spacer>
<property name="orientation" >
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType" >
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" >
<size>
<width>20</width>
<height>24</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

17
kcm_krfb/CMakeLists.txt Normal file
View File

@@ -0,0 +1,17 @@
include_directories(${CMAKE_BINARY_DIR}/krfb/krfb/ ${CMAKE_SOURCE_DIR}/krfb/srvloc/)
set(kcm_krfb_PART_SRCS kcm_krfb.cpp ${srvloc_SRCS} ${krfbconfig_SRCS})
kde4_add_ui3_files(kcm_krfb_PART_SRCS configurationwidget.ui)
kde4_add_ui3_files(kcm_krfb_PART_SRCS
${CMAKE_SOURCE_DIR}/krfb/krfb/manageinvitations.ui
${CMAKE_SOURCE_DIR}/krfb/krfb/personalinvitewidget.ui
${CMAKE_SOURCE_DIR}/krfb/krfb/invitewidget.ui)
kde4_add_plugin(kcm_krfb ${kcm_krfb_PART_SRCS})
target_link_libraries(kcm_krfb ${KDE4_KDECORE_LIBS} ${KDE4_KDE3SUPPORT_LIBS} ${SLP_LIBRARIES})
install(TARGETS kcm_krfb DESTINATION ${PLUGIN_INSTALL_DIR})
install( FILES kcmkrfb.desktop DESTINATION ${SERVICES_INSTALL_DIR})

View File

@@ -1,20 +0,0 @@
METASOURCES = AUTO
# Code
kde_module_LTLIBRARIES = kcm_krfb.la
kcm_krfb_la_SOURCES = configurationwidget.ui kcm_krfb.cpp
kcm_krfb_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module
kcm_krfb_la_LIBADD = ../krfb/libkrfbconfig.la $(LIB_KDEUI)
# Services
xdg_apps_DATA = kcmkrfb.desktop
EXTRA_DIST = $(kcm_krfb_la_SOURCES)\
$(xdg_apps_DATA)
# set the include path for X, qt and KDE
INCLUDES= -I../krfb $(all_includes)
messages: rc.cpp
$(XGETTEXT) *.cpp *.h -o $(podir)/kcm_krfb.pot

2
kcm_krfb/Messages.sh Normal file
View File

@@ -0,0 +1,2 @@
#! /bin/sh
$XGETTEXT *.cpp -o $podir/kcm_krfb.pot

View File

@@ -50,12 +50,6 @@
<property name="name">
<cstring>GroupBox1</cstring>
</property>
<property name="frameShape">
<enum>Box</enum>
</property>
<property name="frameShadow">
<enum>Sunken</enum>
</property>
<property name="title">
<string>Invitations</string>
</property>
@@ -420,10 +414,10 @@
<property name="value">
<number>5900</number>
</property>
<property name="minValue">
<property name="minimum">
<number>1024</number>
</property>
<property name="maxValue">
<property name="maximum">
<number>32767</number>
</property>
<property name="toolTip" stdset="0">
@@ -501,7 +495,13 @@ Most VNC clients use a display number instead of the actual port. This display n
<tabstop>passwordInput</tabstop>
<tabstop>portInput</tabstop>
</tabstops>
<layoutdefaults spacing="6" margin="11"/>
<customwidgets>
<customwidget>
<class>KIntNumInput</class>
<header location="global">knuminput.h</header>
<container>0</container>
</customwidget>
</customwidgets>
<includehints>
<includehint>knuminput.h</includehint>
<includehint>knuminput.h</includehint>

View File

@@ -25,50 +25,45 @@
#include <qradiobutton.h>
#include <qlineedit.h>
#include <qbuttongroup.h>
#include <qcstring.h>
#include <qdatastream.h>
#include <kapplication.h>
#include <kdialog.h>
#include <knuminput.h>
#include <klocale.h>
#include <kaboutdata.h>
#include <kconfig.h>
#include <kgenericfactory.h>
#include <kdatastream.h>
#include <kdebug.h>
#include <dcopclient.h>
#include <QDBusInterface>
#include <QDBusReply>
#define VERSION "0.7"
typedef KGenericFactory<KcmKRfb, QWidget> KcmKRfbFactory;
// Can't use K_EXPORT_COMPONENT_FACTORY, since insertCatalogue necessary
extern "C" {
void *init_kcm_krfb() {
KGlobal::locale()->insertCatalogue("krfb"); // For invitation translations
return new KcmKRfbFactory("kcm_krfb");
}
}
K_EXPORT_COMPONENT_FACTORY( krfb, KcmKRfbFactory( "kcm_krfb" ) )
KcmKRfb::KcmKRfb(QWidget *p, const char *name, const QStringList &) :
KCModule(KcmKRfbFactory::instance(), p, name),
KcmKRfb::KcmKRfb(QWidget *p, const QStringList &) :
KCModule(KcmKRfbFactory::componentData(), p),
m_configuration(KRFB_CONFIGURATION_MODE) {
KGlobal::locale()->insertCatalog("krfb");
m_confWidget = new ConfigurationWidget(this);
QVBoxLayout *l = new QVBoxLayout(this, 0, KDialog::spacingHint());
QVBoxLayout *l = new QVBoxLayout(this);
l->setSpacing(KDialog::spacingHint());
l->setMargin(0);
l->add(m_confWidget);
setButtons(Default|Apply|Reset);
setButtons(Default|Apply|Default);
m_about = new KAboutData( "kcm_krfb", I18N_NOOP("Desktop Sharing Control Module"),
KAboutData* about = new KAboutData( "kcm_krfb", 0, ki18n("Desktop Sharing Control Module"),
VERSION,
I18N_NOOP("Configure desktop sharing"), KAboutData::License_GPL,
"(c) 2002, Tim Jansen\n",
0, "http://www.tjansen.de/krfb", "tim@tjansen.de");
m_about->addAuthor("Tim Jansen", 0, "tim@tjansen.de");
ki18n("Configure desktop sharing"), KAboutData::License_GPL,
ki18n("(c) 2002, Tim Jansen\n"),
KLocalizedString(), "http://www.tjansen.de/krfb", "tim@tjansen.de");
about->addAuthor(ki18n("Tim Jansen"), KLocalizedString(), "tim@tjansen.de");
setAboutData( about );
load();
@@ -86,9 +81,6 @@ KcmKRfb::KcmKRfb(QWidget *p, const char *name, const QStringList &) :
setInvitationNum(m_configuration.invitations().size());
connect(m_confWidget->disableBackgroundCB, SIGNAL(clicked()), SLOT(configChanged()) );
}
KcmKRfb::~KcmKRfb() {
delete m_about;
}
void KcmKRfb::configChanged() {
emit changed(true);
@@ -98,28 +90,19 @@ void KcmKRfb::setInvitationNum(int num) {
if (num == 0)
m_confWidget->invitationNumLabel->setText(i18n("You have no open invitation."));
else
m_confWidget->invitationNumLabel->setText(i18n("Open invitations: %1").arg(num));
m_confWidget->invitationNumLabel->setText(i18n("Open invitations: %1", num));
}
void KcmKRfb::checkKInetd(bool &kinetdAvailable, bool &krfbAvailable) {
kinetdAvailable = false;
krfbAvailable = false;
DCOPClient *d = KApplication::dcopClient();
QByteArray sdata, rdata;
QCString replyType;
QDataStream arg(sdata, IO_WriteOnly);
arg << QString("krfb");
if (!d->call ("kded", "kinetd", "isInstalled(QString)", sdata, replyType, rdata))
return;
if (replyType != "bool")
return;
QDataStream answer(rdata, IO_ReadOnly);
answer >> krfbAvailable;
kinetdAvailable = true;
//TODO verify it when kinetd will port
QDBusInterface kinetd("org.kde.kded", "/modules/kinetd", "org.kde.kinetd");
QDBusReply<bool> reply = kinetd.call("isInstalled","krfb");
if(!reply.isValid())
return;
krfbAvailable = reply;
kinetdAvailable=true;
}
void KcmKRfb::load() {
@@ -153,6 +136,9 @@ void KcmKRfb::save() {
m_configuration.setPreferredPort(m_confWidget->portInput->value());
m_configuration.setDisableBackground(m_confWidget->disableBackgroundCB->isChecked());
m_configuration.save();
#if 0
kapp->dcopClient()->emitDCOPSignal("KRFB::ConfigChanged", "KRFB_ConfigChanged()", QByteArray());
#endif
emit changed(false);
}
@@ -171,11 +157,6 @@ void KcmKRfb::defaults() {
emit changed(true);
}
const KAboutData *KcmKRfb::aboutData() const
{
return m_about;
}
QString KcmKRfb::quickHelp() const
{
return i18n("<h1>Desktop Sharing</h1> This module allows you to configure"

View File

@@ -21,7 +21,9 @@
#include <qobject.h>
#include <qdatetime.h>
#define KDE3_SUPPORT
#include <kcmodule.h>
#undef KDE3_SUPPORT
#include "configurationwidget.h"
#include "../krfb/configuration.h"
@@ -30,17 +32,14 @@ class KcmKRfb : public KCModule {
private:
Configuration m_configuration;
ConfigurationWidget *m_confWidget;
KAboutData *m_about;
void checkKInetd(bool&, bool&);
public:
KcmKRfb(QWidget *p, const char *name, const QStringList &);
~KcmKRfb();
KcmKRfb(QWidget *p, const QStringList &);
void load();
void save();
void defaults();
QString quickHelp() const;
const KAboutData *aboutData() const;
private slots:
void setInvitationNum(int num);
void configChanged();

View File

@@ -1,141 +1,186 @@
[Desktop Entry]
Encoding=UTF-8
Icon=krfb
Type=Application
Exec=kcmshell kcmkrfb
DocPath=help:/krfb/krfb-configuration.html
Exec=kcmshell4 kcmkrfb
Type=Service
X-DocPath=krfb/krfb-configuration.html
X-KDE-ServiceTypes=KCModule
X-KDE-ModuleType=Library
X-KDE-Library=krfb
X-KDE-Library=kcm_krfb
X-KDE-Factoryname=krfb
X-KDE-ParentApp=kcontrol
Name=Desktop Sharing
Name[af]=Werkskerm Deeling
Name[ar]=مشاركة سطح المكتب
Name[bg]=Споделяне на работно място
Name[bs]=Dijeljenje desktopa
Name[bg]=Споделяне на работното място
Name[bn]=ডেস্কটপ ভাগাভাগি
Name[br]=Rannañ ar vurev
Name[ca]=Compartició de l'escriptori
Name[cs]=Sdílení pracovní plochy
Name[cy]=Rhannu Penbwrdd
Name[da]=Skrivebordsdeling
Name[de]=Arbeitsfläche freigeben
Name[el]=Μοίρασμα επιφάνειας εργασίας
Name[eo]=Tabuloj komunaj
Name[es]=Compartición de escritorio
Name[da]=Desktopdeling
Name[de]=Arbeitsflächen-Freigabe
Name[el]=Κοινή χρήση επιφάνειας εργασίας
Name[eo]=Tabula komunigado
Name[es]=Escritorio compartido
Name[et]=Töölaua jagamine
Name[eu]=Mahaigain partekatzea
Name[fa]=اشتراک رومیزی
Name[fi]=Työpöydän jakaminen
Name[fr]=Partage de bureau
Name[gl]=Compartición do escritorio
Name[ga]=Roinnt Deisce
Name[gl]=Compartilla do escritorio
Name[he]=שיתוף שולחנות עבודה
Name[hi]=डेस्कटॉप साझ
Name[hi]=डेस्कटॉप साझेदारी
Name[hne]=डेस्कटाप साझेदारी
Name[hr]=Dijeljenje radne površine
Name[hu]=Munkaasztal-megosztás
Name[it]=Condivisione Desktop
Name[is]=Skjáborðamiðlun
Name[it]=Condivisione desktop
Name[ja]=デスクトップ共有
Name[kk]=Үстелді ортақтастыру
Name[km]=ការ​ចែក​រំលែក​ផ្ទៃ​តុ
Name[ko]=데스크톱 공유
Name[lt]=Dalinimasis darbastaliu
Name[mn]=Ажлын байрыг хамтран эзэмших
Name[lv]=Darbvirsmas koplietošana
Name[mk]=Делење на работната површина
Name[ml]=പണിയിടം പങ്കുവെക്കല്‍
Name[ms]=Perkongsian Ruang Kerja
Name[mt]=Qsim tad-desktop
Name[nb]=Delte skrivebord
Name[nl]=Bureaubladvrijgave
Name[nds]=Schriefdisch-Freegaav
Name[ne]=डेस्कटप साझेदारी
Name[nl]=Bureaublad delen
Name[nn]=Skrivebordsdeling
Name[nso]=Kabagano ya Desktop
Name[pa]=ਡੈਸਕਟਾਪ ਸ਼ੇਅਰਿੰਗ
Name[pl]=Współdzielenie pulpitu
Name[pt]=Partilha do Ambiente de Trabalho
Name[pt]=Partilha do Ecrã
Name[pt_BR]=Compartilhamento do Desktop
Name[ro]=Partajare ecran
Name[ro]=Partajare birou
Name[ru]=Общий рабочий стол
Name[se]=Čállinbeavdejuohkkin
Name[sk]=Zdieľanie pracovnej plochy
Name[sl]=Deljenje namizja
Name[sr]=Дељење радне површине
Name[sr]=Дељење површи
Name[sr@latin]=Deljenje površi
Name[sv]=Dela ut skrivbordet
Name[ta]=மேசைமேல் பகிர்வு
Name[th]=ใช้งานพื้นที่ทำงานร่วมกัน
Name[ta]=பணிமேடை பகிர்வு
Name[tg]=Истифодабарии муштараки Мизи корӣ
Name[tr]=Masaüstü Paylaşımı
Name[uk]=Спільні стільниці
Name[ven]=U kovhekana ha Desikithopo
Name[vi]=Chia sẻ màn hình nền
Name[x-test]=xxDesktop Sharingxx
Name[xh]=Ukwehlulelana kwe Desktop
Name[xx]=xxDesktop Sharingxx
Name[zh_CN]=桌面共享
Name[zh_HK]=桌面分享
Name[zh_TW]=桌面分享
Name[zu]=Ukwahlulelana kwe-Desktop
Comment=Configure Desktop Sharing
Comment[af]=Konfigureer Werkskerm Deeling
Comment[ar]=تعديل مشاركة سطح المكتب
Comment[bg]=Настройки на споделянето на работно място
Comment[bs]=Podesite dijeljenje desktopa
Comment[bg]=Настройване споделянето на работното място
Comment[bn]=ডেস্কটপ ভাগাভাগি কনফিগার করুন
Comment[br]=Kefluniañ rannañ ar vurev
Comment[ca]=Lupa de l'escriptori
Comment[cs]=Nastavit sdílení pracovní plochy
Comment[cy]=Ffurfweddu Rhannu Penbwrdd
Comment[da]=Indstil skrivebordsdeling
Comment[da]=Indstil desktopdeling
Comment[de]=Freigabe der Arbeitsfläche einrichten
Comment[el]=Ρύθμιση του μοιράσματος της επιφάνειας εργασίας
Comment[eo]=Agordu fordonadon de viaj tabuloj
Comment[es]=Compartición de escritorio
Comment[el]=Ρύθμιση της κοινής χρήσης της επιφάνειας εργασίας
Comment[eo]=Agordi la tabulan komunigadon
Comment[es]=Configure su escritorio compartido
Comment[et]=Töölaua jagamise seadistamine
Comment[fi]=Aseta työpöydän jakamista
Comment[eu]=Konfiguratu mahaigain partekatzea
Comment[fa]=پیکربندی اشتراک رومیزی
Comment[fi]=Aseta työpöydän jakaminen
Comment[fr]=Configuration du partage du bureau
Comment[gl]=Configura-la compartición do escritorio
Comment[ga]=Cumraigh Roinnt Deisce
Comment[gl]=Configurar a compartilla do escritorio
Comment[he]=שינוי הגדרות שיתוף שולחנות העבודה
Comment[hi]=कॉन्फिगर डेस्कटॉप साझ
Comment[hi]=डेस्कटॉप साझेदारी कॉन्फ़िगर करें
Comment[hne]=डेस्कटाप साझेदारी कान्फिगर करव
Comment[hr]=Podešavanje dijeljenja radne površine
Comment[hu]=A munkaasztal-megosztás beállításai
Comment[is]=Stilla skjáborðsmiðlun
Comment[it]=Configura condivisione desktop
Comment[ja]=デスクトップ共有の設定
Comment[kk]=Үстелді ортақтастыруды баптау
Comment[km]=កំណត់​រចនា​សម្ព័ន្ធ​ការ​ចែក​រំលែក​ផ្ទៃ​តុ
Comment[ko]=데스크톱 공유 설정
Comment[lt]=Konfigūruoti dalinimąsi darbastaliu
Comment[mn]=Ажлын байрны хамтран эзэмших тохируулга
Comment[lv]=Konfigurē darbvirsmas koplietošanu
Comment[mk]=Конфигурирајте делење на површината
Comment[ml]=പണിയിടം പങ്കുവെക്കല്‍ ക്രമീകരിക്കാം
Comment[ms]= Selaraskan Perkongsian Desktop
Comment[nb]=Tilpass delte skrivebord
Comment[nl]=Bureaubladvrijgave configureren
Comment[nds]=Schriefdisch-Freegaav instellen
Comment[ne]=डेस्कटप साझेदारी कन्फिगर गर्नुहोस्
Comment[nl]=Bureaublad delen instellen
Comment[nn]=Set opp skrivebordsdeling
Comment[nso]=Beakanya Kabagano ya Desktop
Comment[pa]=ਡੈਸਕਟਾਪ ਸ਼ੇਅਰਿੰਗ ਸੰਰਚਨਾ
Comment[pl]=Konfiguracja współdzielenia pulpitu
Comment[pt]=Configura a Partilha do Ecrã
Comment[pt]=Configurar a Partilha do Ecrã
Comment[pt_BR]=Configurar Compartilhamento do Desktop
Comment[ro]=Configurează partajarea biroului
Comment[ru]=Параметры общего рабочего стола
Comment[se]=Heivet čállinbeavdejuohkkima
Comment[sk]=Nastavenie zdieľania pracovnej plochy
Comment[sl]=Nastavi deljenje namizja
Comment[sr]=Подешавање дељења радне површине
Comment[sr]=Подешавање дељења површи
Comment[sr@latin]=Podešavanje deljenja površi
Comment[sv]=Anpassa utdelning av skrivbord
Comment[ta]=மேஜைமேல் பகிர்வை உள்ளமை
Comment[ta]=பணிமேடை பகிர்வை உள்ளமை
Comment[tg]=Батанзимдарории Истифодабарии муштараки Мизи корӣ
Comment[tr]=Masaüstü Paylaşımını Yapılandır
Comment[uk]=Налаштувати спільні стільниці
Comment[ven]=Dzudzanyani u kovhekana ha desikithopo
Comment[vi]=Cấu hình chia sẻ màn hình nền
Comment[x-test]=xxConfigure Desktop Sharingxx
Comment[xh]=Qwalasela Ukusebenzisa ngokuhlangeneyo kwe Desktop
Comment[xx]=xxConfigure Desktop Sharingxx
Comment[zh_CN]=配置桌面共享
Comment[zh_HK]=設定桌面分享
Comment[zh_TW]=設定桌面分享
Comment[zu]=Hlela kahle Ukwahlulelana kwe-Desktop
Keywords=desktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvited
Keywords[bg]=споделяне,работно,място,десктоп,покана,връзка,desktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvited
Keywords[ca]=compartició de l'escriptori,krfb,vnc,compartir,krdc,connexió a l'escriptori remot,invitació,port,slp,no invitat
Keywords[cs]=sdílení plochy,krfb,vnc,sdílení,rdp,krdc,připojení vzdálené plochy,pozvánka,port,slp
Keywords[cy]=rhannu penbwrdd,krfb,vnc,rhannu,rdp,krdc,cysylltiad penbwrdd pell,gwahoddiad,porth,slp,heb wahoddiad
Keywords[da]=skrivebordsdeling,krfb,vnc,deling,krdc,ekstern skrivebordsforbindelse,invitation,port,slp,ikke inviteret
Keywords[de]=Arbeitsfläche freigeben,krfb,VNC,freigeben,krdc,Entfernte Arbeitsfläche,Einladung,Port,slp,uneingeladen
Keywords[el]=μοίρασμα επιφάνειας εργασίας,krfb,vnc,μοίρασμα,krdc,σύνδεση σε απομακρυσμένη επιφάνεια εργασίας,πρόσκληση,θύρα,slp,χωρίς πρόσκληση
Keywords[es]=compartición de escritorio,krfb,vnc,compartir,rdp,krdc, conexión escritorio remoto,invitación,puerto,slp,no invitado
Keywords[et]=töölaua jagamine,krfb,vnc,jagamine,rdp,krdc,kaugtöölaua ühendus,rdp,kutse,port,slp,kutsumata
Keywords[fi]=työpöydän jakaminen,krfb,vnc,jakaminen,krdc,etätyöpöytäyhteys, kutsu,portti,slp,kutsumaton
Keywords[fr]=partage de bureau,krfb,vnc,partage,rdp,krdc,connexion à un bureau distant,invitation,port,slp,non invité
Keywords[gl]=compartición de escritorio, vnc, compartir, krdc, conexión escritorio remoto, invitación, porto, slt
Keywords[he]=שיתוף שולחן עבודה,krfb,vnc,שיתוף,rdp,krdc,חיבור לשולחן עבודה מרוחק,rdp
Keywords[hi]=डेस्कटॉप साझा, केआरएफबी,वीएनसी,साझा,केआरडीसी,रिमोट डेस्कटॉप कनेक्शन,निमंत्रण,पोर्ट,एसएलपी,अनिमंत्रित
Keywords[hu]=munkaasztal-megosztás,krfb,vnc,megosztás,krdc,csatlakozás távoli munkaasztalhoz,meghívás,port,slp,meghívás nélkül
Keywords[it]=condivisione desktop,krfb,vnc,condivisione,krdc,connessione desktop remoto,invito,porta,slp,non invitato
Keywords[ms]= perkongsian ruang kerja, sambungan, liang, desktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvited
Keywords[nb]=skrivebordsdeling,krfb,vnc,deling,krdc,tilkobling til fjernt skrivebord,invitasjon,port,slp,ikke invitert
Keywords[nl]=desktop sharing,krfb,vnc,sharing,rdp,krdc,remote desktop connection,uitnodiging,slp,rdp,verbinding,bureaubladvrijgave,bureaublad op afstand
Keywords[pl]=współdzielenie pulpitu,krfb,vnc,współdzielenie,rdp,krdc,zdalne połączenie, zdalne biurko, zdalny pulpit, zaproszenie,port,slp
Keywords[pt]=partilha do ecrã,krfb,vnc,partilha,krdc,ligação a um ecrã remoto,convite,porto,slp,sem convite
Keywords[pt_BR]=compartilhamento de desktop,krfb,vnc,compartilhamento,krdc,conexão a desktop remoto,convite,porta,slp,não convidado
Keywords[sk]=zdieľanie plochy,krfb,vnc,zdieľanie,rdp,krdc,pripojenie vzdialenej pracovnej plochy,rdp
Keywords[sl]=namizje,souporaba,krfb,vnc,krdc,povezava oddaljenega namizja, povabilo,port,slp,nepovabljen
Keywords[sr]=desktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvited,радна површина,дељење,позив,порт,непозван,удаљено
Keywords[sv]=dela skrivbord,krfb,vnc,dela,krdc,fjärrskrivbordsanslutning,inbjudan,port,slp
Keywords[ta]=மேஜைமேல் பகிர்வு,krfb,vnc,பகிர்வு,krdc,தொலை மேஜைமேல் இணைப்பு,அழைப்பிதழ்,துரை,slp,uninvited
Keywords[tr]=masaüstü paylaşımı,krfb,vnc,paylaşım,krdc,uzak masaüstü bağlantısı,davet,port,slp
Keywords[xx]=xxdesktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvitedxx
Keywords[zh_CN]=desktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvited,桌面共享,共享,远程桌面连接,邀请,端口,未邀请
X-KDE-Keywords=desktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvited
X-KDE-Keywords[bg]=Keywords=споделяне, работно, място, десктоп, покана, връзка, desktop sharing, krfb, vnc, sharing, krdc, remote desktop connection, invitation, port, slp, uninvited
X-KDE-Keywords[ca]=compartició de l'escriptori,krfb,vnc,compartir,krdc,connexió a l'escriptori remot,invitació,port,slp,no invitat
X-KDE-Keywords[cs]=sdílení plochy,krfb,vnc,sdílení,rdp,krdc,připojení vzdálené plochy,pozvánka,port,slp
X-KDE-Keywords[cy]=rhannu penbwrdd,krfb,vnc,rhannu,rdp,krdc,cysylltiad penbwrdd pell,gwahoddiad,porth,slp,heb wahoddiad
X-KDE-Keywords[da]=desktopdeling,krfb,vnc,deling,krdc,ekstern desktopforbindelse,invitation,port,slp,ikke inviteret
X-KDE-Keywords[de]=Arbeitsfläche freigeben,krfb,VNC,freigeben,krdc,Entfernte Arbeitsfläche,Einladung,Port,slp,uneingeladen,rdp,remote desktop
X-KDE-Keywords[el]=κοινή χρήση επιφάνειας εργασίας,krfb,vnc,κοινή χρήση,krdc,σύνδεση σε απομακρυσμένη επιφάνεια εργασίας,πρόσκληση,θύρα,slp,απρόσκλητο
X-KDE-Keywords[es]=escritorio compartido,krfb,vnc,compartir,rdp,krdc, conexión escritorio remoto,invitación,puerto,slp,no invitado
X-KDE-Keywords[et]=töölaua jagamine,krfb,vnc,jagamine,rdp,krdc,kaugtöölaua ühendus,rdp,kutse,port,slp,kutsumata
X-KDE-Keywords[eu]=mahaigain partekatzea,krfb,vnc,partekatzea,krdc,urruneko mahaigain konexioa,gonbidapena,ataka,slp,gonbidapen gabea
X-KDE-Keywords[fa]=اشتراک رومیزی، krfb، vnc، اتصال رومیزی راه دور، دعوت، درگاه، slp، دعوت‌نشده
X-KDE-Keywords[fi]=työpöydän jakaminen,krfb,vnc,jakaminen,krdc,etätyöpöytäyhteys, kutsu,portti,slp,kutsumaton, työpöytä
X-KDE-Keywords[fr]=partage de bureau,krfb,vnc,partage,rdp,krdc,connexion à un bureau distant,invitation,port,slp,non invité
X-KDE-Keywords[gl]=compartilla de escritorio, vnc, compartir, krdc, conexón ao escritorio remoto, invitación, porto, slt, convidado, compartillar
X-KDE-Keywords[he]=שיתוף שולחן עבודה,שיתוף,חיבור לשולחן עבודה מרוחק,desktop sharing,krfb,vnc,sharing,krdc,remote desktop connection, invitation, port, slp, uninvited
X-KDE-Keywords[hu]=munkaasztal-megosztás,krfb,vnc,megosztás,krdc,csatlakozás távoli munkaasztalhoz,meghívás,port,slp,meghívás nélkül
X-KDE-Keywords[is]=skjáborðsmiðlun,miðlun,krfb,vnc,rdp,krdc,fjarvinnsla,remote desktop connection,rdp
X-KDE-Keywords[it]=condivisione desktop,krfb,vnc,condivisione,krdc,connessione desktop remoto,invito,porta,slp,non invitato
X-KDE-Keywords[ja]=デスクトップ共有,krfb,vnc,共有,rdp,krdc,リモートデスクトップ接続,招待,ポート,slp,uninvited
X-KDE-Keywords[km]=ការ​ចែក​រំ​លែក​ផ្ទៃ​តុ,krfb,vnc,ការ​ចែក​រំលែក,krdc,ការ​ត​ភ្ជាប់​ផ្ទៃ​តុ​ពី​ចម្ងាយ,អញ្ជើញ,ច្រក,slp,មិន​បាន​អញ្ជើញ
X-KDE-Keywords[lt]=desktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvited,dalinimasis darbastaliu,nutolusio darbastalio prijungimas,kvietimas,ryšys,nekviestas,jungtis,prievadas,dalintis,pasidalinti,jungimasis,prisijungti,kviesti
X-KDE-Keywords[mk]=desktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvited,делење на површината,krfb,vnc,делење,krdc,поврзување со оддалечена површина,покана,порта,slp,непоканет
X-KDE-Keywords[ms]= perkongsian ruang kerja, sambungan, liang, desktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvited
X-KDE-Keywords[nb]=skrivebordsdeling,krfb,vnc,deling,krdc,tilkobling til fjernt skrivebord,invitasjon,port,slp,ikke invitert
X-KDE-Keywords[nds]=schriefdisch,freegeven,freegaav,krfb,vnc,delen,krdc,feern Schriefdisch,verbinnen,inladen,port,slp,nich inlaadt
X-KDE-Keywords[ne]=डेस्कटप साझेदारी,krfb,vnc,साझेदारी,krdc, टाढाको डेस्कटप जडान,निमन्त्रणा,पोर्ट,slp,निमन्त्रणा नगरिएको
X-KDE-Keywords[nl]=desktop sharing,krfb,vnc,sharing,rdp,krdc,remote desktop connection,uitnodiging,slp,rdp,verbinding, bureaublad delen,bureaublad op afstand
X-KDE-Keywords[nn]=skrivebordsdeling,krfb,vnc,deling,krdc,nettverksskrivebord,invitasjon,port,slp,ikkje invitert
X-KDE-Keywords[pl]=współdzielenie pulpitu,krfb,vnc,współdzielenie,rdp,krdc,zdalne połączenie, zdalne biurko, zdalny pulpit, zaproszenie,port,slp
X-KDE-Keywords[pt]=partilha do ecrã,krfb,vnc,partilha,krdc,ligação a um ecrã remoto,convite,porto,slp,sem convite
X-KDE-Keywords[pt_BR]=compartilhamento de desktop,krfb,vnc,compartilhamento,krdc,conexão a desktop remoto,convite,porta,slp,não convidado
X-KDE-Keywords[sl]=namizje,souporaba,krfb,vnc,krdc,povezava oddaljenega namizja, povabilo,port,slp,nepovabljen
X-KDE-Keywords[sr]=desktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvited,радна површина,дељење,позив,порт,непозван,удаљено
X-KDE-Keywords[sr@latin]=desktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvited,radna površina,deljenje,poziv,port,nepozvan,udaljeno
X-KDE-Keywords[sv]=dela skrivbord,krfb,vnc,dela,krdc,fjärrskrivbordsanslutning,inbjudan,port,slp
X-KDE-Keywords[ta]=பணிமேடை பகிர்வு,krfb,vnc,பகிர்வு,krdc,தொலை பணிமேடை இணைப்பு,அழைப்பிதழ், துறை, slp, uninvited
X-KDE-Keywords[tr]=masaüstü paylaşımı,krfb,vnc,paylaşım,krdc,uzak masaüstü bağlantısı,davet,port,slp
X-KDE-Keywords[uk]=спільні стільниці,krfb,vnc,спільний,rdp,krdc,з'єднання віддаленої стільниці,запрошення,rdp,slp,без запрошення
X-KDE-Keywords[vi]=chia sẻ màn hình,krfb,vnc,chia sẻ,krdc,màn hình ở xa kết nối,mời kết nối,cổng,slp,không được mời
X-KDE-Keywords[x-test]=xxdesktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvitedxx
X-KDE-Keywords[zh_CN]=desktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvited,桌面共享,共享,远程桌面连接,邀请,端口,未邀请
X-KDE-Keywords[zh_TW]=desktop sharing,krfb,vnc,sharing,rdp,krdc,remote desktop connection,rdp,桌面分享,分享,遠端桌面連線,invitation,port,slp,uninvited
Categories=Qt;KDE;X-KDE-settings-network
Categories=Qt;KDE;X-KDE-settings-network;Settings;

28
kinetd/CMakeLists.txt Normal file
View File

@@ -0,0 +1,28 @@
include_directories( ${CMAKE_SOURCE_DIR}/krfb/srvloc )
########### next target ###############
set(kded_kinetd_PART_SRCS kinetd.cpp ${srvloc_SRCS})
message(STATUS "Port to krfb DBUS")
# kde4_add_dcop_skels(kded_kinetd_PART_SRCS kinetd.h )
kde4_add_plugin(kded_kinetd ${kded_kinetd_PART_SRCS})
target_link_libraries(kded_kinetd ${KDE4_KIO_LIBS} ${KDE4_KDNSSD_LIBS} ${SLP_LIBRARIES})
install(TARGETS kded_kinetd DESTINATION ${PLUGIN_INSTALL_DIR})
########### install files ###############
install(FILES kinetd.notifyrc DESTINATION ${DATA_INSTALL_DIR}/krfb)
install(FILES kinetdmodule.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR})
install(FILES kinetd.desktop DESTINATION ${SERVICES_INSTALL_DIR}/kded)

View File

@@ -1,30 +0,0 @@
METASOURCES = AUTO
# Code
kde_module_LTLIBRARIES = kded_kinetd.la
kded_kinetd_la_SOURCES = kinetd.cpp kinetd.skel
kded_kinetd_la_LDFLAGS = $(all_libraries) -module -avoid-version
kded_kinetd_la_LIBADD = ../srvloc/libsrvloc.la $(LIB_KIO)
# Services
kde_servicetypes_DATA = kinetdmodule.desktop
kdeddir = $(kde_servicesdir)/kded
kded_DATA = kinetd.desktop
EXTRA_DIST = $(kded_kinetd_la_SOURCES)\
$(kded_DATA) \
$(kde_servicetypes_DATA) \
eventsrc README.debugging
KDE_ICON = kinetd
install-data-local:
$(mkinstalldirs) $(DESTDIR)$(kde_datadir)/kinetd
$(INSTALL_DATA) $(srcdir)/eventsrc $(DESTDIR)$(kde_datadir)/kinetd/eventsrc
# set the include path for X, qt and KDE
INCLUDES= -I$(top_srcdir)/krfb/srvloc $(all_includes)
messages: rc.cpp
$(XGETTEXT) *.cpp -o $(podir)/kinetd.pot

2
kinetd/Messages.sh Normal file
View File

@@ -0,0 +1,2 @@
#! /bin/sh
$XGETTEXT *.cpp -o $podir/kinetd.pot

View File

@@ -1,205 +0,0 @@
[!Global!]
IconName=kinetd
Comment=KInetD
Comment[hi]=के-इनिट-डी
Comment[sv]=Kinetd
Comment[xx]=xxKInetDxx
[IncomingConnection]
Name=IncomingConnection
Name[ar]=اتصال وارد
Name[bg]=Входяща връзка
Name[ca]=Connexió entrant
Name[cs]=Příchozí spojení
Name[cy]=CysylltiadCyrraedd
Name[da]=IndkommendeForbindelse
Name[de]=Eingehende Verbindung
Name[el]=Εισερχόμενη σύνδεση
Name[eo]=EnvenantaKonekto
Name[es]=Conexión entrante
Name[et]=Sissetulev ühendus
Name[fi]=Saapuva yhteys
Name[fr]=Connexion entrante
Name[gl]=Conexión Entrante
Name[he]=חיבור נכנס
Name[hi]=आवक-कनेक्शन
Name[hr]=DolaznaVeza
Name[hu]=Bejövő kapcsolat
Name[it]=Connessioni in entrata
Name[ja]=外部からの接続
Name[lt]=Ateinantis prisijungimas
Name[mn]=Орж ирсэн Холболт
Name[ms]=Sambungan Masuk
Name[mt]=KonnessjonijiDieħla
Name[nb]=Innkommende forbindelse
Name[nl]=Inkomende verbinding
Name[nn]=Innkomande samband
Name[nso]=Kopantsho yeo e Tsenago
Name[pl]=Połączenia przychodzące
Name[pt_BR]=Conexões de Entrada
Name[ro]=Conexiune de intrare
Name[ru]=Входящее соединение
Name[se]=Boahtti oktavuohta
Name[sk]=Prichádzajúce spojenia
Name[sl]=Prihajajoča povezava
Name[sr]=Долазећа веза
Name[sv]=Inkommande anslutning
Name[ta]=பல இணைப்புக்கள்
Name[th]=มีการเชื่อมต่อเข้ามา
Name[tr]=Gelen Bağlantı
Name[uk]=ВхіднеЗ'єднання
Name[ven]=Vhukwamanihanga ngomu
Name[xh]=Uxhumaniso Olungenayo
Name[xx]=xxIncomingConnectionxx
Name[zh_CN]=进入的连接
Name[zh_TW]=進來的連接
Name[zu]=UkuxhumanaOkuzayo
Comment=Received incoming connection
Comment[af]=Ontvang inkomende verbinding
Comment[ar]=تم استلام اتصال وارد
Comment[bg]=Получена е входяща връзка
Comment[bs]=Primio dolaznu konekciju
Comment[ca]=Rebuda connexió entrant
Comment[cs]=Obdrženo příchozí spojení
Comment[cy]=Derbynwyd cysylltiad a gyrhaeddodd
Comment[da]=Modtog indkommende forbindelse
Comment[de]=Verbindungsanfrage eingegangen
Comment[el]=Λήψη εισερχόμενης σύνδεσης
Comment[eo]=Ricevantaj envenantaj konektoj
Comment[es]=Recibida conexión entrante
Comment[et]=Saadi sissetulev ühendus
Comment[fi]=Vastaanotettiin saapuva yhteys
Comment[fr]=Reçu une connexion entrante
Comment[gl]=Recibíuse unha conexión entrante
Comment[he]=נתקבל חיבור נכנס
Comment[hi]=आवक कनेक्शन प्राप्त
Comment[hr]=Primio dolaznu vezu
Comment[hu]=Csatlakozási kérés érkezett
Comment[it]=Connessione in entrata stabilita
Comment[ja]=着信した外部からの接続
Comment[lt]=Gautas įeinantis prisijungimas
Comment[mn]=Орж ирсэн Холболтыг хүлээн авав
Comment[ms]=Menerima sambungan masuk
Comment[mt]=Irċevejt konnessjoni dieħla
Comment[nb]=Motta innkommende forbindelse
Comment[nl]=Ontving een inkomende verbinding
Comment[nn]=Motta innkomande samband
Comment[nso]=Kopantsho yeo e amogetswego ya tseo di tsenago
Comment[pl]=Otrzymano połącznie przychodzące
Comment[pt]=Foi recebida uma ligação
Comment[pt_BR]=Recebendo conexão de entrada
Comment[ro]=Conexiune de intrare recepţionată
Comment[ru]=Входящее соединение завершилось успешно
Comment[sk]=Prijaté príchodzie spojenia
Comment[sl]=Prejeta je prihajajoča povezava
Comment[sr]=Примљена је долазећа веза
Comment[sv]=Tar emot inkommande anslutning
Comment[ta]=எதிர்பாராத இணைப்பு ஏற்க்கப்ப்ட்டது
Comment[th]=ได้รับการเชื่อมต่อเข้ามา
Comment[tr]=Gelen bağlantı alınıyor
Comment[uk]=Отримано вхідне з'єднання
Comment[ven]=Vhukwamani hau dzhena ho tanganedzhwaho
Comment[xh]=Uxhulumano olungenayo olufunyenweyo
Comment[xx]=xxReceived incoming connectionxx
Comment[zh_CN]=收到进入的连接
Comment[zh_TW]=已接收的進來的連線
Comment[zu]=Ukuxhumanisa okungenayo okutholakele
default_presentation=4
[ProcessFailed]
Name=ProcessFailed
Name[ar]=فشلت العملية
Name[bg]=Процесът се провали
Name[ca]=Procés fallit
Name[cs]=Proces selhal
Name[cy]=MethoddProses
Name[da]=ProcesMislykkedes
Name[de]=Prozess fehlgeschlagen
Name[el]=Η επεξεργασία απέτυχε
Name[eo]=ProcezoFiaskis
Name[es]=Proceso fallido
Name[et]=Protsess ebaõnnestus
Name[fi]=Prosessi epäonnistui
Name[fr]=Échec du processus
Name[gl]=Proceso fallido
Name[he]=תהליך נכשל
Name[hi]=प्रक्रिया-असफल
Name[hr]=ProcesNeuspješan
Name[hu]=Hibás folyamat
Name[it]=Processo fallito
Name[ja]=プロセス失敗
Name[lt]=Procesas nepavyko
Name[mn]=Ажиллагаа сүйрэв
Name[ms]=Proses Gagal
Name[mt]=ProċessFalla
Name[nb]=Prosess mislyktes
Name[nl]=Proces faalde
Name[nn]=Prosess mislukkast
Name[nso]=Tiragalo e Paletswe
Name[pl]=Błąd procesu
Name[pt_BR]=Falha de Processo
Name[ro]=Proces eşuat
Name[ru]=Ошибка процесса
Name[se]=Proseassa filtii
Name[sk]=Proces neúspešny
Name[sl]=Proces ni uspel
Name[sr]=Процес није успео
Name[sv]=Process misslyckades
Name[ta]=செயல் தோல்வியுற்றது
Name[th]=โปรเซสล้มเหลว
Name[uk]=ПомилкаПроцесу
Name[ven]=Tshitenwa tsho bala
Name[xh]=Inkqubo Yahlulekile
Name[xx]=xxProcessFailedxx
Name[zh_CN]=处理失败
Name[zh_TW]=程序失敗
Name[zu]=UkwenzekaKuhlulekile
Comment=Could not call process to handle connection
Comment[af]=Kon nie roep proses na handvatsel verbinding
Comment[ar]=لم أستطع استحضار العملية لحمل المكالمة
Comment[bg]=Процесът за обработка на входящи връзки не може да бъде стартиран
Comment[bs]=Ne mogu pokrenuti proces koji upravlja konekcijom
Comment[ca]=No es pot cridar al procés per a manejar la connexió
Comment[cs]=Nelze spustit proces k obsluze spojení
Comment[cy]=Methu galw proses i drin y cysylltiad
Comment[da]=Kunne ikke kalde proces til at håndtere forbindelse
Comment[de]=Der Prozess zur Bearbeitung der Verbindungsanfrage wurde nicht gefunden
Comment[el]=Δεν ήταν δυνατή η κλήση της διεργασίας για τον έλεγχο της σύνδεσης
Comment[eo]=Ne eblis lanĉi instancon por prizorgi la konekton
Comment[es]=Imposible lanzar proceso para manejar conexión
Comment[et]=Ei suuda käivitada protsessi ühenduse käsitsemiseks
Comment[fi]=Ei voitu kutsua prosessia yhteyden hoitamiseksi
Comment[fr]=Impossible d'appeler le processus pour gérer la connexion
Comment[gl]=Non se puidcho chamar ó proceso para que atendese á conexión
Comment[he]=אין אפשרות לקרוא לתהליך על מנת לטפל בחיבור
Comment[hi]=कनेक्शन हैंडल करने हेतु प्रक्रिया काल नहीं कर सका
Comment[hr]=Nisam mogao pozvati proces za kontrolu veze
Comment[hu]=A kapcsolat kezelése nem sikerült
Comment[it]=Impossibile richiamare il processo per gestire la connessione
Comment[ja]=接続を扱うプロセスを呼び出せません
Comment[lt]=Negaliu iškviesti proceso prisijungimui apdoroti
Comment[mn]=Холболтыг заах ажиллагаагдуудаж чадаагүй
Comment[ms]=Tidak dapat memanggil proses untuk mengendalikan sambungan
Comment[mt]=Ma stajtx insejjaħ proċess biex jieħu ħsieb il-konnessjoni
Comment[nb]=Kunne ikke kalle en prosess for å håndtere forbindelsen
Comment[nl]=Het proces om de verbinding af te handelen kon niet worden aangeroepen
Comment[nn]=Klarte ikkje kalla prosess for sambandshandtering
Comment[nso]=Ebe ekase bitse tiragalo go swara kopantsho
Comment[pl]=Nie można było uruchomić procesu obsługi połączenia
Comment[pt]=Não foi possível chamar o processo de tratamento da ligação
Comment[pt_BR]=Não foi possível chamar o processo de controle da conexão
Comment[ru]=Не удается запустить процесс обработки соединения
Comment[sk]=Nemohol som zavolať proces pre spracovanie spojenia
Comment[sl]=Ni možno poklicati procesa za upravljanje s povezavo
Comment[sr]=Нисам могао да позовем процес да опслужи везу
Comment[sv]=Kunde inte anropa process för att hantera anslutning
Comment[ta]=இணைப்பை கையாள செயற்பாட்டை அழைக்க முடியவில்லை
Comment[th]=ไม่สามารถเรียกโปรเซสเพื่อรับการเชื่อมต่อได้
Comment[uk]=Неможливо викликати процес для обробки з'єднання
Comment[ven]=Ingasi vhidze tshitenwa uitela u fara vhukwamani
Comment[xh]=Ayikwazanga ukubiza inkqubo ezakuphatha uxhulumano
Comment[xx]=xxCould not call process to handle connectionxx
Comment[zh_CN]=无法调用进程处理连接
Comment[zh_TW]=無法呼叫處理連線的程序
Comment[zu]=Ayikwazanga ukubiza umsebenzi ukuzophatha ukuxhumanisa
default_presentation=4

View File

@@ -26,12 +26,23 @@
#include <kdebug.h>
#include <kstandarddirs.h>
#include <kconfig.h>
#include <knotifyclient.h>
#include <ksockaddr.h>
#include <kextsock.h>
#include <KNotification>
#include <ksocketaddress.h>
#include <ksocketdevice.h>
#include <klocale.h>
#include <kglobal.h>
#include <unistd.h>
#include <fcntl.h>
#include <kpluginfactory.h>
#include <kpluginloader.h>
K_PLUGIN_FACTORY(KInetDFactory,
registerPlugin<KInetD>();
)
K_EXPORT_PLUGIN(KInetDFactory("kinetd"))
PortListener::PortListener(KService::Ptr s,
KConfig *config,
KServiceRegistry *srvreg) :
@@ -39,7 +50,8 @@ PortListener::PortListener(KService::Ptr s,
m_serviceRegistered(false),
m_socket(0),
m_config(config),
m_srvreg(srvreg)
m_srvreg(srvreg),
m_dnssdreg(0)
{
m_uuid = createUUID();
loadConfig(s);
@@ -57,11 +69,11 @@ bool PortListener::acquirePort() {
delete m_socket;
}
m_port = m_portBase;
m_socket = new KServerSocket(m_port, false);
m_socket = new KNetwork::KServerSocket(m_port, false);
while (!m_socket->bindAndListen()) {
m_port++;
if (m_port >= (m_portBase+m_autoPortRange)) {
kdDebug() << "Kinetd cannot load service "<<m_serviceName
kDebug() << "Kinetd cannot load service "<<m_serviceName
<<": unable to get port" << endl;
m_port = -1;
delete m_socket;
@@ -69,34 +81,37 @@ bool PortListener::acquirePort() {
return false;
}
delete m_socket;
m_socket = new KServerSocket(m_port, false);
m_socket = new KNetwork::KServerSocket(m_port, false);
}
connect(m_socket, SIGNAL(accepted(KSocket*)),
SLOT(accepted(KSocket*)));
bool s = m_registerService;
bool sd =m_dnssdRegister;
setServiceRegistrationEnabledInternal(false);
dnssdRegister(false);
setServiceRegistrationEnabledInternal(s);
dnssdRegister(sd);
return true;
}
void PortListener::freePort() {
m_port = -1;
if (m_socket)
delete m_socket;
delete m_socket;
m_socket = 0;
setServiceRegistrationEnabledInternal(m_registerService);
dnssdRegister(false);
}
void PortListener::loadConfig(KService::Ptr s) {
m_valid = true;
m_autoPortRange = 0;
m_enabled = true;
m_argument = QString::null;
m_argument.clear();
m_multiInstance = false;
QVariant vid, vport, vautoport, venabled, vargument, vmultiInstance, vurl,
vsattributes, vslifetime;
vsattributes, vslifetime, vdname, vdtype, vddata;
m_execPath = s->exec().utf8();
vid = s->property("X-KDE-KINETD-id");
@@ -108,16 +123,19 @@ void PortListener::loadConfig(KService::Ptr s) {
vurl = s->property("X-KDE-KINETD-serviceURL");
vsattributes = s->property("X-KDE-KINETD-serviceAttributes");
vslifetime = s->property("X-KDE-KINETD-serviceLifetime");
vdname = s->property("X-KDE-KINETD-DNSSD-Name");
vdtype = s->property("X-KDE-KINETD-DNSSD-Type");
vddata = s->property("X-KDE-KINETD-DNSSD-Properties");
if (!vid.isValid()) {
kdDebug() << "Kinetd cannot load service "<<m_serviceName
kDebug() << "Kinetd cannot load service "<<m_serviceName
<<": no id set" << endl;
m_valid = false;
return;
}
if (!vport.isValid()) {
kdDebug() << "Kinetd cannot load service "<<m_serviceName
kDebug() << "Kinetd cannot load service "<<m_serviceName
<<": invalid port" << endl;
m_valid = false;
return;
@@ -141,7 +159,7 @@ void PortListener::loadConfig(KService::Ptr s) {
m_registerService = true;
}
else {
m_serviceURL = QString::null;
m_serviceURL.clear();
m_registerService = false;
}
if (vsattributes.isValid()) {
@@ -149,37 +167,56 @@ void PortListener::loadConfig(KService::Ptr s) {
}
else
m_serviceAttributes = "";
if (vddata.isValid()) {
QStringList attrs = vddata.toStringList();
for (QStringList::iterator it=attrs.begin();
it!=attrs.end();it++) {
QString key = (*it).section('=',0,0);
QString value = processServiceTemplate((*it).section('=',1))[0];
if (!key.isEmpty()) m_dnssdData[key]=value;
}
}
if (vdname.isValid() && vdtype.isValid()) {
m_dnssdName = processServiceTemplate(vdname.toString())[0];
m_dnssdType = vdtype.toString();
m_dnssdRegister = true;
kDebug() << "DNS-SD register is enabled\n";
}
else
m_dnssdRegister = false;
m_slpLifetimeEnd = QDateTime::currentDateTime().addSecs(m_serviceLifetime);
m_defaultPortBase = m_portBase;
m_defaultAutoPortRange = m_autoPortRange;
m_config->setGroup("ListenerConfig");
m_enabled = m_config->readBoolEntry("enabled_" + m_serviceName,
m_enabled = m_config->readEntry("enabled_" + m_serviceName,
m_enabled);
m_portBase = m_config->readNumEntry("port_base_" + m_serviceName,
m_portBase = m_config->readEntry("port_base_" + m_serviceName,
m_portBase);
m_autoPortRange = m_config->readNumEntry("auto_port_range_" + m_serviceName,
m_autoPortRange = m_config->readEntry("auto_port_range_" + m_serviceName,
m_autoPortRange);
QDateTime nullTime;
m_expirationTime = m_config->readDateTimeEntry("enabled_expiration_"+m_serviceName,
&nullTime);
if ((!m_expirationTime.isNull()) && (m_expirationTime < QDateTime::currentDateTime()))
m_enabled = false;
m_registerService = m_config->readBoolEntry("enabled_srvreg_"+m_serviceName,
m_registerService = m_config->readEntry("enabled_srvreg_"+m_serviceName,
m_registerService);
}
void PortListener::accepted(KSocket *sock) {
QString host, port;
KSocketAddress *ksa = KExtendedSocket::peerAddress(sock->socket());
if ((!ksa) || !ksa->address()) {
KSocketDevice device(sock->socket());
KSocketAddress ksa = device->peerAddress();
if ( ksa.address()) {
delete sock;
return;
}
KExtendedSocket::resolve(ksa, host, port);
KNotifyClient::event("IncomingConnection",
i18n("Connection from %1").arg(host));
KNotification::event("IncomingConnection",
i18n("Connection from %1", host));
delete ksa;
if ((!m_enabled) ||
@@ -188,13 +225,16 @@ void PortListener::accepted(KSocket *sock) {
return;
}
// disable CLOEXEC flag, fixes #77412
fcntl(sock->socket(), F_SETFD, fcntl(sock->socket(), F_GETFD) & ~FD_CLOEXEC);
m_process.clearArguments();
m_process << m_execPath << m_argument << QString::number(sock->socket());
if (!m_process.start(KProcess::DontCare)) {
KNotifyClient::event("ProcessFailed",
i18n("Call \"%1 %2 %3\" failed").arg(m_execPath)
.arg(m_argument)
.arg(sock->socket()));
if (!m_process.start(K3Process::DontCare)) {
KNotification::event("ProcessFailed",
i18n("Call \"%1 %2 %3\" failed", m_execPath,
m_argument,
sock->socket()));
}
delete sock;
@@ -223,11 +263,11 @@ QStringList PortListener::processServiceTemplate(const QString &a) {
QString hostName = address->nodeName();
KUser u;
QString x = a; // replace does not work in const QString. Why??
l.append(x.replace(QRegExp("%h"), KServiceRegistry::encodeAttributeValue(hostName))
.replace(QRegExp("%p"), QString::number(m_port))
.replace(QRegExp("%u"), KServiceRegistry::encodeAttributeValue(u.loginName()))
.replace(QRegExp("%i"), KServiceRegistry::encodeAttributeValue(m_uuid))
.replace(QRegExp("%f"), KServiceRegistry::encodeAttributeValue(u.fullName())));
l.append(x.replace(QString("%h"), KServiceRegistry::encodeAttributeValue(hostName))
.replace(QString("%p"), QString::number(m_port))
.replace(QString("%u"), KServiceRegistry::encodeAttributeValue(u.loginName()))
.replace(QString("%i"), KServiceRegistry::encodeAttributeValue(m_uuid))
.replace(QString("%f"), KServiceRegistry::encodeAttributeValue(u.fullName())));
}
return l;
}
@@ -275,6 +315,7 @@ void PortListener::setEnabledInternal(bool e, const QDateTime &ex) {
if (m_port < 0)
acquirePort();
m_enabled = m_port >= 0;
}
else {
freePort();
@@ -292,6 +333,7 @@ bool PortListener::isServiceRegistrationEnabled() {
void PortListener::setServiceRegistrationEnabled(bool e) {
setServiceRegistrationEnabledInternal(e);
dnssdRegister(e && m_enabled);
m_config->setGroup("ListenerConfig");
m_config->writeEntry("enable_srvreg_" + m_serviceName, e);
m_config->sync();
@@ -316,7 +358,7 @@ void PortListener::setServiceRegistrationEnabledInternal(bool e) {
*(it++),
*(it2++),
m_serviceLifetime))
kdDebug(7021) << "Failure registering SLP service (no slpd running?)"<< endl;
kDebug(7021) << "Failure registering SLP service (no slpd running?)";
}
m_serviceRegistered = true;
// make lifetime 30s shorter, because the timeout is not precise
@@ -329,6 +371,23 @@ void PortListener::setServiceRegistrationEnabledInternal(bool e) {
}
}
void PortListener::dnssdRegister(bool e) {
if (m_dnssdName.isNull() || m_dnssdType.isNull())
return;
if (m_dnssdRegistered == e)
return;
if (e) {
m_dnssdRegistered=true;
m_dnssdreg = new DNSSD::PublicService(m_dnssdName,m_dnssdType,m_port);
m_dnssdreg->setTextData(m_dnssdData);
m_dnssdreg->publishAsync();
} else {
m_dnssdRegistered=false;
delete m_dnssdreg;
m_dnssdreg=0;
}
}
void PortListener::refreshRegistration() {
if (m_serviceRegistered && (m_slpLifetimeEnd.addSecs(-90) < QDateTime::currentDateTime())) {
setServiceRegistrationEnabledInternal(false);
@@ -357,13 +416,13 @@ PortListener::~PortListener() {
}
KInetD::KInetD(QCString &n) :
KDEDModule(n)
KInetD::KInetD(QObject* parent, const QList<QVariant>&) :
KDEDModule(parent)
{
m_config = new KConfig("kinetdrc");
m_srvreg = new KServiceRegistry();
if (!m_srvreg->available()) {
kdDebug(7021) << "SLP not available"<< endl;
kDebug(7021) << "SLP not available";
delete m_srvreg;
m_srvreg = 0;
}
@@ -592,14 +651,5 @@ bool KInetD::isServiceRegistrationEnabled(QString service)
KInetD::~KInetD() {
m_portListeners.clear();
delete m_config;
if (m_srvreg)
delete m_srvreg;
}
extern "C" {
KDEDModule *create_kinetd(QCString &name)
{
KGlobal::locale()->insertCatalogue("kinetd");
return new KInetD(name);
}
delete m_srvreg;
}

View File

@@ -1,107 +1,137 @@
[Desktop Entry]
Encoding=UTF-8
Type=Service
ServiceTypes=KDEDModule
X-KDE-ServiceTypes=KDEDModule
X-KDE-ModuleType=Library
X-KDE-Library=kinetd
X-KDE-FactoryName=kinetd
X-KDE-Kded-autoload=true
Name=KDE Internet Daemon
Name[af]=Kde Internet Bediener
Name[ar]=مراقب انترنت كيدي
Name[bg]=Интернет демон за КДЕ
Name[ar]=كيدي إنترنت مراقب
Name[bg]=Интернет демон
Name[bn]=কে-ডি-ই ইন্টারনেট ডিমন
Name[br]=Diaoul kenrouedad KDE
Name[ca]=Dimoni d'Internet per al KDE
Name[cs]=KDE Internet démon
Name[cy]=Daemon Rhyngrwyd KDE
Name[da]=KDE Internet-dæmon
Name[de]=KDE Internet-Dämon
Name[de]=Internet-Dienst
Name[el]=Δαίμονας διαδικτύου για το KDE
Name[eo]=Retodemono
Name[en_GB]=KDE Internet Dæmon
Name[eo]=KDE interreta demono
Name[es]=Demonio de Internet de KDE
Name[et]=KDE internetideemon
Name[fi]=KDE Internet palvelin
Name[eu]=KDE internet deabrua
Name[fa]=شبح اینترنتی KDE
Name[fi]=KDE Internet-palvelin
Name[fr]=Démon Internet de KDE
Name[gl]=O demo de Internet de KDE
Name[ga]=Deamhan Idirlín KDE
Name[gl]=Daemon de internet de KDE
Name[he]=תהליך הרקע האינטרנטי של KDE
Name[hi]=केडीई इंटरनेट डेमन
Name[hne]=केडीई इंटरनेट डेमन
Name[hu]=KDE internetes szolgáltatás
Name[is]=KDE Internetþjónn
Name[it]=Demone internet di KDE
Name[ja]=KDE インターネットデーモン
Name[lt]=KDE Interneto tarnyba
Name[mn]=KDE Интернет-демон
Name[kk]=KDE Интернет қызметі
Name[km]=ដេមិន​អ៊ីនធឺណិត​របស់ KDE
Name[ko]=KDE 인터넷 데몬
Name[lt]=KDE interneto tarnyba
Name[lv]=KDE Interneta dēmons
Name[mk]=Даемон за Интернет на KDE
Name[ml]=കെഡിഈ ഇന്റര്‍നെറ്റ് സഹായി
Name[ms]=Daemon Internet KDE
Name[mt]=Daemon tal-internet KDE
Name[nb]=KDEs Internett-nisse
Name[nn]=KDE-Internett-nisse
Name[nso]=Daemon ya Internet ya KDE
Name[pl]=Demon internetowy KDE
Name[nds]=KDE-Internetdämoon
Name[ne]=केडीई इन्टरनेट डेइमोन
Name[nn]=KDE-Internett-teneste
Name[pa]=KDE ਇੰਟਰਨੈੱਟ ਡੈਮਨ
Name[pl]=Internet/sieć
Name[pt]=Servidor de Internet do KDE
Name[pt_BR]=Servidor Internet do do KDE
Name[ro]=Demon internet KDE
Name[ru]=Интернет-демон KDE
Name[pt_BR]=Servidor Internet do KDE
Name[ro]=Demon de Internet KDE
Name[ru]=Доступ к Интернету
Name[se]=KDE-Interneahtta-duogášprográmma
Name[sk]=KDE Internet démon
Name[sl]=Internetni strežnik za KDE
Name[sr]=KDE-ов интернет демон
Name[sr]=КДЕ‑ов интернет демон
Name[sr@latin]=KDEov internet demon
Name[sv]=KDE:s Internetdemon
Name[ta]=KDE இணைய டேமொன்
Name[th]=เดมอนอินเตอร์เน็ต KDE
Name[ta]=கேடிஇ இணைய டேமொன்
Name[tg]=KDE Азозили Интернет
Name[tr]=KDE İnternet Programı
Name[uk]=Демон Інтернет KDE
Name[uz]=KDE Интернет демони
Name[xx]=xxKDE Internet Daemonxx
Name[uk]=Фонова служба Інтернет KDE
Name[uz]=KDE Internet demoni
Name[uz@cyrillic]=KDE Интернет демони
Name[vi]=Trình nền Mạng KDE
Name[x-test]=xxKDE Internet Daemonxx
Name[zh_CN]=KDE Internet 守护进程
Name[zh_HK]=KDE 互聯網系統程式
Name[zh_TW]=KDE Internet 伺服程式
Name[zu]=KDE Internet ye-Daemon
Comment=An Internet daemon that starts network services on demand
Comment[ar]=مراقب انترنت يقوم ببدء خدمات الشبكة عند الطلب
Comment[ar]=رقيب الإنترنت بدأ خدمة الشبكة على الرقيب
Comment[bg]=Интернет демон, който служи за стартиране на мрежови услуги при поискване
Comment[bs]=Internet daemon koji pokreće mrežne servise po potrebi
Comment[bn]=একটি ইন্টারনেট ডিমন যে চাহিদা ভিত্তিক নেটওয়ার্ক সার্ভিস আরম্ভ করে
Comment[ca]=Un dimoni d'Internet que arrenca els serveis de xarxa sota demanda
Comment[cs]=Internetový démon spouštějící síťové služby na požádání
Comment[cy]=Daemon Rhyngrwyd sy'n cychwyn gwasanaethau rhwydwaith ar alw
Comment[da]=En internet-dæmon der starter netværkstjenester efter forespørgsel
Comment[de]=Ein Internet-Dämon, der Netzwerkdienste bei Bedarf startet
Comment[el]=Ένας δαίμονας για το διαδίκτυο ο οποίος ξεκινάει τις υπηρεσίες δικτύου βάση αίτησης
Comment[eo]=retdemono kiu lanĉas retajn servojn laŭ bezono
Comment[de]=Startet Netzwerkdienste bei Bedarf
Comment[el]=Ένας δαίμονας για το διαδίκτυο ο οποίος ξεκινάει τις υπηρεσίες δικτύου όταν απαιτείται
Comment[en_GB]=An Internet dæmon that starts network services on demand
Comment[eo]=Interreta demono kiu lanĉas retajn servojn laŭ bezono
Comment[es]=Un demonio de Internet que inicia los servicios de red a demanda
Comment[et]=Internetideemon, mis käivitab nõudmisel võrguteenused
Comment[fi]=Internet palvelin, joka käynnistää verkkopalveluita
Comment[eu]=Sare zerbitzuak eskatzean abiarazten dituen deabrua
Comment[fa]=یک شبح اینترنتی که خدمات شبکه را بر اساس تقاضا آغاز می‌کند
Comment[fi]=Internet-palvelin, joka käynnistää verkkopalveluita
Comment[fr]=Un démon Internet qui démarre le service réseau à la demande
Comment[gl]=Un demo de Internet que comenza servicios de rede según demanda
Comment[ga]=Deamhan Idirlín a thosaíonn seirbhísí líonra ar éileamh
Comment[gl]=Un daemon de Internet que comenza servizos de rede baixo demanda
Comment[he]=תהליך רקע של אינטרנט שמתחיל שירותי רשת לפי דרישה
Comment[hi]=एक इंटरनेट डेमन जो मांग पर नेटवर्क सेवा प्रारंभ करता है
Comment[hne]=एक इंटरनेट डेमन जऊन मांग मं नेटवर्क सेवा चालू करथे
Comment[hr]=Internet daemon koji pokreće mrežne usluge kada su zatražene
Comment[hu]=A hálózati szolgáltatások vezérlését biztosító program
Comment[is]=Internetþjónn sem ræsir tengingar við Internetið eftir þörfum
Comment[it]=Un demone internet che avvia i servizi di rete a richiesta
Comment[ja]=要求時にネットワークサービスを起動するインターネットデーモン
Comment[kk]=Талап етілгенде керек желі қызметтерді жегетін қызмет
Comment[km]=ដេមិន​អ៊ីនធឺណិត​ដែល​ចាប់ផ្ដើម​សេវា​បណ្ដាញ​នៅ​ពេល​ត្រូវការ
Comment[ko]=요청에 따라 네트워크 서비스를 시작하는 인터넷 데몬
Comment[lt]=Interneto tarnyba, paleidžianti tinklo tarnybas esant poreikiui
Comment[mn]=Сүлжээ-үйлчилгээний эрэлтээр ассан Сүлжээний демон
Comment[lv]=Interneta dēmons pēc vajadzības palaiž tīkla servisus
Comment[mk]=Даемон за Интернет кој ги вклучува мрежните сервиси на барање
Comment[ml]=ആവശ്യ‌പ്പെടുമ്പോള്‍ ശൃംഖലാസേവനം തുടങ്ങുന്ന ഒരു ഇന്റര്‍നെറ്റ് സഹായി
Comment[ms]=Daemon Internet yang memulakan servis jaringan di atas permintaan
Comment[mt]=Proċess tal-internet li jħaddem servizzi skond il-bżonn
Comment[nb]=Internett-nisse som starter nettverkstjenester ved behov
Comment[nl]=Een Internetdaemon die netwerkdiensten op afroep start
Comment[nn]=Internett-nisse som startar nettverkstenester når dei trengst
Comment[nso]=Daemon ya Internet yeo e thomisago ditirelo tsa kgokagano ge e nyakilwe
Comment[pl]=Demon internetowy, który uruchamia na żądanie usługi sieciowe
Comment[nds]=En Internet-Dämoon, wat Nettwarkdeensten op Anfraag start
Comment[ne]=एउटा इन्टरनेट डेइमोन जसले मागमा सञ्जाल सेवा सुरु गर्दछ
Comment[nl]=Een internetdaemon die netwerkdiensten op afroep start
Comment[nn]=Internett-teneste som startar nettverkstenester når dei trengst
Comment[pa]=ਇੱਕ ਇੰਟਰਨੈੱਟ ਡੈਮਨ, ਜੋ ਕਿ ਲੋੜ ਪੈਣ ਉੱਤੇ ਨੈੱਟਵਰਕ ਸਰਵਿਸਾਂ ਸ਼ੁਰੂ ਕਰਦੀ ਹੈ।
Comment[pl]=Uruchamianie usług na żądanie
Comment[pt]=Um servidor da Internet que inicia os serviços de rede a pedido
Comment[pt_BR]=Um servidor Internet que inicia os serviços de rede por demanda
Comment[ro]=Un demone internet care porneşte serviciile de reţea la cerere
Comment[ru]=Сетевой демон, запускающий серверы по запросу из сети
Comment[ro]=Un demon de Internet ce pornește serviciile de rețea la cerere
Comment[ru]=Служба установления подключения при запросе сетевых ресурсов
Comment[se]=Interneahtta-duogášprográmma mii álggaha fierpmádatbálvalusaid go dárbbašuvvo
Comment[sk]=Internetový démon ktorý spúšťa sieťové služby na požiadanie
Comment[sl]=Internetni strežnik, ki zažene omrežne storitve na zahtevo
Comment[sr]=Интернет демон који покреће мрежне сервисе по захтеву
Comment[sr@latin]=Internet demon koji pokreće mrežne servise po zahtevu
Comment[sv]=Internetdemon som startar nätverkstjänster vid behov
Comment[ta]=ஒரு இணைய டேமொன், டேமொன் பிணைய சேவையை ஆரம்பிகிறது
Comment[th]=เดมอนอินเตอร์เน็ตซึ่งจะเริ่มทำงานบริการเครือข่ายเมื่อมีความต้องการ
Comment[uk]=Демон Інтернет, що запускає служби мережі при запиті
Comment[uz]=Талаб қилинганда тармоқ хизматларини ишга тушурувчи Интернет демони
Comment[ven]=Internet daemon ine ya thoma tshumelo ya vhukwamani kha muthetho
Comment[ta]=ஒரு இணைய டேமொன், டேமொன் பிணைய சேவையை ஆரம்பிக்கிறது
Comment[tg]=Азозили шабакавие, ки хидматрасони шабакавиро бо дархост сар медиҳад
Comment[tr]=Başlangıçta ağ servisleri tarafından istenen internet hayalet programı
Comment[uk]=Фонова служба Інтернет, що запускає служби мережі при запиті
Comment[uz]=Talab qilinganda tarmoq xizmatlarini ishga tushuruvchi Internet demoni
Comment[uz@cyrillic]=Талаб қилинганда тармоқ хизматларини ишга тушурувчи Интернет демони
Comment[vi]=Một trình nền Mạng mà chạy các dịch vụ mạng theo nhu cầu
Comment[x-test]=xxAn Internet daemon that starts network services on demandxx
Comment[xh]=Internet daemon eqala iinkonzo zomsebenzi wonatha xa zifunwa
Comment[xx]=xxAn Internet daemon that starts network services on demandxx
Comment[zh_CN]=按需启动网络服务的守护进程
Comment[zh_HK]=自動依需求起動網絡服務的互聯網系統程式
Comment[zh_TW]=依要求起動網路服務的 Internet 伺服程式
Comment[zu]=I-Internet ye-daemon eqala ama-sevisi we-network adingekayo

View File

@@ -21,13 +21,14 @@
#include <kdedmodule.h>
#include <kservice.h>
#include <ksock.h>
#include <kprocess.h>
#include <k3process.h>
#include <qstringlist.h>
#include <qstring.h>
#include <qdatetime.h>
#include <qtimer.h>
#include <kserversocket.h>
#include <dnssd/publicservice.h>
#include <q3ptrlist.h>
#include "kserviceregistry.h"
class PortListener : public QObject {
@@ -37,6 +38,8 @@ private:
QString m_serviceName;
QString m_serviceURL, m_serviceAttributes;
QStringList m_registeredServiceURLs;
QString m_dnssdName, m_dnssdType;
QMap<QString,QString> m_dnssdData;
int m_serviceLifetime;
int m_port;
int m_portBase, m_autoPortRange;
@@ -46,19 +49,22 @@ private:
QString m_argument;
bool m_enabled;
bool m_serviceRegistered, m_registerService;
bool m_dnssdRegister, m_dnssdRegistered;
QDateTime m_expirationTime;
QDateTime m_slpLifetimeEnd;
QString m_uuid;
KServerSocket *m_socket;
KProcess m_process;
KNetwork::KServerSocket *m_socket;
K3Process m_process;
KConfig *m_config;
KServiceRegistry *m_srvreg;
DNSSD::PublicService *m_dnssdreg;
void freePort();
void loadConfig(KService::Ptr s);
void setEnabledInternal(bool e, const QDateTime &ex);
void dnssdRegister(bool enabled);
void setServiceRegistrationEnabledInternal(bool enabled);
public:
@@ -86,9 +92,8 @@ private slots:
class KInetD : public KDEDModule {
Q_OBJECT
K_DCOP
k_dcop:
public slots:
/**
* Returns a list of all registered services in KInetd.
* To add a service you need to add a .desktop file with
@@ -130,13 +135,13 @@ k_dcop:
/**
* Sets the port of the service, and possibly a range of ports to try.
* It will return true if a port could be found. If it didnt find one but is
* enabled it will start a timer that probes that port every 30s.
* It will return true if a port could be found. If it did not find one
* but is enabled it will start a timer that probes that port every 30s.
* @param service name of a service as specified in its .desktop file
* @param port the first port number to try or -1 to restore defaults
* @param autoPortRange the number of ports to try
* @return true if a port could be found or service is disabled, false
* otherwise.
* @return true if a port could be found or service is disabled, false
* otherwise.
*/
bool setPort(QString service, int port = -1, int autoPortRange = 1);
@@ -172,7 +177,7 @@ k_dcop:
KConfig *m_config;
KServiceRegistry *m_srvreg;
QPtrList<PortListener> m_portListeners;
Q3PtrList<PortListener> m_portListeners;
QTimer m_expirationTimer;
QTimer m_portRetryTimer;
QTimer m_reregistrationTimer;
@@ -184,7 +189,7 @@ k_dcop:
void reregistrationTimer();
public:
KInetD(QCString &n);
KInetD(QObject* parent, const QList<QVariant>&);
virtual ~KInetD();
void loadServiceList();
PortListener *getListenerByName(QString name);

233
kinetd/kinetd.notifyrc Normal file
View File

@@ -0,0 +1,233 @@
[Global]
IconName=kinetd
Comment=KInetD
Comment[bn]=কে-আইনেট-ডি
Comment[hi]=के-इनिट-डी
Comment[hne]=के-इनिट-डी
Comment[ml]=കെഐനെറ്റ്ഡി
Comment[sr]=КинетД
Comment[sv]=Kinetd
Comment[x-test]=xxKInetDxx
[Event/IncomingConnection]
Name=IncomingConnection
Name[ar]=اتصال وارد
Name[bn]=অন্তর্মুখী সংযোগ
Name[br]=Kevreadenn resev
Name[ca]=Connexió entrant
Name[cs]=Příchozí spojení
Name[cy]=CysylltiadCyrraedd
Name[da]=IndkommendeForbindelse
Name[de]=Eingehende Verbindung
Name[el]=Εισερχόμενη σύνδεση
Name[eo]=Envenanta konekto
Name[es]=Conexión entrante
Name[et]=Sissetulev ühendus
Name[eu]=Sarrerako konexioa
Name[fi]=Saapuva yhteys
Name[fr]=Connexion entrante
Name[ga]=Ceangal Isteach
Name[gl]=Conexón entrante
Name[he]=חיבור נכנס
Name[hi]=आवक-कनेक्शन
Name[hne]=आवक-कनेक्सन
Name[hr]=DolaznaVeza
Name[hu]=Bejövő kapcsolat
Name[it]=Connessioni in entrata
Name[ja]=外部からの接続
Name[km]=ការ​តភ្ជាប់​ចូល
Name[lt]=Gautas kvietimas ryšiui
Name[lv]=IenākošaisSavienojums
Name[mk]=Дојдовно поврзување
Name[ml]=ആഗമനബന്ധം
Name[ms]=Sambungan Masuk
Name[nb]=Innkommende tilkobling
Name[nds]=RinkamenVerbinnen
Name[nl]=Inkomende_verbinding
Name[nn]=Innkommande tilkopling
Name[pa]=ਆ ਰਹੇ ਕੁਨੈਕਸ਼ਨ
Name[pl]=Połączenia przychodzące
Name[pt_BR]=Conexões de Entrada
Name[ro]=ConexiuneDeIntrare
Name[ru]=Входящее соединение
Name[sk]=Prichádzajúce spojenia
Name[sl]=Prihajajoča povezava
Name[sr]=Долазна веза
Name[sr@latin]=Dolazna veza
Name[sv]=Inkommande anslutning
Name[ta]=உள்வரும் இணைப்புகள்
Name[tg]=Пайвастшавии Воридшаванда
Name[tr]=Gelen Bağlantı
Name[x-test]=xxIncomingConnectionxx
Name[xh]=Uxhumaniso Olungenayo
Name[zh_CN]=进入的连接
Name[zh_HK]=進入連線
Name[zh_TW]=進來的連線
Comment=Received incoming connection
Comment[af]=Ontvang inkomende verbinding
Comment[ar]=تلقي اتصال وارد
Comment[bn]=অন্তর্মুখী সংযোগ গ্রহণ করল
Comment[ca]=Rebuda connexió entrant
Comment[cs]=Obdrženo příchozí spojení
Comment[cy]=Derbynwyd cysylltiad a gyrhaeddodd
Comment[da]=Modtog indkommende forbindelse
Comment[de]=Verbindungsanfrage eingegangen
Comment[el]=Λήφθηκε μια εισερχόμενη σύνδεση
Comment[eo]=Ricevis envenantan konekton
Comment[es]=Recibida conexión entrante
Comment[et]=Saadi sissetulev ühendus
Comment[eu]=Konexio bat jaso da
Comment[fi]=Vastaanotettiin saapuva yhteys
Comment[fr]=Reçu une connexion entrante
Comment[ga]=Fuarthas ceangal isteach
Comment[gl]=Recebeuse unha conexón entrante
Comment[he]=נתקבל חיבור נכנס
Comment[hi]=आवक कनेक्शन प्राप्त
Comment[hne]=आवक कनेक्सन प्राप्त
Comment[hr]=Primio dolaznu vezu
Comment[hu]=Csatlakozási kérés érkezett
Comment[is]=Tók á móti uppkalli
Comment[it]=Connessione in entrata stabilita
Comment[ja]=外部からの接続がありました
Comment[km]=បាន​ទទួល​ការ​តភ្ជាប់​ចូល
Comment[ko]=들어오는 연결을 받았습니다
Comment[lt]=Gautas kvietimas ryšiui
Comment[lv]=Saņemts ienākošs savienojums
Comment[mk]=Примено е дојдовно поврзување
Comment[ml]=ആഗമനബന്ധം ലഭിച്ചു
Comment[ms]=Menerima sambungan masuk
Comment[nb]=Mottok innkommende tilkobling
Comment[nds]=Tokoppelanfraag kregen
Comment[nl]=Inkomende verbinding ontvangen
Comment[nn]=Fekk ei innkommande tilkopling
Comment[pa]=ਮਿਲੇ ਆ ਰਹੇ ਕੁਨੈਕਸ਼ਨ
Comment[pl]=Otrzymano połącznie przychodzące
Comment[pt]=Foi recebida uma ligação
Comment[pt_BR]=Recebendo conexão de entrada
Comment[ro]=Conexiune de intrare recepționată
Comment[ru]=Входящее соединение завершилось успешно
Comment[sk]=Prijaté príchodzie spojenia
Comment[sl]=Prejeta je prihajajoča povezava
Comment[sr]=Примљена је долазна веза
Comment[sr@latin]=Primljena je dolazna veza
Comment[sv]=Tar emot inkommande anslutning
Comment[tg]=Пайвастшавии воридшаванда қабул гардид
Comment[tr]=Gelen bağlantı alınıyor
Comment[uk]=Отримано вхідне з’єднання
Comment[x-test]=xxReceived incoming connectionxx
Comment[xh]=Uxhulumano olungenayo olufunyenweyo
Comment[zh_CN]=收到进入的连接
Comment[zh_HK]=已接收的進入連線
Comment[zh_TW]=接收到進來的連線
Action=None
[Event/ProcessFailed]
Name=ProcessFailed
Name[ar]=فشلت العملية
Name[bn]=প্রসেস ব্যর্থ
Name[ca]=Procés fallit
Name[cs]=Proces selhal
Name[cy]=MethoddProses
Name[da]=ProcesMislykkedes
Name[de]=Prozess fehlgeschlagen
Name[el]=Η διεργασία απέτυχε
Name[eo]=Procezo fiaskis
Name[es]=Proceso fallido
Name[et]=Protsess nurjus
Name[eu]=Prozesuak huts egin du
Name[fi]=Prosessi epäonnistui
Name[fr]=Échec du processus
Name[ga]=PróiseasTeipthe
Name[gl]=Fallou o proceso
Name[he]=תהליך נכשל
Name[hi]=प्रक्रिया-असफल
Name[hne]=काम-फेल
Name[hr]=ProcesNeuspješan
Name[hu]=Hibás folyamat
Name[it]=Processo fallito
Name[ja]=プロセス失敗
Name[km]=ដំណើរ​ការ​បាន​បរាជ័យ
Name[lt]=Procesas nepavyko
Name[lv]=ProcessNeveiksmīgs
Name[mk]=Процесот не успеа
Name[ml]=പ്രക്രിയ പരാജയപ്പെട്ടു
Name[ms]=Proses Gagal
Name[nb]=Prosessen mislyktes
Name[nds]=PerzessFehlslaan
Name[nl]=Proces_mislukt
Name[nn]=Prosessen feila
Name[pa]=ਪਰੋਸੈਸ ਫੇਲ੍ਹ
Name[pl]=Błąd procesu
Name[pt_BR]=Falha de Processo
Name[ro]=ProcesEșuat
Name[ru]=Ошибка процесса
Name[sk]=Proces neúspešny
Name[sl]=Proces ni uspel
Name[sr]=Процес није успео
Name[sr@latin]=Proces nije uspeo
Name[sv]=Process misslyckades
Name[ta]=செயல் தோல்வியுற்றது
Name[tg]=Ҷараён бо Нокомӣ анҷомид
Name[tr]=Başarısız İşlemler
Name[x-test]=xxProcessFailedxx
Name[xh]=Inkqubo Yahlulekile
Name[zh_CN]=处理失败
Name[zh_HK]=程序失敗
Name[zh_TW]=行程失敗
Comment=Could not call process to handle connection
Comment[af]=Kon nie roep proses na handvatsel verbinding
Comment[ar]= لا يمكن نداء الإجراء إلى مؤشر الاتصال
Comment[bn]=সংযোগ পরিচালনা করতে প্রসেস শুরু করতে পারল না
Comment[ca]=No es pot cridar al procés per a manejar la connexió
Comment[cs]=Nelze spustit proces k obsluze spojení
Comment[cy]=Methu galw proses i drin y cysylltiad
Comment[da]=Kunne ikke kalde proces til at håndtere forbindelse
Comment[de]=Der Prozess zur Bearbeitung der Verbindungsanfrage kann nicht gestartet werden
Comment[el]=Αδύνατη η κλήση της διεργασίας για τη διαχείριση της σύνδεσης
Comment[eo]=Ne eblis lanĉi la procezon por trakti la konekton
Comment[es]=No se puede llamar un proceso para manejar la conexión
Comment[et]=Ei suuda käivitada protsessi ühenduse käsitsemiseks
Comment[eu]=Ezin izan da konexioa kudeatzeko prozesua deitu
Comment[fi]=Ei voitu kutsua prosessia yhteyden hoitamiseksi
Comment[fr]=Impossible d'appeler le processus pour gérer la connexion
Comment[ga]=Níorbh fhéidir próiseas a thosú chun an ceangal a láimhseáil
Comment[gl]=Non foi posíbel chamar ao proceso que xestiona a conexón
Comment[he]=אין אפשרות לקרוא לתהליך על מנת לטפל בחיבור
Comment[hi]=कनेक्शन हैंडल करने के लिए प्रक्रिया काल नहीं कर सका
Comment[hne]=कनेक्सन हेंडल करे बर काम काल नइ कर सकिस
Comment[hr]=Nisam mogao pozvati proces za kontrolu veze
Comment[hu]=A kapcsolat kezelése nem sikerült
Comment[is]=Gat ekki kallað á forrit til að höndla tengingu
Comment[it]=Impossibile richiamare il processo per gestire la connessione
Comment[ja]=接続を扱うプロセスを呼び出せません
Comment[km]=មិន​អាច​ហៅ​ដំណើរ​ការ ដើម្បី​ដោះស្រាយ​ការ​ត​ភ្ជាប់​បាន​ឡើយ
Comment[ko]=연결을 처리하기 위한 프로세스를 부를 수 없습니다
Comment[lt]=Nepavyko iškviesti proceso apdoroti prisijungimui
Comment[lv]=Neizdevās izsaukt procesu savienojuma apstrādei
Comment[mk]=Не може да се повика процесот за ракување со поврзувањето
Comment[ml]=ബന്ധം കൈകാര്യം ചെയ്യാന്‍ പ്രക്രിയയെ വിളിക്കാന്‍ കഴിഞ്ഞില്ല
Comment[ms]=Tidak dapat memanggil proses untuk mengendalikan sambungan
Comment[nb]=Klarte ikke kalle på prosess for å håndtere tilkobling
Comment[nds]=Perzess för't Verarbeiden vun Tokoppelanfragen lett sik nich opropen
Comment[nl]=Kon geen proces aanroepen om de verbinding af te handelen
Comment[nn]=Klarte ikkje kalla på prosessen som skulle handtera tilkoplinga
Comment[pl]=Nie można było uruchomić procesu obsługi połączenia
Comment[pt]=Não foi possível invocar o processo para lidar com as ligações
Comment[pt_BR]=Não foi possível chamar o processo de controle da conexão
Comment[ro]=Procesul ce manipulează conexiunea nu a putut fi apelat
Comment[ru]=Не удаётся запустить процесс обработки соединения
Comment[sk]=Nemohol som zavolať proces pre spracovanie spojenia
Comment[sl]=Ni možno poklicati procesa za upravljanje s povezavo
Comment[sr]=Нисам могао да позовем процес да опслужи везу
Comment[sr@latin]=Nisam mogao da pozovem proces da opsluži vezu
Comment[sv]=Kunde inte anropa process för att hantera anslutning
Comment[ta]=இணைப்பை கையாள செயற்பாட்டை அழைக்க முடியவில்லை
Comment[tg]=Барои даскории пайвастшавӣ ҷараён бозхонда нашуд
Comment[tr]=Elle bağlantıda başarısız çağrı işlemleri
Comment[uk]=Не вдалося викликати процес для з’єднання
Comment[x-test]=xxCould not call process to handle connectionxx
Comment[xh]=Ayikwazanga ukubiza inkqubo ezakuphatha uxhulumano
Comment[zh_CN]=无法调用进程处理连接
Comment[zh_HK]=無法呼叫處理連線的程序
Comment[zh_TW]=無法呼叫行程來處理此連線
Action=None

View File

@@ -4,34 +4,46 @@
Type=ServiceType
X-KDE-ServiceType=KInetDModule
Name=KInetD Module Type
Name[ar]=KInetD نوع وحدة
Name[ar]=KInetD نوع الوحدة
Name[bg]=Модул на KInetD
Name[bs]=KInetD tip modula
Name[bn]=কে-আইনেট-ডি মডিউল ধরন
Name[br]=Seurt ar mollad KInetD
Name[ca]=Tipus de mòdul del KInetD
Name[cs]=Typ modulu KInetD
Name[cy]=Math Modiwl KInetD
Name[da]=KInetD-modultype
Name[de]=KInetD Modultyp
Name[eo]=KInetD-modulotipo
Name[de]=KInetD-Modultyp
Name[el]=Τύπος αρθρώματος KInetD
Name[eo]=KInetD modulotipo
Name[es]=Tipo de módulo KInetD
Name[et]=KInetD mooduli tüüp
Name[fi]=KInetD moduulityyppi
Name[eu]=KInetD modulu mota
Name[fa]=نوع پیمانۀ KInetD
Name[fi]=KInetD-moduulityyppi
Name[fr]=Type de module de KInetD
Name[ga]=Cineál Modúil KInetD
Name[gl]=Tipo de módulo KInetD
Name[he]=סוג מודול של KInetD
Name[hi]=के-इनिट-डी मॉड्यूल प्रकार
Name[hne]=के-इनिट-डी माड्यूल किसम
Name[hr]=Tip KInetD Modula
Name[hu]=KInetD modultípus
Name[is]=KInetD Module tegund
Name[it]=Tipo modulo KInetD
Name[ja]=KInetD モジュールタイプ
Name[kk]=KInetD модулі
Name[km]=ប្រភេទ​ម៉ូលឌុល KInetD
Name[ko]=KInetD 모듈 종류
Name[lt]=KInetD modulio tipas
Name[mn]=Модуль KInetD
Name[lv]=KInetD moduļa tips
Name[mk]=Тип на модул за KInetD
Name[ml]=കെഐനെറ്റ് ഘടക രീതി
Name[ms]=Jenis Modul KInetD
Name[mt]=Tip ta' modulu KInetD
Name[nb]=KInetd-programtillegstype
Name[nds]=KInetD-Moduultyp
Name[ne]=KInetD मोड्युल प्रकार
Name[nl]=KInetD-moduletype
Name[nn]=KInetD-programtilleggstype
Name[nso]=Mohuta wa Seripa sa KInetD
Name[pl]=Typ modułu KInetD
Name[pt]=Tipo de Módulo do KInetD
Name[pt_BR]=Módulo KInetD
@@ -40,17 +52,19 @@ Name[ru]=Модуль KInetD
Name[se]=KInetD-moduvlašládja
Name[sk]=Typ modulu KInetD
Name[sl]=Vrsta modula KInetD
Name[sr]=KInetD врста модула
Name[sr]=Врста модула КинетД‑а
Name[sr@latin]=Vrsta modula KInetDa
Name[sv]=Kinetd-modultyp
Name[ta]=KInetD கூறு வகை
Name[tg]=Навъи Модули KInetD
Name[tr]=KDED Modül Türü
Name[uk]=Тип модулю KinetD
Name[ven]=Lushaka lwa Modulu ya KInetD
Name[vi]=Kiểu môđun KInetD
Name[x-test]=xxKInetD Module Typexx
Name[xh]=Udidi Lomqongo womlinganiselo we KInetD
Name[xx]=xxKInetD Module Typexx
Name[zh_CN]=KInetD 模块类型
Name[zh_HK]=KInetD 模組類型
Name[zh_TW]=KInetD 模組類型
Name[zu]=KInetD Uhlobo Lokwenza
# id to manipulate the service
[PropertyDef::X-KDE-KINETD-id]
@@ -79,7 +93,7 @@ Type=QString
[PropertyDef::X-KDE-KINETD-multiInstance]
Type=bool
# if set, kinetd will register the given URL at the local SLP SA while
# if set, kinetd will register the given URL at the local SLP SA while
# the port is open. It will register one URL for each IP address of the
# host.
# The following strings will be substituted:
@@ -101,9 +115,31 @@ Type=QString
[PropertyDef::X-KDE-KINETD-serviceAttributes]
Type=QString
# the lifetime of a service in seconds. kinets will renew the service
# the lifetime of a service in seconds. kinets will renew the service
# automatically. Max 65535, never use anything under 2 min. Something like
# 5-20 minutes is a sane value for most desktop applications.
[PropertyDef::X-KDE-KINETD-serviceLifetime]
Type=int
# if set, kinetd will announce service with given name on local network while
# the port is open.
# The following strings will be substituted:
# %h with the local IP address
# %f with the user's full name
# %p with the port number
[PropertyDef::X-KDE-KINETD-DNSSD-Name]
Type=QString
# if kinetd announces service on network using DNS-SD, this string will be used as service
# type. It must be in form _yourservice._udp or _yourservice._tcp
# it uses the same substitution rules as X-KDE-KINETD-DNSSD-Name
[PropertyDef::X-KDE-KINETD-DNSSD-Type]
Type=QString
# defines list of text properties for service announced via DNS-SD
# it uses the same substitution rules as X-KDE-KINETD-DNSSD-Name
[PropertyDef::X-KDE-KINETD-DNSSD-Properties]
Type=QStringList

75
krfb.desktop Normal file
View File

@@ -0,0 +1,75 @@
# KDE Config File
[Desktop Entry]
Type=Application
Exec=krfb -caption "%c" %i
Icon=krfb
X-DocPath=krfb/index.html
Terminal=false
Name=Krfb
Name[bn]=কে-আর-এফ-বি
Name[hi]=केआरएफबी
Name[hne]=केआरएफबी
Name[ml]=കെആര്‍എഫ്ബി
Name[sr]=КРФБ
Name[sr@latin]=KRFB
Name[x-test]=xxKrfbxx
Name[zh_TW]=Krfb 桌面分享
GenericName=Desktop Sharing
GenericName[ar]=مشاركة سطح المكتب
GenericName[bg]=Споделяне на работното място
GenericName[bn]=ডেস্কটপ ভাগাভাগি
GenericName[br]=Rannañ ar vurev
GenericName[ca]=Compartició de l'escriptori
GenericName[cs]=Sdílení pracovní plochy
GenericName[cy]=Rhannu Penbwrdd
GenericName[da]=Desktopdeling
GenericName[de]=Arbeitsfläche freigeben
GenericName[el]=Κοινή χρήση επιφάνειας εργασίας
GenericName[eo]=Tabula komunigado
GenericName[es]=Escritorio compartido
GenericName[et]=Töölaua jagamine
GenericName[eu]=Mahaigain partekatzea
GenericName[fa]=اشتراک رومیزی
GenericName[fi]=Työpöydän jakaminen
GenericName[fr]=Partage de bureau
GenericName[ga]=Roinnt Deisce
GenericName[gl]=Compartilla de escritorio
GenericName[he]=שיתוף שולחנות עבודה
GenericName[hi]=डेस्कटॉप साझेदारी
GenericName[hne]=डेस्कटाप साझेदारी
GenericName[hu]=Munkaasztal-megosztás
GenericName[is]=Skjáborðsmiðlun
GenericName[it]=Condivisione desktop
GenericName[ja]=デスクトップ共有
GenericName[kk]=Үстелді ортақтастыру
GenericName[km]=ការ​ចែក​រំលែក​ផ្ទៃ​តុ
GenericName[ko]=데스크톱 공유
GenericName[lt]=Dalinimasis darbastaliu
GenericName[lv]=Darbvirsmas koplietošana
GenericName[ml]=പണിയിടം പങ്കുവെക്കല്‍
GenericName[nb]=Delte skrivebord
GenericName[nds]=Schriefdisch-Freegaav
GenericName[ne]=डेस्कटप साझेदारी
GenericName[nl]=Bureaublad delen
GenericName[nn]=Skrivebordsdeling
GenericName[pa]=ਡੈਸਕਟਾਪ ਸ਼ੇਅਰਿੰਗ
GenericName[pl]=Współdzielenie pulpitu
GenericName[pt]=Partilha do Ecrã
GenericName[pt_BR]=Compartilhamento de Ambiente de Trabalho
GenericName[ro]=Partajare birou
GenericName[ru]=Общий рабочий стол
GenericName[sk]=Zdieľanie pracovnej plochy
GenericName[sl]=Deljenje namizja
GenericName[sr]=Дељење површи
GenericName[sr@latin]=Deljenje površi
GenericName[sv]=Dela ut skrivbordet
GenericName[tr]=Masaüstü Paylaşımı
GenericName[uk]=Спільні стільниці
GenericName[uz]=Ish stoli bilan boʻlishish
GenericName[uz@cyrillic]=Иш столи билан бўлишиш
GenericName[vi]=Chia sẻ màn hình nền
GenericName[x-test]=xxDesktop Sharingxx
GenericName[zh_CN]=桌面共享
GenericName[zh_HK]=桌面分享
GenericName[zh_TW]=桌面分享
Categories=Qt;KDE;System;Network;RemoteAccess;

37
krfb.kcfg Normal file
View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE kcfg SYSTEM
"http://www.kde.org/standards/kcfg/1.0/kcfg.xsd">
<kcfg>
<kcfgfile />
<group name="TCP">
<entry name="useDefaultPort" type="Bool">
<label>Use the default port for VNC (5900)</label>
<default>true</default>
</entry>
<entry name="port" type="Int">
<label>This is the port on which krfb will listen.</label>
<default>5900</default>
</entry>
<entry name="publishService" type="Bool">
<label>Announce the service on the local network</label>
<default>true</default>
</entry>
</group>
<group name="Security">
<entry name="allowDesktopControl" type="Bool">
<label>Allow remote connections to manage the desktop.</label>
<default>true</default>
</entry>
<entry name="askOnConnect" type="Bool">
<label>Ask before allowing a remote connection.</label>
<default>true</default>
</entry>
<entry name="allowUninvitedConnections" type="Bool">
<label>Allow connections without an invitation.</label>
<default>false</default>
</entry>
<entry name="uninvitedConnectionPassword" type="String">
<label>Password for uninvited connections.</label>
</entry>
</group>
</kcfg>

1007
krfb.notifyrc Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,38 +0,0 @@
KDE_CXXFLAGS = $(USE_THREADS)
METASOURCES = AUTO
noinst_LTLIBRARIES = libkrfbconfig.la
libkrfbconfig_la_SOURCES = configuration.cc manageinvitations.ui \
personalinvitation.ui invite.ui invitation.cc
libkrfbconfig_la_LIBADD = ../srvloc/libsrvloc.la $(LIB_KDEUI)
bin_PROGRAMS = krfb
krfb_SOURCES = rfbcontroller.cc xupdatescanner.cc main.cpp \
newconnectiondialog.ui krfbifaceimpl.cc krfbiface.skel \
trayicon.cpp
krfb_LDADD = libkrfbconfig.la ../libvncserver/libvncserver.la ../srvloc/libsrvloc.la -lXtst $(LIB_KDEUI) $(LIBJPEG)
krfb_LDFLAGS = $(all_libraries) $(KDE_RPATH)
krfb_COMPILE_FIRST = manageinvitations.h personalinvitation.h invite.h
noinst_HEADERS = configuration.h invitation.h invite.h krfbiface.h \
krfbifaceimpl.h rfbcontroller.h trayicon.h xupdatescanner.h
appdatadir = $(kde_datadir)/krfb/pics
appdata_DATA = eyes-open24.png eyes-closed24.png connection-side-image.png
kde_services_DATA = kinetd_krfb.desktop
xdg_apps_DATA = krfb.desktop
appdir = $(kde_datadir)/krfb
app_DATA = eventsrc
KDE_ICON = krfb
INCLUDES= -I$(top_srcdir)/krfb/libvncserver -I$(top_srcdir)/krfb/srvloc \
$(all_includes)
messages: rc.cpp
$(XGETTEXT) rc.cpp *.cpp *.cc -o $(podir)/krfb.pot

View File

@@ -1,471 +0,0 @@
/***************************************************************************
configuration.cpp
-------------------
begin : Tue Dec 11 2001
copyright : (C) 2001-2003 by Tim Jansen
email : tim@tjansen.de
***************************************************************************/
/***************************************************************************
* *
* 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 "configuration.h"
#include "kinetinterface.h"
#include <kglobal.h>
#include <klocale.h>
#include <kapplication.h>
#include <kmessagebox.h>
#include <kprocess.h>
#include <ksockaddr.h>
#include <kactivelabel.h>
#include <qdatastream.h>
#include <dcopclient.h>
#include <dcopref.h>
#include <qlabel.h>
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qcheckbox.h>
/**
* Note that this class is used and provides GUI in every mode:
* - for the invitation dialogs
* - for the kcontrol module
* - for the running krfb instance
*/
Configuration::Configuration(krfb_mode mode) :
m_mode(mode),
invMngDlg(0, 0, true),
invDlg(0, 0, true),
persInvDlg(0, 0, true),
portNum(-1),
kinetdRef("kded", "kinetd")
{
kinetdRef.setDCOPClient(KApplication::dcopClient());
loadFromKConfig();
saveToDialogs();
doKinetdConf();
connect(invMngDlg.newPersonalInvitationButton, SIGNAL(clicked()),
SLOT(showPersonalInvitationDialog()));
connect(invMngDlg.newEmailInvitationButton, SIGNAL(clicked()), SLOT(inviteEmail()));
connect(invMngDlg.deleteOneButton, SIGNAL(clicked()), SLOT(invMngDlgDeleteOnePressed()));
connect(invMngDlg.deleteAllButton, SIGNAL(clicked()), SLOT(invMngDlgDeleteAllPressed()));
invMngDlg.listView->setSelectionMode(QListView::Extended);
invMngDlg.listView->setMinimumSize(QSize(400, 100)); // QTs size is much to small
connect(invDlg.createInvitationButton, SIGNAL(clicked()),
SLOT(showPersonalInvitationDialog()));
connect(invDlg.createInvitationEMailButton, SIGNAL(clicked()),
SLOT(inviteEmail()));
connect(invDlg.manageInvitationsButton, SIGNAL(clicked()),
SLOT(showManageInvitationsDialog()));
connect(invDlg.configurationButton, SIGNAL(clicked()),
SLOT(showConfigurationModule()));
connect(this, SIGNAL(invitationNumChanged(int)), this, SLOT(changeInvDlgNum(int)));
connect(this, SIGNAL(invitationNumChanged(int)),
&invMngDlg, SLOT(listSizeChanged(int)));
emit invitationNumChanged(invitationList.size());
connect(&refreshTimer, SIGNAL(timeout()), SLOT(refreshTimeout()));
refreshTimer.start(1000*60);
}
Configuration::~Configuration() {
save();
}
void Configuration::setKInetdEnabled(bool enabled) {
kinetdRef.send("setEnabled", QString("krfb"), enabled);
kinetdRef.send("setEnabled", QString("krfb_httpd"), enabled);
}
void Configuration::setKInetdEnabled(const QDateTime &date) {
kinetdRef.send("setEnabled", QString("krfb"), date);
kinetdRef.send("setEnabled", QString("krfb_httpd"), date);
}
void Configuration::setKInetdServiceRegistrationEnabled(bool enabled) {
kinetdRef.send("setServiceRegistrationEnabled",
QString("krfb"), enabled);
kinetdRef.send("setServiceRegistrationEnabled",
QString("krfb_httpd"), enabled);
}
void Configuration::getPortFromKInetd() {
DCOPReply r = kinetdRef.call("port", QString("krfb"));
if (!r.isValid())
return; // nice error msg here?
r.get(portNum);
}
void Configuration::setKInetdPort(int p) {
DCOPReply r = kinetdRef.call("setPort",
QString("krfb"), p, 1);
// nice error msg here?
}
void Configuration::removeInvitation(QValueList<Invitation>::iterator it) {
invitationList.remove(it);
save();
}
void Configuration::doKinetdConf() {
setKInetdPort(preferredPortNum);
if (allowUninvitedFlag) {
setKInetdEnabled(true);
setKInetdServiceRegistrationEnabled(enableSLPFlag);
getPortFromKInetd();
return;
}
QDateTime lastExpiration;
QValueList<Invitation>::iterator it = invitationList.begin();
while (it != invitationList.end()) {
Invitation &ix = (*it);
QDateTime t = ix.expirationTime();
if (t > lastExpiration)
lastExpiration = t;
it++;
}
if (lastExpiration.isNull() || (lastExpiration < QDateTime::currentDateTime())) {
setKInetdEnabled(false);
portNum = -1;
}
else {
setKInetdServiceRegistrationEnabled(false);
setKInetdEnabled(lastExpiration);
getPortFromKInetd();
}
}
void Configuration::loadFromKConfig() {
KConfig c("krfbrc");
allowUninvitedFlag = c.readBoolEntry("allowUninvited", false);
enableSLPFlag = c.readBoolEntry("enableSLP", true);
askOnConnectFlag = c.readBoolEntry("confirmUninvitedConnection", true);
allowDesktopControlFlag = c.readBoolEntry("allowDesktopControl", false);
preferredPortNum = c.readNumEntry("preferredPort", -1);
disableBackgroundFlag = c.readBoolEntry("disableBackground", false);
disableXShmFlag = c.readBoolEntry("disableXShm", false);
if (c.hasKey("uninvitedPasswordCrypted"))
passwordString = cryptStr(c.readEntry("uninvitedPasswordCrypted", ""));
else
passwordString = c.readEntry("uninvitedPassword", "");
unsigned int invNum = invitationList.size();
invitationList.clear();
c.setGroup("invitations");
int num = c.readNumEntry("invitation_num", 0);
for (int i = 0; i < num; i++)
invitationList.push_back(Invitation(&c, i));
invalidateOldInvitations();
if (invNum != invitationList.size())
emit invitationNumChanged(invitationList.size());
}
void Configuration::saveToKConfig() {
KConfig c("krfbrc");
c.writeEntry("confirmUninvitedConnection", askOnConnectFlag);
c.writeEntry("allowDesktopControl", allowDesktopControlFlag);
c.writeEntry("allowUninvited", allowUninvitedFlag);
c.writeEntry("enableSLP", enableSLPFlag);
c.writeEntry("preferredPort", preferredPortNum);
c.writeEntry("disableBackground", disableBackgroundFlag);
c.writeEntry("disableXShm", disableXShmFlag);
c.writeEntry("uninvitedPasswordCrypted", cryptStr(passwordString));
c.deleteEntry("uninvitedPassword");
c.setGroup("invitations");
int num = invitationList.count();
c.writeEntry("invitation_num", num);
int i = 0;
while (i < num) {
invitationList[i].save(&c, i);
i++;
}
}
void Configuration::saveToDialogs() {
invalidateOldInvitations();
QValueList<Invitation>::iterator it = invitationList.begin();
while (it != invitationList.end()) {
Invitation &inv = *(it++);
if (!inv.getViewItem())
inv.setViewItem(new KListViewItem(invMngDlg.listView,
inv.creationTime().toString(Qt::LocalDate),
inv.expirationTime().toString(Qt::LocalDate)));
}
invMngDlg.adjustSize();
}
void Configuration::save() {
saveToKConfig();
saveToDialogs();
doKinetdConf();
}
void Configuration::update() {
loadFromKConfig();
saveToDialogs();
}
Invitation Configuration::createInvitation() {
Invitation inv;
invitationList.push_back(inv);
return inv;
}
void Configuration::invalidateOldInvitations() {
QValueList<Invitation>::iterator it = invitationList.begin();
while (it != invitationList.end()) {
if (!(*it).isValid())
it = invitationList.remove(it);
else
it++;
}
}
void Configuration::refreshTimeout() {
unsigned int invNum = invitationList.size();
loadFromKConfig();
saveToDialogs();
if (invNum != invitationList.size())
emit invitationNumChanged(invitationList.size());
}
QString Configuration::hostname() const
{
KInetSocketAddress *a = KInetInterface::getPublicInetAddress();
QString hostName;
if (a) {
hostName = a->nodeName();
delete a;
}
else
hostName = "localhost";
return hostName;
}
///////// properties ///////////////////////////
krfb_mode Configuration::mode() const {
return m_mode;
}
bool Configuration::askOnConnect() const {
return askOnConnectFlag;
}
bool Configuration::allowDesktopControl() const {
return allowDesktopControlFlag;
}
bool Configuration::allowUninvitedConnections() const {
return allowUninvitedFlag;
}
bool Configuration::enableSLP() const {
return enableSLPFlag;
}
QString Configuration::password() const {
return passwordString;
}
QValueList<Invitation> &Configuration::invitations() {
return invitationList;
}
bool Configuration::disableBackground() const {
return disableBackgroundFlag;
}
bool Configuration::disableXShm() const {
return disableXShmFlag;
}
void Configuration::setAllowUninvited(bool allowUninvited) {
allowUninvitedFlag = allowUninvited;
}
void Configuration::setEnableSLP(bool e) {
enableSLPFlag = e;
}
void Configuration::setAskOnConnect(bool askOnConnect)
{
askOnConnectFlag = askOnConnect;
}
void Configuration::setAllowDesktopControl(bool allowDesktopControl)
{
allowDesktopControlFlag = allowDesktopControl;
}
void Configuration::setPassword(QString password)
{
passwordString = password;
}
int Configuration::port() const
{
if ((portNum < 5900) || (portNum >= 6000))
return portNum;
else
return portNum - 5900;
}
// use p=-1 for defaults
void Configuration::setPreferredPort(int p)
{
preferredPortNum = p;
}
int Configuration::preferredPort() const
{
return preferredPortNum;
}
void Configuration::setDisableBackground(bool disable) {
disableBackgroundFlag = disable;
}
void Configuration::setDisableXShm(bool disable) {
disableXShmFlag = disable;
}
////////////// invitation manage dialog //////////////////////////
void Configuration::showManageInvitationsDialog() {
loadFromKConfig();
saveToDialogs();
invMngDlg.exec();
}
void Configuration::invMngDlgDeleteOnePressed() {
QValueList<Invitation>::iterator it = invitationList.begin();
while (it != invitationList.end()) {
Invitation &ix = (*it);
KListViewItem *iv = ix.getViewItem();
if (iv && iv->isSelected())
it = invitationList.remove(it);
else
it++;
}
saveToKConfig();
doKinetdConf();
emit invitationNumChanged(invitationList.size());
}
void Configuration::invMngDlgDeleteAllPressed() {
invitationList.clear();
saveToKConfig();
doKinetdConf();
emit invitationNumChanged(invitationList.size());
}
////////////// invitation dialog //////////////////////////
void Configuration::showInvitationDialog() {
invDlg.exec();
emit invitationFinished();
saveToKConfig();
}
void Configuration::changeInvDlgNum(int newNum) {
invDlg.manageInvitationsButton->setText( i18n("&Manage Invitations (%1)...").arg(newNum) );
}
////////////// personal invitation dialog //////////////////////////
void Configuration::showPersonalInvitationDialog() {
loadFromKConfig();
Invitation inv = createInvitation();
save();
emit invitationNumChanged(invitationList.size());
invDlg.createInvitationButton->setEnabled(false);
invMngDlg.newPersonalInvitationButton->setEnabled(false);
persInvDlg.hostLabel->setText(QString("%1:%2").arg(hostname()).arg(port()));
persInvDlg.passwordLabel->setText(inv.password());
persInvDlg.expirationLabel->setText(
inv.expirationTime().toString(Qt::LocalDate));
persInvDlg.exec();
invDlg.createInvitationButton->setEnabled(true);
invMngDlg.newPersonalInvitationButton->setEnabled(true);
}
////////////// invite email //////////////////////////
void Configuration::inviteEmail() {
int r = KMessageBox::warningContinueCancel(0,
i18n("When sending an invitation by email, note that everybody who reads this email "
"will be able to connect to your computer for one hour, or until the first "
"successful connection took place, whatever comes first. \n"
"You should either encrypt the email or at least send it only in a "
"secure network, but not over the Internet."),
i18n("Send Invitation via Email"),
KStdGuiItem::cont(),
"showEmailInvitationWarning");
if (r == KMessageBox::Cancel)
return;
loadFromKConfig();
Invitation inv = createInvitation();
save();
emit invitationNumChanged(invitationList.size());
KApplication *app = KApplication::kApplication();
app->invokeMailer(QString::null, QString::null, QString::null,
i18n("Desktop Sharing (VNC) invitation"),
i18n("You have been invited to a VNC session. If you have the KDE Remote "
"Desktop Connection installed, just click on the link below.\n\n"
"vnc://invitation:%1@%2:%3\n\n"
"Otherwise you can use any VNC client with the following parameters:\n\n"
"Host: %4:%5\n"
"Password: %6\n\n"
"Alternatively you can click on the link below to start the VNC session\n"
"within your web browser.\n"
"\n"
" http://%7:%8/\n"
"\n"
"For security reasons this invitation will expire at %9.")
.arg(inv.password())
.arg(hostname())
.arg(port())
.arg(hostname())
.arg(port())
.arg(inv.password())
.arg(hostname())
.arg(5800) // determine with dcop ... later ...
.arg(KGlobal::locale()->formatDateTime(inv.expirationTime())));
}
////////////// invoke kcontrol module //////////////////////////
void Configuration::showConfigurationModule() {
KProcess p;
p << "kcmshell" << "Network/kcmkrfb";
p.start(KProcess::DontCare);
}
#include "configuration.moc"

View File

@@ -1,134 +0,0 @@
/***************************************************************************
configuration.h
-------------------
begin : Tue Dec 11 2001
copyright : (C) 2001-2003 by Tim Jansen
email : tim@tjansen.de
***************************************************************************/
/***************************************************************************
* *
* 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 CONFIGURATION_H
#define CONFIGURATION_H
#include "invitation.h"
#include "manageinvitations.h"
#include "personalinvitation.h"
#include "invite.h"
#include <dcopref.h>
#include <kconfig.h>
#include <qtimer.h>
#include <qobject.h>
#include <qvalidator.h>
#include <qstring.h>
enum krfb_mode {
KRFB_UNKNOWN_MODE = 0,
KRFB_KINETD_MODE,
KRFB_INVITATION_MODE,
KRFB_CONFIGURATION_MODE
};
/**
* This class stores the app's configuration, manages the
* standalone-config-dialog and all the invitation dialogs
* @author Tim Jansen
*/
class Configuration : public QObject {
Q_OBJECT
public:
Configuration(krfb_mode mode);
~Configuration();
krfb_mode mode() const;
bool askOnConnect() const;
bool allowDesktopControl() const;
bool allowUninvitedConnections() const;
bool enableSLP() const;
QString password() const;
QString hostname() const;
int port() const;
int preferredPort() const;
bool disableBackground() const;
bool disableXShm() const;
void setAllowUninvited(bool allowUninvited);
void setEnableSLP(bool e);
void setAskOnConnect(bool askOnConnect);
void setPassword(QString password);
void setPreferredPort(int p);
void setDisableBackground(bool disable);
void setDisableXShm(bool disable);
void save();
void update();
QValueList<Invitation> &invitations();
void removeInvitation(QValueList<Invitation>::iterator it);
signals:
void invitationFinished();
void invitationNumChanged(int num);
public slots:
void setAllowDesktopControl(bool allowDesktopControl);
void showManageInvitationsDialog();
void showInvitationDialog();
void showPersonalInvitationDialog();
void showConfigurationModule();
void inviteEmail();
private:
void loadFromKConfig();
void loadFromDialogs();
void saveToKConfig();
void saveToDialogs();
Invitation createInvitation();
void closeInvDlg();
void invalidateOldInvitations();
void setKInetdEnabled(const QDateTime &date);
void setKInetdEnabled(bool enabled);
void setKInetdServiceRegistrationEnabled(bool enabled);
void getPortFromKInetd();
void setKInetdPort(int port);
void doKinetdConf();
krfb_mode m_mode;
ManageInvitationsDialog invMngDlg;
InvitationDialog invDlg;
PersonalInvitationDialog persInvDlg;
QTimer refreshTimer;
bool askOnConnectFlag;
bool allowDesktopControlFlag;
bool allowUninvitedFlag;
bool enableSLPFlag;
int portNum, preferredPortNum;
DCOPRef kinetdRef;
QString passwordString;
QValueList<Invitation> invitationList;
bool disableBackgroundFlag;
bool disableXShmFlag;
private slots:
void refreshTimeout();
void invMngDlgDeleteOnePressed();
void invMngDlgDeleteAllPressed();
void changeInvDlgNum(int newNum);
};
#endif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -1,954 +0,0 @@
[!Global!]
IconName=krfb
Comment=Desktop Sharing
Comment[af]=Werkskerm Deeling
Comment[ar]=مشاركة سطح المكتب
Comment[bg]=Споделяне на работно място
Comment[bs]=Dijeljenje desktopa
Comment[ca]=Compartició de l'escriptori
Comment[cs]=Sdílení pracovní plochy
Comment[cy]=Rhannu Penbwrdd
Comment[da]=Skrivebordsdeling
Comment[de]=Arbeitsfläche freigeben
Comment[el]=Μοίρασμα επιφάνειας εργασίας
Comment[eo]=Tabula fordonado
Comment[es]=Compartición de escritorio
Comment[et]=Töölaua jagamine
Comment[fi]=Työpöydän jakaminen
Comment[fr]=Partage du bureau
Comment[gl]=Compartición do escritorio
Comment[he]=שיתוף שולחנות עבודה
Comment[hi]=डेस्कटॉप साझा
Comment[hr]=Dijeljenje radne površine
Comment[hu]=Munkaasztal-megosztás
Comment[it]=Condivisione desktop
Comment[ja]=デスクトップ共有
Comment[lt]=Dalinimasis darbastaliu
Comment[mn]=Ажлын байрыг хамтран эзэмших
Comment[ms]=Perkongsian Ruang Kerja
Comment[mt]=Qsim tad-desktop
Comment[nb]=Skrivebordsdeling
Comment[nl]=Bureaubladvrijgave
Comment[nn]=Skrivebordsdeling
Comment[nso]=Kabagano ya Desktop
Comment[pl]=Współdzielenie pulpitu
Comment[pt]=Partilha do Ecrã
Comment[pt_BR]=Compartilhamento do Ambiente de Trabalho
Comment[ro]=Partajare ecran
Comment[ru]=Параметры общего рабочего стола
Comment[sk]=Zdieľanie pracovnej plochy
Comment[sl]=Deljenje namizja
Comment[sr]=Дељење радне површине
Comment[sv]=Dela ut skrivbord
Comment[ta]=மேஜைமேல் பகிர்வு
Comment[th]=ใช้งานพื้นที่ทำงานร่วมกัน
Comment[tr]=Masaüstü Paylaşımı
Comment[uk]=Спільні стільниці
Comment[ven]=U kovhekana ha desikithopo
Comment[xh]=Ulwahlulelano lwe Desktop
Comment[xx]=xxDesktop Sharingxx
Comment[zh_CN]=桌面共享
Comment[zh_TW]=桌面分享
Comment[zu]=Ukuhlukaniselana kwe-Desktop
[UserAcceptsConnection]
Name=UserAcceptsConnection
Name[ar]=المستخدم قبل الاتصال
Name[bg]=Потребителят прие връзката
Name[ca]=L'usuari accepta la connexió
Name[cs]=Uživatel přijímá spojení
Name[cy]=DefnyddiwrDerbynCysylltiad
Name[da]=BrugerAcceptererForbindelse
Name[de]=BenutzerBestätigtVerbindung
Name[el]=Ο χρήστης δέχεται σύνδεση
Name[eo]=UzantoAkceptasKonektojn
Name[es]=El usuario acepta la conexión
Name[et]=Kasutaja ühendusega nõus
Name[fr]=L'utilisateur accepte les connexions
Name[gl]=O usuario acepta a conexión
Name[he]=משתמש מקבל חיבור
Name[hi]=उपयोगकर्ता-कनेक्शन-स्वीकारा
Name[hr]=KorisnikPrihvaćaVezu
Name[hu]=KapcsolatElfogadva
Name[it]=L'utente accetta la connessione
Name[ja]=ユーザが許可した接続
Name[lt]=Vartotojas priima prisijungima
Name[mn]=Хэрэглэгч зөвшөөрсөн холболт
Name[ms]=Pengguna Menerima Sambungan
Name[mt]=UserJaċċettaKonnessjoni
Name[nb]=Bruker tar i mot oppkobling
Name[nl]=Gebruiker accepteert verbinding
Name[nn]=Brukar godtek samband
Name[nso]=Modirisi o Amogela Kgokagano
Name[pl]=Połączenie akceptowane przez użytkownika
Name[pt_BR]=Aceita Conexões do Usuário
Name[ro]=Conexiune acceptată de utilizator
Name[ru]=Пользователь принимает соединения
Name[se]=Geavaheaddji dohkkeha oktavuođa
Name[sk]=Užívateľ akceptoval spojenie
Name[sl]=Uporabnik sprejema povezavo
Name[sr]=Корисник прихвата везе
Name[sv]=Användare accepterar anslutning
Name[ta]=பயணர் இணைப்பு ஏற்றுக்கொள்ளப்ப்ட்டது
Name[th]=ผู้ใช้ยอมรับการเชื่อมต่อ
Name[uk]=КористувачПриймаєЗ'єднання
Name[ven]=Mushumisi o tanganedza vhukwamani
Name[xh]=Umsebenzisi Wamkela Uxhulumaniso
Name[xx]=xxUserAcceptsConnectionxx
Name[zh_CN]=用户接受连接
Name[zh_TW]=使用者接受連線
Name[zu]=UmsebenziUvumelaUkuxhumana
Comment=User accepts connection
Comment[af]=Gebruiker aanvaar verbinding
Comment[ar]=المستخدم قبل الإتصال
Comment[bg]=Потребителят прие връзката
Comment[bs]=Korisnik prihvata konekciju
Comment[ca]=L'usuari accepta la connexió
Comment[cs]=Uživatel přijímá spojení
Comment[cy]=Mae'r defnyddiwr yn derbyn y cysylltiad
Comment[da]=Bruger accepterer forbindelse
Comment[de]=Der Benutzer bestätigt die Verbindung
Comment[el]=Ο χρήστης δέχεται σύνδεση
Comment[eo]=Uzanto akceptas konektojn
Comment[es]=El usuario acepta la conexión
Comment[et]=Kasutaja nõustub ühendusega
Comment[fi]=Käyttäjä hyväksyy yhteyden
Comment[fr]=l'utilisateur accepte les connexions
Comment[gl]=O usuario aceptou a conexión
Comment[he]=המשתמש מקבל את החיבור
Comment[hi]=उपयोगकर्ता कनेक्शन स्वीकारा
Comment[hr]=Korisnik prihvaća vezu
Comment[hu]=A felhasználó elfogadja a csatlakozási kérést
Comment[it]=L'utente accetta la connessione
Comment[ja]=ユーザが接続を許可
Comment[lt]=Vartotojas priima prisijungimą
Comment[mn]=Хэрэглэгч зөвшөөрсөн холболт
Comment[ms]= Pengguna menerima sambungan
Comment[mt]=User jaċċetta l-konnessjoni
Comment[nb]=Bruker tar imot oppkobling
Comment[nl]=Gebruiker accepteert verbinding
Comment[nn]=Brukar godtek samband
Comment[nso]=Modirisi o Amogela Kgokagano
Comment[pl]=Użytkownik akceptuje połączenie
Comment[pt]=O utilizador aceita a ligação
Comment[pt_BR]=O usuário aceita a conexão
Comment[ro]=Utilizatorul acceptă conexiunea
Comment[ru]=Пользователь принимает соединения
Comment[se]=Geavaheaddji dohkkeha oktavuođa
Comment[sk]=Užívateľ akceptoval spojenie
Comment[sl]=Uporabnik sprejema povezavo
Comment[sr]=Корисник прихвата везу
Comment[sv]=Användaren accepterar anslutning
Comment[ta]=பயணர் இணைப்பு ஏற்றுக்கொள்ளப்ப்ட்டது
Comment[th]=ผู้ใช้ยอมรับการเชื่อมต่อ
Comment[tr]=Kullanıcı bağlantıyı kabul etti
Comment[uk]=Користувач приймає з'єднання
Comment[ven]=Mushumisi o tanganedza vhukwamani
Comment[xh]=Umsebenzisi wamkela uxhulumaniso
Comment[xx]=xxUser accepts connectionxx
Comment[zh_CN]=用户接受连接
Comment[zh_TW]=使用者接受的連線
Comment[zu]=Umsebenzi uyakuvumela ukuxhumana
default_presentation=4
[UserRefusesConnection]
Name=UserRefusesConnection
Name[ar]=المستخدم رفض الاتصال
Name[bg]=Потребителят отказа връзката
Name[ca]=L'usuari refusa la connexió
Name[cs]=Uživatel odmítá spojení
Name[cy]=DefnyddiwrGwrthodCysylltiad
Name[da]=BrugerAfslårForbindelse
Name[de]=BenutzerLehntVerbindungAb
Name[el]=Ο χρήστης απορρίπτει σύνδεση
Name[eo]=UzantoRifuzasKonektojn
Name[es]=El usuario rechaza la conexión
Name[et]=Kasutaja keeldub ühendusest
Name[fr]=L'utilisateur refuse les connexions
Name[gl]=O usuario rexeita a conexión
Name[he]=משתמש דוחה חיבור
Name[hi]=उपयोगकर्ता-कनेक्शन-अस्वीकारा
Name[hr]=KorisnikOdbijaVezu
Name[hu]=KapcsolatVisszautasítva
Name[it]=L'utente rifiuta la connessione
Name[ja]=ユーザが拒否した接続
Name[lt]=Vartotojas atmeta prisijungimą
Name[mn]=Хэрэглэгч зөвшөөрөөгүй холболт
Name[ms]=Pengguna Menolak Sambungan
Name[mt]=UserJirrifjutaKonnessjoni
Name[nb]=Bruker avviser oppkobling
Name[nl]=Gebruiker weigert verbinding
Name[nn]=Brukar nektar samband
Name[nso]=Modirisi o Gana Kgokagano
Name[pl]=Połączenie odrzucone przez użytkownika
Name[pt_BR]=Rejeita Conexões do Usuário
Name[ro]=Conexiune respinsă de utilizator
Name[ru]=Пользователь не принимает соединения
Name[se]=Geavaheaddji hilgo oktavuođa
Name[sk]=Užívateľ zamietol spojenie
Name[sl]=Uporabnik zavrača povezavo
Name[sr]=Корисник одбија везе
Name[sv]=Användaren vägrar anslutning
Name[ta]=பயணர் இணைப்பு ஏற்க்கமறுக்கப்பட்டது
Name[th]=ผู้ใช้ปฏิเสธการเชื่อมต่อ
Name[tr]=Kullanıcı Bağlantıyı Reddetti
Name[uk]=КористувачВідмовляєУЗ'єднанні
Name[ven]=Mushumisi o hana Vhukwamani
Name[xh]=Umsebenzisi Uyalwala Uxhulumaniso
Name[xx]=xxUserRefusesConnectionxx
Name[zh_CN]=用户拒绝连接
Name[zh_TW]=使用者拒絕連線
Name[zu]=UmsebenzisiWalaUxhumaniso
Comment=User refuses connection
Comment[af]=Gebruiker weier verbinding
Comment[ar]=المستخدم رفض الاتصال
Comment[bg]=Потребителят отказа връзката
Comment[bs]=Korisnik odbija konekciju
Comment[ca]=L'usuari refusa la connexió
Comment[cs]=Uživatel odmítá spojení
Comment[cy]=Mae'r defnyddiwr yn gwrthod y cysylltiad
Comment[da]=Bruger afslår forbindelse
Comment[de]=Der Benutzer lehnt die Verbindung ab
Comment[el]=Ο χρήστης απορρίπτει σύνδεση
Comment[eo]=Uzanto rifuzas konektojn
Comment[es]=El usuario rechaza la conexión
Comment[et]=Kasutaja keeldub ühendusest
Comment[fi]=Käyttäjä hylkää yhteyden
Comment[fr]=L'utilisateur refuse les connexions
Comment[gl]=O usuario rexeitou a conexión
Comment[he]=המשתמש מסרב לחיבור
Comment[hi]=उपयोगकर्ता कनेक्शन अस्वीकारा
Comment[hr]=Korisnik odbija vezu
Comment[hu]=A felhasználó visszautasítja a csatlakozási kérést
Comment[it]=L'utente rifiuta la connessione
Comment[ja]=ユーザが接続を拒否
Comment[lt]=Vartotojas atmeta prisijungimą
Comment[mn]=Хэрэглэгч зөвшөөрөөгүй холболт
Comment[ms]=Pengguna menolak sambungan
Comment[mt]=User jiċħad il-konnessjoni
Comment[nb]=Bruker avviser oppkobling
Comment[nl]=Gebruiker weigert verbinding
Comment[nn]=Brukar nektar samband
Comment[nso]=Modirisi o gana kgokagano
Comment[pl]=Użytkownik odrzuca połączenie
Comment[pt]=O utilizador recusa a ligação
Comment[pt_BR]=O usuário rejeita a conexão
Comment[ro]=Utilizatorul refuză conexiunea
Comment[ru]=Пользователь не принимает соединения
Comment[se]=Geavaheaddji hilgo oktavuođa
Comment[sk]=Užívateľ odmietol spojenie
Comment[sl]=Uporabnik zavrnil povezavo
Comment[sr]=Корисник одбија везу
Comment[sv]=Användaren vägrar anslutning
Comment[ta]=பயணர் இணைப்பு ஏற்க்கமறுக்கப்பட்டது
Comment[th]=ผู้ใช้ปฏิเสธการเชื่อมต่อ
Comment[tr]=Kullanıcı bağlantıyı iptal etti
Comment[uk]=Користувач відмовляє у з'єднанні
Comment[ven]=Mushumisi o hana vhukwamani
Comment[xh]=Umsebenzisi wala uxhulumaniso
Comment[xx]=xxUser refuses connectionxx
Comment[zh_CN]=用户拒绝连接
Comment[zh_TW]=使用者拒絕的連線
Comment[zu]=Umsebenzi awukuvumeli ukuxhumana
default_presentation=4
[ConnectionClosed]
Name=ConnectionClosed
Name[ar]=اتصال مغلق
Name[bg]=Връзката е прекъсната
Name[ca]=Connexió tancada
Name[cs]=Spojení ukončeno
Name[cy]=CysylltiadArGau
Name[da]=ForbindelseLukket
Name[de]=VerbindungGeschlossen
Name[el]=Σύνδεση έκλεισε
Name[eo]=KonektoFermita
Name[es]=Conexión cerrada
Name[et]=Ühendus suletud
Name[fr]=Connexion fermée
Name[gl]=Conexión pechada
Name[he]=חיבור נסגר
Name[hi]=कनेक्शन-बन्द
Name[hr]=VezaPrekinuta
Name[hu]=KapcsolatBezárva
Name[it]=Connessione chiusa
Name[ja]=接続切断
Name[lt]=Prisijungimas uždarytas
Name[mn]=Холболт хаагдав
Name[ms]=Sambungan Ditutup
Name[mt]=KonnessjonijiMagħluqa
Name[nb]=Kobling stengt
Name[nl]=Verbinding gesloten
Name[nn]=Samband stengt
Name[nso]=Kgokagano e Tswaletswe
Name[pl]=Połączenia zakończone
Name[pt_BR]=Conexão fechada
Name[ro]=Conexiune închisă
Name[ru]=Соединение закрыто
Name[se]=Oktavuohta giddejuvui
Name[sk]=Spojenie ukončené
Name[sl]=Povezava zaprta
Name[sr]=Веза је затворена
Name[sv]=Anslutning stängd
Name[ta]=இணைப்புக்கள்
Name[th]=การเชื่อมต่อยุติ
Name[tr]=Bağlantı Kapatıldı
Name[uk]=З'єднанняЗакрито
Name[ven]=Vhukwamani ho valwa
Name[xh]=Uxhulumaniso Luvaliwe
Name[xx]=xxConnectionClosedxx
Name[zh_CN]=连接关闭
Name[zh_TW]=連線已關閉
Name[zu]=UkuxhumanisaKuvaliwe
Comment=Connection closed
Comment[af]=Verbinding gesluit
Comment[ar]=الاتصال قُطع
Comment[bg]=Връзката е прекъсната
Comment[bs]=Konekcija prekinuta
Comment[ca]=Connexió tancada
Comment[cs]=Spojení ukončeno
Comment[cy]=Mae'r cysylltiad ar gau
Comment[da]=Forbindelse lukket
Comment[de]=Verbindung geschlossen
Comment[el]=Σύνδεση έκλεισε
Comment[eo]=Konekto fermita
Comment[es]=Conexión rechazada
Comment[et]=Ühendus suletud
Comment[fi]=Yhteys suljettu
Comment[fr]=Connexion coupée
Comment[gl]=Conexión pechada
Comment[he]=החיבור נסגר
Comment[hi]=कनेक्शन बन्द
Comment[hr]=Veza prekinuta
Comment[hu]=A kapcsolat bezárva
Comment[it]=Connessione chiusa
Comment[ja]=接続が閉じられました
Comment[lt]=Prisijungimas uždarytas
Comment[mn]=Холболт хаагдав
Comment[ms]=Sambungan ditutup
Comment[mt]=Konnessjoni magħluqa
Comment[nb]=Oppkobling stengt
Comment[nl]=Verbinding verbroken
Comment[nn]=Samband stengt
Comment[nso]=Kopantsho e tswaletswe
Comment[pl]=Połączenie zakończone
Comment[pt]=Ligação fechada
Comment[pt_BR]=conexão encerrada
Comment[ro]=Conexiune închisă
Comment[ru]=Соединение закрыто
Comment[se]=Oktavuohta giddejuvvui
Comment[sk]=Spojenie ukončené
Comment[sl]=Povezava zaprta
Comment[sr]=Веза је затворена
Comment[sv]=Anslutning stängd
Comment[ta]=இணைப்புகள் மூடப்பட்டது
Comment[th]=การเชื่อมต่อยุติ
Comment[tr]=Bağlantı kesildi
Comment[uk]=З'єднання закрито
Comment[uz]=Алоқа узилди
Comment[ven]=Vhukwamani ho valwa
Comment[xh]=Uxhulumaniso luvaliwe
Comment[xx]=xxConnection closedxx
Comment[zh_CN]=连接关闭
Comment[zh_TW]=連線已關閉
Comment[zu]=Ukuxhumana kuvaliwe
default_presentation=4
[InvalidPassword]
Name=InvalidPassword
Name[ar]=كلمة مرور غير صالحة
Name[be]=Некарэктны пароль
Name[bg]=Невалидна парола
Name[ca]=Contrasenya no vàlida
Name[cs]=Neplatné heslo
Name[cy]=CyfrinairAnnilys
Name[da]=UgyldigtKodeord
Name[de]=UngültigesPasswort
Name[el]=Λάθος κωδικός πρόσβασης
Name[eo]=NevalidaPasvorto
Name[es]=Contraseña errónea
Name[et]=Vale parool
Name[fr]=Mots de passe non valable
Name[gl]=Contraseña inválida
Name[he]=סיסמה לא תקפה
Name[hi]=अवैध-पासवर्ड
Name[hr]=NevažećaLozinka
Name[hu]=ÉrvénytelenJelszó
Name[it]=Password non valida
Name[ja]=不正なパスワード
Name[lt]=Neteisingas slaptažodžis
Name[mn]=Буруу нууц үг
Name[ms]=Kata Laluan Tidak Sah
Name[mt]=PasswordĦażin
Name[nb]=Ugyldig passord
Name[nl]=Ongeldig wachtwoord
Name[nn]=Ugyldig passord
Name[nso]=Lentsuphetiso gase la Nnete
Name[pl]=Błędne hasło
Name[pt_BR]=Senha inválida
Name[ro]=Parolă eronată
Name[ru]=Неверный пароль
Name[se]=Gustomeahttun beassansátni
Name[sk]=Zlé heslo
Name[sl]=Nepravilno geslo
Name[sr]=Погрешна лозинка
Name[sv]=Ogiltigt lösenord
Name[ta]=செல்லாத கடவுச்சொற்கள்
Name[th]=รหัสผ่านไม่ถูกต้อง
Name[tr]=Geçersiz Parola
Name[uk]=НевірнийПароль
Name[ven]=Phasiwede asi yone
Name[xh]=Igama lokugqitha Elingasebenziyo
Name[xx]=xxInvalidPasswordxx
Name[zh_CN]=无效口令
Name[zh_TW]=無效的密碼
Name[zu]=IgamaEliyimfihloLokudlulaOkungasiyilona
Comment=Invalid password
Comment[af]=Ongeldige wagwoord
Comment[ar]=كلمة مرور غير صالحة
Comment[be]=Некарэктны пароль
Comment[bg]=Невалидна парола
Comment[bs]=Neispravna šifra
Comment[ca]=Contrasenya no vàlida
Comment[cs]=Neplatné heslo
Comment[cy]=Cyfrinair annilys
Comment[da]=Ugyldigt kodeord
Comment[de]=Ungültiges Passwort
Comment[el]=Λάθος κωδικός πρόσβασης
Comment[eo]=nevalida pasvorto
Comment[es]=Contraseña errónea
Comment[et]=Vale parool
Comment[fi]=Virheellinen salasana
Comment[fr]=Mot de passe non valable
Comment[gl]=Contraseña errónea
Comment[he]=הסיסמה אינה תקפה
Comment[hi]=अवैध पासवर्ड
Comment[hr]=Nevažeća šifra
Comment[hu]=Érvénytelen jelszó
Comment[it]=Password non valida
Comment[ja]=不正なパスワード
Comment[lt]=Neteisingas slaptažodis
Comment[mn]=Буруу нууц үг
Comment[ms]=Kata laluan tidak sah
Comment[mt]=Password ħażin
Comment[nb]=Ugyldig passord
Comment[nl]=Ongeldig wachtwoord
Comment[nn]=Ugyldig passord
Comment[nso]=Lentsuphetiso gase la nnete
Comment[pl]=Błędne hasło
Comment[pt]=Senha inválida
Comment[pt_BR]=senha inválida
Comment[ro]=Parolă eronată
Comment[ru]=Неверный пароль
Comment[se]=Gustomeahttun beassansátni
Comment[sk]=Zlé heslo
Comment[sl]=Nepravilno geslo
Comment[sr]=Погрешна лозинка
Comment[sv]=Ogiltigt lösenord
Comment[ta]=செல்லாத கடவுச்சொல்
Comment[th]=รหัสผ่านไม่ถูกต้อง
Comment[tr]=Geçersiz parola
Comment[uk]=Невірний пароль
Comment[uz]=Махфий сўз ҳақиқий эмас
Comment[ven]=Phasiwede isa shumi
Comment[wa]=Sicret nén valide
Comment[xh]=Igama lokugqitha elingasebenziyo
Comment[xx]=xxInvalid passwordxx
Comment[zh_CN]=无效口令
Comment[zh_TW]=無效的密碼
Comment[zu]=Igama elifihlikeli
default_presentation=4
[InvalidPasswordInvitations]
Name=InvalidPasswordInvitations
Name[ar]=دعوات كلمات مرور غير صالحة
Name[bg]=Невалидна подкана за парола
Name[ca]=Contrasenya convidats no vàlides
Name[cs]=Neplatné hesla výzev
Name[cy]=GwahoddiadauCyfrinairAnnilys
Name[da]=UgyldigtKodeordInvitationer
Name[de]=UngültigePasswortAnfragen
Name[eo]=NevalidaPasvortoInvito
Name[es]=Invitación de contraseñas erróneas
Name[et]=Vale parool kutsed
Name[fr]=Invitations de mot de passe non valable
Name[gl]=Invitación de Contraseñas inválidas
Name[he]=סיסמת לא תקפה - הזמנות
Name[hi]=अवैध-पासवर्ड-निमंत्रण
Name[hr]=KrivePizovniceŠifri
Name[hu]=ÉrvénytelenJelszóMeghívások
Name[it]=Invito password non valida
Name[ja]=不正なパスワードの招待
Name[lt]=Neteisingo slaptažodžio kvietimai
Name[mn]=Буруу нууц үгээр орох
Name[ms]=Jemputan Kata Laluan Tidak Sah
Name[mt]=PasswordĦażinaStediniet
Name[nb]=Ugyldig passord ved invitasjon
Name[nl]=Ongeldige wachtwoordaanvragen
Name[nn]=Ugyldige passordinvitasjonar
Name[nso]=Ditaletso tsa Mantsuphetiso tseo esego tsa Nnete
Name[pl]=Informacja o błędnym haśle
Name[pt_BR]=Aviso de senha inválida
Name[ru]=Неверный запрос пароля
Name[se]=Gustomeahttun beassansátnebovdehusat
Name[sk]=Zlé heslo pozvánky
Name[sl]=Povabila z nepravilnimi gesli
Name[sr]=Погрешни позиви са лозинкама
Name[sv]=Ogiltigt lösenord vid inbjudan
Name[ta]=செல்லாத கடவுச்சொற்கள் அழைப்பிதழ்
Name[uk]=ЗапрошенняЗНевірнимПаролем
Name[ven]=Mbidzo ya phasiwede isi yone
Name[xh]=IzimemoZegamalokugqithaEzingasebebenziyo
Name[xx]=xxInvalidPasswordInvitationsxx
Name[zh_CN]=无效口令邀请
Name[zh_TW]=無效的密碼邀請函
Name[zu]=IsimemoSegamaEliyimfihloLokudlulaOkungasiyilona
Comment=The invited party sent an invalid password. Connection refused.
Comment[af]=Die uitgenooi party gestuur 'n ongeldige wagwoord. Verbinding geweier.
Comment[ar]=الجهة المدعوة أرسلت كلمة مرور غير صالحة. الاتصال رُفض
Comment[bg]=Поканената страна изпрати невалидна парола. Връзката е отказана.
Comment[bs]=Pozvana strana je poslala neispravnu šifru. Konekcija je odbijena.
Comment[ca]=La part invitada ha enviat una contrasenya no vàlida. Connexió refusada.
Comment[cs]=Pozvaná strana poslala neplatné heslo. Spojení odmítnuto.
Comment[cy]=Anfonodd y person gwahodd cyfrinair annilys. Gwrthodwyd y cysylltiad.
Comment[da]=Den inviterede part sendte et ugyldigt kodeord. Forbindelse afslået.
Comment[de]=Die eingeladene Partei hat ein ungültiges Passwort gesendet: Verbindung abgelehnt.
Comment[el]=Η προσκαλεσμένη ομάδα έστειλε άκυρο κωδικό πρόσβασης. Η σύνδεση απορρίφθηκε.
Comment[eo]=La invitita kliento sendis nevalidan pasvorton. Konekto rifuzita.
Comment[es]=La parte invitada envió una contraseña incorrecta. Conexión rechazada
Comment[et]=Kutsutu saatis vigase parooli. Ühendusest keelduti.
Comment[fi]=Kutsuttu taho lähetti virheellisen salasanan. Yhteys hylättiin.
Comment[fr]=La partie invitée a envoyé un mot de passe non valable. Connexion refusée.
Comment[gl]=O invitado mandou unha contraseña inválida. A conexión foi rexeitada
Comment[he]=הצד המוזמן שלח סיסמה לא תקפה. החיבור נדחה.
Comment[hi]=निमंत्रित पार्टी ने अवैध पासवर्ड भेजा. कनेक्शन अस्वीकृत.
Comment[hr]=Stranka koju ste pozvali je poslala nevažeću šifru. Veza odbijena.
Comment[hu]=A meghívott fél érvénytelen jelszót küldött. A csatlakozás nem sikerült.
Comment[it]=La parte invitata ha inviato una password non valida. Connessione rifiutata.
Comment[ja]=招待された人が不正なパスワードを送って来ました。接続は拒否されました。
Comment[lt]=Kviečiančioji pusė atsiuntė blogą slaptažodį. Prisijungimas atmestas.
Comment[mn]=Буруу нууц үгийг уригдсан хэсэг илгээв. Холболт зөвшөөрөгдсөнгүй
Comment[ms]=Pihak yang dijemput telah menghantar kata laluan yang salah. Sambungan ditolak.
Comment[mt]=Il-persuna mistiedna bagħtet password ħażin. Konnessjoni miċħuda.
Comment[nb]=Den inviterte parten sendte ugyldig passord. Oppkobling avvist.
Comment[nl]=De uitgenodigde partij stuurde een ongeldig wachtwoord. Verbinding geweigerd.
Comment[nn]=Den inviterte parten sende eit ugyldig passord. Sambandet vart nekta.
Comment[nso]=Sehlopha seo se memilwego se romela lentsuphetiso leo esego la nnete. Kgokagano e gannwe.
Comment[pl]=Z drugiej strony podano błędne hasło. Połączenie odrzucone.
Comment[pt]=O convidado enviou uma senha inválida. A ligação foi recusada.
Comment[pt_BR]=A parte "convidada" enviou uma senha inválida. Conexão recusada.
Comment[ru]=Удалённый пользователь ввёл неверный пароль. В доступе отказано.
Comment[se]=Bovdejuvvon bealli sáddii gustomeahttun beassansáni. Oktavuohta hilgojuvui.
Comment[sk]=Pozvaný účastnik poslal zlé heslo. Spojenie zamietnuté.
Comment[sl]=Povabljena stranka je poslala nepravilno geslo. Povezava zavrnjena.
Comment[sr]=Позвана странка је послала погрешну лозинку. Веза је одбијена.
Comment[sv]=Den inbjudna personen skickade ett ogiltigt lösenord. Anslutning vägrades.
Comment[ta]=அழைத்த நபர் தவறான கடவுச்சொல்லை அணுப்பியுள்ளார். இணைப்பு நிராகரிக்கப் பட்டது.
Comment[th]=ผู้เข้าร่วมการเชิญชวนส่งรหัสผ่านมาไม่ถูกต้อง ทำการปฏิเสธการเชื่อมต่อ
Comment[uk]=Запрошена сторона надіслала невірний пароль. У з'єднанні відмовлено.
Comment[ven]=Murado o rambiwaho o rumela phasiwede isa shumi. Vhukwamani ho hanwa.
Comment[xh]=Umhlangano omenyiweyo uthumele igama lokugqitha elisebenzayo. Uxhulumano lwa liwe.
Comment[xx]=xxThe invited party sent an invalid password. Connection refused.xx
Comment[zh_CN]=受邀请方发送的口令不对。连接被拒绝。
Comment[zh_TW]=被邀請的一方送出無效的密碼。已拒絕連線。
Comment[zu]=Ingxenye emenyiwe ithumele igama lokungena alivunyelwanga. Ukuxhumana kwaliwe.
default_presentation=2
[NewConnectionOnHold]
Name=NewConnectionOnHold
Name[ar]=اتصال جديد على الانتظار
Name[bg]=Има задържана нова връзка
Name[ca]=Nova connexió en espera
Name[cs]=Nové spojení pozdrženo
Name[cy]=CysylltiadNewyddArArfael
Name[da]=NyForbindelseSatPåHold
Name[de]=NeueVerbindungWartet
Name[el]=Νέα σύνδεση σε αναμονή
Name[eo]=NovaKonektoAtendante
Name[es]=Nueva conexión en espera
Name[et]=Uus ühendus ootel
Name[fr]=Nouvelle connexion au raccroché
Name[gl]=Conexión en espera
Name[he]=חיבור חדש בהמתנה
Name[hi]=नया-कनेक्शन-आन-होल्ड
Name[hr]=NovaVezaNaČekanju
Name[hu]=ÚjKapcsolatTartva
Name[it]=Nuova connessione da tenere
Name[ja]=維持中の新規接続
Name[lt]=Naujas prisijungimas sulaikytas
Name[mn]=Шинэ холболт тогтоов
Name[ms]=Sambungan Baru Menunggu
Name[mt]=KonnessjoniĠdidaMiżmuma
Name[nb]=Ny oppkobling venter
Name[nl]=Nieuwe verbinding is wachtende
Name[nn]=Nytt samband ventar
Name[nso]=Kgokagano ye Ntshwa e Emisitswe
Name[pl]=Nowe połączenie wstrzymane
Name[pt_BR]=Nova Conexão
Name[ro]=Conexiune nouă în aşteptare
Name[ru]=Новое соединение отключено
Name[se]=Ođđa oktavuohta vuordimin
Name[sk]=Nové spojenie podržané
Name[sl]=Nova povezava na čakanju
Name[sr]=Нова веза је на чекању
Name[sv]=Ny anslutning väntar
Name[ta]=புதிய இணைப்பு வைக்கப்பட்டது
Name[uk]=ОчікуютьНовіЗ'єднання
Name[ven]=Vhukwamani vhuswa ho imiswa
Name[xh]=Uxhulumano Olutsha Lumisiwe
Name[xx]=xxNewConnectionOnHoldxx
Name[zh_CN]=新连接暂时搁置
Name[zh_TW]=保持的新連線
Name[zu]=UkuxhumanisaOkushaKubanjiwe
Comment=Connection requested, user must accept
Comment[af]=Verbinding versoekte, gebruiker moet aanvaar
Comment[ar]=طلب اتصال, يجب أن يقبل المستخدم
Comment[bg]=Заявена е връзка, потребителят трябва да я приеме
Comment[bs]=Zatražena konekcija, korisnik mora prihvatiti
Comment[ca]=Connexió sol·licitada, l'usuari ha d'acceptar-la
Comment[cs]=Vyžadováno spojení, uživatel musí přijmout
Comment[cy]=Cais wedi'i wneud am gysylltiad,rhaid i'r ddefnyddiwr ei dderbyn
Comment[da]=Forbindelse forespurgt, bruger skal acceptere
Comment[de]=Verbindungsanfrage, Benutzer muss bestätigen
Comment[el]=Ζητήθηκε σύνδεση, ο χρήστης πρέπει να αποδεχθεί
Comment[eo]=Konekto pridemandita, uzanto devas akcepti
Comment[es]=Conexión solicitada, el usuario debe aceptar
Comment[et]=Nõutakse ühendust, kasutaja peab seda lubama
Comment[fi]=Yhteyttä pyydettiin, käyttäjän tulee hyväksyä
Comment[fr]=Connexion demandée, l'utilisateur doit accepter
Comment[gl]=Petición de conexión en curo. O usuario ten que aceptar
Comment[he]=נתבקש חיבור, על המשתמש לקבלו
Comment[hi]=कनेक्शन निवेदित. उपयोगकर्ता को स्वीकार होना चाहिए
Comment[hr]=Veza je zatražena, korisnik mora prihvatiti
Comment[hu]=Csatlakozási kérés, megerősítés szükséges
Comment[it]=Connessione richiesta, l'utente deve accettare
Comment[ja]=接続が要求されています。ユーザは受け入れなければなりません。
Comment[lt]=Paprašyta prisijungimo, vartotojas turėtų priimti prašymą
Comment[mn]=Холболт хүсэж байна, хэрэглэгч зөвшөөрөх ёстой
Comment[ms]=Sambungan diminta, pengguna mesti menerima
Comment[mt]=Konnessjoni mitluba, user irid jaċċetta
Comment[nb]=Oppkobling ønskes, bruker må akseptere.
Comment[nl]=Verbinding verzocht, gebruiker dient te accepteren
Comment[nn]=Samband førespurd, brukar må godta
Comment[nso]=Kgokagano e kgopetswe, modirisi o swanetse go dumela
Comment[pl]=Próba połączenia, musi być zaakceptowana przez użytkownika
Comment[pt]=A ligação foi pedida e o utilizador deve aceitar
Comment[pt_BR]=Conexão requisitada; o usuário deve aceitar
Comment[ro]=Cerere de conectare; utilizatorul trebuie să accepte
Comment[ru]=Запрос на соединение, требуется подтверждение пользователя
Comment[se]=Oktavuohta jearahuvui, geavaheaddji ferte dohkkehit
Comment[sk]=Vyžiadané spojenie, užívateľ musí akceptovať
Comment[sl]=Povezava vzpostavljena, uporabnik mora sprejeti
Comment[sr]=Захтевана је веза, корисник мора да је прихвати
Comment[sv]=Anslutning begärd, användaren måste acceptera
Comment[ta]=இணைப்பு கோரிக்கப்பட்டது, பயணர் கண்டிப்பாக ஏற்றுக்கொள்ள வேண்டும்
Comment[th]=มีการร้องขอเชื่อมต่อ ผู้ใช้ต้องทำการยอมรับ
Comment[uk]=Запрошено з'єднання, користувач має прийняти
Comment[ven]=Vhukwamani ho humbelwa, mushumisi u fanela u tanganedza
Comment[xh]=Uxhulumaniso luceliwe, umsebenzisi kufanele amkele
Comment[xx]=xxConnection requested, user must acceptxx
Comment[zh_CN]=连接已请求,用户必须接受
Comment[zh_TW]=已請求連線,使用者必須接受
Comment[zu]=Ukuxhumanisa kuceliwe, umsebenzi kumele ivunyelwe
default_presentation=4
[NewConnectionAutoAccepted]
Name=NewConnectionAutoAccepted
Name[ar]=اتصال جديد مقبول تلقائياً
Name[bg]=Има приета нова връзка автоматично
Name[ca]=Nova connexió auto-acceptada
Name[cs]=Nové spojení automaticky přijato
Name[cy]=CysylltiadNewyddAwtoDerbyn
Name[da]=NyForbindelseAutomatiskAccepteret
Name[de]=NeueVerbindungAutomatischAkzeptiert
Name[el]=Αυτόματη αποδοχή νέας σύνδεσης
Name[eo]=NovaKonektoAŭtomateAkceptita
Name[es]=Nueva conexión auto aceptada
Name[et]=Uue ühendusega automaatselt nõus
Name[fr]=Nouvelle connexion auto-acceptée
Name[gl]=Nova conexión aceptada automáticamente
Name[he]=חיבור חדש נתקבל אוטומטית
Name[hi]=नया-कनेक्शन-स्वचालित-स्वीकारा
Name[hr]=NovaVezaAutoPrihvaćena
Name[hu]=ÚjKapcsolatAutoElfogadva
Name[it]=Accettata nuova connessione automatica
Name[ja]=新規接続の新規受け入れ
Name[lt]=Naujas prisijungimas automatiškai priimtas
Name[mn]=Шинэ холболтыг автоматаар зөвшөөрөв
Name[ms]=Sambungan Baru Diterima Auto
Name[mt]=KonnessjoniĠdidaAwtoAċċettata
Name[nb]=Ny oppkobling tas imot automatisk
Name[nl]=Nieuwe verbinding automatisch geaccepteerd
Name[nn]=Nytt samband automatisk godteke
Name[nso]=Kgokagano ye Ntshwa yago Itirisa e Amogetswe
Name[pl]=Nowe połączenie automatycznie przyjęte
Name[pt_BR]=Nova Conexão com aceitação automática
Name[ro]=Conexiune nouă acceptată automat
Name[ru]=Соединение создается автоматически
Name[se]=Ođđa oktavuohta dohkkehuvui automáhtalaččat
Name[sk]=Nové spojenie automaticky akceptované
Name[sl]=Nova povezava samodejno sprejeta
Name[sr]=Нова веза је аутоматски прихваћена
Name[sv]=Ny anslutning accepterades automatiskt
Name[ta]=இணைப்புக்கள்
Name[th]=รับการเชื่อมต่ออัตโนมัติ
Name[uk]=НовіЗ'єднанняАвтоматичноПрийняті
Name[ven]=Vhukwamani vhuswa ho tanganedzhwa
Name[xh]=Uxhulumano Olutsha Lwamkelwe Ngokuzenzekelayo
Name[xx]=xxNewConnectionAutoAcceptedxx
Name[zh_CN]=新连接自动接受
Name[zh_TW]=自動接受的新連線
Name[zu]=UkuxhumanisaOkushaKokuzenzakalelaKuvunyelwe
Comment=New connection automatically established
Comment[af]=Nuwe verbinding automaties vasgestel
Comment[ar]=اتصالات جديدة أُنشئت تلقائياً
Comment[bg]=Автоматично е установена нова връзка
Comment[bs]=Automatski uspostavljena nova konekcija
Comment[ca]=Nova connexió establerta automàticament
Comment[cs]=Automaticky navázáno nové spojení
Comment[cy]=Sefydlwyd cysylltiad newydd yn awtomatig
Comment[da]=Ny forbindelse automatisk etableret
Comment[de]=Neue Verbindung automatisch hergestellt
Comment[el]=Νέα σύνδεση αυτόματα αποκαταστάθηκε
Comment[eo]=Nova konekto aŭtomate akceptita
Comment[es]=Nueva conexión establecida automáticamente
Comment[et]=Uus ühendus automaatselt loodud
Comment[fi]=Uisi yhteys muodostettu automaattisesti
Comment[fr]=Nouvelle connexion établie automatiquement
Comment[gl]=Nova conexión automáticamente establecida
Comment[he]=נוצר חיבור חדש באופן אוטומטי
Comment[hi]=नया कनेक्शन स्वचालित स्थापित
Comment[hr]=Nova veza automatski prihvaćena
Comment[hu]=Automatikusan létrejött az új kapcsolat
Comment[it]=Stabilita nuova connessione automaticamente
Comment[ja]=新規接続は自動的に確立されます
Comment[lt]=Naujas prisijungimas sukurtas automatiškai
Comment[mn]=Шинэ холболт автоматаар тавигдав
Comment[ms]=Sambungan baru secara automatik terjalin
Comment[mt]=Konnessjoni ġdida aċċettata awtomatikament
Comment[nb]=Ny oppkobling automatisk opprettet
Comment[nl]=Nieuwe verbinding automatisch opgebouwd
Comment[nn]=Nytt samband automatisk oppretta
Comment[nso]=Kgokagano ye ntshwa e hlagisitswe kago itirsa
Comment[pl]=Nowe połączenie ustanowiono automatycznie
Comment[pt]=A nova ligação foi estabelecida automaticamente
Comment[pt_BR]=Nova conexão estabelecida automaticamente
Comment[ro]=Conexiune nouă stabilită automat
Comment[ru]=Новое соединение устанавливается автоматически
Comment[se]=Ođđa oktavuohta automáhtalaččat váldui
Comment[sk]=Nové spojenie automaticky vytvorené
Comment[sl]=Nova povezava samodejno vzpostavljena
Comment[sr]=Нова веза је аутоматски успостављена
Comment[sv]=Ny anslutning automatiskt upprättad
Comment[ta]=இணைப்புகள் மூடப்பட்டது
Comment[th]=เปิดการเชื่อมต่อใหม่อัตโนมัติ
Comment[uk]=Автоматично встановлено нове з'єднання
Comment[ven]=Vhukwamani vhuswa ho itwa na zwenezwo
Comment[xh]=Uxhulumaniso olutsha lufunyenwe ngokuzenzekelayo
Comment[xx]=xxNew connection automatically establishedxx
Comment[zh_CN]=自动建立新连接
Comment[zh_TW]=已自動建立新連線
Comment[zu]=Ukuxhumana okusha kuyazisungulela
default_presentation=4
[TooManyConnections]
Name=TooManyConnections
Name[ar]=اتصالات عديدة جداً
Name[bg]=Твърде много връзки
Name[ca]=Masses connexions
Name[cs]=Příliš mnoho spojení
Name[cy]=GormodOGysylltiadau
Name[da]=ForMangeForbindelser
Name[de]=ZuVieleVerbindungen
Name[el]=Πάρα πολλές συνδέσεις
Name[eo]=TroMultajKonektoj
Name[es]=Demasiadas conexiones
Name[et]=Liiga palju ühendusi
Name[fr]=Trop de connexions
Name[gl]=Demasiadas conexións
Name[he]=יותר מדיי חיבורים
Name[hi]=Tबहुत-सारे-कनेक्शन
Name[hr]=PrevišeVeza
Name[hu]=TúlSokKapcsolat
Name[it]=Troppe Connessioni
Name[ja]=多すぎる接続
Name[lt]=Per daug prisijungimų
Name[mn]=Дэндүү олон холболт
Name[ms]=Terlalu Banyak Sambungan
Name[mt]=WisqKonnessjonijiet
Name[nb]=For mange oppkoblinger
Name[nl]=Teveel verbindingen
Name[nn]=For mange samband
Name[nso]=Dikgokagano tse Ntshi Kudu
Name[pl]=Zbyt wiele połączeń
Name[pt_BR]=Conexões em excesso
Name[ro]=Prea multe conexiuni
Name[ru]=Слишком много соединений
Name[se]=Menddo ollu oktavuođat
Name[sk]=Príliš veľa spojení
Name[sl]=Preveč povezav
Name[sr]=Исувише много веза
Name[sv]=För många anslutningar
Name[ta]=பல இணைப்புக்கள்
Name[th]=มีการเชื่อมต่อมากเกินไป
Name[tr]=ÇokFazlaBağlantı
Name[uk]=ЗабагатоЗ'єднань
Name[ven]=Vhukwamani vhunzhi
Name[xh]=Uxhulumaniso Oluninzi Kakhulu
Name[xx]=xxTooManyConnectionsxx
Name[zh_CN]=连接太多
Name[zh_TW]=太多連線
Name[zu]=UkuxhumanaOkuningi
Comment=Busy, connection refused
Comment[af]=Besig, verbinding geweier
Comment[ar]=مشغول , الاتصال رُفض
Comment[bg]=Заето, връзката е отказана
Comment[bs]=Zauzet, konekcija odbijena
Comment[ca]=Ocupat, connexió refusada
Comment[cs]=Zaneprázdněn, spojení odmítnuto
Comment[cy]=Prysur, gwrthodwyd y cysylltiad
Comment[da]=Optaget, forbindelse afslået
Comment[de]=Beschäftigt, Verbindung abgelehnt
Comment[el]=Απασχολημένο, η σύνδεση απορρίφθηκε
Comment[eo]=Laborante, konekto rifuzita
Comment[es]=Ocupado, conexión rechazada
Comment[et]=Hõivatud, ühendusest keelduti
Comment[fi]=Varattu, yhteys hylättiin
Comment[fr]=Occupé, connexion refusée
Comment[gl]=Ocupado, conexión rexeitada
Comment[he]=תפוס, החיבור נדחה
Comment[hi]=व्यस्त, कनेक्शन अस्वीकृत
Comment[hr]=Zauzeto, veza odbijena
Comment[hu]=Foglalt, a csatlakozási kérés visszautasítva
Comment[it]=Occupato, connessione rifiutata
Comment[ja]=ビジーです。接続は拒否されました
Comment[lt]=Užimtas, prisijungimas atmestas
Comment[mn]=Шугам Чөлөөгүй, холболт зөвшөөрөгдсөнгүй
Comment[ms]=Sibuk, sambungan ditolak
Comment[mt]=Okkupat, konnessjoni miċħuda
Comment[nb]=Opptatt, oppkobling avvist
Comment[nl]=Bezig, verbinding geweigerd
Comment[nn]=Oppteken, samband nekta
Comment[nso]=E swaregile, kgokagano e gannwe
Comment[pl]=Zajęte, połączenie odrzucone
Comment[pt]=Ocupado, a ligação foi recusada
Comment[pt_BR]=Ocupado; conexão recusada
Comment[ro]=Ocupat; conexiune refuzată
Comment[ru]=Занято, соединение закрыто
Comment[sk]=Zaneprázdneny, spojenie odmietnuté
Comment[sl]=zaposlen, povezava zavrnjena
Comment[sr]=Заузето, веза је одбијена
Comment[sv]=Upptagen, anslutning vägras
Comment[ta]=இணைப்புக் மேலாளர்
Comment[th]=ยังไม่ว่าง ทำการปฏิเสธการเชื่อมต่อ
Comment[uk]=Зайнято, у з'єднанні відмовлено
Comment[uz]=Банд, алоқа рад этилди
Comment[ven]=U farakanea, vhukwamani ho hanwa
Comment[xh]=Uxhulumaniso, olu xakekileyo lwaliwe
Comment[xx]=xxBusy, connection refusedxx
Comment[zh_CN]=占线,连接拒绝
Comment[zh_TW]=忙碌,已拒絕連線
Comment[zu]=Imatasa,ukuxhumana kwaliwe
default_presentation=4
default_logfile=
[UnexpectedConnection]
Name=UnexpectedConnection
Name[ar]=اتصال غير متوقع
Name[bg]=Неочаквана връзка
Name[ca]=Connexió inesperada
Name[cs]=Neočekávané spojení
Name[cy]=CysylltiadAnnisgwyl
Name[da]=UventetForbindelse
Name[de]=UnerwarteteVerbindung
Name[el]=Μη αναμενόμενη σύνδεση
Name[eo]=NeatenditaKonekto
Name[es]=Conexión inesperada
Name[et]=Ootamatu ühendus
Name[fr]=Connexion inattendue
Name[gl]=Conexión inesperada
Name[he]=חיבור בלתי צפוי
Name[hi]=अप्रत्याशित-कनेक्शन
Name[hr]=NeočekivanaVeza
Name[hu]=NemVártKapcsolat
Name[it]=Connessione inaspettata
Name[ja]=予期しない接続
Name[lt]=Netikėtas prisijungimas
Name[mn]=Гэнэтийн Холболт
Name[ms]=Sambungan Luar Jangka
Name[mt]=KonnessjonijietMhuxMistennija
Name[nb]=Uventet oppkobling
Name[nl]=Onverwachte verbinding
Name[nn]=Uventa samband
Name[nso]=Kgokagano yeo ebego esa Emelwa
Name[pl]=Niespodziewane połączenie
Name[pt_BR]=Conexão não-aceita
Name[ro]=Conexiune neaşteptată
Name[ru]=Неожиданное соединение
Name[se]=Vuordekeahtes oktavuohta
Name[sk]=Neočakávane spojenie
Name[sl]=Nepričakovana povezava
Name[sr]=Неочекивана веза
Name[sv]=Oväntad anslutning
Name[ta]=பயணர் இணைப்பு ஏற்றுக்கொள்ளப்ப்ட்டது
Name[th]=การเชื่อมต่อที่ไม่คาดหวัง
Name[tr]=Beklenmedik Bağlantı
Name[uk]=НеочікуванеЗ'єднання
Name[ven]=Vhukwamani vhu songo lavhelelwaho
Name[xh]=Uxhulumaniso Olungalindelwanga
Name[xx]=xxUnexpectedConnectionxx
Name[zh_CN]=未料到的连接
Name[zh_TW]=非預期的連線
Name[zu]=UkuxhumanaOkungalindelwe
Comment=Received unexpected connection, abort
Comment[af]=Ontvang onverwagte verbinding, staak
Comment[ar]=تم استلام اتصال غير متوقع , اقطع
Comment[bg]=Получи се неочаквана връзка, прекъсване
Comment[bs]=Primio neočekivanu konekciju, prekidam
Comment[ca]=Rebuda una connexió inesperada, avortant
Comment[cs]=Obdrženo neočekávané spojení, přerušeno
Comment[cy]=Derbynwyd cysylltiad annisgwyl,terfynu
Comment[da]=Modtog uventet forbindelse, afbrød
Comment[de]=Unerwartete Verbindung hergestallt, Abbruch
Comment[el]=Λήψη μη αναμενόμενης σύνδεσης, διακοπή
Comment[eo]=Ricevis neatenditan konekton, haltis
Comment[es]=Recibida conexión inesperada, abortar
Comment[et]=Saadi ootamatu ühendus, loobuti
Comment[fi]=Vastaanotettiin odottamaton yhteys, lopeta
Comment[fr]=Reçu une connexion inattendue, interruption
Comment[gl]=Recibíuse unha conexión inesperada.
Comment[he]=נתקבל חיבור בלתי צפוי, בוטל
Comment[hi]=अप्रत्याशित कनेक्शन प्राप्त. छोड़ा
Comment[hr]=Primio sam neočekivanu vezu, prekid
Comment[hu]=Nem várt csatlakozási kérés, kilépés
Comment[it]=Ricevuta connessione inaspettata, termina
Comment[ja]=予期しない接続を受信しました。廃棄します。
Comment[lt]=Gautas netikėtas prisijungimas, nutraukiama
Comment[mn]=Гэнэтийн холболтийг хүлээн авав.Аборт
Comment[ms]=Menerima sambungan luar jangka, menamatkan
Comment[mt]=Irċevejt konnessjoni mhux mistennija, ieqaf
Comment[nb]=Mottok uventet oppkobling, avbryt
Comment[nl]=Ontving een onverwachte verbinding, gestopt
Comment[nn]=Mottok uventa samband, avbryt
Comment[nso]=Amogetse kgokagano yeo ebego esa emelwa, bolaya
Comment[pl]=Otrzymano niespodziewane połączenie. Przerwane.
Comment[pt]=Foi recebida uma ligação inesperada, a interromper
Comment[pt_BR]=conexão recebida inesperadamente; abortar
Comment[ro]=A fost recepţionată o conexiune neaşteptată şi a fost anulată
Comment[ru]=Получено неожиданное соединение. Отключение
Comment[se]=Oaččui vuordekeahtes oktavuođa, gaskkalduhte
Comment[sk]=Prijaté neočakávane spojenie, ukončujem
Comment[sl]=Prejeta nepričakovana povezava, prekinjam
Comment[sr]=Примљена је неочекивана веза, прекидам
Comment[sv]=Tog emot oväntad anslutning, avbryter
Comment[ta]=எதிர்பாராத இணைப்பு ஏற்க்கப்ப்ட்டது
Comment[th]=ได้รับการเชื่อมต่อที่ไม่คาดหวัง ทำการยกเลิก
Comment[uk]=Отримано неочікуване з'єднання, скасовую
Comment[ven]=Vhukwamani vhu songo lavhelelwaho ho tanganedzhwaho, litsha
Comment[xh]=Ufumene uxhulumaniso olungalindelekanga, lahla
Comment[xx]=xxReceived unexpected connection, abortxx
Comment[zh_CN]=收到未料到连接,中止
Comment[zh_TW]=接收到非預期的連線,放棄
Comment[zu]=Isithole ukuxhumana okungalindelekanga, hushula
default_presentation=4

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,125 +0,0 @@
/***************************************************************************
invitation.cpp
-------------------
begin : Sat Mar 30 2002
copyright : (C) 2002 by Tim Jansen
(C) Stefan Taferner (password encryption)
email : tim@tjansen.de
***************************************************************************/
/***************************************************************************
* *
* 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 "invitation.h"
/*
* Function for (en/de)crypting strings for config file, taken from KMail
* Author: Stefan Taferner <taferner@alpin.or.at>
*/
QString cryptStr(const QString &aStr) {
QString result;
for (unsigned int i = 0; i < aStr.length(); i++)
result += (aStr[i].unicode() < 0x20) ? aStr[i] :
QChar(0x1001F - aStr[i].unicode());
return result;
}
// a random string that doesn't contain i, I, o, O, 1, 0
// based on KApplication::randomString()
static QString readableRandomString(int length) {
QString str;
while (length)
{
int r = KApplication::random() % 62;
r += 48;
if (r > 57)
r += 7;
if (r > 90)
r += 6;
char c = char(r);
if ((c == 'i') ||
(c == 'I') ||
(c == '1') ||
(c == 'o') ||
(c == 'O') ||
(c == '0'))
continue;
str += c;
length--;
}
return str;
}
Invitation::Invitation() :
m_viewItem(0) {
m_password = readableRandomString(4)+"-"+readableRandomString(3);
m_creationTime = QDateTime::currentDateTime();
m_expirationTime = QDateTime::currentDateTime().addSecs(INVITATION_DURATION);
}
Invitation::Invitation(const Invitation &x) :
m_password(x.m_password),
m_creationTime(x.m_creationTime),
m_expirationTime(x.m_expirationTime),
m_viewItem(0) {
}
Invitation::Invitation(KConfig* config, int num) {
m_password = cryptStr(config->readEntry(QString("password%1").arg(num), ""));
m_creationTime = config->readDateTimeEntry(QString("creation%1").arg(num));
m_expirationTime = config->readDateTimeEntry(QString("expiration%1").arg(num));
m_viewItem = 0;
}
Invitation::~Invitation() {
if (m_viewItem)
delete m_viewItem;
}
Invitation &Invitation::operator= (const Invitation&x) {
m_password = x.m_password;
m_creationTime = x.m_creationTime;
m_expirationTime = x.m_expirationTime;
if (m_viewItem)
delete m_viewItem;
m_viewItem = 0;
return *this;
}
void Invitation::save(KConfig *config, int num) const {
config->writeEntry(QString("password%1").arg(num), cryptStr(m_password));
config->writeEntry(QString("creation%1").arg(num), m_creationTime);
config->writeEntry(QString("expiration%1").arg(num), m_expirationTime);
}
QString Invitation::password() const {
return m_password;
}
QDateTime Invitation::expirationTime() const {
return m_expirationTime;
}
QDateTime Invitation::creationTime() const {
return m_creationTime;
}
bool Invitation::isValid() const {
return m_expirationTime > QDateTime::currentDateTime();
}
void Invitation::setViewItem(KListViewItem *i) {
if (m_viewItem)
delete m_viewItem;
m_viewItem = i;
}
KListViewItem *Invitation::getViewItem() const{
return m_viewItem;
}

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +0,0 @@
#include <kapplication.h>
void InvitationDialog::helpClicked()
{
KApplication::kApplication()->invokeHelp();
}

View File

@@ -1,115 +0,0 @@
[Desktop Entry]
Encoding=UTF-8
Type=Service
ServiceTypes=KInetDModule
Exec=krfb
X-KDE-FactoryName=kinetd
X-KDE-KINETD-id=krfb
X-KDE-KINETD-port=5900
X-KDE-KINETD-autoPortRange=100
X-KDE-KINETD-enabled=false
X-KDE-KINETD-argument=--kinetd
X-KDE-KINETD-multiInstance=false
X-KDE-KINETD-serviceURL=service:remotedesktop.kde:vnc://%h:%p;(type=shared),(username=%u),(fullname=%f),(serviceid=%i)
X-KDE-KINETD-serviceAttributes=(type=shared),(username=%u),(fullname=%f),(serviceid=%i)
X-KDE-KINETD-serviceLifetime=1200
Name=KRfb Desktop Sharing
Name[ar]=KRfb مشاركة سطح المكتب
Name[bg]=Споделяне на работно място (KRfb)
Name[bs]=KRfb dijeljenje desktopa
Name[ca]=Compartició de l'escriptori KRfb
Name[cs]=Sdílení pracovní plochy KRfb
Name[cy]=Rhannu Penbwrdd KRfb
Name[da]=KRfb Skrivebordsdeling
Name[de]=KRfb Arbeitsfläche freigeben
Name[el]=KRfb μοίρασμα επιφάνειας εργασίας
Name[eo]=KRfb Tabula fordonado
Name[es]=Compartición de escritorio KRfb
Name[et]=KRfb Töölaua jagamine
Name[fi]=Työpöydän jakaminen
Name[fr]=Partage de bureau KRfb
Name[gl]=KRfb Compartición de Escritorios
Name[he]=שיתוף שולחנות עבודה של KRfb
Name[hi]=KRfb डेस्कटॉप साझा
Name[hr]=KRfb dijeljenje radne površine
Name[hu]=KRfb munkaasztal-megosztás
Name[it]=Condivisione desktop KRfb
Name[ja]=KRfb デスクトップ共有
Name[lt]=KRfb dalinimasis darbastaliu
Name[mn]=KRfb ажлын байр
Name[ms]=Perkongsian Ruang Kerja KRfb
Name[mt]=Qsim tad-desktop KRfb
Name[nb]=KRfb skrivebordsdeling
Name[nn]=KRfb-skrivebordsdeling
Name[nso]=Kabagano ya Desktop ya KRfp
Name[pl]=KRfb Współdzielenie pulpitu
Name[pt]=Partilha do Ecrã KRfb
Name[pt_BR]=Compartilhamento do Ambiente de Trabalho KRfb
Name[ro]=Partajare ecran KRfb
Name[ru]=Общий рабочий стол KRfb
Name[sk]=KRfb zdieľanie pracovnej plochy
Name[sl]=Deljenje namizja z KRfb
Name[sr]=KRfb дељење радне површине
Name[sv]=Krfb dela ut skrivbord
Name[ta]=மேசைமேல் பகிர்வு
Name[th]=แบ่งการใช้งานพื้นที่ทำงานร่วมกัน
Name[tr]=KRfb Masaüstü Paylaşımı
Name[uk]=Спільні стільниця KRfb
Name[ven]=U kovhekana ha Desikithopo ya KRfb
Name[xh]=Desktop ye KRfb Isebenza ngokuhlangeneyo
Name[xx]=xxKRfb Desktop Sharingxx
Name[zh_CN]=KRfb 桌面共享
Name[zh_TW]=KRfb 桌面分享
Name[zu]=KRfb ukwahlukanisela kwe-Desktop Sharing
Comment=A daemon that allows you to share your desktop
Comment[af]='n bediener wat laat toe jy na deel jou werkskerm
Comment[ar]=مراقب يسمح لك بمشاركة سطح مكتبك
Comment[bg]=Демон за споделяне на работното място
Comment[bs]=Daemon koji vam omogućuje da dijelite vaš desktop
Comment[ca]=Un dimoni que us permetrà compartir el vostre escriptori
Comment[cs]=Démon umožňující sdílení vaší plochy
Comment[cy]=Daemon sy'n gadael i chi rannu eich penbwrdd
Comment[da]=En dæmon der tillader dig at dele dit skrivebord
Comment[de]=Ein Dämon, der die Freigabe der Arbeitsfläche erlaubt
Comment[el]=Ένας δαίμονας που σας επιτρέπει να μοιραστείτε την επιφάνεια εργασίας σας
Comment[eo]=demono por permesi retan fordonadon de via tabulo
Comment[es]=Un demonio que le permite compartir su escritorio
Comment[et]=Deemon, mis lubab sul töölauda jagada
Comment[fi]=Palvelin joka mahdollistaa työpöydän jakamisen
Comment[fr]=Un démon qui vous permet de partager votre bureau
Comment[gl]=Un demo que permite a compartición do teu escritorio
Comment[he]=תהליך רקע שמאפשר לך לשתף את שולחן העבודה שלך
Comment[hi]=आपके डेस्कटॉप को साझा करने देने वाला डेमन
Comment[hr]=Daemon koji vam omogućuje da dijelite svoju radnu površinu s drugima
Comment[hu]=Munkaasztal-megosztási szolgáltatás
Comment[it]=Un demone che permette di condividere il tuo desktop
Comment[ja]=デスクトップ共有を可能にするデーモン
Comment[lt]=Tarnyba, leidžianti jums dalintis savo darbastaliu
Comment[mn]=Таны ажлын байрыг хамтран эзэмшихийгзөвшөөрсөн демон
Comment[ms]=Daemon yang membenarkan anda berkongsi ruang kerja
Comment[mt]=Daemon li jħallik taqsam id-desktop ma' ħaddieħor
Comment[nb]=En programnisse som tillater deling av ditt skrivebord med andre
Comment[nl]=Een daemon waarmee u uw bureaublad kunt vrijgeven om te delen
Comment[nn]=Ein nisse som let deg dela skrivebordet
Comment[nso]=Daemon yeo ego dumelelago go abelana ka desktop ya gago
Comment[pl]=Usługa, która pozwala na współdzielenie pulpitu
Comment[pt]=Um servidor que lhe permite partilhar o seu ecrã
Comment[pt_BR]=Um servidor que permite a você compartilhar o seu ambiente de trabalho
Comment[ro]=Un demon care vă permite saă partajaţi sistemul dumneavoastră
Comment[ru]=Демон общего доступа к рабочему столу
Comment[se]=Duogášprográmma mii diktá du juohkit čállinbeavddi earáiguin
Comment[sk]=Démon ktorý umožní zdieľať vašu pracovnú plochu
Comment[sl]=Demon, s katerim lahko delite vaše namizje
Comment[sr]=Демон који вам дозвољава да делите вашу радну површину
Comment[sv]=Demon som låter dig dela ut skrivbordet
Comment[ta]=ஒரு டேமொன் உங்கள் மேஜைமேல் பகிர்வை அளிக்கும்
Comment[th]=เดมอนอนุญาตให้คุณแบ่งการใช้งานพื้นที่ทำงานร่วมกัน
Comment[uk]=Демон, що дозволяє спільне використання стільниць
Comment[ven]=Daemon ine yani tendela nitshi kovhekana desktop yanu
Comment[xh]=Daemon ekuvumela ukuba wabe i desktop yakho
Comment[xx]=xxA daemon that allows you to share your desktopxx
Comment[zh_CN]=允许您共享桌面的守护进程
Comment[zh_TW]=讓您分享您的桌面的伺服程式
Comment[zu]=I-daemoni ekuvumela uhlukaniselana nge-desktop

View File

@@ -1,58 +0,0 @@
# KDE Config File
[Desktop Entry]
Type=Application
Exec=krfb -caption "%c" %i %m
Icon=krfb
DocPath=krfb/index.html
Terminal=0
Name=Desktop Sharing
Name[af]=Werkskerm Deeling
Name[ar]=مشاركة سطح المكتب
Name[bg]=Споделяне на работно място
Name[bs]=Dijeljenje desktopa
Name[ca]=Compartició de l'escriptori
Name[cs]=Sdílení pracovní plochy
Name[cy]=Rhannu Penbwrdd
Name[da]=Skrivebordsdeling
Name[de]=Arbeitsfläche freigeben
Name[el]=Μοίρασμα επιφάνειας εργασίας
Name[eo]=Tabuloj komunaj
Name[es]=Compartición de escritorio
Name[et]=Töölaua jagamine
Name[fi]=Työpöydän jakaminen
Name[fr]=Partage de bureau
Name[gl]=Compartición do escritorio
Name[he]=שיתוף שולחנות עבודה
Name[hi]=डेस्कटॉप साझा
Name[hr]=Dijeljenje radne površine
Name[hu]=Munkaasztal-megosztás
Name[it]=Condivisione Desktop
Name[ja]=デスクトップ共有
Name[lt]=Dalinimasis darbastaliu
Name[mn]=Ажлын байрыг хамтран эзэмших
Name[ms]=Perkongsian Ruang Kerja
Name[mt]=Qsim tad-desktop
Name[nb]=Delte skrivebord
Name[nl]=Bureaubladvrijgave
Name[nn]=Skrivebordsdeling
Name[nso]=Kabagano ya Desktop
Name[pl]=Współdzielenie pulpitu
Name[pt]=Partilha do Ambiente de Trabalho
Name[pt_BR]=Compartilhamento do Desktop
Name[ro]=Partajare ecran
Name[ru]=Общий рабочий стол
Name[sk]=Zdieľanie pracovnej plochy
Name[sl]=Deljenje namizja
Name[sr]=Дељење радне површине
Name[sv]=Dela ut skrivbordet
Name[ta]=மேசைமேல் பகிர்வு
Name[th]=ใช้งานพื้นที่ทำงานร่วมกัน
Name[tr]=Masaüstü Paylaşımı
Name[uk]=Спільні стільниці
Name[ven]=U kovhekana ha Desikithopo
Name[xh]=Ukwehlulelana kwe Desktop
Name[xx]=xxDesktop Sharingxx
Name[zh_CN]=桌面共享
Name[zh_TW]=桌面分享
Name[zu]=Ukwahlulelana kwe-Desktop
Categories=Qt;KDE;System

View File

@@ -1,24 +0,0 @@
#ifndef __KRFB_IFACE_H
#define __KRFB_IFACE_H
#include <dcopobject.h>
class krfbIface : virtual public DCOPObject
{
K_DCOP
k_dcop:
/**
* Quits krfb, connected clients will be disconnected.
*/
virtual void exit() = 0;
/**
* If this feature is activated krfb allows the connecting client to
* control the desktop (pointer & keyboard).
* @return a true to activate desktop control
*/
virtual void setAllowDesktopControl(bool a) = 0;
};
#endif

View File

@@ -1,27 +0,0 @@
/***************************************************************************
* *
* 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 "krfbifaceimpl.h"
KRfbIfaceImpl::KRfbIfaceImpl(RFBController *c) :
DCOPObject("krfbIface"),
controller(c)
{
}
void KRfbIfaceImpl::exit()
{
emit exitApp();
}
void KRfbIfaceImpl::setAllowDesktopControl(bool b)
{
controller->enableDesktopControl(b);
}
#include "krfbifaceimpl.moc"

View File

@@ -1,22 +0,0 @@
#ifndef __KRFB_IFACE_IMPL_H
#define __KRFB_IFACE_IMPL_H
#include <qobject.h>
#include "rfbcontroller.h"
#include "krfbiface.h"
class KRfbIfaceImpl : public QObject, public virtual krfbIface
{
Q_OBJECT
private:
RFBController *controller;
public:
KRfbIfaceImpl(RFBController *c);
signals:
void exitApp();
public:
void exit();
void setAllowDesktopControl(bool);
};
#endif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 305 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 505 B

View File

@@ -1,190 +0,0 @@
/***************************************************************************
main.cpp
-------------------
begin : Sat Dec 8 03:23:02 CET 2001
copyright : (C) 2001-2003 by Tim Jansen
email : tim@tjansen.de
***************************************************************************/
/***************************************************************************
* *
* 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 "trayicon.h"
#include "configuration.h"
#include "krfbifaceimpl.h"
#include "rfbcontroller.h"
#include <kpixmap.h>
#include <kaction.h>
#include <kdebug.h>
#include <kapplication.h>
#include <knotifyclient.h>
#include <ksystemtray.h>
#include <kcmdlineargs.h>
#include <kaboutdata.h>
#include <kaboutapplication.h>
#include <klocale.h>
#include <kmessagebox.h>
#include <qobject.h>
#include <qwindowdefs.h>
#include <qcstring.h>
#include <qdatastream.h>
#include <dcopref.h>
#include <signal.h>
#define VERSION "1.0"
static const char description[] = I18N_NOOP("VNC-compatible server to share "
"KDE desktops");
#define ARG_KINETD "kinetd"
static KCmdLineOptions options[] =
{
{ ARG_KINETD " ", I18N_NOOP("Used for calling from kinetd."), 0},
KCmdLineLastOption
};
void checkKInetd(bool &kinetdAvailable, bool &krfbAvailable) {
DCOPRef ref("kded", "kinetd");
ref.setDCOPClient(KApplication::dcopClient());
DCOPReply r = ref.call("isInstalled", QString("krfb"));
if (!r.isValid()) {
kinetdAvailable = false;
krfbAvailable = false;
return;
}
r.get(krfbAvailable);
kinetdAvailable = true;
}
int main(int argc, char *argv[])
{
KAboutData aboutData( "krfb", I18N_NOOP("Desktop Sharing"),
VERSION, description, KAboutData::License_GPL,
"(c) 2001-2003, Tim Jansen\n"
"(c) 2001, Johannes E. Schindelin\n"
"(c) 2000, heXoNet Support GmbH, D-66424 Homburg\n"
"(c) 2000-2001, Const Kaplinsky\n"
"(c) 2000, Tridia Corporation\n"
"(c) 1999, AT&T Laboratories Cambridge\n",
0, "", "tim@tjansen.de");
aboutData.addAuthor("Tim Jansen", "", "tim@tjansen.de");
aboutData.addAuthor("Ian Reinhart Geiser", "DCOP interface", "geiseri@kde.org");
aboutData.addCredit("Johannes E. Schindelin",
I18N_NOOP("libvncserver"));
aboutData.addCredit("Const Kaplinsky",
I18N_NOOP("TightVNC encoder"));
aboutData.addCredit("Tridia Corporation",
I18N_NOOP("ZLib encoder"));
aboutData.addCredit("AT&T Laboratories Cambridge",
I18N_NOOP("original VNC encoders and "
"protocol design"));
aboutData.addCredit("Jens Wagner (heXoNet Support GmbH)",
I18N_NOOP("X11 update scanner, "
"original code base"));
aboutData.addCredit("Jason Spisak",
I18N_NOOP("Connection side image"),
"kovalid@yahoo.com");
aboutData.addCredit("Karl Vogel",
I18N_NOOP("KDesktop background deactivation"));
KCmdLineArgs::init(argc, argv, &aboutData);
KCmdLineArgs::addCmdLineOptions(options);
KApplication app;
Configuration *config;
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
QString fdString;
if (!args->isSet(ARG_KINETD)) {
bool kinetdA, krfbA;
checkKInetd(kinetdA, krfbA);
if (!kinetdA) {
KMessageBox::error(0,
i18n("Cannot find KInetD. "
"The KDE daemon (kded) may have crashed or has not been started at all, or the installation failed."),
i18n("Desktop Sharing Error"));
return 1;
}
if (!krfbA) {
KMessageBox::error(0,
i18n("Cannot find KInetD service for Desktop Sharing (krfb). "
"The installation is incomplete or failed."),
i18n("Desktop Sharing Error"));
return 1;
}
config = new Configuration(KRFB_INVITATION_MODE);
config->showInvitationDialog();
return 0;
}
fdString = args->getOption(ARG_KINETD);
config = new Configuration(KRFB_KINETD_MODE);
args->clear();
if ((!config->allowUninvitedConnections()) && (config->invitations().size() == 0)) {
KNotifyClient::event("UnexpectedConnection");
return 1;
}
if (!RFBController::checkX11Capabilities())
return 1;
TrayIcon trayicon(new KAboutApplication(&aboutData),
config);
RFBController controller(config);
KRfbIfaceImpl dcopiface(&controller);
QObject::connect(&app, SIGNAL(lastWindowClosed()), // dont show passivepopup
&trayicon, SLOT(prepareQuit()));
QObject::connect(&app, SIGNAL(lastWindowClosed()),
&controller, SLOT(closeConnection()));
QObject::connect(&trayicon, SIGNAL(showManageInvitations()),
config, SLOT(showManageInvitationsDialog()));
QObject::connect(&trayicon, SIGNAL(enableDesktopControl(bool)),
&controller, SLOT(enableDesktopControl(bool)));
QObject::connect(&trayicon, SIGNAL(diconnectedMessageDisplayed()),
&app, SLOT(quit()));
QObject::connect(&dcopiface, SIGNAL(exitApp()),
&controller, SLOT(closeConnection()));
QObject::connect(&dcopiface, SIGNAL(exitApp()),
&app, SLOT(quit()));
QObject::connect(&controller, SIGNAL(sessionRefused()),
&app, SLOT(quit()));
QObject::connect(&controller, SIGNAL(sessionEstablished(QString)),
&trayicon, SLOT(showConnectedMessage(QString)));
QObject::connect(&controller, SIGNAL(sessionFinished()),
&trayicon, SLOT(showDisconnectedMessage()));
QObject::connect(&controller, SIGNAL(desktopControlSettingChanged(bool)),
&trayicon, SLOT(setDesktopControlSetting(bool)));
QObject::connect(&controller, SIGNAL(quitApp()),
&app, SLOT(quit()));
sigset_t sigs;
sigemptyset(&sigs);
sigaddset(&sigs, SIGPIPE);
sigprocmask(SIG_BLOCK, &sigs, 0);
bool ok;
int fdNum = fdString.toInt(&ok);
if (!ok) {
kdError() << "kinetd fd was not numeric." << endl;
return 2;
}
controller.startServer(fdNum);
return app.exec();
}

View File

@@ -1,216 +0,0 @@
<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
<class>ManageInvitationsDialog</class>
<widget class="QDialog">
<property name="name">
<cstring>ManageInvitationsDialog</cstring>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>680</width>
<height>350</height>
</rect>
</property>
<property name="caption">
<string>Manage Invitations - Desktop Sharing</string>
</property>
<property name="icon">
<pixmap>image0</pixmap>
</property>
<grid>
<property name="name">
<cstring>unnamed</cstring>
</property>
<property name="margin">
<number>11</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<spacer row="7" column="0">
<property name="name">
<cstring>Spacer10</cstring>
</property>
<property name="orientation">
<enum>Horizontal</enum>
</property>
<property name="sizeType">
<enum>Expanding</enum>
</property>
<property name="sizeHint">
<size>
<width>20</width>
<height>0</height>
</size>
</property>
</spacer>
<spacer row="0" column="1">
<property name="name">
<cstring>Spacer7</cstring>
</property>
<property name="orientation">
<enum>Vertical</enum>
</property>
<property name="sizeType">
<enum>Expanding</enum>
</property>
<property name="sizeHint">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
</spacer>
<widget class="KListView" row="0" column="0" rowspan="5" colspan="1">
<column>
<property name="text">
<string>Created</string>
</property>
<property name="clickable">
<bool>true</bool>
</property>
<property name="resizable">
<bool>true</bool>
</property>
</column>
<column>
<property name="text">
<string>Expiration</string>
</property>
<property name="clickable">
<bool>true</bool>
</property>
<property name="resizable">
<bool>true</bool>
</property>
</column>
<property name="name">
<cstring>listView</cstring>
</property>
<property name="hScrollBarMode">
<enum>AlwaysOff</enum>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<property name="fullWidth">
<bool>true</bool>
</property>
<property name="toolTip" stdset="0">
<string></string>
</property>
<property name="whatsThis" stdset="0">
<string>Displays the open invitations. Use the buttons on the right to delete them or create a new invitation.</string>
</property>
</widget>
<widget class="QPushButton" row="1" column="1">
<property name="name">
<cstring>newPersonalInvitationButton</cstring>
</property>
<property name="text">
<string>New &amp;Personal Invitation...</string>
</property>
<property name="toolTip" stdset="0">
<string>Create a new personal invitation...</string>
</property>
<property name="whatsThis" stdset="0">
<string>Click this button to create a new personal invitation.</string>
</property>
</widget>
<widget class="QPushButton" row="2" column="1">
<property name="name">
<cstring>newEmailInvitationButton</cstring>
</property>
<property name="text">
<string>&amp;New Email Invitation...</string>
</property>
<property name="toolTip" stdset="0">
<string>Send a new invitation via email...</string>
</property>
<property name="whatsThis" stdset="0">
<string>Click this button to send a new invitation via email.</string>
</property>
</widget>
<widget class="QPushButton" row="3" column="1">
<property name="name">
<cstring>deleteAllButton</cstring>
</property>
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Delete All</string>
</property>
<property name="toolTip" stdset="0">
<string>Delete all invitations</string>
</property>
<property name="whatsThis" stdset="0">
<string>Deletes all open invitations.</string>
</property>
</widget>
<widget class="QPushButton" row="4" column="1">
<property name="name">
<cstring>deleteOneButton</cstring>
</property>
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Delete</string>
</property>
<property name="toolTip" stdset="0">
<string>Delete the selected invitation</string>
</property>
<property name="whatsThis" stdset="0">
<string>Delete the selected invitation. The invited person will not be able to connect using this invitation anymore.</string>
</property>
</widget>
<widget class="QPushButton" row="6" column="1" rowspan="2" colspan="1">
<property name="name">
<cstring>closeButton</cstring>
</property>
<property name="text">
<string>&amp;Close</string>
</property>
<property name="toolTip" stdset="0">
<string>Closes this window.</string>
</property>
<property name="whatsThis" stdset="0">
<string>Closes this window.</string>
</property>
</widget>
</grid>
</widget>
<images>
<image name="image0">
<data format="XPM.GZ" length="6958">789cdd9859531b490cc7dff914aee82db5a5784e7b6a6b1f38c219ee9bad7d98d30718830f8c9ddaefbe6a493d10e3002178b3b55118fae7eed1bf5b52f78cf9f4b172b6b75df9f869a13f8807adb49236e35ee56336ec74c67ffef5c7d7850f7ebd42ff1dcfadb81f7e5bf8b03fa8a4959dee756e00ae08a04aff6a09736eb9ee19c65ac9dc8fa1e5c8e7f159c929f3a5e598fbf1dc72227c5672c67c68390d984f4b96fe03cb19f7435ab2ccbf69390f79fc45c9dc8f27960bee878eb25fe3f5c1c4b2eaed5b56bdcfc28ece07162dabbfbeb0ab7ab02a1c44da7fcb5cafd6450f772cc71c2fdcb62ceb8742390d63e62f9625bec8ec98f948bcf6947d8d77ddb2c403968483a028981bcc75a71e88ff7dcb1a8fad92a51e362d6bbeaf95d3808b09ba865d5abf2ffe7acc915bf722e663cbbec3f35b2f59c6b72cebfc6e94534fc6af5956bd6d61cfe667201c3a723f8261cff1aa7aff96b22f0c27caaa8f3e73e4e97c715339558e0dfb8e5f95f9436259eb6b45d9d7fe53e5bacc17b97e2839566fd5b2ae676c59d7bfae9ceaf8c8b2f61f088781d6cbb270acf945ce6fe00655d55f560e546f47b816e8fed915ae47124fbc638e8348ea03772d6bfe374a967a5c52ce74fcd070e8864e28faf7ca8132d747188791d437562debfc27ca99d6ff9a701c6b3febd7bc9aa3fb69ac1c68fdee0947819e375c1fb5a416493d63a29c29733dd73d2a70f1776c59f55aca81f483c3fce0af2b5c8ff47c4c95336138128e023d1f797f46be9d2f16c29123f1c54be540e31d5bd6fc1f0a27a19c4731af274aed786c2bdbfce4ca99ea73bd53b9e97ce14cd8eac7a0ace331138e1d3d5f46ca8130f0f91ea736ff712c5cc62b52b67aae70b9debe302558f43acab930048613bfdccf8bc289abf9bd520e95f9fc48b224d6e7cbad722e0cf796f57ce4e7451ad8fd0255655bff4de1d4d5fd36520e953de6ccae1fee84d3589f17fcbccc02738232b785b350f33954ce95f9799be56eeacaf913081b63762cebf815e15c3946c37958c6eb48387775bd9c5f1aaefb095039d7f38cf3531485dd6f9e7221bc3f98affd9f3410e66ba5463c37b31a312698cec5128c4b8d14b3b9583aa59163f18e2b28c8df538d021bef988706f97baa919a0cbd9b953e9f6accae716cceb6efed89ff9606fbc9b0856dbca4e85e71555c61472bc6d83576f1e6a9de6b34749eb7747fce1a09f6c87797ae7da201b5867847bf5bd4eab3ca08afdfa47143f36ea9c63d5f8734f3312915e47fc8b59ee084567963d6f4231aec7d848b1497019f0009f99d50db5cc506fa8999c1907efab49ecb8798bd42e396fc7769de19fb3171e991cfa527d721f7f6e85ad03cda1cdb9b576a8c38d366a6e6c744fe8ebc4e5f87dcdbd331268a661f775fd6e0f57668dd63f6dda3eb32aeccb4cf94233be68eb506a4d6650fcf6bdc92f5b56e96e94468e02aaee1fa0c5ba39e86da1d6e908a5961ca1e9ed71891b5343e0ddcc42df2f505b77167cab6e9d335ea15dbd4188e295ac6c3f31a05d958e3d3a0f5ece21eeee3011e4ed9017dba47bd976c5d1a2bd11b53f693173436c8861a81091ee1319ee029f93cc3f34776469f9ce20556d141173d1a3729a3b644f6bcc626994f639b18d09d6ea9718e21d6d442a24356a963442a1e8d3ba2f14dd618e04b7565ec1efb80e801400c09a4460132c8a180065941ad4c54a0092d6893061bddd327ff26332f6be85dd0260f4df6750957d0816bd30bd7d4ba82cba71a6ced979f1fdfd5e840176e58e3865a9db968dc42cf3ee3a047f4abd66132dffa098dd7e4c35470fc4a8db1d655a931bbae20853e0c60a833baa3353cbc75bc74ee0236608401dcc39876c0a9a84cef0f98c0222cc132ac689452f1fecab31df8fda8813db8a79d7c317b9fc36758853552d07d0eeb3fa2c1634ce4d731850dd8842df8327d5ec136ecc02eec51ee8ca546e14def25e51b19ec4f9fbb7000877044275b39e68def3e0f1ac7d34f0f3881533a69e39fd598a5366deff79ef8a3f6eb35decd666bd8ef1f9b6ffecef1f2f70ff91ed5a593e41ae7f43d0acee01c2ea00a0e16e08247ed7338d3ef756d7e9728f4cefc51fbdbde6f3f7faae1430021d4a04e1a11a52624f675acbc5b9bb774d1e896edc7bd8fc7ccd488c1fc9196bc2798533ba2b61f838ecdf5ccc855232fdb8f7b1f8f99d6f0f91d791eb684febffab78c796afcfdfbc23fde05c197</data>
</image>
</images>
<connections>
<connection>
<sender>listView</sender>
<signal>selectionChanged()</signal>
<receiver>ManageInvitationsDialog</receiver>
<slot>listSelectionChanged()</slot>
</connection>
<connection>
<sender>closeButton</sender>
<signal>clicked()</signal>
<receiver>ManageInvitationsDialog</receiver>
<slot>accept()</slot>
</connection>
</connections>
<includes>
<include location="global" impldecl="in declaration">klistview.h</include>
<include location="local" impldecl="in implementation">manageinvitations.ui.h</include>
</includes>
<slots>
<slot>listSizeChanged( int i )</slot>
<slot>listSelectionChanged()</slot>
</slots>
<layoutdefaults spacing="6" margin="11"/>
<includehints>
<includehint>klistview.h</includehint>
</includehints>
</UI>

View File

@@ -1,15 +0,0 @@
void ManageInvitationsDialog::listSizeChanged(int i) {
deleteAllButton->setEnabled(i);
}
void ManageInvitationsDialog::listSelectionChanged() {
QListViewItem *i = listView->firstChild();
while(i) {
if (i->isSelected()) {
deleteOneButton->setEnabled(true);
return;
}
i = i->nextSibling();
}
deleteOneButton->setEnabled(false);
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,912 +0,0 @@
/***************************************************************************
rfbcontroller.cpp
-------------------
begin : Sun Dec 9 2001
copyright : (C) 2001-2003 by Tim Jansen
email : tim@tjansen.de
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
/*
* Contains keyboard & pointer handling from libvncserver's x11vnc.c
*/
#include "rfbcontroller.h"
#include "kuser.h"
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <fcntl.h>
#ifdef USE_SOLARIS
#include <strings.h>
#endif
#include <kapplication.h>
#include <knotifyclient.h>
#include <kdebug.h>
#include <kmessagebox.h>
#include <klocale.h>
#include <kextsock.h>
#include <qstring.h>
#include <qcursor.h>
#include <qwindowdefs.h>
#include <qtimer.h>
#include <qcheckbox.h>
#include <qpushbutton.h>
#include <qglobal.h>
#include <qlabel.h>
#include <qmutex.h>
#include <qdeepcopy.h>
#include <qclipboard.h>
#include <qdesktopwidget.h>
#include <X11/Xutil.h>
#include <X11/extensions/XTest.h>
#ifndef ASSERT
#define ASSERT(x) Q_ASSERT(x)
#endif
#define IDLE_PAUSE (1000/50)
#define MAX_SELECTION_LENGTH (4096)
static XTestDisabler disabler;
static const char* cur=
" "
" x "
" xx "
" xxx "
" xxxx "
" xxxxx "
" xxxxxx "
" xxxxxxx "
" xxxxxxxx "
" xxxxxxxxx "
" xxxxxxxxxx "
" xxxxx "
" xx xxx "
" x xxx "
" xxx "
" xxx "
" xxx "
" xxx "
" ";
static const char* mask=
"xx "
"xxx "
"xxxx "
"xxxxx "
"xxxxxx "
"xxxxxxx "
"xxxxxxxx "
"xxxxxxxxx "
"xxxxxxxxxx "
"xxxxxxxxxxx "
"xxxxxxxxxxxx "
"xxxxxxxxxx "
"xxxxxxxx "
"xxxxxxxx "
"xx xxxxx "
" xxxxx "
" xxxxx "
" xxxxx "
" xxx ";
static rfbCursorPtr myCursor;
// only one controller exists, so we can do this workaround for functions:
static RFBController *self;
class AppLocker
{
public:
AppLocker() {
KApplication::kApplication()->lock();
}
~AppLocker() {
KApplication::kApplication()->unlock();
}
};
static enum rfbNewClientAction newClientHook(struct _rfbClientRec *cl)
{
AppLocker a;
return self->handleNewClient(cl);
}
static Bool passwordCheck(rfbClientPtr cl,
const char* encryptedPassword,
int len)
{
AppLocker a;
return self->handleCheckPassword(cl, encryptedPassword, len);
}
static void keyboardHook(Bool down, KeySym keySym, rfbClientPtr)
{
self->handleKeyEvent(down ? true : false, keySym);
}
static void pointerHook(int bm, int x, int y, rfbClientPtr)
{
self->handlePointerEvent(bm, x, y);
}
static void clientGoneHook(rfbClientPtr)
{
self->handleClientGone();
}
static void negotiationFinishedHook(rfbClientPtr cl)
{
self->handleNegotiationFinished(cl);
}
static void inetdDisconnectHook()
{
self->handleClientGone();
}
static void clipboardHook(char* str,int len, rfbClientPtr)
{
self->clipboardToServer(QString::fromUtf8(str, len));
}
void ConnectionDialog::closeEvent(QCloseEvent *)
{
emit closed();
}
VNCEvent::~VNCEvent() {
}
Display *KeyboardEvent::dpy;
char KeyboardEvent::modifiers[0x100];
KeyCode KeyboardEvent::keycodes[0x100];
KeyCode KeyboardEvent::leftShiftCode;
KeyCode KeyboardEvent::rightShiftCode;
KeyCode KeyboardEvent::altGrCode;
const int KeyboardEvent::LEFTSHIFT = 1;
const int KeyboardEvent::RIGHTSHIFT = 2;
const int KeyboardEvent::ALTGR = 4;
char KeyboardEvent::ModifierState;
KeyboardEvent::KeyboardEvent(bool d, KeySym k) :
down(d),
keySym(k) {
}
void KeyboardEvent::initKeycodes() {
KeySym key,*keymap;
int i,j,minkey,maxkey,syms_per_keycode;
dpy = qt_xdisplay();
memset(modifiers,-1,sizeof(modifiers));
XDisplayKeycodes(dpy,&minkey,&maxkey);
ASSERT(minkey >= 8);
ASSERT(maxkey < 256);
keymap = (KeySym*) XGetKeyboardMapping(dpy, minkey,
(maxkey - minkey + 1),
&syms_per_keycode);
ASSERT(keymap);
for (i = minkey; i <= maxkey; i++)
for (j=0; j<syms_per_keycode; j++) {
key = keymap[(i-minkey)*syms_per_keycode+j];
if (key>=' ' && key<0x100 && i==XKeysymToKeycode(dpy,key)) {
keycodes[key]=i;
modifiers[key]=j;
}
}
leftShiftCode = XKeysymToKeycode(dpy, XK_Shift_L);
rightShiftCode = XKeysymToKeycode(dpy, XK_Shift_R);
altGrCode = XKeysymToKeycode(dpy, XK_Mode_switch);
XFree ((char *)keymap);
}
/* this function adjusts the modifiers according to mod (as from modifiers) and ModifierState */
void KeyboardEvent::tweakModifiers(char mod, bool down) {
bool isShift = ModifierState & (LEFTSHIFT|RIGHTSHIFT);
if(mod < 0)
return;
if(isShift && mod != 1) {
if(ModifierState & LEFTSHIFT)
XTestFakeKeyEvent(dpy, leftShiftCode,
!down, CurrentTime);
if(ModifierState & RIGHTSHIFT)
XTestFakeKeyEvent(dpy, rightShiftCode,
!down, CurrentTime);
}
if(!isShift && mod==1)
XTestFakeKeyEvent(dpy, leftShiftCode,
down, CurrentTime);
if((ModifierState&ALTGR) && mod != 2)
XTestFakeKeyEvent(dpy, altGrCode,
!down, CurrentTime);
if(!(ModifierState&ALTGR) && mod==2)
XTestFakeKeyEvent(dpy, altGrCode,
down, CurrentTime);
}
void KeyboardEvent::exec() {
#define ADJUSTMOD(sym,state) \
if(keySym==sym) { if(down) ModifierState|=state; else ModifierState&=~state; }
ADJUSTMOD(XK_Shift_L,LEFTSHIFT);
ADJUSTMOD(XK_Shift_R,RIGHTSHIFT);
ADJUSTMOD(XK_Mode_switch,ALTGR);
if(keySym>=' ' && keySym<0x100) {
KeyCode k;
if (down)
tweakModifiers(modifiers[keySym],True);
k = keycodes[keySym];
if (k != NoSymbol)
XTestFakeKeyEvent(dpy, k, down, CurrentTime);
if (down)
tweakModifiers(modifiers[keySym],False);
} else {
KeyCode k = XKeysymToKeycode(dpy, keySym );
if (k != NoSymbol)
XTestFakeKeyEvent(dpy, k, down, CurrentTime);
}
}
bool PointerEvent::initialized = false;
Display *PointerEvent::dpy;
int PointerEvent::buttonMask = 0;
PointerEvent::PointerEvent(int b, int _x, int _y) :
button_mask(b),
x(_x),
y(_y) {
if (!initialized) {
initialized = true;
dpy = qt_xdisplay();
buttonMask = 0;
}
}
void PointerEvent::exec() {
QDesktopWidget *desktopWidget = QApplication::desktop();
int screen = desktopWidget->screenNumber();
if (screen < 0)
screen = 0;
XTestFakeMotionEvent(dpy, screen, x, y, CurrentTime);
for(int i = 0; i < 5; i++)
if ((buttonMask&(1<<i))!=(button_mask&(1<<i)))
XTestFakeButtonEvent(dpy,
i+1,
(button_mask&(1<<i))?True:False,
CurrentTime);
buttonMask = button_mask;
}
ClipboardEvent::ClipboardEvent(RFBController *c, const QString &ctext) :
controller(c),
text(QDeepCopy<QString>(ctext)) {
}
void ClipboardEvent::exec() {
if ((controller->lastClipboardDirection == RFBController::LAST_SYNC_TO_CLIENT) &&
(controller->lastClipboardText == text)) {
return;
}
controller->lastClipboardDirection = RFBController::LAST_SYNC_TO_SERVER;
controller->lastClipboardText = text;
controller->clipboard->setText(text, QClipboard::Clipboard);
controller->clipboard->setText(text, QClipboard::Selection);
}
KNotifyEvent::KNotifyEvent(const QString &n, const QString &d) :
name(n),
desc(d) {
}
KNotifyEvent::~KNotifyEvent() {
}
void KNotifyEvent::exec() {
KNotifyClient::event(name, desc);
}
SessionEstablishedEvent::SessionEstablishedEvent(RFBController *c) :
controller(c)
{ }
void SessionEstablishedEvent::exec() {
controller->sendSessionEstablished();
}
RFBController::RFBController(Configuration *c) :
allowDesktopControl(false),
lastClipboardDirection(LAST_SYNC_TO_SERVER),
configuration(c),
disableBackgroundPending(false),
disableBackgroundState(false),
closePending(false),
forcedClose(false)
{
self = this;
connect(dialog.acceptConnectionButton, SIGNAL(clicked()),
SLOT(dialogAccepted()));
connect(dialog.refuseConnectionButton, SIGNAL(clicked()),
SLOT(dialogRefused()));
connect(&dialog, SIGNAL(closed()), SLOT(dialogRefused()));
connect(&initIdleTimer, SIGNAL(timeout()), SLOT(checkAsyncEvents()));
connect(&idleTimer, SIGNAL(timeout()), SLOT(idleSlot()));
clipboard = QApplication::clipboard();
connect(clipboard, SIGNAL(selectionChanged()), this, SLOT(selectionChanged()));
connect(clipboard, SIGNAL(dataChanged()), this, SLOT(clipboardChanged()));
asyncQueue.setAutoDelete(true);
KeyboardEvent::initKeycodes();
char hostname[256];
if (gethostname(hostname, 255))
hostname[0] = 0;
hostname[255] = 0;
desktopName = QString(i18n("%1@%2 (shared desktop)")).arg(KUser().loginName()).arg(hostname);
}
RFBController::~RFBController()
{
stopServer();
}
void RFBController::startServer(int inetdFd, bool xtestGrab)
{
framebufferImage = XGetImage(qt_xdisplay(),
QApplication::desktop()->winId(),
0,
0,
QApplication::desktop()->width(),
QApplication::desktop()->height(),
AllPlanes,
ZPixmap);
int w = framebufferImage->width;
int h = framebufferImage->height;
char *fb = framebufferImage->data;
rfbLogEnable(0);
server = rfbGetScreen(0, 0, w, h,
framebufferImage->bits_per_pixel,
8,
framebufferImage->bits_per_pixel/8);
server->paddedWidthInBytes = framebufferImage->bytes_per_line;
server->rfbServerFormat.bitsPerPixel = framebufferImage->bits_per_pixel;
server->rfbServerFormat.depth = framebufferImage->depth;
server->rfbServerFormat.trueColour = (CARD8) TRUE;
server->rfbServerFormat.bigEndian = (CARD8) ((framebufferImage->bitmap_bit_order == MSBFirst) ? TRUE : FALSE);
if ( server->rfbServerFormat.bitsPerPixel == 8 ) {
server->rfbServerFormat.redShift = 0;
server->rfbServerFormat.greenShift = 3;
server->rfbServerFormat.blueShift = 6;
server->rfbServerFormat.redMax = 7;
server->rfbServerFormat.greenMax = 7;
server->rfbServerFormat.blueMax = 3;
} else {
server->rfbServerFormat.redShift = 0;
if ( framebufferImage->red_mask )
while ( ! ( framebufferImage->red_mask & (1 << server->rfbServerFormat.redShift) ) )
server->rfbServerFormat.redShift++;
server->rfbServerFormat.greenShift = 0;
if ( framebufferImage->green_mask )
while ( ! ( framebufferImage->green_mask & (1 << server->rfbServerFormat.greenShift) ) )
server->rfbServerFormat.greenShift++;
server->rfbServerFormat.blueShift = 0;
if ( framebufferImage->blue_mask )
while ( ! ( framebufferImage->blue_mask & (1 << server->rfbServerFormat.blueShift) ) )
server->rfbServerFormat.blueShift++;
server->rfbServerFormat.redMax = framebufferImage->red_mask >> server->rfbServerFormat.redShift;
server->rfbServerFormat.greenMax = framebufferImage->green_mask >> server->rfbServerFormat.greenShift;
server->rfbServerFormat.blueMax = framebufferImage->blue_mask >> server->rfbServerFormat.blueShift;
}
server->frameBuffer = fb;
server->autoPort = TRUE;
server->inetdSock = inetdFd;
server->kbdAddEvent = keyboardHook;
server->ptrAddEvent = pointerHook;
server->newClientHook = newClientHook;
server->inetdDisconnectHook = inetdDisconnectHook;
server->passwordCheck = passwordCheck;
server->setXCutText = clipboardHook;
server->desktopName = desktopName.latin1();
if (!myCursor)
myCursor = rfbMakeXCursor(19, 19, (char*) cur, (char*) mask);
server->cursor = myCursor;
passwordChanged();
scanner = new XUpdateScanner(qt_xdisplay(),
QApplication::desktop()->winId(),
(unsigned char*)fb, w, h,
server->rfbServerFormat.bitsPerPixel,
server->paddedWidthInBytes,
!configuration->disableXShm());
rfbInitServer(server);
state = RFB_WAITING;
if (xtestGrab) {
disabler.disable = false;
XTestGrabControl(qt_xdisplay(), true);
}
rfbRunEventLoop(server, -1, TRUE);
initIdleTimer.start(IDLE_PAUSE);
}
void RFBController::stopServer(bool xtestUngrab)
{
rfbScreenCleanup(server);
state = RFB_STOPPED;
delete scanner;
XDestroyImage(framebufferImage);
if (xtestUngrab) {
disabler.disable = true;
QTimer::singleShot(0, &disabler, SLOT(exec()));
}
}
void RFBController::connectionAccepted(bool aRC)
{
if (state != RFB_CONNECTING)
return;
allowDesktopControl = aRC;
emit desktopControlSettingChanged(aRC);
initIdleTimer.stop();
idleTimer.start(IDLE_PAUSE);
server->rfbClientHead->clientGoneHook = clientGoneHook;
state = RFB_CONNECTED;
if (!server->rfbAuthPasswdData)
emit sessionEstablished(remoteIp);
}
void RFBController::acceptConnection(bool aRemoteControl)
{
KNotifyClient::event("UserAcceptsConnection",
i18n("User accepts connection from %1")
.arg(remoteIp));
if (state != RFB_CONNECTING)
return;
connectionAccepted(aRemoteControl);
rfbStartOnHoldClient(server->rfbClientHead);
}
void RFBController::refuseConnection()
{
KNotifyClient::event("UserRefusesConnection",
i18n("User refuses connection from %1")
.arg(remoteIp));
if (state != RFB_CONNECTING)
return;
rfbRefuseOnHoldClient(server->rfbClientHead);
state = RFB_WAITING;
}
// checks async events, returns true if client disconnected
bool RFBController::checkAsyncEvents()
{
bool closed = false;
bool backgroundActionRequired = false;
asyncMutex.lock();
VNCEvent *e;
for (e = asyncQueue.first(); e; e = asyncQueue.next())
e->exec();
asyncQueue.clear();
if (closePending) {
connectionClosed();
closed = true;
closePending = false;
}
if (disableBackgroundPending != disableBackgroundState)
backgroundActionRequired = true;
asyncMutex.unlock();
if (backgroundActionRequired && (!closed) && !configuration->disableBackground())
disableBackground(disableBackgroundPending);
return closed;
}
void RFBController::disableBackground(bool state) {
if (disableBackgroundState == state)
return;
disableBackgroundState = state;
DCOPRef ref("kdesktop", "KBackgroundIface");
ref.setDCOPClient(KApplication::dcopClient());
ref.send("setBackgroundEnabled(bool)", bool(!state));
}
void RFBController::connectionClosed()
{
KNotifyClient::event("ConnectionClosed",
i18n("Closed connection: %1.")
.arg(remoteIp));
idleTimer.stop();
initIdleTimer.stop();
disableBackground(false);
state = RFB_WAITING;
if (forcedClose)
emit quitApp();
else
emit sessionFinished();
}
void RFBController::closeConnection()
{
forcedClose = true;
if (state == RFB_CONNECTED) {
disableBackground(false);
if (!checkAsyncEvents()) {
asyncMutex.lock();
if (!closePending)
rfbCloseClient(server->rfbClientHead);
asyncMutex.unlock();
}
}
else if (state == RFB_CONNECTING)
refuseConnection();
}
void RFBController::enableDesktopControl(bool b) {
if (b != allowDesktopControl)
emit desktopControlSettingChanged(b);
allowDesktopControl = b;
}
void RFBController::idleSlot()
{
if (state != RFB_CONNECTED)
return;
if (checkAsyncEvents() || forcedClose)
return;
rfbUndrawCursor(server);
QPtrList<Hint> v;
v.setAutoDelete(true);
QPoint p = QCursor::pos();
scanner->searchUpdates(v, p.y());
Hint *h;
for (h = v.first(); h != 0; h = v.next())
rfbMarkRectAsModified(server, h->left(),
h->top(),
h->right(),
h->bottom());
asyncMutex.lock();
if (!closePending)
defaultPtrAddEvent(0, p.x(),p.y(), server->rfbClientHead);
asyncMutex.unlock();
checkAsyncEvents(); // check 2nd time (see 3rd line)
}
void RFBController::dialogAccepted()
{
dialog.hide();
acceptConnection(dialog.allowRemoteControlCB->isChecked());
}
void RFBController::dialogRefused()
{
refuseConnection();
dialog.hide();
emit sessionRefused();
}
bool checkPassword(const QString &p,
unsigned char *ochallenge,
const char *response,
int len) {
if ((len == 0) && (p.length() == 0))
return true;
char passwd[MAXPWLEN];
unsigned char challenge[CHALLENGESIZE];
memcpy(challenge, ochallenge, CHALLENGESIZE);
bzero(passwd, MAXPWLEN);
if (!p.isNull())
strncpy(passwd, p.latin1(),
(MAXPWLEN <= p.length()) ? MAXPWLEN : p.length());
vncEncryptBytes(challenge, passwd);
return memcmp(challenge, response, len) == 0;
}
bool RFBController::handleCheckPassword(rfbClientPtr cl,
const char *response,
int len)
{
bool authd = false;
if (configuration->allowUninvitedConnections())
authd = checkPassword(configuration->password(),
cl->authChallenge, response, len);
if (!authd) {
QValueList<Invitation>::iterator it =
configuration->invitations().begin();
while (it != configuration->invitations().end()) {
if (checkPassword((*it).password(),
cl->authChallenge, response, len) &&
(*it).isValid()) {
authd = true;
configuration->removeInvitation(it);
break;
}
it++;
}
}
if (!authd) {
if (configuration->invitations().size() > 0) {
sendKNotifyEvent("InvalidPasswordInvitations",
i18n("Failed login attempt from %1: wrong password")
.arg(remoteIp));
}
else
sendKNotifyEvent("InvalidPassword",
i18n("Failed login attempt from %1: wrong password")
.arg(remoteIp));
return FALSE;
}
asyncMutex.lock();
asyncQueue.append(new SessionEstablishedEvent(this));
asyncMutex.unlock();
return TRUE;
}
enum rfbNewClientAction RFBController::handleNewClient(rfbClientPtr cl)
{
int socket = cl->sock;
cl->negotiationFinishedHook = negotiationFinishedHook;
QString host, port;
KSocketAddress *ksa = KExtendedSocket::peerAddress(socket);
if (ksa) {
hostent *he = 0;
KInetSocketAddress *kisa = (KInetSocketAddress*) ksa;
in_addr ia4 = kisa->hostV4();
he = gethostbyaddr((const char*)&ia4,
sizeof(ia4),
AF_INET);
if (he && he->h_name)
host = QString(he->h_name);
else
host = ksa->nodeName();
delete ksa;
}
if (state != RFB_WAITING) {
sendKNotifyEvent("TooManyConnections",
i18n("Connection refused from %1, already connected.")
.arg(host));
return RFB_CLIENT_REFUSE;
}
remoteIp = host;
state = RFB_CONNECTING;
if ((!configuration->askOnConnect()) &&
(configuration->invitations().size() == 0)) {
sendKNotifyEvent("NewConnectionAutoAccepted",
i18n("Accepted uninvited connection from %1")
.arg(remoteIp));
connectionAccepted(configuration->allowDesktopControl());
return RFB_CLIENT_ACCEPT;
}
sendKNotifyEvent("NewConnectionOnHold",
i18n("Received connection from %1, on hold (waiting for confirmation)")
.arg(remoteIp));
dialog.ipLabel->setText(remoteIp);
dialog.allowRemoteControlCB->setChecked(true);
dialog.setFixedSize(dialog.sizeHint());
dialog.show();
return RFB_CLIENT_ON_HOLD;
}
void RFBController::handleClientGone()
{
asyncMutex.lock();
closePending = true;
asyncMutex.unlock();
}
void RFBController::handleNegotiationFinished(rfbClientPtr cl)
{
asyncMutex.lock();
disableBackgroundPending = cl->disableBackground;
asyncMutex.unlock();
}
void RFBController::handleKeyEvent(bool down, KeySym keySym) {
if (!allowDesktopControl)
return;
asyncMutex.lock();
asyncQueue.append(new KeyboardEvent(down, keySym));
asyncMutex.unlock();
}
void RFBController::handlePointerEvent(int button_mask, int x, int y) {
if (!allowDesktopControl)
return;
asyncMutex.lock();
asyncQueue.append(new PointerEvent(button_mask, x, y));
asyncMutex.unlock();
}
void RFBController::clipboardToServer(const QString &ctext) {
if (!allowDesktopControl)
return;
asyncMutex.lock();
asyncQueue.append(new ClipboardEvent(this, ctext));
asyncMutex.unlock();
}
void RFBController::clipboardChanged() {
if (state != RFB_CONNECTED)
return;
if (clipboard->ownsClipboard())
return;
QString text = clipboard->text(QClipboard::Clipboard);
// avoid ping-pong between client&server
if ((lastClipboardDirection == LAST_SYNC_TO_SERVER) &&
(lastClipboardText == text))
return;
if ((text.length() > MAX_SELECTION_LENGTH) || text.isNull())
return;
lastClipboardDirection = LAST_SYNC_TO_CLIENT;
lastClipboardText = text;
QCString ctext = text.utf8();
rfbSendServerCutText(server, ctext.data(), ctext.length());
}
void RFBController::selectionChanged() {
if (state != RFB_CONNECTED)
return;
if (clipboard->ownsSelection())
return;
QString text = clipboard->text(QClipboard::Selection);
// avoid ping-pong between client&server
if ((lastClipboardDirection == LAST_SYNC_TO_SERVER) &&
(lastClipboardText == text))
return;
if ((text.length() > MAX_SELECTION_LENGTH) || text.isNull())
return;
lastClipboardDirection = LAST_SYNC_TO_CLIENT;
lastClipboardText = text;
QCString ctext = text.utf8();
rfbSendServerCutText(server, ctext.data(), ctext.length());
}
void RFBController::passwordChanged() {
bool authRequired = (!configuration->allowUninvitedConnections()) ||
(configuration->password().length() != 0) ||
(configuration->invitations().count() > 0);
server->rfbAuthPasswdData = (void*) (authRequired ? 1 : 0);
}
void RFBController::sendKNotifyEvent(const QString &n, const QString &d)
{
asyncMutex.lock();
asyncQueue.append(new KNotifyEvent(n, d));
asyncMutex.unlock();
}
void RFBController::sendSessionEstablished()
{
if (configuration->disableBackground())
disableBackground(true);
emit sessionEstablished(remoteIp);
}
#ifdef __osf__
extern "C" Bool XShmQueryExtension(Display*);
#endif
bool RFBController::checkX11Capabilities() {
int bp1, bp2, majorv, minorv;
Bool r = XTestQueryExtension(qt_xdisplay(), &bp1, &bp2,
&majorv, &minorv);
if ((!r) || (((majorv*1000)+minorv) < 2002)) {
KMessageBox::error(0,
i18n("Your X11 Server does not support the required XTest extension version 2.2. Sharing your desktop is not possible."),
i18n("Desktop Sharing Error"));
return false;
}
return true;
}
XTestDisabler::XTestDisabler() :
disable(false) {
}
void XTestDisabler::exec() {
if (disable)
XTestDiscard(qt_xdisplay());
}
#include "rfbcontroller.moc"

View File

@@ -1,230 +0,0 @@
/***************************************************************************
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 "configuration.h"
#include "newconnectiondialog.h"
#include "xupdatescanner.h"
#include <ksock.h>
#include <qobject.h>
#include <qtimer.h>
#include <qmutex.h>
#define HAVE_PTHREADS
#include "rfb.h"
#include <X11/Xlib.h>
class QCloseEvent;
class QClipboard;
class RFBController;
typedef enum {
RFB_STOPPED,
RFB_WAITING,
RFB_CONNECTING,
RFB_CONNECTED
} RFBState;
class ConnectionDialog : public KRFBConnectionDialog {
Q_OBJECT
public:
virtual void closeEvent(QCloseEvent *);
signals:
void closed();
};
class VNCEvent {
public:
virtual void exec() = 0;
virtual ~VNCEvent();
};
class KeyboardEvent : public VNCEvent {
bool down;
KeySym keySym;
static Display *dpy;
static char modifiers[0x100];
static KeyCode keycodes[0x100], leftShiftCode, rightShiftCode, altGrCode;
static const int LEFTSHIFT;
static const int RIGHTSHIFT;
static const int ALTGR;
static char ModifierState;
static void tweakModifiers(char mod, bool down);
public:
static void initKeycodes();
KeyboardEvent(bool d, KeySym k);
virtual void exec();
};
class PointerEvent : public VNCEvent {
int button_mask, x, y;
static bool initialized;
static Display *dpy;
static int buttonMask;
public:
PointerEvent(int b, int _x, int _y);
virtual void exec();
};
class ClipboardEvent : public VNCEvent {
RFBController *controller;
QString text;
public:
ClipboardEvent(RFBController *c, const QString &text);
virtual void exec();
};
class KNotifyEvent : public VNCEvent {
QString name;
QString desc;
public:
KNotifyEvent(const QString &n, const QString &d);
virtual ~KNotifyEvent();
virtual void exec();
};
class SessionEstablishedEvent : public VNCEvent {
RFBController *controller;
public:
SessionEstablishedEvent(RFBController *c);
virtual void exec();
};
/**
* Manages sockets, drives the RGBConnection and triggers the connection
* dialog.
* The controller has three states: 'waiting for connection',
* 'waiting for confirmation' and 'connected'. In the first state socket and
* connection are null, in the second socket is set and in the last both are
* set.
* @author Tim Jansen
*/
class RFBController : public QObject {
Q_OBJECT
friend class SessionEstablishedEvent;
friend class ClipboardEvent;
public:
RFBController(Configuration *c);
virtual ~RFBController();
RFBState state;
void acceptConnection(bool allowRemoteConnection);
void connectionAccepted(bool allowRemoteConnection);
void refuseConnection();
void connectionClosed();
bool handleCheckPassword(rfbClientPtr, const char *, int);
void handleKeyEvent(bool down, KeySym keySym);
void handlePointerEvent(int button_mask, int x, int y);
enum rfbNewClientAction handleNewClient(rfbClientPtr cl);
void clipboardToServer(const QString &text);
void handleClientGone();
void handleNegotiationFinished(rfbClientPtr cl);
int getPort();
void startServer(int inetdFd = -1, bool xtestGrab = true);
static bool checkX11Capabilities();
public slots:
void passwordChanged();
void closeConnection();
void enableDesktopControl(bool c);
signals:
void sessionEstablished(QString host);
void sessionFinished();
void sessionRefused();
void quitApp();
void desktopControlSettingChanged(bool);
private:
void stopServer(bool xtestUngrab = true);
void sendKNotifyEvent(const QString &name, const QString &desc);
void sendSessionEstablished();
void disableBackground(bool state);
QString remoteIp;
volatile bool allowDesktopControl;
QTimer initIdleTimer;
QTimer idleTimer;
enum {
LAST_SYNC_TO_SERVER,
LAST_SYNC_TO_CLIENT
} lastClipboardDirection;
QString lastClipboardText;
QClipboard *clipboard;
Configuration *configuration;
XUpdateScanner *scanner;
ConnectionDialog dialog;
QString desktopName;
rfbScreenInfoPtr server;
XImage *framebufferImage;
QMutex asyncMutex;
QPtrList<VNCEvent> asyncQueue;
bool disableBackgroundPending; // background, as desired by libvncserver
bool disableBackgroundState; // real background state
bool closePending; // set when libvncserver detected close
bool forcedClose; // set when user closed connection
private slots:
bool checkAsyncEvents();
void idleSlot();
void dialogAccepted();
void dialogRefused();
void selectionChanged();
void clipboardChanged();
};
/*
* Class to call XTestDiscard at idle time (because otherwise
* it will not work with QT)
*/
class XTestDisabler : public QObject {
Q_OBJECT
public:
XTestDisabler();
bool disable;
Display *dpy;
public slots:
void exec();
};
#endif

View File

@@ -1,16 +0,0 @@
/***************************************************************************
|FILENAME| - description
-------------------
begin : |DATE|
copyright : (C) |YEAR| by |AUTHOR|
email : |EMAIL|
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/

View File

@@ -1,16 +0,0 @@
/***************************************************************************
|FILENAME| - description
-------------------
begin : |DATE|
copyright : (C) |YEAR| by |AUTHOR|
email : |EMAIL|
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/

View File

@@ -1,137 +0,0 @@
/***************************************************************************
trayicon.cpp
-------------------
begin : Tue Dec 11 2001
copyright : (C) 2001-2002 by Tim Jansen
email : tim@tjansen.de
***************************************************************************/
/***************************************************************************
* *
* 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 "trayicon.h"
#include <qtooltip.h>
#include <kstdaction.h>
#include <kapplication.h>
#include <klocale.h>
#include <kdialog.h>
#include <kglobal.h>
#include <kiconloader.h>
#include <kpopupmenu.h>
KPassivePopup2::KPassivePopup2(QWidget *parent) :
KPassivePopup(parent){
}
void KPassivePopup2::hideEvent( QHideEvent *e )
{
KPassivePopup::hideEvent(e);
emit hidden();
}
KPassivePopup2 *KPassivePopup2::message( const QString &caption, const QString &text,
const QPixmap &icon,
QWidget *parent)
{
KPassivePopup2 *pop = new KPassivePopup2( parent);
pop->setView( caption, text, icon );
pop->show();
return pop;
}
TrayIcon::TrayIcon(KDialog *d, Configuration *c) :
KSystemTray(0, "krfb trayicon"),
configuration(c),
aboutDialog(d),
actionCollection(this),
quitting(false)
{
KIconLoader *loader = KGlobal::iconLoader();
trayIconOpen = loader->loadIcon("eyes-open24", KIcon::User);
trayIconClosed = loader->loadIcon("eyes-closed24", KIcon::User);
setPixmap(trayIconClosed);
QToolTip::add(this, i18n("Desktop Sharing - connecting"));
manageInvitationsAction = new KAction(i18n("Manage &Invitations"), QString::null,
0, this, SIGNAL(showManageInvitations()),
&actionCollection);
manageInvitationsAction->plug(contextMenu());
contextMenu()->insertSeparator();
enableControlAction = new KToggleAction(i18n("Enable Remote Control"));
enableControlAction->plug(contextMenu());
enableControlAction->setEnabled(false);
connect(enableControlAction, SIGNAL(toggled(bool)), SIGNAL(enableDesktopControl(bool)));
contextMenu()->insertSeparator();
aboutAction = KStdAction::aboutApp(this, SLOT(showAbout()), &actionCollection);
aboutAction->plug(contextMenu());
show();
}
TrayIcon::~TrayIcon(){
}
void TrayIcon::showAbout() {
aboutDialog->show();
}
void TrayIcon::prepareQuit() {
quitting = true;
}
void TrayIcon::showConnectedMessage(QString host) {
setPixmap(trayIconOpen);
KPassivePopup2::message(i18n("Desktop Sharing"),
i18n("The remote user has been authenticated and is now connected."),
trayIconOpen,
this);
QToolTip::add(this, i18n("Desktop Sharing - connected with %1").arg(host));
}
void TrayIcon::showDisconnectedMessage() {
if (quitting)
return;
QToolTip::add(this, i18n("Desktop Sharing - disconnected"));
setPixmap(trayIconClosed);
KPassivePopup2 *p = KPassivePopup2::message(i18n("Desktop Sharing"),
i18n("The remote user has closed the connection."),
trayIconClosed,
this);
connect(p, SIGNAL(hidden()), this, SIGNAL(diconnectedMessageDisplayed()));
}
void TrayIcon::setDesktopControlSetting(bool b) {
enableControlAction->setEnabled(true);
enableControlAction->setChecked(b);
}
void TrayIcon::mousePressEvent(QMouseEvent *e)
{
if (!rect().contains(e->pos()))
return;
if (e->button() == LeftButton) {
contextMenuAboutToShow(contextMenu());
contextMenu()->popup(e->globalPos());
}
else
KSystemTray::mousePressEvent(e);
}
#include "trayicon.moc"

View File

@@ -1,481 +0,0 @@
/*
* Copyright (C) 2000 heXoNet Support GmbH, D-66424 Homburg.
* All Rights Reserved.
*
* This 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.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/
/*
* December 15th 2001: removed coments, mouse pointer options and some
* other stuff
* January 10th 2002: improved hint creation (join adjacent hints)
* February 20th: use only partial tiles
* January 21st 2003: remember last modified scanlines, and scan them and
* in every cycle, reduce scanlines to every 35th
* January 21st 2003: scan lines around the cursor in every cycle
*
* Tim Jansen <tim@tjansen.de>
*/
#include <kdebug.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/extensions/XShm.h>
#include <string.h>
#include <assert.h>
#include "xupdatescanner.h"
/* ../../krfb/libvncserver/rfb.h */
#ifdef Bool
#undef Bool
#endif
#define Bool int
#define SCANLINES 35
unsigned int scanlines[SCANLINES] = { 0, 16, 8, 24,
33, 4, 20, 12, 28,
10, 26, 18, 34, 2,
22, 6, 30, 14,
1, 17, 32, 9, 25,
7, 23, 15, 31,
19, 3, 27, 11,
29, 13, 5, 21 };
#define MAX_ADJ_TOLERANCE 8
#define MAX_RECENT_HITS 12
unsigned int recentHitScanlines[MAX_RECENT_HITS];
#define CURSOR_SCANLINES 5
int cursorScanlines[CURSOR_SCANLINES] = {
-10, -4, 0, 4, 10
};
XUpdateScanner::XUpdateScanner(Display *_dpy,
Window _window,
unsigned char *_fb,
int _width,
int _height,
int _bitsPerPixel,
int _bytesPerLine,
bool useXShm) :
dpy(_dpy),
window(_window),
fb(_fb),
width(_width),
height(_height),
bitsPerPixel(_bitsPerPixel),
bytesPerLine(_bytesPerLine),
tileWidth(32),
tileHeight(32),
count (0),
scanline(NULL),
tile(NULL)
{
useShm = useXShm && XShmQueryExtension(dpy);
if (useShm) {
int major, minor;
Bool pixmaps;
if ((!XShmQueryVersion(dpy, &major, &minor, &pixmaps)) || !pixmaps)
useShm = false;
}
if (useShm) {
tile = XShmCreateImage(dpy,
DefaultVisual( dpy, 0 ),
bitsPerPixel,
ZPixmap,
NULL,
&shminfo_tile,
tileWidth,
tileHeight);
shminfo_tile.shmid = shmget(IPC_PRIVATE,
tile->bytes_per_line * tile->height,
IPC_CREAT | 0777);
shminfo_tile.shmaddr = tile->data = (char *)
shmat(shminfo_tile.shmid, 0, 0);
shminfo_tile.readOnly = False;
XShmAttach(dpy, &shminfo_tile);
}
else {
int tlen = tileWidth*(bitsPerPixel/8);
void *data = malloc(tlen*tileHeight);
tile = XCreateImage(dpy,
DefaultVisual(dpy, 0),
bitsPerPixel,
ZPixmap,
0,
(char*)data,
tileWidth,
tileHeight,
8,
tlen);
}
tilesX = (width + tileWidth - 1) / tileWidth;
tilesY = (height + tileHeight - 1) / tileHeight;
tileMap = new bool[tilesX * tilesY];
tileRegionMap = new struct TileChangeRegion[tilesX * tilesY];
unsigned int i;
for (i = 0; i < tilesX * tilesY; i++)
tileMap[i] = false;
if (useShm) {
scanline = XShmCreateImage(dpy,
DefaultVisual(dpy, 0),
bitsPerPixel,
ZPixmap,
NULL,
&shminfo_scanline,
width,
1);
shminfo_scanline.shmid = shmget(IPC_PRIVATE,
scanline->bytes_per_line,
IPC_CREAT | 0777);
shminfo_scanline.shmaddr = scanline->data = (char *)
shmat( shminfo_scanline.shmid, 0, 0 );
shminfo_scanline.readOnly = False;
XShmAttach(dpy, &shminfo_scanline);
}
else {
int slen = width*(bitsPerPixel/8);
void *data = malloc(slen);
scanline = XCreateImage(dpy,
DefaultVisual(dpy, 0),
bitsPerPixel,
ZPixmap,
0,
(char*)data,
width,
1,
8,
slen);
}
for (int i = 0; i < MAX_RECENT_HITS; i++)
recentHitScanlines[i] = i;
}
XUpdateScanner::~XUpdateScanner()
{
if (useShm) {
XShmDetach(dpy, &shminfo_scanline);
XDestroyImage(scanline);
shmdt(shminfo_scanline.shmaddr);
shmctl(shminfo_scanline.shmid, IPC_RMID, 0);
XShmDetach(dpy, &shminfo_tile);
XDestroyImage(tile);
shmdt(shminfo_tile.shmaddr);
shmctl(shminfo_tile.shmid, IPC_RMID, 0);
}
else {
free(tile->data);
free(scanline->data);
XDestroyImage(scanline);
XDestroyImage(tile);
}
delete tileMap;
delete tileRegionMap;
}
// returns true if last line changed. this is used to re-scan the tile under
// this one because it is likely to be modified but missed by the probe
bool XUpdateScanner::copyTile(int x, int y, int tx, int ty)
{
unsigned int maxWidth = width - x;
unsigned int maxHeight = height - y;
if (maxWidth > tileWidth)
maxWidth = tileWidth;
if (maxHeight > tileHeight)
maxHeight = tileHeight;
if (useShm) {
if ((maxWidth == tileWidth) && (maxHeight == tileHeight)) {
XShmGetImage(dpy, window, tile, x, y, AllPlanes);
} else {
XGetSubImage(dpy, window, x, y, maxWidth, maxHeight,
AllPlanes, ZPixmap, tile, 0, 0);
}
}
else
XGetSubImage(dpy, window, x, y, maxWidth, maxHeight,
AllPlanes, ZPixmap, tile, 0, 0);
unsigned int line;
int pixelsize = bitsPerPixel >> 3;
unsigned char *src = (unsigned char*) tile->data;
unsigned char *dest = fb + y * bytesPerLine + x * pixelsize;
unsigned char *ssrc = src;
unsigned char *sdest = dest;
int firstLine = maxHeight;
for (line = 0; line < maxHeight; line++) {
if (memcmp(sdest, ssrc, maxWidth * pixelsize)) {
firstLine = line;
break;
}
ssrc += tile->bytes_per_line;
sdest += bytesPerLine;
}
if (firstLine == maxHeight) {
tileMap[tx + ty * tilesX] = false;
return false;
}
unsigned char *msrc = src + (tile->bytes_per_line * maxHeight);
unsigned char *mdest = dest + (bytesPerLine * maxHeight);
int lastLine = firstLine;
for (line = maxHeight-1; line > firstLine; line--) {
msrc -= tile->bytes_per_line;
mdest -= bytesPerLine;
if (memcmp(mdest, msrc, maxWidth * pixelsize)) {
lastLine = line;
break;
}
}
for (line = firstLine; line <= lastLine; line++) {
memcpy(sdest, ssrc, maxWidth * pixelsize );
ssrc += tile->bytes_per_line;
sdest += bytesPerLine;
}
struct TileChangeRegion *r = &tileRegionMap[tx + (ty * tilesX)];
r->firstLine = firstLine;
r->lastLine = lastLine;
return lastLine == (maxHeight-1);
}
void XUpdateScanner::copyAllTiles()
{
for (unsigned int y = 0; y < tilesY; y++) {
for (unsigned int x = 0; x < tilesX; x++) {
if (tileMap[x + y * tilesX])
if (copyTile(x*tileWidth, y*tileHeight, x, y) &&
((y+1) < tilesY))
tileMap[x + (y+1) * tilesX] = true;
}
}
}
void XUpdateScanner::createHintFromTile(int x, int y, int th, Hint &hint)
{
unsigned int w = width - x;
unsigned int h = height - y;
if (w > tileWidth)
w = tileWidth;
if (h > th)
h = th;
hint.x = x;
hint.y = y;
hint.w = w;
hint.h = h;
}
void XUpdateScanner::addTileToHint(int x, int y, int th, Hint &hint)
{
unsigned int w = width - x;
unsigned int h = height - y;
if (w > tileWidth)
w = tileWidth;
if (h > th)
h = th;
if (hint.x > x) {
hint.w += hint.x - x;
hint.x = x;
}
if (hint.y > y) {
hint.h += hint.y - y;
hint.y = y;
}
if ((hint.x+hint.w) < (x+w)) {
hint.w = (x+w) - hint.x;
}
if ((hint.y+hint.h) < (y+h)) {
hint.h = (y+h) - hint.y;
}
}
static void printStatistics(Hint &hint) {
static int snum = 0;
static float ssum = 0.0;
int oX0 = hint.x & 0xffffffe0;
int oY0 = hint.y & 0xffffffe0;
int oX2 = (hint.x+hint.w) & 0x1f;
int oY2 = (hint.y+hint.h) & 0x1f;
int oX3 = (((hint.x+hint.w) | 0x1f) + ((oX2 == 0) ? 0 : 1)) & 0xffffffe0;
int oY3 = (((hint.y+hint.h) | 0x1f) + ((oY2 == 0) ? 0 : 1)) & 0xffffffe0;
float s0 = hint.w*hint.h;
float s1 = (oX3-oX0)*(oY3-oY0);
float p = (100*s0/s1);
ssum += p;
snum++;
float avg = ssum / snum;
kdDebug() << "avg size: "<< avg <<"%"<<endl;
}
void XUpdateScanner::flushHint(int x, int y, int &x0,
Hint &hint, QPtrList<Hint> &hintList)
{
if (x0 < 0)
return;
x0 = -1;
assert (hint.w > 0);
assert (hint.h > 0);
//printStatistics(hint);
hintList.append(new Hint(hint));
}
void XUpdateScanner::createHints(QPtrList<Hint> &hintList)
{
Hint hint;
int x0 = -1;
for (int y = 0; y < tilesY; y++) {
int x;
for (x = 0; x < tilesX; x++) {
int idx = x + y * tilesX;
if (tileMap[idx]) {
int ty = tileRegionMap[idx].firstLine;
int th = tileRegionMap[idx].lastLine - ty +1;
if (x0 < 0) {
createHintFromTile(x * tileWidth,
(y * tileHeight) + ty,
th,
hint);
x0 = x;
} else {
addTileToHint(x * tileWidth,
(y * tileHeight) + ty,
th,
hint);
}
}
else
flushHint(x, y, x0, hint, hintList);
}
flushHint(x, y, x0, hint, hintList);
}
}
void XUpdateScanner::testScanline(int y, bool rememberHits) {
if (y < 0)
return;
if (y >= (int)height)
return;
int x = 0;
bool hit = false;
if (useShm)
XShmGetImage(dpy, window, scanline, 0, y, AllPlanes);
else
XGetSubImage(dpy, window, 0, y, width, 1,
AllPlanes, ZPixmap, scanline, 0, 0);
while (x < width) {
int pixelsize = bitsPerPixel >> 3;
unsigned char *src = (unsigned char*) scanline->data +
x * pixelsize;
unsigned char *dest = fb +
y * bytesPerLine + x * pixelsize;
int w = (x + 32) > width ? (width-x) : 32;
if (memcmp(dest, src, w * pixelsize)) {
hit = true;
tileMap[(x / tileWidth) +
(y / tileHeight) * tilesX] = true;
}
x += 32;
}
if (!rememberHits)
return;
for (int i = 1; i < MAX_RECENT_HITS; i++)
recentHitScanlines[i-1] = recentHitScanlines[i];
recentHitScanlines[MAX_RECENT_HITS-1] = y;
}
void XUpdateScanner::searchUpdates(QPtrList<Hint> &hintList, int ptrY)
{
count++;
count %= SCANLINES;
unsigned int i;
unsigned int y;
for (i = 0; i < (tilesX * tilesY); i++) {
tileMap[i] = false;
}
// test last scanlines with hits
for (i = 0; i < MAX_RECENT_HITS; i++)
testScanline(recentHitScanlines[i], true);
// test scanlines around the cursor
for (i = 0; i < CURSOR_SCANLINES; i++)
testScanline(ptrY+cursorScanlines[i], false);
// test last/first line of the tiles around the cursor
// (assumes tileHeight = 32)
testScanline((ptrY&0xffe0)-1, false);
testScanline((ptrY|0x1f)+1, false);
// test every SCANLINESth scanline
y = scanlines[count];
while (y < (int)height) {
testScanline(y, true);
y += SCANLINES;
}
copyAllTiles();
createHints(hintList);
}

View File

@@ -1,112 +0,0 @@
/*
* Copyright (C) 2000 heXoNet Support GmbH, D-66424 Homburg.
* All Rights Reserved.
*
* This 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.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*/
#ifndef _hexonet_rfb_XUpdateScanner_h_
#define _hexonet_rfb_XUpdateScanner_h_
#include <qptrlist.h>
#include <X11/Xlib.h>
#include <X11/extensions/XShm.h>
class Hint {
public:
int x, y, w, h;
Hint() :
x(0),
y(0),
w(0),
h(0)
{}
Hint(Hint &h) :
x(h.x),
y(h.y),
w(h.w),
h(h.h)
{
}
int left() {
return x;
}
int right() {
return x+w;
}
int top() {
return y;
}
int bottom() {
return y+h;
}
};
struct TileChangeRegion {
short firstLine, lastLine;
};
class XUpdateScanner
{
public:
XUpdateScanner( Display *_dpy,
Window _window,
unsigned char *_fb,
int _width, int _height,
int _bitsPerPixel, int _bytesPerLine,
bool useXShm);
~XUpdateScanner();
// hitList: returns list of changes
// ptrY: ptrY: position of the cursor
void searchUpdates( QPtrList<Hint> &hintList, int ptrY);
private:
void testScanline(int y, bool rememberHits);
bool copyTile(int x, int y, int tx, int ty);
void copyAllTiles();
void flushHint(int x, int y, int &x0, Hint &hint,
QPtrList<Hint> &hintList);
void createHints(QPtrList<Hint> &hintList);
void addTileToHint(int x, int y, int th, Hint &hint);
void createHintFromTile(int x, int y, int th, Hint &hint);
Display *dpy;
Window window;
unsigned char *fb;
int width, height;
int bitsPerPixel, bytesPerLine;
unsigned int tileWidth, tileHeight;
unsigned int count;
bool useShm;
XImage *scanline;
XShmSegmentInfo shminfo_scanline;
XImage *tile;
XShmSegmentInfo shminfo_tile;
unsigned int tilesX, tilesY;
bool *tileMap;
struct TileChangeRegion *tileRegionMap;
};
#endif // _hexonet_rfb_XUpdateScanner_h_

View File

@@ -1,3 +0,0 @@
bin_SCRIPTS = krfb_httpd
kde_services_DATA = kinetd_krfb_httpd.desktop

View File

@@ -1,62 +0,0 @@
[Desktop Entry]
Encoding=UTF-8
Type=Service
ServiceTypes=KInetDModule
Exec=krfb_httpd
X-KDE-FactoryName=kinetd
X-KDE-KINETD-id=krfb_httpd
X-KDE-KINETD-port=5800
X-KDE-KINETD-autoPortRange=10
X-KDE-KINETD-enabled=false
X-KDE-KINETD-argument=--kinetd
X-KDE-KINETD-multiInstance=false
X-KDE-KINETD-serviceLifetime=1200
Name=KRfb Micro Httpd
Name[bg]=Микро уеб сървър (KRfb - httpd)
Name[cy]=Meicro-Httpd KRfb
Name[da]=KRfb Micro-Httpd
Name[de]=KRfb Mikro-Httpd
Name[et]=KRfb mikro-httpd
Name[fr]=Micro serveur httpd de KRfb
Name[gl]=KRfg Micro-Httpd
Name[hu]=KRfb mini-httpd
Name[ms]=Httpd Mikro KRfb
Name[nb]=KRfb mikro- http-nisse
Name[nl]=KRfb micro webserver
Name[pl]=Mikroskopijny serwer HTTP dla KRfb
Name[pt]=Micro Httpd do KRfb
Name[sv]=Krfb mikro-HTTP demon
Name[tr]=KRfb Mini Httpd
Name[xx]=xxKRfb Micro Httpdxx
Name[zh_CN]=KRfb 微 Httpd
Comment=A micro http daemon for krfb that serves the VNC viewer applet.
Comment[bg]=Малък уеб сървър, който обслужва аплета за преглед на VNC
Comment[ca]=Un micro-dimoni http per a krfb que serveix l'applet visor VNC.
Comment[cy]=Meicro-daemon http sy'n gwasanaethu'r rhaglennig gwelydd VNC
Comment[da]=En mikro http-dæmon for krfb der betjener VNC visningsappletten.
Comment[de]=Ein Mikro-HTTP-Dämon für krfb, der als VNC-Anzeige-Applet dient.
Comment[el]=Ένας μικρός δαίμονας http για το krfb που εξυπηρετεί το εφαρμογίδιο προβολής VNC.
Comment[es]=Un micro demonio http para krfb que sirve de applet de visor VNC.
Comment[et]=Mikro-HTTP deemon KRfb jaoks, mis teenindab VNC apletti.
Comment[fi]=Pieni http-palvelin krfb ohjelmalle, joka jakaa VNC-näyttäjäsovelmaa
Comment[fr]=Un mini serveur http pour KRfb dédié à l'applet d'affichage de bureaux VNC.
Comment[gl]=Un micro demo de HTTP para krfb que serve unha applet de visualización de VNC
Comment[he]=שרת http זעיר עבור krfb שמשרת את יישומון תצוגת VNC.
Comment[hu]=Mini HTTP-szolgáltatás a KRfb-hez, a VNC nézegető használatához.
Comment[it]=Un micro demone http per krfb che server l'applet di VNC viewer.
Comment[ms]=Daemon http miKro untuk krfb yang melayan aplet pelihat VNC.
Comment[nb]=En bitteliten http-nisse for krfb som hjelper visningsprogrammet for VNC.
Comment[nl]=Een micro webserver voor krfb dat de VNC weergave-applet beschikbaar stelt.
Comment[pl]=Mikroskopijny serwer HTTP dla KRfb obsługującego aplet przeglądarki VNC.
Comment[pt]=Um micro-servidor de HTTP para o krfb que serve a 'applet' de visualização de VNC.
Comment[pt_BR]=Um micro daemon de http, para o krfb, que serve o miniaplicativo de visualização do VNC.
Comment[sk]=Mikro http démon pre krfb ktorý ovláda prehliadací applet VNC.
Comment[sl]=Mikro http demon za krfb, ki streže pregledovalniku vstavkov VNC.
Comment[sr]=Микро http демон за krfb који опслужује аплет VNC приказивача.
Comment[sv]=En mikro-HTTP demon för Krfb som hanterar VNC-visningsminiprogrammet
Comment[ta]=krfb க்காண நுண்ணிய http அது VNC சேவையை குறுப்பயன் பார்வையாளர்.
Comment[tr]=VNC izleyici programcığını çalıştıran mini bir web sunucu.
Comment[xx]=xxA micro http daemon for krfb that serves the VNC viewer applet.xx
Comment[zh_CN]=支持 VNC 查看器小程序的 krfb 小 http 守护程序

View File

@@ -1,72 +0,0 @@
#!/bin/bash
if [ "$1" = "--kinetd" ]; then
# redirect stdin and stdout to the inetd socket.
exec <&$2 >&$2
fi
read request url httptype || exit 0
url="${url/
/}"
httptype="${httptype/
/}"
if [ "x$httptype" != "x" ]; then
line="x"
while [ -n "$line" ]; do
read line || exit 0
line="${line/
/}"
done
fi
# echo "url = $url, request = $request" >> /tmp/httpd.log
case "$url" in
/)
# We need the size of the display for the current applet.
size=`xdpyinfo -display :0| grep dimensions:|head -1|sed -e "s/.*dimensions: *//" -e "s/ pixels.*//"`
width=`echo $size|sed -e "s/x.*//"`
height=`echo $size|sed -e "s/.*x//"`
# The VNC menubar is 20 pixels high ...
height=$((height+20))
port=`dcop kded kinetd port krfb`
if [ "$port" == "-1" ]; then
port=5900
fi
ctype="text/html"
content="
<HTML><HEAD><TITLE>$LOGNAME's desktop</TITLE></HEAD>
<BODY>
<APPLET CODE=vncviewer.class ARCHIVE=vncviewer.jar WIDTH=$width HEIGHT=$height>
<param name=PORT value=$port>
</APPLET>
</BODY></HTML>"
;;
*.jar|*.class)
# Use basename to make sure we have just a filename, not ../../...
url="`basename "$url"`"
ctype="application/octet-stream"
cfile="/usr/share/vnc/classes/$url"
content="FILE"
;;
esac
if [ "x$httptype" != "x" ]; then
echo "HTTP/1.0 200 OK"
echo "Content-Type: $ctype"
if [ "$content" == "FILE" ]; then
clen=`wc -c "$cfile"`
else
clen=`echo "$content"|wc -c`
fi
echo "Content-Length: $clen"
echo "Connection: close"
echo
fi
if [ "$request" == "GET" ]; then
if [ "$content" == "FILE" ]; then
cat "$cfile"
else
echo "$content"

3
krfbconfig.kcfgc Normal file
View File

@@ -0,0 +1,3 @@
File=krfb.kcfg
ClassName=KrfbConfig
Singleton=true

311
krfbserver.cpp Normal file
View File

@@ -0,0 +1,311 @@
/* This file is part of the KDE project
Copyright (C) 2007 Alessandro Praduroux <pradu@pradu.it>
(C) 2001-2003 by Tim Jansen <tim@tjansen.de>
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 "krfbserver.h"
#include "krfbserver.moc"
#include <QTcpServer>
#include <QTcpSocket>
#include <QTimer>
#include <QHostInfo>
#include <QApplication>
#include <QDesktopWidget>
#include <QPointer>
#include <KGlobal>
#include <KUser>
#include <KLocale>
#include <KDebug>
#include <KMessageBox>
#include <dnssd/publicservice.h>
#include "connectioncontroller.h"
#include "framebuffer.h"
#include "krfbconfig.h"
#include "invitationmanager.h"
#include <X11/Xutil.h>
#include <X11/extensions/XTest.h>
static const char* cur=
" "
" x "
" xx "
" xxx "
" xxxx "
" xxxxx "
" xxxxxx "
" xxxxxxx "
" xxxxxxxx "
" xxxxxxxxx "
" xxxxxxxxxx "
" xxxxx "
" xx xxx "
" x xxx "
" xxx "
" xxx "
" xxx "
" xxx "
" ";
static const char* mask=
"xx "
"xxx "
"xxxx "
"xxxxx "
"xxxxxx "
"xxxxxxx "
"xxxxxxxx "
"xxxxxxxxx "
"xxxxxxxxxx "
"xxxxxxxxxxx "
"xxxxxxxxxxxx "
"xxxxxxxxxx "
"xxxxxxxx "
"xxxxxxxx "
"xx xxxxx "
" xxxxx "
" xxxxx "
" xxxxx "
" xxx ";
static rfbCursorPtr myCursor;
static enum rfbNewClientAction newClientHook(struct _rfbClientRec *cl)
{
KrfbServer *server = KrfbServer::self();
return server->handleNewClient(cl);
}
static rfbBool passwordCheck(rfbClientPtr cl,
const char* encryptedPassword,
int len)
{
ConnectionController *cc = static_cast<ConnectionController *>(cl->clientData);
return cc->handleCheckPassword(cl, encryptedPassword, len);
}
static void keyboardHook(rfbBool down, rfbKeySym keySym, rfbClientPtr cl)
{
ConnectionController *cc = static_cast<ConnectionController *>(cl->clientData);
cc->handleKeyEvent(down ? true : false, keySym);
}
static void pointerHook(int bm, int x, int y, rfbClientPtr cl)
{
ConnectionController *cc = static_cast<ConnectionController *>(cl->clientData);
cc->handlePointerEvent(bm, x, y);
}
static void clipboardHook(char* str,int len, rfbClientPtr cl)
{
ConnectionController *cc = static_cast<ConnectionController *>(cl->clientData);
cc->clipboardToServer(QString::fromUtf8(str, len));
}
class KrfbServer::KrfbServerP {
public:
KrfbServerP() : fb(0), screen(0), numClients(0) {};
FrameBuffer *fb;
QList< QPointer<ConnectionController> > controllers;
rfbScreenInfoPtr screen;
int numClients;
QByteArray desktopName;
QTimer rfbProcessEventTimer;
};
class KrfbServerPrivate
{
public:
KrfbServer instance;
};
K_GLOBAL_STATIC(KrfbServerPrivate, krfbServerPrivate)
KrfbServer * KrfbServer::self() {
return &krfbServerPrivate->instance;
}
KrfbServer::KrfbServer()
:d(new KrfbServerP)
{
kDebug() << "starting ";
d->fb = FrameBuffer::getFrameBuffer(QApplication::desktop()->winId(), this);
QTimer::singleShot(0, this, SLOT(startListening()));
connect(InvitationManager::self(), SIGNAL(invitationNumChanged(int)),SLOT(updatePassword()));
}
KrfbServer::~KrfbServer()
{
delete d;
}
void KrfbServer::startListening()
{
rfbScreenInfoPtr screen;
int port = KrfbConfig::port();
int w = d->fb->width();
int h = d->fb->height();
int depth = d->fb->depth();
rfbLogEnable(0);
screen = rfbGetScreen(0, 0, w, h, 8, 3,depth / 8);
screen->paddedWidthInBytes = d->fb->paddedWidth();
d->fb->getServerFormat(screen->serverFormat);
screen->frameBuffer = d->fb->data();
d->screen = screen;
screen->autoPort = 0;
screen->port = port;
// server hooks
screen->newClientHook = newClientHook;
screen->kbdAddEvent = keyboardHook;
screen->ptrAddEvent = pointerHook;
screen->newClientHook = newClientHook;
screen->passwordCheck = passwordCheck;
screen->setXCutText = clipboardHook;
d->desktopName = i18n("%1@%2 (shared desktop)", KUser().loginName(), QHostInfo::localHostName()).toLatin1();
screen->desktopName = d->desktopName.constData();
if (!myCursor) {
myCursor = rfbMakeXCursor(19, 19, (char*) cur, (char*) mask);
}
screen->cursor = myCursor;
// configure passwords and desktop control here
updateSettings();
rfbInitServer(screen);
if (!rfbIsActive(screen)) {
KMessageBox::error(0,i18n("Address already in use"),"krfb");
shutdown();
qApp->quit();
return;
};
if (KrfbConfig::publishService()) {
DNSSD::PublicService *service = new DNSSD::PublicService(i18n("%1@%2 (shared desktop)", KUser().loginName(), QHostInfo::localHostName()),"_rfb._tcp",port);
service->publishAsync();
}
/* Integrate the rfb event mechanism with qt's event loop.
* Call processRfbEvents() every time the qt event loop is run,
* so that it also processes and delivers rfb events and call
* shutdown() when QApplication exits to shutdown the rfb server
* before the X11 connection goes down.
*/
connect(&d->rfbProcessEventTimer, SIGNAL(timeout()), SLOT(processRfbEvents()));
connect(qApp, SIGNAL(aboutToQuit()), SLOT(shutdown()));
d->rfbProcessEventTimer.start(0);
}
void KrfbServer::processRfbEvents()
{
foreach(const QRect &r, d->fb->modifiedTiles()) {
rfbMarkRectAsModified(d->screen, r.x(), r.y(), r.right(), r.bottom());
}
rfbProcessEvents(d->screen, 100);
}
void KrfbServer::shutdown()
{
rfbShutdownServer(d->screen, true);
// framebuffer has to be deleted before X11 connection goes down
delete d->fb;
d->fb = 0;
}
void KrfbServer::enableDesktopControl(bool enable)
{
foreach (QPointer<ConnectionController> ptr, d->controllers) {
if (ptr) {
ptr->setControlEnabled(enable);
}
}
}
enum rfbNewClientAction KrfbServer::handleNewClient(struct _rfbClientRec * cl)
{
ConnectionController *cc = new ConnectionController(cl, this);
if (d->numClients++ == 0)
d->fb->startMonitor();
d->controllers.append(cc);
cc->setControlEnabled(KrfbConfig::allowDesktopControl());
connect(cc, SIGNAL(sessionEstablished(QString)), SIGNAL(sessionEstablished(QString)));
connect(cc, SIGNAL(clientDisconnected(ConnectionController *)),SLOT(clientDisconnected(ConnectionController *)));
return cc->handleNewClient();
}
void KrfbServer::updateSettings()
{
enableDesktopControl(KrfbConfig::allowDesktopControl());
updatePassword();
}
void KrfbServer::updatePassword()
{
if (!d->screen) return;
QString pw = KrfbConfig::uninvitedConnectionPassword();
kDebug() << "password: " << pw << " allow " <<
KrfbConfig::allowUninvitedConnections() <<
" invitations " << InvitationManager::self()->activeInvitations() << endl;
if (pw.isEmpty() && InvitationManager::self()->activeInvitations() == 0) {
kDebug() << "no password from now on";
d->screen->authPasswdData = (void *)0;
} else {
kDebug() << "Ask for password to accept connections";
d->screen->authPasswdData = (void *)1;
}
}
bool KrfbServer::checkX11Capabilities() {
int bp1, bp2, majorv, minorv;
Bool r = XTestQueryExtension(QX11Info::display(), &bp1, &bp2,
&majorv, &minorv);
if ((!r) || (((majorv*1000)+minorv) < 2002)) {
KMessageBox::error(0,
i18n("Your X11 Server does not support the required XTest extension version 2.2. Sharing your desktop is not possible."),
i18n("Desktop Sharing Error"));
return false;
}
return true;
}
void KrfbServer::clientDisconnected(ConnectionController *cc)
{
kDebug() << "clients--: " << d->numClients;
if (!--d->numClients) {
d->fb->stopMonitor();
}
disconnect(cc, SIGNAL(clientDisconnected(ConnectionController)),this, SLOT(clientDisconnected(ConnectionController)));
}

59
krfbserver.h Normal file
View File

@@ -0,0 +1,59 @@
/* This file is part of the KDE project
Copyright (C) 2007 Alessandro Praduroux <pradu@pradu.it>
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 KRFBSERVER_H
#define KRFBSERVER_H
#include <QObject>
#include <rfb/rfb.h>
class ConnectionController;
/**
This class implements the listening server for the RFB protocol.
@author Alessandro Praduroux <pradu@pradu.it>
*/
class KrfbServer : public QObject
{
Q_OBJECT
friend class KrfbServerPrivate;
public:
static KrfbServer *self();
~KrfbServer();
enum rfbNewClientAction handleNewClient(struct _rfbClientRec *cl);
bool checkX11Capabilities();
signals:
void sessionEstablished(QString);
void sessionFinished();
void desktopControlSettingChanged(bool);
public Q_SLOTS:
void startListening();
void processRfbEvents();
void shutdown();
void enableDesktopControl(bool);
void updateSettings();
void updatePassword();
void clientDisconnected(ConnectionController *);
private:
KrfbServer();
static KrfbServer *_self;
class KrfbServerP;
KrfbServerP * const d;
};
#endif

View File

@@ -1,141 +0,0 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
typedef struct {
char* filename; /* this file is the pipe (set by user) */
char is_server; /* this is set by open_control_file */
int fd; /* this is set by open_control_file */
} single_instance_struct;
/* returns fd, is_server is set to -1 if server, 0 if client */
int open_control_file(single_instance_struct* str)
{
struct stat buf;
if(stat(str->filename,&buf)) {
mkfifo(str->filename,128|256);
str->is_server=-1;
str->fd=open(str->filename,O_NONBLOCK|O_RDONLY);
} else {
str->fd=open(str->filename,O_NONBLOCK|O_WRONLY);
if(errno==ENXIO) {
str->is_server=-1;
str->fd=open(str->filename,O_NONBLOCK|O_RDONLY);
} else
str->is_server=0;
}
return(str->fd);
}
void delete_control_file(single_instance_struct* str)
{
remove(str->filename);
}
void close_control_file(single_instance_struct* str)
{
close(str->fd);
}
typedef void (*event_dispatcher)(char* message);
int get_next_message(char* buffer,int len,single_instance_struct* str,int usecs)
{
struct timeval tv;
fd_set fdset;
int num_fds;
FD_ZERO(&fdset);
FD_SET(str->fd,&fdset);
tv.tv_sec=0;
tv.tv_usec=usecs;
num_fds=select(str->fd+1,&fdset,NULL,NULL,&tv);
if(num_fds) {
int reallen;
reallen=read(str->fd,buffer,len);
if(reallen==0) {
close(str->fd);
str->fd=open(str->filename,O_NONBLOCK|O_RDONLY);
num_fds--;
}
buffer[reallen]=0;
#ifdef DEBUG_1INSTANCE
if(reallen!=0) fprintf(stderr,"message received: %s.\n",buffer);
#endif
}
return(num_fds);
}
int dispatch_event(single_instance_struct* str,event_dispatcher dispatcher,int usecs)
{
char buffer[1024];
int num_fds;
if((num_fds=get_next_message(buffer,1024,str,usecs)) && buffer[0])
dispatcher(buffer);
return(num_fds);
}
int loop_if_server(single_instance_struct* str,event_dispatcher dispatcher)
{
open_control_file(str);
if(str->is_server) {
while(1)
dispatch_event(str,dispatcher,50);
}
return(str->fd);
}
void send_message(single_instance_struct* str,char* message)
{
#ifdef DEBUG_1INSTANCE
int i=
#endif
write(str->fd,message,strlen(message));
#ifdef DEBUG_1INSTANCE
fprintf(stderr,"send: %s => %d(%d)\n",message,i,strlen(message));
#endif
}
#ifdef DEBUG_MAIN
#include <stdio.h>
#include <stdlib.h>
single_instance_struct str1 = { "/tmp/1instance" };
void my_dispatcher(char* message)
{
#ifdef DEBUG_1INSTANCE
fprintf(stderr,"Message arrived: %s.\n",message);
#endif
if(!strcmp(message,"quit")) {
delete_control_file(str1);
exit(0);
}
}
int main(int argc,char** argv)
{
int i;
loop_if_server(str1,my_dispatcher);
for(i=1;i<argc;i++)
send_event(str1,argv[i]);
return(0);
}
#endif

View File

@@ -1,75 +0,0 @@
memory leaks squashed (localtime pseudo leak is still there :-)
small improvements for OSXvnc (still not working correctly)
synced with TightVNC 1.2.3
solaris compile cleanups
many x11vnc improvements
added backchannel, an encoding which needs special clients to pass
arbitrary data to the client
changes from Tim Jansen regarding multi threading and client blocking
as well as C++ compliancy
x11vnc can be controlled by starting again with special options if compiling
with LOCAL_CONTROL defined
0.3
added x11vnc, a x0rfbserver clone
regard deferUpdateTime in processEvents, if usec<0
initialize deferUpdateTime (memory "leak"!)
changed command line handling (arguments are parsed and then removed)
added very simple example: zippy
added rfbDrawLine, rfbDrawPixel
0.2
inserted a deferUpdate mechanism (X11 independent).
removed deletion of requestedRegion
added rfbLoadConsoleFont
fixed font colour handling.
added rfbSelectBox
added rfbDrawCharWithClip to allow for clipping and a background colour.
fixed font colours
added rfbFillRect
added IO function to check password.
rfbNewClient now sets the socket in the fd_set (for the select() call)
when compiling the library with HAVE_PTHREADS and an application
which includes "rfb.h" without, the structures got mixed up.
So, the pthreads section is now always at the end, and also
you get a linker error for rfbInitServer when using two different
pthread setups.
fixed two deadlocks: when setting a cursor and when using CopyRect
fixed CopyRect when copying modified regions (they lost the modified
property)
WIN32 target compiles and works for example :-)
fixed CopyRect (was using the wrong order of rectangles...)
should also work with pthreads, because copyrects are
always sent immediately (so that two consecutive copy rects
cannot conflict).
changed rfbUndrawCursor(rfbClientPtr) to (rfbScreenInfoPtr), because
this makes more sense!
flag backgroundLoop in rfbScreenInfo (if having pthreads)
CopyRect & CopyRegion were implemented.
if you use a rfbDoCopyR* function, it copies the data in the
framebuffer. If you prefer to do that yourself, use rfbScheduleCopyR*
instead; this doesn't modify the frameBuffer.
added flag to optionally not send XCursor updates, but only RichCursor,
or if that is not possible, fall back to server side cursor.
This is useful if your cursor has many nice colours.
fixed java viewer on server side:
SendCursorUpdate would send data even before the client pixel format
was set, but the java applet doesn't like the server's format.
fixed two pthread issues:
rfbSendFramebuffer was sent by a ProcessClientMessage function
(unprotected by updateMutex).
cursor coordinates were set without protection by cursorMutex
source is now equivalent to TridiaVNC 1.2.1
pthreads now work (use iterators!)
cursors are supported (rfbSetCursor automatically undraws cursor)
support for 3 bytes/pixel (slow!)
server side colourmap support
fixed rfbCloseClient not to close the connection (pthreads!)
this is done lazily (and with proper signalling).
cleaned up mac.c (from original OSXvnc); now compiles (untested!)
compiles cleanly on Linux, IRIX, BSD, Apple (Darwin)
fixed prototypes
0.1
rewrote API to use pseudo-methods instead of required functions.
lots of clean up.
Example can show symbols now.
All encodings
HTTP

View File

@@ -1,340 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) 19yy <name of author>
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.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

View File

@@ -1,14 +0,0 @@
INCLUDES = $(all_includes)
noinst_LTLIBRARIES = libvncserver.la
libvncserver_la_SOURCES = main.c rfbserver.c sraRegion.c auth.c sockets.c \
stats.c corre.c hextile.c rre.c translate.c cutpaste.c \
zlib.c tight.c httpd.c cursor.c font.c \
draw.c selbox.c d3des.c vncauth.c cargs.c
EXTRA_DIST = CHANGES COPYING README TODO
AM_CPPFLAGS = -DHAVE_PTHREADS -DALLOW24BPP
AM_CFLAGS = -Wno-unused

View File

@@ -1,417 +0,0 @@
LibVNCServer: a library for easy implementation of a RDP/VNC server.
Copyright (C) 2001 Johannes E. Schindelin
What is it?
-----------
VNC is a set of programs using the RFB (Remote Frame Buffer) protocol. They
are designed to "export" a frame buffer via net (if you don't know VNC, I
suggest you read "Basics" below). It is already in wide use for
administration, but it is not that easy to program a server yourself.
This has been changed by LibVNCServer.
There are two examples included:
- example, a shared scribble sheet
- pnmshow, a program to show PNMs (pictures) over the net.
The examples are not too well documented, but easy straight forward and a
good starting point.
Try example: it outputs on which port it listens (default: 5900), so it is
display 0. To view, call
vncviewer :0
You should see a sheet with a gradient and "Hello World!" written on it. Try
to paint something. Note that everytime you click, there is some bigger blot.
The size depends on the mouse button you click. Open a second vncviewer with
the same parameters and watch it as you paint in the other window. This also
works over internet. You just have to know either the name or the IP of your
machine. Then it is
vncviewer machine.where.example.runs.com:0
or similar for the remote client. Now you are ready to type something. Be sure
that your mouse sits still, because everytime the mouse moves, the cursor is
reset! If you are done with that demo, just press Escape in the viewer. Note
that the server still runs, even if you closed both windows. When you
reconnect now, everything you painted and wrote is still there. So you press
"Page Up" for a blank page.
The demo pnmshow is much simpler: you either provide a filename as argument
or pipe a file through stdin. Note that the file has to be a raw pnm/ppm file,
i.e. a truecolour graphics. Only the Escape key is implemented. This may be
the best starting point if you want to learn how to use LibVNCServer. You
are confronted with the fact that the bytes per pixel can only be 8, 16 or 32.
How to use
----------
To make a server, you just have to initialise a server structure using the
function rfbDefaultScreenInit, like
rfbScreenInfoPtr rfbScreen =
rfbGetScreen(argc,argv,width,height,8,3,bpp);
where byte per pixel should be 1, 2 or 4. If performance doesn't matter,
you may try bpp=3 (internally one cannot use native data types in this
case; if you want to use this, look at pnmshow24).
You then can set hooks and io functions (see below) or other
options (see below).
And you allocate the frame buffer like this:
rfbScreen->frameBuffer = (char*)malloc(width*height*bpp);
After that, you initialize the server, like
rfbInitServer(rfbScreen);
You can use a blocking event loop, a background (pthread based) event loop,
or implement your own using the rfbProcessEvents function.
Making it interactive
---------------------
Input is handled by IO functions (see below).
Whenever you change something in the frame buffer, call rfbMarkRectAsModified.
You should make sure that the cursor is not drawn before drawing yourself
by calling rfbUndrawCursor. You can also draw the cursor using rfbDrawCursor,
but it hardly seems necessary. For cursor details, see below.
Utility functions
-----------------
Whenever you draw something, you have to call
rfbMarkRectAsModified(screen,x1,y1,x2,y2).
This tells LibVNCServer to send updates to all connected clients.
Before you draw something, be sure to call
rfbUndrawCursor(screen).
This tells LibVNCServer to hide the cursor.
Remark: There are vncviewers out there, which know a cursor encoding, so
that network traffic is low, and also the cursor doesn't need to be
drawn the cursor everytime an update is sent. LibVNCServer handles
all the details. Just set the cursor and don't bother any more.
To set the mouse coordinates (or emulate mouse clicks), call
defaultPtrAddEvent(buttonMask,x,y,cl);
However, this works only if your client doesn't do local cursor drawing. There
is no way (to my knowledge) to set the pointer of a client via RFB protocol.
IMPORTANT: do this at the end of your function, because this actually draws
the cursor if no cursor encoding is active.
What is the difference between rfbScreenInfoPtr and rfbClientPtr?
-----------------------------------------------------------------
The rfbScreenInfoPtr is a pointer to a rfbScreenInfo structure, which
holds information about the server, like pixel format, io functions,
frame buffer etc.
The rfbClientPtr is a pointer to an rfbClientRec structure, which holds
information about a client, like pixel format, socket of the
connection, etc.
A server can have several clients, but needn't have any. So, if you
have a server and three clients are connected, you have one instance
of a rfbScreenInfo and three instances of rfbClientRec's.
The rfbClientRec structure holds a member
rfbScreenInfoPtr screen
which points to the server and a member
rfbClientPtr next
to the next client.
The rfbScreenInfo structure holds a member
rfbClientPtr rfbClientHead
which points to the first client.
So, to access the server from the client structure, you use client->screen.
To access all clients from a server, get screen->rfbClientHead and
iterate using client->next.
If you change client settings, be sure to use the provided iterator
rfbGetClientIterator(rfbScreen)
with
rfbClientIteratorNext(iterator)
and
rfbReleaseClientIterator
to prevent thread clashes.
Other options
-------------
These options have to be set between rfbGetScreen and rfbInitServer.
If you already have a socket to talk to, just set rfbScreen->inetdSock
(originally this is for inetd handling, but why not use it for your purpose?).
To also start an HTTP server (running on port 5800+display_number), you have
to set rfbScreen->httpdDir to a directory containing vncviewer.jar and
index.vnc (like the included "classes" directory).
Hooks and IO functions
----------------------
There exist the following IO functions as members of rfbScreen:
kbdAddEvent, kbdReleaseAllKeys, ptrAddEvent and setXCutText
kbdAddEvent(Bool down,KeySym key,rfbClientPtr cl)
is called when a key is pressed.
kbdReleaseAllKeys(rfbClientPtr cl)
is not called at all (maybe in the future).
ptrAddEvent(int buttonMask,int x,int y,rfbClientPtr cl)
is called when the mouse moves or a button is pressed.
WARNING: if you want to have proper cursor handling, call
defaultPtrAddEvent(buttonMask,x,y,cl)
in your own function. This sets the coordinates of the cursor.
setXCutText(char* str,int len,rfbClientPtr cl)
is called when the selection changes.
There are only two hooks:
newClientHook(rfbClientPtr cl)
is called when a new client has connected.
displayHook
is called just before a frame buffer update is sent.
You can also override the following methods:
getCursorPtr(rfbClientPtr cl)
This could be used to make an animated cursor (if you really want ...)
setTranslateFunction(rfbClientPtr cl)
If you insist on colour maps or something more obscure, you have to
implement this. Default is a trueColour mapping.
Cursor handling
---------------
The screen holds a pointer
rfbCursorPtr cursor
to the current cursor. Whenever you set it, remember that any dynamically
created cursor (like return value from rfbMakeXCursor) is not free'd!
The rfbCursor structure consists mainly of a mask and a source. The mask
describes, which pixels are drawn for the cursor (a cursor needn't be
rectangular). The source describes, which colour those pixels should have.
The standard is an XCursor: a cursor with a foreground and a background
colour (stored in backRed,backGreen,backBlue and the same for foreground
in a range from 0-0xffff). Therefore, the arrays "mask" and "source"
contain pixels as single bits stored in bytes in MSB order. The rows are
padded, such that each row begins with a new byte (i.e. a 10x4
cursor's mask has 2x4 bytes, because 2 bytes are needed to hold 10 bits).
It is however very easy to make a cursor like this:
char* cur=" "
" xx "
" x "
" ";
char* mask="xxxx"
"xxxx"
"xxxx"
"xxx ";
rfbCursorPtr c=rfbMakeXCursor(4,4,cur,mask);
You can even set "mask" to NULL in this call and LibVNCServer will calculate
a mask for you (dynamically, so you have to free it yourself).
There is also an array named "richSource" for colourful cursors. They have
the same format as the frameBuffer (i.e. if the server is 32 bit,
a 10x4 cursor has 4x10x4 bytes).
History
-------
LibVNCServer is based on Tridia VNC and OSXvnc, which in turn are based on
the original code from ORL/AT&T.
When I began hacking with computers, my first interest was speed. So, when I
got around assembler, I programmed the floppy to do much of the work, because
it's clock rate was higher than that of my C64. This was my first experience
with client/server techniques.
When I came around Xwindows (much later), I was at once intrigued by the
elegance of such connectedness between the different computers. I used it
a lot - not the least priority lay on games. However, when I tried it over
modem from home, it was no longer that much fun.
When I started working with ASP (Application Service Provider) programs, I
tumbled across Tarantella and Citrix. Being a security fanatic, the idea of
running a server on windows didn't appeal to me, so Citrix went down the
basket. However, Tarantella has it's own problems (security as well as the
high price). But at the same time somebody told me about this "great little
administrator's tool" named VNC. Being used to windows programs' sizes, the
surprise was reciprocal inverse to the size of VNC!
At the same time, the program "rdesktop" (a native Linux client for the
Terminal Services of Windows servers) came to my attention. There where even
works under way to make a protocol converter "rdp2vnc" out of this. However,
my primary goal was a slow connection and rdp2vnc could only speak RRE
encoding, which is not that funny with just 5kB/s. Tim Edmonds, the original
author of rdp2vnc, suggested that I adapt it to Hextile Encoding, which is
better. I first tried that, but had no success at all (crunchy pictures).
Also, I liked the idea of an HTTP server included and possibly other
encodings like the Tight Encodings from Const Kaplinsky. So I started looking
for libraries implementing a VNC server where I could steal what I can't make.
I found some programs based on the demo server from AT&T, which was also the
basis for rdp2vnc (can only speak Raw and RRE encoding). There were some
rumors that GGI has a VNC backend, but I didn't find any code, so probably
there wasn't a working version anyway.
All of a sudden, everything changed: I read on freshmeat that "OSXvnc" was
released. I looked at the code and it was not much of a problem to work out
a simple server - using every functionality there is in Xvnc. It became clear
to me that I *had* to build a library out of it, so everybody can use it.
Every change, every new feature can propagate to every user of it.
It also makes everything easier:
You don't care about the cursor, once set (or use the standard cursor).
You don't care about those sockets. You don't care about encodings.
You just change your frame buffer and inform the library about it. Every once
in a while you call rfbProcessEvents and that's it.
Basics
------
VNC (Virtual network computing) works like this: You set up a server and can
connect to it via vncviewers. The communication uses a protocol named RFB
(Remote Frame Buffer). If the server supports HTTP, you can also connect
using a java enabled browser. In this case, the server sends back a
vncviewer applet with the correct settings.
There exist several encodings for VNC, which are used to compress the regions
which have changed before they are sent to the client. A client need not be
able to understand every encoding, but at least Raw encoding. Which encoding
it understands is negotiated by the RFB protocol.
The following encodings are known to me:
Raw, RRE, CoRRE, Hextile, CopyRect from the original AT&T code and
Tight, ZLib, LastRect, XCursor, RichCursor from Const Kaplinsky et al.
If you are using a modem, you want to try the "new" encodings. Especially
with my 56k modem I like ZLib or Tight with Quality 0. In my tests, it even
beats Tarantella.
There is the possibility to set a password, which is also negotiated by the
RFB protocol, but IT IS NOT SECURE. Anybody sniffing your net can get the
password. You really should tunnel through SSH.
Windows or: why do you do that to me?
--------------------------------------------
If you love products from Redmod, you better skip this paragraph.
I am always amazed how people react whenever Microsoft(tm) puts in some
features into their products which were around for a long time. Especially
reporters seem to not know dick about what they are reporting about! But
what is everytime annoying again, is that they don't do it right. Every
concept has it's new name (remember what enumerators used to be until
Mickeysoft(tm) claimed that enumerators are what we thought were iterators.
Yeah right, enumerators are also containers. They are not separate. Muddy.)
There are three packages you want to get hold of: zlib, jpeg and pthreads.
The latter is not strictly necessary, but when you put something like this
into your source:
#define MUTEX(s)
struct {
int something;
MUTEX(latex);
}
Microsoft's C++ compiler doesn't do it. It complains that this is an error.
You can find the packages at
http://www.gimp.org/win32/extralibs-dev-20001007.zip
Thanks go to all the GIMP team!
What are those other targets in the Makefile?
---------------------------------------------
OSXvnc-server is the original OSXvnc adapted to use the library, which was in
turn adapted from OSXvnc. As you easily can see, the OSX dependend part is
minimal.
storepasswd is the original program to save a vnc style password in a file.
Unfortunately, authentication as every vncviewer speaks it means the server
has to know the plain password. You really should tunnel via ssh or use
your own PasswordCheck to build a PIN/TAN system.
sratest is a test unit. Run it to assert correct behaviour of sraRegion. I
wrote this to test my iterator implementation.
blooptest is a test of pthreads. It is just the example, but with a background
loop to hunt down thread lockups.
pnmshow24 is like pnmshow, but it uses 3 bytes/pixel internally, which is not
as efficient as 4 bytes/pixel for translation, because there is no native data
type of that size, so you have to memcpy pixels and be real cautious with
endianness. Anyway, it works.
fontsel is a test for rfbSelectBox and rfbLoadConsoleFont. If you have Linux
console fonts, you can browse them via VNC. Directory browsing not implemented
yet :-(
Why I don't feel bad about GPL
------------------------------
At the beginning of this projects I would have liked to make it a BSD
license. However, it is based on plenty of GPL'ed code, so it has to be
a GPL. I hear BeeGee complaining: "but that's invasive, every derivative
work, even just linking, makes my software GPL!"
Yeah. That's right. It is because there are nasty jarheads out there who
would take anybody's work and claim it their own, selling it for much too
much money, stealing freedom and innovation from others, saying they were
the maintainers of innovation, lying, making money with that.
The people at AT&T worked really well to produce something as clean and lean
as VNC. The managers decided that for their fame, they would release the
program for free. But not only that! They realized that by releasing also
the code for free, VNC would become an evolving little child, conquering
new worlds, making it's parents very proud. As well they can be! To protect
this innovation, they decided to make it GPL, not BSD. The principal
difference is: You can make closed source programs deriving from BSD, not
from GPL. You have to give proper credit with both.
Now, why not BSD? Well, imagine your child being some famous actor. Along
comes a manager who exploits your child exclusively, that is: nobody else
can profit from the child, it itself included. Got it?
What reason do you have now to use this library commercially?
Several: You don't have to give away your product. Then you have effectively
circumvented the GPL, because you have the benefits of other's work and you
don't give back anything and you will be in hell for that. In fact, this
library, as my other projects, is a payback for all the free software I can
use (and sometimes, make better). For example, just now, I am using XEmacs
on top X11, all running under Linux.
Better: Use a concept like MySQL. This is free software, however, they make
money with it. If you want something implemented, you have the choice:
Ask them to do it (and pay a fair price), or do it yourself, normally giving
back your enhancements to the free world of computing.
Learn from it: If you like the style this is written, learn how to imitate
it. If you don't like the style, learn how to avoid those things you don't
like. I learnt so much, just from looking at code like Linux, XEmacs,
LilyPond, STL, etc.
License
-------
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.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.dfdf
Contact
-------
To contact me, mail me: Johannes dot Schindelin at gmx dot de

View File

@@ -1,80 +0,0 @@
immediate:
----------
x11vnc: clipboard, cursor, updates interruptible by input (doesn't work yet)
extra_bytes in rfbDrawCharWithClip.
tested mouse buttons make copy rect, but text is not marked as mod.
cursor drawing: set optional grain to mark bigger rectangles as drawn (else
you end up with thousands of one-pixel-rectangles to encode).
selectbox: scroll bars
documentation
hint that to mark very tiny regions as
modified is possibly inefficient for the encodings.
(a trail of points could better be a small rectangle).
later:
------
authentification schemes (secure vnc)
IO function ptr exists; now explain how to tunnel and implement a
client address restriction scheme.
autoconf? at least Sun Solaris and Windows compilation
(maybe Michael makes a small autconf)
using Hermes library for fast colour translations.
CORBA
internal HTTP tunnelling feature (needs a special GET target and a few
changes to java applet).
done:
-----
.x11vnc: sometimes XTest fails (but doesn't with x0rfbserver)
.DeferUpdateTime (timing problems!)
.empty cursor sending doesn't work.
.udp (need an rfbClientPtr udpClient in rfbScreen)
input only; nearly untested (don't have the clients).
.font handling: bpp>1
.test copyRect and pthreads.
.optionally dont draw rich cursors as xcursors
.cursor smears on IRIX with pthreads, then has bus error. has to be a mutex
problem in cursor routines.
.fix bug in http (java) client with big endian server: byte swapping is broken
(was a cursorshape which was sent too soon; java vncviewer assumes
a rich cursor shape to be always 1 byte per pixel, however, framebuffer
updates before setting the pixel format can be server format)
.rfbConnect, ConnectToTcpAddr
.update to newest TridiaVNC version (1.2.1).
.adapt rdp2vnc (rdesktop)
.pthreads concept: How to iterate over rfbClientPtr's? So that it can be
either called from rfbProcessEvents (which locks the list mutex)
or from the main thread (where the background loop sometimes
locks the list mutex).
- cursor drawing!
- cursor setting!
- rfbMarkRectAsModified
(did that by adding a refcount to clients secured by refCountMutex;
it also was necessary to check for cl->sock<0 in SendUpdateBuf)
.translate.c: warning about non 8-bit colourmaps
16-bit colourmaps are 192k -> no use without fast net.
.rfbCloseClient
.set colourmap
.support 3 bytes per pixel
.cursors
.cutpaste
.httpd
.other encodings
.test drawing of cursors when not using xcursor or rich cursor encoding
fix bug with odd width (depends on client depth: width has to be multiple of server.bytesPerPixel/client.bytesPerPixel). only raw!! -> bug of vncviewer!
.use sraRegion from Wez instead of miregion, because it is much smaller
. - connection gone and then reconnect is a problem
the reason: there are in fact three threads accessing
the clientPtr: input, output and the application thread.
if you kill the viewer or do rfbCloseClient, all of those
three have to be warned that this is happening.
-> rfbClientConnectionGone can only be called by the outer loop
(with background loop, it is input, else it is processEvents).
. fixed pthreads issues:
cursor deadlock,
CopyRect deadlock.
. when copying a region with modified parts, they were not marked
as modified

Some files were not shown because too many files have changed in this diff Show More