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

Compare commits

...

243 Commits

Author SHA1 Message Date
Script Kiddy
a77f6423f4 SVN_SILENT made messages (.desktop file)
svn path=/branches/KDE/4.1/kdenetwork/krfb/; revision=853066
2008-08-27 06:05:19 +00:00
Script Kiddy
25bfb5e714 SVN_SILENT made messages (.desktop file)
svn path=/branches/KDE/4.1/kdenetwork/krfb/; revision=831631
2008-07-12 23:36:58 +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
167 changed files with 5071 additions and 25385 deletions

1
.krazy Normal file
View File

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

54
CMakeLists.txt Normal file
View File

@@ -0,0 +1,54 @@
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
#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("Attepted uninvited connection from %1: connection refused",
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

View File

@@ -13,51 +13,58 @@
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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "connectiondialog.h"
#include "connectionwidget.h"
#include <qcheckbox.h>
#include <qlabel.h>
#include <QCheckBox>
#include <QLabel>
#include <kiconloader.h>
#include <klocale.h>
#include <KIconLoader>
#include <KLocale>
#include <KStandardGuiItem>
ConnectionDialog::ConnectionDialog( QWidget *parent, const char *name )
: KDialogBase( parent, name, true, i18n( "New Connection" ),
Ok|Cancel, Cancel, true )
ConnectionDialog::ConnectionDialog( QWidget *parent )
: KDialog( parent )
{
m_connectWidget = new ConnectionWidget( this, "ConnectWidget" );
m_connectWidget->pixmapLabel->setPixmap(
UserIcon( "connection-side-image.png" ) );
setCaption(i18n("New Connection"));
setButtons(Ok|Cancel);
setDefaultButton(Cancel);
setModal(true);
KGuiItem accept = KStdGuiItem::ok();
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" ) );
setButtonOK( accept );
setButtonGuiItem(Ok, accept);
KGuiItem refuse = KStdGuiItem::cancel();
KGuiItem refuse = KStandardGuiItem::cancel();
refuse.setText( i18n( "Refuse Connection" ) );
setButtonCancel( refuse );
setButtonGuiItem(Cancel, refuse);
setMainWidget( m_connectWidget );
}
void ConnectionDialog::setRemoteHost( const QString &host )
{
m_connectWidget->remoteHost->setText( host );
remoteHost->setText( host );
}
void ConnectionDialog::setAllowRemoteControl( bool b )
{
m_connectWidget->cbAllowRemoteControl->setChecked( b );
cbAllowRemoteControl->setChecked( b );
}
bool ConnectionDialog::allowRemoteControl()
{
return m_connectWidget->cbAllowRemoteControl->isChecked();
return cbAllowRemoteControl->isChecked();
}
#include "connectiondialog.moc"

View File

@@ -13,23 +13,24 @@
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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef CONNECTIONDIALOG_H
#define CONNECTIONDIALOG_H
#include <kdialogbase.h>
#include <KDialog>
#include "ui_connectionwidget.h"
class ConnectionWidget;
class QWidget;
class ConnectionDialog : public KDialogBase
class ConnectionDialog : public KDialog, public Ui::ConnectionWidget
{
Q_OBJECT
public:
ConnectionDialog( QWidget *parent, const char *name );
ConnectionDialog( QWidget *parent );
~ConnectionDialog() {};
void setRemoteHost( const QString &host );
@@ -37,7 +38,7 @@ class ConnectionDialog : public KDialogBase
bool allowRemoteControl();
protected:
ConnectionWidget *m_connectWidget;
QWidget *m_connectWidget;
};
#endif // CONNECTIONDIALOG_H

151
connectionwidget.ui Normal file
View File

@@ -0,0 +1,151 @@
<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>
<layoutdefault spacing="6" margin="11" />
<pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
<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

13
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>
@@ -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"

View File

@@ -13,29 +13,32 @@
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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef INVITEDIALOG_H
#define INVITEDIALOG_H
class InviteWidget;
#include "ui_invitewidget.h"
#include <kdialogbase.h>
#include <KDialog>
class InviteDialog : public KDialogBase
class QWidget;
class InviteDialog : public KDialog, public Ui::InviteWidget
{
Q_OBJECT
public:
InviteDialog( QWidget *parent, const char *name );
InviteDialog( QWidget *parent );
~InviteDialog() {}
void enableInviteButton( bool enable );
public slots:
public Q_SLOTS:
void setInviteCount( int count );
void showWhatsthis();
signals:
void createInviteClicked();
@@ -43,11 +46,11 @@ class InviteDialog : public KDialogBase
void manageInviteClicked();
void configureClicked();
protected slots:
protected Q_SLOTS:
void slotUser1();
protected:
InviteWidget *m_inviteWidget;
QWidget *m_inviteWidget;
};
#endif // INVITEDIALOG_H

174
invitewidget.ui Normal file
View File

@@ -0,0 +1,174 @@
<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>
<layoutdefault spacing="6" margin="11" />
<layoutfunction spacing="KDialog::spacingHint" margin="KDialog::marginHint" />
<pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
<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) -lkio
# 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

@@ -414,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">
@@ -496,6 +496,13 @@ Most VNC clients use a display number instead of the actual port. This display n
<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,44 @@
#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" {
KDE_EXPORT 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);
KAboutData* 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");
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();
@@ -96,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() {
@@ -151,7 +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);
}

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"
@@ -32,7 +34,7 @@ private:
ConfigurationWidget *m_confWidget;
void checkKInetd(bool&, bool&);
public:
KcmKRfb(QWidget *p, const char *name, const QStringList &);
KcmKRfb(QWidget *p, const QStringList &);
void load();
void save();

View File

@@ -1,32 +1,35 @@
[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[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]=Desktopdeling
Name[de]=Arbeitsfläche freigeben
Name[de]=Arbeitsflächen-Freigabe
Name[el]=Κοινή χρήση επιφάνειας εργασίας
Name[eo]=Tabuloj komunaj
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[ga]=Roinnt Deisce
Name[gl]=Compartición do escritorio
Name[gl]=Compartilla do escritorio
Name[he]=שיתוף שולחנות עבודה
Name[hi]=डेस्कटॉप साझेदारी
Name[hr]=Dijeljenje radne površine
@@ -34,131 +37,138 @@ Name[hu]=Munkaasztal-megosztás
Name[is]=Skjáborðamiðlun
Name[it]=Condivisione Desktop
Name[ja]=デスクトップ共有
Name[kk]=Үстелді ортақтастыру
Name[km]=ការ​ចែក​រំលែក​ផ្ទៃ​តុ
Name[ko]=데스크톱 공유
Name[lt]=Dalinimasis darbastaliu
Name[lv]=Darbvirsmas koplietošana
Name[mk]=Делење на работната површина
Name[mn]=Ажлын байрыг хамтран эзэмших
Name[ms]=Perkongsian Ruang Kerja
Name[mt]=Qsim tad-desktop
Name[nb]=Delte skrivebord
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[ru]=Общий рабочий стол
Name[se]=Čállinbeavdejuohkkin
Name[sk]=Zdieľanie pracovnej plochy
Name[sl]=Deljenje namizja
Name[sr]=Дељење радне површине
Name[sr@Latn]=Deljenje radne površine
Name[sv]=Dela ut skrivbordet
Name[ta]=பணிமேடை பகிர்வு
Name[tg]=Истифодабарии муштараки Мизи корӣ
Name[th]=ใช้งานพื้นที่ทำงานร่วมกัน
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 desktopdeling
Comment[de]=Freigabe der Arbeitsfläche einrichten
Comment[el]=Ρύθμιση του μοιράσματος της επιφάνειας εργασίας
Comment[eo]=Agordu fordonadon de viaj tabuloj
Comment[el]=Ρύθμιση της κοινής χρήσης της επιφάνειας εργασίας
Comment[eo]=Agordi la tabulan komunigadon
Comment[es]=Configure su escritorio compartido
Comment[et]=Töölaua jagamise seadistamine
Comment[eu]=Konfiguratu mahaigain partekatzea
Comment[fi]=Aseta työpöydän jakamista
Comment[fa]=پیکربندی اشتراک رومیزی
Comment[fi]=Aseta työpöydän jakaminen
Comment[fr]=Configuration du partage du bureau
Comment[ga]=Cumraigh Roinnt Deisce
Comment[gl]=Configura-la compartición do escritorio
Comment[gl]=Configurar a compartilla do escritorio
Comment[he]=שינוי הגדרות שיתוף שולחנות העבודה
Comment[hi]=कॉन्फ़िगर डेस्कटॉप साझेदारी
Comment[hi]=डेस्कटॉप साझेदारी कॉन्फ़िगर करें
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[lv]=Konfigurē darbvirsmas koplietošanu
Comment[mk]=Конфигурирајте делење на површината
Comment[mn]=Ажлын байрны хамтран эзэмших тохируулга
Comment[ms]= Selaraskan Perkongsian Desktop
Comment[nb]=Tilpass delte skrivebord
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[ru]=Параметры общего рабочего стола
Comment[se]=Heivet čállinbeavdejuohkkima
Comment[sk]=Nastavenie zdieľania pracovnej plochy
Comment[sl]=Nastavi deljenje namizja
Comment[sr]=Подешавање дељења радне површине
Comment[sr@Latn]=Podešavanje deljenja radne površine
Comment[sv]=Anpassa utdelning av skrivbord
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[ar]=مشاركة سطح المكتب,krfb,vnc,مشاركة,krdc,اتصال سطح مكتب بعيد,دعوة,منفذ,slp,غير مدعو
Keywords[bg]=споделяне, работно, място, десктоп, покана, връзка, desktop sharing, krfb, vnc, sharing, krdc, remote desktop connection, invitation, port, slp, uninvited
Keywords[bs]=desktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvited,dijeljenje desktopa,dijeljenje,udaljeni dekstop,poziv,nepozvan
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]=desktopdeling,krfb,vnc,deling,krdc,ekstern desktopforbindelse,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]=escritorio compartido,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[eu]=mahaigain partekatzea,krfb,vnc,partekatzea,krdc,urruneko mahaigain konexioa,gonbidapena,ataka,slp,gonbidapen gabea
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,חיבור לשולחן עבודה מרוחק,invitation,port,slp,uninvited
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[is]=skjáborðsmiðlun,miðlun,krfb,vnc,rdp,krdc,fjarvinnsla,remote desktop connection,rdp
Keywords[it]=condivisione desktop,krfb,vnc,condivisione,krdc,connessione desktop remoto,invito,porta,slp,non invitato
Keywords[ja]=デスクトップ共有,krfb,vnc,共有,rdp,krdc,リモートデスクトップ接続,invitation,port,slp,uninvited
Keywords[mk]=desktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvited,делење на површината,krfb,vnc,делење,krdc,поврзување со оддалечена површина,покана,порта,slp,непоканет
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, bureaublad delen,bureaublad op afstand
Keywords[nn]=skrivebordsdeling,krfb,vnc,deling,krdc,nettverksskrivebord,invitasjon,port,slp,ikkje invitert
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[sr@Latn]=desktop sharing,krfb,vnc,sharing,krdc,remote desktop connection,invitation,port,slp,uninvited,radna površina,deljenje,poziv,port,nepozvan,udaljeno
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[uk]=спільні стільниці,krfb,vnc,спільний,rdp,krdc,з'єднання віддаленої стільниці,запрошення,rdp,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,28 +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) $(LIB_KDNSSD)
# 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
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

@@ -26,15 +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) :
@@ -61,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;
@@ -73,7 +81,7 @@ 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*)));
@@ -89,8 +97,7 @@ bool PortListener::acquirePort() {
void PortListener::freePort() {
m_port = -1;
if (m_socket)
delete m_socket;
delete m_socket;
m_socket = 0;
setServiceRegistrationEnabledInternal(m_registerService);
dnssdRegister(false);
@@ -100,7 +107,7 @@ 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,
@@ -121,14 +128,14 @@ void PortListener::loadConfig(KService::Ptr s) {
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;
@@ -152,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()) {
@@ -173,42 +180,43 @@ void PortListener::loadConfig(KService::Ptr s) {
m_dnssdName = processServiceTemplate(vdname.toString())[0];
m_dnssdType = vdtype.toString();
m_dnssdRegister = true;
kdDebug() << "DNS-SD register is enabled\n";
kDebug() << "DNS-SD register is enabled\n";
}
else
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) ||
@@ -222,11 +230,11 @@ void PortListener::accepted(KSocket *sock) {
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;
@@ -255,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;
}
@@ -350,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
@@ -408,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;
}
@@ -643,14 +651,5 @@ bool KInetD::isServiceRegistrationEnabled(QString service)
KInetD::~KInetD() {
m_portListeners.clear();
delete m_config;
if (m_srvreg)
delete m_srvreg;
}
extern "C" {
KDE_EXPORT KDEDModule *create_kinetd(QCString &name)
{
KGlobal::locale()->insertCatalogue("kinetd");
return new KInetD(name);
}
delete m_srvreg;
}

View File

@@ -1,85 +1,85 @@
[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[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[eo]=KDE interreta demono
Name[es]=Demonio de Internet de KDE
Name[et]=KDE internetideemon
Name[eu]=KDE internet deabrua
Name[fi]=KDE Internet palvelin
Name[fa]=شبح اینترنتی KDE
Name[fi]=KDE Internet-palvelin
Name[fr]=Démon Internet de KDE
Name[ga]=Deamhan Idirlín KDE
Name[gl]=O demo de Internet de KDE
Name[gl]=Daemon de internet de KDE
Name[he]=תהליך הרקע האינטרנטי של KDE
Name[hi]=केडीई इंटरनेट डेमन
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[kk]=KDE Интернет қызметі
Name[km]=ដេមិន​អ៊ីនធឺណិត​របស់ KDE
Name[ko]=KDE 인터넷 데몬
Name[lt]=KDE interneto tarnyba
Name[lv]=KDE Interneta dēmons
Name[mk]=Даемон за Интернет на KDE
Name[mn]=KDE Интернет-демон
Name[ms]=Daemon Internet KDE
Name[mt]=Daemon tal-internet KDE
Name[nb]=KDEs Internett-nisse
Name[nds]=KDE-Internetdämoon
Name[ne]=केडीई इन्टरनेट डेइमोन
Name[nn]=KDE-Internett-nisse
Name[nso]=Daemon ya Internet ya KDE
Name[pl]=Internet/sieć
Name[pt]=Servidor de Internet do KDE
Name[pt_BR]=Servidor Internet do KDE
Name[ro]=Demon 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@Latn]=KDE-ov internet demon
Name[sv]=KDE:s Internetdemon
Name[ta]=கேடிஇ இணைய டேமொன்
Name[tg]=KDE Азозили Интернет
Name[th]=เดมอนอินเตอร์เน็ต 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[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[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[eu]=Sare zerbitzuak eskatzean abiarazten dituen deabrua
Comment[fi]=Internet palvelin, joka käynnistää verkkopalveluita
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[ga]=Deamhan Idirlín a thosaíonn seirbhísí gréasáin ar éileamh
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[hr]=Internet daemon koji pokreće mrežne usluge kada su zatražene
@@ -87,35 +87,35 @@ 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[lv]=Interneta dēmons pēc vajadzības palaiž tīkla servisus
Comment[mk]=Даемон за Интернет кој ги вклучува мрежните сервиси на барање
Comment[mn]=Сүлжээ-үйлчилгээний эрэлтээр ассан Сүлжээний демон
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[nds]=En Internet-Dämoon, wat Nettwarkdeensten op Anfraag start
Comment[ne]=एउटा इन्टरनेट डेइमोन जसले मागमा सञ्जाल सेवा सुरु गर्दछ
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]=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 demon de internet care 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@Latn]=Internet demon koji pokreće mrežne servise po zahtevu
Comment[sv]=Internetdemon som startar nätverkstjänster vid behov
Comment[ta]=ஒரு இணைய டேமொன், டேமொன் பிணைய சேவையை ஆரம்பிக்கிறது
Comment[tg]=Азозили шабакавие, ки хидматрасони шабакавиро бо дархост сар медиҳад
Comment[th]=เดมอนอินเตอร์เน็ตซึ่งจะเริ่มทำงานบริการเครือข่ายเมื่อมีความต้องการ
Comment[tr]=Başlangıçta ağ servisleri tarafından istenen internet hayalet programı
Comment[uk]=Демон Інтернет, що запускає служби мережі при запиті
Comment[uz]=Талаб қилинганда тармоқ хизматларини ишга тушурувчи Интернет демони
Comment[ven]=Internet daemon ine ya thoma tshumelo ya vhukwamani kha muthetho
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,14 +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 {
@@ -54,8 +54,8 @@ private:
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;
@@ -92,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
@@ -136,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);
@@ -178,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;
@@ -190,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);

View File

@@ -1,14 +1,14 @@
[!Global!]
[Global]
IconName=kinetd
Comment=KInetD
Comment[bn]=কে-আইনেট-ডি
Comment[hi]=के-इनिट-डी
Comment[sv]=Kinetd
Comment[xx]=xxKInetDxx
Comment[x-test]=xxKInetDxx
[IncomingConnection]
[Event/IncomingConnection]
Name=IncomingConnection
Name[ar]=اتصال وارد
Name[bg]=Получена е входяща връзка
Name[bn]=অন্তর্মুখী সংযোগ
Name[br]=Kevreadenn resev
Name[ca]=Connexió entrant
Name[cs]=Příchozí spojení
@@ -16,179 +16,156 @@ Name[cy]=CysylltiadCyrraedd
Name[da]=IndkommendeForbindelse
Name[de]=Eingehende Verbindung
Name[el]=Εισερχόμενη σύνδεση
Name[eo]=EnvenantaKonekto
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]=CeangalIsteach
Name[gl]=Conexión Entrante
Name[ga]=Ceangal Isteach
Name[gl]=Conexó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[km]=ការ​តភ្ជាប់​ចូល
Name[lt]=Gautas kvietimas ryšiui
Name[lv]=IenākošaisSavienojums
Name[mk]=Дојдовно поврзување
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[nb]=Innkommende tilkobling
Name[nds]=RinkamenVerbinnen
Name[nl]=Inkomende_verbinding
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[sr@Latn]=Dolazeća veza
Name[sv]=Inkommande anslutning
Name[ta]=உள்வரும் இணைப்புகள்
Name[tg]=Пайвастшавии Воридшаванда
Name[th]=มีการเชื่อมต่อเข้ามา
Name[tr]=Gelen Bağlantı
Name[uk]=ВхіднеЗ'єднання
Name[ven]=Vhukwamanihanga ngomu
Name[x-test]=xxIncomingConnectionxx
Name[xh]=Uxhumaniso Olungenayo
Name[xx]=xxIncomingConnectionxx
Name[zh_CN]=进入的连接
Name[zh_TW]=進來的連接
Name[zu]=UkuxhumanaOkuzayo
Name[zh_HK]=進入連線
Name[zh_TW]=進來的連線
Comment=Received incoming connection
Comment[af]=Ontvang inkomende verbinding
Comment[ar]=تم استلام اتصال وارد
Comment[bg]=Получена е входяща връзка
Comment[bs]=Primio dolaznu konekciju
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]=Ricevantaj envenantaj konektoj
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[gl]=Recibíuse unha conexión entrante
Comment[ga]=Fuarthas ceangal isteach
Comment[gl]=Recebeuse unha conexón entrante
Comment[he]=נתקבל חיבור נכנס
Comment[hi]=आवक कनेक्शन प्राप्त
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[lt]=Gautas įeinantis prisijungimas
Comment[ja]=外部からの接続がありました
Comment[km]=បាន​ទទួល​ការ​តភ្ជាប់​ចូល
Comment[ko]=들어오는 연결을 받았습니다
Comment[lt]=Gautas kvietimas ryšiui
Comment[lv]=Saņemts ienākošs savienojums
Comment[mk]=Примено е дојдовно поврзување
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[nb]=Mottok innkommende tilkobling
Comment[nds]=Tokoppelanfraag kregen
Comment[nl]=Inkomende verbinding ontvangen
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[se]=Oaččui boahtti oktavuođa
Comment[sk]=Prijaté príchodzie spojenia
Comment[sl]=Prejeta je prihajajoča povezava
Comment[sr]=Примљена је долазећа веза
Comment[sr@Latn]=Primljena je dolazeća veza
Comment[sv]=Tar emot inkommande anslutning
Comment[tg]=Пайвастшавии воридшаванда қабул гардид
Comment[th]=ได้รับการเชื่อมต่อเข้ามา
Comment[tr]=Gelen bağlantı alınıyor
Comment[uk]=Отримано вхідне з'єднання
Comment[ven]=Vhukwamani hau dzhena ho tanganedzhwaho
Comment[uk]=Отримано вхідне зєднання
Comment[x-test]=xxReceived incoming connectionxx
Comment[xh]=Uxhulumano olungenayo olufunyenweyo
Comment[xx]=xxReceived incoming connectionxx
Comment[zh_CN]=收到进入的连接
Comment[zh_TW]=已接收的進來的連線
Comment[zu]=Ukuxhumanisa okungenayo okutholakele
default_presentation=4
Comment[zh_HK]=已接收的進連線
Comment[zh_TW]=接收到進來的連線
Action=None
[ProcessFailed]
[Event/ProcessFailed]
Name=ProcessFailed
Name[ar]=فشلت العملية
Name[bg]=Процесът за обработка връзки не може да бъде стартиран
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]=ProcezoFiaskis
Name[el]=Η διεργασία απέτυχε
Name[eo]=Procezo fiaskis
Name[es]=Proceso fallido
Name[et]=Protsess ebaõnnestus
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]=Proceso fallido
Name[gl]=Fallou o proceso
Name[he]=תהליך נכשל
Name[hi]=प्रक्रिया-असफल
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[mn]=Ажиллагаа сүйрэв
Name[ms]=Proses Gagal
Name[mt]=ProċessFalla
Name[nb]=Prosess mislyktes
Name[nl]=Proces mislukt
Name[nn]=Prosess mislukkast
Name[nso]=Tiragalo e Paletswe
Name[nb]=Prosessen mislyktes
Name[nds]=PerzessFehlslaan
Name[nl]=Proces_mislukt
Name[pa]=ਪਰੋਸੈਸ ਫੇਲ੍ਹ
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[sr@Latn]=Proces nije uspeo
Name[sv]=Process misslyckades
Name[ta]=செயல் தோல்வியுற்றது
Name[tg]=Ҷараён бо Нокомӣ анҷомид
Name[th]=โปรเซสล้มเหลว
Name[tr]=Başarısız İşlemler
Name[uk]=ПомилкаПроцесу
Name[ven]=Tshitenwa tsho bala
Name[x-test]=xxProcessFailedxx
Name[xh]=Inkqubo Yahlulekile
Name[xx]=xxProcessFailedxx
Name[zh_CN]=处理失败
Name[zh_TW]=程序失敗
Name[zu]=UkwenzekaKuhlulekile
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[bg]=Процесът за обработка връзки не може да бъде стартиран
Comment[bs]=Ne mogu pokrenuti proces koji upravlja konekcijom
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 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[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[gl]=Non se puidcho chamar ó proceso para que atendese á conexión
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[hr]=Nisam mogao pozvati proces za kontrolu veze
@@ -196,33 +173,29 @@ 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[lt]=Negaliu iškviesti proceso prisijungimui apdoroti
Comment[km]=មិន​អាច​ហៅ​ដំណើរ​ការ ដើម្បី​ដោះស្រាយ​ការ​ត​ភ្ជាប់​បាន​ឡើយ
Comment[ko]=연결을 처리하기 위한 프로세스를 부를 수 없습니다
Comment[lt]=Nepavyko iškviesti proceso apdoroti prisijungimui
Comment[lv]=Neizdevās izsaukt procesu savienojuma apstrādei
Comment[mk]=Не може да се повика процесот за ракување со поврзувањето
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[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[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]=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[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@Latn]=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[th]=ไม่สามารถเรียกโปรเซสเพื่อรับการเชื่อมต่อได้
Comment[tr]=Elle bağlantıda başarısız çağrı işlemleri
Comment[uk]=Неможливо викликати процес для обробки з'єднання
Comment[ven]=Ingasi vhidze tshitenwa uitela u fara vhukwamani
Comment[uk]=Не вдалося викликати процес для з’єднання
Comment[x-test]=xxCould not call process to handle connectionxx
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
Comment[zh_HK]=無法呼叫處理連線的程序
Comment[zh_TW]=無法呼叫行程來處理此連線
Action=None

View File

@@ -4,21 +4,21 @@
Type=ServiceType
X-KDE-ServiceType=KInetDModule
Name=KInetD Module Type
Name[ar]=KInetD نوع وحدة
Name[bg]=Модул на KInetD
Name[bn]=কে-আইনেট-ডি মডিউল ধরন
Name[br]=Seurt ar mollad KInetD
Name[bs]=KInetD tip modula
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[el]=Τύπος Μονάδας KInetD
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[eu]=KInetD modulu mota
Name[fi]=KInetD moduulityyppi
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
@@ -29,36 +29,36 @@ 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[lv]=KInetD moduļa tips
Name[mk]=Тип на модул за KInetD
Name[mn]=Модуль KInetD
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
Name[ro]=Tip modul KInetD
Name[ru]=Модуль KInetD
Name[se]=KInetD-moduvlašládja
Name[sk]=Typ modulu KInetD
Name[sl]=Vrsta modula KInetD
Name[sr]=KInetD врста модула
Name[sr@Latn]=KInetD vrsta modula
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]

65
krfb.desktop Normal file
View File

@@ -0,0 +1,65 @@
# 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[x-test]=xxKrfbxx
Name[zh_TW]=Krfb 桌面分享
GenericName=Desktop Sharing
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[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[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[ru]=Общий рабочий стол
GenericName[sk]=Zdieľanie pracovnej plochy
GenericName[sl]=Deljenje namizja
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;RemoteAccess;Network;

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>

869
krfb.notifyrc Normal file
View File

@@ -0,0 +1,869 @@
[Global]
IconName=krfb
Comment=Desktop Sharing
Comment[af]=Werkskerm Deeling
Comment[bn]=ডেস্কটপ ভাগাভাগি
Comment[br]=Rannañ ar vurev
Comment[ca]=Compartició de l'escriptori
Comment[cs]=Sdílení pracovní plochy
Comment[cy]=Rhannu Penbwrdd
Comment[da]=Desktopdeling
Comment[de]=Arbeitsflächen-Freigabe
Comment[el]=Κοινή χρήση επιφάνειας εργασίας
Comment[eo]=Tabula komunigado
Comment[es]=Escritorio compartido
Comment[et]=Töölaua jagamine
Comment[eu]=Mahaigain partekatzea
Comment[fi]=Työpöydän jakaminen
Comment[fr]=Partage du bureau
Comment[ga]=Roinnt Deisce
Comment[gl]=Compartición do escritorio
Comment[he]=שיתוף שולחנות עבודה
Comment[hi]=डेस्कटॉप साझेदारी
Comment[hr]=Dijeljenje radne površine
Comment[hu]=Munkaasztal-megosztás
Comment[is]=Skjáborðamiðlun
Comment[it]=Condivisione desktop
Comment[ja]=デスクトップ共有
Comment[km]=ការ​ចែក​រំលែក​ផ្ទែ​តុ
Comment[ko]=데스크톱 공유
Comment[lt]=Dalinimasis darbastaliu
Comment[lv]=Darbvirsmas koplietošana
Comment[mk]=Делење на работната површина
Comment[ms]=Perkongsian Ruang Kerja
Comment[nb]=Delte skrivebord
Comment[nds]=Schriefdisch-Freegaav
Comment[nl]=Bureaublad delen
Comment[pa]=ਡੈਸਕਟਾਪ ਸ਼ੇਅਰਿੰਗ
Comment[pl]=Współdzielenie pulpitu
Comment[pt]=Partilha do Ecrã
Comment[pt_BR]=Compartilhamento do Ambiente de Trabalho
Comment[ru]=Параметры общего рабочего стола
Comment[sk]=Zdieľanie pracovnej plochy
Comment[sl]=Deljenje namizja
Comment[sv]=Dela ut skrivbordet
Comment[ta]=பணிமேடை பகிர்வு
Comment[tg]=Истифодаи Муштараки Мизи Корӣ
Comment[tr]=Masaüstü Paylaşımı
Comment[uk]=Спільні стільниці
Comment[x-test]=xxDesktop Sharingxx
Comment[xh]=Ulwahlulelano lwe Desktop
Comment[zh_CN]=桌面共享
Comment[zh_HK]=桌面分享
Comment[zh_TW]=桌面分享
[Event/UserAcceptsConnection]
Name=User Accepts Connection
Name[ca]=L'usuari accepta la connexió
Name[cs]=Uživatel přijímá spojení
Name[da]=Bruger accepterer forbindelse
Name[de]=Benutzer akzeptiert Verbindung
Name[el]=Ο χρήστης δέχεται τη σύνδεση
Name[eo]=Uzanto akceptas la konekton
Name[es]=El usuario acepta la conexión
Name[et]=Kasutaja nõustub ühendusega
Name[fi]=Käyttäjä hyväksyy yhteyden
Name[fr]=L'utilisateur accepte la connexion
Name[ga]=Glacann an tÚsáideoir Le Ceangal
Name[gl]=O usuario aceita a conexón
Name[hi]=उपयोक्ता ने कनेक्शन स्वीकारा
Name[hu]=A felhasználó engedélyezi a csatlakozást
Name[is]=Notandi samþykkir tengingar
Name[it]=L'utente accetta la connessione
Name[ja]=ユーザが接続を許可
Name[km]=អ្នក​ប្រើ​ទទួល​យក​ការ​ត​ភ្ជាប់
Name[ko]=사용자가 연결을 수락함
Name[lt]=Naudotojas priėmė kvietimą
Name[lv]=Lietotājs atļauj savienojumu
Name[nb]=Bruker godtar tilkobling
Name[nds]=Bruker lett tokoppeln to
Name[nl]=Gebruiker accepteert de verbinding
Name[pa]=ਯੂਜ਼ਰ ਨੇ ਕੁਨੈਕਸ਼ਨ ਮਨਜ਼ੂਰ ਕੀਤਾ
Name[pl]=Połączenie zaakceptowane przez użytkownika
Name[pt]=O Utilizador Aceita a Ligação
Name[pt_BR]=Usuário aceita conexão
Name[ru]=Пользователь принимает соединения
Name[sl]=Uporabnik sprejel povezavo
Name[sv]=Användaren accepterar anslutning
Name[tr]=Kullanıcı Bağlantıyı Kabul Etti
Name[uk]=Користувач приймає з’єднання
Name[x-test]=xxUser Accepts Connectionxx
Name[zh_CN]=用户接受连接
Name[zh_TW]=使用者接受連線
Comment=User accepts connection
Comment[af]=Gebruiker aanvaar verbinding
Comment[bn]=ব্যবহারকারী সংযোগ গ্রহণ করে
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 akzeptiert die Verbindung
Comment[el]=Ο χρήστης δέχεται τη σύνδεση
Comment[eo]=Uzanto akceptas la konekton
Comment[es]=El usuario acepta la conexión
Comment[et]=Kasutaja nõustub ühendusega
Comment[eu]=Erabiltzaileak konexioa onartu du
Comment[fi]=Käyttäjä hyväksyy yhteyden
Comment[fr]=L'utilisateur accepte la connexion
Comment[ga]=Glacann úsáideoir le ceangal
Comment[gl]=O usuario aceitou a conexón
Comment[he]=המשתמש מקבל את החיבור
Comment[hi]=उपयोक्ता ने कनेक्शन स्वीकारा
Comment[hr]=Korisnik prihvaća vezu
Comment[hu]=A felhasználó engedélyezi a csatlakozást
Comment[is]=Notandi samþykkir tengingu
Comment[it]=L'utente accetta la connessione
Comment[ja]=ユーザが接続を許可
Comment[km]=អ្នក​ប្រើ​ទទួល​យក​ការ​ត​ភ្ជាប់
Comment[ko]=사용자가 연결을 수락함
Comment[lt]=Naudotojas priėmė kvietimą
Comment[lv]=Lietotājs atļauj savienojumu
Comment[mk]=Корисникот прифаќа поврзување
Comment[ms]= Pengguna menerima sambungan
Comment[nb]=Bruker godtar tilkobling
Comment[nds]=Bruker nimmt Tokoppelanfraag an
Comment[nl]=Gebruiker accepteert de verbinding
Comment[pa]=ਯੂਜ਼ਰ ਨੇ ਕੁਨੈਕਸ਼ਨ ਮੰਨਿਆ
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[ru]=Пользователь принимает соединения
Comment[sk]=Užívateľ akceptoval spojenie
Comment[sl]=Uporabnik sprejel povezavo
Comment[sv]=Användaren accepterar anslutning
Comment[ta]=பயனர் இணைப்பு ஏற்றுக்கொள்ளப்பட்டது
Comment[tg]=Корванд пайвастшавиро қабул мекунад
Comment[tr]=Kullanıcı bağlantıyı kabul etti
Comment[uk]=Користувач приймає з’єднання
Comment[x-test]=xxUser accepts connectionxx
Comment[xh]=Umsebenzisi wamkela uxhulumaniso
Comment[zh_CN]=用户接受连接
Comment[zh_HK]=用戶接受連線
Comment[zh_TW]=使用者接受連線
Action=None
[Event/UserRefusesConnection]
Name=User Refuses Connection
Name[ca]=L'usuari refusa la connexió
Name[cs]=Uživatel odmítá spojení
Name[da]=Bruger afslår forbindelse
Name[de]=Benutzer verweigert Verbindung
Name[el]=Ο χρήστης απέρριψε τη σύνδεση
Name[eo]=Uzanto rifuzas la konekton
Name[es]=El usuario rechaza la conexión
Name[et]=Kasutaja keeldub ühendusest
Name[fi]=Käyttäjä hylkää yhteyden
Name[fr]=L'utilisateur refuse la connexion
Name[ga]=Diúltaíonn an tÚsáideoir Le Ceangal
Name[gl]=O usuario recusou a conexón
Name[hi]=उपयोक्ता ने कनेक्शन अस्वीकारा
Name[hu]=A felhasználó elutasítja a csatlakozást
Name[is]=Notandi hafnar tengingum
Name[it]=L'utente rifiuta la connessione
Name[ja]=ユーザが接続を拒否
Name[km]=អ្នក​ប្រើ​បដិសេធ​ការ​ត​ភ្ជាប់
Name[ko]=사용자가 연결을 거부함
Name[lt]=Naudotojas atmetė kvietimą
Name[lv]=Lietotājs noraida savienojumu
Name[nb]=Bruker nekter tilkobling
Name[nds]=Bruker wiest tokoppeln af
Name[nl]=Gebruiker weigert de verbinding
Name[pa]=ਯੂਜ਼ਰ ਨੇ ਕੁਨੈਕਸ਼ਨ ਤੋਂ ਇਨਕਾਰ ਕੀਤਾ
Name[pl]=Połączenie odrzucone przez użytkownika
Name[pt]=O Utilizador Recusa a Ligação
Name[pt_BR]=Usuário rejeita conexão
Name[ru]=Пользователь отклоняет соединения
Name[sl]=Uporabnik zavrnil povezavo
Name[sv]=Användaren vägrar anslutning
Name[tr]=Kullanıcı Bağlantıyı Reddetti
Name[uk]=Користувач не приймає з’єднання
Name[x-test]=xxUser Refuses Connectionxx
Name[zh_CN]=用户拒绝连接
Name[zh_TW]=使用者拒絕連線
Comment=User refuses connection
Comment[af]=Gebruiker weier verbinding
Comment[bn]=ব্যবহারকারী সংযোগ অস্বীকার করে
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 verweigert die Verbindung
Comment[el]=Ο χρήστης απέρριψε τη σύνδεση
Comment[eo]=Uzanto rifuzas konektojn
Comment[es]=El usuario rechaza la conexión
Comment[et]=Kasutaja keeldub ühendusest
Comment[eu]=Erabiltzaileak konexioa ukatu du
Comment[fi]=Käyttäjä hylkää yhteyden
Comment[fr]=L'utilisateur refuse la connexion
Comment[ga]=Diúltaíonn úsáideoir ceangal
Comment[gl]=O usuario non aceita a conexón
Comment[he]=המשתמש מסרב לחיבור
Comment[hi]=उपयोक्ता ने कनेक्शन अस्वीकारा
Comment[hr]=Korisnik odbija vezu
Comment[hu]=A felhasználó elutasítja a csatlakozást
Comment[is]=Notandi hafnar tengingu
Comment[it]=L'utente rifiuta la connessione
Comment[ja]=ユーザが接続を拒否
Comment[km]=អ្នក​ប្រើ​បដិសេធ​ការ​ត​ភ្ជាប់
Comment[ko]=사용자가 연결을 거부함
Comment[lt]=Naudotojas atmetė kvietimą
Comment[lv]=Lietotājs noraida savienojumu
Comment[mk]=Корисникот одбива поврзување
Comment[ms]=Pengguna menolak sambungan
Comment[nb]=Bruker nekter tilkobling
Comment[nds]=Bruker wiest Tokoppelanfraag af
Comment[nl]=Gebruiker weigert de verbinding
Comment[pa]=ਯੂਜ਼ਰ ਨੇ ਕੁਨੈਕਸ਼ਨ ਤੋਂ ਇਨਕਾਰ ਕੀਤਾ
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[ru]=Пользователь отклоняет соединения
Comment[sk]=Užívateľ odmietol spojenie
Comment[sl]=Uporabnik zavrnil povezavo
Comment[sv]=Användaren vägrar anslutning
Comment[ta]=பயனர் இணைப்பு ஏற்க மறுக்கப்பட்டது
Comment[tg]=Корванд пайвастшавиро рад мекунад
Comment[tr]=Kullanıcı bağlantıyı reddetti
Comment[uk]=Користувач не приймає з’єднання
Comment[x-test]=xxUser refuses connectionxx
Comment[xh]=Umsebenzisi wala uxhulumaniso
Comment[zh_CN]=用户拒绝连接
Comment[zh_HK]=用戶拒絕連線
Comment[zh_TW]=使用者拒絕連線使用者
Action=None
[Event/ConnectionClosed]
Name=Connection Closed
Name[ca]=Connexió tancada
Name[cs]=Spojení ukončeno
Name[da]=Forbindelse lukket
Name[de]=Verbindung geschlossen
Name[el]=Η σύνδεση έκλεισε
Name[eo]=Konekto fermita
Name[es]=Conexión cerrada
Name[et]=Ühendus suletud
Name[fi]=Yhteys suljettu
Name[fr]=Connexion fermée
Name[ga]=Ceangal Dúnta
Name[gl]=Conexón pechada
Name[hi]=कनेक्शन बन्द
Name[hu]=A kapcsolat megszűnt
Name[is]=Tengingu lokað
Name[it]=Connessione chiusa
Name[ja]=接続切断
Name[km]=បាន​បិទ​ការ​ត​ភ្ជាប់
Name[ko]=연결이 닫힘
Name[lt]=Ryšys baigtas
Name[lv]=Savienojums slēgts
Name[nb]=Forbindelsen lukket
Name[nds]=Afkoppelt
Name[nl]=Verbinding gesloten
Name[pa]=ਕੁਨੈਕਸ਼ਨ ਬੰਦ ਕੀਤਾ
Name[pl]=Połączenia zakończone
Name[pt]=Ligação Fechada
Name[pt_BR]=Conexão fechada
Name[ru]=Соединение закрыто
Name[sl]=Povezava zaprta
Name[sv]=Anslutning stängd
Name[tr]=Bağlantı Kapatıldı
Name[uk]=З'єднання закрито
Name[x-test]=xxConnection Closedxx
Name[zh_CN]=连接关闭
Name[zh_TW]=連線已關閉
Comment=Connection closed
Comment[af]=Verbinding gesluit
Comment[bn]=সংযোগ বন্ধ করা হল
Comment[br]=Serret eo ar gevreadenn
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 cerrada
Comment[et]=Ühendus suletud
Comment[eu]=Konexioa itxi da
Comment[fi]=Yhteys suljettu
Comment[fr]=Connexion coupée
Comment[ga]=Ceangal dúnta
Comment[gl]=A conexón está pechada
Comment[he]=החיבור נסגר
Comment[hi]=कनेक्शन बन्द
Comment[hr]=Veza prekinuta
Comment[hu]=A kapcsolat megszűnt
Comment[is]=Tengingu lokað
Comment[it]=Connessione chiusa
Comment[ja]=接続が閉じられました
Comment[km]=បាន​បិទ​ការ​ត​ភ្ជាប់
Comment[ko]=연결이 닫힘
Comment[lt]=Ryšys baigtas
Comment[lv]=Savienojums tika slēgts
Comment[mk]=Поврзувањето е затворено
Comment[ms]=Sambungan ditutup
Comment[nb]=Forbindelsen lukket
Comment[nds]=Afkoppelt
Comment[nl]=Verbinding verbroken
Comment[pa]=ਕੁਨੈਕਸ਼ਨ ਬੰਦ ਕੀਤਾ
Comment[pl]=Połączenie zakończone
Comment[pt]=A ligação foi encerrada
Comment[pt_BR]=conexão encerrada
Comment[ru]=Соединение закрыто
Comment[sk]=Spojenie ukončené
Comment[sl]=Povezava zaprta
Comment[sv]=Anslutning stängd
Comment[ta]=இணைப்புகள் மூடப்பட்டது
Comment[tg]=Пайвастшавӣ пӯшида аст
Comment[tr]=Bağlantı kapatıldı
Comment[uk]=З'єднання закрито
Comment[uz]=Aloqa uzildi
Comment[uz@cyrillic]=Алоқа узилди
Comment[x-test]=xxConnection closedxx
Comment[xh]=Uxhulumaniso luvaliwe
Comment[zh_CN]=连接关闭
Comment[zh_HK]=連線已關閉
Comment[zh_TW]=連線已關閉
Action=None
[Event/InvalidPassword]
Name=Invalid Password
Name[ca]=Contrasenya no vàlida
Name[cs]=Neplatné heslo
Name[da]=Ugyldigt kodeord
Name[de]=Passwort ungültig
Name[el]=Μη έγκυρος κωδικός πρόσβασης
Name[eo]=Nevalida pasvorto
Name[es]=Contraseña incorrecta
Name[et]=Vale parool
Name[fi]=Virheellinen salasana
Name[fr]=Mot de passe non valable
Name[ga]=Focal Faire Neamhbhailí
Name[gl]=Contrasinal non válido
Name[hi]=अवैध पासवर्ड
Name[hu]=Érvénytelen jelszó
Name[is]=Ógilt lykilorð
Name[it]=Password non valida
Name[ja]=無効なパスワード
Name[km]=ពាក្យ​សម្ងាត់​មិន​ត្រឹមត្រូវ
Name[ko]=잘못된 암호
Name[lt]=Neteisingas slaptažodžis
Name[lv]=Nederīga parole
Name[nb]=Ugyldig passord
Name[nds]=Leeg Passwoort
Name[nl]=Ongeldig wachtwoord
Name[pa]=ਗਲਤ ਪਾਸਵਰਡ
Name[pl]=Błędne hasło
Name[pt]=Senha Inválida
Name[pt_BR]=Senha inválida
Name[ru]=Неверный пароль
Name[sl]=Neveljavno geslo
Name[sv]=Ogiltigt lösenord
Name[tr]=Geçersiz Parola
Name[uk]=Неправильний пароль
Name[x-test]=xxInvalid Passwordxx
Name[zh_CN]=无效密码
Name[zh_TW]=不正確的密碼
Comment=Invalid password
Comment[af]=Ongeldige wagwoord
Comment[bn]=অবৈধ পাসওয়ার্ড
Comment[br]=Tremenger siek
Comment[ca]=Contrasenya no vàlida
Comment[cs]=Neplatné heslo
Comment[cy]=Cyfrinair annilys
Comment[da]=Ugyldigt kodeord
Comment[de]=Passwort ungültig
Comment[el]=Μη έγκυρος κωδικός πρόσβασης
Comment[eo]=Nevalida pasvorto
Comment[es]=Contraseña incorrecta
Comment[et]=Vale parool
Comment[eu]=Baliogabeko pasahitza
Comment[fi]=Virheellinen salasana
Comment[fr]=Mot de passe non valable
Comment[ga]=Focal faire neamhbhailí
Comment[gl]=O contrasinal non é válido
Comment[he]=הסיסמה שגויה
Comment[hi]=अवैध पासवर्ड
Comment[hr]=Nevažeća šifra
Comment[hu]=Érvénytelen jelszó
Comment[is]=Lykilorð ógilt
Comment[it]=Password non valida
Comment[ja]=無効なパスワード
Comment[km]=ពាក្យ​សម្ងាត់​មិន​ត្រឹមត្រូវ
Comment[ko]=잘못된 암호
Comment[lt]=Neteisingas slaptažodis
Comment[lv]=Parole nav derīga
Comment[mk]=Невалидна лозинка
Comment[ms]=Kata laluan tidak sah
Comment[nb]=Ugyldig passord
Comment[nds]=Leeg Passwoort
Comment[nl]=Ongeldig wachtwoord
Comment[pa]=ਗਲਤ ਪਾਸਵਰਡ
Comment[pl]=Błędne hasło
Comment[pt]=A senha é inválida
Comment[pt_BR]=senha inválida
Comment[ru]=Неверный пароль
Comment[sk]=Zlé heslo
Comment[sl]=Neveljavno geslo
Comment[sv]=Ogiltigt lösenord
Comment[ta]=செல்லாத கடவுச்சொல்
Comment[tg]=Гузарвожаи нодуруст
Comment[tr]=Geçersiz parola
Comment[uk]=Неправильний пароль
Comment[uz]=Maxfiy soʻz haqiqiy emas
Comment[uz@cyrillic]=Махфий сўз ҳақиқий эмас
Comment[wa]=Sicret nén valide
Comment[x-test]=xxInvalid passwordxx
Comment[xh]=Igama lokugqitha elingasebenziyo
Comment[zh_CN]=无效密码
Comment[zh_HK]=無效的密碼
Comment[zh_TW]=不正確的密碼
Action=None
[Event/InvalidPasswordInvitations]
Name=Invalid Password Invitations
Name[ca]=Contrasenya de les invitacions no vàlides
Name[cs]=Neplatné hesla výzev
Name[da]=Ugyldige kodeordsinvitationer
Name[de]=Ungültiges Einladungs-Passwort
Name[el]=Μη έγκυρος κωδικός πρόσβασης πρόσκλησης
Name[eo]=Nevalidaj pasvortaj invitoj
Name[es]=Contraseñas de invitaciones incorrectas
Name[et]=Kutsutu vale parool
Name[fi]=Virheellinen salasana kutsuun
Name[fr]=Invitations de mot de passe non valables
Name[ga]=Cuirí Neamhbhailí Focal Faire
Name[gl]=Contrasinal de convidado non válido
Name[hi]=अवैध पासवर्ड निमंत्रण
Name[hu]=Érvénytelen jelszavas meghívó
Name[is]=Ógild lykilorðsboð
Name[it]=Password di invito non valida
Name[ja]=招待に対する無効なパスワード
Name[km]=ការ​អញ្ជើញ​ពាក្យ​សម្ងាត់​មិន​ត្រឹមត្រូវ
Name[ko]=잘못된 비밀번호 초대장
Name[lt]=Neteisingas kvietimo slaptažodis
Name[lv]=Nepareiza parole ar ielūgumu
Name[nb]=Ugyldig invitasjonspassord
Name[nds]=Leeg Passwoort bi Inladen
Name[nl]=Ongeldig wachtwoord uitnodiging
Name[pa]=ਗਲਤ ਪਾਸਵਰਡ ਸੱਦਾ
Name[pl]=Informacja o błędnym haśle
Name[pt]=Convites de Senha Inválidos
Name[pt_BR]=Avisos de senha inválida
Name[sl]=Povabila z neveljavnimi gesli
Name[sv]=Ogiltigt lösenord vid inbjudan
Name[tr]=Geçersiz Parola Daveti
Name[uk]=Запрошення з некоректними паролями
Name[x-test]=xxInvalid Password Invitationsxx
Name[zh_CN]=无效密码邀请
Name[zh_TW]=不合法的密碼邀請
Comment=The invited party sent an invalid password. Connection refused.
Comment[af]=Die uitgenooi party gestuur 'n ongeldige wagwoord. Verbinding geweier.
Comment[bn]=আমন্ত্রিত দল একটি অবৈধ পাসওয়ার্ড পাঠাল। সংযোগ অস্বীকার করা হল।
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 Person hat ein ungültiges Passwort gesendet: Verbindung abgelehnt.
Comment[el]=Η πρόσκληση περιέχει μη έγκυρο κωδικό πρόσβασης. Η σύνδεση απορρίφθηκε.
Comment[eo]=La invitita kliento sendis nevalidan pasvorton. Konekto rifuzita.
Comment[es]=El invitado envió una contraseña incorrecta. Conexión rechazada.
Comment[et]=Kutsutu saatis vigase parooli. Ühendusest keelduti.
Comment[eu]=Gonbidatutako parekoak baliogabeko pasahitza bidali du. Konexioa ukatu da.
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[ga]=Sheol an duine le cuireadh focal faire neamhbhailí. Diúltaíodh an ceangal.
Comment[gl]=A parte convidante envioulle un contrasinal non válido. A conexó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ási kérés elutasítva.
Comment[is]=Boðinn aðili sendi ógilt lykilorð. Tengingu hafnað
Comment[it]=La parte invitata ha inviato una password non valida. Connessione rifiutata.
Comment[ja]=招待された人が無効なパスワードを送ってきました。接続を拒否しました。
Comment[km]=ភាគី​ដែល​បាន​អញ្ជើញ បាន​ផ្ញើ​ពាក្យ​សម្ងាត់​មិន​ត្រឹមត្រូវ ។ ការ​តភ្ជាប់​ត្រូវ​បាន​បដិសេធ ។
Comment[ko]=초대한 사람이 잘못된 비밀번호를 보냈습니다. 연결이 잘못되었습니다.
Comment[lt]=Pakviestoji pusė atsiuntė neteisingą slaptažodį. Ryšys nutrauktas.
Comment[lv]=Ielūgtā persona nosūtīja nepareizu paroli. Savienojums noraidīts.
Comment[mk]=Поканетата страна испрати невалидна лозинка. Поврзувањето е одбиено.
Comment[ms]=Pihak yang dijemput telah menghantar kata laluan yang salah. Sambungan ditolak.
Comment[nb]=Den inviterte brukeren sendte et ugyldig passord. Tilkobling nektet.
Comment[nds]=De inlaadt Deel hett en leeg Passwoort angeven. Tokoppeln torüchwiest.
Comment[nl]=De uitgenodigde partij stuurde een ongeldig wachtwoord. De verbinding is geweigerd.
Comment[pl]=Z drugiej strony podano błędne hasło. Połączenie odrzucone.
Comment[pt]=O utilizador 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[sk]=Pozvaný účastnik poslal zlé heslo. Spojenie zamietnuté.
Comment[sl]=Povabljena stranka je poslala neveljavno geslo. Povezava zavrnjena.
Comment[sv]=Den inbjudna personen skickade ett ogiltigt lösenord. Anslutning vägrades.
Comment[ta]=அழைத்த நபர் தவறான கடவுச்சொல்லை அனுப்பியுள்ளார். இணைப்பு நிராகரிக்கப்பட்டது.
Comment[tg]=Корванди дурдаст гузарвожаи нодурустро фиристод. Пайвастшавӣ манъ шудааст.
Comment[tr]=Davet edilenden gönderilmiş geçersiz parola. Bağlantı rededildi.
Comment[uk]=Запрошений учасник надіслав некоректний пароль. У з’єднанні відмовлено.
Comment[x-test]=xxThe invited party sent an invalid password. Connection refused.xx
Comment[xh]=Umhlangano omenyiweyo uthumele igama lokugqitha elisebenzayo. Uxhulumano lwa liwe.
Comment[zh_CN]=受邀请方发送的密码不对。连接被拒绝。
Comment[zh_HK]=被邀請的一方送出無效的密碼。已拒絕連線。
Comment[zh_TW]=邀請的人送出了不合法的密碼邀請。連線已拒絕。
Action=Popup
[Event/NewConnectionOnHold]
Name=New Connection on Hold
Name[ca]=Nova connexió en espera
Name[cs]=Nové spojení pozdrženo
Name[da]=Ny forbindelse sat til at vente
Name[de]=Neue Verbindung wartet
Name[el]=Νέα σύνδεση σε αναμονή
Name[eo]=Nova konekto atendante
Name[es]=Conexión nueva a la espera
Name[et]=Uus ühendus ootel
Name[fi]=Uusi yhteys odottaa
Name[fr]=Nouvelle connexion en attente
Name[ga]=Ceangal Nua Ag Fanacht
Name[gl]=Nova conexón en espera
Name[hi]=नया कनेक्शन होल्ड पर रखा
Name[hu]=Új kapcsolat tartva
Name[is]=Ný tenging á bið
Name[it]=Nuova connessione da tenere
Name[ja]=保留中の新規接続
Name[km]=ការ​តភ្ជាប់​ថ្មី កំពុង​ស្ថិត​នៅ​ក្នុង​ការ​រង់ចាំ
Name[ko]=새 연결 대기 중
Name[lt]=Naujas kvietimas ryšiui sulaikytas
Name[lv]=Jauns savienojums gaida
Name[nb]=Ny tilkobling venter
Name[nds]=Nieg Verbinnen töövt
Name[nl]=Nieuwe verbinding in de wacht
Name[pa]=ਨਵਾਂ ਕੁਨੈਕਸ਼ਨ ਹੋਲਡ ਉੱਤੇ ਹੈ
Name[pl]=Nowe połączenie wstrzymane
Name[pt]=Ligação Nova em Espera
Name[pt_BR]=Nova conexão ativa
Name[sl]=Nova povezava na čakanju
Name[sv]=Ny anslutning väntar
Name[tr]=Yeni Açık Bağlantı
Name[uk]=Очікування на нове з’єднання
Name[x-test]=xxNew Connection on Holdxx
Name[zh_CN]=新连接已搁置
Name[zh_TW]=新連線等待處理
Comment=Connection requested, user must accept
Comment[af]=Verbinding versoekte, gebruiker moet aanvaar
Comment[bn]=সংযোগ অনুরোধ করা হল, ব্যবহারকারীকে অবশ্যই স্বীকার করতে হবে
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, la uzanto devas akcepti
Comment[es]=Conexión solicitada, el usuario debe aceptarla
Comment[et]=Nõutakse ühendust, kasutaja peab seda lubama
Comment[eu]=Konexioa eskatu da, erabiltzaileak onartu behar du
Comment[fi]=Pyydettiin yhteyttä, käyttäjän tulee hyväksyä
Comment[fr]=Connexion demandée, l'utilisateur doit accepter
Comment[ga]=Ceangal iarrtha; ní mór don úsáideoir glacadh leis
Comment[gl]=Pediuse a conexón, o usuario debe aceitar
Comment[he]=נתבקש חיבור, על המשתמש לקבלו
Comment[hi]=कनेक्शन निवेदित. उपयोक्ता को स्वीकार होना चाहिए
Comment[hr]=Veza je zatražena, korisnik mora prihvatiti
Comment[hu]=Csatlakozási kérés, a felhasználónak el kell fogadnia
Comment[is]=Beiðni um tengingu, notandi verður að samþykkja
Comment[it]=Connessione richiesta, l'utente deve accettare
Comment[ja]=接続が要求されています。ユーザが許可しなければなりません。
Comment[km]=បាន​ស្នើ​ការ​ត​ភ្ជាប់​​ អ្នក​ប្រើ​ត្រូវ​តែ​ទទួល​យក
Comment[ko]=연결 요청됨, 사용자가 수락해야 함
Comment[lt]=Kvietimas ryšiui išsiųstas, naudotojas turi priimti kvietimą
Comment[lv]=Ir pieprasīts jauns savienojums, kurš lietotājam ir jāapstiprina
Comment[mk]=Побарано е поврзување, корисникот мора да прифати
Comment[ms]=Sambungan diminta, pengguna mesti menerima
Comment[nb]=Anmodning om tilkobling, bruker må godta
Comment[nds]=Tokoppeln anfraagt, Bruker mutt verlöven
Comment[nl]=Verbindingsverzoek, gebruiker dient toe te stemmen
Comment[pl]=Próba połączenia, musi być zaakceptowana przez użytkownika
Comment[pt]=Foi pedida uma ligação que o utilizador deverá aceitar
Comment[pt_BR]=Conexão requisitada; o usuário deve aceitar
Comment[ru]=Запрос на соединение, требуется подтверждение пользователя
Comment[sk]=Vyžiadané spojenie, užívateľ musí akceptovať
Comment[sl]=Povezava zahtevana, uporabnik mora sprejeti
Comment[sv]=Anslutning begärd, användaren måste acceptera
Comment[ta]=இணைப்பு கோரப்பட்டது, பயனர் கண்டிப்பாக ஏற்றுக்கொள்ள வேண்டும்
Comment[tg]=Пайвастшавӣ дархоста шудааст, корванд бояд қабул кунад
Comment[tr]=Bağlantı isteği, kullanıcı kabul etmeli
Comment[uk]=Отримано запит на з’єднання, користувач має його прийняти
Comment[x-test]=xxConnection requested, user must acceptxx
Comment[xh]=Uxhulumaniso luceliwe, umsebenzisi kufanele amkele
Comment[zh_CN]=连接已请求,用户必须接受
Comment[zh_HK]=已請求連線,用戶必須接受
Comment[zh_TW]=連線已要求,必須等使用者接受
Action=None
[Event/NewConnectionAutoAccepted]
Name=New Connection Auto Accepted
Name[ca]=Nova connexió acceptada automàticament
Name[cs]=Nové spojení automaticky přijato
Name[da]=Ny forbindelse automatisk accepteret
Name[de]=Neue Verbindung automatisch angenommen
Name[el]=Αυτόματη αποδοχή νέας σύνδεσης
Name[eo]=Nova konekto aŭtomate akceptita
Name[es]=Conexión nueva aceptada automáticamente
Name[et]=Uue ühendusega automaatselt nõus
Name[fi]=Uusi yhteys hyväksyttiin automaattisesti
Name[fr]=Nouvelle connexion auto-acceptée
Name[ga]=Ceangal nua bunaithe go huathoibríoch
Name[gl]=Nova conexón aceitada automaticamente
Name[hi]=नय कनेक्शन स्वचालित स्वीकारा
Name[hu]=Új kapcsolat automatikusan engedélyezve
Name[is]=Ný tenging sjálfvirkt samþykkt
Name[it]=Accettata nuova connessione automatica
Name[ja]=新規接続の自動受け入れ
Name[km]=បាន​ទទួល​យក​ការ​តភ្ជាប់​ថ្មី​ដោយ​ស្វ័យ​ប្រវត្តិ
Name[ko]=새 연결 자동 수락
Name[lt]=Naujas kvietimas ryšiui automatiškai priimtas
Name[lv]=Automātiski pieņemts jauns savienojums
Name[nb]=Ny tilkobling automatisk godtatt
Name[nds]=Nieg Verbinnen automaatsch tolaten
Name[nl]=Nieuwe verbinding automatisch accepteren
Name[pa]=ਨਵਾਂ ਕੁਨੈਕਸ਼ਨ ਆਟੋ ਮਨਜ਼ੂਰ
Name[pl]=Nowe połączenie automatycznie przyjęte
Name[pt]=Nova Ligação Aceite Automaticamente
Name[pt_BR]=Nova Conexão com aceitação automática
Name[ru]=Новое соединение принимается автоматически
Name[sl]=Nova povezava samodejno sprejeta
Name[sv]=Ny anslutning accepterades automatiskt
Name[tr]=Yeni Bağlantı Otomatik olarak Kabul Edildi
Name[uk]=Нове з’єднання автоматично прийнято
Name[x-test]=xxNew Connection Auto Acceptedxx
Name[zh_CN]=新连接自动接受
Name[zh_TW]=新連線自動接受
Comment=New connection automatically established
Comment[af]=Nuwe verbinding automaties vasgestel
Comment[bn]=নতুন সংযোগ স্বয়ংক্রীয়ভাবে স্থাপন করা হল
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 establita
Comment[es]=Conexión nueva establecida automáticamente
Comment[et]=Uus ühendus automaatselt loodud
Comment[eu]=Konexio berria automatikoki ezarri da
Comment[fi]=Uusi yhteys muodostettiin automaattisesti
Comment[fr]=Nouvelle connexion établie automatiquement
Comment[ga]=Ceangal nua bunaithe go huathoibríoch
Comment[gl]=Estabeleceuse automaticamente unha nova conexón
Comment[he]=נוצר חיבור חדש באופן אוטומטי
Comment[hi]=नया कनेक्शन स्वचलित स्थापित
Comment[hr]=Nova veza automatski prihvaćena
Comment[hu]=Automatikusan létrejött egy új kapcsolat
Comment[is]=Nýjar tengingar sjálfkrafa samþykktar
Comment[it]=Stabilita nuova connessione automaticamente
Comment[ja]=新規接続を自動的に確立しました
Comment[km]=បាន​បង្កើត​ការ​ត​ភ្ជាប់​ថ្មី​ដោយ​ស្វ័យ​ប្រវត្តិ
Comment[ko]=새 연결이 자동으로 성립됨
Comment[lt]=Naujas ryšys užmegztas automatiškai
Comment[lv]=Automātiski izveidots jauns savienojums
Comment[mk]=Автоматски е воспоставено ново поврзување
Comment[ms]=Sambungan baru secara automatik terjalin
Comment[nb]=En ny tilkobling er automatisk opprettet
Comment[nds]=Nieg Verbinnen automaatsch inricht
Comment[nl]=Nieuwe verbinding automatisch opgebouwd
Comment[pa]=ਨਵਾਂ ਕੁਨੈਕਸ਼ਨ ਆਟੋਮੈਟਿਕ ਹੀ ਬਣਾਇਆ ਗਿਆ
Comment[pl]=Nowe połączenie ustanowiono automatycznie
Comment[pt]=Foi estabelecida automaticamente uma nova ligação
Comment[pt_BR]=Nova conexão estabelecida automaticamente
Comment[ru]=Новое соединение устанавливается автоматически
Comment[sk]=Nové spojenie automaticky vytvorené
Comment[sl]=Nova povezava samodejno vzpostavljena
Comment[sv]=Ny anslutning automatiskt upprättad
Comment[ta]=இணைப்புகள் தானாக உருவாக்கப்பட்டது
Comment[tg]=Пайвастшавии нав ба таври худкор барпо мегардад
Comment[tr]=Yeni bağlantı otomatik olarak kuruldu
Comment[uk]=Автоматично встановлено нове з’єднання
Comment[x-test]=xxNew connection automatically establishedxx
Comment[xh]=Uxhulumaniso olutsha lufunyenwe ngokuzenzekelayo
Comment[zh_CN]=自动建立新连接
Comment[zh_HK]=已自動建立新連線
Comment[zh_TW]=新連線自動建立
Action=None
[Event/TooManyConnections]
Name=Too Many Connections
Name[ca]=Massa connexions
Name[cs]=Příliš mnoho spojení
Name[da]=For mange forbindelser
Name[de]=Zu viele Verbindungen
Name[el]=Πάρα πολλές συνδέσεις
Name[eo]=Tro multaj konektoj
Name[es]=Demasiadas conexiones
Name[et]=Liiga palju ühendusi
Name[fi]=Liikaa yhteyksiä
Name[fr]=Trop de connexions
Name[ga]=An Iomarca Ceangal
Name[gl]=Demasiadas conexóns
Name[hi]=बहुत सारे कनेक्शन
Name[hu]=Túl sok kapcsolat
Name[is]=Of margar tengingar
Name[it]=Troppe connessioni
Name[ja]=多すぎる接続
Name[km]=ការ​តភ្ជាប់​ច្រើន​ពេក
Name[ko]=너무 많은 연결
Name[lt]=Per daug užmegztų ryšių
Name[lv]=Pārāk daudz savienojumu
Name[nb]=For mange tilkoblinger
Name[nds]=To vele Verbinnen
Name[nl]=Teveel verbindingen
Name[pa]=ਬਹੁਤ ਸਾਰੇ ਕੁਨੈਕਸ਼ਨ
Name[pl]=Zbyt wiele połączeń
Name[pt]=Demasiadas Ligações
Name[pt_BR]=Conexões em excesso
Name[ru]=Слишком много соединений
Name[sl]=Preveč povezav
Name[sv]=För många anslutningar
Name[tr]=Çok Fazla Bağlantı
Name[uk]=Забагато з’єднань
Name[x-test]=xxToo Many Connectionsxx
Name[zh_CN]=连接过多
Name[zh_TW]=太多連線
Comment=Busy, connection refused
Comment[af]=Besig, verbinding geweier
Comment[bn]=ব্যস্ত, সংযোগ অস্বীকার করল
Comment[br]=Dalc'het, kevreadenn disteuleret
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]=Okupata, konekto rifuzita
Comment[es]=Ocupado, conexión rechazada
Comment[et]=Hõivatud, ühendusest keelduti
Comment[eu]=Lanpetuta, konexioa ukatu da
Comment[fi]=Varattu, yhteys hylättiin
Comment[fr]=Occupé, connexion refusée
Comment[ga]=Gnóthach; ceangal diúltaithe
Comment[gl]=Ocupado, a conexón foi recusada
Comment[he]=תפוס, החיבור נדחה
Comment[hi]=व्यस्त, कनेक्शन अस्वीकृत
Comment[hr]=Zauzeto, veza odbijena
Comment[hu]=A csatlakozási kérés elutasítva túlterhelés miatt
Comment[is]=Uptekinn, tengingu hafnað
Comment[it]=Occupato, connessione rifiutata
Comment[ja]=ビジーです、接続を拒否しました
Comment[km]=រវល់ បដិសេធ​ការ​ត​ភ្ជាប់
Comment[ko]=바쁨, 연결 거부됨
Comment[lt]=Užimta, kvietimas ryšiui atmestas
Comment[lv]=Aizņemts, savienojums noraidīts
Comment[mk]=Зафатено, поврзувањето е одбиено
Comment[ms]=Sibuk, sambungan ditolak
Comment[nb]=Opptatt, tilkobling nektet
Comment[nds]=Bunnen, Verbinnen torüchwiest
Comment[nl]=Bezet, verbinding geweigerd
Comment[pa]=ਬਿਜ਼ੀ, ਕੁਨੈਕਸ਼ਨ ਤੋਂ ਇਨਕਾਰ
Comment[pl]=Zajęte, połączenie odrzucone
Comment[pt]=Ocupado, pelo a ligação foi recusada
Comment[pt_BR]=Ocupado; conexão recusada
Comment[ru]=Занят, соединение отклонено
Comment[sk]=Zaneprázdneny, spojenie odmietnuté
Comment[sl]=Zaposlen, povezava zavrnjena
Comment[sv]=Upptagen, anslutning vägras
Comment[ta]=வேலையில் உள்ளது, இணைப்பு நிராகரிக்கப்பட்டது
Comment[tg]=Банд, пайвастшавӣ рад гардидааст
Comment[tr]=Meşgul, bağlantı rededildi
Comment[uk]=Зайнято, у з’єднанні відмовлено
Comment[uz]=Band, aloqa rad etildi
Comment[uz@cyrillic]=Банд, алоқа рад этилди
Comment[x-test]=xxBusy, connection refusedxx
Comment[xh]=Uxhulumaniso, olu xakekileyo lwaliwe
Comment[zh_CN]=对方处于忙碌状态,连接被拒绝
Comment[zh_HK]=忙碌,已拒絕連線
Comment[zh_TW]=忙碌,連線被拒
Action=None
default_logfile=
[Event/UnexpectedConnection]
Name=Unexpected Connection
Name[ca]=Connexió inesperada
Name[cs]=Neočekávané spojení
Name[da]=Uventet forbindelse
Name[de]=Unerwartete Verbindung
Name[el]=Μη αναμενόμενη σύνδεση
Name[eo]=Neatendita konekto
Name[es]=Conexión inesperada
Name[et]=Ootamatu ühendus
Name[fi]=Odottamaton yhteys
Name[fr]=Connexion inattendue
Name[ga]=Ceangal Gan Choinne
Name[gl]=Conexón non agardada
Name[hi]=अप्रत्याशित कनेक्शन
Name[hu]=Nem várt kapcsolat
Name[is]=Óvænt Tenging
Name[it]=Connessione inaspettata
Name[ja]=予期しない接続
Name[km]=ការ​តភ្ជាប់​ដែល​មិន​បាន​រំពឹង​ទុក
Name[ko]=예상하지 않은 연결
Name[lt]=Netikėtas kvietimas ryšiui
Name[lv]=Negaidīts savienojums
Name[nb]=Uventet tilkobling
Name[nds]=Nich verwacht Tokoppeln
Name[nl]=Onverwachte verbinding
Name[pa]=ਅਣਜਾਣ ਕੁਨੈਕਸ਼ਨ
Name[pl]=Niespodziewane połączenie
Name[pt]=Ligação Inesperada
Name[pt_BR]=Conexão inesperada
Name[ru]=Неожиданное соединение
Name[sl]=Nepričakovana povezava
Name[sv]=Oväntad anslutning
Name[tr]=Beklenmeyen Bağlantı
Name[uk]=Неочікуване з’єднання
Name[x-test]=xxUnexpected Connectionxx
Name[zh_CN]=未预料的连接
Name[zh_TW]=未知的連線
Comment=Received unexpected connection, abort
Comment[af]=Ontvang onverwagte verbinding, staak
Comment[bn]=অপ্রত্যাশিত সংযোগ গ্রহণ করল, বাতিল করুন
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 hergestellt, Abbruch
Comment[el]=Λήφθηκε μια μη αναμενόμενη σύνδεση· εγκατάλειψη
Comment[eo]=Ricevis neatenditan konekton, ĉesi
Comment[es]=Recibida conexión inesperada, abortar
Comment[et]=Saadi ootamatu ühendus, loobuti
Comment[eu]=Ustegabeko konexioa jaso da, abortatzen
Comment[fi]=Vastaanotettiin odottamaton yhteys, lopeta
Comment[fr]=Reçu une connexion inattendue, interruption
Comment[ga]=Fuarthas ceangal gan choinne, á thobscor
Comment[gl]=Recebiuse unha conexón non agardada, abortouse
Comment[he]=נתקבל חיבור בלתי צפוי, בוטל
Comment[hi]=अप्रत्याशित कनेक्शन प्राप्त. छोड़ा
Comment[hr]=Primio sam neočekivanu vezu, prekid
Comment[hu]=Nem várt csatlakozási kérés érkezett, megszakítás
Comment[is]=Tók á móti óvæntri tengingu, hætti
Comment[it]=Ricevuta connessione inaspettata, termina
Comment[ja]=予期しない接続を受信しました。廃棄します。
Comment[km]=បាន​ទទួល​យក​ការ​តភ្ជាប់​ដែល​មិន​បាន​រំពឹង​ទុក ​បោះបង់
Comment[ko]=예상하지 않은 연결을 받았습니다, 중지합니다
Comment[lt]=Sulaukta netikėto kvietimo ryšiui, nutraukiama
Comment[lv]=Saņemts negaidīts savienojums, pārtraukts
Comment[mk]=Примено е неочекувано поврзување, се прекинува
Comment[ms]=Menerima sambungan luar jangka, menamatkan
Comment[nb]=Mottok uventet tilkobling, avbrutt
Comment[nds]=Unverwacht Verbinnen kregen, afbraken
Comment[nl]=Ontving een onverwachte verbinding, afgebroken
Comment[pl]=Otrzymano niespodziewane połączenie. Przerwane.
Comment[pt]=Foi recebida uma ligação inesperada, pelo que foi interrompida
Comment[pt_BR]=conexão recebida inesperadamente; abortar
Comment[ru]=Получено неожиданное соединение. Отключение
Comment[sk]=Prijaté neočakávane spojenie, ukončujem
Comment[sl]=Prejeta nepričakovana povezava, prekinjeno
Comment[sv]=Tog emot oväntad anslutning, avbryter
Comment[ta]=எதிர்பாராத இணைப்பு, நிறுத்தப்பட்டது
Comment[tg]=Пайвастшавии ғайричашмдош қабул гардид, кандашавӣ
Comment[tr]=Babul edilmiş beklenmedik bağlantı, durdur
Comment[uk]=Отримано з’єднання, яке не очікувалось, припиняється
Comment[x-test]=xxReceived unexpected connection, abortxx
Comment[xh]=Ufumene uxhulumaniso olungalindelekanga, lahla
Comment[zh_CN]=收到意外连接,已中止
Comment[zh_HK]=接收到非預期的連線,中止
Comment[zh_TW]=已接收到未知的連線,中止。
Action=None

View File

@@ -1,34 +0,0 @@
KDE_CXXFLAGS = $(USE_THREADS)
METASOURCES = AUTO
noinst_LTLIBRARIES = libkrfbconfig.la
libkrfbconfig_la_SOURCES = configuration.cc configuration.skel invitedialog.cc invitation.cc \
manageinvitations.ui personalinvitewidget.ui \
invitewidget.ui personalinvitedialog.cc
libkrfbconfig_la_LIBADD = ../srvloc/libsrvloc.la $(LIB_KDEUI)
bin_PROGRAMS = krfb
krfb_SOURCES = rfbcontroller.cc xupdatescanner.cc main.cpp \
connectionwidget.ui krfbifaceimpl.cc krfbiface.skel \
trayicon.cpp connectiondialog.cc
krfb_LDADD = libkrfbconfig.la ../libvncserver/libvncserver.la ../srvloc/libsrvloc.la -lXtst $(LIB_KDEUI) $(LIBJPEG) -lkio
krfb_LDFLAGS = $(all_libraries) $(KDE_RPATH)
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,474 +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>
#include <krun.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, "InviteDialog"),
persInvDlg(0, "PersonalInviteDialog"),
portNum(-1),
kinetdRef("kded", "kinetd")
{
kinetdRef.setDCOPClient(KApplication::dcopClient());
loadFromKConfig();
saveToDialogs();
doKinetdConf();
connectDCOPSignal( 0, "KRFB::ConfigChanged", "KRFB_ConfigChanged()",
"updateKConfig()", false );
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, SIGNAL(createInviteClicked()),
SLOT(showPersonalInvitationDialog()));
connect(&invDlg, SIGNAL(emailInviteClicked()),
SLOT(inviteEmail()));
connect(&invDlg, SIGNAL(manageInviteClicked()),
SLOT(showManageInvitationsDialog()));
connect(&invDlg, SIGNAL(configureClicked()),
SLOT(showConfigurationModule()));
connect(this, SIGNAL(invitationNumChanged(int)),
&invDlg, SLOT(setInviteCount(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::updateKConfig()
{
loadFromKConfig();
}
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();
}
////////////// personal invitation dialog //////////////////////////
void Configuration::showPersonalInvitationDialog() {
loadFromKConfig();
Invitation inv = createInvitation();
save();
emit invitationNumChanged(invitationList.size());
invDlg.enableInviteButton(false);
invMngDlg.newPersonalInvitationButton->setEnabled(false);
persInvDlg.setHost(hostname(), port());
persInvDlg.setPassword(inv.password());
persInvDlg.setExpiration(inv.expirationTime());
persInvDlg.exec();
invDlg.enableInviteButton(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, whichever 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() {
KRun::run( "kcmshell kcmkrfb", KURL::List() );
}
#include "configuration.moc"

View File

@@ -1,139 +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 "personalinvitedialog.h"
#include "invitedialog.h"
#include <dcopref.h>
#include <kconfig.h>
#include <qtimer.h>
#include <qobject.h>
#include <qvalidator.h>
#include <qstring.h>
#include <dcopobject.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, public DCOPObject {
K_DCOP
Q_OBJECT
public:
Configuration(krfb_mode mode);
virtual ~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;
InviteDialog invDlg;
PersonalInviteDialog 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;
k_dcop:
// Connected to the DCOP signal
void updateKConfig();
private slots:
void refreshTimeout();
void invMngDlgDeleteOnePressed();
void invMngDlgDeleteAllPressed();
};
#endif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

View File

@@ -1,208 +0,0 @@
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
<class>ConnectionWidget</class>
<widget class="QWidget">
<property name="name">
<cstring>NewConnectWidget</cstring>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>521</width>
<height>328</height>
</rect>
</property>
<grid>
<property name="name">
<cstring>unnamed</cstring>
</property>
<property name="margin">
<number>0</number>
</property>
<widget class="QLabel" row="0" column="1" rowspan="1" colspan="2">
<property name="name">
<cstring>TextLabel5</cstring>
</property>
<property name="sizePolicy">
<sizepolicy>
<hsizetype>1</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="font">
<font>
<pointsize>13</pointsize>
<bold>1</bold>
</font>
</property>
<property name="text">
<string>Attention</string>
</property>
<property name="indent">
<number>0</number>
</property>
</widget>
<widget class="QLabel" row="1" column="1" rowspan="1" colspan="2">
<property name="name">
<cstring>mainTextLabel</cstring>
</property>
<property name="sizePolicy">
<sizepolicy>
<hsizetype>5</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="lineWidth">
<number>-1</number>
</property>
<property name="margin">
<number>0</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>AutoText</enum>
</property>
<property name="alignment">
<set>WordBreak|AlignVCenter|AlignLeft</set>
</property>
<property name="indent">
<number>0</number>
</property>
<property name="wordwrap" stdset="0">
</property>
</widget>
<widget class="QLabel" row="0" column="0" rowspan="6" colspan="1">
<property name="name">
<cstring>pixmapLabel</cstring>
</property>
<property name="sizePolicy">
<sizepolicy>
<hsizetype>0</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>108</width>
<height>318</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>108</width>
<height>318</height>
</size>
</property>
<property name="frameShape">
<enum>WinPanel</enum>
</property>
<property name="frameShadow">
<enum>Sunken</enum>
</property>
<property name="lineWidth">
<number>0</number>
</property>
<property name="margin">
<number>0</number>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
<property name="indent">
<number>0</number>
</property>
</widget>
<widget class="QLabel" row="3" column="2">
<property name="name">
<cstring>remoteHost</cstring>
</property>
<property name="font">
<font>
<bold>1</bold>
</font>
</property>
<property name="text">
<string>123.234.123.234</string>
</property>
</widget>
<widget class="QCheckBox" row="5" column="1" rowspan="1" colspan="2">
<property name="name">
<cstring>cbAllowRemoteControl</cstring>
</property>
<property name="sizePolicy">
<sizepolicy>
<hsizetype>1</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Allow remote user to &amp;control keyboard and mouse</string>
</property>
<property name="whatsThis" stdset="0">
<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>
</widget>
<widget class="QLabel" row="3" column="1">
<property name="name">
<cstring>TextLabel1</cstring>
</property>
<property name="font">
<font>
<bold>1</bold>
</font>
</property>
<property name="text">
<string>Remote system:</string>
</property>
</widget>
<spacer row="4" column="1">
<property name="name">
<cstring>spacer23</cstring>
</property>
<property name="orientation">
<enum>Vertical</enum>
</property>
<property name="sizeType">
<enum>Minimum</enum>
</property>
<property name="sizeHint">
<size>
<width>20</width>
<height>84</height>
</size>
</property>
</spacer>
<spacer row="2" column="1">
<property name="name">
<cstring>spacer22</cstring>
</property>
<property name="orientation">
<enum>Vertical</enum>
</property>
<property name="sizeType">
<enum>Minimum</enum>
</property>
<property name="sizeHint">
<size>
<width>20</width>
<height>80</height>
</size>
</property>
</spacer>
</grid>
</widget>
<layoutdefaults spacing="6" margin="11"/>
</UI>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

File diff suppressed because it is too large Load Diff

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;
}

View File

@@ -1,65 +0,0 @@
/* 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include "invitedialog.h"
#include "invitewidget.h"
#include <kiconloader.h>
#include <klocale.h>
#include <kstdguiitem.h>
#include <qlabel.h>
#include <qpushbutton.h>
InviteDialog::InviteDialog( QWidget *parent, const char *name )
: KDialogBase( parent, name, true, i18n( "Invitation" ),
User1|Close|Help, NoDefault, true )
{
m_inviteWidget = new InviteWidget( this, "InviteWidget" );
m_inviteWidget->pixmapLabel->setPixmap(
UserIcon( "connection-side-image.png" ) );
setMainWidget( m_inviteWidget );
setButtonGuiItem( User1, KStdGuiItem::configure() );
connect( m_inviteWidget->btnCreateInvite, SIGNAL( clicked() ),
SIGNAL( createInviteClicked() ) );
connect( m_inviteWidget->btnEmailInvite, SIGNAL( clicked() ),
SIGNAL( emailInviteClicked() ) );
connect( m_inviteWidget->btnManageInvite, SIGNAL( clicked() ),
SIGNAL( manageInviteClicked() ) );
}
void InviteDialog::slotUser1()
{
emit configureClicked();
}
void InviteDialog::enableInviteButton( bool enable )
{
m_inviteWidget->btnCreateInvite->setEnabled( enable );
}
void InviteDialog::setInviteCount( int count )
{
m_inviteWidget->btnManageInvite->setText(
i18n( "&Manage Invitations (%1)..." ).arg( count ) );
}
#include "invitedialog.moc"

View File

@@ -1,197 +0,0 @@
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
<class>InviteWidget</class>
<widget class="QWidget">
<property name="name">
<cstring>InviteWidget</cstring>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>521</width>
<height>328</height>
</rect>
</property>
<property name="caption">
<string></string>
</property>
<grid>
<property name="name">
<cstring>unnamed</cstring>
</property>
<property name="margin">
<number>0</number>
</property>
<widget class="QLabel" row="0" column="1" rowspan="1" colspan="3">
<property name="name">
<cstring>TextLabel2</cstring>
</property>
<property name="font">
<font>
<bold>1</bold>
</font>
</property>
<property name="text">
<string>Welcome to KDE Desktop Sharing</string>
</property>
</widget>
<widget class="KActiveLabel" row="1" column="1" rowspan="1" colspan="3">
<property name="name">
<cstring>kActiveLabel1</cstring>
</property>
<property name="focusPolicy">
<enum>NoFocus</enum>
</property>
<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:&lt;p&gt;An invitation creates a one-time password that allows the receiver to connect to your desktop. It is valid for only one successful connection and will expire after an hour if it has not been used. When somebody connects to your computer a dialog will appear and ask you for permission. The connection will not be established before you accept it. In this dialog you can also restrict the other person to view your desktop only, without the ability to move your mouse pointer or press keys.&lt;/p&gt;&lt;p&gt;If you want to create a permanent password for Desktop Sharing, allow 'Uninvited Connections' in the configuration.&lt;/p&gt;"&gt;More about invitations...&lt;/a&gt;</string>
</property>
</widget>
<widget class="QLabel" row="0" column="0" rowspan="7" colspan="1">
<property name="name">
<cstring>pixmapLabel</cstring>
</property>
<property name="sizePolicy">
<sizepolicy>
<hsizetype>0</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>108</width>
<height>318</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>108</width>
<height>318</height>
</size>
</property>
<property name="frameShape">
<enum>WinPanel</enum>
</property>
<property name="frameShadow">
<enum>Sunken</enum>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
<property name="alignment">
<set>AlignTop</set>
</property>
</widget>
<spacer row="4" column="3">
<property name="name">
<cstring>spacer4</cstring>
</property>
<property name="orientation">
<enum>Horizontal</enum>
</property>
<property name="sizeType">
<enum>Expanding</enum>
</property>
<property name="sizeHint">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
<widget class="QPushButton" row="3" column="2">
<property name="name">
<cstring>btnCreateInvite</cstring>
</property>
<property name="text">
<string>Create &amp;Personal Invitation...</string>
</property>
<property name="toolTip" stdset="0">
<string></string>
</property>
<property name="whatsThis" stdset="0">
<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>
</widget>
<spacer row="6" column="2">
<property name="name">
<cstring>spacer5</cstring>
</property>
<property name="orientation">
<enum>Vertical</enum>
</property>
<property name="sizeType">
<enum>Fixed</enum>
</property>
<property name="sizeHint">
<size>
<width>20</width>
<height>24</height>
</size>
</property>
</spacer>
<spacer row="4" column="1">
<property name="name">
<cstring>spacer3</cstring>
</property>
<property name="orientation">
<enum>Horizontal</enum>
</property>
<property name="sizeType">
<enum>Expanding</enum>
</property>
<property name="sizeHint">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
<widget class="QPushButton" row="5" column="2">
<property name="name">
<cstring>btnManageInvite</cstring>
</property>
<property name="text">
<string>&amp;Manage Invitations (%1)...</string>
</property>
</widget>
<widget class="QPushButton" row="4" column="2">
<property name="name">
<cstring>btnEmailInvite</cstring>
</property>
<property name="text">
<string>Invite via &amp;Email...</string>
</property>
<property name="whatsThis" stdset="0">
<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>
</widget>
<spacer row="2" column="2">
<property name="name">
<cstring>spacer2</cstring>
</property>
<property name="orientation">
<enum>Vertical</enum>
</property>
<property name="sizeType">
<enum>MinimumExpanding</enum>
</property>
<property name="sizeHint">
<size>
<width>20</width>
<height>89</height>
</size>
</property>
</spacer>
</grid>
</widget>
<signals>
<signal>createInviteClicked()</signal>
<signal>emailInviteClicked()</signal>
<signal>manageInviteClicked()</signal>
</signals>
<layoutdefaults spacing="6" margin="11"/>
<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
</UI>

View File

@@ -1,133 +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
X-KDE-KINETD-DNSSD-Name=Remote Desktop of %u
X-KDE-KINETD-DNSSD-Type=_rfb._tcp
X-KDE-KINETD-DNSSD-Properties=type=shared,u=%u,fullname=%f
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 desktopdeling
Name[de]=KRfb Arbeitsfläche freigeben
Name[el]=Κοινή χρήση επιφάνειας εργασίας KRfb
Name[eo]=KRfb Tabula fordonado
Name[es]=Escritorio compartido KRfb
Name[et]=KRfb Töölaua jagamine
Name[eu]=KRfb mahaigain partekatzea
Name[fi]=Työpöydän jakaminen
Name[fr]=Partage de bureau KRfb
Name[ga]=Roinnt Deisce 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[is]=KRfb Skjáborðsmiðlun
Name[it]=Condivisione desktop KRfb
Name[ja]=KRfb デスクトップ共有
Name[lt]=KRfb dalinimasis darbastaliu
Name[mk]=Делење на површина со KRfb
Name[mn]=KRfb ажлын байр
Name[ms]=Perkongsian Ruang Kerja KRfb
Name[mt]=Qsim tad-desktop KRfb
Name[nb]=KRfb skrivebordsdeling
Name[nl]=KRfb Bureaublad delen
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[se]=KRfb-čállinbeavdejuohkin
Name[sk]=KRfb zdieľanie pracovnej plochy
Name[sl]=Deljenje namizja z KRfb
Name[sr]=KRfb дељење радне површине
Name[sr@Latn]=KRfb deljenje radne površine
Name[sv]=Krfb dela ut skrivbord
Name[ta]=KRfb பணிமேடை பகிர்வு
Name[tg]=Истифодабарии муштакари Мизи кории KRfb
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 din desktop
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[eu]=Zure mahaigaina partekatzeko aukera ematen duen deabrua da
Comment[fi]=Palvelin joka mahdollistaa työpöydän jakamisen
Comment[fr]=Un démon qui vous permet de partager votre bureau
Comment[ga]=Deamhan a chuireann ar do chumas do dheasca a roinnt
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[is]=Þjónn sem leyfir þér að miðla skjáborðinu þínu
Comment[it]=Un demone che permette di condividere il tuo desktop
Comment[ja]=デスクトップ共有を可能にするデーモン
Comment[lt]=Tarnyba, leidžianti jums dalintis savo darbastaliu
Comment[mk]=Даемон кој ви дозволува да ја делите вашата работна површина
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]=Strežnik, s katerim lahko delite vaše namizje
Comment[sr]=Демон који вам дозвољава да делите вашу радну површину
Comment[sr@Latn]=Demon koji vam dozvoljava da delite vašu radnu površinu
Comment[sv]=Demon som låter dig dela ut skrivbordet
Comment[ta]=ஒரு டேமொன் உங்கள் பணிமேடை பகிர்வை அளிக்கும்
Comment[tg]=Азозиле, ки ба шумо истифодабарии муштараки мизи кориро медиҳад
Comment[th]=เดมอนอนุญาตให้คุณแบ่งการใช้งานพื้นที่ทำงานร่วมกัน
Comment[tr]=Masaüstünüzde paylaşılmasına izin verilmiş hayalet program
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,41 +0,0 @@
# KDE Config File
[Desktop Entry]
Type=Application
Exec=krfb -caption "%c" %i %m
Icon=krfb
DocPath=krfb/index.html
Terminal=false
Name=Krfb
Name[xx]=xxKrfbxx
GenericName=Desktop Sharing
GenericName[bg]=Споделяне на раб. място
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[es]=Escritorio compartido
GenericName[et]=Töölaua jagamine
GenericName[eu]=Mahaigain partekatzea
GenericName[fr]=Partage de bureau
GenericName[ga]=Roinnt Deisce
GenericName[he]=שיתוף שולחנות עבודה
GenericName[hu]=Munkaasztal-megosztás
GenericName[is]=Skjáborðsmiðlun
GenericName[it]=Condivisione desktop
GenericName[mt]=Qsim tad-desktop
GenericName[nl]=Bureaublad delen
GenericName[pl]=Współdzielenie pulpitu
GenericName[pt]=Partilha do Ambiente de Trabalho
GenericName[pt_BR]=Compartilhamento de Ambiente de Trabalho
GenericName[ru]=Общий рабочий стол
GenericName[sl]=Deljenje namizja
GenericName[sr]=Дељење радне површине
GenericName[sr@Latn]=Deljenje radne površine
GenericName[sv]=Dela ut skrivbordet
GenericName[tr]=Masaüstü Paylaşımı
GenericName[uk]=Спільні стільниці
GenericName[xx]=xxDesktop Sharingxx
GenericName[zh_CN]=桌面共享
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);
}

View File

@@ -1,54 +0,0 @@
/* 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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include "personalinvitedialog.h"
#include "personalinvitewidget.h"
#include <qlabel.h>
#include <kactivelabel.h>
#include <kiconloader.h>
#include <klocale.h>
PersonalInviteDialog::PersonalInviteDialog( QWidget *parent, const char *name )
: KDialogBase( parent, name, true, i18n( "Personal Invitation" ),
Close, Close, true )
{
m_inviteWidget = new PersonalInviteWidget( this, "PersonalInviteWidget" );
m_inviteWidget->pixmapLabel->setPixmap(
UserIcon( "connection-side-image.png" ) );
setMainWidget( m_inviteWidget );
}
void PersonalInviteDialog::setHost( const QString &host, uint port )
{
m_inviteWidget->hostLabel->setText( QString( "%1:%2" )
.arg( host ).arg( port ) );
}
void PersonalInviteDialog::setPassword( const QString &passwd )
{
m_inviteWidget->passwordLabel->setText( passwd );
}
void PersonalInviteDialog::setExpiration( const QDateTime &expire )
{
m_inviteWidget->expirationLabel->setText( expire.toString( Qt::LocalDate ) );
}

View File

@@ -1,241 +0,0 @@
<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
<class>PersonalInviteWidget</class>
<widget class="QWidget">
<property name="name">
<cstring>Form1</cstring>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>519</width>
<height>328</height>
</rect>
</property>
<property name="caption">
<string></string>
</property>
<grid>
<property name="name">
<cstring>unnamed</cstring>
</property>
<property name="margin">
<number>0</number>
</property>
<property name="resizeMode">
<enum>Fixed</enum>
</property>
<widget class="KActiveLabel" row="0" column="1" rowspan="1" colspan="3">
<property name="name">
<cstring>mainTextLabel</cstring>
</property>
<property name="sizePolicy">
<sizepolicy>
<hsizetype>7</hsizetype>
<vsizetype>1</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>NoFocus</enum>
</property>
<property name="text">
<string>&lt;h2&gt;Personal Invitation&lt;/h2&gt;
Give the information below to the person that you want to invite (&lt;a href="whatsthis:Desktop Sharing uses the VNC protocol. You can use any VNC client to connect. In KDE the client is called 'Remote Desktop Connection'. Enter the host information into the client and it will connect.."&gt;how to connect&lt;/a&gt;). Note that everybody who gets the password can connect, so be careful.</string>
</property>
</widget>
<spacer row="1" column="2">
<property name="name">
<cstring>spacer9</cstring>
</property>
<property name="orientation">
<enum>Vertical</enum>
</property>
<property name="sizeType">
<enum>Expanding</enum>
</property>
<property name="sizeHint">
<size>
<width>20</width>
<height>34</height>
</size>
</property>
</spacer>
<widget class="QLabel" row="0" column="0" rowspan="6" colspan="1">
<property name="name">
<cstring>pixmapLabel</cstring>
</property>
<property name="sizePolicy">
<sizepolicy>
<hsizetype>0</hsizetype>
<vsizetype>0</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>108</width>
<height>318</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>108</width>
<height>318</height>
</size>
</property>
<property name="frameShape">
<enum>WinPanel</enum>
</property>
<property name="frameShadow">
<enum>Sunken</enum>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
<spacer row="5" column="2">
<property name="name">
<cstring>spacer10</cstring>
</property>
<property name="orientation">
<enum>Vertical</enum>
</property>
<property name="sizeType">
<enum>Expanding</enum>
</property>
<property name="sizeHint">
<size>
<width>20</width>
<height>30</height>
</size>
</property>
</spacer>
<widget class="KActiveLabel" row="2" column="2">
<property name="name">
<cstring>hostLabel</cstring>
</property>
<property name="sizePolicy">
<sizepolicy>
<hsizetype>3</hsizetype>
<vsizetype>1</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>NoFocus</enum>
</property>
<property name="text">
<string>cookie.tjansen.de:0</string>
</property>
</widget>
<widget class="QLabel" row="3" column="1">
<property name="name">
<cstring>kActiveLabel6</cstring>
</property>
<property name="sizePolicy">
<sizepolicy>
<hsizetype>3</hsizetype>
<vsizetype>1</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>&lt;b&gt;Password:&lt;/b&gt;</string>
</property>
</widget>
<widget class="QLabel" row="4" column="1">
<property name="name">
<cstring>kActiveLabel7</cstring>
</property>
<property name="sizePolicy">
<sizepolicy>
<hsizetype>3</hsizetype>
<vsizetype>1</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>&lt;b&gt;Expiration time:&lt;/b&gt;</string>
</property>
</widget>
<widget class="KActiveLabel" row="3" column="2">
<property name="name">
<cstring>passwordLabel</cstring>
</property>
<property name="sizePolicy">
<sizepolicy>
<hsizetype>3</hsizetype>
<vsizetype>1</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>NoFocus</enum>
</property>
<property name="text">
<string>12345</string>
</property>
</widget>
<widget class="KActiveLabel" row="4" column="2">
<property name="name">
<cstring>expirationLabel</cstring>
</property>
<property name="sizePolicy">
<sizepolicy>
<hsizetype>3</hsizetype>
<vsizetype>1</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>NoFocus</enum>
</property>
<property name="text">
<string>17:12</string>
</property>
</widget>
<widget class="QLabel" row="2" column="1">
<property name="name">
<cstring>kActiveLabel5</cstring>
</property>
<property name="sizePolicy">
<sizepolicy>
<hsizetype>3</hsizetype>
<vsizetype>1</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>&lt;b&gt;Host:&lt;/b&gt;</string>
</property>
</widget>
<widget class="KActiveLabel" row="2" column="3">
<property name="name">
<cstring>hostHelpLabel</cstring>
</property>
<property name="sizePolicy">
<sizepolicy>
<hsizetype>3</hsizetype>
<vsizetype>1</vsizetype>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>(&lt;a href="whatsthis:This field contains the address of your computer and the display number, separated by a colon. The address is just a hint - you can use any address that can reach your computer. Desktop Sharing tries to guess your address from your network configuration, but does not always succeed in doing so. If your computer is behind a firewall it may have a different address or be unreachable for other computers."&gt;Help&lt;/a&gt;)</string>
</property>
</widget>
</grid>
</widget>
<layoutdefaults spacing="6" margin="11"/>
<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
</UI>

View File

@@ -1,902 +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));
}
VNCEvent::~VNCEvent() {
}
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;
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(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 = 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),
dialog( 0, "ConnectionDialog" ),
disableBackgroundPending(false),
disableBackgroundState(false),
closePending(false),
forcedClose(false)
{
self = this;
connect(&dialog, SIGNAL(okClicked()), SLOT(dialogAccepted()));
connect(&dialog, SIGNAL(cancelClicked()), 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 = 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.allowRemoteControl());
}
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.setRemoteHost(remoteIp);
dialog.setAllowRemoteControl( 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,221 +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 "connectiondialog.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 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 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 {
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,138 +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->setCheckedState(i18n("Disable 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,83 +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[ar]=KRfb ميكرو httpd
Name[bg]=Микро уеб сървър (KRfb - httpd)
Name[cs]=KRfb mikro 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[hi]=KRfb माइक्रो Httpd
Name[hu]=KRfb mini-httpd
Name[is]=KRfb Micro vefþjónn
Name[ja]=KRfbマイクロHttpd
Name[ms]=Httpd Mikro KRfb
Name[nb]=KRfb mikro- http-nisse
Name[nl]=KRfb micro webserver
Name[nn]=KRfb-mikro-http-nisse
Name[pl]=Mikroskopijny serwer HTTP dla KRfb
Name[pt]=Micro Httpd do KRfb
Name[ru]=KRfb микро Httpd
Name[sv]=Krfb mikro-HTTP demon
Name[tr]=KRfb Mini Httpd
Name[uk]=KRfb мікро 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[ar]=مراقب httpd صغير لـkrfb الذي يخدم بريمج عرض VNC.
Comment[bg]=Малък уеб сървър, който обслужва аплета за преглед на VNC
Comment[bs]=Mikro HTTP demon za krfb koji služi za applet VNC preglednika.
Comment[ca]=Un micro-dimoni http per a krfb que serveix l'applet visor VNC.
Comment[cs]=Mikro HTTP server pro krfb sloužící VNC prohlížeči.
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[eu]=VNC ikustaile applet-a zerbitzatzen duen krfb-rako micro http deabrua.
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[hi]=krfb के लिए एक माइक्रो एचटीटीपी डीमॉन जो वीएनसी व्यूअर ऐप्लेट को सर्व करता है.
Comment[hu]=Mini HTTP-szolgáltatás a KRfb-hez, a VNC nézegető használatához.
Comment[is]=Verulega lítill vefþjónn sem veitir aðgang í VNC.
Comment[it]=Un micro demone http per krfb che server l'applet di VNC viewer.
Comment[ja]=krfb用のマイクロhttpデーモン(VNCビューアアプレットを提供)
Comment[mk]=http-микродаемон за krfb кој служи на аплетот на VNC-прегледувачот.
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[nn]=Ein ørliten http-nisse for krfb som hjelper visingsprogrammet for VNC.
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[ru]=Микро-сервер http для krfb, который обслуживает аплет просмотрщика VNC.
Comment[sk]=Mikro http démon pre krfb ktorý ovláda prehliadací applet VNC.
Comment[sl]=Mikro http strežnik za krfb, ki streže ogledovalnikom VNC.
Comment[sr]=Микро http демон за krfb који опслужује аплет VNC приказивача.
Comment[sr@Latn]=Mikro http demon za krfb koji opslužuje aplet VNC prikazivača.
Comment[sv]=En mikro-HTTP demon för Krfb som hanterar VNC-visningsminiprogrammet
Comment[ta]=krfb க்கான நுண்ணிய http அது VNC சேவையை குறுப்பயன் பார்வையாளர்.
Comment[tg]=Азозили micro http барои krfb, ки хидматрасони VNC апплети хидматрасон мебошад.
Comment[tr]=VNC izleyici programcığını çalıştıran mini bir web sunucu.
Comment[uk]=Мікро- даемон http для krfb, який обслуговує аплет переглядача VNC.
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

303
krfbserver.cpp Normal file
View File

@@ -0,0 +1,303 @@
/* 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;
bool running;
int numClients;
QByteArray desktopName;
};
class KrfbServerPrivate
{
public:
KrfbServer instance;
};
K_GLOBAL_STATIC(KrfbServerPrivate, krfbServerPrivate)
KrfbServer * KrfbServer::self() {
return &krfbServerPrivate->instance;
}
KrfbServer::KrfbServer()
:d(new KrfbServerP)
{
kDebug() << "starting ";
d->running = true;
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");
disconnectAndQuit();
};
if (KrfbConfig::publishService()) {
DNSSD::PublicService *service = new DNSSD::PublicService(i18n("%1@%2 (shared desktop)", KUser().loginName(), QHostInfo::localHostName()),"_rfb._tcp",port);
service->publishAsync();
}
while (d->running) {
foreach(const QRect &r, d->fb->modifiedTiles()) {
rfbMarkRectAsModified(screen, r.x(), r.y(), r.right(), r.bottom());
}
rfbProcessEvents(screen, 100);
qApp->processEvents();
}
rfbShutdownServer(screen, true);
// framebuffer has to be deleted before X11 connection goes down
delete d->fb;
d->fb = 0;
emit quitApp();
}
void KrfbServer::enableDesktopControl(bool enable)
{
foreach (QPointer<ConnectionController> ptr, d->controllers) {
if (ptr) {
ptr->setControlEnabled(enable);
}
}
}
void KrfbServer::disconnectAndQuit()
{
d->running = false;
}
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);
void quitApp();
public Q_SLOTS:
void startListening();
void enableDesktopControl(bool);
void disconnectAndQuit();
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