[debian-edu-commits] debian-edu/italc.git (#6) - upstream (branch) updated: upstream/2.0.0-3-gfd5808e
Mike Gabriel
sunweaver at alioth.debian.org
Mon Aug 12 12:44:39 UTC 2013
The branch, upstream has been updated
via fd5808eacfab842c8116692a11caf2868463f82f (commit)
from dc284054e25eafed6499de6851945a7b33609e65 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit fd5808eacfab842c8116692a11caf2868463f82f
Author: Mike Gabriel <mike.gabriel at das-netzwerkteam.de>
Date: Mon Aug 12 12:20:18 2013 +0200
Imported Upstream version 2.0.1
-----------------------------------------------------------------------
Summary of changes:
CMakeLists.txt | 11 +-
README | 4 +-
doc/AutomatedSetupWithIMC.txt | 3 +
iTALC.nsi.in | 4 +-
ica/CMakeLists.txt | 2 +-
ica/ica.rc | 4 +-
ica/ica.rc.in | 4 +-
ica/src/DemoServer.cpp | 110 +-
ica/src/DemoServer.h | 6 +
ica/win32/CMakeLists.txt | 2 +-
ica/win32/ultravnc-italc.cpp | 165 +++
ica/win32/winvnc/vnchooks/VNCHooks.cpp | 2 +-
ica/win32/winvnc/winvnc/helpers.cpp | 1 +
ica/win32/winvnc/winvnc/httpconnect.cpp | 4 +-
ica/win32/winvnc/winvnc/httpconnect.h | 5 +-
ica/win32/winvnc/winvnc/rfbUpdateTracker.h | 2 +-
ica/win32/winvnc/winvnc/security.cpp | 2 +-
ica/win32/winvnc/winvnc/service_motor.cpp | 2 +-
ica/win32/winvnc/winvnc/stdhdrs.h | 8 +-
ica/win32/winvnc/winvnc/vncclient.cpp | 10 +-
ica/win32/winvnc/winvnc/vncdesktop.cpp | 2 +-
ica/win32/winvnc/winvnc/vncdesktopthread.cpp | 2 +-
ica/win32/winvnc/winvnc/vncdesktopthread.h | 14 +-
ica/win32/winvnc/winvnc/vncencodemgr.h | 3 +
ica/win32/winvnc/winvnc/vnclog.cpp | 1 +
ica/win32/winvnc/winvnc/vnclogon.h | 8 +-
ica/win32/winvnc/winvnc/vncmenu.cpp | 2 +
ica/win32/winvnc/winvnc/vncmenu.h | 6 +-
ica/win32/winvnc/winvnc/vncserver.cpp | 96 +-
ica/win32/winvnc/winvnc/vsocket.cpp | 3 +-
ica/win32/winvnc/winvnc/winvnc.cpp | 9 +-
ica/x11/AUTHORS | 17 +-
ica/x11/ChangeLog | 1088 +++++++++++++++++
ica/x11/README | 440 ++++++-
ica/x11/common/lzoconf.h | 6 +-
ica/x11/common/md5.c | 452 +++++++
ica/x11/common/md5.h | 148 +++
ica/x11/common/minilzo.c | 47 +-
ica/x11/common/minilzo.h | 2 +-
ica/x11/common/sha1.c | 411 +++++++
ica/x11/common/sha1.h | 101 ++
ica/x11/common/turbojpeg.c | 854 +++++++++++++
ica/x11/common/turbojpeg.h | 529 +++++++++
ica/x11/common/vncauth.c | 1 +
ica/x11/libvncclient/listen.c | 81 +-
ica/x11/libvncclient/rfbproto.c | 48 +-
ica/x11/libvncclient/sockets.c | 107 +-
ica/x11/libvncclient/tls.h | 2 +-
ica/x11/libvncclient/{tls.c => tls_gnutls.c} | 52 +-
.../cutpaste.c => libvncclient/tls_none.c} | 50 +-
ica/x11/libvncclient/{tls.c => tls_openssl.c} | 498 ++++----
ica/x11/libvncclient/vncviewer.c | 8 +-
ica/x11/libvncserver/auth.c | 34 +-
ica/x11/libvncserver/cargs.c | 48 +
ica/x11/libvncserver/httpd.c | 126 +-
ica/x11/libvncserver/main.c | 40 +-
ica/x11/libvncserver/rfbcrypto.h | 12 +
ica/x11/libvncserver/rfbcrypto_gnutls.c | 50 +
.../{cutpaste.c => rfbcrypto_included.c} | 35 +-
.../{cutpaste.c => rfbcrypto_openssl.c} | 37 +-
ica/x11/libvncserver/rfbcrypto_polarssl.c | 26 +
ica/x11/libvncserver/rfbserver.c | 207 +++-
ica/x11/libvncserver/rfbssl.h | 15 +
ica/x11/libvncserver/rfbssl_gnutls.c | 268 +++++
ica/x11/libvncserver/{cutpaste.c => rfbssl_none.c} | 44 +-
ica/x11/libvncserver/rfbssl_openssl.c | 135 +++
ica/x11/libvncserver/sockets.c | 354 +++++-
ica/x11/libvncserver/stats.c | 1 +
ica/x11/libvncserver/tight.c | 1249 +++++++++++---------
ica/x11/libvncserver/websockets.c | 903 ++++++++++++++
ica/x11/x11vnc/scan.c | 2 +-
ica/x11/x11vnc/screen.c | 24 +-
ima/CMakeLists.txt | 1 +
ima/italc.rc | 4 +-
ima/italc.rc.in | 4 +-
ima/resources/splash.png | Bin 42774 -> 43092 bytes
ima/src/Dialogs.cpp | 5 +-
ima/src/RemoteControlWidget.cpp | 9 +-
imc/CMakeLists.txt | 1 +
imc/Forms/MainWindow.ui | 2 +-
imc/imc.1 | 71 ++
imc/imc.rc | 4 +-
imc/imc.rc.in | 4 +-
imc/src/FileSystemBrowser.cpp | 6 +-
imc/src/ImcCore.cpp | 7 +-
imc/src/ImcCore.h | 2 +
imc/src/MainWindow.cpp | 4 +-
imc/src/MainWindow.h | 5 +-
imc/src/Win32AclEditor.h | 4 +
imc/src/main.cpp | 15 +-
italcconfig.h.in | 1 +
lib/CMakeLists.txt | 2 +
lib/ItalcCore.qrc | 5 +
lib/dialogs/AboutDialog.ui | 2 +-
lib/dialogs/PasswordDialog.ui | 159 ++-
lib/include/AboutDialog.h | 2 +-
lib/include/Configuration/Store.h | 6 +-
lib/include/ItalcCoreConnection.h | 3 +
lib/include/ItalcVncConnection.h | 6 +-
lib/include/PasswordDialog.h | 1 +
lib/include/rfb/rfb.h | 473 ++++++--
lib/include/rfb/rfbclient.h | 314 ++++-
lib/include/rfb/rfbproto.h | 52 +-
lib/resources/ar.qm | Bin 0 -> 64946 bytes
lib/resources/{de.ts => ar.ts} | 878 +++++++-------
lib/resources/dialog-password.png | Bin 0 -> 11197 bytes
lib/resources/he.qm | Bin 0 -> 41891 bytes
lib/resources/{fi.ts => he.ts} | 884 +++++++-------
lib/resources/hu.qm | Bin 0 -> 77521 bytes
lib/resources/{fr.ts => hu.ts} | 869 +++++++-------
lib/resources/manage-with-imc.png | Bin 0 -> 815 bytes
lib/resources/pt_br.qm | Bin 67015 -> 82629 bytes
lib/resources/pt_br.ts | 385 +++---
lib/resources/ru.qm | Bin 45853 -> 77301 bytes
lib/resources/ru.ts | 391 +++---
lib/src/3rdparty/XEventLog.cpp | 4 +-
lib/src/AboutDialog.cpp | 2 +-
lib/src/DecoratedMessageBox.cpp | 4 +-
lib/src/Ipc/QtSlaveLauncher.cpp | 13 +-
lib/src/ItalcCore.cpp | 6 +
lib/src/ItalcCoreConnection.cpp | 2 +
lib/src/ItalcVncConnection.cpp | 53 +-
lib/src/LocalSystem.cpp | 6 +-
lib/src/PasswordDialog.cpp | 11 +
lib/src/SystemKeyTrapper.cpp | 12 +-
125 files changed, 10627 insertions(+), 3116 deletions(-)
create mode 100644 ica/x11/common/md5.c
create mode 100644 ica/x11/common/md5.h
create mode 100644 ica/x11/common/sha1.c
create mode 100644 ica/x11/common/sha1.h
create mode 100644 ica/x11/common/turbojpeg.c
create mode 100644 ica/x11/common/turbojpeg.h
copy ica/x11/libvncclient/{tls.c => tls_gnutls.c} (90%)
copy ica/x11/{libvncserver/cutpaste.c => libvncclient/tls_none.c} (53%)
rename ica/x11/libvncclient/{tls.c => tls_openssl.c} (50%)
create mode 100644 ica/x11/libvncserver/rfbcrypto.h
create mode 100644 ica/x11/libvncserver/rfbcrypto_gnutls.c
copy ica/x11/libvncserver/{cutpaste.c => rfbcrypto_included.c} (53%)
copy ica/x11/libvncserver/{cutpaste.c => rfbcrypto_openssl.c} (54%)
create mode 100644 ica/x11/libvncserver/rfbcrypto_polarssl.c
create mode 100644 ica/x11/libvncserver/rfbssl.h
create mode 100644 ica/x11/libvncserver/rfbssl_gnutls.c
copy ica/x11/libvncserver/{cutpaste.c => rfbssl_none.c} (55%)
create mode 100644 ica/x11/libvncserver/rfbssl_openssl.c
create mode 100644 ica/x11/libvncserver/websockets.c
create mode 100644 imc/imc.1
create mode 100644 lib/resources/ar.qm
copy lib/resources/{de.ts => ar.ts} (53%)
create mode 100644 lib/resources/dialog-password.png
create mode 100644 lib/resources/he.qm
copy lib/resources/{fi.ts => he.ts} (74%)
create mode 100644 lib/resources/hu.qm
copy lib/resources/{fr.ts => hu.ts} (53%)
create mode 100644 lib/resources/manage-with-imc.png
The diff of changes is:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e47f92b..71d86f0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -19,7 +19,7 @@ INCLUDE(Qt4Hacks)
SET(VERSION_MAJOR "2")
SET(VERSION_MINOR "0")
-SET(VERSION_PATCH "0")
+SET(VERSION_PATCH "1")
SET(VERSION_SUFFIX "")
SET(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
IF(VERSION_SUFFIX)
@@ -43,6 +43,7 @@ ENDIF(WIN32)
CHECK_C_SOURCE_COMPILES("static __thread int p = 0; int main() {}" ITALC_HAVE_TLS)
CHECK_INCLUDE_FILES(arpa/inet.h ITALC_HAVE_ARPA_INET_H)
+CHECK_INCLUDE_FILES(unistd.h ITALC_HAVE_UNISTD_H)
CHECK_INCLUDE_FILES(fcntl.h ITALC_HAVE_FCNTL_H)
CHECK_INCLUDE_FILES(limits.h ITALC_HAVE_LIMITS_H)
CHECK_INCLUDE_FILES(memory.h ITALC_HAVE_MEMORY_H)
@@ -135,6 +136,7 @@ IF(ITALC_BUILD_WIN32)
ELSE(ITALC_BUILD_WIN32)
FIND_PACKAGE(OpenSSL REQUIRED)
ENDIF(ITALC_BUILD_WIN32)
+FIND_PACKAGE(PNG)
# find X libraries
IF(NOT ITALC_BUILD_WIN32)
@@ -211,10 +213,13 @@ ENDIF(ITALC_BUILD_WIN32)
ADD_DEFINITIONS(-D'LIB_DIR="${CMAKE_INSTALL_PREFIX}/${LIB_DIR}/"' -D'PLUGIN_DIR="${CMAKE_INSTALL_PREFIX}/${LIB_DIR}/italc/"')
ADD_DEFINITIONS(-DLIBVNCSERVER_HAVE_LIBZ)
ADD_DEFINITIONS(-DLIBVNCSERVER_HAVE_LIBJPEG)
+IF(PNG_FOUND)
+ ADD_DEFINITIONS(-DLIBVNCSERVER_HAVE_LIBPNG)
+ENDIF(PNG_FOUND)
-INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/lib/include ${ZLIB_INCLUDE_DIR} ${JPEG_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR})
+INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/lib/include ${ZLIB_INCLUDE_DIR} ${JPEG_INCLUDE_DIR} ${PNG_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR})
LINK_DIRECTORIES(${CMAKE_INSTALL_PREFIX}/lib ${CMAKE_BINARY_DIR}/lib)
-LINK_LIBRARIES(${QT_LIBRARIES} ${ZLIB_LIBRARIES} ${JPEG_LIBRARIES} ${OPENSSL_LIBRARIES})
+LINK_LIBRARIES(${QT_LIBRARIES} ${ZLIB_LIBRARIES} ${JPEG_LIBRARIES} ${PNG_LIBRARIES} ${OPENSSL_LIBRARIES})
# make sub-directories
ADD_SUBDIRECTORY(lib)
diff --git a/README b/README
index 0523133..25c5e1f 100644
--- a/README
+++ b/README
@@ -1,8 +1,8 @@
-iTALC 2.0.0 - Intelligent Teaching and Learning with Computers
+iTALC 2.0.1 - Intelligent Teaching and Learning with Computers
===============================================================
-Copyright (c) 2004-2011 Tobias Doerffel
+Copyright (c) 2004-2013 Tobias Doerffel
diff --git a/doc/AutomatedSetupWithIMC.txt b/doc/AutomatedSetupWithIMC.txt
index 547b596..d48630e 100644
--- a/doc/AutomatedSetupWithIMC.txt
+++ b/doc/AutomatedSetupWithIMC.txt
@@ -44,6 +44,9 @@ as path delimiter, installation paths etc.
ica -RegisterService
ica -StartService
+ When calling IMC for applying settings and importing the public key you can
+ also pass "-silent" or "-quiet" in order to suppress any message boxes.
+
After running this batch file on a client, the client should be ready for use
with the iTALC network.
diff --git a/iTALC.nsi.in b/iTALC.nsi.in
index f8e3820..00df81d 100644
--- a/iTALC.nsi.in
+++ b/iTALC.nsi.in
@@ -3,7 +3,7 @@
!define COMP_NAME "iTALC Solutions Inc."
!define WEB_SITE "http://italc.sf.net"
!define VERSION "@VERSION@"
-!define COPYRIGHT "© Tobias Doerffel 2004-2011"
+!define COPYRIGHT "© Tobias Doerffel 2004-2013"
!define DESCRIPTION "Intelligent Teaching and Learning with Computers"
!define LICENSE_TXT "@CMAKE_SOURCE_DIR@/COPYING"
!define INSTALLER_NAME "italc-${VERSION}- at MINGW_PLATFORM@-setup.exe"
@@ -156,6 +156,7 @@ File "${DLLDIR}\zlib1.dll"
File "${DLLDIR}\libjpeg-8.dll"
File "${DLLDIR}\libeay32.dll"
File "${DLLDIR}\libssl32.dll"
+File "${DLLDIR}\libpng15-15.dll"
# core components
File "italc-${VERSION}\ica.exe"
File "italc-${VERSION}\vnchooks.dll"
@@ -247,6 +248,7 @@ Delete "$INSTDIR\zlib1.dll"
Delete "$INSTDIR\libjpeg-8.dll"
Delete "$INSTDIR\QtXml4.dll"
Delete "$INSTDIR\libeay32.dll"
+Delete "$INSTDIR\libpng15-15.dll"
Delete "$INSTDIR\QtNetwork4.dll"
Delete "$INSTDIR\QtCore4.dll"
Delete "$INSTDIR\libssl32.dll"
diff --git a/ica/CMakeLists.txt b/ica/CMakeLists.txt
index 9bcdbac..eb3b1d3 100644
--- a/ica/CMakeLists.txt
+++ b/ica/CMakeLists.txt
@@ -77,7 +77,7 @@ IF(ITALC_BUILD_WIN32)
ADD_SUBDIRECTORY(win32)
- ADD_DEFINITIONS(-DX11VNC_IPV6=0 -DPTW32_STATIC_LIB -DTLS=__thread -DX11VNC_USLEEP)
+ ADD_DEFINITIONS(-DX11VNC_IPV6=0 -DPTW32_STATIC_LIB -DTLS=__thread -DX11VNC_USLEEP -D__USE_MINGW_ANSI_STDIO=1)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/win32 ${CMAKE_CURRENT_SOURCE_DIR}/win32/winvnc ${CMAKE_CURRENT_SOURCE_DIR}/win32/winvnc/omnithread ${CMAKE_CURRENT_SOURCE_DIR}/win32/winvnc/winvnc ${CMAKE_CURRENT_SOURCE_DIR}/x11/libvncclient)
SET(platform_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/win32/ultravnc.cpp
diff --git a/ica/ica.rc b/ica/ica.rc
index c07ae70..666a587 100644
--- a/ica/ica.rc
+++ b/ica/ica.rc
@@ -11,7 +11,7 @@ IDR_VNCVIEWER_JAR JAVAARCHIVE "JavaViewer/VncViewer.jar"
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,0,0,0
+ FILEVERSION 2,0,1,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
@@ -26,7 +26,7 @@ BEGIN
VALUE "CompanyName", "iTALC Solutions\0"
VALUE "FileDescription", "iTALC Client Application\0"
VALUE "FileVersion", "\0"
- VALUE "LegalCopyright", "Copyright (c) 2004-2011 Tobias Doerffel\0"
+ VALUE "LegalCopyright", "Copyright (c) 2004-2013 Tobias Doerffel\0"
VALUE "OriginalFilename", "ica.exe\0"
VALUE "ProductName", "iTALC\0"
VALUE "ProductVersion", "\0"
diff --git a/ica/ica.rc.in b/ica/ica.rc.in
index 38f1041..ed9cbae 100644
--- a/ica/ica.rc.in
+++ b/ica/ica.rc.in
@@ -11,7 +11,7 @@ IDR_VNCVIEWER_JAR JAVAARCHIVE "JavaViewer/VncViewer.jar"
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,0,0,0
+ FILEVERSION 2,0,1,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
@@ -26,7 +26,7 @@ BEGIN
VALUE "CompanyName", "iTALC Solutions\0"
VALUE "FileDescription", "iTALC Client Application\0"
VALUE "FileVersion", "@PACKAGE_VERSION@\0"
- VALUE "LegalCopyright", "Copyright (c) 2004-2011 Tobias Doerffel\0"
+ VALUE "LegalCopyright", "Copyright (c) 2004-2013 Tobias Doerffel\0"
VALUE "OriginalFilename", "ica.exe\0"
VALUE "ProductName", "iTALC\0"
VALUE "ProductVersion", "@PACKAGE_VERSION@\0"
diff --git a/ica/src/DemoServer.cpp b/ica/src/DemoServer.cpp
index 0483967..ae50121 100644
--- a/ica/src/DemoServer.cpp
+++ b/ica/src/DemoServer.cpp
@@ -2,7 +2,7 @@
* DemoServer.cpp - multi-threaded slim VNC-server for demo-purposes (optimized
* for lot of clients accessing server in read-only-mode)
*
- * Copyright (c) 2006-2011 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
+ * Copyright (c) 2006-2013 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
*
* This file is part of iTALC - http://italc.sourceforge.net
*
@@ -23,6 +23,8 @@
*
*/
+#define USE_QREGION
+
#include <QtCore/QDateTime>
#include <QtNetwork/QTcpSocket>
#include <QtCore/QTimer>
@@ -31,7 +33,9 @@
#include "DemoServer.h"
#include "ItalcCoreServer.h"
#include "ItalcVncConnection.h"
+#ifndef USE_QREGION
#include "QuadTree.h"
+#endif
#include "RfbLZORLE.h"
#include "RfbItalcCursor.h"
#include "SocketDevice.h"
@@ -211,7 +215,11 @@ DemoServerClient::DemoServerClient( int sock, const ItalcVncConnection *vncConn,
( ( ( LZO1X_1_MEM_COMPRESS ) +
( sizeof( lzo_align_t ) - 1 ) ) /
sizeof( lzo_align_t ) ) ] ),
- m_rawBuf( new QRgb[RAW_MAX_PIXELS] )
+ m_rawBuf( new QRgb[RAW_MAX_PIXELS] ),
+ m_rleBuf( NULL ),
+ m_currentRleBufSize( 0 ),
+ m_lzoOutBuf( NULL ),
+ m_currentLzoOutBufSize( 0 )
{
start();
}
@@ -223,6 +231,15 @@ DemoServerClient::~DemoServerClient()
{
exit();
wait();
+
+ if( m_lzoOutBuf )
+ {
+ delete[] m_lzoOutBuf;
+ }
+ if( m_rleBuf )
+ {
+ delete[] m_rleBuf;
+ }
delete[] m_lzoWorkMem;
delete[] m_rawBuf;
}
@@ -266,17 +283,17 @@ return; // TODO
{
rfbFramebufferUpdate,
0,
- Swap16IfLE( 1 )
+ (uint16_t) Swap16IfLE( 1 )
} ;
m_sock->write( (const char *) &m, sizeof( m ) );
const rfbRectangle rr =
{
- Swap16IfLE( m_lastCursorPos.x() ),
- Swap16IfLE( m_lastCursorPos.y() ),
- Swap16IfLE( 0 ),
- Swap16IfLE( 0 )
+ (uint16_t) Swap16IfLE( m_lastCursorPos.x() ),
+ (uint16_t) Swap16IfLE( m_lastCursorPos.y() ),
+ (uint16_t) Swap16IfLE( 0 ),
+ (uint16_t) Swap16IfLE( 0 )
} ;
const rfbFramebufferUpdateRectHeader rh =
@@ -303,8 +320,8 @@ void DemoServerClient::sendUpdates()
if( m_updatesPending )
{
QTimer::singleShot( 50, this, SLOT( sendUpdates() ) );
- return;
}
+ return;
}
// extract single (non-overlapping) rects out of changed region
@@ -312,6 +329,14 @@ void DemoServerClient::sendUpdates()
// e.g. if we didn't get an update-request for a quite long time
// and there were a lot of updates - at the end we don't send
// more than the whole screen one time
+#ifdef USE_QREGION
+ QRegion region;
+ foreach( const QRect &rect, m_changedRects )
+ {
+ region += rect;
+ }
+ QVector<QRect> r = region.rects();
+#else
QuadTree q( 0, 0, m_vncConn->image().width()-1, m_vncConn->image().height()-1, 4 );
QVector<QuadTreeRect> r;
if( !m_changedRects.isEmpty() )
@@ -319,13 +344,14 @@ void DemoServerClient::sendUpdates()
q.addRects( m_changedRects );
r = q.rects();
}
+#endif
// no we gonna post all changed rects!
const rfbFramebufferUpdateMsg m =
{
rfbFramebufferUpdate,
0,
- Swap16IfLE( r.size() +
+ (uint16_t) Swap16IfLE( r.size() +
( m_cursorShapeChanged ? 1 : 0 ) )
} ;
@@ -333,24 +359,35 @@ void DemoServerClient::sendUpdates()
sd.write( (const char *) &m, sz_rfbFramebufferUpdateMsg );
// process each rect
+#ifdef USE_QREGION
+ for( QVector<QRect>::ConstIterator it = r.begin(); it != r.end(); ++it )
+#else
for( QVector<QuadTreeRect>::const_iterator it = r.begin(); it != r.end(); ++it )
+#endif
{
+#ifdef USE_QREGION
+ const int rx = it->x();
+ const int ry = it->y();
+ const int rw = it->width();
+ const int rh = it->height();
+#else
const int rx = it->x1();
const int ry = it->y1();
const int rw = it->x2()-it->x1()+1;
const int rh = it->y2()-it->y1()+1;
+#endif
const rfbRectangle rr =
{
- Swap16IfLE( rx ),
- Swap16IfLE( ry ),
- Swap16IfLE( rw ),
- Swap16IfLE( rh )
+ (uint16_t) Swap16IfLE( rx ),
+ (uint16_t) Swap16IfLE( ry ),
+ (uint16_t) Swap16IfLE( rw ),
+ (uint16_t) Swap16IfLE( rh )
} ;
const rfbFramebufferUpdateRectHeader rhdr =
{
rr,
- Swap32IfLE( rfbEncodingLZORLE )
+ (uint32_t) Swap32IfLE( rfbEncodingLZORLE )
} ;
sd.write( (const char *) &rhdr, sizeof( rhdr ) );
@@ -365,9 +402,22 @@ void DemoServerClient::sendUpdates()
hdr.compressed = 1;
QRgb last_pix = *( (QRgb *) i.scanLine( ry ) + rx );
+
+ // re-allocate RLE buffer if current one is too small
+ const size_t rleBufSize = rw * rh * sizeof( QRgb )+16;
+ if( rleBufSize > m_currentRleBufSize )
+ {
+ if( m_rleBuf )
+ {
+ delete[] m_rleBuf;
+ }
+ m_rleBuf = new uint8_t[rleBufSize];
+ m_currentRleBufSize = rleBufSize;
+ }
+
uint8_t rle_cnt = 0;
uint8_t rle_sub = 1;
- uint8_t *out = new uint8_t[rw * rh * sizeof( QRgb )+16];
+ uint8_t *out = m_rleBuf;
uint8_t *out_ptr = out;
for( int y = ry; y < ry+rh; ++y )
{
@@ -396,7 +446,19 @@ void DemoServerClient::sendUpdates()
hdr.bytesRLE = out_ptr - out;
lzo_uint bytes_lzo = hdr.bytesRLE + hdr.bytesRLE / 16 + 67;
- uint8_t *comp = new uint8_t[bytes_lzo];
+
+ // re-allocate LZO output buffer if current one is too small
+ if( bytes_lzo > m_currentLzoOutBufSize )
+ {
+ if( m_lzoOutBuf )
+ {
+ delete[] m_lzoOutBuf;
+ }
+ m_lzoOutBuf = new uint8_t[bytes_lzo];
+ m_currentLzoOutBufSize = bytes_lzo;
+ }
+
+ uint8_t *comp = m_lzoOutBuf;
lzo1x_1_compress( (const unsigned char *) out, (lzo_uint) hdr.bytesRLE,
(unsigned char *) comp,
&bytes_lzo, m_lzoWorkMem );
@@ -405,8 +467,6 @@ void DemoServerClient::sendUpdates()
sd.write( (const char *) &hdr, sizeof( hdr ) );
sd.write( (const char *) comp, Swap32IfLE( hdr.bytesLZO ) );
- delete[] out;
- delete[] comp;
}
else
@@ -444,16 +504,16 @@ void DemoServerClient::sendUpdates()
const QImage cur = m_cursorShape;
const rfbRectangle rr =
{
- Swap16IfLE( m_cursorHotX ),
- Swap16IfLE( m_cursorHotY ),
- Swap16IfLE( cur.width() ),
- Swap16IfLE( cur.height() )
+ (uint16_t) Swap16IfLE( m_cursorHotX ),
+ (uint16_t) Swap16IfLE( m_cursorHotY ),
+ (uint16_t) Swap16IfLE( cur.width() ),
+ (uint16_t) Swap16IfLE( cur.height() )
} ;
const rfbFramebufferUpdateRectHeader rh =
{
rr,
- Swap32IfLE( rfbEncodingItalcCursor )
+ (uint32_t) Swap32IfLE( rfbEncodingItalcCursor )
} ;
sd.write( (const char *) &rh, sizeof( rh ) );
@@ -639,7 +699,7 @@ void DemoServerClient::run()
connect( m_sock, SIGNAL( readyRead() ),
this, SLOT( processClient() ), Qt::DirectConnection );
connect( m_sock, SIGNAL( disconnected() ),
- this, SLOT( deleteLater() ) );
+ this, SLOT( quit() ) );
// TODO
/* QTimer t;
@@ -654,6 +714,8 @@ void DemoServerClient::run()
// now run our own event-loop for optimal scheduling
exec();
+
+ deleteLater();
}
diff --git a/ica/src/DemoServer.h b/ica/src/DemoServer.h
index e911211..848401f 100644
--- a/ica/src/DemoServer.h
+++ b/ica/src/DemoServer.h
@@ -136,6 +136,12 @@ private:
char *m_lzoWorkMem;
QRgb *m_rawBuf;
+ uint8_t *m_rleBuf;
+ size_t m_currentRleBufSize;
+
+ uint8_t *m_lzoOutBuf;
+ size_t m_currentLzoOutBufSize;
+
} ;
diff --git a/ica/win32/CMakeLists.txt b/ica/win32/CMakeLists.txt
index 6064ddb..f05e338 100644
--- a/ica/win32/CMakeLists.txt
+++ b/ica/win32/CMakeLists.txt
@@ -18,7 +18,7 @@ ADD_LIBRARY(vnchooks MODULE
SET_TARGET_PROPERTIES(vnchooks PROPERTIES PREFIX "")
-ADD_DEFINITIONS(-DAUTHSSP_EXPORTS -DULTRAVNC_ITALC_SUPPORT)
+ADD_DEFINITIONS(-DAUTHSSP_EXPORTS -DULTRAVNC_ITALC_SUPPORT -D__USE_MINGW_ANSI_STDIO=1)
SET(AUTHSSP_WINRC "${CMAKE_CURRENT_BINARY_DIR}/authssprc.obj")
ADD_CUSTOM_COMMAND(OUTPUT ${AUTHSSP_WINRC}
COMMAND ${WINDRES}
diff --git a/ica/win32/ultravnc-italc.cpp b/ica/win32/ultravnc-italc.cpp
index 4538733..5da1bf5 100644
--- a/ica/win32/ultravnc-italc.cpp
+++ b/ica/win32/ultravnc-italc.cpp
@@ -110,3 +110,168 @@ BOOL ultravnc_italc_ask_permission( const char *username, const char *host )
}
+
+/*
+ * MSVCRT string functions
+ *
+ * Copyright 1996,1998 Marcus Meissner
+ * Copyright 1996 Jukka Iivonen
+ * Copyright 1997,2000 Uwe Bonnes
+ * Copyright 2000 Jon Griffiths
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+
+#define CHECK_PMT(x) (x)
+#define SIZE_T_MAX ((size_t)-1)
+
+
+errno_t strcat_s( char* dst, size_t elem, const char* src )
+{
+ size_t i, j;
+ if(!dst) return EINVAL;
+ if(elem == 0) return EINVAL;
+ if(!src)
+ {
+ dst[0] = '\0';
+ return EINVAL;
+ }
+
+ for(i = 0; i < elem; i++)
+ {
+ if(dst[i] == '\0')
+ {
+ for(j = 0; (j + i) < elem; j++)
+ {
+ if((dst[j + i] = src[j]) == '\0') return 0;
+ }
+ }
+ }
+ /* Set the first element to 0, not the first element after the skipped part */
+ dst[0] = '\0';
+ return ERANGE;
+}
+
+errno_t strncat_s( char* dst, size_t elem, const char* src, size_t count )
+{
+ size_t i, j;
+ if(!CHECK_PMT(dst != 0) || !CHECK_PMT(elem != 0))
+ return EINVAL;
+ if(!CHECK_PMT(src != 0))
+ {
+ dst[0] = '\0';
+ return EINVAL;
+ }
+
+ for(i = 0; i < elem; i++)
+ {
+ if(dst[i] == '\0')
+ {
+ for(j = 0; (j + i) < elem; j++)
+ {
+ if(count == SIZE_T_MAX && j + i == elem - 1)
+ {
+ dst[j + i] = '\0';
+ return STRUNCATE;
+ }
+ if(j == count || (dst[j + i] = src[j]) == '\0')
+ {
+ dst[j + i] = '\0';
+ return 0;
+ }
+ }
+ }
+ }
+ /* Set the first element to 0, not the first element after the skipped part */
+ dst[0] = '\0';
+ return ERANGE;
+}
+
+
+errno_t strcpy_s(char* dst, size_t elem, const char* src)
+{
+ size_t i;
+ if(!elem) return EINVAL;
+ if(!dst) return EINVAL;
+ if(!src)
+ {
+ dst[0] = '\0';
+ return EINVAL;
+ }
+
+ for(i = 0; i < elem; i++)
+ {
+ if((dst[i] = src[i]) == '\0') return 0;
+ }
+ dst[0] = '\0';
+ return ERANGE;
+}
+
+
+
+/*
+ * msvcrt.dll heap functions
+ *
+ * Copyright 2000 Jon Griffiths
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ * Note: Win32 heap operations are MT safe. We only lock the new
+ * handler and non atomic heap operations
+ */
+
+
+errno_t strncpy_s(char* dst, size_t numberOfElements, const char* src, size_t count)
+{
+ size_t i, end;
+
+ if(!count)
+ return 0;
+
+ if (!CHECK_PMT(dst != NULL) || !CHECK_PMT(src != NULL) || !CHECK_PMT(numberOfElements != 0)) {
+ *_errno() = EINVAL;
+ return EINVAL;
+ }
+
+ if(count!=SIZE_T_MAX && count<numberOfElements)
+ end = count;
+ else
+ end = numberOfElements-1;
+
+ for(i=0; i<end && src[i]; i++)
+ dst[i] = src[i];
+
+ if(!src[i] || end==count || count==SIZE_T_MAX) {
+ dst[i] = '\0';
+ return 0;
+ }
+
+ dst[0] = '\0';
+ *_errno() = EINVAL;
+ return EINVAL;
+}
diff --git a/ica/win32/winvnc/vnchooks/VNCHooks.cpp b/ica/win32/winvnc/vnchooks/VNCHooks.cpp
index 0215be1..abbd363 100644
--- a/ica/win32/winvnc/vnchooks/VNCHooks.cpp
+++ b/ica/win32/winvnc/vnchooks/VNCHooks.cpp
@@ -118,7 +118,7 @@ BOOL InitInstance();
BOOL ExitInstance();
// The DLL's main procedure
-BOOL WINAPI DllMain (HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
+extern "C" BOOL WINAPI DllMain (HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
// Find out why we're being called
switch (ul_reason_for_call)
diff --git a/ica/win32/winvnc/winvnc/helpers.cpp b/ica/win32/winvnc/winvnc/helpers.cpp
index 1be0219..a705ccc 100644
--- a/ica/win32/winvnc/winvnc/helpers.cpp
+++ b/ica/win32/winvnc/winvnc/helpers.cpp
@@ -561,6 +561,7 @@ bool GetServiceName(TCHAR *pszAppPath, TCHAR *pszServiceName)
make_upper(servicePath);
if (servicePath.find(appPath.c_str()) != (size_t) -1)
{
+ bResult = true;
strncpy(pszServiceName, pServices[i].lpServiceName, 256);
pszServiceName[255] = 0;
}
diff --git a/ica/win32/winvnc/winvnc/httpconnect.cpp b/ica/win32/winvnc/winvnc/httpconnect.cpp
index 23d6891..92db4f2 100644
--- a/ica/win32/winvnc/winvnc/httpconnect.cpp
+++ b/ica/win32/winvnc/winvnc/httpconnect.cpp
@@ -1340,13 +1340,13 @@ retry:
/* make connection */
if ( relay_method == METHOD_DIRECT ) {
remote = open_connection (dest_host, dest_port);
- if ( remote == SOCKET_ERROR )
+ if ( (errno_t) remote == SOCKET_ERROR )
{
return 0;
}
} else {
remote = open_connection (relay_host, relay_port);
- if ( remote == SOCKET_ERROR )
+ if ( (errno_t) remote == SOCKET_ERROR )
{
return 0;
}
diff --git a/ica/win32/winvnc/winvnc/httpconnect.h b/ica/win32/winvnc/winvnc/httpconnect.h
index 325a7ef..a4df941 100644
--- a/ica/win32/winvnc/winvnc/httpconnect.h
+++ b/ica/win32/winvnc/winvnc/httpconnect.h
@@ -118,7 +118,10 @@
#define socket_errno() WSAGetLastError()
#define popen _popen
+#ifndef ECONNRESET
#define ECONNRESET WSAECONNRESET
+#endif
+
#define MAX_DIRECT_ADDR_LIST 256
#define PUT_BYTE(ptr,data) (*(unsigned char*)ptr = data)
@@ -224,4 +227,4 @@ public:
char *socks5_auth;
struct ADDRPAIR direct_addr_list[MAX_DIRECT_ADDR_LIST];
int n_direct_addr_list;
-};
\ No newline at end of file
+};
diff --git a/ica/win32/winvnc/winvnc/rfbUpdateTracker.h b/ica/win32/winvnc/winvnc/rfbUpdateTracker.h
index b1f73f7..f292820 100644
--- a/ica/win32/winvnc/winvnc/rfbUpdateTracker.h
+++ b/ica/win32/winvnc/winvnc/rfbUpdateTracker.h
@@ -54,7 +54,7 @@ namespace rfb {
const Region2D &cliprgn_) : child(child_), cliprgn(cliprgn_) {};
virtual ~ClippedUpdateTracker() {};
- virtual void set_clip_region(const Region2D cliprgn_) {cliprgn = cliprgn_;};
+ virtual void set_clip_region(const Region2D &cliprgn_) {cliprgn = cliprgn_;};
virtual void add_changed(const Region2D ®ion);
virtual void add_cached(const Region2D ®ion);
diff --git a/ica/win32/winvnc/winvnc/security.cpp b/ica/win32/winvnc/winvnc/security.cpp
index 05884b9..e014df6 100644
--- a/ica/win32/winvnc/winvnc/security.cpp
+++ b/ica/win32/winvnc/winvnc/security.cpp
@@ -95,7 +95,7 @@ bool RunningAsAdministrator ()
ON_BLOCK_EXIT(CloseHandle, process);
ON_BLOCK_EXIT(CloseHandle, Token);
- SID_IDENTIFIER_AUTHORITY SystemSidAuthority= SECURITY_NT_AUTHORITY;
+ SID_IDENTIFIER_AUTHORITY SystemSidAuthority= { SECURITY_NT_AUTHORITY };
// Then we must query the size of the group information associated with
// the token. Note that we expect a FALSE result from GetTokenInformation
diff --git a/ica/win32/winvnc/winvnc/service_motor.cpp b/ica/win32/winvnc/winvnc/service_motor.cpp
index 8612bd4..3e5b417 100644
--- a/ica/win32/winvnc/winvnc/service_motor.cpp
+++ b/ica/win32/winvnc/winvnc/service_motor.cpp
@@ -540,7 +540,7 @@ void Reboot_with_force_reboot_elevated()
GetModuleFileName(0, exe_file_name, MAX_PATH);
SHELLEXECUTEINFO shExecInfo;
shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
- shExecInfo.fMask = NULL;
+ shExecInfo.fMask = 0;
shExecInfo.hwnd = GetForegroundWindow();
shExecInfo.lpVerb = "runas";
shExecInfo.lpFile = exe_file_name;
diff --git a/ica/win32/winvnc/winvnc/stdhdrs.h b/ica/win32/winvnc/winvnc/stdhdrs.h
index 4e0efab..5ca8be9 100644
--- a/ica/win32/winvnc/winvnc/stdhdrs.h
+++ b/ica/win32/winvnc/winvnc/stdhdrs.h
@@ -77,10 +77,10 @@ extern VNCLog vnclog;
// Log everything, including internal table setup, etc.
#define LL_ALL 10
-#define strcat_s(dst,num,src) strncat(dst,src,num)
-#define strncat_s(a,b,c,d) strncat(a,c,b)
-#define strcpy_s(dst,num,src) strncpy(dst,src,num)
-#define strncpy_s(dst,num,src,x) strncpy(dst,src,num)
+errno_t strcat_s(char* dst, size_t size, const char* src);
+errno_t strncat_s(char* dst, size_t size, const char* src, size_t n);
+errno_t strcpy_s(char* dst, size_t size, const char* src);
+errno_t strncpy_s(char* dst, size_t size, const char* src, size_t n);
#define KEEPALIVE_HEADROOM 1
#define KEEPALIVE_INTERVAL 5
diff --git a/ica/win32/winvnc/winvnc/vncclient.cpp b/ica/win32/winvnc/winvnc/vncclient.cpp
index 5f1aa58..b4302f6 100644
--- a/ica/win32/winvnc/winvnc/vncclient.cpp
+++ b/ica/win32/winvnc/winvnc/vncclient.cpp
@@ -4655,7 +4655,7 @@ vncClient::SendUpdate(rfb::SimpleUpdateTracker &update)
rfb::RectVector::const_iterator i;
if (updates!= 0xFFFF)
{
- for ( i=update_info.changed.begin(); i != update_info.changed.end(); i++)
+ for ( i=update_info.changed.begin(); i != update_info.changed.end(); ++i)
{
// Tight specific (lastrect)
numsubrects = m_encodemgr.GetNumCodedRects(*i);
@@ -4674,7 +4674,7 @@ vncClient::SendUpdate(rfb::SimpleUpdateTracker &update)
// We need to send the cache as a normal update
if (!m_encodemgr.IsCacheEnabled() && updates!= 0xFFFF)
{
- for (i=update_info.cached.begin(); i != update_info.cached.end(); i++)
+ for (i=update_info.cached.begin(); i != update_info.cached.end(); ++i)
{
// Tight specific (lastrect)
numsubrects = m_encodemgr.GetNumCodedRects(*i);
@@ -4784,7 +4784,7 @@ vncClient::SendRectangles(const rfb::RectVector &rects)
// Work through the list of rectangles, sending each one
- for (i=rects.begin();i!=rects.end();i++) {
+ for (i=rects.begin();i!=rects.end();++i) {
if (m_encodemgr.ultra2_encoder_in_use)
{
//We want smaller rect, so data can be send and decoded while handling next update
@@ -5063,7 +5063,7 @@ vncClient::SendCacheRectangles(const rfb::RectVector &rects)
vnclog.Print(LL_INTINFO, VNCLOG("******** Sending %d Cache Rects \r\n"), rects.size());
// Work through the list of rectangles, sending each one
- for (i= rects.begin();i != rects.end();i++)
+ for (i= rects.begin();i != rects.end();++i)
{
if (!SendCacheRect(*i))
return FALSE;
@@ -5183,7 +5183,7 @@ BOOL vncClient::SendCacheZip(const rfb::RectVector &rects)
rfbRectangle theRect;
rfb::RectVector::const_iterator i;
BYTE* p = m_pRawCacheZipBuf;
- for (i = rects.begin();i != rects.end();i++)
+ for (i = rects.begin();i != rects.end();++i)
{
theRect.x = Swap16IfLE(((*i).tl.x - m_SWOffsetx) / m_nScale );
theRect.y = Swap16IfLE(((*i).tl.y - m_SWOffsety) / m_nScale);
diff --git a/ica/win32/winvnc/winvnc/vncdesktop.cpp b/ica/win32/winvnc/winvnc/vncdesktop.cpp
index 62d1dba..1c9e5f8 100644
--- a/ica/win32/winvnc/winvnc/vncdesktop.cpp
+++ b/ica/win32/winvnc/winvnc/vncdesktop.cpp
@@ -921,7 +921,7 @@ vncDesktop::InitBitmap()
if (VideoBuffer())
{
pEnumDisplayDevices pd=NULL;
- LPSTR driverName = "mv video hook driver2";
+ const CHAR driverName[] = "mv video hook driver2";
BOOL DriverFound;
DEVMODE devmode;
FillMemory(&devmode, sizeof(DEVMODE), 0);
diff --git a/ica/win32/winvnc/winvnc/vncdesktopthread.cpp b/ica/win32/winvnc/winvnc/vncdesktopthread.cpp
index 5fb2251..6d7d4fa 100644
--- a/ica/win32/winvnc/winvnc/vncdesktopthread.cpp
+++ b/ica/win32/winvnc/winvnc/vncdesktopthread.cpp
@@ -205,7 +205,7 @@ vncDesktopThread::handle_driver_changes(rfb::Region2D &rgncache,rfb::UpdateTrack
rfb::RectVector rects;
rfb::RectVector::iterator i;
rgncache.get_rects(rects, 1, 1);
- for (i = rects.begin(); i != rects.end(); i++)
+ for (i = rects.begin(); i != rects.end(); ++i)
{
rfb::Rect rect = *i;
rect.tl.x=rect.tl.x/32*32;
diff --git a/ica/win32/winvnc/winvnc/vncdesktopthread.h b/ica/win32/winvnc/winvnc/vncdesktopthread.h
index a6e674e..a71aae1 100644
--- a/ica/win32/winvnc/winvnc/vncdesktopthread.h
+++ b/ica/win32/winvnc/winvnc/vncdesktopthread.h
@@ -55,6 +55,16 @@ class vncDesktopThread : public omni_thread
{
public:
vncDesktopThread() {
+ /* BEGIN: Tobias Doerffel, 2011/11 */
+ capture = false;
+ first_run = false;
+ initialupdate = false;
+ XRichCursorEnabled = false;
+ m_screen_moved = false;
+ m_desktop = NULL;
+ m_server = NULL;
+ /* END: Tobias Doerffel, 2011/11 */
+
m_returnsig = NULL;
user32 = LoadLibrary("user32.dll");
MyGetCursorInfo=NULL;
@@ -110,7 +120,7 @@ protected:
DWORD m_return;
BOOL m_returnset;
bool m_screen_moved;
- bool lastsend;
+ //bool lastsend;
HMODULE user32;
_GetCursorInfo MyGetCursorInfo;
bool XRichCursorEnabled;
@@ -129,4 +139,4 @@ protected:
bool initialupdate;
};
-#endif
\ No newline at end of file
+#endif
diff --git a/ica/win32/winvnc/winvnc/vncencodemgr.h b/ica/win32/winvnc/winvnc/vncencodemgr.h
index f86a1ad..01b3692 100644
--- a/ica/win32/winvnc/winvnc/vncencodemgr.h
+++ b/ica/win32/winvnc/winvnc/vncencodemgr.h
@@ -185,6 +185,9 @@ public:
inline vncEncodeMgr::vncEncodeMgr()
{
+ m_encoding = rfbEncodingRaw;
+ m_transfunc = NULL;
+
zrleEncoder=NULL;
m_encoder = NULL;
m_buffer=NULL;
diff --git a/ica/win32/winvnc/winvnc/vnclog.cpp b/ica/win32/winvnc/winvnc/vnclog.cpp
index ba744d0..6381592 100644
--- a/ica/win32/winvnc/winvnc/vnclog.cpp
+++ b/ica/win32/winvnc/winvnc/vnclog.cpp
@@ -50,6 +50,7 @@ VNCLog::VNCLog()
, m_lastLogTime(0)
{
strcpy(m_filename,"");
+ m_path[0] = 0;
}
void VNCLog::SetMode(int mode)
diff --git a/ica/win32/winvnc/winvnc/vnclogon.h b/ica/win32/winvnc/winvnc/vnclogon.h
index 14e8384..f689b42 100644
--- a/ica/win32/winvnc/winvnc/vnclogon.h
+++ b/ica/win32/winvnc/winvnc/vnclogon.h
@@ -5,7 +5,11 @@
class vncLogonThread : public omni_thread
{
public:
- vncLogonThread() {m_returnsig = NULL;};
+ vncLogonThread() {
+ m_returnsig = NULL;
+ m_desktop = NULL;
+ x1 = x2 = y1 = y2 = 0;
+ }
~vncLogonThread() {if (m_returnsig != NULL) delete m_returnsig;};
public:
virtual BOOL Init(vncDesktop *desktop);
@@ -22,4 +26,4 @@ protected:
static BOOL CALLBACK LogonDlgProc(HWND hDlg,UINT Message,WPARAM wParam,LPARAM lParam);
int CreateLogonWindow(HINSTANCE hInstance);
};
-#endif
\ No newline at end of file
+#endif
diff --git a/ica/win32/winvnc/winvnc/vncmenu.cpp b/ica/win32/winvnc/winvnc/vncmenu.cpp
index ce03791..5dfe533 100644
--- a/ica/win32/winvnc/winvnc/vncmenu.cpp
+++ b/ica/win32/winvnc/winvnc/vncmenu.cpp
@@ -519,6 +519,7 @@ vncMenu::~vncMenu()
void
vncMenu::AddTrayIcon()
{
+ return;
//vnclog.Print(LL_INTERR, VNCLOG("########### vncMenu::AddTrayIcon \n"));
vnclog.Print(LL_INTERR, VNCLOG("########### vncMenu::AddTrayIcon - UserName = %s\n"), m_username);
@@ -574,6 +575,7 @@ vncMenu::AddTrayIcon()
void
vncMenu::DelTrayIcon()
{
+ return;
//vnclog.Print(LL_INTERR, VNCLOG("########### vncMenu::DelTrayIcon - DEL Tray Icon call\n"));
SendTrayMsg(NIM_DELETE, FALSE);
}
diff --git a/ica/win32/winvnc/winvnc/vncmenu.h b/ica/win32/winvnc/winvnc/vncmenu.h
index 88b79da..d99b7dd 100644
--- a/ica/win32/winvnc/winvnc/vncmenu.h
+++ b/ica/win32/winvnc/winvnc/vncmenu.h
@@ -51,8 +51,8 @@ extern const UINT MENU_TRAYICON_BALLOON_MSG;
extern const char *MENU_CLASS_NAME;
// WTS Stuff for FastUserSwitching management
-typedef BOOL (WINAPI *WTSREGISTERSESSIONNOTIFICATION)(HWND, DWORD);
-typedef BOOL (WINAPI *WTSUNREGISTERSESSIONNOTIFICATION)(HWND);
+//typedef BOOL (WINAPI *WTSREGISTERSESSIONNOTIFICATION)(HWND, DWORD);
+//typedef BOOL (WINAPI *WTSUNREGISTERSESSIONNOTIFICATION)(HWND);
#define WM_WTSSESSION_CHANGE 0x02B1
#define WTS_CONSOLE_CONNECT 0x1
#define WTS_CONSOLE_DISCONNECT 0x2
@@ -137,4 +137,4 @@ protected:
};
-#endif
\ No newline at end of file
+#endif
diff --git a/ica/win32/winvnc/winvnc/vncserver.cpp b/ica/win32/winvnc/winvnc/vncserver.cpp
index 1b9009b..74e05f6 100644
--- a/ica/win32/winvnc/winvnc/vncserver.cpp
+++ b/ica/win32/winvnc/winvnc/vncserver.cpp
@@ -64,7 +64,7 @@ vncServer::ServerUpdateTracker::add_changed(const rfb::Region2D &rgn) {
omni_mutex_lock l(m_server->m_clientsLock);
// Post this update to all the connected clients
- for (i = m_server->m_authClients.begin(); i != m_server->m_authClients.end(); i++)
+ for (i = m_server->m_authClients.begin(); i != m_server->m_authClients.end(); ++i)
{
// Post the update
// REalVNC 336 change
@@ -83,7 +83,7 @@ vncServer::ServerUpdateTracker::add_cached(const rfb::Region2D &rgn) {
omni_mutex_lock l(m_server->m_clientsLock);
// Post this update to all the connected clients
- for (i = m_server->m_authClients.begin(); i != m_server->m_authClients.end(); i++)
+ for (i = m_server->m_authClients.begin(); i != m_server->m_authClients.end(); ++i)
{
// Post the update
// RealVNC 336 change
@@ -105,7 +105,7 @@ vncServer::ServerUpdateTracker::add_copied(const rfb::Region2D &dest, const rfb:
omni_mutex_lock l(m_server->m_clientsLock);
// Post this update to all the connected clients
- for (i = m_server->m_authClients.begin(); i != m_server->m_authClients.end(); i++)
+ for (i = m_server->m_authClients.begin(); i != m_server->m_authClients.end(); ++i)
{
// Post the update
// RealVNC 336 change
@@ -544,7 +544,7 @@ vncClientId vncServer::AddClient(VSocket *socket,
char szInfo[256];
strcpy(szInfo, "Waiting for connection... ");
- for (i = m_unauthClients.begin(); i != m_unauthClients.end(); i++)
+ for (i = m_unauthClients.begin(); i != m_unauthClients.end(); ++i)
{
@@ -622,7 +622,7 @@ vncServer::Authenticated(vncClientId clientid)
vncClient *client = NULL;
// Search the unauthenticated client list
- for (i = m_unauthClients.begin(); i != m_unauthClients.end(); i++)
+ for (i = m_unauthClients.begin(); i != m_unauthClients.end(); ++i)
{
// Is this the right client?
if ((*i) == clientid)
@@ -706,7 +706,7 @@ vncServer::KillClient(vncClientId clientid)
omni_mutex_lock l(m_clientsLock);
// Find the client in one of the two lists
- for (i = m_unauthClients.begin(); i != m_unauthClients.end(); i++)
+ for (i = m_unauthClients.begin(); i != m_unauthClients.end(); ++i)
{
// Is this the right client?
if ((*i) == clientid)
@@ -723,7 +723,7 @@ vncServer::KillClient(vncClientId clientid)
}
if (!done)
{
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// Is this the right client?
if ((*i) == clientid)
@@ -752,7 +752,7 @@ void vncServer::KillClient(LPSTR szClientName)
omni_mutex_lock l(m_clientsLock);
vncClient *pClient = NULL;
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
pClient = GetClient(*i);
if (!_stricmp(pClient->GetClientName(), szClientName))
@@ -774,7 +774,7 @@ void vncServer::TextChatClient(LPSTR szClientName)
omni_mutex_lock l(m_clientsLock);
vncClient *pClient = NULL;
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
pClient = GetClient(*i);
if (!_stricmp(pClient->GetClientName(), szClientName))
@@ -804,7 +804,7 @@ bool vncServer::IsUltraVncViewer()
vncClientList::iterator i;
omni_mutex_lock l(m_clientsLock);
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
if (GetClient(*i)->IsUltraViewer())return true;
}
@@ -816,7 +816,7 @@ bool vncServer::AreThereMultipleViewers()
vncClientList::iterator i;
omni_mutex_lock l(m_clientsLock);
int a=0;
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
a++;
}
@@ -832,7 +832,7 @@ vncServer::KillAuthClients()
omni_mutex_lock l(m_clientsLock);
// Tell all the authorised clients to die!
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
vnclog.Print(LL_INTINFO, VNCLOG("killing auth client\n"));
@@ -852,7 +852,7 @@ void vncServer::ListAuthClients(HWND hListBox)
vncClientList::iterator i;
omni_mutex_lock l(m_clientsLock);
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// adzm 2009-07-05
vncClient* client = GetClient(*i);
@@ -882,7 +882,7 @@ void vncServer::ListUnauthClients(HWND hListBox)
vncClientList::iterator i;
omni_mutex_lock l(m_clientsLock);
- for (i = m_unauthClients.begin(); i != m_unauthClients.end(); i++)
+ for (i = m_unauthClients.begin(); i != m_unauthClients.end(); ++i)
{
// adzm 2009-07-05
vncClient* client = GetClient(*i);
@@ -929,7 +929,7 @@ bool vncServer::IsThereASlowClient()
bool fFound = false;
omni_mutex_lock l(m_clientsLock);
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
if (GetClient(*i)->IsSlowEncoding())
{
@@ -952,7 +952,7 @@ bool vncServer::IsThereAUltraEncodingClient()
vncClientList::iterator i;
omni_mutex_lock l(m_clientsLock);
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
if (GetClient(*i)->IsUltraEncoding())
{
@@ -967,7 +967,7 @@ bool vncServer::IsThereFileTransBusy()
vncClientList::iterator i;
omni_mutex_lock l(m_clientsLock);
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
if (GetClient(*i)->IsFileTransBusy())
{
@@ -985,7 +985,7 @@ vncServer::KillUnauthClients()
omni_mutex_lock l(m_clientsLock);
// Tell all the authorised clients to die!
- for (i = m_unauthClients.begin(); i != m_unauthClients.end(); i++)
+ for (i = m_unauthClients.begin(); i != m_unauthClients.end(); ++i)
{
vnclog.Print(LL_INTINFO, VNCLOG("killing unauth client\n"));
@@ -1020,7 +1020,7 @@ vncServer::UpdateWanted()
omni_mutex_lock l(m_clientsLock);
// Iterate over the authorised clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
if (GetClient(*i)->UpdateWanted())
return TRUE;
@@ -1036,7 +1036,7 @@ vncServer::RemoteEventReceived()
omni_mutex_lock l(m_clientsLock);
// Iterate over the authorised clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
result = result || GetClient(*i)->RemoteEventReceived();
}
@@ -1154,7 +1154,7 @@ vncServer::RemoveClient(vncClientId clientid)
{ omni_mutex_lock l2(m_clientsLock);
// Find the client in one of the two lists
- for (i = m_unauthClients.begin(); i != m_unauthClients.end(); i++)
+ for (i = m_unauthClients.begin(); i != m_unauthClients.end(); ++i)
{
// Is this the right client?
if ((*i) == clientid)
@@ -1170,7 +1170,7 @@ vncServer::RemoveClient(vncClientId clientid)
}
if (!done)
{
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// Is this the right client?
if ((*i) == clientid)
@@ -1253,7 +1253,7 @@ vncServer::RemNotify(HWND hwnd)
// Remove the window handle from the list
vncNotifyList::iterator i;
- for (i=m_notifyList.begin(); i!=m_notifyList.end(); i++)
+ for (i=m_notifyList.begin(); i!=m_notifyList.end(); ++i)
{
if ((*i) == hwnd)
{
@@ -1274,7 +1274,7 @@ vncServer::DoNotify(UINT message, WPARAM wparam, LPARAM lparam)
// Send the given message to all the notification windows
vncNotifyList::iterator i;
- for (i=m_notifyList.begin(); i!=m_notifyList.end(); i++)
+ for (i=m_notifyList.begin(); i!=m_notifyList.end(); ++i)
{
PostMessage((*i), message, wparam, lparam);
}
@@ -1288,7 +1288,7 @@ vncServer::UpdateMouse()
omni_mutex_lock l(m_clientsLock);
// Post this mouse update to all the connected clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// Post the update
GetClient(*i)->UpdateMouse();
@@ -1305,7 +1305,7 @@ vncServer::UpdateClipText(const char* text)
omni_mutex_lock l(m_clientsLock);
// Post this update to all the connected clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// Post the update
GetClient(*i)->UpdateClipText(text);
@@ -1325,7 +1325,7 @@ vncServer::UpdateClipTextEx(HWND hwndOwner, vncClient* excludeClient)
omni_mutex_lock l(m_clientsLock);
// Post this update to all the connected clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// Post the update
vncClient* client = GetClient(*i);
@@ -1344,7 +1344,7 @@ vncServer::UpdateCursorShape()
omni_mutex_lock l(m_clientsLock);
// Post this update to all the connected clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// Post the update
GetClient(*i)->UpdateCursorShape();
@@ -1359,7 +1359,7 @@ vncServer::UpdatePalette(bool lock)
omni_mutex_lock l(m_clientsLock);
// Post this update to all the connected clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// Post the update
GetClient(*i)->UpdatePalette(lock);
@@ -1374,7 +1374,7 @@ vncServer::UpdateLocalFormat(bool lock)
omni_mutex_lock l(m_clientsLock);
// Post this update to all the connected clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// Post the update
GetClient(*i)->UpdateLocalFormat(lock);
@@ -1412,7 +1412,7 @@ vncServer::UpdateLocalClipTextEx(ExtendedClipboardDataMessage& extendedClipboard
omni_mutex_lock l(m_clientsLock);
// Post this update to all the connected clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// Post the update
vncClient* client = GetClient(*i);
@@ -1519,7 +1519,7 @@ vncServer::EnableRemoteInputs(BOOL enable)
omni_mutex_lock l(m_clientsLock);
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
GetClient(*i)->EnableKeyboard(m_enable_remote_inputs);
GetClient(*i)->EnablePointer(m_enable_remote_inputs);
@@ -1556,7 +1556,7 @@ vncServer::EnableJapInput(BOOL enable)
omni_mutex_lock l(m_clientsLock);
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
GetClient(*i)->EnableJap(m_enable_jap_input ? true : false);
}
@@ -1584,7 +1584,7 @@ BOOL
vncServer::SockConnect(BOOL On)
{
// Are we being asked to switch socket connects on or off?
- vnclog.Print(20, VNCLOG("SockConnect %d\n"), On);
+ vnclog.Print(LL_SOCKINFO, VNCLOG("SockConnect %d\n"), On);
if (On)
{
// Is there a listening socket?
@@ -1643,7 +1643,7 @@ vncServer::SockConnect(BOOL On)
// Now let's start the HTTP connection stuff
EnableHTTPConnect(m_enableHttpConn);
EnableXDMCPConnect(m_enableXdmcpConn);
- vnclog.Print(20, VNCLOG("SockConnect Done %d\n"), On);
+ vnclog.Print(LL_SOCKINFO, VNCLOG("SockConnect Done %d\n"), On);
}
}
else
@@ -2190,7 +2190,7 @@ vncServer::SetNewSWSize(long w,long h,BOOL desktop)
omni_mutex_lock l(m_clientsLock);
// Post this screen size update to all the connected clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// Post the update
if (!GetClient(*i)->SetNewSWSize(w,h,desktop)) {
@@ -2208,7 +2208,7 @@ vncServer::SetNewSWSizeFR(long w,long h,BOOL desktop)
omni_mutex_lock l(m_clientsLock);
// Post this screen size update to all the connected clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// Post the update
if (!GetClient(*i)->SetNewSWSizeFR(w,h,desktop)) {
@@ -2226,7 +2226,7 @@ vncServer::SetSWOffset(int x,int y)
omni_mutex_lock l(m_clientsLock);
// Post this screen size update to all the connected clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// Post the update
GetClient(*i)->SetSWOffset(x,y);
@@ -2242,7 +2242,7 @@ vncServer::InitialUpdate(bool value)
omni_mutex_lock l(m_clientsLock);
// Post this screen size update to all the connected clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// Post the update
GetClient(*i)->InitialUpdate(value);
@@ -2258,7 +2258,7 @@ vncServer::SetScreenOffset(int x,int y,int type)
omni_mutex_lock l(m_clientsLock);
// Post this screen size update to all the connected clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// Post the update
GetClient(*i)->SetScreenOffset(x,y,type);
@@ -2453,7 +2453,7 @@ void vncServer::DisableCacheForAllClients()
omni_mutex_lock l(m_clientsLock);
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
GetClient(*i)->EnableCache(FALSE);
}
@@ -2465,7 +2465,7 @@ vncServer::Clear_Update_Tracker() {
vncClientList::iterator i;
omni_mutex_lock l(m_clientsLock);
// Post this update to all the connected clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
GetClient(*i)->Clear_Update_Tracker();
@@ -2534,7 +2534,7 @@ BOOL
vncServer::All_clients_initialalized() {
vncClientList::iterator i;
// Post this update to all the connected clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
if (!GetClient(*i)->client_settings_passed) return false;
@@ -2546,7 +2546,7 @@ void
vncServer::TriggerUpdate() {
vncClientList::iterator i;
// Post this update to all the connected clients
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
GetClient(*i)->TriggerUpdate();
@@ -2557,7 +2557,7 @@ vncServer::TriggerUpdate() {
bool vncServer::IsClient(vncClient* pClient)
{
vncClientList::iterator i;
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
if (GetClient(*i) == pClient) return true;
return false;
@@ -2677,7 +2677,7 @@ void vncServer::NotifyClients_StateChange(CARD32 state, CARD32 value)
vncClientList::iterator i;
- for (i = m_unauthClients.begin(); i != m_unauthClients.end(); i++)
+ for (i = m_unauthClients.begin(); i != m_unauthClients.end(); ++i)
{
// Is this the right client?
@@ -2688,7 +2688,7 @@ void vncServer::NotifyClients_StateChange(CARD32 state, CARD32 value)
client->Record_SendServerStateUpdate(state, value);
}
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// Is this the right client?
client = GetClient(*i);
@@ -2706,7 +2706,7 @@ void vncServer::StopReconnectAll()
vncClientList::iterator i;
- for (i = m_authClients.begin(); i != m_authClients.end(); i++)
+ for (i = m_authClients.begin(); i != m_authClients.end(); ++i)
{
// Is this the right client?
client = GetClient(*i);
diff --git a/ica/win32/winvnc/winvnc/vsocket.cpp b/ica/win32/winvnc/winvnc/vsocket.cpp
index 41b2ef5..818ac4f 100644
--- a/ica/win32/winvnc/winvnc/vsocket.cpp
+++ b/ica/win32/winvnc/winvnc/vsocket.cpp
@@ -148,7 +148,8 @@ VSocket::VSocket()
m_fWriteToNetRectBuf = false;
m_nNetRectBufOffset = 0;
queuebuffersize=0;
-
+ memset( queuebuffer, 0, sizeof( queuebuffer ) );
+
//adzm 2010-08-01
m_LastSentTick = 0;
diff --git a/ica/win32/winvnc/winvnc/winvnc.cpp b/ica/win32/winvnc/winvnc/winvnc.cpp
index 2e6d48e..c7a124b 100644
--- a/ica/win32/winvnc/winvnc/winvnc.cpp
+++ b/ica/win32/winvnc/winvnc/winvnc.cpp
@@ -57,9 +57,9 @@ void InitIpp();
// Application instance and name
-HINSTANCE hAppInstance;
-const char *szAppName = "WinVNC";
-DWORD mainthreadId;
+HINSTANCE hAppInstance = NULL;
+const char *szAppName = "ITALCVNC";
+DWORD mainthreadId = 0;
BOOL fRunningFromExternalService=false;
//adzm 2009-06-20
@@ -193,6 +193,8 @@ Myinit(HINSTANCE hInstance)
#endif
return 1;
}
+
+#ifndef ULTRAVNC_ITALC_SUPPORT
//#define CRASHRPT
#ifdef CRASHRPT
#include "C:/DATA/crash/crashrpt/include/crashrpt.h"
@@ -849,6 +851,7 @@ int WINAPI WinMainVNC(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLi
return 0;
}
+#endif
// rdv&sf at 2007 - New TrayIcon impuDEsktop/impersonation thread stuff
diff --git a/ica/x11/AUTHORS b/ica/x11/AUTHORS
index 4e1b618..4fa0630 100644
--- a/ica/x11/AUTHORS
+++ b/ica/x11/AUTHORS
@@ -32,19 +32,12 @@ Alberto Lusiani, Malvina Mazin, Dave Stuart, Rohit Kumar, Donald Dugger,
Steven Carr, Uwe Völker, Charles Coffing, Guillaume Rousse,
Alessandro Praduroux, Brad Hards, Timo Ketola, Christian Ehrlicher,
Noriaki Yamazaki, Ben Klopfenstein, Vic Lee, Christian Beier,
-Alexander Dorokhine, Corentin Chary, Wouter Van Meir and George Kiagiadakis.
+Alexander Dorokhine, Corentin Chary, Wouter Van Meir, George Kiagiadakis,
+Joel Martin, Gernot Tenchio, William Roberts, Cristian Rodríguez,
+George Fleury, Kan-Ru Chen, Steve Guo, Luca Stauble, Peter Watkins,
+Kyle J. McKay, Mateus Cesar Groess, Philip Van Hoof, D. R. Commander,
+Rostislav Lisovy, Oliver Loch and Raphael Kubo da Costa.
Probably I forgot quite a few people sending a patch here and there, which
really made a difference. Without those, some obscure bugs still would
be unfound.
-
-A hearty unthanks goes to Michael and Erick, who provided me with nothing
-but hollow words. Finally I got that configure and install working, but
-it would have been so much better for them not just to complain, but also
-help. As you showed me real egoism, you are the main reasons I am not
-working one dot to make this library less than GPL, so that nobody ever
-can make profit of my and others work without giving something back to me
-and others.
-
-Speaking of hollow words, another hearty unthanks goes to Sam, who thought
-he could let me work for him, not paying me in any way.
diff --git a/ica/x11/ChangeLog b/ica/x11/ChangeLog
index 5dc55b8..13cde9f 100644
--- a/ica/x11/ChangeLog
+++ b/ica/x11/ChangeLog
@@ -1,3 +1,1091 @@
+2012-05-04 Christian Beier <dontmind at freeshell.org>
+
+ * configure.ac: Enable building DLLs with MinGW32.
+
+2012-05-04 Christian Beier <dontmind at freeshell.org>
+
+ * NEWS: Update NEWS for 0.9.9.
+
+2012-05-03 Christian Beier <dontmind at freeshell.org>
+
+ * libvncclient/rfbproto.c: LibVNCClient: #undef these types in case
+ it's WIN32. The various other headers include windows.h and the winsock headers
+ which give an error when SOCKET and socklen_t are already defined.
+
+2012-05-03 Christian Beier <dontmind at freeshell.org>
+
+ * rfb/rfb.h: LibVNCServer: Include ws2tcpip.h if it's available. Needed for the IPv6 stuff.
+
+2012-04-30 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/Makefile.am: LibVNCServer: Prefer GnuTLS over OpenSSL
+ to be in sync with LibVNCClient.
+
+2012-04-30 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/rfbserver.c: Some more libjpeg, libpng and zlib
+ related build fixes.
+
+2012-04-30 Christian Beier <dontmind at freeshell.org>
+
+ * configure.ac: Make PKG_CHECK_MODULES fail non-fatal. These check for optional modules.
+
+2012-04-30 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/rfbserver.c, rfb/rfb.h: Only try to build TightPNG
+ stuff when libjpeg is available. TightPNG replaces the ZLIB stuff int Tight encoding with PNG. It
+ still uses JPEG rects as well. Theoretically, we could build
+ TightPNG with only libpng and libjpeg - without zlib - but libpng
+ depends on zlib, so this is kinda moot.
+
+2012-04-27 Christian Beier <dontmind at freeshell.org>
+
+ * test/Makefile.am: Only build libjpeg test programs if libjpeg is
+ actually available.
+
+2012-04-26 Christian Beier <dontmind at freeshell.org>
+
+ * CMakeLists.txt: Fix CMake build of LibVNCClient.
+
+2012-04-26 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/rfbserver.c: Properly check return value. This also fixes a compiler warning.
+
+2012-04-26 Christian Beier <dontmind at freeshell.org>
+
+ * configure.ac: Fix build when no libjpeg is available.
+
+2012-04-26 Christian Beier <dontmind at freeshell.org>
+
+ * examples/android/Makefile.am, libvncserver/Makefile.am: Include
+ some more missing files for make dist.
+
+2012-04-25 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/Makefile.am: Include missing files for make dist.
+
+2012-04-25 Christian Beier <dontmind at freeshell.org>
+
+ * libvncclient/Makefile.am: Fix libvncclient make dist.
+
+2012-04-25 Christian Beier <dontmind at freeshell.org>
+
+ * configure.ac: Better check for Linux build.
+
+2012-04-25 Christian Beier <dontmind at freeshell.org>
+
+ * vncterm/Makefile.am: Binaries that are to be installed should be
+ all lowercase.
+
+2012-04-25 Christian Beier <dontmind at freeshell.org>
+
+ * CMakeLists.txt, configure.ac: Bump version to 0.9.9.
+
+2012-04-25 Christian Beier <dontmind at freeshell.org>
+
+ * common/turbojpeg.c, libvncserver/rfbserver.c,
+ libvncserver/websockets.c, test/tjbench.c: Fix some compiler
+ warnings thrown with newer gcc.
+
+2012-04-25 Christian Beier <dontmind at freeshell.org>
+
+ * test/Makefile.am: Fix turbojpeg tests compilation.
+
+2012-04-25 DRC <information at virtualgl.org>
+
+ * common/turbojpeg.c: Fix compilation with some libjpeg
+ distributions.
+
+2012-04-22 Monkey <chris.boyle.1978 at gmail.com>
+
+ * libvncclient/rfbproto.c: Added support for UltraVNC Single Click
+ as originally proposed by Noobius (Boobius) on 6/1/11. Original thread:
+
+ http://sourceforge.net/tracker/?func=detail&aid=3310255&group_id=32584&atid=405860
+
+2012-04-15 Christian Beier <dontmind at freeshell.org>
+
+ * AUTHORS: Add Philip to AUTHORS.
+
+2012-04-15 Christian Beier <dontmind at freeshell.org>
+
+ * libvncclient/tls_none.c: LibVNCClient: Fix build with no SSL/TLS
+ library available.
+
+2012-04-15 Christian Beier <dontmind at freeshell.org>
+
+ * libvncclient/tls_openssl.c: LibVNCClient: properly free the
+ openssl session stuff on shutdown.
+
+2012-04-15 Christian Beier <dontmind at freeshell.org>
+
+ * libvncclient/rfbproto.c, libvncclient/sockets.c,
+ libvncclient/tls_gnutls.c, libvncclient/vncviewer.c,
+ rfb/rfbclient.h: LibVNCClient: Remove all those WITH_CLIENT_TLS
+ #ifdefs and move GnuTLS specific functionality into tls_gnutls.c.
+
+2012-04-14 Christian Beier <dontmind at freeshell.org>
+
+ * configure.ac: Unify GnuTLS vs OpenSSL build systems stuff between
+ libvncclient and libvncserver.
+
+2012-04-14 Christian Beier <dontmind at freeshell.org>
+
+ * libvncclient/Makefile.am, libvncclient/tls.c,
+ libvncclient/tls_gnutls.c, libvncclient/tls_none.c,
+ libvncclient/tls_openssl.c: Add the OpenSSL libvncclient TLS version
+ to the build system.
+
+2012-04-12 Christian Beier <dontmind at freeshell.org>
+
+ * webclients/novnc/LICENSE.txt, webclients/novnc/README.md,
+ webclients/novnc/include/base.css,
+ webclients/novnc/include/base64.js,
+ webclients/novnc/include/display.js,
+ webclients/novnc/include/input.js,
+ webclients/novnc/include/jsunzip.js,
+ webclients/novnc/include/rfb.js, webclients/novnc/include/ui.js,
+ webclients/novnc/include/util.js, webclients/novnc/include/vnc.js,
+ webclients/novnc/include/websock.js,
+ webclients/novnc/include/webutil.js, webclients/novnc/vnc.html,
+ webclients/novnc/vnc_auto.html: Update our copy of noVNC. Bugfixes and support for tight encoding with zlib.
+
+2012-04-12 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/tight.c: Make TurboVNC compress level 3 actually
+ work.
+
+2012-04-09 DRC <information at virtualgl.org>
+
+ * common/turbojpeg.c: Fix memory leak in TurboVNC Note that the memory leak was only occurring with the colorspace
+ emulation code, which is only active when using regular libjpeg (not
+ libjpeg-turbo.) Diagnosed by Christian Beier, using valgrind. Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2012-04-02 Christian Beier <dontmind at freeshell.org>
+
+ * libvncclient/listen.c, libvncclient/sockets.c,
+ libvncserver/httpd.c, libvncserver/sockets.c: IPv6 support for
+ LibVNCServer, part four: add copyright notices to files with
+ non-trivial changes.
+
+2012-03-29 Johannes Schindelin <johannes.schindelin at gmx.de>
+
+ * client_examples/SDLvncviewer.c: SDLvncviewer: map Apple/Windows
+ keys correctly Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2012-03-29 Johannes Schindelin <johannes.schindelin at gmx.de>
+
+ * .gitignore: gitignore the compiled gtkvncclient Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2012-03-29 Johannes Schindelin <johannes.schindelin at gmx.de>
+
+ * client_examples/SDLvncviewer.c: SDLvncviewer: fix the SDL_KEYUP
+ issue Keys got stuck because unicode is 0 upon SDL_KEYUP events, even if
+ the same key event sets unicode correctly in SDL_KEYDOWN events. Work around that for the common case (ASCII) using the fact that
+ both SDL and X11 keysyms were created with ASCII compatibility in
+ mind. So as long as we type ASCII symbols, we can map things
+ trivially. Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2012-03-23 DRC <information at virtualgl.org>
+
+ * CMakeLists.txt: Extend support for the new TurboVNC encoder to the
+ CMake build system
+
+2012-03-25 DRC <information at virtualgl.org>
+
+ * common/turbojpeg.c, common/turbojpeg.h, configure.ac,
+ libvncserver/Makefile.am, libvncserver/rfbserver.c,
+ libvncserver/tight.c, libvncserver/turbo.c, rfb/rfb.h,
+ rfb/rfbproto.h, test/Makefile.am, test/bmp.c, test/bmp.h,
+ test/tjbench.c, test/tjunittest.c, test/tjutil.c, test/tjutil.h:
+ Replace TightVNC encoder with TurboVNC encoder. This patch is the
+ result of further research and discussion that revealed the
+ following: -- TightPng encoding and the rfbTightNoZlib extension need not
+ conflict. Since TightPng is a separate encoding type, not supported
+ by TurboVNC-compatible viewers, then the rfbTightNoZlib extension
+ can be used solely whenever the encoding type is Tight and disabled
+ with the encoding type is TightPng. -- In the TightVNC encoder, compression levels above 5 are basically
+ useless. On the set of 20 low-level datasets that were used to
+ design the TurboVNC encoder (these include the eight 2D application
+ captures that were also used when designing the TightVNC encoder, as
+ well as 12 3D application captures provided by the VirtualGL
+ Project-- see
+ http://www.virtualgl.org/pmwiki/uploads/About/tighttoturbo.pdf),
+ moving from Compression Level (CL) 5 to CL 9 in the TightVNC
+ encoder did not increase the compression ratio of any datasets more
+ than 10%, and the compression ratio only increased by more than 5%
+ on four of them. The compression ratio actually decreased a few
+ percent on five of them. In exchange for this paltry increase in
+ compression ratio, the CPU usage, on average, went up by a factor of
+ 5. Thus, for all intents and purposes, TightVNC CL 5 provides the
+ "best useful compression" for that encoder. -- TurboVNC's best compression level (CL 2) compresses 3D and video
+ workloads significantly more "tightly" than TightVNC CL 5 (~70%
+ better, in the aggregate) but does not quite achieve the same level
+ of compression with 2D workloads (~20% worse, in the aggregate.)
+ This decrease in compression ratio may or may not be noticeable,
+ since many of the datasets it affects are not performance-critical
+ (such as the console output of a compilation, etc.) However, for
+ peace of mind, it was still desirable to have a mode that compressed
+ with equal "tightness" to TightVNC CL 5, since we proposed to
+ replace that encoder entirely. -- A new mode was discovered in the TurboVNC encoder that produces,
+ in the aggregate, similar compression ratios on 2D datasets as
+ TightVNC CL 5. That new mode involves using Zlib level 7 (the same
+ level used by TightVNC CL 5) but setting the "palette threshold" to
+ 256, so that indexed color encoding is used whenever possible. This
+ mode reduces bandwidth only marginally (typically 10-20%) relative
+ to TurboVNC CL 2 on low-color workloads, in exchange for nearly
+ doubling CPU usage, and it does not benefit high-color workloads at
+ all (since those are usually encoded with JPEG.) However, it
+ provides a means of reproducing the same "tightness" as the TightVNC encoder on 2D workloads without sacrificing any compression for
+ 3D/video workloads, and without using any more CPU time than
+ necessary. -- The TurboVNC encoder still performs as well or better than the
+ TightVNC encoder when plain libjpeg is used instead of
+ libjpeg-turbo. Specific notes follow: common/turbojpeg.c common/turbojpeg.h: Added code to emulate the
+ libjpeg-turbo colorspace extensions, so that the TurboJPEG wrapper
+ can be used with plain libjpeg as well. This required updating the
+ TurboJPEG wrapper to the latest code from libjpeg-turbo 1.2.0,
+ mainly because the TurboJPEG 1.2 API handles pixel formats in a much
+ cleaner way, which made the conversion code easier to write. It
+ also eases the maintenance to have the wrapper synced as much as
+ possible with the upstream code base (so I can merge any relevant
+ bug fixes that are discovered upstream.) The libvncserver version of
+ the TurboJPEG wrapper is a "lite" version, containing only the JPEG
+ compression/decompression code and not the lossless transform, YUV
+ encoding/decoding, and dynamic buffer allocation features from
+ TurboJPEG 1.2. configure.ac: Removed the --with-turbovnc option. configure still
+ checks for the presence of libjpeg-turbo, but only for the purposes
+ of printing a performance warning if it isn't available. rfb/rfb.h: Fix a bug introduced with the initial TurboVNC encoder
+ patch. We cannot use tightQualityLevel for the TurboVNC 1-100
+ quality level, because tightQualityLevel is also used by ZRLE.
+ Thus, a new parameter (turboQualityLevel) was created. rfb/rfbproto.h: Remove TurboVNC-specific #ifdefs and language libvncserver/rfbserver.c: Remove TurboVNC-specific #ifdefs. Fix
+ afore-mentioned tightQualityLevel bug. libvncserver/tight.c: Replaced the TightVNC encoder with the
+ TurboVNC encoder. Relative to the initial TurboVNC encoder patch,
+ this patch also: -- Adds TightPng support to the TurboVNC encoder --
+ Adds the afore-mentioned low-bandwidth mode, which is mapped
+ externally to Compression Level 9 test/*: Included TJUnitTest (a regression test for the TurboJPEG
+ wrapper) as well as TJBench (a benchmark for same.) These are
+ useful for ensuring that the wrapper still functions correctly and
+ performantly if it needs to be modified for whatever reason. Both
+ of these programs are derived from libjpeg-turbo 1.2.0. As with the
+ TurboJPEG wrapper, they do not contain the more advanced features of
+ TurboJPEG 1.2, such as YUV encoding/decoding and lossless
+ transforms.
+
+2012-03-15 Christian Beier <dontmind at freeshell.org>
+
+ * AUTHORS: Add DRC to AUTHORS.
+
+2012-03-15 Christian Beier <dontmind at freeshell.org>
+
+ * rfb/rfb.h: Move tightsubsamplevel member to the end of rfbClient
+ struct. Try to not break ABI between releases. Even if the code gets ugly...
+
+2012-03-10 DRC <information at virtualgl.org>
+
+ * x11vnc/Makefile.am: Fix the build of x11vnc when an out-of-tree
+ build directory is used
+
+2012-03-10 DRC <information at virtualgl.org>
+
+ * libvncserver/rfbserver.c: Fix an issue that affects the existing
+ Tight encoder as well as the newly-implemented Turbo encoder. The issue is that, when using the current libvncserver source, it is
+ impossible to disable Tight JPEG encoding. The way Tight/Turbo
+ viewers disable JPEG encoding is by simply not sending the Tight
+ quality value, causing the server to use the default value of -1.
+ Thus, cl->tightQualityLevel has to be set to -1 prior to processing
+ the encodings message for this mechanism to work. Similarly, it is
+ not guaranteed that the compress level will be set in the encodings
+ message, so it is set to a default value prior to processing the
+ message.
+
+2012-03-10 DRC <information at virtualgl.org>
+
+ * common/turbojpeg.c, common/turbojpeg.h, configure.ac,
+ libvncserver/Makefile.am, libvncserver/rfbserver.c,
+ libvncserver/turbo.c, rfb/rfb.h, rfb/rfbproto.h: Add TurboVNC
+ encoding support. TurboVNC is a variant of TightVNC that uses the same client/server
+ protocol (RFB version 3.8t), and thus it is fully cross-compatible
+ with TightVNC and TigerVNC (with one exception, which is noted
+ below.) Both the TightVNC and TurboVNC encoders analyze each
+ rectangle, pick out regions of solid color to send separately, and
+ send the remaining subrectangles using mono, indexed color, JPEG, or
+ raw encoding, depending on the number of colors in the subrectangle.
+ However, TurboVNC uses a fundamentally different selection algorithm
+ to determine the appropriate subencoding to use for each
+ subrectangle. Thus, while it sends a protocol stream that can be
+ decoded by any TightVNC-compatible viewer, the mix of subencoding
+ types in this protocol stream will be different from those generated
+ by a TightVNC server. The research that led to TurboVNC is described in the following
+ report:
+ http://www.virtualgl.org/pmwiki/uploads/About/tighttoturbo.pdf. In
+ summary: 20 RFB captures, representing "common" 2D and 3D
+ application workloads (the 3D workloads were run using VirtualGL),
+ were studied using the TightVNC encoder in isolation. Some of the
+ analysis features in the TightVNC encoder, such as smoothness
+ detection, were found to generate a lot of CPU usage with little or
+ no benefit in compression, so those features were disabled. JPEG
+ encoding was accelerated using libjpeg-turbo (which achieves a 2-4x
+ speedup over plain libjpeg on modern x86 or ARM processors.)
+ Finally, the "palette threshold" (minimum number of colors that the
+ subrectangle must have before it is compressed using JPEG or raw)
+ was adjusted to account for the fact that JPEG encoding is now quite
+ a bit faster (meaning that we can now use it more without a CPU
+ penalty.) TurboVNC has additional optimizations, such as the
+ ability to count colors and encode JPEG images directly from the
+ framebuffer without first translating the pixels into RGB. The
+ TurboVNC encoder compares quite favorably in terms of compression
+ ratio with TightVNC and generally encodes a great deal faster (often
+ an order of magnitude or more.) The version of the TurboVNC encoder included in this patch is
+ roughly equivalent to the one found in version 0.6 of the Unix
+ TurboVNC Server, with a few minor patches integrated from TurboVNC
+ 1.1. TurboVNC 1.0 added multi-threading capabilities, which can be
+ added in later if desired (at the expense of making libvncserver
+ depend on libpthread.) Because TurboVNC uses a fundamentally different mix of subencodings
+ than TightVNC, because it uses the identical protocol (and thus a
+ viewer really has no idea whether it's talking to a TightVNC or
+ TurboVNC server), and because it doesn't support rfbTightPng (and in
+ fact conflicts with it-- see below), the TurboVNC and TightVNC
+ encoders cannot be enabled simultaneously. Compatibility: In *most* cases, a TurboVNC-enabled viewer is fully compatible with
+ a TightVNC server, and vice versa. TurboVNC supports
+ pseudo-encodings for specifying a fine-grained (1-100) quality scale
+ and specifying chrominance subsampling. If a TurboVNC viewer sends
+ those to a TightVNC server, then the TightVNC server ignores them,
+ so the TurboVNC viewer also sends the quality on a 0-9 scale that
+ the TightVNC server can understand. Similarly, the TurboVNC server
+ checks first for fine-grained quality and subsampling
+ pseudo-encodings from the viewer, and failing to receive those, it
+ then checks for the TightVNC 0-9 quality pseudo-encoding. There is one case in which the two systems are not compatible, and
+ that is when a TightVNC or TigerVNC viewer requests compression
+ level 0 without JPEG from a TurboVNC server. For performance
+ reasons, this causes the TurboVNC server to send images directly to
+ the viewer, bypassing Zlib. When the TurboVNC server does this, it
+ also sets bits 7-4 in the compression control byte to rfbTightNoZlib
+ (0x0A), which is unfortunately the same value as rfbTightPng. Older
+ TightVNC viewers that don't handle PNG will assume that the stream
+ is uncompressed but still encapsulated in a Zlib structure, whereas
+ newer PNG-supporting TightVNC viewers will assume that the stream is
+ PNG. In either case, the viewer will probably crash. Since most
+ VNC viewers don't expose compression level 0 in the GUI, this is a
+ relatively rare situation. Description of changes: configure.ac -- Added support for libjpeg-turbo. If passed an
+ argument of --with-turbovnc, configure will now run (or, if cross-compiling, just link) a test program that determines
+ whether the libjpeg library being used is libjpeg-turbo.
+ libjpeg-turbo must be used when building the TurboVNC encoder,
+ because the TurboVNC encoder relies on the libjpeg-turbo
+ colorspace extensions in order to compress images directly out of
+ the framebuffer (which may be, for instance, BGRA rather than RGB.)
+ libjpeg-turbo can optionally be used with the TightVNC encoder as
+ well, but the speedup will only be marginal (the report linked above
+ explains why in more detail, but basically it's because of Amdahl's
+ Law. The TightVNC encoder was designed with the assumption that
+ JPEG had a very high CPU cost, and thus JPEG is used only
+ sparingly.) -- Added a new configure variable, JPEG_LDFLAGS. This
+ is necessitated by the fact that libjpeg-turbo often distributes
+ libjpeg.a and libjpeg.so in /opt/libjpeg-turbo/lib32 or
+ /opt/libjpeg-turbo/lib64, and many people prefer to statically
+ link with it. Thus, more flexibility is needed than is provided by
+ --with-jpeg. If JPEG_LDFLAGS is specified, then it overrides the
+ changes to LDFLAGS enacted by --with-jpeg (but --with-jpeg is
+ still used to set the include path.) The addition of JPEG_LDFLAGS
+ necessitated replacing AC_CHECK_LIB with AC_LINK_IFELSE (because
+ AC_CHECK_LIB automatically sets LIBS to -ljpeg, which is not what we
+ want if we're, for instance, linking statically with libjpeg-turbo.)
+ -- configure does not check for PNG support if TurboVNC encoding is
+ enabled. This prevents the rfbSendRectEncodingTightPng() function
+ from being compiled in, since the TurboVNC encoder doesn't (and
+ can't) support it. common/turbojpeg.c, common/turbojpeg.h -- TurboJPEG is a simple API
+ used to compress and decompress JPEG images in memory. It was
+ originally implemented because it was desirable to use different
+ types of underlying technologies to compress JPEG on different
+ platforms (mediaLib on SPARC, Quicktime on PPC Macs, Intel
+ Performance Primitives, etc.) These days, however, libjpeg-turbo
+ is the only underlying technology used by TurboVNC, so TurboJPEG's
+ purpose is largely just code simplicity and flexibility. Thus,
+ since there is no real need for libvncserver to use any technology
+ other than libjpeg-turbo for compressing JPEG, the TurboJPEG wrapper
+ for libjpeg-turbo has been included in-tree so that libvncserver can
+ be directly linked with libjpeg-turbo. This is convenient because
+ many modern Linux distros (Fedora, Ubuntu, etc.) now ship
+ libjpeg-turbo as their default libjpeg library. libvncserver/rfbserver.c -- Added logic to check for the TurboVNC
+ fine-grained quality level and subsampling encodings and to map
+ Tight (0-9) quality levels to appropriate fine-grained quality level
+ and subsampling values if communicating with a TightVNC/TigerVNC
+ viewer. libvncserver/turbo.c -- TurboVNC encoder (compiled instead of
+ libvncserver/tight.c) rfb/rfb.h -- Added support for the TurboVNC subsampling level rfb/rfbproto.h -- Added constants for the TurboVNC fine quality
+ level and subsampling encodings as well as the rfbTightNoZlib
+ constant and notes on its usage.
+
+2012-03-10 Christian Beier <dontmind at freeshell.org>
+
+ * client_examples/SDLvncviewer.c, libvncclient/listen.c,
+ libvncclient/sockets.c, libvncclient/vncviewer.c,
+ libvncserver/sockets.c, rfb/rfbclient.h: IPv6 support for
+ LibVNCServer, part three: make reverse connections IPv6-capable. Besided making libvncserver reverseVNC IPv6-aware, this introduces
+ some changes on the client side as well to make clients listen on
+ IPv6 sockets, too. Like the server side, this also uses a
+ separate-socket approach.
+
+2012-03-10 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/sockets.c: IPv6 support for LibVNCServer, part
+ onepointseven: Plug a memleak. We have to properly free the addrinfo struct when jumping out of the
+ function.
+
+2012-03-09 Christian Beier <dontmind at freeshell.org>
+
+ * webclients/index.vnc: IPv6 support for LibVNCServer, part
+ twopointone: properly surround IPv6 addresses with [] for noVNC URL. Some browsers omit the square brackets in
+ document.location.hostname, so add them if missing.
+
+2012-02-27 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/cargs.c, libvncserver/httpd.c, libvncserver/main.c,
+ rfb/rfb.h: IPv6 support for LibVNCServer, part two: Let the http
+ server listen on IPv6, too. As done with the RFB sockets, this uses a separate-socket approach
+ as well.
+
+2012-02-27 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/main.c: IPv6 support for LibVNCServer, part
+ onepointsix: fix a small logic error. Without this, we would have gotten a stale IPv4 socket in a race
+ condition.
+
+2012-02-27 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/rfbserver.c, libvncserver/sockets.c: IPv6 support for
+ LibVNCServer, part onepointfive: Fix compilation with IPv6 missing. There was an oversight that crept in...
+
+2012-02-20 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/cargs.c, libvncserver/main.c,
+ libvncserver/rfbserver.c, libvncserver/sockets.c, rfb/rfb.h: IPv6
+ support for LibVNCServer, part one: accept IPv4 and IPv6
+ connections. This uses a separate-socket approach since there are systems that do
+ not support dual binding sockets under *any* circumstances, for
+ instance OpenBSD. Using separate sockets for IPv4 and IPv6 is thus
+ more portable than having a v6 socket handle v4 connections as well. Signed-off-by: Christian Beier <dontmind at freeshell.org>
+
+2012-02-11 Mateus Cesar Groess <mateuscg at gmail.com>
+
+ * AUTHORS, client_examples/Makefile.am,
+ client_examples/gtkvncviewer.c, configure.ac: Here is a port of
+ SDLvncviewer to GTK+2. I think it may encourage people to implement more features for the
+ viewer, because a GTK GUI seems to be easier to implement than a SDL
+ one (and it is more integrated with the major Linux Desktops out
+ there). Signed-off-by: Christian Beier <dontmind at freeshell.org>
+
+2012-02-11 Christian Beier <dontmind at freeshell.org>
+
+ * AUTHORS: Update AUTHORS.
+
+2012-02-10 Kyle J. McKay <mackyle at gmail.com>
+
+ * libvncserver/auth.c, libvncserver/rfbserver.c, rfb/rfb.h: Support
+ Mac OS X vnc client with no password Support connections from the Mac OS X built-in VNC client to
+ LibVNCServers running with no password and advertising a server
+ version of 3.7 or greater.
+
+2012-02-04 Johannes Schindelin <johannes.schindelin at gmx.de>
+
+ * AUTHORS: Add Luca to the AUTHORS Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2012-02-04 Luca Stauble <gnekoz at gmail.com>
+
+ * libvncclient/listen.c, libvncclient/sockets.c,
+ libvncclient/vncviewer.c, rfb/rfbclient.h: Add an optional parameter
+ to specify the ip address for reverse connections For security reasons, it can be important to limit which IP
+ addresses a LibVNCClient-based client should listen for reverse
+ connections. This commit adds that option. To preserve binary backwards-compatibility, the field was added to
+ the end of the rfbclient struct, and the function ListenAtTcpPort
+ retains its signature (but calls the new ListenAtTcpPortAndAddress). [jes: shortened the commit subject, added a longer explanation in
+ the commit body and adjusted style] Signed-off-by: Luca Stauble <gnekoz at gmail.com> Signed-off-by:
+ Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2012-01-12 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * libvncserver/websockets.c: websockets: removed debug message
+
+2012-01-12 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * libvncserver/websockets.c: websockets: restore errno after logging
+ an error
+
+2012-01-12 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * CMakeLists.txt: cmake: adapted to latest websocket crypto changes
+
+2011-12-15 Christian Beier <dontmind at freeshell.org>
+
+ * rfb/rfbclient.h: Small changes to LibNVCClient doxygen
+ documentation.
+
+2011-12-01 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/Makefile.am: Fix build error when libpng is
+ available, but libjpeg is not. The png stuff in tight.c depends on code in tight.c that uses
+ libjpeg features. We could probably seperate that, but for now the
+ dependency for 'tight' goes: PNG depends on JPEG depends on ZLIB. This is reflected in Makefile.am now. NB: Building tight.c with JPEG but without PNG is still possible, but nor the other way around.
+
+2011-12-01 Christian Beier <dontmind at freeshell.org>
+
+ * configure.ac: Use AM_SILENT_RULES only when it's actually
+ available. Otherwise building breaks with older make versions. Happens on OS X
+ 10.6 for instance.
+
+2011-11-09 Christian Beier <dontmind at freeshell.org>
+
+ * configure.ac, webclients/Makefile.am, webclients/index.vnc,
+ webclients/java-applet/Makefile.am,
+ webclients/java-applet/javaviewer.pseudo_proxy.patch,
+ webclients/java-applet/ssl/Makefile.am,
+ webclients/java-applet/ssl/README,
+ webclients/java-applet/ssl/index.vnc,
+ webclients/java-applet/ssl/onetimekey,
+ webclients/java-applet/ssl/proxy.vnc,
+ webclients/java-applet/ssl/ss_vncviewer,
+ webclients/java-applet/ssl/tightvnc-1.3dev7_javasrc-vncviewer-curso
+ r-colors+no-tab-traversal.patch,
+ webclients/java-applet/ssl/tightvnc-1.3dev7_javasrc-vncviewer-ssl.p
+ atch, webclients/java-applet/ssl/ultra.vnc,
+ webclients/java-applet/ssl/ultraproxy.vnc,
+ webclients/java-applet/ssl/ultrasigned.vnc,
+ webclients/java-applet/ssl/ultravnc-102-JavaViewer-ssl-etc.patch,
+ webclients/javaviewer.pseudo_proxy.patch,
+ webclients/ssl/Makefile.am, webclients/ssl/README,
+ webclients/ssl/index.vnc, webclients/ssl/onetimekey,
+ webclients/ssl/proxy.vnc, webclients/ssl/ss_vncviewer,
+ webclients/ssl/tightvnc-1.3dev7_javasrc-vncviewer-cursor-colors+no-
+ tab-traversal.patch,
+ webclients/ssl/tightvnc-1.3dev7_javasrc-vncviewer-ssl.patch,
+ webclients/ssl/ultra.vnc, webclients/ssl/ultraproxy.vnc,
+ webclients/ssl/ultrasigned.vnc,
+ webclients/ssl/ultravnc-102-JavaViewer-ssl-etc.patch: Move the java
+ stuff into webclients/java-applet.
+
+2011-11-09 Christian Beier <dontmind at freeshell.org>
+
+ * LibVNCServer.spec.in, Makefile.am, README, classes/Makefile.am,
+ classes/index.vnc, classes/javaviewer.pseudo_proxy.patch,
+ classes/novnc/LICENSE.txt, classes/novnc/README.md,
+ classes/novnc/favicon.ico, classes/novnc/include/base.css,
+ classes/novnc/include/base64.js, classes/novnc/include/black.css,
+ classes/novnc/include/blue.css, classes/novnc/include/des.js,
+ classes/novnc/include/display.js, classes/novnc/include/input.js,
+ classes/novnc/include/logo.js, classes/novnc/include/playback.js,
+ classes/novnc/include/rfb.js, classes/novnc/include/ui.js,
+ classes/novnc/include/util.js, classes/novnc/include/vnc.js,
+ classes/novnc/include/web-socket-js/README.txt,
+ classes/novnc/include/web-socket-js/swfobject.js,
+ classes/novnc/include/web-socket-js/web_socket.js,
+ classes/novnc/include/websock.js, classes/novnc/include/webutil.js,
+ classes/novnc/vnc.html, classes/novnc/vnc_auto.html,
+ classes/ssl/Makefile.am, classes/ssl/README, classes/ssl/index.vnc,
+ classes/ssl/onetimekey, classes/ssl/proxy.vnc,
+ classes/ssl/ss_vncviewer,
+ classes/ssl/tightvnc-1.3dev7_javasrc-vncviewer-cursor-colors+no-tab
+ -traversal.patch,
+ classes/ssl/tightvnc-1.3dev7_javasrc-vncviewer-ssl.patch,
+ classes/ssl/ultra.vnc, classes/ssl/ultraproxy.vnc,
+ classes/ssl/ultrasigned.vnc,
+ classes/ssl/ultravnc-102-JavaViewer-ssl-etc.patch, configure.ac,
+ examples/example.c, examples/pnmshow.c, examples/pnmshow24.c,
+ rfb/rfb.h, webclients/Makefile.am, webclients/index.vnc,
+ webclients/javaviewer.pseudo_proxy.patch,
+ webclients/novnc/LICENSE.txt, webclients/novnc/README.md,
+ webclients/novnc/favicon.ico, webclients/novnc/include/base.css,
+ webclients/novnc/include/base64.js,
+ webclients/novnc/include/black.css,
+ webclients/novnc/include/blue.css, webclients/novnc/include/des.js,
+ webclients/novnc/include/display.js,
+ webclients/novnc/include/input.js,
+ webclients/novnc/include/logo.js,
+ webclients/novnc/include/playback.js,
+ webclients/novnc/include/rfb.js, webclients/novnc/include/ui.js,
+ webclients/novnc/include/util.js, webclients/novnc/include/vnc.js,
+ webclients/novnc/include/web-socket-js/README.txt,
+ webclients/novnc/include/web-socket-js/swfobject.js,
+ webclients/novnc/include/web-socket-js/web_socket.js,
+ webclients/novnc/include/websock.js,
+ webclients/novnc/include/webutil.js, webclients/novnc/vnc.html,
+ webclients/novnc/vnc_auto.html, webclients/ssl/Makefile.am,
+ webclients/ssl/README, webclients/ssl/index.vnc,
+ webclients/ssl/onetimekey, webclients/ssl/proxy.vnc,
+ webclients/ssl/ss_vncviewer,
+ webclients/ssl/tightvnc-1.3dev7_javasrc-vncviewer-cursor-colors+no-
+ tab-traversal.patch,
+ webclients/ssl/tightvnc-1.3dev7_javasrc-vncviewer-ssl.patch,
+ webclients/ssl/ultra.vnc, webclients/ssl/ultraproxy.vnc,
+ webclients/ssl/ultrasigned.vnc,
+ webclients/ssl/ultravnc-102-JavaViewer-ssl-etc.patch: Rename
+ 'classes' dir to 'webclients'.
+
+2011-11-09 Christian Beier <dontmind at freeshell.org>
+
+ * classes/index.vnc, libvncserver/httpd.c: novnc client: use the
+ client's notion about the server hostname instead of what the server
+ thinks.
+
+2011-11-09 Christian Beier <dontmind at freeshell.org>
+
+ * classes/index.vnc: Fix tiny typo.
+
+2011-11-09 Christian Beier <dontmind at freeshell.org>
+
+ * NEWS: Add 0.9.8.2 NEWS entry.
+
+2011-11-09 Christian Beier <dontmind at freeshell.org>
+
+ * libvncclient/rfbproto.c: When GetCredential() callback is not set,
+ don't use authentications requiring it. The auth methods that employ Getcredential() will only be used if
+ the client's GetCredential callback is actually set.
+
+2011-10-12 Christian Beier <dontmind at freeshell.org>
+
+ * ChangeLog: Update ChangeLog for 0.9.8.1.
+
+2011-10-12 Christian Beier <dontmind at freeshell.org>
+
+ * CMakeLists.txt, NEWS, configure.ac: Update version number in
+ autotools && cmake, NEWS entry.
+
+2011-10-26 Peter Watkins <watkipet at gmail.com>
+
+ * rfb/rfbclient.h: Added comments.
+
+2011-10-26 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/rfbserver.c: Fix deadlock in threaded mode when using
+ nested rfbClientIteratorNext() calls. Lengthy explanation follows... First, the scenario before this patch: We have three clients 1,2,3 connected. The main thread loops through
+ them using rfbClientIteratorNext() (loop L1) and is currently at
+ client 2 i.e. client 2's cl_2->refCount is 1. At this point we need
+ to loop again through the clients, with cl_2->refCount == 1, i.e. do
+ a loop L2 nested within loop L1. BUT: Now client 2 disconnects, it's clientInput thread terminates
+ its clientOutput thread and calls rfbClientConnectionGone(). This
+ LOCKs clientListMutex and WAITs for cl_2->refCount to become 0. This
+ means this thread waits for the main thread to release cl_2.
+ Waiting, with clientListMutex LOCKed! Meanwhile, the main thread is about to begin the inner
+ rfbClientIteratorNext() loop L2. The first call to
+ rfbClientIteratorNext() LOCKs clientListMutex. BAAM. This mutex is
+ locked by cl2's clientInput thread and is only released when
+ cl_2->refCount becomes 0. The main thread would decrement
+ cl_2->refCount when it would continue with loop L1. But it's waiting
+ for cl2's clientInput thread to release clientListMutex. Which never
+ happens since this one's waiting for the main thread to decrement
+ cl_2->refCount. DEADLOCK. Now, situation with this patch: Same as above, but when client 2 disconnects it's clientInput thread
+ rfbClientConnectionGone(). This again LOCKs clientListMutex, removes
+ cl_2 from the linked list and UNLOCKS clientListMutex. The WAIT for
+ cl_2->refCount to become 0 is _after_ that. Waiting, with
+ clientListMutex UNLOCKed! Therefore, the main thread can continue, do the inner loop L2 (now
+ only looping through 1,3 - 2 was removed from the linked list) and
+ continue with loop L1, finally decrementing cl_2->refCount, allowing
+ cl2's clientInput thread to continue and terminate. The resources
+ held by cl2 are not free()'d by rfbClientConnectionGone until
+ cl2->refCount becomes 0, i.e. loop L1 has released cl2.
+
+2011-10-16 Johannes Schindelin <johannes.schindelin at gmx.de>
+
+ * AUTHORS: Update AUTHORS Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-10-16 George Fleury <gfleury at gmail.com>
+
+ * libvncserver/rfbserver.c: Fix memory leak I was debbuging some code tonight and i found a pointer that is not
+ been freed, so i think there is maybe a memory leak, so it is... there is the malloc caller reverse order: ( malloc cl->statEncList ) <- rfbStatLookupEncoding <- rfbStatRecordEncodingSent <- rfbSendCursorPos <- rfbSendFramebufferUpdate <- rfbProcessEvents I didnt look the whole libvncserver api, but i am using
+ rfbReverseConnection with rfbProcessEvents, and then when the client
+ connection dies, i am calling a rfbShutdownServer and
+ rfbScreenCleanup, but the malloc at rfbStatLookupEncoding isnt been
+ freed. So to free the stats i added a rfbResetStats(cl) after
+ rfbPrintStats(cl) at rfbClientConnectionGone in rfbserver.c before
+ free the cl pointer. (at rfbserver.c line 555). And this, obviously,
+ is correcting the memory leak. Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-10-08 Johannes Schindelin <johannes.schindelin at gmx.de>
+
+ * rfb/rfbclient.h: Hopefully fix the crash when updating from 0.9.7
+ or earlier For backwards-compatibility reasons, we can only add struct members
+ to the end. That way, existing callers still can use newer
+ libraries, as the structs are always allocated by the library (and
+ therefore guaranteed to have the correct size) and still rely on the
+ same position of the parts the callers know about. Reported by Luca Falavigna. Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-10-09 Johannes Schindelin <johannes.schindelin at gmx.de>
+
+ * client_examples/SDLvncviewer.c: SDLvncviewer: make it resizable by
+ default I got annoyed having to specify -resizable all the time; I never use
+ it in another mode anymore, since I am on a netbook. The option -no-resizable was added to be able to switch off that
+ feature. Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-10-06 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/httpd.c: httpd: fix sending of binary data such as
+ images. We do this simply by omitting the content-type and let the browser
+ decide upon the mime-type of the sent file. Only exception is
+ 'index.vnc', where we do set the content-type since some browsers
+ fail to detect it's html when it's ending in '.vnc' Also, remove superfluous #defines. We close the connection always.
+
+2011-10-06 Christian Beier <dontmind at freeshell.org>
+
+ * classes/index.vnc: Fix typo && use proper website.
+
+2011-10-04 Christian Beier <dontmind at freeshell.org>
+
+ * classes/index.vnc, classes/novnc/LICENSE.txt,
+ classes/novnc/README.md, classes/novnc/favicon.ico,
+ classes/novnc/include/base.css, classes/novnc/include/base64.js,
+ classes/novnc/include/black.css, classes/novnc/include/blue.css,
+ classes/novnc/include/des.js, classes/novnc/include/display.js,
+ classes/novnc/include/input.js, classes/novnc/include/logo.js,
+ classes/novnc/include/playback.js, classes/novnc/include/rfb.js,
+ classes/novnc/include/ui.js, classes/novnc/include/util.js,
+ classes/novnc/include/vnc.js,
+ classes/novnc/include/web-socket-js/README.txt,
+ classes/novnc/include/web-socket-js/swfobject.js,
+ classes/novnc/include/web-socket-js/web_socket.js,
+ classes/novnc/include/websock.js, classes/novnc/include/webutil.js,
+ classes/novnc/vnc.html, classes/novnc/vnc_auto.html,
+ libvncserver/httpd.c: Add noVNC HTML5 client connect possibility to
+ our http server. Pure JavaScript, no Java plugin required anymore! (But a recent
+ browser...)
+
+2011-10-04 Christian Beier <dontmind at freeshell.org>
+
+ * configure.ac: This build warning is a libvncserver one, not for
+ x11vnc. Also, make it warn more generally when no known encryption lib is
+ available.
+
+2011-09-21 Gernot Tenchio <gernot at tenchio.de>
+
+ * common/md5.c: md5: forced to use function names with leading
+ underscores Commented out the surrounding '#ifdef _LIBC' to build md5.o with
+ leading underscores. This is required to match the prototypes
+ defined in md5.h.
+
+2011-09-20 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * libvncserver/rfbcrypto_included.c: rfbcrypto_included: fix c&p
+ errors
+
+2011-09-20 Gernot Tenchio <gernot at tenchio.de>
+
+ * libvncserver/rfbcrypto_polarssl.c: rfbcrypto_polarssl: it was way
+ to late last night...
+
+2011-09-18 Gernot Tenchio <gernot at tenchio.de>
+
+ * libvncserver/Makefile.am, libvncserver/rfbcrypto.h,
+ libvncserver/rfbcrypto_gnutls.c, libvncserver/rfbcrypto_included.c,
+ libvncserver/rfbcrypto_openssl.c,
+ libvncserver/rfbcrypto_polarssl.c, libvncserver/websockets.c: Add
+ support for different crypto implementations
+
+2011-09-11 Christian Beier <dontmind at freeshell.org>
+
+ * configure.ac, libvncserver/Makefile.am: Autotools: Fix OpenSSL and
+ GnuTLS advertisement.
+
+2011-09-11 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/rfbssl_gnutls.c: Fix libvncserver GnuTLS init. gnutls_certificate_set_x509_trust_file() returns the number of
+ processed certs and _not_ GNUTLS_E_SUCCESS (0) on success!
+
+2011-09-11 Christian Beier <dontmind at freeshell.org>
+
+ * AUTHORS, libvncserver/websockets.c: Update AUTHORS regarding the
+ websocket guys.
+
+2011-08-28 Gernot Tenchio <gernot at tenchio.de>
+
+ * configure.ac: configure: Add AM_SILENT_RULES Working with “silent make mode” makes debugging a lot of easier
+ since warnings wont shadowed by useless compiler noise
+
+2011-08-27 Gernot Tenchio <gernot at tenchio.de>
+
+ * CMakeLists.txt: cmake: set SOVERSION
+
+2011-09-11 Christian Beier <dontmind at freeshell.org>
+
+ * configure.ac, libvncserver/Makefile.am: Autotools: Fix OpenSSL and
+ GnuTLS advertisement.
+
+2011-09-11 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/rfbssl_gnutls.c: Fix libvncserver GnuTLS init. gnutls_certificate_set_x509_trust_file() returns the number of
+ processed certs and _not_ GNUTLS_E_SUCCESS (0) on success!
+
+2011-09-11 Christian Beier <dontmind at freeshell.org>
+
+ * AUTHORS, libvncserver/websockets.c: Update AUTHORS regarding the
+ websocket guys.
+
+2011-09-02 Gernot Tenchio <gernot at tenchio.de>
+
+ * libvncserver/websockets.c: websocket: Use a single buffer for
+ both, encoding and decoding
+
+2011-08-30 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * libvncserver/rfbssl_gnutls.c: rfbssl_gnutls: Merge
+ rfbssl_peek/rfbssl_read into one function
+
+2011-08-30 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * libvncserver/websockets.c: websockets: fix
+ webSocketCheckDisconnect() Do not consume the peeked data if no close frame was detected.
+
+2011-08-29 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * libvncserver/websockets.c: websockets: use 32bit Xor in
+ webSocketsDecodeHybi()
+
+2011-08-29 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * CMakeLists.txt: cmake: use sha1.c for websocket builds
+
+2011-08-25 Gernot Tenchio <gernot at tenchio.de>
+
+ * libvncserver/websockets.c: websockets: nothing to worry about
+
+2011-08-25 Gernot Tenchio <gernot at tenchio.de>
+
+ * libvncserver/websockets.c: websockets: added gcrypt based sha1
+ digest funtion
+
+2011-08-25 Joel Martin <jmartin at sentryds.com>
+
+ * common/sha1.c, common/sha1.h, libvncserver/Makefile.am,
+ libvncserver/websockets.c: Add sha1.*. Remove UTF-8 encode. Protocol
+ handling. Add common/sha1.h and common/sha1.c so that we have the SHA routines
+ even if openssl is not available. From the IETF SHA RFC example
+ code. Remove the UTF-8 encoding hack. This was really just an experiment. If the protocol passed in the handshake has "binary" then don't
+ base64 encode for the HyBi protocol. This will allow noVNC to
+ request the binary data be passed raw and not base64 encoded.
+ Unfortunately, the client doesn't speak first in VNC protocol (bad
+ original design). If it did then we could determine whether to
+ base64 encode or not based on the first HyBi frame from the client
+ and whether the binary bit is set or not. Oh well. Misc Cleanup: - Always free response and buf in handshake routine. - Remove some unused variables.
+
+2011-08-25 Gernot Tenchio <gernot at tenchio.de>
+
+ * CMakeLists.txt: cmake: make some noise
+
+2011-08-25 Gernot Tenchio <gernot at tenchio.de>
+
+ * libvncserver/rfbssl_gnutls.c: websockets: remove warning on 64bit
+ platforms
+
+2011-08-25 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * libvncserver/websockets.c: websockets: Removed debugging left over
+
+2011-08-25 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * libvncserver/websockets.c: websockets: Use callback functions for
+ encode/decode
+
+2011-08-25 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * libvncserver/rfbserver.c, libvncserver/sockets.c,
+ libvncserver/websockets.c, rfb/rfb.h: websockets: Move Hixie
+ disconnect hack to websockets.c Move the hixie disconnect hack to websockets.c. Removed the
+ remaining websockets vars from rfbClientPtr, so all websockets stuff
+ is hidden behind an opaque pointer.
+
+2011-08-25 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * libvncserver/rfbserver.c, libvncserver/sockets.c,
+ libvncserver/websockets.c, rfb/rfb.h: websockets: Initial HyBi
+ support
+
+2011-08-16 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * CMakeLists.txt: cmake: don't link sdl libs to vnc libraries Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-08-16 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * libvncserver/sockets.c, libvncserver/websockets.c, rfb/rfb.h:
+ websockets: Add wspath member to rfbClientRec Added wspath member to rfbClientRec which holds the path component
+ of the initial websocket request. Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-08-16 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * CMakeLists.txt, common/md5.c, common/md5.h,
+ libvncserver/Makefile.am, libvncserver/md5.c, libvncserver/md5.h:
+ Move libvncserver/md5* to common Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-08-16 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * CMakeLists.txt, rfb/rfbconfig.h.cmake: websockets: Add Websockets
+ support to CMakeLists.txt Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-08-16 Joel Martin <github at martintribe.org>
+
+ * libvncserver/Makefile.am, libvncserver/cargs.c: websockets: Add
+ SSL cert command line options. - Add --sslcertfile and --sslkeyfile. These should really be
+ combined with the existing x11vnc command line options for SSL
+ support. Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-08-17 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * configure.ac, libvncserver/Makefile.am,
+ libvncserver/rfbssl_gnutls.c, libvncserver/rfbssl_openssl.c:
+ websockets: add GnuTLS and OpenSSL support For now, only OpenSSL support is activated through configure, since
+ GnuTLS is only used in LibVNCClient. [jes: separated this out from the commit adding encryption support,
+ added autoconf support.] Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-08-16 Gernot Tenchio <gernot.tenchio at securepoint.de>
+
+ * libvncserver/Makefile.am, libvncserver/rfbserver.c,
+ libvncserver/rfbssl.h, libvncserver/rfbssl_none.c,
+ libvncserver/sockets.c, libvncserver/websockets.c, rfb/rfb.h:
+ websockets: Add encryption support [jes: moved out GnuTLS and OpenSSL support, added a dummy support,
+ to separate changes better, and to keep things compiling] Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-08-16 Joel Martin <jmartin at sentryds.com>
+
+ * libvncserver/websockets.c: websockets: Properly parse Hixie-76
+ handshake. Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-08-16 Joel Martin <github at martintribe.org>
+
+ * libvncserver/rfbserver.c, libvncserver/websockets.c: websockets:
+ Add UTF-8 encoding support. This is not completely standard UTF-8 encoding. Only code points
+ 0-255 are encoded and never encoded to more than two octets. Since
+ '\x00' is a WebSockets framing character, it's easier for all
+ parties to encode zero as '\xc4\x80', i.e. 194+128, i.e. UTF-8 256. This means that a random stream will be slightly more than 50%
+ larger using this encoding scheme. But it's easy CPU-wise for client
+ and server to decode/encode. This is especially important for
+ clients written in languages that have weak bitops, like Javascript
+ (i.e. the noVNC client). Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-08-16 Joel Martin <github at martintribe.org>
+
+ * libvncserver/rfbserver.c: websockets: Better disconnect detection. If the only thing we are waiting on is a WebSockets terminator, then
+ remove it from the stream early on in rfbProcessClientNormalMessage. Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-08-16 Joel Martin <github at martintribe.org>
+
+ * configure.ac, libvncserver/Makefile.am, libvncserver/md5.c,
+ libvncserver/md5.h, libvncserver/rfbserver.c,
+ libvncserver/sockets.c, libvncserver/websockets.c, rfb/rfb.h:
+ websockets: Initial WebSockets support. Has a bug: WebSocket client disconnects are not detected.
+ rfbSendFramebufferUpdate is doing a MSG_PEEK recv to determine if
+ enough data is available which prevents a disconnect from being
+ detected. Otherwise it's working pretty well. [jes: moved added struct members to the end for binary compatibility
+ with previous LibVNCServer versions, removed an unused variable] Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-08-17 Johannes Schindelin <johannes.schindelin at gmx.de>
+
+ * .gitignore: .gitignore: zippy has moved Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-07-25 Christian Beier <dontmind at freeshell.org>
+
+ * examples/android/README: Add installation hints to android example
+ README.
+
+2011-07-22 William Roberts <wroberts at sta.samsung.com>
+
+ * examples/android/jni/fbvncserver.c: Reduced memory footprint by
+ 50%
+
+2011-07-22 William Roberts <wroberts at sta.samsung.com>
+
+ * examples/android/jni/fbvncserver.c: Corrected resolution issue,
+ but screen is getting reported as wrong size
+
+2011-07-23 ckanru <ckanru at code.google.com>
+
+ * examples/android/jni/fbvncserver.c: Fixes running vncserver on
+ beagleboard/0xdroid and possibly any device without a touch screen.
+ Because fake touch screen always report zero when query device
+ information, coordinates transformation is not needed. Signed-off-by: Christian Beier <dontmind at freeshell.org>
+
+2011-07-23 Christian Beier <dontmind at freeshell.org>
+
+ * configure.ac, examples/Makefile.am, examples/android/Makefile.am,
+ rfb/rfb.h, vncterm/Makefile.am: Adopt autotools build system to
+ Android. LibVNCServer/LibVNCClient now build for Android!
+
+2011-07-23 Christian Beier <dontmind at freeshell.org>
+
+ * examples/android/README, examples/android/jni/Android.mk,
+ examples/android/jni/fbvncserver.c: Add androidvncserver example.
+
+2011-07-22 letsgoustc <letsgoustc at gmail.com>
+
+ * rfb/rfb.h: Make LibVNCServer build for Android. Signed-off-by: Christian Beier <dontmind at freeshell.org>
+
+2011-07-19 Joel Martin <github at martintribe.org>
+
+ * libvncserver/tight.c: tightPng: check even for SendGradientRect. Signed-off-by: Christian Beier <dontmind at freeshell.org>
+
+2011-07-19 Joel Martin <github at martintribe.org>
+
+ * CMakeLists.txt, configure.ac, libvncserver/Makefile.am,
+ libvncserver/rfbserver.c, libvncserver/stats.c,
+ libvncserver/tight.c, rfb/rfb.h, rfb/rfbconfig.h.cmake,
+ rfb/rfbproto.h: tightPng: Add initial tightPng encoding support. http://wiki.qemu.org/VNC_Tight_PNG Signed-off-by: Joel Martin <github at martintribe.org> Signed-off-by:
+ Christian Beier <dontmind at freeshell.org>
+
+2011-06-01 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/main.c, libvncserver/sockets.c: Remove some unused
+ variables.
+
+2010-11-14 George Kiagiadakis <kiagiadakis.george at gmail.com>
+
+ * libvncserver/sockets.c, rfb/rfb.h: Fix rfbProcessNewConnection to
+ return some value instead of void. BUG: 256891 Signed-off-by: Christian Beier <dontmind at freeshell.org>
+
+2010-11-10 George Kiagiadakis <kiagiadakis.george at gmail.com>
+
+ * libvncserver/main.c, libvncserver/sockets.c, rfb/rfb.h: Split two
+ event-loop related functions out of the rfbProcessEvents()
+ mechanism. This is required to be able to do proper event loop integration with
+ Qt. Idea was taken from vino's libvncserver fork. Signed-off-by: Christian Beier <dontmind at freeshell.org>
+
+2011-05-06 Cristian Rodríguez <crrodriguez at opensuse.org>
+
+ * libvncserver/tightvnc-filetransfer/filetransfermsg.c: Fix buffer
+ overflow Signed-off-by: Cristian Rodríguez <crrodriguez at opensuse.org>
+ Signed-off-by: Christian Beier <dontmind at freeshell.org>
+
+2011-04-30 Christian Beier <dontmind at freeshell.org>
+
+ * libvncserver/tight.c: Revert "Fix memory corruption bug." This reverts commit c1363fa9583ed41b94fbc79b3ff410b7d5189407. The proper fix was already in
+ 804335f9d296440bb708ca844f5d89b58b50b0c6.
+
+2011-04-28 Johannes Schindelin <johannes.schindelin at gmx.de>
+
+ * AUTHORS: UTF-8ify AUTHORS Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-04-28 Johannes Schindelin <johannes.schindelin at gmx.de>
+
+ * AUTHORS: Update AUTHORS Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2010-11-10 George Kiagiadakis <kiagiadakis.george at gmail.com>
+
+ * libvncserver/tight.c: Fix memory corruption bug. This bug occured when a second telepathy tubes client was connected
+ after the first one had disconnected and the channel (thus, the
+ screen too) had been destroyed. Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2010-11-10 George Kiagiadakis <kiagiadakis.george at gmail.com>
+
+ * common/zywrletemplate.c, libvncserver/auth.c,
+ libvncserver/rfbserver.c, libvncserver/scale.c,
+ libvncserver/scale.h, rfb/rfb.h: Fix compilation in c89 mode. Signed-off-by: Johannes Schindelin <johannes.schindelin at gmx.de>
+
+2011-04-27 Vic Lee <llyzs at 163.com>
+
+ * libvncclient/tls.c: Replace deprecated GnuTLS functions
+ gnutls_*_set_priority with gnutls_priority_set_direct. The functions gnutls_*_set_priority we used were marked deprecated
+ since latest GnuTLS version 2.12. However the replacement function
+ gnutls_priority_set_direct is available since 2.2, which is even
+ lower than our version requirement 2.4 in configure. The patch just
+ replace the deprecate function to fix the compile warning. Signed-off-by: Vic Lee <llyzs at 163.com> Signed-off-by: Johannes
+ Schindelin <johannes.schindelin at gmx.de>
+
+2011-03-30 Christian Beier <dontmind at freeshell.org>
+
+ * ChangeLog: Update ChangeLog for 0.9.8.
+
2011-03-29 Christian Beier <dontmind at freeshell.org>
* README: Remove RDP from the README description. We do VNC but no RDP. Pointed out by Vic Lee, thanks!
diff --git a/ica/x11/README b/ica/x11/README
index 62dbc25..499b72b 100644
--- a/ica/x11/README
+++ b/ica/x11/README
@@ -1,5 +1,439 @@
-Almost all of the code that can be found in sub-directories is taken from the
-x11vnc-project.
+LibVNCServer: A library for easy implementation of a VNC server.
+Copyright (C) 2001-2003 Johannes E. Schindelin
-x11vnc is Copyright (c) Karl Runge and published under GPLv2.
+If you already used LibVNCServer, you probably want to read NEWS.
+
+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,
+whereas when you drag the mouse while clicked you draw a line. The size of the
+blot 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 to the position of the pointer! If you are done with that demo, press
+the down or up arrows. If your viewer supports it, then the dimensions of the
+sheet change. 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. You can 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.
+
+Projects using it
+----------------------------------------
+
+VNC for KDE
+http://www.tjansen.de/krfb
+
+GemsVNC
+http://www.elilabs.com/~rj/gemsvnc/
+
+VNC for Netware
+http://forge.novell.com/modules/xfmod/project/?vncnw
+
+RDesktop
+http://rdesktop.sourceforge.net
+
+Mail me, if your application is missing!
+
+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);
+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 "webclients" directory).
+
+Hooks and IO functions
+----------------------
+
+There exist the following IO functions as members of rfbScreen:
+kbdAddEvent, kbdReleaseAllKeys, ptrAddEvent and setXCutText
+
+kbdAddEvent(rfbBool down,rfbKeySym 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 separated. 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.
+This, however, is how I implemented mutexes in case you don't need pthreads,
+and so don't need the mutex.
+
+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 of XFree86, 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
diff --git a/ica/x11/common/lzoconf.h b/ica/x11/common/lzoconf.h
index 1d0fe14..23c6ca9 100644
--- a/ica/x11/common/lzoconf.h
+++ b/ica/x11/common/lzoconf.h
@@ -44,9 +44,9 @@
#ifndef __LZOCONF_H_INCLUDED
#define __LZOCONF_H_INCLUDED 1
-#define LZO_VERSION 0x2050
-#define LZO_VERSION_STRING "2.05"
-#define LZO_VERSION_DATE "Apr 23 2011"
+#define LZO_VERSION 0x2060
+#define LZO_VERSION_STRING "2.06"
+#define LZO_VERSION_DATE "Aug 12 2011"
/* internal Autoconf configuration file - only used when building LZO */
#if defined(LZO_HAVE_CONFIG_H)
diff --git a/ica/x11/common/md5.c b/ica/x11/common/md5.c
new file mode 100644
index 0000000..e185bc1
--- /dev/null
+++ b/ica/x11/common/md5.c
@@ -0,0 +1,452 @@
+/* Functions to compute MD5 message digest of files or memory blocks.
+ according to the definition of MD5 in RFC 1321 from April 1992.
+ Copyright (C) 1995,1996,1997,1999,2000,2001,2005
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+/* Written by Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995. */
+
+#include <sys/types.h>
+
+# include <stdlib.h>
+# include <string.h>
+
+#include "md5.h"
+
+/* #ifdef _LIBC */
+# include <endian.h>
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define WORDS_BIGENDIAN 1
+# endif
+/* We need to keep the namespace clean so define the MD5 function
+ protected using leading __ . */
+# define md5_init_ctx __md5_init_ctx
+# define md5_process_block __md5_process_block
+# define md5_process_bytes __md5_process_bytes
+# define md5_finish_ctx __md5_finish_ctx
+# define md5_read_ctx __md5_read_ctx
+# define md5_stream __md5_stream
+# define md5_buffer __md5_buffer
+/* #endif */
+
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) \
+ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
+#else
+# define SWAP(n) (n)
+#endif
+
+void
+md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx);
+void
+md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx);
+
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. (RFC 1321, 3.1: Step 1) */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/* Initialize structure containing state of computation.
+ (RFC 1321, 3.3: Step 3) */
+void
+md5_init_ctx (ctx)
+ struct md5_ctx *ctx;
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+
+ ctx->total[0] = ctx->total[1] = 0;
+ ctx->buflen = 0;
+}
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result
+ must be in little endian byte order.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+void *
+md5_read_ctx (ctx, resbuf)
+ const struct md5_ctx *ctx;
+ void *resbuf;
+{
+ ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
+ ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B);
+ ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C);
+ ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D);
+
+ return resbuf;
+}
+
+/* Process the remaining bytes in the internal buffer and the usual
+ prolog according to the standard and write the result to RESBUF.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+void *
+md5_finish_ctx (ctx, resbuf)
+ struct md5_ctx *ctx;
+ void *resbuf;
+{
+ /* Take yet unprocessed bytes into account. */
+ md5_uint32 bytes = ctx->buflen;
+ size_t pad;
+
+ /* Now count remaining bytes. */
+ ctx->total[0] += bytes;
+ if (ctx->total[0] < bytes)
+ ++ctx->total[1];
+
+ pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
+ memcpy (&ctx->buffer[bytes], fillbuf, pad);
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer. */
+ *(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3);
+ *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3) |
+ (ctx->total[0] >> 29));
+
+ /* Process last bytes. */
+ md5_process_block (ctx->buffer, bytes + pad + 8, ctx);
+
+ return md5_read_ctx (ctx, resbuf);
+}
+
+/* Compute MD5 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+int
+md5_stream (stream, resblock)
+ FILE *stream;
+ void *resblock;
+{
+ /* Important: BLOCKSIZE must be a multiple of 64. */
+#define BLOCKSIZE 4096
+ struct md5_ctx ctx;
+ char buffer[BLOCKSIZE + 72];
+ size_t sum;
+
+ /* Initialize the computation context. */
+ md5_init_ctx (&ctx);
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ do
+ {
+ n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+ }
+ while (sum < BLOCKSIZE && n != 0);
+ if (n == 0 && ferror (stream))
+ return 1;
+
+ /* If end of file is reached, end the loop. */
+ if (n == 0)
+ break;
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ md5_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ /* Add the last bytes if necessary. */
+ if (sum > 0)
+ md5_process_bytes (buffer, sum, &ctx);
+
+ /* Construct result in desired memory. */
+ md5_finish_ctx (&ctx, resblock);
+ return 0;
+}
+
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+md5_buffer (buffer, len, resblock)
+ const char *buffer;
+ size_t len;
+ void *resblock;
+{
+ struct md5_ctx ctx;
+
+ /* Initialize the computation context. */
+ md5_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ md5_process_bytes (buffer, len, &ctx);
+
+ /* Put result in desired memory area. */
+ return md5_finish_ctx (&ctx, resblock);
+}
+
+
+void
+md5_process_bytes (buffer, len, ctx)
+ const void *buffer;
+ size_t len;
+ struct md5_ctx *ctx;
+{
+ /* When we already have some bits in our internal buffer concatenate
+ both inputs first. */
+ if (ctx->buflen != 0)
+ {
+ size_t left_over = ctx->buflen;
+ size_t add = 128 - left_over > len ? len : 128 - left_over;
+
+ memcpy (&ctx->buffer[left_over], buffer, add);
+ ctx->buflen += add;
+
+ if (ctx->buflen > 64)
+ {
+ md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
+
+ ctx->buflen &= 63;
+ /* The regions in the following copy operation cannot overlap. */
+ memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
+ ctx->buflen);
+ }
+
+ buffer = (const char *) buffer + add;
+ len -= add;
+ }
+
+ /* Process available complete blocks. */
+ if (len >= 64)
+ {
+#if !_STRING_ARCH_unaligned
+/* To check alignment gcc has an appropriate operator. Other
+ compilers don't. */
+# if __GNUC__ >= 2
+# define UNALIGNED_P(p) (((md5_uintptr) p) % __alignof__ (md5_uint32) != 0)
+# else
+# define UNALIGNED_P(p) (((md5_uintptr) p) % sizeof (md5_uint32) != 0)
+# endif
+ if (UNALIGNED_P (buffer))
+ while (len > 64)
+ {
+ md5_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+ buffer = (const char *) buffer + 64;
+ len -= 64;
+ }
+ else
+#endif
+ {
+ md5_process_block (buffer, len & ~63, ctx);
+ buffer = (const char *) buffer + (len & ~63);
+ len &= 63;
+ }
+ }
+
+ /* Move remaining bytes in internal buffer. */
+ if (len > 0)
+ {
+ size_t left_over = ctx->buflen;
+
+ memcpy (&ctx->buffer[left_over], buffer, len);
+ left_over += len;
+ if (left_over >= 64)
+ {
+ md5_process_block (ctx->buffer, 64, ctx);
+ left_over -= 64;
+ memcpy (ctx->buffer, &ctx->buffer[64], left_over);
+ }
+ ctx->buflen = left_over;
+ }
+}
+
+
+/* These are the four functions used in the four steps of the MD5 algorithm
+ and defined in the RFC 1321. The first function is a little bit optimized
+ (as found in Colin Plumbs public domain implementation). */
+/* #define FF(b, c, d) ((b & c) | (~b & d)) */
+#define FF(b, c, d) (d ^ (b & (c ^ d)))
+#define FG(b, c, d) FF (d, b, c)
+#define FH(b, c, d) (b ^ c ^ d)
+#define FI(b, c, d) (c ^ (b | ~d))
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0. */
+
+void
+md5_process_block (buffer, len, ctx)
+ const void *buffer;
+ size_t len;
+ struct md5_ctx *ctx;
+{
+ md5_uint32 correct_words[16];
+ const md5_uint32 *words = buffer;
+ size_t nwords = len / sizeof (md5_uint32);
+ const md5_uint32 *endp = words + nwords;
+ md5_uint32 A = ctx->A;
+ md5_uint32 B = ctx->B;
+ md5_uint32 C = ctx->C;
+ md5_uint32 D = ctx->D;
+
+ /* First increment the byte count. RFC 1321 specifies the possible
+ length of the file up to 2^64 bits. Here we only compute the
+ number of bytes. Do a double word increment. */
+ ctx->total[0] += len;
+ if (ctx->total[0] < len)
+ ++ctx->total[1];
+
+ /* Process all bytes in the buffer with 64 bytes in each round of
+ the loop. */
+ while (words < endp)
+ {
+ md5_uint32 *cwp = correct_words;
+ md5_uint32 A_save = A;
+ md5_uint32 B_save = B;
+ md5_uint32 C_save = C;
+ md5_uint32 D_save = D;
+
+ /* First round: using the given function, the context and a constant
+ the next context is computed. Because the algorithms processing
+ unit is a 32-bit word and it is determined to work on words in
+ little endian byte order we perhaps have to change the byte order
+ before the computation. To reduce the work for the next steps
+ we store the swapped words in the array CORRECT_WORDS. */
+
+#define OP(a, b, c, d, s, T) \
+ do \
+ { \
+ a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
+ ++words; \
+ CYCLIC (a, s); \
+ a += b; \
+ } \
+ while (0)
+
+ /* It is unfortunate that C does not provide an operator for
+ cyclic rotation. Hope the C compiler is smart enough. */
+#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
+
+ /* Before we start, one word to the strange constants.
+ They are defined in RFC 1321 as
+
+ T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
+ */
+
+ /* Round 1. */
+ OP (A, B, C, D, 7, 0xd76aa478);
+ OP (D, A, B, C, 12, 0xe8c7b756);
+ OP (C, D, A, B, 17, 0x242070db);
+ OP (B, C, D, A, 22, 0xc1bdceee);
+ OP (A, B, C, D, 7, 0xf57c0faf);
+ OP (D, A, B, C, 12, 0x4787c62a);
+ OP (C, D, A, B, 17, 0xa8304613);
+ OP (B, C, D, A, 22, 0xfd469501);
+ OP (A, B, C, D, 7, 0x698098d8);
+ OP (D, A, B, C, 12, 0x8b44f7af);
+ OP (C, D, A, B, 17, 0xffff5bb1);
+ OP (B, C, D, A, 22, 0x895cd7be);
+ OP (A, B, C, D, 7, 0x6b901122);
+ OP (D, A, B, C, 12, 0xfd987193);
+ OP (C, D, A, B, 17, 0xa679438e);
+ OP (B, C, D, A, 22, 0x49b40821);
+
+ /* For the second to fourth round we have the possibly swapped words
+ in CORRECT_WORDS. Redefine the macro to take an additional first
+ argument specifying the function to use. */
+#undef OP
+#define OP(f, a, b, c, d, k, s, T) \
+ do \
+ { \
+ a += f (b, c, d) + correct_words[k] + T; \
+ CYCLIC (a, s); \
+ a += b; \
+ } \
+ while (0)
+
+ /* Round 2. */
+ OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
+ OP (FG, D, A, B, C, 6, 9, 0xc040b340);
+ OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
+ OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
+ OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
+ OP (FG, D, A, B, C, 10, 9, 0x02441453);
+ OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
+ OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
+ OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
+ OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
+ OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
+ OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
+ OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
+ OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
+ OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
+ OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
+
+ /* Round 3. */
+ OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
+ OP (FH, D, A, B, C, 8, 11, 0x8771f681);
+ OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
+ OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
+ OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
+ OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
+ OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
+ OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
+ OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
+ OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
+ OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
+ OP (FH, B, C, D, A, 6, 23, 0x04881d05);
+ OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
+ OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
+ OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
+ OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
+
+ /* Round 4. */
+ OP (FI, A, B, C, D, 0, 6, 0xf4292244);
+ OP (FI, D, A, B, C, 7, 10, 0x432aff97);
+ OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
+ OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
+ OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
+ OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
+ OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
+ OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
+ OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
+ OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
+ OP (FI, C, D, A, B, 6, 15, 0xa3014314);
+ OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
+ OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
+ OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
+ OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
+ OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
+
+ /* Add the starting values of the context. */
+ A += A_save;
+ B += B_save;
+ C += C_save;
+ D += D_save;
+ }
+
+ /* Put checksum in context given as argument. */
+ ctx->A = A;
+ ctx->B = B;
+ ctx->C = C;
+ ctx->D = D;
+}
diff --git a/ica/x11/common/md5.h b/ica/x11/common/md5.h
new file mode 100644
index 0000000..b48545b
--- /dev/null
+++ b/ica/x11/common/md5.h
@@ -0,0 +1,148 @@
+/* Declaration of functions and data types used for MD5 sum computing
+ library functions.
+ Copyright (C) 1995-1997,1999,2000,2001,2004,2005
+ Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#ifndef _MD5_H
+#define _MD5_H 1
+
+#include <stdio.h>
+
+#if defined HAVE_LIMITS_H || _LIBC
+# include <limits.h>
+#endif
+
+#define MD5_DIGEST_SIZE 16
+#define MD5_BLOCK_SIZE 64
+
+/* The following contortions are an attempt to use the C preprocessor
+ to determine an unsigned integral type that is 32 bits wide. An
+ alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
+ doing that would require that the configure script compile and *run*
+ the resulting executable. Locally running cross-compiled executables
+ is usually not possible. */
+
+#ifdef _LIBC
+# include <stdint.h>
+typedef uint32_t md5_uint32;
+typedef uintptr_t md5_uintptr;
+#else
+# if defined __STDC__ && __STDC__
+# define UINT_MAX_32_BITS 4294967295U
+# else
+# define UINT_MAX_32_BITS 0xFFFFFFFF
+# endif
+
+/* If UINT_MAX isn't defined, assume it's a 32-bit type.
+ This should be valid for all systems GNU cares about because
+ that doesn't include 16-bit systems, and only modern systems
+ (that certainly have <limits.h>) have 64+-bit integral types. */
+
+# ifndef UINT_MAX
+# define UINT_MAX UINT_MAX_32_BITS
+# endif
+
+# if UINT_MAX == UINT_MAX_32_BITS
+ typedef unsigned int md5_uint32;
+# else
+# if USHRT_MAX == UINT_MAX_32_BITS
+ typedef unsigned short md5_uint32;
+# else
+# if ULONG_MAX == UINT_MAX_32_BITS
+ typedef unsigned long md5_uint32;
+# else
+ /* The following line is intended to evoke an error.
+ Using #error is not portable enough. */
+ "Cannot determine unsigned 32-bit data type."
+# endif
+# endif
+# endif
+/* We have to make a guess about the integer type equivalent in size
+ to pointers which should always be correct. */
+typedef unsigned long int md5_uintptr;
+#endif
+
+/* Structure to save state of computation between the single steps. */
+struct md5_ctx
+{
+ md5_uint32 A;
+ md5_uint32 B;
+ md5_uint32 C;
+ md5_uint32 D;
+
+ md5_uint32 total[2];
+ md5_uint32 buflen;
+ char buffer[128] __attribute__ ((__aligned__ (__alignof__ (md5_uint32))));
+};
+
+/*
+ * The following three functions are build up the low level used in
+ * the functions `md5_stream' and `md5_buffer'.
+ */
+
+/* Initialize structure containing state of computation.
+ (RFC 1321, 3.3: Step 3) */
+extern void __md5_init_ctx (struct md5_ctx *ctx) __THROW;
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+extern void __md5_process_block (const void *buffer, size_t len,
+ struct md5_ctx *ctx) __THROW;
+
+/* Starting with the result of former calls of this function (or the
+ initialization function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is NOT required that LEN is a multiple of 64. */
+extern void __md5_process_bytes (const void *buffer, size_t len,
+ struct md5_ctx *ctx) __THROW;
+
+/* Process the remaining bytes in the buffer and put result from CTX
+ in first 16 bytes following RESBUF. The result is always in little
+ endian byte order, so that a byte-wise output yields to the wanted
+ ASCII representation of the message digest.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+extern void *__md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) __THROW;
+
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest.
+
+ IMPORTANT: On some systems it is required that RESBUF is correctly
+ aligned for a 32 bits value. */
+extern void *__md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) __THROW;
+
+
+/* Compute MD5 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+extern int __md5_stream (FILE *stream, void *resblock) __THROW;
+
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+extern void *__md5_buffer (const char *buffer, size_t len,
+ void *resblock) __THROW;
+
+#endif /* md5.h */
diff --git a/ica/x11/common/minilzo.c b/ica/x11/common/minilzo.c
index 25a1f68..34ce0f0 100644
--- a/ica/x11/common/minilzo.c
+++ b/ica/x11/common/minilzo.c
@@ -1874,7 +1874,7 @@ extern "C" {
#undef LZO_HAVE_CONFIG_H
#include "minilzo.h"
-#if !defined(MINILZO_VERSION) || (MINILZO_VERSION != 0x2050)
+#if !defined(MINILZO_VERSION) || (MINILZO_VERSION != 0x2060)
# error "version mismatch in miniLZO source files"
#endif
@@ -2561,10 +2561,8 @@ LZOLIB_PUBLIC(lzo_hvoid_p, lzo_hmemset) (lzo_hvoid_p s, int c, lzo_hsize_t len)
#endif
#undef ACCCHK_ASSERT
-#if 0
#define WANT_lzo_bitops_clz32 1
#define WANT_lzo_bitops_clz64 1
-#endif
#define WANT_lzo_bitops_ctz32 1
#define WANT_lzo_bitops_ctz64 1
@@ -2611,7 +2609,7 @@ static __lzo_inline unsigned lzo_bitops_ctz64(lzo_uint64 v)
#define lzo_bitops_ctz64 lzo_bitops_ctz64
#endif
-#elif (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x030400ul) || (LZO_CC_INTELC && (__INTEL_COMPILER >= 1000)) || LZO_CC_LLVM)
+#elif (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x030400ul) || (LZO_CC_INTELC && (__INTEL_COMPILER >= 1000)) || (LZO_CC_LLVM && (!defined(__llvm_tools_version__) || (__llvm_tools_version__+0 >= 0x010500ul))))
#if !defined(lzo_bitops_clz32) && defined(WANT_lzo_bitops_clz32)
#define lzo_bitops_clz32(v) ((unsigned) __builtin_clz(v))
#endif
@@ -2688,25 +2686,25 @@ _lzo_config_check(void)
#endif
#if defined(lzo_bitops_clz32)
{ unsigned i; lzo_uint32 v = 1;
- for (i = 0; i < 31; i++, v <<= 1)
+ for (i = 0; i < 32; i++, v <<= 1)
r &= lzo_bitops_clz32(v) == 31 - i;
}
#endif
#if defined(lzo_bitops_clz64)
{ unsigned i; lzo_uint64 v = 1;
- for (i = 0; i < 63; i++, v <<= 1)
+ for (i = 0; i < 64; i++, v <<= 1)
r &= lzo_bitops_clz64(v) == 63 - i;
}
#endif
#if defined(lzo_bitops_ctz32)
{ unsigned i; lzo_uint32 v = 1;
- for (i = 0; i < 31; i++, v <<= 1)
+ for (i = 0; i < 32; i++, v <<= 1)
r &= lzo_bitops_ctz32(v) == i;
}
#endif
#if defined(lzo_bitops_ctz64)
{ unsigned i; lzo_uint64 v = 1;
- for (i = 0; i < 63; i++, v <<= 1)
+ for (i = 0; i < 64; i++, v <<= 1)
r &= lzo_bitops_ctz64(v) == i;
}
#endif
@@ -3091,9 +3089,13 @@ DVAL_ASSERT(lzo_xint dv, const lzo_bytep p)
# define do_compress LZO_CPP_ECONCAT2(DO_COMPRESS,_core)
#endif
-#if defined(UA_GET64)
+#if defined(UA_GET64) && (LZO_ABI_BIG_ENDIAN)
+# define WANT_lzo_bitops_clz64 1
+#elif defined(UA_GET64) && (LZO_ABI_LITTLE_ENDIAN)
# define WANT_lzo_bitops_ctz64 1
-#elif defined(UA_GET32)
+#elif defined(UA_GET32) && (LZO_ABI_BIG_ENDIAN)
+# define WANT_lzo_bitops_clz32 1
+#elif defined(UA_GET32) && (LZO_ABI_LITTLE_ENDIAN)
# define WANT_lzo_bitops_ctz32 1
#endif
@@ -3140,7 +3142,7 @@ static __lzo_inline unsigned lzo_bitops_ctz64(lzo_uint64 v)
#define lzo_bitops_ctz64 lzo_bitops_ctz64
#endif
-#elif (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x030400ul) || (LZO_CC_INTELC && (__INTEL_COMPILER >= 1000)) || LZO_CC_LLVM)
+#elif (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x030400ul) || (LZO_CC_INTELC && (__INTEL_COMPILER >= 1000)) || (LZO_CC_LLVM && (!defined(__llvm_tools_version__) || (__llvm_tools_version__+0 >= 0x010500ul))))
#if !defined(lzo_bitops_clz32) && defined(WANT_lzo_bitops_clz32)
#define lzo_bitops_clz32(v) ((unsigned) __builtin_clz(v))
#endif
@@ -3175,7 +3177,7 @@ do_compress ( const lzo_bytep in , lzo_uint in_len,
op = out;
ip = in;
- ii = ip - ti;
+ ii = ip;
ip += ti < 4 ? 4 - ti : 0;
for (;;)
@@ -3237,6 +3239,7 @@ next:
}
#endif
+ ii -= ti; ti = 0;
{
register lzo_uint t = pd(ip,ii);
if (t != 0)
@@ -3318,7 +3321,14 @@ next:
goto m_len_done;
} while (v == 0);
}
-#if (LZO_ABI_LITTLE_ENDIAN) && defined(lzo_bitops_ctz64)
+#if (LZO_ABI_BIG_ENDIAN) && defined(lzo_bitops_clz64)
+ m_len += lzo_bitops_clz64(v) / CHAR_BIT;
+#elif (LZO_ABI_BIG_ENDIAN)
+ if ((v >> (64 - CHAR_BIT)) == 0) do {
+ v <<= CHAR_BIT;
+ m_len += 1;
+ } while ((v >> (64 - CHAR_BIT)) == 0);
+#elif (LZO_ABI_LITTLE_ENDIAN) && defined(lzo_bitops_ctz64)
m_len += lzo_bitops_ctz64(v) / CHAR_BIT;
#elif (LZO_ABI_LITTLE_ENDIAN)
if ((v & UCHAR_MAX) == 0) do {
@@ -3341,7 +3351,14 @@ next:
goto m_len_done;
} while (v == 0);
}
-#if (LZO_ABI_LITTLE_ENDIAN) && defined(lzo_bitops_ctz32)
+#if (LZO_ABI_BIG_ENDIAN) && defined(lzo_bitops_clz32)
+ m_len += lzo_bitops_clz32(v) / CHAR_BIT;
+#elif (LZO_ABI_BIG_ENDIAN)
+ if ((v >> (32 - CHAR_BIT)) == 0) do {
+ v <<= CHAR_BIT;
+ m_len += 1;
+ } while ((v >> (32 - CHAR_BIT)) == 0);
+#elif (LZO_ABI_LITTLE_ENDIAN) && defined(lzo_bitops_ctz32)
m_len += lzo_bitops_ctz32(v) / CHAR_BIT;
#elif (LZO_ABI_LITTLE_ENDIAN)
if ((v & UCHAR_MAX) == 0) do {
@@ -3428,7 +3445,7 @@ m_len_done:
}
*out_len = pd(op, out);
- return pd(in_end,ii);
+ return pd(in_end,ii-ti);
}
LZO_PUBLIC(int)
diff --git a/ica/x11/common/minilzo.h b/ica/x11/common/minilzo.h
index 74fefa9..4c7b237 100644
--- a/ica/x11/common/minilzo.h
+++ b/ica/x11/common/minilzo.h
@@ -50,7 +50,7 @@
#ifndef __MINILZO_H
#define __MINILZO_H 1
-#define MINILZO_VERSION 0x2050
+#define MINILZO_VERSION 0x2060
#ifdef __LZOCONF_H
# error "you cannot use both LZO and miniLZO"
diff --git a/ica/x11/common/sha1.c b/ica/x11/common/sha1.c
new file mode 100644
index 0000000..988b188
--- /dev/null
+++ b/ica/x11/common/sha1.c
@@ -0,0 +1,411 @@
+/*
+ * Copyright (C) The Internet Society (2001). All Rights Reserved.
+ *
+ * This document and translations of it may be copied and furnished to
+ * others, and derivative works that comment on or otherwise explain it
+ * or assist in its implementation may be prepared, copied, published
+ * and distributed, in whole or in part, without restriction of any
+ * kind, provided that the above copyright notice and this paragraph are
+ * included on all such copies and derivative works. However, this
+ * document itself may not be modified in any way, such as by removing
+ * the copyright notice or references to the Internet Society or other
+ * Internet organizations, except as needed for the purpose of
+ * developing Internet standards in which case the procedures for
+ * copyrights defined in the Internet Standards process must be
+ * followed, or as required to translate it into languages other than
+ * English.
+ *
+ * The limited permissions granted above are perpetual and will not be
+ * revoked by the Internet Society or its successors or assigns.
+ *
+ * This document and the information contained herein is provided on an
+ * "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+ * TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+/*
+ * sha1.c
+ *
+ * Description:
+ * This file implements the Secure Hashing Algorithm 1 as
+ * defined in FIPS PUB 180-1 published April 17, 1995.
+ *
+ * The SHA-1, produces a 160-bit message digest for a given
+ * data stream. It should take about 2**n steps to find a
+ * message with the same digest as a given message and
+ * 2**(n/2) to find any two messages with the same digest,
+ * when n is the digest size in bits. Therefore, this
+ * algorithm can serve as a means of providing a
+ * "fingerprint" for a message.
+ *
+ * Portability Issues:
+ * SHA-1 is defined in terms of 32-bit "words". This code
+ * uses <stdint.h> (included via "sha1.h" to define 32 and 8
+ * bit unsigned integer types. If your C compiler does not
+ * support 32 bit unsigned integers, this code is not
+ * appropriate.
+ *
+ * Caveats:
+ * SHA-1 is designed to work with messages less than 2^64 bits
+ * long. Although SHA-1 allows a message digest to be generated
+ * for messages of any number of bits less than 2^64, this
+ * implementation only works with messages with a length that is
+ * a multiple of the size of an 8-bit character.
+ *
+ */
+
+#include "sha1.h"
+
+/*
+ * Define the SHA1 circular left shift macro
+ */
+#define SHA1CircularShift(bits,word) \
+ (((word) << (bits)) | ((word) >> (32-(bits))))
+
+/* Local Function Prototyptes */
+void SHA1PadMessage(SHA1Context *);
+void SHA1ProcessMessageBlock(SHA1Context *);
+
+/*
+ * SHA1Reset
+ *
+ * Description:
+ * This function will initialize the SHA1Context in preparation
+ * for computing a new SHA1 message digest.
+ *
+ * Parameters:
+ * context: [in/out]
+ * The context to reset.
+ *
+ * Returns:
+ * sha Error Code.
+ *
+ */
+int SHA1Reset(SHA1Context *context)
+{
+ if (!context)
+ {
+ return shaNull;
+ }
+
+ context->Length_Low = 0;
+ context->Length_High = 0;
+ context->Message_Block_Index = 0;
+
+ context->Intermediate_Hash[0] = 0x67452301;
+ context->Intermediate_Hash[1] = 0xEFCDAB89;
+ context->Intermediate_Hash[2] = 0x98BADCFE;
+ context->Intermediate_Hash[3] = 0x10325476;
+ context->Intermediate_Hash[4] = 0xC3D2E1F0;
+
+ context->Computed = 0;
+ context->Corrupted = 0;
+ return shaSuccess;
+}
+
+/*
+ * SHA1Result
+ *
+ * Description:
+ * This function will return the 160-bit message digest into the
+ * Message_Digest array provided by the caller.
+ * NOTE: The first octet of hash is stored in the 0th element,
+ * the last octet of hash in the 19th element.
+ *
+ * Parameters:
+ * context: [in/out]
+ * The context to use to calculate the SHA-1 hash.
+ * Message_Digest: [out]
+ * Where the digest is returned.
+ *
+ * Returns:
+ * sha Error Code.
+ *
+ */
+int SHA1Result( SHA1Context *context,
+ uint8_t Message_Digest[SHA1HashSize])
+{
+ int i;
+
+ if (!context || !Message_Digest)
+ {
+ return shaNull;
+ }
+
+ if (context->Corrupted)
+ {
+ return context->Corrupted;
+ }
+
+ if (!context->Computed)
+ {
+ SHA1PadMessage(context);
+ for(i=0; i<64; ++i)
+ {
+ /* message may be sensitive, clear it out */
+ context->Message_Block[i] = 0;
+ }
+ context->Length_Low = 0; /* and clear length */
+ context->Length_High = 0;
+ context->Computed = 1;
+ }
+
+ for(i = 0; i < SHA1HashSize; ++i)
+ {
+ Message_Digest[i] = context->Intermediate_Hash[i>>2]
+ >> 8 * ( 3 - ( i & 0x03 ) );
+ }
+
+ return shaSuccess;
+}
+
+/*
+ * SHA1Input
+ *
+ * Description:
+ * This function accepts an array of octets as the next portion
+ * of the message.
+ *
+ * Parameters:
+ * context: [in/out]
+ * The SHA context to update
+ * message_array: [in]
+ * An array of characters representing the next portion of
+ * the message.
+ * length: [in]
+ * The length of the message in message_array
+ *
+ * Returns:
+ * sha Error Code.
+ *
+ */
+int SHA1Input( SHA1Context *context,
+ const uint8_t *message_array,
+ unsigned length)
+{
+ if (!length)
+ {
+ return shaSuccess;
+ }
+
+ if (!context || !message_array)
+ {
+ return shaNull;
+ }
+
+ if (context->Computed)
+ {
+ context->Corrupted = shaStateError;
+ return shaStateError;
+ }
+
+ if (context->Corrupted)
+ {
+ return context->Corrupted;
+ }
+ while(length-- && !context->Corrupted)
+ {
+ context->Message_Block[context->Message_Block_Index++] =
+ (*message_array & 0xFF);
+
+ context->Length_Low += 8;
+ if (context->Length_Low == 0)
+ {
+ context->Length_High++;
+ if (context->Length_High == 0)
+ {
+ /* Message is too long */
+ context->Corrupted = 1;
+ }
+ }
+
+ if (context->Message_Block_Index == 64)
+ {
+ SHA1ProcessMessageBlock(context);
+ }
+
+ message_array++;
+ }
+
+ return shaSuccess;
+}
+
+/*
+ * SHA1ProcessMessageBlock
+ *
+ * Description:
+ * This function will process the next 512 bits of the message
+ * stored in the Message_Block array.
+ *
+ * Parameters:
+ * None.
+ *
+ * Returns:
+ * Nothing.
+ *
+ * Comments:
+ * Many of the variable names in this code, especially the
+ * single character names, were used because those were the
+ * names used in the publication.
+ *
+ *
+ */
+void SHA1ProcessMessageBlock(SHA1Context *context)
+{
+ const uint32_t K[] = { /* Constants defined in SHA-1 */
+ 0x5A827999,
+ 0x6ED9EBA1,
+ 0x8F1BBCDC,
+ 0xCA62C1D6
+ };
+ int t; /* Loop counter */
+ uint32_t temp; /* Temporary word value */
+ uint32_t W[80]; /* Word sequence */
+ uint32_t A, B, C, D, E; /* Word buffers */
+
+ /*
+ * Initialize the first 16 words in the array W
+ */
+ for(t = 0; t < 16; t++)
+ {
+ W[t] = context->Message_Block[t * 4] << 24;
+ W[t] |= context->Message_Block[t * 4 + 1] << 16;
+ W[t] |= context->Message_Block[t * 4 + 2] << 8;
+ W[t] |= context->Message_Block[t * 4 + 3];
+ }
+
+ for(t = 16; t < 80; t++)
+ {
+ W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]);
+ }
+
+ A = context->Intermediate_Hash[0];
+ B = context->Intermediate_Hash[1];
+ C = context->Intermediate_Hash[2];
+ D = context->Intermediate_Hash[3];
+ E = context->Intermediate_Hash[4];
+
+ for(t = 0; t < 20; t++)
+ {
+ temp = SHA1CircularShift(5,A) +
+ ((B & C) | ((~B) & D)) + E + W[t] + K[0];
+ E = D;
+ D = C;
+ C = SHA1CircularShift(30,B);
+ B = A;
+ A = temp;
+ }
+
+ for(t = 20; t < 40; t++)
+ {
+ temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1];
+ E = D;
+ D = C;
+ C = SHA1CircularShift(30,B);
+ B = A;
+ A = temp;
+ }
+
+ for(t = 40; t < 60; t++)
+ {
+ temp = SHA1CircularShift(5,A) +
+ ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];
+ E = D;
+ D = C;
+ C = SHA1CircularShift(30,B);
+ B = A;
+ A = temp;
+ }
+
+ for(t = 60; t < 80; t++)
+ {
+ temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3];
+ E = D;
+ D = C;
+ C = SHA1CircularShift(30,B);
+ B = A;
+ A = temp;
+ }
+
+ context->Intermediate_Hash[0] += A;
+ context->Intermediate_Hash[1] += B;
+ context->Intermediate_Hash[2] += C;
+ context->Intermediate_Hash[3] += D;
+ context->Intermediate_Hash[4] += E;
+
+ context->Message_Block_Index = 0;
+}
+
+
+/*
+ * SHA1PadMessage
+ *
+ * Description:
+ * According to the standard, the message must be padded to an even
+ * 512 bits. The first padding bit must be a '1'. The last 64
+ * bits represent the length of the original message. All bits in
+ * between should be 0. This function will pad the message
+ * according to those rules by filling the Message_Block array
+ * accordingly. It will also call the ProcessMessageBlock function
+ * provided appropriately. When it returns, it can be assumed that
+ * the message digest has been computed.
+ *
+ * Parameters:
+ * context: [in/out]
+ * The context to pad
+ * ProcessMessageBlock: [in]
+ * The appropriate SHA*ProcessMessageBlock function
+ * Returns:
+ * Nothing.
+ *
+ */
+
+void SHA1PadMessage(SHA1Context *context)
+{
+ /*
+ * Check to see if the current message block is too small to hold
+ * the initial padding bits and length. If so, we will pad the
+ * block, process it, and then continue padding into a second
+ * block.
+ */
+ if (context->Message_Block_Index > 55)
+ {
+ context->Message_Block[context->Message_Block_Index++] = 0x80;
+ while(context->Message_Block_Index < 64)
+ {
+ context->Message_Block[context->Message_Block_Index++] = 0;
+ }
+
+ SHA1ProcessMessageBlock(context);
+
+ while(context->Message_Block_Index < 56)
+ {
+ context->Message_Block[context->Message_Block_Index++] = 0;
+ }
+ }
+ else
+ {
+ context->Message_Block[context->Message_Block_Index++] = 0x80;
+ while(context->Message_Block_Index < 56)
+ {
+ context->Message_Block[context->Message_Block_Index++] = 0;
+ }
+ }
+
+ /*
+ * Store the message length as the last 8 octets
+ */
+ context->Message_Block[56] = context->Length_High >> 24;
+ context->Message_Block[57] = context->Length_High >> 16;
+ context->Message_Block[58] = context->Length_High >> 8;
+ context->Message_Block[59] = context->Length_High;
+ context->Message_Block[60] = context->Length_Low >> 24;
+ context->Message_Block[61] = context->Length_Low >> 16;
+ context->Message_Block[62] = context->Length_Low >> 8;
+ context->Message_Block[63] = context->Length_Low;
+
+ SHA1ProcessMessageBlock(context);
+}
diff --git a/ica/x11/common/sha1.h b/ica/x11/common/sha1.h
new file mode 100644
index 0000000..1d49b1b
--- /dev/null
+++ b/ica/x11/common/sha1.h
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) The Internet Society (2001). All Rights Reserved.
+ *
+ * This document and translations of it may be copied and furnished to
+ * others, and derivative works that comment on or otherwise explain it
+ * or assist in its implementation may be prepared, copied, published
+ * and distributed, in whole or in part, without restriction of any
+ * kind, provided that the above copyright notice and this paragraph are
+ * included on all such copies and derivative works. However, this
+ * document itself may not be modified in any way, such as by removing
+ * the copyright notice or references to the Internet Society or other
+ * Internet organizations, except as needed for the purpose of
+ * developing Internet standards in which case the procedures for
+ * copyrights defined in the Internet Standards process must be
+ * followed, or as required to translate it into languages other than
+ * English.
+ *
+ * The limited permissions granted above are perpetual and will not be
+ * revoked by the Internet Society or its successors or assigns.
+ *
+ * This document and the information contained herein is provided on an
+ * "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+ * TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ * HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+/*
+ * sha1.h
+ *
+ * Description:
+ * This is the header file for code which implements the Secure
+ * Hashing Algorithm 1 as defined in FIPS PUB 180-1 published
+ * April 17, 1995.
+ *
+ * Many of the variable names in this code, especially the
+ * single character names, were used because those were the names
+ * used in the publication.
+ *
+ * Please read the file sha1.c for more information.
+ *
+ */
+
+
+#ifndef _SHA1_H_
+#define _SHA1_H_
+
+#include <stdint.h>
+/*
+ * If you do not have the ISO standard stdint.h header file, then you
+ * must typdef the following:
+ * name meaning
+ * uint32_t unsigned 32 bit integer
+ * uint8_t unsigned 8 bit integer (i.e., unsigned char)
+ * int_least16_t integer of >= 16 bits
+ *
+ */
+
+#ifndef _SHA_enum_
+#define _SHA_enum_
+enum
+{
+ shaSuccess = 0,
+ shaNull, /* Null pointer parameter */
+ shaInputTooLong, /* input data too long */
+ shaStateError /* called Input after Result */
+};
+#endif
+#define SHA1HashSize 20
+
+/*
+ * This structure will hold context information for the SHA-1
+ * hashing operation
+ */
+typedef struct SHA1Context
+{
+ uint32_t Intermediate_Hash[SHA1HashSize/4]; /* Message Digest */
+
+ uint32_t Length_Low; /* Message length in bits */
+ uint32_t Length_High; /* Message length in bits */
+
+ /* Index into message block array */
+ int_least16_t Message_Block_Index;
+ uint8_t Message_Block[64]; /* 512-bit message blocks */
+
+ int Computed; /* Is the digest computed? */
+ int Corrupted; /* Is the message digest corrupted? */
+} SHA1Context;
+
+/*
+ * Function Prototypes
+ */
+int SHA1Reset( SHA1Context *);
+int SHA1Input( SHA1Context *,
+ const uint8_t *,
+ unsigned int);
+int SHA1Result( SHA1Context *,
+ uint8_t Message_Digest[SHA1HashSize]);
+
+#endif
diff --git a/ica/x11/common/turbojpeg.c b/ica/x11/common/turbojpeg.c
new file mode 100644
index 0000000..09df173
--- /dev/null
+++ b/ica/x11/common/turbojpeg.c
@@ -0,0 +1,854 @@
+/*
+ * Copyright (C)2009-2012 D. R. Commander. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * - Neither the name of the libjpeg-turbo Project nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* TurboJPEG/OSS: this implements the TurboJPEG API using libjpeg-turbo */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifndef JCS_EXTENSIONS
+#define JPEG_INTERNAL_OPTIONS
+#endif
+#include <jpeglib.h>
+#include <jerror.h>
+#include <setjmp.h>
+#include "./turbojpeg.h"
+
+#define PAD(v, p) ((v+(p)-1)&(~((p)-1)))
+
+#define CSTATE_START 100
+#define DSTATE_START 200
+#define MEMZERO(ptr, size) memset(ptr, 0, size)
+
+#ifndef min
+ #define min(a,b) ((a)<(b)?(a):(b))
+#endif
+
+#ifndef max
+ #define max(a,b) ((a)>(b)?(a):(b))
+#endif
+
+
+/* Error handling (based on example in example.c) */
+
+static char errStr[JMSG_LENGTH_MAX]="No error";
+
+struct my_error_mgr
+{
+ struct jpeg_error_mgr pub;
+ jmp_buf setjmp_buffer;
+};
+typedef struct my_error_mgr *my_error_ptr;
+
+static void my_error_exit(j_common_ptr cinfo)
+{
+ my_error_ptr myerr=(my_error_ptr)cinfo->err;
+ (*cinfo->err->output_message)(cinfo);
+ longjmp(myerr->setjmp_buffer, 1);
+}
+
+/* Based on output_message() in jerror.c */
+
+static void my_output_message(j_common_ptr cinfo)
+{
+ (*cinfo->err->format_message)(cinfo, errStr);
+}
+
+
+/* Global structures, macros, etc. */
+
+enum {COMPRESS=1, DECOMPRESS=2};
+
+typedef struct _tjinstance
+{
+ struct jpeg_compress_struct cinfo;
+ struct jpeg_decompress_struct dinfo;
+ struct jpeg_destination_mgr jdst;
+ struct jpeg_source_mgr jsrc;
+ struct my_error_mgr jerr;
+ int init;
+} tjinstance;
+
+static const int pixelsize[TJ_NUMSAMP]={3, 3, 3, 1, 3};
+
+#define NUMSF 4
+static const tjscalingfactor sf[NUMSF]={
+ {1, 1},
+ {1, 2},
+ {1, 4},
+ {1, 8}
+};
+
+#define _throw(m) {snprintf(errStr, JMSG_LENGTH_MAX, "%s", m); \
+ retval=-1; goto bailout;}
+#define getinstance(handle) tjinstance *this=(tjinstance *)handle; \
+ j_compress_ptr cinfo=NULL; j_decompress_ptr dinfo=NULL; \
+ (void) cinfo; (void) dinfo; /* silence warnings */ \
+ if(!this) {snprintf(errStr, JMSG_LENGTH_MAX, "Invalid handle"); \
+ return -1;} \
+ cinfo=&this->cinfo; dinfo=&this->dinfo;
+
+static int getPixelFormat(int pixelSize, int flags)
+{
+ if(pixelSize==1) return TJPF_GRAY;
+ if(pixelSize==3)
+ {
+ if(flags&TJ_BGR) return TJPF_BGR;
+ else return TJPF_RGB;
+ }
+ if(pixelSize==4)
+ {
+ if(flags&TJ_ALPHAFIRST)
+ {
+ if(flags&TJ_BGR) return TJPF_XBGR;
+ else return TJPF_XRGB;
+ }
+ else
+ {
+ if(flags&TJ_BGR) return TJPF_BGRX;
+ else return TJPF_RGBX;
+ }
+ }
+ return -1;
+}
+
+static int setCompDefaults(struct jpeg_compress_struct *cinfo,
+ int pixelFormat, int subsamp, int jpegQual)
+{
+ int retval=0;
+
+ switch(pixelFormat)
+ {
+ case TJPF_GRAY:
+ cinfo->in_color_space=JCS_GRAYSCALE; break;
+ #if JCS_EXTENSIONS==1
+ case TJPF_RGB:
+ cinfo->in_color_space=JCS_EXT_RGB; break;
+ case TJPF_BGR:
+ cinfo->in_color_space=JCS_EXT_BGR; break;
+ case TJPF_RGBX:
+ case TJPF_RGBA:
+ cinfo->in_color_space=JCS_EXT_RGBX; break;
+ case TJPF_BGRX:
+ case TJPF_BGRA:
+ cinfo->in_color_space=JCS_EXT_BGRX; break;
+ case TJPF_XRGB:
+ case TJPF_ARGB:
+ cinfo->in_color_space=JCS_EXT_XRGB; break;
+ case TJPF_XBGR:
+ case TJPF_ABGR:
+ cinfo->in_color_space=JCS_EXT_XBGR; break;
+ #else
+ case TJPF_RGB:
+ case TJPF_BGR:
+ case TJPF_RGBX:
+ case TJPF_BGRX:
+ case TJPF_XRGB:
+ case TJPF_XBGR:
+ case TJPF_RGBA:
+ case TJPF_BGRA:
+ case TJPF_ARGB:
+ case TJPF_ABGR:
+ cinfo->in_color_space=JCS_RGB; pixelFormat=TJPF_RGB;
+ break;
+ #endif
+ }
+
+ cinfo->input_components=tjPixelSize[pixelFormat];
+ jpeg_set_defaults(cinfo);
+ if(jpegQual>=0)
+ {
+ jpeg_set_quality(cinfo, jpegQual, TRUE);
+ if(jpegQual>=96) cinfo->dct_method=JDCT_ISLOW;
+ else cinfo->dct_method=JDCT_FASTEST;
+ }
+ if(subsamp==TJSAMP_GRAY)
+ jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
+ else
+ jpeg_set_colorspace(cinfo, JCS_YCbCr);
+
+ cinfo->comp_info[0].h_samp_factor=tjMCUWidth[subsamp]/8;
+ cinfo->comp_info[1].h_samp_factor=1;
+ cinfo->comp_info[2].h_samp_factor=1;
+ cinfo->comp_info[0].v_samp_factor=tjMCUHeight[subsamp]/8;
+ cinfo->comp_info[1].v_samp_factor=1;
+ cinfo->comp_info[2].v_samp_factor=1;
+
+ return retval;
+}
+
+static int setDecompDefaults(struct jpeg_decompress_struct *dinfo,
+ int pixelFormat)
+{
+ int retval=0;
+
+ switch(pixelFormat)
+ {
+ case TJPF_GRAY:
+ dinfo->out_color_space=JCS_GRAYSCALE; break;
+ #if JCS_EXTENSIONS==1
+ case TJPF_RGB:
+ dinfo->out_color_space=JCS_EXT_RGB; break;
+ case TJPF_BGR:
+ dinfo->out_color_space=JCS_EXT_BGR; break;
+ case TJPF_RGBX:
+ dinfo->out_color_space=JCS_EXT_RGBX; break;
+ case TJPF_BGRX:
+ dinfo->out_color_space=JCS_EXT_BGRX; break;
+ case TJPF_XRGB:
+ dinfo->out_color_space=JCS_EXT_XRGB; break;
+ case TJPF_XBGR:
+ dinfo->out_color_space=JCS_EXT_XBGR; break;
+ #if JCS_ALPHA_EXTENSIONS==1
+ case TJPF_RGBA:
+ dinfo->out_color_space=JCS_EXT_RGBA; break;
+ case TJPF_BGRA:
+ dinfo->out_color_space=JCS_EXT_BGRA; break;
+ case TJPF_ARGB:
+ dinfo->out_color_space=JCS_EXT_ARGB; break;
+ case TJPF_ABGR:
+ dinfo->out_color_space=JCS_EXT_ABGR; break;
+ #endif
+ #else
+ case TJPF_RGB:
+ case TJPF_BGR:
+ case TJPF_RGBX:
+ case TJPF_BGRX:
+ case TJPF_XRGB:
+ case TJPF_XBGR:
+ case TJPF_RGBA:
+ case TJPF_BGRA:
+ case TJPF_ARGB:
+ case TJPF_ABGR:
+ dinfo->out_color_space=JCS_RGB; break;
+ #endif
+ default:
+ _throw("Unsupported pixel format");
+ }
+
+ bailout:
+ return retval;
+}
+
+
+static int getSubsamp(j_decompress_ptr dinfo)
+{
+ int retval=-1, i, k;
+ for(i=0; i<NUMSUBOPT; i++)
+ {
+ if(dinfo->num_components==pixelsize[i])
+ {
+ if(dinfo->comp_info[0].h_samp_factor==tjMCUWidth[i]/8
+ && dinfo->comp_info[0].v_samp_factor==tjMCUHeight[i]/8)
+ {
+ int match=0;
+ for(k=1; k<dinfo->num_components; k++)
+ {
+ if(dinfo->comp_info[k].h_samp_factor==1
+ && dinfo->comp_info[k].v_samp_factor==1)
+ match++;
+ }
+ if(match==dinfo->num_components-1)
+ {
+ retval=i; break;
+ }
+ }
+ }
+ }
+ return retval;
+}
+
+
+#ifndef JCS_EXTENSIONS
+
+/* Conversion functions to emulate the colorspace extensions. This allows the
+ TurboJPEG wrapper to be used with libjpeg */
+
+#define TORGB(PS, ROFFSET, GOFFSET, BOFFSET) { \
+ int rowPad=pitch-width*PS; \
+ while(height--) \
+ { \
+ unsigned char *endOfRow=src+width*PS; \
+ while(src<endOfRow) \
+ { \
+ dst[RGB_RED]=src[ROFFSET]; \
+ dst[RGB_GREEN]=src[GOFFSET]; \
+ dst[RGB_BLUE]=src[BOFFSET]; \
+ dst+=RGB_PIXELSIZE; src+=PS; \
+ } \
+ src+=rowPad; \
+ } \
+}
+
+static unsigned char *toRGB(unsigned char *src, int width, int pitch,
+ int height, int pixelFormat, unsigned char *dst)
+{
+ unsigned char *retval=src;
+ switch(pixelFormat)
+ {
+ case TJPF_RGB:
+ #if RGB_RED!=0 || RGB_GREEN!=1 || RGB_BLUE!=2 || RGB_PIXELSIZE!=3
+ retval=dst; TORGB(3, 0, 1, 2);
+ #endif
+ break;
+ case TJPF_BGR:
+ #if RGB_RED!=2 || RGB_GREEN!=1 || RGB_BLUE!=0 || RGB_PIXELSIZE!=3
+ retval=dst; TORGB(3, 2, 1, 0);
+ #endif
+ break;
+ case TJPF_RGBX:
+ case TJPF_RGBA:
+ #if RGB_RED!=0 || RGB_GREEN!=1 || RGB_BLUE!=2 || RGB_PIXELSIZE!=4
+ retval=dst; TORGB(4, 0, 1, 2);
+ #endif
+ break;
+ case TJPF_BGRX:
+ case TJPF_BGRA:
+ #if RGB_RED!=2 || RGB_GREEN!=1 || RGB_BLUE!=0 || RGB_PIXELSIZE!=4
+ retval=dst; TORGB(4, 2, 1, 0);
+ #endif
+ break;
+ case TJPF_XRGB:
+ case TJPF_ARGB:
+ #if RGB_RED!=1 || RGB_GREEN!=2 || RGB_BLUE!=3 || RGB_PIXELSIZE!=4
+ retval=dst; TORGB(4, 1, 2, 3);
+ #endif
+ break;
+ case TJPF_XBGR:
+ case TJPF_ABGR:
+ #if RGB_RED!=3 || RGB_GREEN!=2 || RGB_BLUE!=1 || RGB_PIXELSIZE!=4
+ retval=dst; TORGB(4, 3, 2, 1);
+ #endif
+ break;
+ }
+ return retval;
+}
+
+#define FROMRGB(PS, ROFFSET, GOFFSET, BOFFSET, SETALPHA) { \
+ int rowPad=pitch-width*PS; \
+ while(height--) \
+ { \
+ unsigned char *endOfRow=dst+width*PS; \
+ while(dst<endOfRow) \
+ { \
+ dst[ROFFSET]=src[RGB_RED]; \
+ dst[GOFFSET]=src[RGB_GREEN]; \
+ dst[BOFFSET]=src[RGB_BLUE]; \
+ SETALPHA \
+ dst+=PS; src+=RGB_PIXELSIZE; \
+ } \
+ dst+=rowPad; \
+ } \
+}
+
+static void fromRGB(unsigned char *src, unsigned char *dst, int width,
+ int pitch, int height, int pixelFormat)
+{
+ switch(pixelFormat)
+ {
+ case TJPF_RGB:
+ #if RGB_RED!=0 || RGB_GREEN!=1 || RGB_BLUE!=2 || RGB_PIXELSIZE!=3
+ FROMRGB(3, 0, 1, 2,);
+ #endif
+ break;
+ case TJPF_BGR:
+ #if RGB_RED!=2 || RGB_GREEN!=1 || RGB_BLUE!=0 || RGB_PIXELSIZE!=3
+ FROMRGB(3, 2, 1, 0,);
+ #endif
+ break;
+ case TJPF_RGBX:
+ #if RGB_RED!=0 || RGB_GREEN!=1 || RGB_BLUE!=2 || RGB_PIXELSIZE!=4
+ FROMRGB(4, 0, 1, 2,);
+ #endif
+ break;
+ case TJPF_RGBA:
+ #if RGB_RED!=0 || RGB_GREEN!=1 || RGB_BLUE!=2 || RGB_PIXELSIZE!=4
+ FROMRGB(4, 0, 1, 2, dst[3]=0xFF;);
+ #endif
+ break;
+ case TJPF_BGRX:
+ #if RGB_RED!=2 || RGB_GREEN!=1 || RGB_BLUE!=0 || RGB_PIXELSIZE!=4
+ FROMRGB(4, 2, 1, 0,);
+ #endif
+ break;
+ case TJPF_BGRA:
+ #if RGB_RED!=2 || RGB_GREEN!=1 || RGB_BLUE!=0 || RGB_PIXELSIZE!=4
+ FROMRGB(4, 2, 1, 0, dst[3]=0xFF;); return;
+ #endif
+ break;
+ case TJPF_XRGB:
+ #if RGB_RED!=1 || RGB_GREEN!=2 || RGB_BLUE!=3 || RGB_PIXELSIZE!=4
+ FROMRGB(4, 1, 2, 3,); return;
+ #endif
+ break;
+ case TJPF_ARGB:
+ #if RGB_RED!=1 || RGB_GREEN!=2 || RGB_BLUE!=3 || RGB_PIXELSIZE!=4
+ FROMRGB(4, 1, 2, 3, dst[0]=0xFF;); return;
+ #endif
+ break;
+ case TJPF_XBGR:
+ #if RGB_RED!=3 || RGB_GREEN!=2 || RGB_BLUE!=1 || RGB_PIXELSIZE!=4
+ FROMRGB(4, 3, 2, 1,); return;
+ #endif
+ break;
+ case TJPF_ABGR:
+ #if RGB_RED!=3 || RGB_GREEN!=2 || RGB_BLUE!=1 || RGB_PIXELSIZE!=4
+ FROMRGB(4, 3, 2, 1, dst[0]=0xFF;); return;
+ #endif
+ break;
+ }
+}
+
+#endif
+
+
+/* General API functions */
+
+DLLEXPORT char* DLLCALL tjGetErrorStr(void)
+{
+ return errStr;
+}
+
+
+DLLEXPORT int DLLCALL tjDestroy(tjhandle handle)
+{
+ getinstance(handle);
+ if(setjmp(this->jerr.setjmp_buffer)) return -1;
+ if(this->init&COMPRESS) jpeg_destroy_compress(cinfo);
+ if(this->init&DECOMPRESS) jpeg_destroy_decompress(dinfo);
+ free(this);
+ return 0;
+}
+
+
+/* Compressor */
+
+static boolean empty_output_buffer(j_compress_ptr cinfo)
+{
+ ERREXIT(cinfo, JERR_BUFFER_SIZE);
+ return TRUE;
+}
+
+static void dst_noop(j_compress_ptr cinfo)
+{
+}
+
+static tjhandle _tjInitCompress(tjinstance *this)
+{
+ /* This is also straight out of example.c */
+ this->cinfo.err=jpeg_std_error(&this->jerr.pub);
+ this->jerr.pub.error_exit=my_error_exit;
+ this->jerr.pub.output_message=my_output_message;
+
+ if(setjmp(this->jerr.setjmp_buffer))
+ {
+ /* If we get here, the JPEG code has signaled an error. */
+ if(this) free(this); return NULL;
+ }
+
+ jpeg_create_compress(&this->cinfo);
+ this->cinfo.dest=&this->jdst;
+ this->jdst.init_destination=dst_noop;
+ this->jdst.empty_output_buffer=empty_output_buffer;
+ this->jdst.term_destination=dst_noop;
+
+ this->init|=COMPRESS;
+ return (tjhandle)this;
+}
+
+DLLEXPORT tjhandle DLLCALL tjInitCompress(void)
+{
+ tjinstance *this=NULL;
+ if((this=(tjinstance *)malloc(sizeof(tjinstance)))==NULL)
+ {
+ snprintf(errStr, JMSG_LENGTH_MAX,
+ "tjInitCompress(): Memory allocation failure");
+ return NULL;
+ }
+ MEMZERO(this, sizeof(tjinstance));
+ return _tjInitCompress(this);
+}
+
+
+DLLEXPORT unsigned long DLLCALL tjBufSize(int width, int height,
+ int jpegSubsamp)
+{
+ unsigned long retval=0; int mcuw, mcuh, chromasf;
+ if(width<1 || height<1 || jpegSubsamp<0 || jpegSubsamp>=NUMSUBOPT)
+ _throw("tjBufSize(): Invalid argument");
+
+ /*
+ * This allows for rare corner cases in which a JPEG image can actually be
+ * larger than the uncompressed input (we wouldn't mention it if it hadn't
+ * happened before.)
+ */
+ mcuw=tjMCUWidth[jpegSubsamp];
+ mcuh=tjMCUHeight[jpegSubsamp];
+ chromasf=jpegSubsamp==TJSAMP_GRAY? 0: 4*64/(mcuw*mcuh);
+ retval=PAD(width, mcuw) * PAD(height, mcuh) * (2 + chromasf) + 2048;
+
+ bailout:
+ return retval;
+}
+
+
+DLLEXPORT unsigned long DLLCALL TJBUFSIZE(int width, int height)
+{
+ unsigned long retval=0;
+ if(width<1 || height<1)
+ _throw("TJBUFSIZE(): Invalid argument");
+
+ /*
+ * This allows for rare corner cases in which a JPEG image can actually be
+ * larger than the uncompressed input (we wouldn't mention it if it hadn't
+ * happened before.)
+ */
+ retval=PAD(width, 16) * PAD(height, 16) * 6 + 2048;
+
+ bailout:
+ return retval;
+}
+
+
+DLLEXPORT int DLLCALL tjCompress2(tjhandle handle, unsigned char *srcBuf,
+ int width, int pitch, int height, int pixelFormat, unsigned char **jpegBuf,
+ unsigned long *jpegSize, int jpegSubsamp, int jpegQual, int flags)
+{
+ int i, retval=0; JSAMPROW *row_pointer=NULL;
+ #ifndef JCS_EXTENSIONS
+ unsigned char *rgbBuf=NULL;
+ #endif
+
+ getinstance(handle)
+ if((this->init&COMPRESS)==0)
+ _throw("tjCompress2(): Instance has not been initialized for compression");
+
+ if(srcBuf==NULL || width<=0 || pitch<0 || height<=0 || pixelFormat<0
+ || pixelFormat>=TJ_NUMPF || jpegBuf==NULL || jpegSize==NULL
+ || jpegSubsamp<0 || jpegSubsamp>=NUMSUBOPT || jpegQual<0 || jpegQual>100)
+ _throw("tjCompress2(): Invalid argument");
+
+ if(setjmp(this->jerr.setjmp_buffer))
+ {
+ /* If we get here, the JPEG code has signaled an error. */
+ retval=-1;
+ goto bailout;
+ }
+
+ if(pitch==0) pitch=width*tjPixelSize[pixelFormat];
+
+ #ifndef JCS_EXTENSIONS
+ if(pixelFormat!=TJPF_GRAY)
+ {
+ rgbBuf=(unsigned char *)malloc(width*height*RGB_PIXELSIZE);
+ if(!rgbBuf) _throw("tjCompress2(): Memory allocation failure");
+ srcBuf=toRGB(srcBuf, width, pitch, height, pixelFormat, rgbBuf);
+ pitch=width*RGB_PIXELSIZE;
+ }
+ #endif
+
+ cinfo->image_width=width;
+ cinfo->image_height=height;
+
+ if(flags&TJFLAG_FORCEMMX) putenv("JSIMD_FORCEMMX=1");
+ else if(flags&TJFLAG_FORCESSE) putenv("JSIMD_FORCESSE=1");
+ else if(flags&TJFLAG_FORCESSE2) putenv("JSIMD_FORCESSE2=1");
+
+ if(setCompDefaults(cinfo, pixelFormat, jpegSubsamp, jpegQual)==-1)
+ return -1;
+
+ this->jdst.next_output_byte=*jpegBuf;
+ this->jdst.free_in_buffer=tjBufSize(width, height, jpegSubsamp);
+
+ jpeg_start_compress(cinfo, TRUE);
+ if((row_pointer=(JSAMPROW *)malloc(sizeof(JSAMPROW)*height))==NULL)
+ _throw("tjCompress2(): Memory allocation failure");
+ for(i=0; i<height; i++)
+ {
+ if(flags&TJFLAG_BOTTOMUP) row_pointer[i]=&srcBuf[(height-i-1)*pitch];
+ else row_pointer[i]=&srcBuf[i*pitch];
+ }
+ while(cinfo->next_scanline<cinfo->image_height)
+ {
+ jpeg_write_scanlines(cinfo, &row_pointer[cinfo->next_scanline],
+ cinfo->image_height-cinfo->next_scanline);
+ }
+ jpeg_finish_compress(cinfo);
+ *jpegSize=tjBufSize(width, height, jpegSubsamp)
+ -(unsigned long)(this->jdst.free_in_buffer);
+
+ bailout:
+ if(cinfo->global_state>CSTATE_START) jpeg_abort_compress(cinfo);
+ #ifndef JCS_EXTENSIONS
+ if(rgbBuf) free(rgbBuf);
+ #endif
+ if(row_pointer) free(row_pointer);
+ return retval;
+}
+
+DLLEXPORT int DLLCALL tjCompress(tjhandle handle, unsigned char *srcBuf,
+ int width, int pitch, int height, int pixelSize, unsigned char *jpegBuf,
+ unsigned long *jpegSize, int jpegSubsamp, int jpegQual, int flags)
+{
+ int retval=0; unsigned long size;
+ retval=tjCompress2(handle, srcBuf, width, pitch, height,
+ getPixelFormat(pixelSize, flags), &jpegBuf, &size, jpegSubsamp, jpegQual,
+ flags);
+ *jpegSize=size;
+ return retval;
+}
+
+
+/* Decompressor */
+
+static boolean fill_input_buffer(j_decompress_ptr dinfo)
+{
+ ERREXIT(dinfo, JERR_BUFFER_SIZE);
+ return TRUE;
+}
+
+static void skip_input_data(j_decompress_ptr dinfo, long num_bytes)
+{
+ dinfo->src->next_input_byte += (size_t) num_bytes;
+ dinfo->src->bytes_in_buffer -= (size_t) num_bytes;
+}
+
+static void src_noop(j_decompress_ptr dinfo)
+{
+}
+
+static tjhandle _tjInitDecompress(tjinstance *this)
+{
+ /* This is also straight out of example.c */
+ this->dinfo.err=jpeg_std_error(&this->jerr.pub);
+ this->jerr.pub.error_exit=my_error_exit;
+ this->jerr.pub.output_message=my_output_message;
+
+ if(setjmp(this->jerr.setjmp_buffer))
+ {
+ /* If we get here, the JPEG code has signaled an error. */
+ if(this) free(this); return NULL;
+ }
+
+ jpeg_create_decompress(&this->dinfo);
+ this->dinfo.src=&this->jsrc;
+ this->jsrc.init_source=src_noop;
+ this->jsrc.fill_input_buffer=fill_input_buffer;
+ this->jsrc.skip_input_data=skip_input_data;
+ this->jsrc.resync_to_restart=jpeg_resync_to_restart;
+ this->jsrc.term_source=src_noop;
+
+ this->init|=DECOMPRESS;
+ return (tjhandle)this;
+}
+
+DLLEXPORT tjhandle DLLCALL tjInitDecompress(void)
+{
+ tjinstance *this;
+ if((this=(tjinstance *)malloc(sizeof(tjinstance)))==NULL)
+ {
+ snprintf(errStr, JMSG_LENGTH_MAX,
+ "tjInitDecompress(): Memory allocation failure");
+ return NULL;
+ }
+ MEMZERO(this, sizeof(tjinstance));
+ return _tjInitDecompress(this);
+}
+
+
+DLLEXPORT int DLLCALL tjDecompressHeader2(tjhandle handle,
+ unsigned char *jpegBuf, unsigned long jpegSize, int *width, int *height,
+ int *jpegSubsamp)
+{
+ int retval=0;
+
+ getinstance(handle);
+ if((this->init&DECOMPRESS)==0)
+ _throw("tjDecompressHeader2(): Instance has not been initialized for decompression");
+
+ if(jpegBuf==NULL || jpegSize<=0 || width==NULL || height==NULL
+ || jpegSubsamp==NULL)
+ _throw("tjDecompressHeader2(): Invalid argument");
+
+ if(setjmp(this->jerr.setjmp_buffer))
+ {
+ /* If we get here, the JPEG code has signaled an error. */
+ return -1;
+ }
+
+ this->jsrc.bytes_in_buffer=jpegSize;
+ this->jsrc.next_input_byte=jpegBuf;
+ jpeg_read_header(dinfo, TRUE);
+
+ *width=dinfo->image_width;
+ *height=dinfo->image_height;
+ *jpegSubsamp=getSubsamp(dinfo);
+
+ jpeg_abort_decompress(dinfo);
+
+ if(*jpegSubsamp<0)
+ _throw("tjDecompressHeader2(): Could not determine subsampling type for JPEG image");
+ if(*width<1 || *height<1)
+ _throw("tjDecompressHeader2(): Invalid data returned in header");
+
+ bailout:
+ return retval;
+}
+
+DLLEXPORT int DLLCALL tjDecompressHeader(tjhandle handle,
+ unsigned char *jpegBuf, unsigned long jpegSize, int *width, int *height)
+{
+ int jpegSubsamp;
+ return tjDecompressHeader2(handle, jpegBuf, jpegSize, width, height,
+ &jpegSubsamp);
+}
+
+
+DLLEXPORT tjscalingfactor* DLLCALL tjGetScalingFactors(int *numscalingfactors)
+{
+ if(numscalingfactors==NULL)
+ {
+ snprintf(errStr, JMSG_LENGTH_MAX,
+ "tjGetScalingFactors(): Invalid argument");
+ return NULL;
+ }
+
+ *numscalingfactors=NUMSF;
+ return (tjscalingfactor *)sf;
+}
+
+
+DLLEXPORT int DLLCALL tjDecompress2(tjhandle handle, unsigned char *jpegBuf,
+ unsigned long jpegSize, unsigned char *dstBuf, int width, int pitch,
+ int height, int pixelFormat, int flags)
+{
+ int i, retval=0; JSAMPROW *row_pointer=NULL;
+ int jpegwidth, jpegheight, scaledw, scaledh;
+ #ifndef JCS_EXTENSIONS
+ unsigned char *rgbBuf=NULL;
+ unsigned char *_dstBuf=NULL; int _pitch=0;
+ #endif
+
+ getinstance(handle);
+ if((this->init&DECOMPRESS)==0)
+ _throw("tjDecompress2(): Instance has not been initialized for decompression");
+
+ if(jpegBuf==NULL || jpegSize<=0 || dstBuf==NULL || width<0 || pitch<0
+ || height<0 || pixelFormat<0 || pixelFormat>=TJ_NUMPF)
+ _throw("tjDecompress2(): Invalid argument");
+
+ if(flags&TJFLAG_FORCEMMX) putenv("JSIMD_FORCEMMX=1");
+ else if(flags&TJFLAG_FORCESSE) putenv("JSIMD_FORCESSE=1");
+ else if(flags&TJFLAG_FORCESSE2) putenv("JSIMD_FORCESSE2=1");
+
+ if(setjmp(this->jerr.setjmp_buffer))
+ {
+ /* If we get here, the JPEG code has signaled an error. */
+ retval=-1;
+ goto bailout;
+ }
+
+ this->jsrc.bytes_in_buffer=jpegSize;
+ this->jsrc.next_input_byte=jpegBuf;
+ jpeg_read_header(dinfo, TRUE);
+ if(setDecompDefaults(dinfo, pixelFormat)==-1)
+ {
+ retval=-1; goto bailout;
+ }
+
+ if(flags&TJFLAG_FASTUPSAMPLE) dinfo->do_fancy_upsampling=FALSE;
+
+ jpegwidth=dinfo->image_width; jpegheight=dinfo->image_height;
+ if(width==0) width=jpegwidth;
+ if(height==0) height=jpegheight;
+ for(i=0; i<NUMSF; i++)
+ {
+ scaledw=TJSCALED(jpegwidth, sf[i]);
+ scaledh=TJSCALED(jpegheight, sf[i]);
+ if(scaledw<=width && scaledh<=height)
+ break;
+ }
+ if(scaledw>width || scaledh>height)
+ _throw("tjDecompress2(): Could not scale down to desired image dimensions");
+ width=scaledw; height=scaledh;
+ dinfo->scale_num=sf[i].num;
+ dinfo->scale_denom=sf[i].denom;
+
+ jpeg_start_decompress(dinfo);
+ if(pitch==0) pitch=dinfo->output_width*tjPixelSize[pixelFormat];
+
+ #ifndef JCS_EXTENSIONS
+ if(pixelFormat!=TJPF_GRAY &&
+ (RGB_RED!=tjRedOffset[pixelFormat] ||
+ RGB_GREEN!=tjGreenOffset[pixelFormat] ||
+ RGB_BLUE!=tjBlueOffset[pixelFormat] ||
+ RGB_PIXELSIZE!=tjPixelSize[pixelFormat]))
+ {
+ rgbBuf=(unsigned char *)malloc(width*height*3);
+ if(!rgbBuf) _throw("tjDecompress2(): Memory allocation failure");
+ _pitch=pitch; pitch=width*3;
+ _dstBuf=dstBuf; dstBuf=rgbBuf;
+ }
+ #endif
+
+ if((row_pointer=(JSAMPROW *)malloc(sizeof(JSAMPROW)
+ *dinfo->output_height))==NULL)
+ _throw("tjDecompress2(): Memory allocation failure");
+ for(i=0; i<(int)dinfo->output_height; i++)
+ {
+ if(flags&TJFLAG_BOTTOMUP)
+ row_pointer[i]=&dstBuf[(dinfo->output_height-i-1)*pitch];
+ else row_pointer[i]=&dstBuf[i*pitch];
+ }
+ while(dinfo->output_scanline<dinfo->output_height)
+ {
+ jpeg_read_scanlines(dinfo, &row_pointer[dinfo->output_scanline],
+ dinfo->output_height-dinfo->output_scanline);
+ }
+ jpeg_finish_decompress(dinfo);
+
+ #ifndef JCS_EXTENSIONS
+ fromRGB(rgbBuf, _dstBuf, width, _pitch, height, pixelFormat);
+ #endif
+
+ bailout:
+ if(dinfo->global_state>DSTATE_START) jpeg_abort_decompress(dinfo);
+ #ifndef JCS_EXTENSIONS
+ if(rgbBuf) free(rgbBuf);
+ #endif
+ if(row_pointer) free(row_pointer);
+ return retval;
+}
+
+DLLEXPORT int DLLCALL tjDecompress(tjhandle handle, unsigned char *jpegBuf,
+ unsigned long jpegSize, unsigned char *dstBuf, int width, int pitch,
+ int height, int pixelSize, int flags)
+{
+ return tjDecompress2(handle, jpegBuf, jpegSize, dstBuf, width, pitch,
+ height, getPixelFormat(pixelSize, flags), flags);
+}
diff --git a/ica/x11/common/turbojpeg.h b/ica/x11/common/turbojpeg.h
new file mode 100644
index 0000000..ab8adda
--- /dev/null
+++ b/ica/x11/common/turbojpeg.h
@@ -0,0 +1,529 @@
+/*
+ * Copyright (C)2009-2012 D. R. Commander. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * - Neither the name of the libjpeg-turbo Project nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __TURBOJPEG_H__
+#define __TURBOJPEG_H__
+
+#if defined(_WIN32) && defined(DLLDEFINE)
+#define DLLEXPORT __declspec(dllexport)
+#else
+#define DLLEXPORT
+#endif
+#define DLLCALL
+
+
+/**
+ * @addtogroup TurboJPEG Lite
+ * TurboJPEG API. This API provides an interface for generating and decoding
+ * JPEG images in memory.
+ *
+ * @{
+ */
+
+
+/**
+ * The number of chrominance subsampling options
+ */
+#define TJ_NUMSAMP 5
+
+/**
+ * Chrominance subsampling options.
+ * When an image is converted from the RGB to the YCbCr colorspace as part of
+ * the JPEG compression process, some of the Cb and Cr (chrominance) components
+ * can be discarded or averaged together to produce a smaller image with little
+ * perceptible loss of image clarity (the human eye is more sensitive to small
+ * changes in brightness than small changes in color.) This is called
+ * "chrominance subsampling".
+ */
+enum TJSAMP
+{
+ /**
+ * 4:4:4 chrominance subsampling (no chrominance subsampling). The JPEG or
+ * YUV image will contain one chrominance component for every pixel in the
+ * source image.
+ */
+ TJSAMP_444=0,
+ /**
+ * 4:2:2 chrominance subsampling. The JPEG or YUV image will contain one
+ * chrominance component for every 2x1 block of pixels in the source image.
+ */
+ TJSAMP_422,
+ /**
+ * 4:2:0 chrominance subsampling. The JPEG or YUV image will contain one
+ * chrominance component for every 2x2 block of pixels in the source image.
+ */
+ TJSAMP_420,
+ /**
+ * Grayscale. The JPEG or YUV image will contain no chrominance components.
+ */
+ TJSAMP_GRAY,
+ /**
+ * 4:4:0 chrominance subsampling. The JPEG or YUV image will contain one
+ * chrominance component for every 1x2 block of pixels in the source image.
+ */
+ TJSAMP_440
+};
+
+/**
+ * MCU block width (in pixels) for a given level of chrominance subsampling.
+ * MCU block sizes:
+ * - 8x8 for no subsampling or grayscale
+ * - 16x8 for 4:2:2
+ * - 8x16 for 4:4:0
+ * - 16x16 for 4:2:0
+ */
+static const int tjMCUWidth[TJ_NUMSAMP] = {8, 16, 16, 8, 8};
+
+/**
+ * MCU block height (in pixels) for a given level of chrominance subsampling.
+ * MCU block sizes:
+ * - 8x8 for no subsampling or grayscale
+ * - 16x8 for 4:2:2
+ * - 8x16 for 4:4:0
+ * - 16x16 for 4:2:0
+ */
+static const int tjMCUHeight[TJ_NUMSAMP] = {8, 8, 16, 8, 16};
+
+
+/**
+ * The number of pixel formats
+ */
+#define TJ_NUMPF 11
+
+/**
+ * Pixel formats
+ */
+enum TJPF
+{
+ /**
+ * RGB pixel format. The red, green, and blue components in the image are
+ * stored in 3-byte pixels in the order R, G, B from lowest to highest byte
+ * address within each pixel.
+ */
+ TJPF_RGB=0,
+ /**
+ * BGR pixel format. The red, green, and blue components in the image are
+ * stored in 3-byte pixels in the order B, G, R from lowest to highest byte
+ * address within each pixel.
+ */
+ TJPF_BGR,
+ /**
+ * RGBX pixel format. The red, green, and blue components in the image are
+ * stored in 4-byte pixels in the order R, G, B from lowest to highest byte
+ * address within each pixel. The X component is ignored when compressing
+ * and undefined when decompressing.
+ */
+ TJPF_RGBX,
+ /**
+ * BGRX pixel format. The red, green, and blue components in the image are
+ * stored in 4-byte pixels in the order B, G, R from lowest to highest byte
+ * address within each pixel. The X component is ignored when compressing
+ * and undefined when decompressing.
+ */
+ TJPF_BGRX,
+ /**
+ * XBGR pixel format. The red, green, and blue components in the image are
+ * stored in 4-byte pixels in the order R, G, B from highest to lowest byte
+ * address within each pixel. The X component is ignored when compressing
+ * and undefined when decompressing.
+ */
+ TJPF_XBGR,
+ /**
+ * XRGB pixel format. The red, green, and blue components in the image are
+ * stored in 4-byte pixels in the order B, G, R from highest to lowest byte
+ * address within each pixel. The X component is ignored when compressing
+ * and undefined when decompressing.
+ */
+ TJPF_XRGB,
+ /**
+ * Grayscale pixel format. Each 1-byte pixel represents a luminance
+ * (brightness) level from 0 to 255.
+ */
+ TJPF_GRAY,
+ /**
+ * RGBA pixel format. This is the same as @ref TJPF_RGBX, except that when
+ * decompressing, the X component is guaranteed to be 0xFF, which can be
+ * interpreted as an opaque alpha channel.
+ */
+ TJPF_RGBA,
+ /**
+ * BGRA pixel format. This is the same as @ref TJPF_BGRX, except that when
+ * decompressing, the X component is guaranteed to be 0xFF, which can be
+ * interpreted as an opaque alpha channel.
+ */
+ TJPF_BGRA,
+ /**
+ * ABGR pixel format. This is the same as @ref TJPF_XBGR, except that when
+ * decompressing, the X component is guaranteed to be 0xFF, which can be
+ * interpreted as an opaque alpha channel.
+ */
+ TJPF_ABGR,
+ /**
+ * ARGB pixel format. This is the same as @ref TJPF_XRGB, except that when
+ * decompressing, the X component is guaranteed to be 0xFF, which can be
+ * interpreted as an opaque alpha channel.
+ */
+ TJPF_ARGB
+};
+
+/**
+ * Red offset (in bytes) for a given pixel format. This specifies the number
+ * of bytes that the red component is offset from the start of the pixel. For
+ * instance, if a pixel of format TJ_BGRX is stored in <tt>char pixel[]</tt>,
+ * then the red component will be <tt>pixel[tjRedOffset[TJ_BGRX]]</tt>.
+ */
+static const int tjRedOffset[TJ_NUMPF] = {0, 2, 0, 2, 3, 1, 0, 0, 2, 3, 1};
+/**
+ * Green offset (in bytes) for a given pixel format. This specifies the number
+ * of bytes that the green component is offset from the start of the pixel.
+ * For instance, if a pixel of format TJ_BGRX is stored in
+ * <tt>char pixel[]</tt>, then the green component will be
+ * <tt>pixel[tjGreenOffset[TJ_BGRX]]</tt>.
+ */
+static const int tjGreenOffset[TJ_NUMPF] = {1, 1, 1, 1, 2, 2, 0, 1, 1, 2, 2};
+/**
+ * Blue offset (in bytes) for a given pixel format. This specifies the number
+ * of bytes that the Blue component is offset from the start of the pixel. For
+ * instance, if a pixel of format TJ_BGRX is stored in <tt>char pixel[]</tt>,
+ * then the blue component will be <tt>pixel[tjBlueOffset[TJ_BGRX]]</tt>.
+ */
+static const int tjBlueOffset[TJ_NUMPF] = {2, 0, 2, 0, 1, 3, 0, 2, 0, 1, 3};
+
+/**
+ * Pixel size (in bytes) for a given pixel format.
+ */
+static const int tjPixelSize[TJ_NUMPF] = {3, 3, 4, 4, 4, 4, 1, 4, 4, 4, 4};
+
+
+/**
+ * The uncompressed source/destination image is stored in bottom-up (Windows,
+ * OpenGL) order, not top-down (X11) order.
+ */
+#define TJFLAG_BOTTOMUP 2
+/**
+ * Turn off CPU auto-detection and force TurboJPEG to use MMX code (IPP and
+ * 32-bit libjpeg-turbo versions only.)
+ */
+#define TJFLAG_FORCEMMX 8
+/**
+ * Turn off CPU auto-detection and force TurboJPEG to use SSE code (32-bit IPP
+ * and 32-bit libjpeg-turbo versions only)
+ */
+#define TJFLAG_FORCESSE 16
+/**
+ * Turn off CPU auto-detection and force TurboJPEG to use SSE2 code (32-bit IPP
+ * and 32-bit libjpeg-turbo versions only)
+ */
+#define TJFLAG_FORCESSE2 32
+/**
+ * Turn off CPU auto-detection and force TurboJPEG to use SSE3 code (64-bit IPP
+ * version only)
+ */
+#define TJFLAG_FORCESSE3 128
+/**
+ * Use fast, inaccurate chrominance upsampling routines in the JPEG
+ * decompressor (libjpeg and libjpeg-turbo versions only)
+ */
+#define TJFLAG_FASTUPSAMPLE 256
+
+
+/**
+ * Scaling factor
+ */
+typedef struct
+{
+ /**
+ * Numerator
+ */
+ int num;
+ /**
+ * Denominator
+ */
+ int denom;
+} tjscalingfactor;
+
+
+/**
+ * TurboJPEG instance handle
+ */
+typedef void* tjhandle;
+
+
+/**
+ * Pad the given width to the nearest 32-bit boundary
+ */
+#define TJPAD(width) (((width)+3)&(~3))
+
+/**
+ * Compute the scaled value of <tt>dimension</tt> using the given scaling
+ * factor. This macro performs the integer equivalent of <tt>ceil(dimension *
+ * scalingFactor)</tt>.
+ */
+#define TJSCALED(dimension, scalingFactor) ((dimension * scalingFactor.num \
+ + scalingFactor.denom - 1) / scalingFactor.denom)
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * Create a TurboJPEG compressor instance.
+ *
+ * @return a handle to the newly-created instance, or NULL if an error
+ * occurred (see #tjGetErrorStr().)
+ */
+DLLEXPORT tjhandle DLLCALL tjInitCompress(void);
+
+
+/**
+ * Compress an RGB or grayscale image into a JPEG image.
+ *
+ * @param handle a handle to a TurboJPEG compressor or transformer instance
+ * @param srcBuf pointer to an image buffer containing RGB or grayscale pixels
+ * to be compressed
+ * @param width width (in pixels) of the source image
+ * @param pitch bytes per line of the source image. Normally, this should be
+ * <tt>width * #tjPixelSize[pixelFormat]</tt> if the image is unpadded,
+ * or <tt>#TJPAD(width * #tjPixelSize[pixelFormat])</tt> if each line of
+ * the image is padded to the nearest 32-bit boundary, as is the case
+ * for Windows bitmaps. You can also be clever and use this parameter
+ * to skip lines, etc. Setting this parameter to 0 is the equivalent of
+ * setting it to <tt>width * #tjPixelSize[pixelFormat]</tt>.
+ * @param height height (in pixels) of the source image
+ * @param pixelFormat pixel format of the source image (see @ref TJPF
+ * "Pixel formats".)
+ * @param jpegBuf address of a pointer to an image buffer that will receive the
+ * JPEG image. TurboJPEG has the ability to reallocate the JPEG buffer
+ * to accommodate the size of the JPEG image. Thus, you can choose to:
+ * -# pre-allocate the JPEG buffer with an arbitrary size using
+ * #tjAlloc() and let TurboJPEG grow the buffer as needed,
+ * -# set <tt>*jpegBuf</tt> to NULL to tell TurboJPEG to allocate the
+ * buffer for you, or
+ * -# pre-allocate the buffer to a "worst case" size determined by
+ * calling #tjBufSize(). This should ensure that the buffer never has
+ * to be re-allocated (setting #TJFLAG_NOREALLOC guarantees this.)
+ * .
+ * If you choose option 1, <tt>*jpegSize</tt> should be set to the
+ * size of your pre-allocated buffer. In any case, unless you have
+ * set #TJFLAG_NOREALLOC, you should always check <tt>*jpegBuf</tt> upon
+ * return from this function, as it may have changed.
+ * @param jpegSize pointer to an unsigned long variable that holds the size of
+ * the JPEG image buffer. If <tt>*jpegBuf</tt> points to a
+ * pre-allocated buffer, then <tt>*jpegSize</tt> should be set to the
+ * size of the buffer. Upon return, <tt>*jpegSize</tt> will contain the
+ * size of the JPEG image (in bytes.)
+ * @param jpegSubsamp the level of chrominance subsampling to be used when
+ * generating the JPEG image (see @ref TJSAMP
+ * "Chrominance subsampling options".)
+ * @param jpegQual the image quality of the generated JPEG image (1 = worst,
+ 100 = best)
+ * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP
+ * "flags".
+ *
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
+*/
+DLLEXPORT int DLLCALL tjCompress2(tjhandle handle, unsigned char *srcBuf,
+ int width, int pitch, int height, int pixelFormat, unsigned char **jpegBuf,
+ unsigned long *jpegSize, int jpegSubsamp, int jpegQual, int flags);
+
+
+/**
+ * The maximum size of the buffer (in bytes) required to hold a JPEG image with
+ * the given parameters. The number of bytes returned by this function is
+ * larger than the size of the uncompressed source image. The reason for this
+ * is that the JPEG format uses 16-bit coefficients, and it is thus possible
+ * for a very high-quality JPEG image with very high frequency content to
+ * expand rather than compress when converted to the JPEG format. Such images
+ * represent a very rare corner case, but since there is no way to predict the
+ * size of a JPEG image prior to compression, the corner case has to be
+ * handled.
+ *
+ * @param width width of the image (in pixels)
+ * @param height height of the image (in pixels)
+ * @param jpegSubsamp the level of chrominance subsampling to be used when
+ * generating the JPEG image (see @ref TJSAMP
+ * "Chrominance subsampling options".)
+ *
+ * @return the maximum size of the buffer (in bytes) required to hold the
+ * image, or -1 if the arguments are out of bounds.
+ */
+DLLEXPORT unsigned long DLLCALL tjBufSize(int width, int height,
+ int jpegSubsamp);
+
+
+/**
+ * Create a TurboJPEG decompressor instance.
+ *
+ * @return a handle to the newly-created instance, or NULL if an error
+ * occurred (see #tjGetErrorStr().)
+*/
+DLLEXPORT tjhandle DLLCALL tjInitDecompress(void);
+
+
+/**
+ * Retrieve information about a JPEG image without decompressing it.
+ *
+ * @param handle a handle to a TurboJPEG decompressor or transformer instance
+ * @param jpegBuf pointer to a buffer containing a JPEG image
+ * @param jpegSize size of the JPEG image (in bytes)
+ * @param width pointer to an integer variable that will receive the width (in
+ * pixels) of the JPEG image
+ * @param height pointer to an integer variable that will receive the height
+ * (in pixels) of the JPEG image
+ * @param jpegSubsamp pointer to an integer variable that will receive the
+ * level of chrominance subsampling used when compressing the JPEG image
+ * (see @ref TJSAMP "Chrominance subsampling options".)
+ *
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
+*/
+DLLEXPORT int DLLCALL tjDecompressHeader2(tjhandle handle,
+ unsigned char *jpegBuf, unsigned long jpegSize, int *width, int *height,
+ int *jpegSubsamp);
+
+
+/**
+ * Returns a list of fractional scaling factors that the JPEG decompressor in
+ * this implementation of TurboJPEG supports.
+ *
+ * @param numscalingfactors pointer to an integer variable that will receive
+ * the number of elements in the list
+ *
+ * @return a pointer to a list of fractional scaling factors, or NULL if an
+ * error is encountered (see #tjGetErrorStr().)
+*/
+DLLEXPORT tjscalingfactor* DLLCALL tjGetScalingFactors(int *numscalingfactors);
+
+
+/**
+ * Decompress a JPEG image to an RGB or grayscale image.
+ *
+ * @param handle a handle to a TurboJPEG decompressor or transformer instance
+ * @param jpegBuf pointer to a buffer containing the JPEG image to decompress
+ * @param jpegSize size of the JPEG image (in bytes)
+ * @param dstBuf pointer to an image buffer that will receive the decompressed
+ * image. This buffer should normally be <tt>pitch * scaledHeight</tt>
+ * bytes in size, where <tt>scaledHeight</tt> can be determined by
+ * calling #TJSCALED() with the JPEG image height and one of the scaling
+ * factors returned by #tjGetScalingFactors(). The dstBuf pointer may
+ * also be used to decompress into a specific region of a larger buffer.
+ * @param width desired width (in pixels) of the destination image. If this is
+ * smaller than the width of the JPEG image being decompressed, then
+ * TurboJPEG will use scaling in the JPEG decompressor to generate the
+ * largest possible image that will fit within the desired width. If
+ * width is set to 0, then only the height will be considered when
+ * determining the scaled image size.
+ * @param pitch bytes per line of the destination image. Normally, this is
+ * <tt>scaledWidth * #tjPixelSize[pixelFormat]</tt> if the decompressed
+ * image is unpadded, else <tt>#TJPAD(scaledWidth *
+ * #tjPixelSize[pixelFormat])</tt> if each line of the decompressed
+ * image is padded to the nearest 32-bit boundary, as is the case for
+ * Windows bitmaps. (NOTE: <tt>scaledWidth</tt> can be determined by
+ * calling #TJSCALED() with the JPEG image width and one of the scaling
+ * factors returned by #tjGetScalingFactors().) You can also be clever
+ * and use the pitch parameter to skip lines, etc. Setting this
+ * parameter to 0 is the equivalent of setting it to <tt>scaledWidth
+ * * #tjPixelSize[pixelFormat]</tt>.
+ * @param height desired height (in pixels) of the destination image. If this
+ * is smaller than the height of the JPEG image being decompressed, then
+ * TurboJPEG will use scaling in the JPEG decompressor to generate the
+ * largest possible image that will fit within the desired height. If
+ * height is set to 0, then only the width will be considered when
+ * determining the scaled image size.
+ * @param pixelFormat pixel format of the destination image (see @ref
+ * TJPF "Pixel formats".)
+ * @param flags the bitwise OR of one or more of the @ref TJFLAG_BOTTOMUP
+ * "flags".
+ *
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
+ */
+DLLEXPORT int DLLCALL tjDecompress2(tjhandle handle,
+ unsigned char *jpegBuf, unsigned long jpegSize, unsigned char *dstBuf,
+ int width, int pitch, int height, int pixelFormat, int flags);
+
+
+/**
+ * Destroy a TurboJPEG compressor, decompressor, or transformer instance.
+ *
+ * @param handle a handle to a TurboJPEG compressor, decompressor or
+ * transformer instance
+ *
+ * @return 0 if successful, or -1 if an error occurred (see #tjGetErrorStr().)
+ */
+DLLEXPORT int DLLCALL tjDestroy(tjhandle handle);
+
+
+/**
+ * Returns a descriptive error message explaining why the last command failed.
+ *
+ * @return a descriptive error message explaining why the last command failed.
+ */
+DLLEXPORT char* DLLCALL tjGetErrorStr(void);
+
+
+/* Backward compatibility functions and macros (nothing to see here) */
+#define NUMSUBOPT TJ_NUMSAMP
+#define TJ_444 TJSAMP_444
+#define TJ_422 TJSAMP_422
+#define TJ_420 TJSAMP_420
+#define TJ_411 TJSAMP_420
+#define TJ_GRAYSCALE TJSAMP_GRAY
+
+#define TJ_BGR 1
+#define TJ_BOTTOMUP TJFLAG_BOTTOMUP
+#define TJ_FORCEMMX TJFLAG_FORCEMMX
+#define TJ_FORCESSE TJFLAG_FORCESSE
+#define TJ_FORCESSE2 TJFLAG_FORCESSE2
+#define TJ_ALPHAFIRST 64
+#define TJ_FORCESSE3 TJFLAG_FORCESSE3
+#define TJ_FASTUPSAMPLE TJFLAG_FASTUPSAMPLE
+
+DLLEXPORT unsigned long DLLCALL TJBUFSIZE(int width, int height);
+
+DLLEXPORT int DLLCALL tjCompress(tjhandle handle, unsigned char *srcBuf,
+ int width, int pitch, int height, int pixelSize, unsigned char *dstBuf,
+ unsigned long *compressedSize, int jpegSubsamp, int jpegQual, int flags);
+
+DLLEXPORT int DLLCALL tjDecompressHeader(tjhandle handle,
+ unsigned char *jpegBuf, unsigned long jpegSize, int *width, int *height);
+
+DLLEXPORT int DLLCALL tjDecompress(tjhandle handle,
+ unsigned char *jpegBuf, unsigned long jpegSize, unsigned char *dstBuf,
+ int width, int pitch, int height, int pixelSize, int flags);
+
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/ica/x11/common/vncauth.c b/ica/x11/common/vncauth.c
index 82c1b68..0b20f53 100644
--- a/ica/x11/common/vncauth.c
+++ b/ica/x11/common/vncauth.c
@@ -24,6 +24,7 @@
#ifdef __STRICT_ANSI__
#define _BSD_SOURCE
#define _POSIX_SOURCE
+#define _XOPEN_SOURCE 600
#endif
#ifdef LIBVNCSERVER_HAVE_SYS_TYPES_H
#include <sys/types.h>
diff --git a/ica/x11/libvncclient/listen.c b/ica/x11/libvncclient/listen.c
index 58275a0..c91ad6e 100644
--- a/ica/x11/libvncclient/listen.c
+++ b/ica/x11/libvncclient/listen.c
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2011-2012 Christian Beier <dontmind at freeshell.org>
* Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
*
* This is free software; you can redistribute it and/or modify
@@ -50,12 +51,12 @@ listenForIncomingConnections(rfbClient* client)
rfbClientErr("listenForIncomingConnections on MinGW32 NOT IMPLEMENTED\n");
return;
#else
- int listenSocket;
+ int listenSocket, listen6Socket = -1;
fd_set fds;
client->listenSpecified = TRUE;
- listenSocket = ListenAtTcpPort(client->listenPort);
+ listenSocket = ListenAtTcpPortAndAddress(client->listenPort, client->listenAddress);
if ((listenSocket < 0))
return;
@@ -65,8 +66,24 @@ listenForIncomingConnections(rfbClient* client)
rfbClientLog("%s -listen: Command line errors are not reported until "
"a connection comes in.\n", client->programName);
- while (TRUE) {
+#ifdef LIBVNCSERVER_IPv6 /* only try that if we're IPv6-capable, otherwise we may try to bind to the same port which would make all that listening fail */
+ /* only do IPv6 listen of listen6Port is set */
+ if (client->listen6Port > 0)
+ {
+ listen6Socket = ListenAtTcpPortAndAddress(client->listen6Port, client->listen6Address);
+
+ if (listen6Socket < 0)
+ return;
+
+ rfbClientLog("%s -listen: Listening on IPV6 port %d\n",
+ client->programName,client->listenPort);
+ rfbClientLog("%s -listen: Command line errors are not reported until "
+ "a connection comes in.\n", client->programName);
+ }
+#endif
+ while (TRUE) {
+ int r;
/* reap any zombies */
int status, pid;
while ((pid= wait3(&status, WNOHANG, (struct rusage *)0))>0);
@@ -75,12 +92,19 @@ listenForIncomingConnections(rfbClient* client)
FD_ZERO(&fds);
- FD_SET(listenSocket, &fds);
+ if(listenSocket >= 0)
+ FD_SET(listenSocket, &fds);
+ if(listen6Socket >= 0)
+ FD_SET(listen6Socket, &fds);
+
+ r = select(max(listenSocket, listen6Socket)+1, &fds, NULL, NULL, NULL);
- select(listenSocket+1, &fds, NULL, NULL, NULL);
+ if (r > 0) {
+ if (FD_ISSET(listenSocket, &fds))
+ client->sock = AcceptTcpConnection(client->listenSock);
+ else if (FD_ISSET(listen6Socket, &fds))
+ client->sock = AcceptTcpConnection(client->listen6Sock);
- if (FD_ISSET(listenSocket, &fds)) {
- client->sock = AcceptTcpConnection(listenSocket);
if (client->sock < 0)
return;
if (!SetNonBlocking(client->sock))
@@ -97,6 +121,7 @@ listenForIncomingConnections(rfbClient* client)
case 0:
/* child - return to caller */
close(listenSocket);
+ close(listen6Socket);
return;
default:
@@ -133,7 +158,7 @@ listenForIncomingConnectionsNoFork(rfbClient* client, int timeout)
if (client->listenSock < 0)
{
- client->listenSock = ListenAtTcpPort(client->listenPort);
+ client->listenSock = ListenAtTcpPortAndAddress(client->listenPort, client->listenAddress);
if (client->listenSock < 0)
return -1;
@@ -144,24 +169,54 @@ listenForIncomingConnectionsNoFork(rfbClient* client, int timeout)
"a connection comes in.\n", client->programName);
}
+#ifdef LIBVNCSERVER_IPv6 /* only try that if we're IPv6-capable, otherwise we may try to bind to the same port which would make all that listening fail */
+ /* only do IPv6 listen of listen6Port is set */
+ if (client->listen6Port > 0 && client->listen6Sock < 0)
+ {
+ client->listen6Sock = ListenAtTcpPortAndAddress(client->listen6Port, client->listen6Address);
+
+ if (client->listen6Sock < 0)
+ return -1;
+
+ rfbClientLog("%s -listennofork: Listening on IPV6 port %d\n",
+ client->programName,client->listenPort);
+ rfbClientLog("%s -listennofork: Command line errors are not reported until "
+ "a connection comes in.\n", client->programName);
+ }
+#endif
+
FD_ZERO(&fds);
- FD_SET(client->listenSock, &fds);
+ if(client->listenSock >= 0)
+ FD_SET(client->listenSock, &fds);
+ if(client->listen6Sock >= 0)
+ FD_SET(client->listen6Sock, &fds);
if (timeout < 0)
- r = select(client->listenSock+1, &fds, NULL, NULL, NULL);
+ r = select(max(client->listenSock, client->listen6Sock) +1, &fds, NULL, NULL, NULL);
else
- r = select(client->listenSock+1, &fds, NULL, NULL, &to);
+ r = select(max(client->listenSock, client->listen6Sock) +1, &fds, NULL, NULL, &to);
if (r > 0)
{
- client->sock = AcceptTcpConnection(client->listenSock);
+ if (FD_ISSET(client->listenSock, &fds))
+ client->sock = AcceptTcpConnection(client->listenSock);
+ else if (FD_ISSET(client->listen6Sock, &fds))
+ client->sock = AcceptTcpConnection(client->listen6Sock);
+
if (client->sock < 0)
return -1;
if (!SetNonBlocking(client->sock))
return -1;
- close(client->listenSock);
+ if(client->listenSock >= 0) {
+ close(client->listenSock);
+ client->listenSock = -1;
+ }
+ if(client->listen6Sock >= 0) {
+ close(client->listen6Sock);
+ client->listen6Sock = -1;
+ }
return r;
}
diff --git a/ica/x11/libvncclient/rfbproto.c b/ica/x11/libvncclient/rfbproto.c
index e046fd8..e28d454 100644
--- a/ica/x11/libvncclient/rfbproto.c
+++ b/ica/x11/libvncclient/rfbproto.c
@@ -26,17 +26,20 @@
#ifdef __STRICT_ANSI__
#define _BSD_SOURCE
#define _POSIX_SOURCE
+#define _XOPEN_SOURCE 600
#endif
#ifndef WIN32
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
-#endif
-#include <errno.h>
-#ifndef WIN32
#include <pwd.h>
#endif
+#include <errno.h>
#include <rfb/rfbclient.h>
+#ifdef WIN32
+#undef SOCKET
+#undef socklen_t
+#endif
#ifdef LIBVNCSERVER_HAVE_LIBZ
#include <zlib.h>
#ifdef __CHECKER__
@@ -45,16 +48,16 @@
#endif
#endif
#ifdef LIBVNCSERVER_HAVE_LIBJPEG
+#ifdef _RPCNDR_H /* This Windows header typedefs 'boolean', jpeglib has to know */
+#define HAVE_BOOLEAN
+#endif
#include <jpeglib.h>
#endif
+#include <strings.h>
#include <stdarg.h>
#include <time.h>
#ifdef LIBVNCSERVER_WITH_CLIENT_GCRYPT
-#ifdef WIN32
-#undef SOCKET
-#undef socklen_t
-#endif
#include <gcrypt.h>
#endif
@@ -388,8 +391,8 @@ ConnectToRFBServer(rfbClient* client,const char *hostname, int port)
return FALSE;
}
setbuf(rec->file,NULL);
- fread(buffer,1,strlen(magic),rec->file);
- if (strncmp(buffer,magic,strlen(magic))) {
+
+ if (fread(buffer,1,strlen(magic),rec->file) != strlen(magic) || strncmp(buffer,magic,strlen(magic))) {
rfbClientLog("File %s was not recorded by vncrec.\n",client->serverHost);
fclose(rec->file);
return FALSE;
@@ -572,8 +575,8 @@ ReadSupportedSecurityType(rfbClient* client, uint32_t *result, rfbBool subAuth)
if (tAuth[loop]==rfbVncAuth || tAuth[loop]==rfbNoAuth ||
( tAuth[loop] == rfbUltraVNC_MsLogonIIAuth && isLogonAuthenticationEnabled( client ) ) ||
tAuth[loop] == rfbSecTypeItalc ||
- tAuth[loop]==rfbARD ||
- (!subAuth && (tAuth[loop]==rfbTLS || tAuth[loop]==rfbVeNCrypt)))
+ (tAuth[loop]==rfbARD && client->GetCredential) ||
+ (!subAuth && (tAuth[loop]==rfbTLS || (tAuth[loop]==rfbVeNCrypt && client->GetCredential))))
{
if (!subAuth && client->clientAuthSchemes)
{
@@ -1043,9 +1046,7 @@ InitialiseRFBConnection(rfbClient* client)
rfbProtocolVersionMsg pv;
int major,minor;
uint32_t authScheme;
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
uint32_t subAuthScheme;
-#endif
rfbClientInitMsg ci;
/* if the connection is immediately closed, don't report anything, so
@@ -1081,6 +1082,14 @@ InitialiseRFBConnection(rfbClient* client)
DefaultSupportedMessagesUltraVNC(client);
}
+ /* UltraVNC Single Click uses minor codes 14 and 16 for the server */
+ if (major==3 && (minor==14 || minor==16)) {
+ minor = minor - 10;
+ client->minor = minor;
+ rfbClientLog("UltraVNC Single Click server detected, enabling UltraVNC specific messages\n",pv);
+ DefaultSupportedMessagesUltraVNC(client);
+ }
+
/* TightVNC uses minor codes 5 for the server */
if (major==3 && minor==5) {
rfbClientLog("TightVNC server detected, enabling TightVNC specific messages\n",pv);
@@ -1149,10 +1158,6 @@ InitialiseRFBConnection(rfbClient* client)
break;
case rfbTLS:
-#ifndef LIBVNCSERVER_WITH_CLIENT_TLS
- rfbClientLog("TLS support was not compiled in\n");
- return FALSE;
-#else
if (!HandleAnonTLSAuth(client)) return FALSE;
/* After the TLS session is established, sub auth types are expected.
* Note that all following reading/writing are through the TLS session from here.
@@ -1182,15 +1187,10 @@ InitialiseRFBConnection(rfbClient* client)
(int)subAuthScheme);
return FALSE;
}
-#endif
break;
case rfbVeNCrypt:
-#ifndef LIBVNCSERVER_WITH_CLIENT_TLS
- rfbClientLog("TLS support was not compiled in\n");
- return FALSE;
-#else
if (!HandleVeNCryptAuth(client)) return FALSE;
switch (client->subAuthScheme) {
@@ -1216,7 +1216,7 @@ InitialiseRFBConnection(rfbClient* client)
client->subAuthScheme);
return FALSE;
}
-#endif
+
break;
case rfbSecTypeItalc:
@@ -1710,7 +1710,7 @@ SendKeyEvent(rfbClient* client, uint32_t key, rfbBool down)
*/
rfbBool
-SendClientCutText(rfbClient* client, char *str, int len)
+SendClientCutText(rfbClient* client, const char *str, int len)
{
rfbClientCutTextMsg cct;
diff --git a/ica/x11/libvncclient/sockets.c b/ica/x11/libvncclient/sockets.c
index 1e44fa3..c1cc416 100644
--- a/ica/x11/libvncclient/sockets.c
+++ b/ica/x11/libvncclient/sockets.c
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2011-2012 Christian Beier <dontmind at freeshell.org>
* Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
*
* This is free software; you can redistribute it and/or modify
@@ -23,6 +24,11 @@
#ifdef __STRICT_ANSI__
#define _BSD_SOURCE
+#ifdef __linux__
+/* Setting this on other systems hides definitions such as INADDR_LOOPBACK.
+ * The check should be for __GLIBC__ in fact. */
+# define _POSIX_SOURCE
+#endif
#endif
#include <unistd.h>
#include <errno.h>
@@ -32,6 +38,10 @@
#ifdef WIN32
#undef SOCKET
#include <winsock2.h>
+/* make sure to use the WSA error codes instead of the POSIX ones defined in errno.h */
+#ifdef EWOULDBLOCK
+#undef EWOULDBLOCK
+#endif
#define EWOULDBLOCK WSAEWOULDBLOCK
#define close closesocket
#define read(sock,buf,len) recv(sock,buf,len,0)
@@ -110,7 +120,7 @@ ReadFromRFBServer(rfbClient* client, char *out, unsigned int n)
rec->tv=tv;
}
- return (fread(out,1,n,rec->file)<0?FALSE:TRUE);
+ return (fread(out,1,n,rec->file) != n ? FALSE : TRUE);
}
if (n <= client->buffered) {
@@ -135,15 +145,11 @@ ReadFromRFBServer(rfbClient* client, char *out, unsigned int n)
while (client->buffered < n) {
int i;
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
if (client->tlsSession) {
i = ReadFromTLS(client, client->buf + client->buffered, RFB_BUF_SIZE - client->buffered);
} else {
-#endif
i = read(client->sock, client->buf + client->buffered, RFB_BUF_SIZE - client->buffered);
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
}
-#endif
if (i <= 0) {
if (i < 0) {
#ifdef WIN32
@@ -177,15 +183,12 @@ ReadFromRFBServer(rfbClient* client, char *out, unsigned int n)
while (n > 0) {
int i;
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
if (client->tlsSession) {
i = ReadFromTLS(client, out, n);
} else {
-#endif
i = read(client->sock, out, n);
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
}
-#endif
+
if (i <= 0) {
if (i < 0) {
#ifdef WIN32
@@ -231,7 +234,7 @@ hexdump:
*/
rfbBool
-WriteToRFBServer(rfbClient* client, char *buf, int n)
+WriteToRFBServer(rfbClient* client, const char *buf, int n)
{
fd_set fds;
int i = 0;
@@ -240,7 +243,6 @@ WriteToRFBServer(rfbClient* client, char *buf, int n)
if (client->serverPort==-1)
return TRUE; /* vncrec playing */
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
if (client->tlsSession) {
/* WriteToTLS() will guarantee either everything is written, or error/eof returns */
i = WriteToTLS(client, buf, n);
@@ -248,7 +250,6 @@ WriteToRFBServer(rfbClient* client, char *buf, int n)
return TRUE;
}
-#endif
while (i < n) {
j = write(client->sock, buf + i, (n - i));
@@ -480,13 +481,31 @@ FindFreeTcpPort(void)
int
ListenAtTcpPort(int port)
{
+ return ListenAtTcpPortAndAddress(port, NULL);
+}
+
+
+
+/*
+ * ListenAtTcpPortAndAddress starts listening at the given TCP port on
+ * the given IP address
+ */
+
+int
+ListenAtTcpPortAndAddress(int port, const char *address)
+{
int sock;
- struct sockaddr_in addr;
int one = 1;
+#ifndef LIBVNCSERVER_IPv6
+ struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
- addr.sin_addr.s_addr = htonl(INADDR_ANY);
+ if (address) {
+ addr.sin_addr.s_addr = inet_addr(address);
+ } else {
+ addr.sin_addr.s_addr = htonl(INADDR_ANY);
+ }
if (!initSockets())
return -1;
@@ -510,6 +529,66 @@ ListenAtTcpPort(int port)
return -1;
}
+#else
+ int rv;
+ struct addrinfo hints, *servinfo, *p;
+ char port_str[8];
+
+ snprintf(port_str, 8, "%d", port);
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_flags = AI_PASSIVE; /* fill in wildcard address if address == NULL */
+
+ if (!initSockets())
+ return -1;
+
+ if ((rv = getaddrinfo(address, port_str, &hints, &servinfo)) != 0) {
+ rfbClientErr("ListenAtTcpPortAndAddress: error in getaddrinfo: %s\n", gai_strerror(rv));
+ return -1;
+ }
+
+ /* loop through all the results and bind to the first we can */
+ for(p = servinfo; p != NULL; p = p->ai_next) {
+ if ((sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) < 0) {
+ continue;
+ }
+
+#ifdef IPV6_V6ONLY
+ /* we have seperate IPv4 and IPv6 sockets since some OS's do not support dual binding */
+ if (p->ai_family == AF_INET6 && setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&one, sizeof(one)) < 0) {
+ rfbClientErr("ListenAtTcpPortAndAddress: error in setsockopt IPV6_V6ONLY: %s\n", strerror(errno));
+ close(sock);
+ freeaddrinfo(servinfo);
+ return -1;
+ }
+#endif
+
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)) < 0) {
+ rfbClientErr("ListenAtTcpPortAndAddress: error in setsockopt SO_REUSEADDR: %s\n", strerror(errno));
+ close(sock);
+ freeaddrinfo(servinfo);
+ return -1;
+ }
+
+ if (bind(sock, p->ai_addr, p->ai_addrlen) < 0) {
+ close(sock);
+ continue;
+ }
+
+ break;
+ }
+
+ if (p == NULL) {
+ rfbClientErr("ListenAtTcpPortAndAddress: error in bind: %s\n", strerror(errno));
+ return -1;
+ }
+
+ /* all done with this structure now */
+ freeaddrinfo(servinfo);
+#endif
+
if (listen(sock, 5) < 0) {
rfbClientErr("ListenAtTcpPort: listen\n");
close(sock);
diff --git a/ica/x11/libvncclient/tls.h b/ica/x11/libvncclient/tls.h
index 48d159b..abd4db3 100644
--- a/ica/x11/libvncclient/tls.h
+++ b/ica/x11/libvncclient/tls.h
@@ -43,7 +43,7 @@ int ReadFromTLS(rfbClient* client, char *out, unsigned int n);
* It's a wrapper function over gnutls_record_send() and it will be
* blocking call, until all bytes are written or error returned.
*/
-int WriteToTLS(rfbClient* client, char *buf, unsigned int n);
+int WriteToTLS(rfbClient* client, const char *buf, unsigned int n);
/* Free TLS resources */
void FreeTLS(rfbClient* client);
diff --git a/ica/x11/libvncclient/tls.c b/ica/x11/libvncclient/tls_gnutls.c
similarity index 90%
copy from ica/x11/libvncclient/tls.c
copy to ica/x11/libvncclient/tls_gnutls.c
index 5d29362..3daa416 100644
--- a/ica/x11/libvncclient/tls.c
+++ b/ica/x11/libvncclient/tls_gnutls.c
@@ -17,6 +17,7 @@
* USA.
*/
+#include <gnutls/gnutls.h>
#include <rfb/rfbclient.h>
#include <errno.h>
#ifdef WIN32
@@ -29,7 +30,6 @@
#endif
#include "tls.h"
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
static const char *rfbTLSPriority = "NORMAL:+DHE-DSS:+RSA:+DHE-RSA:+SRP";
static const char *rfbAnonTLSPriority= "NORMAL:+ANON-DH";
@@ -135,21 +135,21 @@ InitializeTLSSession(rfbClient* client, rfbBool anonTLS)
if (client->tlsSession) return TRUE;
- if ((ret = gnutls_init(&client->tlsSession, GNUTLS_CLIENT)) < 0)
+ if ((ret = gnutls_init((gnutls_session_t*)&client->tlsSession, GNUTLS_CLIENT)) < 0)
{
rfbClientLog("Failed to initialized TLS session: %s.\n", gnutls_strerror(ret));
return FALSE;
}
- if ((ret = gnutls_priority_set_direct(client->tlsSession,
+ if ((ret = gnutls_priority_set_direct((gnutls_session_t)client->tlsSession,
anonTLS ? rfbAnonTLSPriority : rfbTLSPriority, &p)) < 0)
{
rfbClientLog("Warning: Failed to set TLS priority: %s (%s).\n", gnutls_strerror(ret), p);
}
- gnutls_transport_set_ptr(client->tlsSession, (gnutls_transport_ptr_t)client);
- gnutls_transport_set_push_function(client->tlsSession, PushTLS);
- gnutls_transport_set_pull_function(client->tlsSession, PullTLS);
+ gnutls_transport_set_ptr((gnutls_session_t)client->tlsSession, (gnutls_transport_ptr_t)client);
+ gnutls_transport_set_push_function((gnutls_session_t)client->tlsSession, PushTLS);
+ gnutls_transport_set_pull_function((gnutls_session_t)client->tlsSession, PullTLS);
rfbClientLog("TLS session initialized.\n");
@@ -163,7 +163,7 @@ SetTLSAnonCredential(rfbClient* client)
int ret;
if ((ret = gnutls_anon_allocate_client_credentials(&anonCred)) < 0 ||
- (ret = gnutls_credentials_set(client->tlsSession, GNUTLS_CRD_ANON, anonCred)) < 0)
+ (ret = gnutls_credentials_set((gnutls_session_t)client->tlsSession, GNUTLS_CRD_ANON, anonCred)) < 0)
{
FreeTLS(client);
rfbClientLog("Failed to create anonymous credentials: %s", gnutls_strerror(ret));
@@ -179,7 +179,7 @@ HandshakeTLS(rfbClient* client)
int timeout = 15;
int ret;
- while (timeout > 0 && (ret = gnutls_handshake(client->tlsSession)) < 0)
+ while (timeout > 0 && (ret = gnutls_handshake((gnutls_session_t)client->tlsSession)) < 0)
{
if (!gnutls_error_is_fatal(ret))
{
@@ -335,13 +335,10 @@ CreateX509CertCredential(rfbCredential *cred)
return x509_cred;
}
-#endif
rfbBool
HandleAnonTLSAuth(rfbClient* client)
{
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
-
if (!InitializeTLS() || !InitializeTLSSession(client, TRUE)) return FALSE;
if (!SetTLSAnonCredential(client)) return FALSE;
@@ -349,17 +346,11 @@ HandleAnonTLSAuth(rfbClient* client)
if (!HandshakeTLS(client)) return FALSE;
return TRUE;
-
-#else
- rfbClientLog("TLS is not supported.\n");
- return FALSE;
-#endif
}
rfbBool
HandleVeNCryptAuth(rfbClient* client)
{
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
uint8_t major, minor, status;
uint32_t authScheme;
rfbBool anonTLS;
@@ -447,7 +438,7 @@ HandleVeNCryptAuth(rfbClient* client)
}
else
{
- if ((ret = gnutls_credentials_set(client->tlsSession, GNUTLS_CRD_CERTIFICATE, x509_cred)) < 0)
+ if ((ret = gnutls_credentials_set((gnutls_session_t)client->tlsSession, GNUTLS_CRD_CERTIFICATE, x509_cred)) < 0)
{
rfbClientLog("Cannot set x509 credential: %s.\n", gnutls_strerror(ret));
FreeTLS(client);
@@ -463,20 +454,14 @@ HandleVeNCryptAuth(rfbClient* client)
* to do actual sub authentication.
*/
return TRUE;
-
-#else
- rfbClientLog("TLS is not supported.\n");
- return FALSE;
-#endif
}
int
ReadFromTLS(rfbClient* client, char *out, unsigned int n)
{
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
ssize_t ret;
- ret = gnutls_record_recv(client->tlsSession, out, n);
+ ret = gnutls_record_recv((gnutls_session_t)client->tlsSession, out, n);
if (ret >= 0) return ret;
if (ret == GNUTLS_E_REHANDSHAKE || ret == GNUTLS_E_AGAIN)
{
@@ -487,23 +472,17 @@ ReadFromTLS(rfbClient* client, char *out, unsigned int n)
errno = EINTR;
}
return -1;
-#else
- rfbClientLog("TLS is not supported.\n");
- errno = EINTR;
- return -1;
-#endif
}
int
WriteToTLS(rfbClient* client, char *buf, unsigned int n)
{
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
unsigned int offset = 0;
ssize_t ret;
while (offset < n)
{
- ret = gnutls_record_send(client->tlsSession, buf+offset, (size_t)(n-offset));
+ ret = gnutls_record_send((gnutls_session_t)client->tlsSession, buf+offset, (size_t)(n-offset));
if (ret == 0) continue;
if (ret < 0)
{
@@ -514,20 +493,13 @@ WriteToTLS(rfbClient* client, char *buf, unsigned int n)
offset += (unsigned int)ret;
}
return offset;
-#else
- rfbClientLog("TLS is not supported.\n");
- errno = EINTR;
- return -1;
-#endif
}
void FreeTLS(rfbClient* client)
{
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
if (client->tlsSession)
{
- gnutls_deinit(client->tlsSession);
+ gnutls_deinit((gnutls_session_t)client->tlsSession);
client->tlsSession = NULL;
}
-#endif
}
diff --git a/ica/x11/libvncserver/cutpaste.c b/ica/x11/libvncclient/tls_none.c
similarity index 53%
copy from ica/x11/libvncserver/cutpaste.c
copy to ica/x11/libvncclient/tls_none.c
index 6a9dcb9..97e6a24 100644
--- a/ica/x11/libvncserver/cutpaste.c
+++ b/ica/x11/libvncclient/tls_none.c
@@ -1,11 +1,5 @@
/*
- * cutpaste.c - routines to deal with cut & paste buffers / selection.
- */
-
-/*
- * OSXvnc Copyright (C) 2001 Dan McGuirk <mcguirk at incompleteness.net>.
- * Original Xvnc code Copyright (C) 1999 AT&T Laboratories Cambridge.
- * All Rights Reserved.
+ * Copyright (C) 2012 Christian Beier.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,16 +17,42 @@
* USA.
*/
-#include <rfb/rfb.h>
+#include <rfb/rfbclient.h>
+#include <errno.h>
+#include "tls.h"
+rfbBool HandleAnonTLSAuth(rfbClient* client)
+{
+ rfbClientLog("TLS is not supported.\n");
+ return FALSE;
+}
+
+
+rfbBool HandleVeNCryptAuth(rfbClient* client)
+{
+ rfbClientLog("TLS is not supported.\n");
+ return FALSE;
+}
-/*
- * rfbSetXCutText sets the cut buffer to be the given string. We also clear
- * the primary selection. Ideally we'd like to set it to the same thing, but I
- * can't work out how to do that without some kind of helper X client.
- */
-void rfbGotXCutText(rfbScreenInfoPtr rfbScreen, char *str, int len)
+int ReadFromTLS(rfbClient* client, char *out, unsigned int n)
{
- rfbSendServerCutText(rfbScreen, str, len);
+ rfbClientLog("TLS is not supported.\n");
+ errno = EINTR;
+ return -1;
}
+
+
+int WriteToTLS(rfbClient* client, const char *buf, unsigned int n)
+{
+ rfbClientLog("TLS is not supported.\n");
+ errno = EINTR;
+ return -1;
+}
+
+
+void FreeTLS(rfbClient* client)
+{
+
+}
+
diff --git a/ica/x11/libvncclient/tls.c b/ica/x11/libvncclient/tls_openssl.c
similarity index 50%
rename from ica/x11/libvncclient/tls.c
rename to ica/x11/libvncclient/tls_openssl.c
index 5d29362..529d476 100644
--- a/ica/x11/libvncclient/tls.c
+++ b/ica/x11/libvncclient/tls_openssl.c
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2012 Philip Van Hoof <philip at codeminded.be>
* Copyright (C) 2009 Vic Lee.
*
* This is free software; you can redistribute it and/or modify
@@ -19,137 +20,270 @@
#include <rfb/rfbclient.h>
#include <errno.h>
-#ifdef WIN32
-#undef SOCKET
-#include <windows.h> /* for Sleep() */
-#define sleep(X) Sleep(1000*X) /* MinGW32 has no sleep() */
-#include <winsock2.h>
-#define read(sock,buf,len) recv(sock,buf,len,0)
-#define write(sock,buf,len) send(sock,buf,len,0)
-#endif
-#include "tls.h"
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
+#include <openssl/err.h>
+#include <openssl/ssl.h>
+#include <openssl/x509.h>
+#include <openssl/rand.h>
+#include <openssl/x509.h>
-static const char *rfbTLSPriority = "NORMAL:+DHE-DSS:+RSA:+DHE-RSA:+SRP";
-static const char *rfbAnonTLSPriority= "NORMAL:+ANON-DH";
+#include <pthread.h>
-#define DH_BITS 1024
-static gnutls_dh_params_t rfbDHParams;
+#include "tls.h"
static rfbBool rfbTLSInitialized = FALSE;
+static pthread_mutex_t *mutex_buf = NULL;
+
+struct CRYPTO_dynlock_value {
+ pthread_mutex_t mutex;
+};
+
+static void locking_function(int mode, int n, const char *file, int line)
+{
+ if (mode & CRYPTO_LOCK)
+ pthread_mutex_lock(&mutex_buf[n]);
+ else
+ pthread_mutex_unlock(&mutex_buf[n]);
+}
+
+static unsigned long id_function(void)
+{
+ return ((unsigned long) pthread_self());
+}
+
+static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line)
+{
+ struct CRYPTO_dynlock_value *value;
+
+ value = (struct CRYPTO_dynlock_value *)
+ malloc(sizeof(struct CRYPTO_dynlock_value));
+ if (!value)
+ goto err;
+ pthread_mutex_init(&value->mutex, NULL);
+
+ return value;
+
+err:
+ return (NULL);
+}
+
+static void dyn_lock_function (int mode, struct CRYPTO_dynlock_value *l, const char *file, int line)
+{
+ if (mode & CRYPTO_LOCK)
+ pthread_mutex_lock(&l->mutex);
+ else
+ pthread_mutex_unlock(&l->mutex);
+}
+
+
+static void
+dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line)
+{
+ pthread_mutex_destroy(&l->mutex);
+ free(l);
+}
+
+
+static int
+ssl_errno (SSL *ssl, int ret)
+{
+ switch (SSL_get_error (ssl, ret)) {
+ case SSL_ERROR_NONE:
+ return 0;
+ case SSL_ERROR_ZERO_RETURN:
+ /* this one does not map well at all */
+ //d(printf ("ssl_errno: SSL_ERROR_ZERO_RETURN\n"));
+ return EINVAL;
+ case SSL_ERROR_WANT_READ: /* non-fatal; retry */
+ case SSL_ERROR_WANT_WRITE: /* non-fatal; retry */
+ //d(printf ("ssl_errno: SSL_ERROR_WANT_[READ,WRITE]\n"));
+ return EAGAIN;
+ case SSL_ERROR_SYSCALL:
+ //d(printf ("ssl_errno: SSL_ERROR_SYSCALL\n"));
+ return EINTR;
+ case SSL_ERROR_SSL:
+ //d(printf ("ssl_errno: SSL_ERROR_SSL <-- very useful error...riiiiight\n"));
+ return EINTR;
+ default:
+ //d(printf ("ssl_errno: default error\n"));
+ return EINTR;
+ }
+}
static rfbBool
InitializeTLS(void)
{
- int ret;
+ int i;
if (rfbTLSInitialized) return TRUE;
- if ((ret = gnutls_global_init()) < 0 ||
- (ret = gnutls_dh_params_init(&rfbDHParams)) < 0 ||
- (ret = gnutls_dh_params_generate2(rfbDHParams, DH_BITS)) < 0)
- {
- rfbClientLog("Failed to initialized GnuTLS: %s.\n", gnutls_strerror(ret));
- return FALSE;
+
+ mutex_buf = malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
+ if (mutex_buf == NULL) {
+ rfbClientLog("Failed to initialized OpenSSL: memory.\n");
+ return (-1);
}
- rfbClientLog("GnuTLS initialized.\n");
+
+ for (i = 0; i < CRYPTO_num_locks(); i++)
+ pthread_mutex_init(&mutex_buf[i], NULL);
+
+ CRYPTO_set_locking_callback(locking_function);
+ CRYPTO_set_id_callback(id_function);
+ CRYPTO_set_dynlock_create_callback(dyn_create_function);
+ CRYPTO_set_dynlock_lock_callback(dyn_lock_function);
+ CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function);
+ SSL_load_error_strings();
+ SSLeay_add_ssl_algorithms();
+ RAND_load_file("/dev/urandom", 1024);
+
+ rfbClientLog("OpenSSL initialized.\n");
rfbTLSInitialized = TRUE;
return TRUE;
}
-/*
- * On Windows, translate WSAGetLastError() to errno values as GNU TLS does it
- * internally too. This is necessary because send() and recv() on Windows
- * don't set errno when they fail but GNUTLS expects a proper errno value.
- *
- * Use gnutls_transport_set_global_errno() like the GNU TLS documentation
- * suggests to avoid problems with different errno variables when GNU TLS and
- * libvncclient are linked to different versions of msvcrt.dll.
- */
-#ifdef WIN32
-static void WSAtoTLSErrno()
+static int
+ssl_verify (int ok, X509_STORE_CTX *ctx)
{
- switch(WSAGetLastError()) {
- case WSAEWOULDBLOCK:
- gnutls_transport_set_global_errno(EAGAIN);
- break;
- case WSAEINTR:
- gnutls_transport_set_global_errno(EINTR);
- break;
- default:
- gnutls_transport_set_global_errno(EIO);
- break;
- }
-}
-#endif
+ unsigned char md5sum[16], fingerprint[40], *f;
+ rfbClient *client;
+ char *prompt, *cert_str;
+ int err, i;
+ unsigned int md5len;
+ //char buf[257];
+ X509 *cert;
+ SSL *ssl;
+
+ if (ok)
+ return TRUE;
+
+ ssl = X509_STORE_CTX_get_ex_data (ctx, SSL_get_ex_data_X509_STORE_CTX_idx ());
+
+ client = SSL_CTX_get_app_data (ssl->ctx);
+
+ cert = X509_STORE_CTX_get_current_cert (ctx);
+ err = X509_STORE_CTX_get_error (ctx);
+
+ /* calculate the MD5 hash of the raw certificate */
+ md5len = sizeof (md5sum);
+ X509_digest (cert, EVP_md5 (), md5sum, &md5len);
+ for (i = 0, f = fingerprint; i < 16; i++, f += 3)
+ sprintf ((char *) f, "%.2x%c", md5sum[i], i != 15 ? ':' : '\0');
+
+#define GET_STRING(name) X509_NAME_oneline (name, buf, 256)
+ /* TODO: Don't just ignore certificate checks
-static ssize_t
-PushTLS(gnutls_transport_ptr_t transport, const void *data, size_t len)
+ fingerprint = key to check in db
+
+ GET_STRING (X509_get_issuer_name (cert));
+ GET_STRING (X509_get_subject_name (cert));
+ cert->valid (bool: GOOD or BAD) */
+
+ ok = TRUE;
+
+ return ok;
+}
+
+static int sock_read_ready(SSL *ssl, uint32_t ms)
{
- rfbClient *client = (rfbClient*)transport;
- int ret;
+ int r = 0;
+ fd_set fds;
+ struct timeval tv;
- while (1)
- {
- ret = write(client->sock, data, len);
- if (ret < 0)
- {
-#ifdef WIN32
- WSAtoTLSErrno();
-#endif
- if (errno == EINTR) continue;
- return -1;
- }
- return ret;
- }
+ FD_ZERO(&fds);
+
+ FD_SET(SSL_get_fd(ssl), &fds);
+
+ tv.tv_sec = ms / 1000;
+ tv.tv_usec = (ms % 1000) * 1000;
+
+ r = select (SSL_get_fd(ssl) + 1, &fds, NULL, NULL, &tv);
+
+ return r;
}
+static int wait_for_data(SSL *ssl, int ret, int timeout)
+{
+ struct timeval tv;
+ fd_set fds;
+ int err;
+ int retval = 1;
+
+ err = SSL_get_error(ssl, ret);
+
+ switch(err)
+ {
+ case SSL_ERROR_WANT_READ:
+ case SSL_ERROR_WANT_WRITE:
+ ret = sock_read_ready(ssl, timeout*1000);
+
+ if (ret == -1) {
+ retval = 2;
+ }
+
+ break;
+ default:
+ retval = 3;
+ break;
+ }
+
+ ERR_clear_error();
+
+ return retval;
+}
-static ssize_t
-PullTLS(gnutls_transport_ptr_t transport, void *data, size_t len)
+static SSL *
+open_ssl_connection (rfbClient *client, int sockfd, rfbBool anonTLS)
{
- rfbClient *client = (rfbClient*)transport;
- int ret;
+ SSL_CTX *ssl_ctx = NULL;
+ SSL *ssl = NULL;
+ int n, finished = 0;
+ BIO *sbio;
- while (1)
+ ssl_ctx = SSL_CTX_new (SSLv23_client_method ());
+ SSL_CTX_set_default_verify_paths (ssl_ctx);
+ SSL_CTX_set_verify (ssl_ctx, SSL_VERIFY_NONE, &ssl_verify);
+ ssl = SSL_new (ssl_ctx);
+
+ /* TODO: finetune this list, take into account anonTLS bool */
+ SSL_set_cipher_list(ssl, "ALL");
+
+ SSL_set_fd (ssl, sockfd);
+ SSL_CTX_set_app_data (ssl_ctx, client);
+
+ do
{
- ret = read(client->sock, data, len);
- if (ret < 0)
+ n = SSL_connect(ssl);
+
+ if (n != 1)
{
-#ifdef WIN32
- WSAtoTLSErrno();
-#endif
- if (errno == EINTR) continue;
- return -1;
+ if (wait_for_data(ssl, n, 1) != 1)
+ {
+ finished = 1;
+ if (ssl->ctx)
+ SSL_CTX_free (ssl->ctx);
+ SSL_free(ssl);
+ SSL_shutdown (ssl);
+
+ return NULL;
+ }
}
- return ret;
- }
+ } while( n != 1 && finished != 1 );
+
+ return ssl;
}
+
static rfbBool
InitializeTLSSession(rfbClient* client, rfbBool anonTLS)
{
int ret;
- const char *p;
if (client->tlsSession) return TRUE;
- if ((ret = gnutls_init(&client->tlsSession, GNUTLS_CLIENT)) < 0)
- {
- rfbClientLog("Failed to initialized TLS session: %s.\n", gnutls_strerror(ret));
- return FALSE;
- }
-
- if ((ret = gnutls_priority_set_direct(client->tlsSession,
- anonTLS ? rfbAnonTLSPriority : rfbTLSPriority, &p)) < 0)
- {
- rfbClientLog("Warning: Failed to set TLS priority: %s (%s).\n", gnutls_strerror(ret), p);
- }
+ client->tlsSession = open_ssl_connection (client, client->sock, anonTLS);
- gnutls_transport_set_ptr(client->tlsSession, (gnutls_transport_ptr_t)client);
- gnutls_transport_set_push_function(client->tlsSession, PushTLS);
- gnutls_transport_set_pull_function(client->tlsSession, PullTLS);
+ if (!client->tlsSession)
+ return FALSE;
rfbClientLog("TLS session initialized.\n");
@@ -159,16 +293,6 @@ InitializeTLSSession(rfbClient* client, rfbBool anonTLS)
static rfbBool
SetTLSAnonCredential(rfbClient* client)
{
- gnutls_anon_client_credentials anonCred;
- int ret;
-
- if ((ret = gnutls_anon_allocate_client_credentials(&anonCred)) < 0 ||
- (ret = gnutls_credentials_set(client->tlsSession, GNUTLS_CRD_ANON, anonCred)) < 0)
- {
- FreeTLS(client);
- rfbClientLog("Failed to create anonymous credentials: %s", gnutls_strerror(ret));
- return FALSE;
- }
rfbClientLog("TLS anonymous credential created.\n");
return TRUE;
}
@@ -179,16 +303,18 @@ HandshakeTLS(rfbClient* client)
int timeout = 15;
int ret;
- while (timeout > 0 && (ret = gnutls_handshake(client->tlsSession)) < 0)
+return TRUE;
+
+ while (timeout > 0 && (ret = SSL_do_handshake(client->tlsSession)) < 0)
{
- if (!gnutls_error_is_fatal(ret))
+ if (ret != -1)
{
rfbClientLog("TLS handshake blocking.\n");
sleep(1);
timeout--;
continue;
}
- rfbClientLog("TLS handshake failed: %s.\n", gnutls_strerror(ret));
+ rfbClientLog("TLS handshake failed: -.\n");
FreeTLS(client);
return FALSE;
}
@@ -270,78 +396,9 @@ ReadVeNCryptSecurityType(rfbClient* client, uint32_t *result)
return TRUE;
}
-static void
-FreeX509Credential(rfbCredential *cred)
-{
- if (cred->x509Credential.x509CACertFile) free(cred->x509Credential.x509CACertFile);
- if (cred->x509Credential.x509CACrlFile) free(cred->x509Credential.x509CACrlFile);
- if (cred->x509Credential.x509ClientCertFile) free(cred->x509Credential.x509ClientCertFile);
- if (cred->x509Credential.x509ClientKeyFile) free(cred->x509Credential.x509ClientKeyFile);
- free(cred);
-}
-
-static gnutls_certificate_credentials_t
-CreateX509CertCredential(rfbCredential *cred)
-{
- gnutls_certificate_credentials_t x509_cred;
- int ret;
-
- if (!cred->x509Credential.x509CACertFile)
- {
- rfbClientLog("No CA certificate provided.\n");
- return NULL;
- }
-
- if ((ret = gnutls_certificate_allocate_credentials(&x509_cred)) < 0)
- {
- rfbClientLog("Cannot allocate credentials: %s.\n", gnutls_strerror(ret));
- return NULL;
- }
- if ((ret = gnutls_certificate_set_x509_trust_file(x509_cred,
- cred->x509Credential.x509CACertFile, GNUTLS_X509_FMT_PEM)) < 0)
- {
- rfbClientLog("Cannot load CA credentials: %s.\n", gnutls_strerror(ret));
- gnutls_certificate_free_credentials (x509_cred);
- return NULL;
- }
- if (cred->x509Credential.x509ClientCertFile && cred->x509Credential.x509ClientKeyFile)
- {
- if ((ret = gnutls_certificate_set_x509_key_file(x509_cred,
- cred->x509Credential.x509ClientCertFile, cred->x509Credential.x509ClientKeyFile,
- GNUTLS_X509_FMT_PEM)) < 0)
- {
- rfbClientLog("Cannot load client certificate or key: %s.\n", gnutls_strerror(ret));
- gnutls_certificate_free_credentials (x509_cred);
- return NULL;
- }
- } else
- {
- rfbClientLog("No client certificate or key provided.\n");
- }
- if (cred->x509Credential.x509CACrlFile)
- {
- if ((ret = gnutls_certificate_set_x509_crl_file(x509_cred,
- cred->x509Credential.x509CACrlFile, GNUTLS_X509_FMT_PEM)) < 0)
- {
- rfbClientLog("Cannot load CRL: %s.\n", gnutls_strerror(ret));
- gnutls_certificate_free_credentials (x509_cred);
- return NULL;
- }
- } else
- {
- rfbClientLog("No CRL provided.\n");
- }
- gnutls_certificate_set_dh_params (x509_cred, rfbDHParams);
- return x509_cred;
-}
-
-#endif
-
rfbBool
HandleAnonTLSAuth(rfbClient* client)
{
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
-
if (!InitializeTLS() || !InitializeTLSSession(client, TRUE)) return FALSE;
if (!SetTLSAnonCredential(client)) return FALSE;
@@ -349,21 +406,15 @@ HandleAnonTLSAuth(rfbClient* client)
if (!HandshakeTLS(client)) return FALSE;
return TRUE;
-
-#else
- rfbClientLog("TLS is not supported.\n");
- return FALSE;
-#endif
}
rfbBool
HandleVeNCryptAuth(rfbClient* client)
{
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
uint8_t major, minor, status;
uint32_t authScheme;
rfbBool anonTLS;
- gnutls_certificate_credentials_t x509_cred = NULL;
+// gnutls_certificate_credentials_t x509_cred = NULL;
int ret;
if (!InitializeTLS()) return FALSE;
@@ -433,9 +484,10 @@ HandleVeNCryptAuth(rfbClient* client)
return FALSE;
}
+ /* TODO: don't just ignore this
x509_cred = CreateX509CertCredential(cred);
FreeX509Credential(cred);
- if (!x509_cred) return FALSE;
+ if (!x509_cred) return FALSE; */
}
/* Start up the TLS session */
@@ -447,12 +499,13 @@ HandleVeNCryptAuth(rfbClient* client)
}
else
{
- if ((ret = gnutls_credentials_set(client->tlsSession, GNUTLS_CRD_CERTIFICATE, x509_cred)) < 0)
- {
- rfbClientLog("Cannot set x509 credential: %s.\n", gnutls_strerror(ret));
- FreeTLS(client);
+/* TODO: don't just ignore this
+ if ((ret = gnutls_credentials_set(client->tlsSession, GNUTLS_CRD_CERTIFICATE, x509_cred)) < 0)
+ {
+ rfbClientLog("Cannot set x509 credential: %s.\n", gnutls_strerror(ret));
+ FreeTLS(client); */
return FALSE;
- }
+ // }
}
if (!HandshakeTLS(client)) return FALSE;
@@ -463,71 +516,72 @@ HandleVeNCryptAuth(rfbClient* client)
* to do actual sub authentication.
*/
return TRUE;
-
-#else
- rfbClientLog("TLS is not supported.\n");
- return FALSE;
-#endif
}
int
ReadFromTLS(rfbClient* client, char *out, unsigned int n)
{
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
ssize_t ret;
- ret = gnutls_record_recv(client->tlsSession, out, n);
- if (ret >= 0) return ret;
- if (ret == GNUTLS_E_REHANDSHAKE || ret == GNUTLS_E_AGAIN)
- {
- errno = EAGAIN;
- } else
- {
- rfbClientLog("Error reading from TLS: %s.\n", gnutls_strerror(ret));
- errno = EINTR;
+ ret = SSL_read (client->tlsSession, out, n);
+
+ if (ret >= 0)
+ return ret;
+ else {
+ errno = ssl_errno (client->tlsSession, ret);
+
+ if (errno != EAGAIN) {
+ rfbClientLog("Error reading from TLS: -.\n");
+ }
}
+
return -1;
-#else
- rfbClientLog("TLS is not supported.\n");
- errno = EINTR;
- return -1;
-#endif
}
int
WriteToTLS(rfbClient* client, char *buf, unsigned int n)
{
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
unsigned int offset = 0;
ssize_t ret;
while (offset < n)
{
- ret = gnutls_record_send(client->tlsSession, buf+offset, (size_t)(n-offset));
+
+ ret = SSL_write (client->tlsSession, buf + offset, (size_t)(n-offset));
+
+ if (ret < 0)
+ errno = ssl_errno (client->tlsSession, ret);
+
if (ret == 0) continue;
if (ret < 0)
{
- if (ret == GNUTLS_E_AGAIN || ret == GNUTLS_E_INTERRUPTED) continue;
- rfbClientLog("Error writing to TLS: %s.\n", gnutls_strerror(ret));
+ if (errno == EAGAIN || errno == EWOULDBLOCK) continue;
+ rfbClientLog("Error writing to TLS: -\n");
return -1;
}
offset += (unsigned int)ret;
}
return offset;
-#else
- rfbClientLog("TLS is not supported.\n");
- errno = EINTR;
- return -1;
-#endif
}
void FreeTLS(rfbClient* client)
{
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
- if (client->tlsSession)
- {
- gnutls_deinit(client->tlsSession);
- client->tlsSession = NULL;
+ int i;
+
+ if (mutex_buf != NULL) {
+ CRYPTO_set_dynlock_create_callback(NULL);
+ CRYPTO_set_dynlock_lock_callback(NULL);
+ CRYPTO_set_dynlock_destroy_callback(NULL);
+
+ CRYPTO_set_locking_callback(NULL);
+ CRYPTO_set_id_callback(NULL);
+
+ for (i = 0; i < CRYPTO_num_locks(); i++)
+ pthread_mutex_destroy(&mutex_buf[i]);
+ free(mutex_buf);
+ mutex_buf = NULL;
}
-#endif
+
+ SSL_free(client->tlsSession);
}
+
diff --git a/ica/x11/libvncclient/vncviewer.c b/ica/x11/libvncclient/vncviewer.c
index 1c5ea6e..4153c97 100644
--- a/ica/x11/libvncclient/vncviewer.c
+++ b/ica/x11/libvncclient/vncviewer.c
@@ -191,11 +191,12 @@ rfbClient* rfbGetClient(int bitsPerSample,int samplesPerPixel,
client->authScheme = 0;
client->subAuthScheme = 0;
client->GetCredential = NULL;
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
client->tlsSession = NULL;
-#endif
client->sock = -1;
client->listenSock = -1;
+ client->listenAddress = NULL;
+ client->listen6Sock = -1;
+ client->listen6Address = NULL;
client->clientAuthSchemes = NULL;
return client;
}
@@ -362,9 +363,8 @@ void rfbClientCleanup(rfbClient* client) {
#endif
#endif
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
FreeTLS(client);
-#endif
+
if (client->sock >= 0)
close(client->sock);
if (client->listenSock >= 0)
diff --git a/ica/x11/libvncserver/auth.c b/ica/x11/libvncserver/auth.c
index f4c4a33..08eb2f4 100644
--- a/ica/x11/libvncserver/auth.c
+++ b/ica/x11/libvncserver/auth.c
@@ -127,12 +127,37 @@ rfbVncAuthSendChallenge(rfbClientPtr cl)
* Send the NO AUTHENTICATION. SCARR
*/
+/*
+ * The rfbVncAuthNone function is currently the only function that contains
+ * special logic for the built-in Mac OS X VNC client which is activated by
+ * a protocolMinorVersion == 889 coming from the Mac OS X VNC client.
+ * The rfbProcessClientInitMessage function does understand how to handle the
+ * RFB_INITIALISATION_SHARED state which was introduced to support the built-in
+ * Mac OS X VNC client, but rfbProcessClientInitMessage does not examine the
+ * protocolMinorVersion version field and so its support for the
+ * RFB_INITIALISATION_SHARED state is not restricted to just the OS X client.
+ */
+
static void
rfbVncAuthNone(rfbClientPtr cl)
{
+ /* The built-in Mac OS X VNC client behaves in a non-conforming fashion
+ * when the server version is 3.7 or later AND the list of security types
+ * sent to the OS X client contains the 'None' authentication type AND
+ * the OS X client sends back the 'None' type as its choice. In this case,
+ * and this case ONLY, the built-in Mac OS X VNC client will NOT send the
+ * ClientInit message and instead will behave as though an implicit
+ * ClientInit message containing a shared-flag of true has been sent.
+ * The special state RFB_INITIALISATION_SHARED represents this case.
+ * The Mac OS X VNC client can be detected by checking protocolMinorVersion
+ * for a value of 889. No other VNC client is known to use this value
+ * for protocolMinorVersion. */
uint32_t authResult;
- if (cl->protocolMajorVersion==3 && cl->protocolMinorVersion > 7) {
+ /* The built-in Mac OS X VNC client expects to NOT receive a SecurityResult
+ * message for authentication type 'None'. Since its protocolMinorVersion
+ * is greater than 7 (it is 889) this case must be tested for specially. */
+ if (cl->protocolMajorVersion==3 && cl->protocolMinorVersion > 7 && cl->protocolMinorVersion != 889) {
rfbLog("rfbProcessClientSecurityType: returning securityResult for client rfb version >= 3.8\n");
authResult = Swap32IfLE(rfbVncAuthOK);
if (rfbWriteExact(cl, (char *)&authResult, 4) < 0) {
@@ -141,7 +166,12 @@ rfbVncAuthNone(rfbClientPtr cl)
return;
}
}
- cl->state = RFB_INITIALISATION;
+ cl->state = cl->protocolMinorVersion == 889 ? RFB_INITIALISATION_SHARED : RFB_INITIALISATION;
+ if (cl->state == RFB_INITIALISATION_SHARED)
+ /* In this case we must call rfbProcessClientMessage now because
+ * otherwise we would hang waiting for data to be received from the
+ * client (the ClientInit message which will never come). */
+ rfbProcessClientMessage(cl);
return;
}
diff --git a/ica/x11/libvncserver/cargs.c b/ica/x11/libvncserver/cargs.c
index 332ffa1..b9eb02b 100644
--- a/ica/x11/libvncserver/cargs.c
+++ b/ica/x11/libvncserver/cargs.c
@@ -22,6 +22,9 @@ rfbUsage(void)
rfbProtocolExtension* extension;
fprintf(stderr, "-rfbport port TCP port for RFB protocol\n");
+#ifdef LIBVNCSERVER_IPv6
+ fprintf(stderr, "-rfbportv6 port TCP6 port for RFB protocol\n");
+#endif
fprintf(stderr, "-rfbwait time max time in ms to wait for RFB client\n");
fprintf(stderr, "-rfbauth passwd-file use authentication on RFB protocol\n"
" (use 'storepasswd' to create a password file)\n");
@@ -42,10 +45,17 @@ rfbUsage(void)
"instead)\n");
fprintf(stderr, "-httpdir dir-path enable http server using dir-path home\n");
fprintf(stderr, "-httpport portnum use portnum for http connection\n");
+#ifdef LIBVNCSERVER_IPv6
+ fprintf(stderr, "-httpportv6 portnum use portnum for IPv6 http connection\n");
+#endif
fprintf(stderr, "-enablehttpproxy enable http proxy support\n");
fprintf(stderr, "-progressive height enable progressive updating for slow links\n");
fprintf(stderr, "-listen ipaddr listen for connections only on network interface with\n");
fprintf(stderr, " addr ipaddr. '-listen localhost' and hostname work too.\n");
+#ifdef LIBVNCSERVER_IPv6
+ fprintf(stderr, "-listenv6 ipv6addr listen for IPv6 connections only on network interface with\n");
+ fprintf(stderr, " addr ipv6addr. '-listen localhost' and hostname work too.\n");
+#endif
for(extension=rfbGetExtensionIterator();extension;extension=extension->next)
if(extension->usage)
@@ -80,6 +90,14 @@ rfbProcessArguments(rfbScreenInfoPtr rfbScreen,int* argc, char *argv[])
return FALSE;
}
rfbScreen->port = atoi(argv[++i]);
+#ifdef LIBVNCSERVER_IPv6
+ } else if (strcmp(argv[i], "-rfbportv6") == 0) { /* -rfbportv6 port */
+ if (i + 1 >= *argc) {
+ rfbUsage();
+ return FALSE;
+ }
+ rfbScreen->ipv6port = atoi(argv[++i]);
+#endif
} else if (strcmp(argv[i], "-rfbwait") == 0) { /* -rfbwait ms */
if (i + 1 >= *argc) {
rfbUsage();
@@ -147,6 +165,14 @@ rfbProcessArguments(rfbScreenInfoPtr rfbScreen,int* argc, char *argv[])
return FALSE;
}
rfbScreen->httpPort = atoi(argv[++i]);
+#ifdef LIBVNCSERVER_IPv6
+ } else if (strcmp(argv[i], "-httpportv6") == 0) { /* -httpportv6 portnum */
+ if (i + 1 >= *argc) {
+ rfbUsage();
+ return FALSE;
+ }
+ rfbScreen->http6Port = atoi(argv[++i]);
+#endif
} else if (strcmp(argv[i], "-enablehttpproxy") == 0) {
rfbScreen->httpEnableProxyConnect = TRUE;
} else if (strcmp(argv[i], "-progressive") == 0) { /* -httpport portnum */
@@ -163,6 +189,28 @@ rfbProcessArguments(rfbScreenInfoPtr rfbScreen,int* argc, char *argv[])
if (! rfbStringToAddr(argv[++i], &(rfbScreen->listenInterface))) {
return FALSE;
}
+#ifdef LIBVNCSERVER_IPv6
+ } else if (strcmp(argv[i], "-listenv6") == 0) { /* -listenv6 ipv6addr */
+ if (i + 1 >= *argc) {
+ rfbUsage();
+ return FALSE;
+ }
+ rfbScreen->listen6Interface = argv[++i];
+#endif
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ } else if (strcmp(argv[i], "-sslkeyfile") == 0) { /* -sslkeyfile sslkeyfile */
+ if (i + 1 >= *argc) {
+ rfbUsage();
+ return FALSE;
+ }
+ rfbScreen->sslkeyfile = argv[++i];
+ } else if (strcmp(argv[i], "-sslcertfile") == 0) { /* -sslcertfile sslcertfile */
+ if (i + 1 >= *argc) {
+ rfbUsage();
+ return FALSE;
+ }
+ rfbScreen->sslcertfile = argv[++i];
+#endif
} else {
rfbProtocolExtension* extension;
int handled=0;
diff --git a/ica/x11/libvncserver/httpd.c b/ica/x11/libvncserver/httpd.c
index ad2a51b..792a52b 100644
--- a/ica/x11/libvncserver/httpd.c
+++ b/ica/x11/libvncserver/httpd.c
@@ -3,6 +3,7 @@
*/
/*
+ * Copyright (C) 2011-2012 Christian Beier <dontmind at freeshell.org>
* Copyright (C) 2002 RealVNC Ltd.
* Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
*
@@ -22,6 +23,11 @@
* USA.
*/
+#ifdef __STRICT_ANSI__
+#define _BSD_SOURCE
+#define _POSIX_SOURCE
+#endif
+
#include <rfb/rfb.h>
#include <ctype.h>
@@ -59,20 +65,6 @@
#include <tcpd.h>
#endif
-#define connection_close
-#ifndef connection_close
-
-#define NOT_FOUND_STR "HTTP/1.0 404 Not found\r\n\r\n" \
- "<HEAD><TITLE>File Not Found</TITLE></HEAD>\n" \
- "<BODY><H1>File Not Found</H1></BODY>\n"
-
-#define INVALID_REQUEST_STR "HTTP/1.0 400 Invalid Request\r\n\r\n" \
- "<HEAD><TITLE>Invalid Request</TITLE></HEAD>\n" \
- "<BODY><H1>Invalid request</H1></BODY>\n"
-
-#define OK_STR "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"
-
-#else
#define NOT_FOUND_STR "HTTP/1.0 404 Not found\r\nConnection: close\r\n\r\n" \
"<HEAD><TITLE>File Not Found</TITLE></HEAD>\n" \
@@ -82,9 +74,10 @@
"<HEAD><TITLE>Invalid Request</TITLE></HEAD>\n" \
"<BODY><H1>Invalid request</H1></BODY>\n"
-#define OK_STR "HTTP/1.0 200 OK\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n"
+#define OK_STR "HTTP/1.0 200 OK\r\nConnection: close\r\n\r\n"
+#define OK_STR_HTML "HTTP/1.0 200 OK\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n"
+
-#endif
static void httpProcessInput(rfbScreenInfoPtr screen);
static rfbBool compareAndSkip(char **ptr, const char *str);
@@ -115,17 +108,27 @@ rfbHttpInitSockets(rfbScreenInfoPtr rfbScreen)
rfbScreen->httpPort = rfbScreen->port-100;
}
- rfbLog("Listening for HTTP connections on TCP port %d\n", rfbScreen->httpPort);
-
- rfbLog(" URL http://%s:%d\n",rfbScreen->thisHost,rfbScreen->httpPort);
-
if ((rfbScreen->httpListenSock =
rfbListenOnTCPPort(rfbScreen->httpPort, rfbScreen->listenInterface)) < 0) {
rfbLogPerror("ListenOnTCPPort");
return;
}
+ rfbLog("Listening for HTTP connections on TCP port %d\n", rfbScreen->httpPort);
+ rfbLog(" URL http://%s:%d\n",rfbScreen->thisHost,rfbScreen->httpPort);
+
+#ifdef LIBVNCSERVER_IPv6
+ if (rfbScreen->http6Port == 0) {
+ rfbScreen->http6Port = rfbScreen->ipv6port-100;
+ }
- /*AddEnabledDevice(httpListenSock);*/
+ if ((rfbScreen->httpListen6Sock
+ = rfbListenOnTCP6Port(rfbScreen->http6Port, rfbScreen->listen6Interface)) < 0) {
+ /* ListenOnTCP6Port has its own detailed error printout */
+ return;
+ }
+ rfbLog("Listening for HTTP connections on TCP6 port %d\n", rfbScreen->http6Port);
+ rfbLog(" URL http://%s:%d\n",rfbScreen->thisHost,rfbScreen->http6Port);
+#endif
}
void rfbHttpShutdownSockets(rfbScreenInfoPtr rfbScreen) {
@@ -134,6 +137,18 @@ void rfbHttpShutdownSockets(rfbScreenInfoPtr rfbScreen) {
FD_CLR(rfbScreen->httpSock,&rfbScreen->allFds);
rfbScreen->httpSock=-1;
}
+
+ if(rfbScreen->httpListenSock>-1) {
+ close(rfbScreen->httpListenSock);
+ FD_CLR(rfbScreen->httpListenSock,&rfbScreen->allFds);
+ rfbScreen->httpListenSock=-1;
+ }
+
+ if(rfbScreen->httpListen6Sock>-1) {
+ close(rfbScreen->httpListen6Sock);
+ FD_CLR(rfbScreen->httpListen6Sock,&rfbScreen->allFds);
+ rfbScreen->httpListen6Sock=-1;
+ }
}
/*
@@ -147,7 +162,11 @@ rfbHttpCheckFds(rfbScreenInfoPtr rfbScreen)
int nfds;
fd_set fds;
struct timeval tv;
+#ifdef LIBVNCSERVER_IPv6
+ struct sockaddr_storage addr;
+#else
struct sockaddr_in addr;
+#endif
socklen_t addrlen = sizeof(addr);
if (!rfbScreen->httpDir)
@@ -158,12 +177,15 @@ rfbHttpCheckFds(rfbScreenInfoPtr rfbScreen)
FD_ZERO(&fds);
FD_SET(rfbScreen->httpListenSock, &fds);
+ if (rfbScreen->httpListen6Sock >= 0) {
+ FD_SET(rfbScreen->httpListen6Sock, &fds);
+ }
if (rfbScreen->httpSock >= 0) {
FD_SET(rfbScreen->httpSock, &fds);
}
tv.tv_sec = 0;
tv.tv_usec = 0;
- nfds = select(max(rfbScreen->httpSock,rfbScreen->httpListenSock) + 1, &fds, NULL, NULL, &tv);
+ nfds = select(max(rfbScreen->httpListen6Sock, max(rfbScreen->httpSock,rfbScreen->httpListenSock)) + 1, &fds, NULL, NULL, &tv);
if (nfds == 0) {
return;
}
@@ -180,19 +202,36 @@ rfbHttpCheckFds(rfbScreenInfoPtr rfbScreen)
httpProcessInput(rfbScreen);
}
- if (FD_ISSET(rfbScreen->httpListenSock, &fds)) {
+ if (FD_ISSET(rfbScreen->httpListenSock, &fds) || FD_ISSET(rfbScreen->httpListen6Sock, &fds)) {
if (rfbScreen->httpSock >= 0) close(rfbScreen->httpSock);
- if ((rfbScreen->httpSock = accept(rfbScreen->httpListenSock,
- (struct sockaddr *)&addr, &addrlen)) < 0) {
- rfbLogPerror("httpCheckFds: accept");
- return;
+ if(FD_ISSET(rfbScreen->httpListenSock, &fds)) {
+ if ((rfbScreen->httpSock = accept(rfbScreen->httpListenSock, (struct sockaddr *)&addr, &addrlen)) < 0) {
+ rfbLogPerror("httpCheckFds: accept");
+ return;
+ }
+ }
+ else if(FD_ISSET(rfbScreen->httpListen6Sock, &fds)) {
+ if ((rfbScreen->httpSock = accept(rfbScreen->httpListen6Sock, (struct sockaddr *)&addr, &addrlen)) < 0) {
+ rfbLogPerror("httpCheckFds: accept");
+ return;
+ }
}
+
#ifdef USE_LIBWRAP
- if(!hosts_ctl("vnc",STRING_UNKNOWN,inet_ntoa(addr.sin_addr),
+ char host[1024];
+#ifdef LIBVNCSERVER_IPv6
+ if(getnameinfo((struct sockaddr*)&addr, addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST) != 0) {
+ rfbLogPerror("httpCheckFds: error in getnameinfo");
+ host[0] = '\0';
+ }
+#else
+ memcpy(host, inet_ntoa(addr.sin_addr), sizeof(host));
+#endif
+ if(!hosts_ctl("vnc",STRING_UNKNOWN, host,
STRING_UNKNOWN)) {
rfbLog("Rejected HTTP connection from client %s\n",
- inet_ntoa(addr.sin_addr));
+ host);
close(rfbScreen->httpSock);
rfbScreen->httpSock=-1;
return;
@@ -225,7 +264,11 @@ static rfbClientRec cl;
static void
httpProcessInput(rfbScreenInfoPtr rfbScreen)
{
+#ifdef LIBVNCSERVER_IPv6
+ struct sockaddr_storage addr;
+#else
struct sockaddr_in addr;
+#endif
socklen_t addrlen = sizeof(addr);
char fullFname[512];
char params[1024];
@@ -346,16 +389,18 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen)
return;
}
- if (strchr(fname+1, '/') != NULL) {
- rfbErr("httpd: asking for file in other directory\n");
- rfbWriteExact(&cl, NOT_FOUND_STR, strlen(NOT_FOUND_STR));
- httpCloseSock(rfbScreen);
- return;
- }
getpeername(rfbScreen->httpSock, (struct sockaddr *)&addr, &addrlen);
+#ifdef LIBVNCSERVER_IPv6
+ char host[1024];
+ if(getnameinfo((struct sockaddr*)&addr, addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST) != 0) {
+ rfbLogPerror("httpProcessInput: error in getnameinfo");
+ }
+ rfbLog("httpd: get '%s' for %s\n", fname+1, host);
+#else
rfbLog("httpd: get '%s' for %s\n", fname+1,
inet_ntoa(addr.sin_addr));
+#endif
/* Extract parameters from the URL string if necessary */
@@ -392,7 +437,10 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen)
return;
}
- rfbWriteExact(&cl, OK_STR, strlen(OK_STR));
+ if(performSubstitutions) /* is the 'index.vnc' file */
+ rfbWriteExact(&cl, OK_STR_HTML, strlen(OK_STR_HTML));
+ else
+ rfbWriteExact(&cl, OK_STR, strlen(OK_STR));
while (1) {
int n = fread(buf, 1, BUF_SIZE-1, fd);
@@ -578,7 +626,8 @@ parseParams(const char *request, char *result, int max_bytes)
/*
* Check if the string consists only of alphanumeric characters, '+'
- * signs, underscores, and dots. Replace all '+' signs with spaces.
+ * signs, underscores, dots, colons and square brackets.
+ * Replace all '+' signs with spaces.
*/
static rfbBool
@@ -587,7 +636,8 @@ validateString(char *str)
char *ptr;
for (ptr = str; *ptr != '\0'; ptr++) {
- if (!isalnum(*ptr) && *ptr != '_' && *ptr != '.') {
+ if (!isalnum(*ptr) && *ptr != '_' && *ptr != '.'
+ && *ptr != ':' && *ptr != '[' && *ptr != ']' ) {
if (*ptr == '+') {
*ptr = ' ';
} else {
diff --git a/ica/x11/libvncserver/main.c b/ica/x11/libvncserver/main.c
index 0edf994..4cb18ac 100644
--- a/ica/x11/libvncserver/main.c
+++ b/ica/x11/libvncserver/main.c
@@ -569,21 +569,37 @@ listenerRun(void *data)
{
rfbScreenInfoPtr screen=(rfbScreenInfoPtr)data;
int client_fd;
- struct sockaddr_in peer;
- rfbClientPtr cl;
+ struct sockaddr_storage peer;
+ rfbClientPtr cl = NULL;
socklen_t len;
-
- len = sizeof(peer);
+ fd_set listen_fds; /* temp file descriptor list for select() */
/* TODO: this thread wont die by restarting the server */
/* TODO: HTTP is not handled */
- while ((client_fd = accept(screen->listenSock,
- (struct sockaddr*)&peer, &len)) >= 0) {
- cl = rfbNewClient(screen,client_fd);
- len = sizeof(peer);
-
+ while (1) {
+ client_fd = -1;
+ FD_ZERO(&listen_fds);
+ if(screen->listenSock >= 0)
+ FD_SET(screen->listenSock, &listen_fds);
+ if(screen->listen6Sock >= 0)
+ FD_SET(screen->listen6Sock, &listen_fds);
+
+ if (select(screen->maxFd+1, &listen_fds, NULL, NULL, NULL) == -1) {
+ rfbLogPerror("listenerRun: error in select");
+ return NULL;
+ }
+
+ /* there is something on the listening sockets, handle new connections */
+ len = sizeof (peer);
+ if (FD_ISSET(screen->listenSock, &listen_fds))
+ client_fd = accept(screen->listenSock, (struct sockaddr*)&peer, &len);
+ else if (FD_ISSET(screen->listen6Sock, &listen_fds))
+ client_fd = accept(screen->listen6Sock, (struct sockaddr*)&peer, &len);
+
+ if(client_fd >= 0)
+ cl = rfbNewClient(screen,client_fd);
if (cl && !cl->onHold )
- rfbStartOnHoldClient(cl);
+ rfbStartOnHoldClient(cl);
}
return(NULL);
}
@@ -809,6 +825,7 @@ rfbScreenInfoPtr rfbGetScreen(int* argc,char** argv,
screen->clientHead=NULL;
screen->pointerClient=NULL;
screen->port=5900;
+ screen->ipv6port=5900;
screen->socketState=RFB_SOCKET_INIT;
screen->inetdInitDone = FALSE;
@@ -821,12 +838,15 @@ rfbScreenInfoPtr rfbGetScreen(int* argc,char** argv,
screen->maxFd=0;
screen->listenSock=-1;
+ screen->listen6Sock=-1;
screen->httpInitDone=FALSE;
screen->httpEnableProxyConnect=FALSE;
screen->httpPort=0;
+ screen->http6Port=0;
screen->httpDir=NULL;
screen->httpListenSock=-1;
+ screen->httpListen6Sock=-1;
screen->httpSock=-1;
screen->desktopName = "LibVNCServer";
diff --git a/ica/x11/libvncserver/rfbcrypto.h b/ica/x11/libvncserver/rfbcrypto.h
new file mode 100644
index 0000000..9dc3e63
--- /dev/null
+++ b/ica/x11/libvncserver/rfbcrypto.h
@@ -0,0 +1,12 @@
+#ifndef _RFB_CRYPTO_H
+#define _RFB_CRYPTO_H 1
+
+#include <sys/uio.h>
+
+#define SHA1_HASH_SIZE 20
+#define MD5_HASH_SIZE 16
+
+void digestmd5(const struct iovec *iov, int iovcnt, void *dest);
+void digestsha1(const struct iovec *iov, int iovcnt, void *dest);
+
+#endif
diff --git a/ica/x11/libvncserver/rfbcrypto_gnutls.c b/ica/x11/libvncserver/rfbcrypto_gnutls.c
new file mode 100644
index 0000000..2ecb2da
--- /dev/null
+++ b/ica/x11/libvncserver/rfbcrypto_gnutls.c
@@ -0,0 +1,50 @@
+/*
+ * rfbcrypto_gnutls.c - Crypto wrapper (gnutls version)
+ */
+
+/*
+ * Copyright (C) 2011 Gernot Tenchio
+ *
+ * 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.
+ */
+
+#include <string.h>
+#include <gcrypt.h>
+#include "rfbcrypto.h"
+
+void digestmd5(const struct iovec *iov, int iovcnt, void *dest)
+{
+ gcry_md_hd_t c;
+ int i;
+
+ gcry_md_open(&c, GCRY_MD_MD5, 0);
+ for (i = 0; i < iovcnt; i++)
+ gcry_md_write(c, iov[i].iov_base, iov[i].iov_len);
+ gcry_md_final(c);
+ memcpy(dest, gcry_md_read(c, 0), gcry_md_get_algo_dlen(GCRY_MD_MD5));
+}
+
+void digestsha1(const struct iovec *iov, int iovcnt, void *dest)
+{
+ gcry_md_hd_t c;
+ int i;
+
+ gcry_md_open(&c, GCRY_MD_SHA1, 0);
+ for (i = 0; i < iovcnt; i++)
+ gcry_md_write(c, iov[i].iov_base, iov[i].iov_len);
+ gcry_md_final(c);
+ memcpy(dest, gcry_md_read(c, 0), gcry_md_get_algo_dlen(GCRY_MD_SHA1));
+}
diff --git a/ica/x11/libvncserver/cutpaste.c b/ica/x11/libvncserver/rfbcrypto_included.c
similarity index 53%
copy from ica/x11/libvncserver/cutpaste.c
copy to ica/x11/libvncserver/rfbcrypto_included.c
index 6a9dcb9..58c2e93 100644
--- a/ica/x11/libvncserver/cutpaste.c
+++ b/ica/x11/libvncserver/rfbcrypto_included.c
@@ -1,11 +1,9 @@
/*
- * cutpaste.c - routines to deal with cut & paste buffers / selection.
+ * rfbcrypto_included.c - Crypto wrapper (included version)
*/
/*
- * OSXvnc Copyright (C) 2001 Dan McGuirk <mcguirk at incompleteness.net>.
- * Original Xvnc code Copyright (C) 1999 AT&T Laboratories Cambridge.
- * All Rights Reserved.
+ * Copyright (C) 2011 Gernot Tenchio
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,16 +21,29 @@
* USA.
*/
-#include <rfb/rfb.h>
+#include <string.h>
+#include "md5.h"
+#include "sha1.h"
+#include "rfbcrypto.h"
+void digestmd5(const struct iovec *iov, int iovcnt, void *dest)
+{
+ struct md5_ctx c;
+ int i;
-/*
- * rfbSetXCutText sets the cut buffer to be the given string. We also clear
- * the primary selection. Ideally we'd like to set it to the same thing, but I
- * can't work out how to do that without some kind of helper X client.
- */
+ __md5_init_ctx(&c);
+ for (i = 0; i < iovcnt; i++)
+ __md5_process_bytes(iov[i].iov_base, iov[i].iov_len, &c);
+ __md5_finish_ctx(&c, dest);
+}
-void rfbGotXCutText(rfbScreenInfoPtr rfbScreen, char *str, int len)
+void digestsha1(const struct iovec *iov, int iovcnt, void *dest)
{
- rfbSendServerCutText(rfbScreen, str, len);
+ SHA1Context c;
+ int i;
+
+ SHA1Reset(&c);
+ for (i = 0; i < iovcnt; i++)
+ SHA1Input(&c, iov[i].iov_base, iov[i].iov_len);
+ SHA1Result(&c, dest);
}
diff --git a/ica/x11/libvncserver/cutpaste.c b/ica/x11/libvncserver/rfbcrypto_openssl.c
similarity index 54%
copy from ica/x11/libvncserver/cutpaste.c
copy to ica/x11/libvncserver/rfbcrypto_openssl.c
index 6a9dcb9..29ec5c1 100644
--- a/ica/x11/libvncserver/cutpaste.c
+++ b/ica/x11/libvncserver/rfbcrypto_openssl.c
@@ -1,11 +1,9 @@
/*
- * cutpaste.c - routines to deal with cut & paste buffers / selection.
+ * rfbcrypto_openssl.c - Crypto wrapper (openssl version)
*/
/*
- * OSXvnc Copyright (C) 2001 Dan McGuirk <mcguirk at incompleteness.net>.
- * Original Xvnc code Copyright (C) 1999 AT&T Laboratories Cambridge.
- * All Rights Reserved.
+ * Copyright (C) 2011 Gernot Tenchio
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,16 +21,29 @@
* USA.
*/
-#include <rfb/rfb.h>
+#include <string.h>
+#include <openssl/sha.h>
+#include <openssl/md5.h>
+#include "rfbcrypto.h"
+void digestmd5(const struct iovec *iov, int iovcnt, void *dest)
+{
+ MD5_CTX c;
+ int i;
+
+ MD5_Init(&c);
+ for (i = 0; i < iovcnt; i++)
+ MD5_Update(&c, iov[i].iov_base, iov[i].iov_len);
+ MD5_Final(dest, &c);
+}
-/*
- * rfbSetXCutText sets the cut buffer to be the given string. We also clear
- * the primary selection. Ideally we'd like to set it to the same thing, but I
- * can't work out how to do that without some kind of helper X client.
- */
-
-void rfbGotXCutText(rfbScreenInfoPtr rfbScreen, char *str, int len)
+void digestsha1(const struct iovec *iov, int iovcnt, void *dest)
{
- rfbSendServerCutText(rfbScreen, str, len);
+ SHA_CTX c;
+ int i;
+
+ SHA1_Init(&c);
+ for (i = 0; i < iovcnt; i++)
+ SHA1_Update(&c, iov[i].iov_base, iov[i].iov_len);
+ SHA1_Final(dest, &c);
}
diff --git a/ica/x11/libvncserver/rfbcrypto_polarssl.c b/ica/x11/libvncserver/rfbcrypto_polarssl.c
new file mode 100644
index 0000000..55e3a7b
--- /dev/null
+++ b/ica/x11/libvncserver/rfbcrypto_polarssl.c
@@ -0,0 +1,26 @@
+#include <string.h>
+#include <polarssl/md5.h>
+#include <polarssl/sha1.h>
+#include "rfbcrypto.h"
+
+void digestmd5(const struct iovec *iov, int iovcnt, void *dest)
+{
+ md5_context c;
+ int i;
+
+ md5_starts(&c);
+ for (i = 0; i < iovcnt; i++)
+ md5_update(&c, iov[i].iov_base, iov[i].iov_len);
+ md5_finish(&c, dest);
+}
+
+void digestsha1(const struct iovec *iov, int iovcnt, void *dest)
+{
+ sha1_context c;
+ int i;
+
+ sha1_starts(&c);
+ for (i = 0; i < iovcnt; i++)
+ sha1_update(&c, iov[i].iov_base, iov[i].iov_len);
+ sha1_finish(&c, dest);
+}
diff --git a/ica/x11/libvncserver/rfbserver.c b/ica/x11/libvncserver/rfbserver.c
index 8f0e390..5f3b31d 100644
--- a/ica/x11/libvncserver/rfbserver.c
+++ b/ica/x11/libvncserver/rfbserver.c
@@ -3,6 +3,7 @@
*/
/*
+ * Copyright (C) 2011-2012 D. R. Commander
* Copyright (C) 2005 Rohit Kumar, Johannes E. Schindelin
* Copyright (C) 2002 RealVNC Ltd.
* OSXvnc Copyright (C) 2001 Dan McGuirk <mcguirk at incompleteness.net>.
@@ -27,7 +28,11 @@
#ifdef __STRICT_ANSI__
#define _BSD_SOURCE
+#define _POSIX_SOURCE
+#define _XOPEN_SOURCE 600
#endif
+
+#include <stdio.h>
#include <string.h>
#include <rfb/rfb.h>
#include <rfb/rfbregion.h>
@@ -50,6 +55,7 @@
#ifdef LIBVNCSERVER_HAVE_NETINET_IN_H
#include <netinet/in.h>
#include <netinet/tcp.h>
+#include <netdb.h>
#include <arpa/inet.h>
#endif
#endif
@@ -73,6 +79,10 @@
/* strftime() */
#include <time.h>
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+#include "rfbssl.h"
+#endif
+
#ifdef __MINGW32__
static int compat_mkdir(const char *path, int mode)
{
@@ -81,6 +91,21 @@ static int compat_mkdir(const char *path, int mode)
#define mkdir compat_mkdir
#endif
+#ifdef LIBVNCSERVER_HAVE_LIBJPEG
+/*
+ * Map of quality levels to provide compatibility with TightVNC/TigerVNC
+ * clients. This emulates the behavior of the TigerVNC Server.
+ */
+
+static const int tight2turbo_qual[10] = {
+ 15, 29, 41, 42, 62, 77, 79, 86, 92, 100
+};
+
+static const int tight2turbo_subsamp[10] = {
+ 1, 1, 1, 2, 2, 2, 0, 0, 0, 0
+};
+#endif
+
static void rfbProcessClientProtocolVersion(rfbClientPtr cl);
static void rfbProcessClientNormalMessage(rfbClientPtr cl);
static void rfbProcessClientInitMessage(rfbClientPtr cl);
@@ -207,9 +232,7 @@ void
rfbNewClientConnection(rfbScreenInfoPtr rfbScreen,
int sock)
{
- rfbClientPtr cl;
-
- cl = rfbNewClient(rfbScreen,sock);
+ rfbNewClient(rfbScreen,sock);
}
@@ -266,8 +289,12 @@ rfbNewTCPOrUDPClient(rfbScreenInfoPtr rfbScreen,
rfbProtocolVersionMsg pv;
rfbClientIteratorPtr iterator;
rfbClientPtr cl,cl_;
+#ifdef LIBVNCSERVER_IPv6
+ struct sockaddr_storage addr;
+#else
struct sockaddr_in addr;
- socklen_t addrlen = sizeof(struct sockaddr_in);
+#endif
+ socklen_t addrlen = sizeof(addr);
rfbProtocolExtension* extension;
cl = (rfbClientPtr)calloc(sizeof(rfbClientRec),1);
@@ -290,7 +317,17 @@ rfbNewTCPOrUDPClient(rfbScreenInfoPtr rfbScreen,
int one=1;
getpeername(sock, (struct sockaddr *)&addr, &addrlen);
+#ifdef LIBVNCSERVER_IPv6
+ char host[1024];
+ if(getnameinfo((struct sockaddr*)&addr, addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST) != 0) {
+ rfbLogPerror("rfbNewClient: error in getnameinfo");
+ cl->host = strdup("");
+ }
+ else
+ cl->host = strdup(host);
+#else
cl->host = strdup(inet_ntoa(addr.sin_addr));
+#endif
rfbLog(" other clients:\n");
iterator = rfbGetClientIterator(rfbScreen);
@@ -358,10 +395,11 @@ rfbNewTCPOrUDPClient(rfbScreenInfoPtr rfbScreen,
rfbScreen->clientHead = cl;
UNLOCK(rfbClientListMutex);
-#ifdef LIBVNCSERVER_HAVE_LIBZ
+#if defined(LIBVNCSERVER_HAVE_LIBZ) || defined(LIBVNCSERVER_HAVE_LIBPNG)
cl->tightQualityLevel = -1;
#ifdef LIBVNCSERVER_HAVE_LIBJPEG
cl->tightCompressLevel = TIGHT_DEFAULT_COMPRESSION;
+ cl->turboSubsampLevel = TURBO_DEFAULT_SUBSAMP;
{
int i;
for (i = 0; i < 4; i++)
@@ -402,6 +440,20 @@ rfbNewTCPOrUDPClient(rfbScreenInfoPtr rfbScreen,
cl->lastPtrX = -1;
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ /*
+ * Wait a few ms for the client to send one of:
+ * - Flash policy request
+ * - WebSockets connection (TLS/SSL or plain)
+ */
+ if (!webSocketsCheck(cl)) {
+ /* Error reporting handled in webSocketsHandshake */
+ rfbCloseClient(cl);
+ rfbClientConnectionGone(cl);
+ return NULL;
+ }
+#endif
+
sprintf(pv,rfbProtocolVersionFormat,rfbScreen->protocolMajorVersion,
rfbScreen->protocolMinorVersion);
@@ -461,7 +513,7 @@ rfbNewUDPClient(rfbScreenInfoPtr rfbScreen)
void
rfbClientConnectionGone(rfbClientPtr cl)
{
-#ifdef LIBVNCSERVER_HAVE_LIBJPEG
+#if defined(LIBVNCSERVER_HAVE_LIBZ) && defined(LIBVNCSERVER_HAVE_LIBJPEG)
int i;
#endif
@@ -474,6 +526,21 @@ rfbClientConnectionGone(rfbClientPtr cl)
if (cl->next)
cl->next->prev = cl->prev;
+ UNLOCK(rfbClientListMutex);
+
+#ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
+ if(cl->screen->backgroundLoop != FALSE) {
+ int i;
+ do {
+ LOCK(cl->refCountMutex);
+ i=cl->refCount;
+ if(i>0)
+ WAIT(cl->deleteCond,cl->refCountMutex);
+ UNLOCK(cl->refCountMutex);
+ } while(i>0);
+ }
+#endif
+
if(cl->sock>=0)
close(cl->sock);
@@ -490,21 +557,6 @@ rfbClientConnectionGone(rfbClientPtr cl)
free(cl->beforeEncBuf);
free(cl->afterEncBuf);
-#ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
- if(cl->screen->backgroundLoop != FALSE) {
- int i;
- do {
- LOCK(cl->refCountMutex);
- i=cl->refCount;
- if(i>0)
- WAIT(cl->deleteCond,cl->refCountMutex);
- UNLOCK(cl->refCountMutex);
- } while(i>0);
- }
-#endif
-
- UNLOCK(rfbClientListMutex);
-
if(cl->sock>=0)
FD_CLR(cl->sock,&(cl->screen->allFds));
@@ -549,6 +601,7 @@ rfbClientConnectionGone(rfbClientPtr cl)
TINI_MUTEX(cl->sendMutex);
rfbPrintStats(cl);
+ rfbResetStats(cl);
free(cl);
}
@@ -572,6 +625,7 @@ rfbProcessClientMessage(rfbClientPtr cl)
rfbAuthProcessClientMessage(cl);
return;
case RFB_INITIALISATION:
+ case RFB_INITIALISATION_SHARED:
rfbProcessClientInitMessage(cl);
return;
default:
@@ -699,13 +753,22 @@ rfbProcessClientInitMessage(rfbClientPtr cl)
rfbClientPtr otherCl;
rfbExtensionData* extension;
- if ((n = rfbReadExact(cl, (char *)&ci,sz_rfbClientInitMsg)) <= 0) {
- if (n == 0)
- rfbLog("rfbProcessClientInitMessage: client gone\n");
- else
- rfbLogPerror("rfbProcessClientInitMessage: read");
- rfbCloseClient(cl);
- return;
+ if (cl->state == RFB_INITIALISATION_SHARED) {
+ /* In this case behave as though an implicit ClientInit message has
+ * already been received with a shared-flag of true. */
+ ci.shared = 1;
+ /* Avoid the possibility of exposing the RFB_INITIALISATION_SHARED
+ * state to calling software. */
+ cl->state = RFB_INITIALISATION;
+ } else {
+ if ((n = rfbReadExact(cl, (char *)&ci,sz_rfbClientInitMsg)) <= 0) {
+ if (n == 0)
+ rfbLog("rfbProcessClientInitMessage: client gone\n");
+ else
+ rfbLogPerror("rfbProcessClientInitMessage: read");
+ rfbCloseClient(cl);
+ return;
+ }
}
memset(u.buf,0,sizeof(u.buf));
@@ -918,6 +981,9 @@ rfbSendSupportedEncodings(rfbClientPtr cl)
#ifdef LIBVNCSERVER_HAVE_LIBJPEG
rfbEncodingTight,
#endif
+#ifdef LIBVNCSERVER_HAVE_LIBPNG
+ rfbEncodingTightPng,
+#endif
rfbEncodingUltra,
rfbEncodingUltraZip,
rfbEncodingXCursor,
@@ -1657,7 +1723,10 @@ rfbBool rfbProcessFileTransfer(rfbClientPtr cl, uint8_t contentType, uint8_t con
#ifdef LIBVNCSERVER_HAVE_LIBZ
/* compressed packet */
nRet = uncompress(compBuff,&nRawBytes,(const unsigned char*)buffer, length);
- retval=write(cl->fileTransfer.fd, (char*)compBuff, nRawBytes);
+ if(nRet == Z_OK)
+ retval=write(cl->fileTransfer.fd, (char*)compBuff, nRawBytes);
+ else
+ retval = -1;
#else
/* Write the file out as received... */
retval=write(cl->fileTransfer.fd, buffer, length);
@@ -1812,6 +1881,11 @@ rfbProcessClientNormalMessage(rfbClientPtr cl)
char encBuf[64];
char encBuf2[64];
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ if (cl->wsctx && webSocketCheckDisconnect(cl))
+ return;
+#endif
+
if ((n = rfbReadExact(cl, (char *)&msg, 1)) <= 0) {
if (n != 0)
rfbLogPerror("rfbProcessClientNormalMessage: read");
@@ -1909,6 +1983,14 @@ rfbProcessClientNormalMessage(rfbClientPtr cl)
cl->enableSupportedMessages = FALSE;
cl->enableSupportedEncodings = FALSE;
cl->enableServerIdentity = FALSE;
+#if defined(LIBVNCSERVER_HAVE_LIBZ) || defined(LIBVNCSERVER_HAVE_LIBPNG)
+ cl->tightQualityLevel = -1;
+#ifdef LIBVNCSERVER_HAVE_LIBJPEG
+ cl->tightCompressLevel = TIGHT_DEFAULT_COMPRESSION;
+ cl->turboSubsampLevel = TURBO_DEFAULT_SUBSAMP;
+ cl->turboQualityLevel = -1;
+#endif
+#endif
for (i = 0; i < msg.se.nEncodings; i++) {
@@ -1938,6 +2020,9 @@ rfbProcessClientNormalMessage(rfbClientPtr cl)
case rfbEncodingTight:
#endif
#endif
+#ifdef LIBVNCSERVER_HAVE_LIBPNG
+ case rfbEncodingTightPng:
+#endif
/* The first supported encoding is the 'preferred' encoding */
if (cl->preferredEncoding == -1)
cl->preferredEncoding = enc;
@@ -2026,7 +2111,7 @@ rfbProcessClientNormalMessage(rfbClientPtr cl)
}
break;
default:
-#ifdef LIBVNCSERVER_HAVE_LIBZ
+#if defined(LIBVNCSERVER_HAVE_LIBZ) || defined(LIBVNCSERVER_HAVE_LIBPNG)
if ( enc >= (uint32_t)rfbEncodingCompressLevel0 &&
enc <= (uint32_t)rfbEncodingCompressLevel9 ) {
cl->zlibCompressLevel = enc & 0x0F;
@@ -2040,6 +2125,22 @@ rfbProcessClientNormalMessage(rfbClientPtr cl)
cl->tightQualityLevel = enc & 0x0F;
rfbLog("Using image quality level %d for client %s\n",
cl->tightQualityLevel, cl->host);
+#ifdef LIBVNCSERVER_HAVE_LIBJPEG
+ cl->turboQualityLevel = tight2turbo_qual[enc & 0x0F];
+ cl->turboSubsampLevel = tight2turbo_subsamp[enc & 0x0F];
+ rfbLog("Using JPEG subsampling %d, Q%d for client %s\n",
+ cl->turboSubsampLevel, cl->turboQualityLevel, cl->host);
+ } else if ( enc >= (uint32_t)rfbEncodingFineQualityLevel0 + 1 &&
+ enc <= (uint32_t)rfbEncodingFineQualityLevel100 ) {
+ cl->turboQualityLevel = enc & 0xFF;
+ rfbLog("Using fine quality level %d for client %s\n",
+ cl->turboQualityLevel, cl->host);
+ } else if ( enc >= (uint32_t)rfbEncodingSubsamp1X &&
+ enc <= (uint32_t)rfbEncodingSubsampGray ) {
+ cl->turboSubsampLevel = enc & 0xFF;
+ rfbLog("Using subsampling level %d for client %s\n",
+ cl->turboSubsampLevel, cl->host);
+#endif
} else
#endif
{
@@ -2755,6 +2856,28 @@ rfbSendFramebufferUpdate(rfbClientPtr cl,
sraRgnReleaseIterator(i); i=NULL;
#endif
#endif
+#if defined(LIBVNCSERVER_HAVE_LIBJPEG) && defined(LIBVNCSERVER_HAVE_LIBPNG)
+ } else if (cl->preferredEncoding == rfbEncodingTightPng) {
+ nUpdateRegionRects = 0;
+
+ for(i = sraRgnGetIterator(updateRegion); sraRgnIteratorNext(i,&rect);){
+ int x = rect.x1;
+ int y = rect.y1;
+ int w = rect.x2 - x;
+ int h = rect.y2 - y;
+ int n;
+ /* We need to count the number of rects in the scaled screen */
+ if (cl->screen!=cl->scaledScreen)
+ rfbScaledCorrection(cl->screen, cl->scaledScreen, &x, &y, &w, &h, "rfbSendFramebufferUpdate");
+ n = rfbNumCodedRectsTight(cl, x, y, w, h);
+ if (n == 0) {
+ nUpdateRegionRects = 0xFFFF;
+ break;
+ }
+ nUpdateRegionRects += n;
+ }
+ sraRgnReleaseIterator(i); i=NULL;
+#endif
} else {
nUpdateRegionRects = sraRgnCountRects(updateRegion);
}
@@ -2774,6 +2897,10 @@ rfbSendFramebufferUpdate(rfbClientPtr cl,
&& cl->preferredEncoding != rfbEncodingTight
#endif
#endif
+#ifdef LIBVNCSERVER_HAVE_LIBPNG
+ /* Tight encoding counts the rectangles differently */
+ && cl->preferredEncoding != rfbEncodingTightPng
+#endif
&& nUpdateRegionRects>cl->screen->maxRectsPerUpdate) {
sraRegion* newUpdateRegion = sraRgnBBox(updateRegion);
sraRgnDestroy(updateRegion);
@@ -2861,20 +2988,24 @@ rfbSendFramebufferUpdate(rfbClientPtr cl,
if (!rfbSendRectEncodingZlib(cl, x, y, w, h))
goto updateFailed;
break;
-#ifdef LIBVNCSERVER_HAVE_LIBJPEG
- case rfbEncodingTight:
- if (!rfbSendRectEncodingTight(cl, x, y, w, h))
- goto updateFailed;
- break;
-#endif
-#endif
-#ifdef LIBVNCSERVER_HAVE_LIBZ
case rfbEncodingZRLE:
case rfbEncodingZYWRLE:
if (!rfbSendRectEncodingZRLE(cl, x, y, w, h))
goto updateFailed;
break;
#endif
+#if defined(LIBVNCSERVER_HAVE_LIBJPEG) && (defined(LIBVNCSERVER_HAVE_LIBZ) || defined(LIBVNCSERVER_HAVE_LIBPNG))
+ case rfbEncodingTight:
+ if (!rfbSendRectEncodingTight(cl, x, y, w, h))
+ goto updateFailed;
+ break;
+#ifdef LIBVNCSERVER_HAVE_LIBPNG
+ case rfbEncodingTightPng:
+ if (!rfbSendRectEncodingTightPng(cl, x, y, w, h))
+ goto updateFailed;
+ break;
+#endif
+#endif
}
}
if (i) {
diff --git a/ica/x11/libvncserver/rfbssl.h b/ica/x11/libvncserver/rfbssl.h
new file mode 100644
index 0000000..f1c4792
--- /dev/null
+++ b/ica/x11/libvncserver/rfbssl.h
@@ -0,0 +1,15 @@
+#ifndef _VNCSSL_H
+#define _VNCSSL_H 1
+
+#include "rfb/rfb.h"
+#include "rfb/rfbconfig.h"
+
+int rfbssl_init(rfbClientPtr cl);
+int rfbssl_pending(rfbClientPtr cl);
+int rfbssl_peek(rfbClientPtr cl, char *buf, int bufsize);
+int rfbssl_read(rfbClientPtr cl, char *buf, int bufsize);
+int rfbssl_write(rfbClientPtr cl, const char *buf, int bufsize);
+void rfbssl_destroy(rfbClientPtr cl);
+
+
+#endif /* _VNCSSL_H */
diff --git a/ica/x11/libvncserver/rfbssl_gnutls.c b/ica/x11/libvncserver/rfbssl_gnutls.c
new file mode 100644
index 0000000..cf60cdc
--- /dev/null
+++ b/ica/x11/libvncserver/rfbssl_gnutls.c
@@ -0,0 +1,268 @@
+/*
+ * rfbssl_gnutls.c - Secure socket funtions (gnutls version)
+ */
+
+/*
+ * Copyright (C) 2011 Gernot Tenchio
+ *
+ * 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.
+ */
+
+#include "rfbssl.h"
+#include <gnutls/gnutls.h>
+#include <errno.h>
+
+struct rfbssl_ctx {
+ char peekbuf[2048];
+ int peeklen;
+ int peekstart;
+ gnutls_session_t session;
+ gnutls_certificate_credentials_t x509_cred;
+ gnutls_dh_params_t dh_params;
+#ifdef I_LIKE_RSA_PARAMS_THAT_MUCH
+ gnutls_rsa_params_t rsa_params;
+#endif
+};
+
+void rfbssl_log_func(int level, const char *msg)
+{
+ rfbErr("SSL: %s", msg);
+}
+
+static void rfbssl_error(const char *msg, int e)
+{
+ rfbErr("%s: %s (%ld)\n", msg, gnutls_strerror(e), e);
+}
+
+static int rfbssl_init_session(struct rfbssl_ctx *ctx, int fd)
+{
+ gnutls_session_t session;
+ int ret;
+
+ if (!GNUTLS_E_SUCCESS == (ret = gnutls_init(&session, GNUTLS_SERVER))) {
+ /* */
+ } else if (!GNUTLS_E_SUCCESS == (ret = gnutls_priority_set_direct(session, "EXPORT", NULL))) {
+ /* */
+ } else if (!GNUTLS_E_SUCCESS == (ret = gnutls_credentials_set(session, GNUTLS_CRD_CERTIFICATE, ctx->x509_cred))) {
+ /* */
+ } else {
+ gnutls_session_enable_compatibility_mode(session);
+ gnutls_transport_set_ptr(session, (gnutls_transport_ptr_t)(uintptr_t)fd);
+ ctx->session = session;
+ }
+ return ret;
+}
+
+static int generate_dh_params(struct rfbssl_ctx *ctx)
+{
+ int ret;
+ if (GNUTLS_E_SUCCESS == (ret = gnutls_dh_params_init(&ctx->dh_params)))
+ ret = gnutls_dh_params_generate2(ctx->dh_params, 1024);
+ return ret;
+}
+
+#ifdef I_LIKE_RSA_PARAMS_THAT_MUCH
+static int generate_rsa_params(struct rfbssl_ctx *ctx)
+{
+ int ret;
+ if (GNUTLS_E_SUCCESS == (ret = gnutls_rsa_params_init(&ctx->rsa_params)))
+ ret = gnutls_rsa_params_generate2(ctx->rsa_params, 512);
+ return ret;
+}
+#endif
+
+struct rfbssl_ctx *rfbssl_init_global(char *key, char *cert)
+{
+ int ret = GNUTLS_E_SUCCESS;
+ struct rfbssl_ctx *ctx = NULL;
+
+ if (NULL == (ctx = malloc(sizeof(struct rfbssl_ctx)))) {
+ ret = GNUTLS_E_MEMORY_ERROR;
+ } else if (!GNUTLS_E_SUCCESS == (ret = gnutls_global_init())) {
+ /* */
+ } else if (!GNUTLS_E_SUCCESS == (ret = gnutls_certificate_allocate_credentials(&ctx->x509_cred))) {
+ /* */
+ } else if ((ret = gnutls_certificate_set_x509_trust_file(ctx->x509_cred, cert, GNUTLS_X509_FMT_PEM)) < 0) {
+ /* */
+ } else if (!GNUTLS_E_SUCCESS == (ret = gnutls_certificate_set_x509_key_file(ctx->x509_cred, cert, key, GNUTLS_X509_FMT_PEM))) {
+ /* */
+ } else if (!GNUTLS_E_SUCCESS == (ret = generate_dh_params(ctx))) {
+ /* */
+#ifdef I_LIKE_RSA_PARAMS_THAT_MUCH
+ } else if (!GNUTLS_E_SUCCESS == (ret = generate_rsa_params(ctx))) {
+ /* */
+#endif
+ } else {
+ gnutls_global_set_log_function(rfbssl_log_func);
+ gnutls_global_set_log_level(1);
+ gnutls_certificate_set_dh_params(ctx->x509_cred, ctx->dh_params);
+ return ctx;
+ }
+
+ free(ctx);
+ return NULL;
+}
+
+int rfbssl_init(rfbClientPtr cl)
+{
+ int ret = -1;
+ struct rfbssl_ctx *ctx;
+ char *keyfile;
+ if (!(keyfile = cl->screen->sslkeyfile))
+ keyfile = cl->screen->sslcertfile;
+
+ if (NULL == (ctx = rfbssl_init_global(keyfile, cl->screen->sslcertfile))) {
+ /* */
+ } else if (GNUTLS_E_SUCCESS != (ret = rfbssl_init_session(ctx, cl->sock))) {
+ /* */
+ } else {
+ while (GNUTLS_E_SUCCESS != (ret = gnutls_handshake(ctx->session))) {
+ if (ret == GNUTLS_E_AGAIN)
+ continue;
+ break;
+ }
+ }
+
+ if (ret != GNUTLS_E_SUCCESS) {
+ rfbssl_error(__func__, ret);
+ } else {
+ cl->sslctx = (rfbSslCtx *)ctx;
+ rfbLog("%s protocol initialized\n", gnutls_protocol_get_name(gnutls_protocol_get_version(ctx->session)));
+ }
+ return ret;
+}
+
+static int rfbssl_do_read(rfbClientPtr cl, char *buf, int bufsize)
+{
+ struct rfbssl_ctx *ctx = (struct rfbssl_ctx *)cl->sslctx;
+ int ret;
+
+ while ((ret = gnutls_record_recv(ctx->session, buf, bufsize)) < 0) {
+ if (ret == GNUTLS_E_AGAIN) {
+ /* continue */
+ } else if (ret == GNUTLS_E_INTERRUPTED) {
+ /* continue */
+ } else {
+ break;
+ }
+ }
+
+ if (ret < 0) {
+ rfbssl_error(__func__, ret);
+ errno = EIO;
+ ret = -1;
+ }
+
+ return ret < 0 ? -1 : ret;
+}
+
+int rfbssl_write(rfbClientPtr cl, const char *buf, int bufsize)
+{
+ struct rfbssl_ctx *ctx = (struct rfbssl_ctx *)cl->sslctx;
+ int ret;
+
+ while ((ret = gnutls_record_send(ctx->session, buf, bufsize)) < 0) {
+ if (ret == GNUTLS_E_AGAIN) {
+ /* continue */
+ } else if (ret == GNUTLS_E_INTERRUPTED) {
+ /* continue */
+ } else {
+ break;
+ }
+ }
+
+ if (ret < 0)
+ rfbssl_error(__func__, ret);
+
+ return ret;
+}
+
+static void rfbssl_gc_peekbuf(struct rfbssl_ctx *ctx, int bufsize)
+{
+ if (ctx->peekstart) {
+ int spaceleft = sizeof(ctx->peekbuf) - ctx->peeklen - ctx->peekstart;
+ if (spaceleft < bufsize) {
+ memmove(ctx->peekbuf, ctx->peekbuf + ctx->peekstart, ctx->peeklen);
+ ctx->peekstart = 0;
+ }
+ }
+}
+
+static int __rfbssl_read(rfbClientPtr cl, char *buf, int bufsize, int peek)
+{
+ int ret = 0;
+ struct rfbssl_ctx *ctx = (struct rfbssl_ctx *)cl->sslctx;
+
+ rfbssl_gc_peekbuf(ctx, bufsize);
+
+ if (ctx->peeklen) {
+ /* If we have any peek data, simply return that. */
+ ret = bufsize < ctx->peeklen ? bufsize : ctx->peeklen;
+ memcpy (buf, ctx->peekbuf + ctx->peekstart, ret);
+ if (!peek) {
+ ctx->peeklen -= ret;
+ if (ctx->peeklen != 0)
+ ctx->peekstart += ret;
+ else
+ ctx->peekstart = 0;
+ }
+ }
+
+ if (ret < bufsize) {
+ int n;
+ /* read the remaining data */
+ if ((n = rfbssl_do_read(cl, buf + ret, bufsize - ret)) <= 0) {
+ rfbErr("rfbssl_%s: %s error\n", __func__, peek ? "peek" : "read");
+ return n;
+ }
+ if (peek) {
+ memcpy(ctx->peekbuf + ctx->peekstart + ctx->peeklen, buf + ret, n);
+ ctx->peeklen += n;
+ }
+ ret += n;
+ }
+
+ return ret;
+}
+
+int rfbssl_read(rfbClientPtr cl, char *buf, int bufsize)
+{
+ return __rfbssl_read(cl, buf, bufsize, 0);
+}
+
+int rfbssl_peek(rfbClientPtr cl, char *buf, int bufsize)
+{
+ return __rfbssl_read(cl, buf, bufsize, 1);
+}
+
+int rfbssl_pending(rfbClientPtr cl)
+{
+ struct rfbssl_ctx *ctx = (struct rfbssl_ctx *)cl->sslctx;
+ int ret = ctx->peeklen;
+
+ if (ret <= 0)
+ ret = gnutls_record_check_pending(ctx->session);
+
+ return ret;
+}
+
+void rfbssl_destroy(rfbClientPtr cl)
+{
+ struct rfbssl_ctx *ctx = (struct rfbssl_ctx *)cl->sslctx;
+ gnutls_bye(ctx->session, GNUTLS_SHUT_WR);
+ gnutls_deinit(ctx->session);
+ gnutls_certificate_free_credentials(ctx->x509_cred);
+}
diff --git a/ica/x11/libvncserver/cutpaste.c b/ica/x11/libvncserver/rfbssl_none.c
similarity index 55%
copy from ica/x11/libvncserver/cutpaste.c
copy to ica/x11/libvncserver/rfbssl_none.c
index 6a9dcb9..488a6f4 100644
--- a/ica/x11/libvncserver/cutpaste.c
+++ b/ica/x11/libvncserver/rfbssl_none.c
@@ -1,11 +1,9 @@
/*
- * cutpaste.c - routines to deal with cut & paste buffers / selection.
+ * rfbssl_none.c - Secure socket functions (fallback to failing)
*/
/*
- * OSXvnc Copyright (C) 2001 Dan McGuirk <mcguirk at incompleteness.net>.
- * Original Xvnc code Copyright (C) 1999 AT&T Laboratories Cambridge.
- * All Rights Reserved.
+ * Copyright (C) 2011 Johannes Schindelin
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,16 +21,38 @@
* USA.
*/
-#include <rfb/rfb.h>
+#include "rfbssl.h"
+struct rfbssl_ctx *rfbssl_init_global(char *key, char *cert)
+{
+ return NULL;
+}
-/*
- * rfbSetXCutText sets the cut buffer to be the given string. We also clear
- * the primary selection. Ideally we'd like to set it to the same thing, but I
- * can't work out how to do that without some kind of helper X client.
- */
+int rfbssl_init(rfbClientPtr cl)
+{
+ return -1;
+}
+
+int rfbssl_write(rfbClientPtr cl, const char *buf, int bufsize)
+{
+ return -1;
+}
+
+int rfbssl_peek(rfbClientPtr cl, char *buf, int bufsize)
+{
+ return -1;
+}
+
+int rfbssl_read(rfbClientPtr cl, char *buf, int bufsize)
+{
+ return -1;
+}
+
+int rfbssl_pending(rfbClientPtr cl)
+{
+ return -1;
+}
-void rfbGotXCutText(rfbScreenInfoPtr rfbScreen, char *str, int len)
+void rfbssl_destroy(rfbClientPtr cl)
{
- rfbSendServerCutText(rfbScreen, str, len);
}
diff --git a/ica/x11/libvncserver/rfbssl_openssl.c b/ica/x11/libvncserver/rfbssl_openssl.c
new file mode 100644
index 0000000..cbd6865
--- /dev/null
+++ b/ica/x11/libvncserver/rfbssl_openssl.c
@@ -0,0 +1,135 @@
+/*
+ * rfbssl_openssl.c - Secure socket funtions (openssl version)
+ */
+
+/*
+ * Copyright (C) 2011 Gernot Tenchio
+ *
+ * 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.
+ */
+
+#include "rfbssl.h"
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+
+struct rfbssl_ctx {
+ SSL_CTX *ssl_ctx;
+ SSL *ssl;
+};
+
+static void rfbssl_error(void)
+{
+ char buf[1024];
+ unsigned long e = ERR_get_error();
+ rfbErr("%s (%ld)\n", ERR_error_string(e, buf), e);
+}
+
+int rfbssl_init(rfbClientPtr cl)
+{
+ char *keyfile;
+ int r, ret = -1;
+ struct rfbssl_ctx *ctx;
+
+ SSL_library_init();
+ SSL_load_error_strings();
+
+ if (cl->screen->sslkeyfile && *cl->screen->sslkeyfile) {
+ keyfile = cl->screen->sslkeyfile;
+ } else {
+ keyfile = cl->screen->sslcertfile;
+ }
+
+ if (NULL == (ctx = malloc(sizeof(struct rfbssl_ctx)))) {
+ rfbErr("OOM\n");
+ } else if (!cl->screen->sslcertfile || !cl->screen->sslcertfile[0]) {
+ rfbErr("SSL connection but no cert specified\n");
+ } else if (NULL == (ctx->ssl_ctx = SSL_CTX_new(TLSv1_server_method()))) {
+ rfbssl_error();
+ } else if (SSL_CTX_use_PrivateKey_file(ctx->ssl_ctx, keyfile, SSL_FILETYPE_PEM) <= 0) {
+ rfbErr("Unable to load private key file %s\n", keyfile);
+ } else if (SSL_CTX_use_certificate_file(ctx->ssl_ctx, cl->screen->sslcertfile, SSL_FILETYPE_PEM) <= 0) {
+ rfbErr("Unable to load certificate file %s\n", cl->screen->sslcertfile);
+ } else if (NULL == (ctx->ssl = SSL_new(ctx->ssl_ctx))) {
+ rfbErr("SSL_new failed\n");
+ rfbssl_error();
+ } else if (!(SSL_set_fd(ctx->ssl, cl->sock))) {
+ rfbErr("SSL_set_fd failed\n");
+ rfbssl_error();
+ } else {
+ while ((r = SSL_accept(ctx->ssl)) < 0) {
+ if (SSL_get_error(ctx->ssl, r) != SSL_ERROR_WANT_READ)
+ break;
+ }
+ if (r < 0) {
+ rfbErr("SSL_accept failed %d\n", SSL_get_error(ctx->ssl, r));
+ } else {
+ cl->sslctx = (rfbSslCtx *)ctx;
+ ret = 0;
+ }
+ }
+ return ret;
+}
+
+int rfbssl_write(rfbClientPtr cl, const char *buf, int bufsize)
+{
+ int ret;
+ struct rfbssl_ctx *ctx = (struct rfbssl_ctx *)cl->sslctx;
+
+ while ((ret = SSL_write(ctx->ssl, buf, bufsize)) <= 0) {
+ if (SSL_get_error(ctx->ssl, ret) != SSL_ERROR_WANT_WRITE)
+ break;
+ }
+ return ret;
+}
+
+int rfbssl_peek(rfbClientPtr cl, char *buf, int bufsize)
+{
+ int ret;
+ struct rfbssl_ctx *ctx = (struct rfbssl_ctx *)cl->sslctx;
+
+ while ((ret = SSL_peek(ctx->ssl, buf, bufsize)) <= 0) {
+ if (SSL_get_error(ctx->ssl, ret) != SSL_ERROR_WANT_READ)
+ break;
+ }
+ return ret;
+}
+
+int rfbssl_read(rfbClientPtr cl, char *buf, int bufsize)
+{
+ int ret;
+ struct rfbssl_ctx *ctx = (struct rfbssl_ctx *)cl->sslctx;
+
+ while ((ret = SSL_read(ctx->ssl, buf, bufsize)) <= 0) {
+ if (SSL_get_error(ctx->ssl, ret) != SSL_ERROR_WANT_READ)
+ break;
+ }
+ return ret;
+}
+
+int rfbssl_pending(rfbClientPtr cl)
+{
+ struct rfbssl_ctx *ctx = (struct rfbssl_ctx *)cl->sslctx;
+ return SSL_pending(ctx->ssl);
+}
+
+void rfbssl_destroy(rfbClientPtr cl)
+{
+ struct rfbssl_ctx *ctx = (struct rfbssl_ctx *)cl->sslctx;
+ if (ctx->ssl)
+ SSL_free(ctx->ssl);
+ if (ctx->ssl_ctx)
+ SSL_CTX_free(ctx->ssl_ctx);
+}
diff --git a/ica/x11/libvncserver/sockets.c b/ica/x11/libvncserver/sockets.c
index 188a8fd..4acdd72 100644
--- a/ica/x11/libvncserver/sockets.c
+++ b/ica/x11/libvncserver/sockets.c
@@ -19,6 +19,7 @@
*/
/*
+ * Copyright (C) 2011-2012 Christian Beier <dontmind at freeshell.org>
* Copyright (C) 2005 Rohit Kumar, Johannes E. Schindelin
* OSXvnc Copyright (C) 2001 Dan McGuirk <mcguirk at incompleteness.net>.
* Original Xvnc code Copyright (C) 1999 AT&T Laboratories Cambridge.
@@ -40,6 +41,15 @@
* USA.
*/
+#ifdef __STRICT_ANSI__
+#define _BSD_SOURCE
+#ifdef __linux__
+/* Setting this on other systems hides definitions such as INADDR_LOOPBACK.
+ * The check should be for __GLIBC__ in fact. */
+# define _POSIX_SOURCE
+#endif
+#endif
+
#include <rfb/rfb.h>
#ifdef LIBVNCSERVER_HAVE_SYS_TYPES_H
@@ -62,6 +72,10 @@
#include <unistd.h>
#endif
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+#include "rfbssl.h"
+#endif
+
#if defined(__linux__) && defined(NEED_TIMEVAL)
struct timeval
{
@@ -88,8 +102,12 @@ int deny_severity=LOG_WARNING;
#pragma warning (disable: 4018 4761)
#endif
#define read(sock,buf,len) recv(sock,buf,len,0)
+#ifndef EWOULDBLOCK
#define EWOULDBLOCK WSAEWOULDBLOCK
+#endif
+#ifndef ETIMEDOUT
#define ETIMEDOUT WSAETIMEDOUT
+#endif
#define write(sock,buf,len) send(sock,buf,len,0)
#else
#define closesocket close
@@ -133,6 +151,8 @@ rfbInitSockets(rfbScreenInfoPtr rfbScreen)
if(rfbScreen->autoPort) {
int i;
+ FD_ZERO(&(rfbScreen->allFds));
+
rfbLog("Autoprobing TCP port \n");
for (i = 5900; i < 6000; i++) {
if ((rfbScreen->listenSock = rfbListenOnTCPPort(i, iface)) >= 0) {
@@ -146,22 +166,57 @@ rfbInitSockets(rfbScreenInfoPtr rfbScreen)
return;
}
- rfbLog("Autoprobing selected port %d\n", rfbScreen->port);
- FD_ZERO(&(rfbScreen->allFds));
+ rfbLog("Autoprobing selected TCP port %d\n", rfbScreen->port);
FD_SET(rfbScreen->listenSock, &(rfbScreen->allFds));
rfbScreen->maxFd = rfbScreen->listenSock;
+
+#ifdef LIBVNCSERVER_IPv6
+ rfbLog("Autoprobing TCP6 port \n");
+ for (i = 5900; i < 6000; i++) {
+ if ((rfbScreen->listen6Sock = rfbListenOnTCP6Port(i, rfbScreen->listen6Interface)) >= 0) {
+ rfbScreen->ipv6port = i;
+ break;
+ }
+ }
+
+ if (i >= 6000) {
+ rfbLogPerror("Failure autoprobing");
+ return;
+ }
+
+ rfbLog("Autoprobing selected TCP6 port %d\n", rfbScreen->ipv6port);
+ FD_SET(rfbScreen->listen6Sock, &(rfbScreen->allFds));
+ rfbScreen->maxFd = max((int)rfbScreen->listen6Sock,rfbScreen->maxFd);
+#endif
}
- else if(rfbScreen->port>0) {
- rfbLog("Listening for VNC connections on TCP port %d\n", rfbScreen->port);
+ else
+ {
+ if(rfbScreen->port>0) {
+ FD_ZERO(&(rfbScreen->allFds));
if ((rfbScreen->listenSock = rfbListenOnTCPPort(rfbScreen->port, iface)) < 0) {
rfbLogPerror("ListenOnTCPPort");
return;
}
-
- FD_ZERO(&(rfbScreen->allFds));
+ rfbLog("Listening for VNC connections on TCP port %d\n", rfbScreen->port);
+
FD_SET(rfbScreen->listenSock, &(rfbScreen->allFds));
rfbScreen->maxFd = rfbScreen->listenSock;
+ }
+
+#ifdef LIBVNCSERVER_IPv6
+ if (rfbScreen->ipv6port>0) {
+ if ((rfbScreen->listen6Sock = rfbListenOnTCP6Port(rfbScreen->ipv6port, rfbScreen->listen6Interface)) < 0) {
+ /* ListenOnTCP6Port has its own detailed error printout */
+ return;
+ }
+ rfbLog("Listening for VNC connections on TCP6 port %d\n", rfbScreen->ipv6port);
+
+ FD_SET(rfbScreen->listen6Sock, &(rfbScreen->allFds));
+ rfbScreen->maxFd = max((int)rfbScreen->listen6Sock,rfbScreen->maxFd);
+ }
+#endif
+
}
if (rfbScreen->udpPort != 0) {
@@ -171,6 +226,8 @@ rfbInitSockets(rfbScreenInfoPtr rfbScreen)
rfbLogPerror("ListenOnUDPPort");
return;
}
+ rfbLog("Listening for VNC connections on TCP port %d\n", rfbScreen->port);
+
FD_SET(rfbScreen->udpSock, &(rfbScreen->allFds));
rfbScreen->maxFd = max((int)rfbScreen->udpSock,rfbScreen->maxFd);
}
@@ -195,6 +252,12 @@ void rfbShutdownSockets(rfbScreenInfoPtr rfbScreen)
rfbScreen->listenSock=-1;
}
+ if(rfbScreen->listen6Sock>-1) {
+ closesocket(rfbScreen->listen6Sock);
+ FD_CLR(rfbScreen->listen6Sock,&rfbScreen->allFds);
+ rfbScreen->listen6Sock=-1;
+ }
+
if(rfbScreen->udpSock>-1) {
closesocket(rfbScreen->udpSock);
FD_CLR(rfbScreen->udpSock,&rfbScreen->allFds);
@@ -266,6 +329,16 @@ rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec)
return result;
}
+ if (rfbScreen->listen6Sock != -1 && FD_ISSET(rfbScreen->listen6Sock, &fds)) {
+
+ if (!rfbProcessNewConnection(rfbScreen))
+ return -1;
+
+ FD_CLR(rfbScreen->listen6Sock, &fds);
+ if (--nfds == 0)
+ return result;
+ }
+
if ((rfbScreen->udpSock != -1) && FD_ISSET(rfbScreen->udpSock, &fds)) {
if(!rfbScreen->udpClient)
rfbNewUDPClient(rfbScreen);
@@ -326,10 +399,33 @@ rfbProcessNewConnection(rfbScreenInfoPtr rfbScreen)
{
const int one = 1;
int sock = -1;
+#ifdef LIBVNCSERVER_IPv6
+ struct sockaddr_storage addr;
+#else
struct sockaddr_in addr;
+#endif
socklen_t addrlen = sizeof(addr);
+ fd_set listen_fds;
+ int chosen_listen_sock = -1;
+
+ /* Do another select() call to find out which listen socket
+ has an incoming connection pending. We know that at least
+ one of them has, so this should not block for too long! */
+ FD_ZERO(&listen_fds);
+ if(rfbScreen->listenSock >= 0)
+ FD_SET(rfbScreen->listenSock, &listen_fds);
+ if(rfbScreen->listen6Sock >= 0)
+ FD_SET(rfbScreen->listen6Sock, &listen_fds);
+ if (select(rfbScreen->maxFd+1, &listen_fds, NULL, NULL, NULL) == -1) {
+ rfbLogPerror("rfbProcessNewConnection: error in select");
+ return FALSE;
+ }
+ if (rfbScreen->listenSock >= 0 && FD_ISSET(rfbScreen->listenSock, &listen_fds))
+ chosen_listen_sock = rfbScreen->listenSock;
+ if (rfbScreen->listen6Sock >= 0 && FD_ISSET(rfbScreen->listen6Sock, &listen_fds))
+ chosen_listen_sock = rfbScreen->listen6Sock;
- if ((sock = accept(rfbScreen->listenSock,
+ if ((sock = accept(chosen_listen_sock,
(struct sockaddr *)&addr, &addrlen)) < 0) {
rfbLogPerror("rfbCheckFds: accept");
return FALSE;
@@ -357,7 +453,15 @@ rfbProcessNewConnection(rfbScreenInfoPtr rfbScreen)
}
#endif
+#ifdef LIBVNCSERVER_IPv6
+ char host[1024];
+ if(getnameinfo((struct sockaddr*)&addr, addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST) != 0) {
+ rfbLogPerror("rfbProcessNewConnection: error in getnameinfo");
+ }
+ rfbLog("Got connection from client %s\n", host);
+#else
rfbLog("Got connection from client %s\n", inet_ntoa(addr.sin_addr));
+#endif
rfbNewClient(rfbScreen,sock);
@@ -392,6 +496,11 @@ rfbCloseClient(rfbClientPtr cl)
while(cl->screen->maxFd>0
&& !FD_ISSET(cl->screen->maxFd,&(cl->screen->allFds)))
cl->screen->maxFd--;
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ if (cl->sslctx)
+ rfbssl_destroy(cl);
+ free(cl->wspath);
+#endif
#ifndef __MINGW32__
shutdown(cl->sock,SHUT_RDWR);
#endif
@@ -457,7 +566,17 @@ rfbReadExactTimeout(rfbClientPtr cl, char* buf, int len, int timeout)
struct timeval tv;
while (len > 0) {
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ if (cl->wsctx) {
+ n = webSocketsDecode(cl, buf, len);
+ } else if (cl->sslctx) {
+ n = rfbssl_read(cl, buf, len);
+ } else {
+ n = read(sock, buf, len);
+ }
+#else
n = read(sock, buf, len);
+#endif
if (n > 0) {
@@ -482,6 +601,12 @@ rfbReadExactTimeout(rfbClientPtr cl, char* buf, int len, int timeout)
return n;
}
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ if (cl->sslctx) {
+ if (rfbssl_pending(cl))
+ continue;
+ }
+#endif
FD_ZERO(&fds);
FD_SET(sock, &fds);
tv.tv_sec = timeout / 1000;
@@ -492,6 +617,7 @@ rfbReadExactTimeout(rfbClientPtr cl, char* buf, int len, int timeout)
return n;
}
if (n == 0) {
+ rfbErr("ReadExact: select timeout\n");
errno = ETIMEDOUT;
return -1;
}
@@ -518,6 +644,82 @@ int rfbReadExact(rfbClientPtr cl,char* buf,int len)
}
/*
+ * PeekExact peeks at an exact number of bytes from a client. Returns 1 if
+ * those bytes have been read, 0 if the other end has closed, or -1 if an
+ * error occurred (errno is set to ETIMEDOUT if it timed out).
+ */
+
+int
+rfbPeekExactTimeout(rfbClientPtr cl, char* buf, int len, int timeout)
+{
+ int sock = cl->sock;
+ int n;
+ fd_set fds;
+ struct timeval tv;
+
+ while (len > 0) {
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ if (cl->sslctx)
+ n = rfbssl_peek(cl, buf, len);
+ else
+#endif
+ n = recv(sock, buf, len, MSG_PEEK);
+
+ if (n == len) {
+
+ break;
+
+ } else if (n == 0) {
+
+ return 0;
+
+ } else {
+#ifdef WIN32
+ errno = WSAGetLastError();
+#endif
+ if (errno == EINTR)
+ continue;
+
+#ifdef LIBVNCSERVER_ENOENT_WORKAROUND
+ if (errno != ENOENT)
+#endif
+ if (errno != EWOULDBLOCK && errno != EAGAIN) {
+ return n;
+ }
+
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ if (cl->sslctx) {
+ if (rfbssl_pending(cl))
+ continue;
+ }
+#endif
+ FD_ZERO(&fds);
+ FD_SET(sock, &fds);
+ tv.tv_sec = timeout / 1000;
+ tv.tv_usec = (timeout % 1000) * 1000;
+ n = select(sock+1, &fds, NULL, &fds, &tv);
+ if (n < 0) {
+ rfbLogPerror("PeekExact: select");
+ return n;
+ }
+ if (n == 0) {
+ errno = ETIMEDOUT;
+ return -1;
+ }
+ }
+ }
+#undef DEBUG_READ_EXACT
+#ifdef DEBUG_READ_EXACT
+ rfbLog("PeekExact %d bytes\n",len);
+ for(n=0;n<len;n++)
+ fprintf(stderr,"%02x ",(unsigned char)buf[n]);
+ fprintf(stderr,"\n");
+#endif
+
+ return 1;
+}
+
+/*
* WriteExact writes an exact number of bytes to a client. Returns 1 if
* those bytes have been written, or -1 if an error occurred (errno is set to
* ETIMEDOUT if it timed out).
@@ -543,9 +745,25 @@ rfbWriteExact(rfbClientPtr cl,
fprintf(stderr,"\n");
#endif
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ if (cl->wsctx) {
+ char *tmp = NULL;
+ if ((len = webSocketsEncode(cl, buf, len, &tmp)) < 0) {
+ rfbErr("WriteExact: WebSockets encode error\n");
+ return -1;
+ }
+ buf = tmp;
+ }
+#endif
+
LOCK(cl->outputMutex);
while (len > 0) {
- n = write(sock, buf, len);
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ if (cl->sslctx)
+ n = rfbssl_write(cl, buf, len);
+ else
+#endif
+ n = write(sock, buf, len);
if (n > 0) {
@@ -656,12 +874,128 @@ rfbListenOnTCPPort(int port,
return sock;
}
+
+int
+rfbListenOnTCP6Port(int port,
+ const char* iface)
+{
+#ifndef LIBVNCSERVER_IPv6
+ rfbLogPerror("This LibVNCServer does not have IPv6 support");
+ return -1;
+#else
+ int sock;
+ int one = 1;
+ int rv;
+ struct addrinfo hints, *servinfo, *p;
+ char port_str[8];
+
+ snprintf(port_str, 8, "%d", port);
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = AF_INET6;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_flags = AI_PASSIVE; /* fill in wildcard address if iface == NULL */
+
+ if ((rv = getaddrinfo(iface, port_str, &hints, &servinfo)) != 0) {
+ rfbErr("rfbListenOnTCP6Port error in getaddrinfo: %s\n", gai_strerror(rv));
+ return -1;
+ }
+
+ /* loop through all the results and bind to the first we can */
+ for(p = servinfo; p != NULL; p = p->ai_next) {
+ if ((sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) < 0) {
+ continue;
+ }
+
+#ifdef IPV6_V6ONLY
+ /* we have seperate IPv4 and IPv6 sockets since some OS's do not support dual binding */
+ if (setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&one, sizeof(one)) < 0) {
+ rfbLogPerror("rfbListenOnTCP6Port error in setsockopt IPV6_V6ONLY");
+ closesocket(sock);
+ freeaddrinfo(servinfo);
+ return -1;
+ }
+#endif
+
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)) < 0) {
+ rfbLogPerror("rfbListenOnTCP6Port: error in setsockopt SO_REUSEADDR");
+ closesocket(sock);
+ freeaddrinfo(servinfo);
+ return -1;
+ }
+
+ if (bind(sock, p->ai_addr, p->ai_addrlen) < 0) {
+ closesocket(sock);
+ continue;
+ }
+
+ break;
+ }
+
+ if (p == NULL) {
+ rfbLogPerror("rfbListenOnTCP6Port: error in bind IPv6 socket");
+ freeaddrinfo(servinfo);
+ return -1;
+ }
+
+ /* all done with this structure now */
+ freeaddrinfo(servinfo);
+
+ if (listen(sock, 32) < 0) {
+ rfbLogPerror("rfbListenOnTCP6Port: error in listen on IPv6 socket");
+ closesocket(sock);
+ return -1;
+ }
+
+ return sock;
+#endif
+}
+
+
int
rfbConnectToTcpAddr(char *host,
int port)
{
- struct hostent *hp;
int sock;
+#ifdef LIBVNCSERVER_IPv6
+ struct addrinfo hints, *servinfo, *p;
+ int rv;
+ char port_str[8];
+
+ snprintf(port_str, 8, "%d", port);
+
+ memset(&hints, 0, sizeof hints);
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+
+ if ((rv = getaddrinfo(host, port_str, &hints, &servinfo)) != 0) {
+ rfbErr("rfbConnectToTcpAddr: error in getaddrinfo: %s\n", gai_strerror(rv));
+ return -1;
+ }
+
+ /* loop through all the results and connect to the first we can */
+ for(p = servinfo; p != NULL; p = p->ai_next) {
+ if ((sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) < 0)
+ continue;
+
+ if (connect(sock, p->ai_addr, p->ai_addrlen) < 0) {
+ closesocket(sock);
+ continue;
+ }
+
+ break;
+ }
+
+ /* all failed */
+ if (p == NULL) {
+ rfbLogPerror("rfbConnectToTcoAddr: failed to connect\n");
+ sock = -1; /* set return value */
+ }
+
+ /* all done with this structure now */
+ freeaddrinfo(servinfo);
+#else
+ struct hostent *hp;
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
@@ -685,7 +1019,7 @@ rfbConnectToTcpAddr(char *host,
closesocket(sock);
return -1;
}
-
+#endif
return sock;
}
diff --git a/ica/x11/libvncserver/stats.c b/ica/x11/libvncserver/stats.c
index 6dab13b..39de1c6 100644
--- a/ica/x11/libvncserver/stats.c
+++ b/ica/x11/libvncserver/stats.c
@@ -100,6 +100,7 @@ char *encodingName(uint32_t type, char *buf, int len) {
case rfbEncodingHextile: snprintf(buf, len, "hextile"); break;
case rfbEncodingZlib: snprintf(buf, len, "zlib"); break;
case rfbEncodingTight: snprintf(buf, len, "tight"); break;
+ case rfbEncodingTightPng: snprintf(buf, len, "tightPng"); break;
case rfbEncodingZlibHex: snprintf(buf, len, "zlibhex"); break;
case rfbEncodingUltra: snprintf(buf, len, "ultra"); break;
case rfbEncodingZRLE: snprintf(buf, len, "ZRLE"); break;
diff --git a/ica/x11/libvncserver/tight.c b/ica/x11/libvncserver/tight.c
index 54eb921..276a2e3 100644
--- a/ica/x11/libvncserver/tight.c
+++ b/ica/x11/libvncserver/tight.c
@@ -2,9 +2,20 @@
* tight.c
*
* Routines to implement Tight Encoding
+ *
+ * Our Tight encoder is based roughly on the TurboVNC v0.6 encoder with some
+ * additional enhancements from TurboVNC 1.1. For lower compression levels,
+ * this encoder provides a tremendous reduction in CPU usage (and subsequently,
+ * an increase in throughput for CPU-limited environments) relative to the
+ * TightVNC encoder, whereas Compression Level 9 provides a low-bandwidth mode
+ * that behaves similarly to Compression Levels 5-9 in the old TightVNC
+ * encoder.
*/
/*
+ * Copyright (C) 2010-2012 D. R. Commander. All Rights Reserved.
+ * Copyright (C) 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright (C) 2004 Landmark Graphics Corporation. All Rights Reserved.
* Copyright (C) 2000, 2001 Const Kaplinsky. All Rights Reserved.
* Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
*
@@ -20,21 +31,18 @@
*
* 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,
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*/
-/*#include <stdio.h>*/
#include <rfb/rfb.h>
#include "private.h"
-#ifdef WIN32
-#define XMD_H
-#undef FAR
-#define NEEDFAR_POINTERS
+#ifdef LIBVNCSERVER_HAVE_LIBPNG
+#include <png.h>
#endif
+#include "turbojpeg.h"
-#include <jpeglib.h>
/* Note: The following constant should not be changed. */
#define TIGHT_MIN_TO_COMPRESS 12
@@ -44,9 +52,6 @@
#define MIN_SOLID_SUBRECT_SIZE 2048
#define MAX_SPLIT_TILE_SIZE 16
-/* May be set to TRUE with "-lazytight" Xvnc option. */
-rfbBool rfbTightDisableGradient = FALSE;
-
/*
* There is so much access of the Tight encoding static data buffers
* that we resort to using thread local storage instead of having
@@ -62,34 +67,53 @@ rfbBool rfbTightDisableGradient = FALSE;
/* This variable is set on every rfbSendRectEncodingTight() call. */
static TLS rfbBool usePixelFormat24 = FALSE;
+
/* Compression level stuff. The following array contains various
encoder parameters for each of 10 compression levels (0..9).
Last three parameters correspond to JPEG quality levels (0..9). */
typedef struct TIGHT_CONF_s {
int maxRectSize, maxRectWidth;
- int monoMinRectSize, gradientMinRectSize;
- int idxZlibLevel, monoZlibLevel, rawZlibLevel, gradientZlibLevel;
- int gradientThreshold, gradientThreshold24;
+ int monoMinRectSize;
+ int idxZlibLevel, monoZlibLevel, rawZlibLevel;
int idxMaxColorsDivisor;
- int jpegQuality, jpegThreshold, jpegThreshold24;
+ int palMaxColorsWithJPEG;
} TIGHT_CONF;
-static TIGHT_CONF tightConf[10] = {
- { 512, 32, 6, 65536, 0, 0, 0, 0, 0, 0, 4, 5, 10000, 23000 },
- { 2048, 128, 6, 65536, 1, 1, 1, 0, 0, 0, 8, 10, 8000, 18000 },
- { 6144, 256, 8, 65536, 3, 3, 2, 0, 0, 0, 24, 15, 6500, 15000 },
- { 10240, 1024, 12, 65536, 5, 5, 3, 0, 0, 0, 32, 25, 5000, 12000 },
- { 16384, 2048, 12, 65536, 6, 6, 4, 0, 0, 0, 32, 37, 4000, 10000 },
- { 32768, 2048, 12, 4096, 7, 7, 5, 4, 150, 380, 32, 50, 3000, 8000 },
- { 65536, 2048, 16, 4096, 7, 7, 6, 4, 170, 420, 48, 60, 2000, 5000 },
- { 65536, 2048, 16, 4096, 8, 8, 7, 5, 180, 450, 64, 70, 1000, 2500 },
- { 65536, 2048, 32, 8192, 9, 9, 8, 6, 190, 475, 64, 75, 500, 1200 },
- { 65536, 2048, 32, 8192, 9, 9, 9, 6, 200, 500, 96, 80, 200, 500 }
+static TIGHT_CONF tightConf[4] = {
+ { 65536, 2048, 6, 0, 0, 0, 4, 24 }, /* 0 (used only without JPEG) */
+ { 65536, 2048, 32, 1, 1, 1, 96, 24 }, /* 1 */
+ { 65536, 2048, 32, 3, 3, 2, 96, 96 }, /* 2 (used only with JPEG) */
+ { 65536, 2048, 32, 7, 7, 5, 96, 256 } /* 9 */
+};
+
+#ifdef LIBVNCSERVER_HAVE_LIBPNG
+typedef struct TIGHT_PNG_CONF_s {
+ int png_zlib_level, png_filters;
+} TIGHT_PNG_CONF;
+
+static TIGHT_PNG_CONF tightPngConf[10] = {
+ { 0, PNG_NO_FILTERS },
+ { 1, PNG_NO_FILTERS },
+ { 2, PNG_NO_FILTERS },
+ { 3, PNG_NO_FILTERS },
+ { 4, PNG_NO_FILTERS },
+ { 5, PNG_ALL_FILTERS },
+ { 6, PNG_ALL_FILTERS },
+ { 7, PNG_ALL_FILTERS },
+ { 8, PNG_ALL_FILTERS },
+ { 9, PNG_ALL_FILTERS },
+};
+#endif
+
+static TLS int compressLevel = 1;
+static TLS int qualityLevel = 95;
+static TLS int subsampLevel = TJ_444;
+
+static const int subsampLevel2tjsubsamp[4] = {
+ TJ_444, TJ_420, TJ_422, TJ_GRAYSCALE
};
-static TLS int compressLevel = 0;
-static TLS int qualityLevel = 0;
/* Stuff dealing with palettes. */
@@ -125,89 +149,88 @@ static TLS char *tightBeforeBuf = NULL;
static TLS int tightAfterBufSize = 0;
static TLS char *tightAfterBuf = NULL;
-static TLS int *prevRowBuf = NULL;
+static TLS tjhandle j = NULL;
-void rfbTightCleanup(rfbScreenInfoPtr screen)
+void rfbTightCleanup (rfbScreenInfoPtr screen)
{
- if(tightBeforeBufSize) {
- free(tightBeforeBuf);
- tightBeforeBufSize=0;
- tightBeforeBuf = NULL;
- }
- if(tightAfterBufSize) {
- free(tightAfterBuf);
- tightAfterBufSize=0;
- tightAfterBuf = NULL;
- }
+ if (tightBeforeBufSize) {
+ free (tightBeforeBuf);
+ tightBeforeBufSize = 0;
+ tightBeforeBuf = NULL;
+ }
+ if (tightAfterBufSize) {
+ free (tightAfterBuf);
+ tightAfterBufSize = 0;
+ tightAfterBuf = NULL;
+ }
+ if (j) tjDestroy(j);
}
+
/* Prototypes for static functions. */
+static rfbBool SendRectEncodingTight(rfbClientPtr cl, int x, int y,
+ int w, int h);
static void FindBestSolidArea (rfbClientPtr cl, int x, int y, int w, int h,
uint32_t colorValue, int *w_ptr, int *h_ptr);
static void ExtendSolidArea (rfbClientPtr cl, int x, int y, int w, int h,
uint32_t colorValue,
int *x_ptr, int *y_ptr, int *w_ptr, int *h_ptr);
static rfbBool CheckSolidTile (rfbClientPtr cl, int x, int y, int w, int h,
- uint32_t *colorPtr, rfbBool needSameColor);
+ uint32_t *colorPtr, rfbBool needSameColor);
static rfbBool CheckSolidTile8 (rfbClientPtr cl, int x, int y, int w, int h,
- uint32_t *colorPtr, rfbBool needSameColor);
+ uint32_t *colorPtr, rfbBool needSameColor);
static rfbBool CheckSolidTile16 (rfbClientPtr cl, int x, int y, int w, int h,
- uint32_t *colorPtr, rfbBool needSameColor);
+ uint32_t *colorPtr, rfbBool needSameColor);
static rfbBool CheckSolidTile32 (rfbClientPtr cl, int x, int y, int w, int h,
- uint32_t *colorPtr, rfbBool needSameColor);
+ uint32_t *colorPtr, rfbBool needSameColor);
static rfbBool SendRectSimple (rfbClientPtr cl, int x, int y, int w, int h);
static rfbBool SendSubrect (rfbClientPtr cl, int x, int y, int w, int h);
static rfbBool SendTightHeader (rfbClientPtr cl, int x, int y, int w, int h);
static rfbBool SendSolidRect (rfbClientPtr cl);
-static rfbBool SendMonoRect (rfbClientPtr cl, int w, int h);
-static rfbBool SendIndexedRect (rfbClientPtr cl, int w, int h);
-static rfbBool SendFullColorRect (rfbClientPtr cl, int w, int h);
-static rfbBool SendGradientRect (rfbClientPtr cl, int w, int h);
-
-static rfbBool CompressData(rfbClientPtr cl, int streamId, int dataLen,
- int zlibLevel, int zlibStrategy);
-static rfbBool SendCompressedData(rfbClientPtr cl, int compressedLen);
-
-static void FillPalette8(int count);
-static void FillPalette16(int count);
-static void FillPalette32(int count);
-
-static void PaletteReset(void);
-static int PaletteInsert(uint32_t rgb, int numPixels, int bpp);
-
-static void Pack24(rfbClientPtr cl, char *buf, rfbPixelFormat *fmt, int count);
-
-static void EncodeIndexedRect16(uint8_t *buf, int count);
-static void EncodeIndexedRect32(uint8_t *buf, int count);
-
-static void EncodeMonoRect8(uint8_t *buf, int w, int h);
-static void EncodeMonoRect16(uint8_t *buf, int w, int h);
-static void EncodeMonoRect32(uint8_t *buf, int w, int h);
-
-static void FilterGradient24(rfbClientPtr cl, char *buf, rfbPixelFormat *fmt, int w, int h);
-static void FilterGradient16(rfbClientPtr cl, uint16_t *buf, rfbPixelFormat *fmt, int w, int h);
-static void FilterGradient32(rfbClientPtr cl, uint32_t *buf, rfbPixelFormat *fmt, int w, int h);
-
-static int DetectSmoothImage(rfbClientPtr cl, rfbPixelFormat *fmt, int w, int h);
-static unsigned long DetectSmoothImage24(rfbClientPtr cl, rfbPixelFormat *fmt, int w, int h);
-static unsigned long DetectSmoothImage16(rfbClientPtr cl, rfbPixelFormat *fmt, int w, int h);
-static unsigned long DetectSmoothImage32(rfbClientPtr cl, rfbPixelFormat *fmt, int w, int h);
-
-static rfbBool SendJpegRect(rfbClientPtr cl, int x, int y, int w, int h,
- int quality);
-static void PrepareRowForJpeg(rfbClientPtr cl, uint8_t *dst, int x, int y, int count);
-static void PrepareRowForJpeg24(rfbClientPtr cl, uint8_t *dst, int x, int y, int count);
-static void PrepareRowForJpeg16(rfbClientPtr cl, uint8_t *dst, int x, int y, int count);
-static void PrepareRowForJpeg32(rfbClientPtr cl, uint8_t *dst, int x, int y, int count);
-
-static void JpegInitDestination(j_compress_ptr cinfo);
-static boolean JpegEmptyOutputBuffer(j_compress_ptr cinfo);
-static void JpegTermDestination(j_compress_ptr cinfo);
-static void JpegSetDstManager(j_compress_ptr cinfo);
-
+static rfbBool SendMonoRect (rfbClientPtr cl, int x, int y, int w, int h);
+static rfbBool SendIndexedRect (rfbClientPtr cl, int x, int y, int w, int h);
+static rfbBool SendFullColorRect (rfbClientPtr cl, int x, int y, int w, int h);
+
+static rfbBool CompressData (rfbClientPtr cl, int streamId, int dataLen,
+ int zlibLevel, int zlibStrategy);
+static rfbBool SendCompressedData (rfbClientPtr cl, char *buf,
+ int compressedLen);
+
+static void FillPalette8 (int count);
+static void FillPalette16 (int count);
+static void FillPalette32 (int count);
+static void FastFillPalette16 (rfbClientPtr cl, uint16_t *data, int w,
+ int pitch, int h);
+static void FastFillPalette32 (rfbClientPtr cl, uint32_t *data, int w,
+ int pitch, int h);
+
+static void PaletteReset (void);
+static int PaletteInsert (uint32_t rgb, int numPixels, int bpp);
+
+static void Pack24 (rfbClientPtr cl, char *buf, rfbPixelFormat *fmt,
+ int count);
+
+static void EncodeIndexedRect16 (uint8_t *buf, int count);
+static void EncodeIndexedRect32 (uint8_t *buf, int count);
+
+static void EncodeMonoRect8 (uint8_t *buf, int w, int h);
+static void EncodeMonoRect16 (uint8_t *buf, int w, int h);
+static void EncodeMonoRect32 (uint8_t *buf, int w, int h);
+
+static rfbBool SendJpegRect (rfbClientPtr cl, int x, int y, int w, int h,
+ int quality);
+static void PrepareRowForImg(rfbClientPtr cl, uint8_t *dst, int x, int y, int count);
+static void PrepareRowForImg24(rfbClientPtr cl, uint8_t *dst, int x, int y, int count);
+static void PrepareRowForImg16(rfbClientPtr cl, uint8_t *dst, int x, int y, int count);
+static void PrepareRowForImg32(rfbClientPtr cl, uint8_t *dst, int x, int y, int count);
+
+#ifdef LIBVNCSERVER_HAVE_LIBPNG
+static rfbBool SendPngRect(rfbClientPtr cl, int x, int y, int w, int h);
+static rfbBool CanSendPngRect(rfbClientPtr cl, int w, int h);
+#endif
/*
* Tight encoding implementation.
@@ -226,10 +249,10 @@ rfbNumCodedRectsTight(rfbClientPtr cl,
/* No matter how many rectangles we will send if LastRect markers
are used to terminate rectangle stream. */
if (cl->enableLastRectEncoding && w * h >= MIN_SPLIT_RECT_SIZE)
- return 0;
+ return 0;
- maxRectSize = tightConf[cl->tightCompressLevel].maxRectSize;
- maxRectWidth = tightConf[cl->tightCompressLevel].maxRectWidth;
+ maxRectSize = tightConf[compressLevel].maxRectSize;
+ maxRectWidth = tightConf[compressLevel].maxRectWidth;
if (w > maxRectWidth || w * h > maxRectSize) {
subrectMaxWidth = (w > maxRectWidth) ? maxRectWidth : w;
@@ -248,6 +271,29 @@ rfbSendRectEncodingTight(rfbClientPtr cl,
int w,
int h)
{
+ cl->tightEncoding = rfbEncodingTight;
+ return SendRectEncodingTight(cl, x, y, w, h);
+}
+
+rfbBool
+rfbSendRectEncodingTightPng(rfbClientPtr cl,
+ int x,
+ int y,
+ int w,
+ int h)
+{
+ cl->tightEncoding = rfbEncodingTightPng;
+ return SendRectEncodingTight(cl, x, y, w, h);
+}
+
+
+rfbBool
+SendRectEncodingTight(rfbClientPtr cl,
+ int x,
+ int y,
+ int w,
+ int h)
+{
int nMaxRows;
uint32_t colorValue;
int dx, dy, dw, dh;
@@ -257,7 +303,34 @@ rfbSendRectEncodingTight(rfbClientPtr cl,
rfbSendUpdateBuf(cl);
compressLevel = cl->tightCompressLevel;
- qualityLevel = cl->tightQualityLevel;
+ qualityLevel = cl->turboQualityLevel;
+ subsampLevel = cl->turboSubsampLevel;
+
+ /* We only allow compression levels that have a demonstrable performance
+ benefit. CL 0 with JPEG reduces CPU usage for workloads that have low
+ numbers of unique colors, but the same thing can be accomplished by
+ using CL 0 without JPEG (AKA "Lossless Tight.") For those same
+ low-color workloads, CL 2 can provide typically 20-40% better
+ compression than CL 1 (with a commensurate increase in CPU usage.) For
+ high-color workloads, CL 1 should always be used, as higher compression
+ levels increase CPU usage for these workloads without providing any
+ significant reduction in bandwidth. */
+ if (qualityLevel != -1) {
+ if (compressLevel < 1) compressLevel = 1;
+ if (compressLevel > 2) compressLevel = 2;
+ }
+
+ /* With JPEG disabled, CL 2 offers no significant bandwidth savings over
+ CL 1, so we don't include it. */
+ else if (compressLevel > 1) compressLevel = 1;
+
+ /* CL 9 (which maps internally to CL 3) is included mainly for backward
+ compatibility with TightVNC Compression Levels 5-9. It should be used
+ only in extremely low-bandwidth cases in which it can be shown to have a
+ benefit. For low-color workloads, it provides typically only 10-20%
+ better compression than CL 2 with JPEG and CL 1 without JPEG, and it
+ uses, on average, twice as much CPU time. */
+ if (cl->tightCompressLevel == 9) compressLevel = 3;
if ( cl->format.depth == 24 && cl->format.redMax == 0xFF &&
cl->format.greenMax == 0xFF && cl->format.blueMax == 0xFF ) {
@@ -277,7 +350,7 @@ rfbSendRectEncodingTight(rfbClientPtr cl,
tightBeforeBuf = (char *)malloc(tightBeforeBufSize);
else
tightBeforeBuf = (char *)realloc(tightBeforeBuf,
- tightBeforeBufSize);
+ tightBeforeBufSize);
}
/* Calculate maximum number of rows in one non-solid rectangle. */
@@ -305,15 +378,24 @@ rfbSendRectEncodingTight(rfbClientPtr cl,
}
dh = (dy + MAX_SPLIT_TILE_SIZE <= y + h) ?
- MAX_SPLIT_TILE_SIZE : (y + h - dy);
+ MAX_SPLIT_TILE_SIZE : (y + h - dy);
for (dx = x; dx < x + w; dx += MAX_SPLIT_TILE_SIZE) {
dw = (dx + MAX_SPLIT_TILE_SIZE <= x + w) ?
- MAX_SPLIT_TILE_SIZE : (x + w - dx);
+ MAX_SPLIT_TILE_SIZE : (x + w - dx);
if (CheckSolidTile(cl, dx, dy, dw, dh, &colorValue, FALSE)) {
+ if (subsampLevel == TJ_GRAYSCALE && qualityLevel != -1) {
+ uint32_t r = (colorValue >> 16) & 0xFF;
+ uint32_t g = (colorValue >> 8) & 0xFF;
+ uint32_t b = (colorValue) & 0xFF;
+ double y = (0.257 * (double)r) + (0.504 * (double)g)
+ + (0.098 * (double)b) + 16.;
+ colorValue = (int)y + (((int)y) << 8) + (((int)y) << 16);
+ }
+
/* Get dimensions of solid-color area. */
FindBestSolidArea(cl, dx, dy, w - (dx - x), h - (dy - y),
@@ -338,7 +420,7 @@ rfbSendRectEncodingTight(rfbClientPtr cl,
!SendRectSimple(cl, x, y, w, y_best-y) )
return FALSE;
if ( x_best != x &&
- !rfbSendRectEncodingTight(cl, x, y_best,
+ !SendRectEncodingTight(cl, x, y_best,
x_best-x, h_best) )
return FALSE;
@@ -361,12 +443,12 @@ rfbSendRectEncodingTight(rfbClientPtr cl,
/* Send remaining rectangles (at right and bottom). */
if ( x_best + w_best != x + w &&
- !rfbSendRectEncodingTight(cl, x_best+w_best, y_best,
- w-(x_best-x)-w_best, h_best) )
+ !SendRectEncodingTight(cl, x_best + w_best, y_best,
+ w - (x_best-x) - w_best, h_best) )
return FALSE;
if ( y_best + h_best != y + h &&
- !rfbSendRectEncodingTight(cl, x, y_best+h_best,
- w, h-(y_best-y)-h_best) )
+ !SendRectEncodingTight(cl, x, y_best + h_best,
+ w, h - (y_best-y) - h_best) )
return FALSE;
/* Return after all recursive calls are done. */
@@ -383,6 +465,7 @@ rfbSendRectEncodingTight(rfbClientPtr cl,
return SendRectSimple(cl, x, y, w, h);
}
+
static void
FindBestSolidArea(rfbClientPtr cl,
int x,
@@ -402,16 +485,16 @@ FindBestSolidArea(rfbClientPtr cl,
for (dy = y; dy < y + h; dy += MAX_SPLIT_TILE_SIZE) {
dh = (dy + MAX_SPLIT_TILE_SIZE <= y + h) ?
- MAX_SPLIT_TILE_SIZE : (y + h - dy);
+ MAX_SPLIT_TILE_SIZE : (y + h - dy);
dw = (w_prev > MAX_SPLIT_TILE_SIZE) ?
- MAX_SPLIT_TILE_SIZE : w_prev;
+ MAX_SPLIT_TILE_SIZE : w_prev;
if (!CheckSolidTile(cl, x, dy, dw, dh, &colorValue, TRUE))
break;
for (dx = x + dw; dx < x + w_prev;) {
dw = (dx + MAX_SPLIT_TILE_SIZE <= x + w_prev) ?
- MAX_SPLIT_TILE_SIZE : (x + w_prev - dx);
+ MAX_SPLIT_TILE_SIZE : (x + w_prev - dx);
if (!CheckSolidTile(cl, dx, dy, dw, dh, &colorValue, TRUE))
break;
dx += dw;
@@ -428,6 +511,7 @@ FindBestSolidArea(rfbClientPtr cl,
*h_ptr = h_best;
}
+
static void
ExtendSolidArea(rfbClientPtr cl,
int x,
@@ -471,6 +555,7 @@ ExtendSolidArea(rfbClientPtr cl,
*w_ptr += cx - (*x_ptr + *w_ptr);
}
+
/*
* Check if a rectangle is all of the same color. If needSameColor is
* set to non-zero, then also check that its color equals to the
@@ -490,6 +575,7 @@ static rfbBool CheckSolidTile(rfbClientPtr cl, int x, int y, int w, int h, uint3
}
}
+
#define DEFINE_CHECK_SOLID_FUNCTION(bpp) \
\
static rfbBool \
@@ -500,8 +586,8 @@ CheckSolidTile##bpp(rfbClientPtr cl, int x, int y, int w, int h, \
uint##bpp##_t colorValue; \
int dx, dy; \
\
- fbptr = (uint##bpp##_t *) \
- &cl->scaledScreen->frameBuffer[y * cl->scaledScreen->paddedWidthInBytes + x * (bpp/8)]; \
+ fbptr = (uint##bpp##_t *)&cl->scaledScreen->frameBuffer \
+ [y * cl->scaledScreen->paddedWidthInBytes + x * (bpp/8)]; \
\
colorValue = *fbptr; \
if (needSameColor && (uint32_t)colorValue != *colorPtr) \
@@ -512,7 +598,8 @@ CheckSolidTile##bpp(rfbClientPtr cl, int x, int y, int w, int h, \
if (colorValue != fbptr[dx]) \
return FALSE; \
} \
- fbptr = (uint##bpp##_t *)((uint8_t *)fbptr + cl->scaledScreen->paddedWidthInBytes); \
+ fbptr = (uint##bpp##_t *)((uint8_t *)fbptr \
+ + cl->scaledScreen->paddedWidthInBytes); \
} \
\
*colorPtr = (uint32_t)colorValue; \
@@ -544,7 +631,7 @@ SendRectSimple(rfbClientPtr cl, int x, int y, int w, int h)
tightBeforeBuf = (char *)malloc(tightBeforeBufSize);
else
tightBeforeBuf = (char *)realloc(tightBeforeBuf,
- tightBeforeBufSize);
+ tightBeforeBufSize);
}
if (tightAfterBufSize < maxAfterSize) {
@@ -553,7 +640,7 @@ SendRectSimple(rfbClientPtr cl, int x, int y, int w, int h)
tightAfterBuf = (char *)malloc(tightAfterBufSize);
else
tightAfterBuf = (char *)realloc(tightAfterBuf,
- tightAfterBufSize);
+ tightAfterBufSize);
}
if (w > maxRectWidth || w * h > maxRectSize) {
@@ -564,7 +651,7 @@ SendRectSimple(rfbClientPtr cl, int x, int y, int w, int h)
for (dx = 0; dx < w; dx += maxRectWidth) {
rw = (dx + maxRectWidth < w) ? maxRectWidth : w - dx;
rh = (dy + subrectMaxHeight < h) ? subrectMaxHeight : h - dy;
- if (!SendSubrect(cl, x+dx, y+dy, rw, rh))
+ if (!SendSubrect(cl, x + dx, y + dy, rw, rh))
return FALSE;
}
}
@@ -595,41 +682,70 @@ SendSubrect(rfbClientPtr cl,
if (!SendTightHeader(cl, x, y, w, h))
return FALSE;
- fbptr = (cl->scaledScreen->frameBuffer + (cl->scaledScreen->paddedWidthInBytes * y)
+ fbptr = (cl->scaledScreen->frameBuffer
+ + (cl->scaledScreen->paddedWidthInBytes * y)
+ (x * (cl->scaledScreen->bitsPerPixel / 8)));
- (*cl->translateFn)(cl->translateLookupTable, &cl->screen->serverFormat,
- &cl->format, fbptr, tightBeforeBuf,
- cl->scaledScreen->paddedWidthInBytes, w, h);
+ if (subsampLevel == TJ_GRAYSCALE && qualityLevel != -1)
+ return SendJpegRect(cl, x, y, w, h, qualityLevel);
paletteMaxColors = w * h / tightConf[compressLevel].idxMaxColorsDivisor;
+ if(qualityLevel != -1)
+ paletteMaxColors = tightConf[compressLevel].palMaxColorsWithJPEG;
if ( paletteMaxColors < 2 &&
w * h >= tightConf[compressLevel].monoMinRectSize ) {
paletteMaxColors = 2;
}
- switch (cl->format.bitsPerPixel) {
- case 8:
- FillPalette8(w * h);
- break;
- case 16:
- FillPalette16(w * h);
- break;
- default:
- FillPalette32(w * h);
+
+ if (cl->format.bitsPerPixel == cl->screen->serverFormat.bitsPerPixel &&
+ cl->format.redMax == cl->screen->serverFormat.redMax &&
+ cl->format.greenMax == cl->screen->serverFormat.greenMax &&
+ cl->format.blueMax == cl->screen->serverFormat.blueMax &&
+ cl->format.bitsPerPixel >= 16) {
+
+ /* This is so we can avoid translating the pixels when compressing
+ with JPEG, since it is unnecessary */
+ switch (cl->format.bitsPerPixel) {
+ case 16:
+ FastFillPalette16(cl, (uint16_t *)fbptr, w,
+ cl->scaledScreen->paddedWidthInBytes / 2, h);
+ break;
+ default:
+ FastFillPalette32(cl, (uint32_t *)fbptr, w,
+ cl->scaledScreen->paddedWidthInBytes / 4, h);
+ }
+
+ if(paletteNumColors != 0 || qualityLevel == -1) {
+ (*cl->translateFn)(cl->translateLookupTable,
+ &cl->screen->serverFormat, &cl->format, fbptr,
+ tightBeforeBuf,
+ cl->scaledScreen->paddedWidthInBytes, w, h);
+ }
+ }
+ else {
+ (*cl->translateFn)(cl->translateLookupTable, &cl->screen->serverFormat,
+ &cl->format, fbptr, tightBeforeBuf,
+ cl->scaledScreen->paddedWidthInBytes, w, h);
+
+ switch (cl->format.bitsPerPixel) {
+ case 8:
+ FillPalette8(w * h);
+ break;
+ case 16:
+ FillPalette16(w * h);
+ break;
+ default:
+ FillPalette32(w * h);
+ }
}
switch (paletteNumColors) {
case 0:
/* Truecolor image */
- if (DetectSmoothImage(cl, &cl->format, w, h)) {
- if (qualityLevel != -1) {
- success = SendJpegRect(cl, x, y, w, h,
- tightConf[qualityLevel].jpegQuality);
- } else {
- success = SendGradientRect(cl, w, h);
- }
+ if (qualityLevel != -1) {
+ success = SendJpegRect(cl, x, y, w, h, qualityLevel);
} else {
- success = SendFullColorRect(cl, w, h);
+ success = SendFullColorRect(cl, x, y, w, h);
}
break;
case 1:
@@ -638,18 +754,11 @@ SendSubrect(rfbClientPtr cl,
break;
case 2:
/* Two-color rectangle */
- success = SendMonoRect(cl, w, h);
+ success = SendMonoRect(cl, x, y, w, h);
break;
default:
/* Up to 256 different colors */
- if ( paletteNumColors > 96 &&
- qualityLevel != -1 && qualityLevel <= 3 &&
- DetectSmoothImage(cl, &cl->format, w, h) ) {
- success = SendJpegRect(cl, x, y, w, h,
- tightConf[qualityLevel].jpegQuality);
- } else {
- success = SendIndexedRect(cl, w, h);
- }
+ success = SendIndexedRect(cl, x, y, w, h);
}
return success;
}
@@ -672,14 +781,16 @@ SendTightHeader(rfbClientPtr cl,
rect.r.y = Swap16IfLE(y);
rect.r.w = Swap16IfLE(w);
rect.r.h = Swap16IfLE(h);
- rect.encoding = Swap32IfLE(rfbEncodingTight);
+ rect.encoding = Swap32IfLE(cl->tightEncoding);
memcpy(&cl->updateBuf[cl->ublen], (char *)&rect,
sz_rfbFramebufferUpdateRectHeader);
cl->ublen += sz_rfbFramebufferUpdateRectHeader;
- rfbStatRecordEncodingSent(cl, rfbEncodingTight, sz_rfbFramebufferUpdateRectHeader,
- sz_rfbFramebufferUpdateRectHeader + w * (cl->format.bitsPerPixel / 8) * h);
+ rfbStatRecordEncodingSent(cl, cl->tightEncoding,
+ sz_rfbFramebufferUpdateRectHeader,
+ sz_rfbFramebufferUpdateRectHeader
+ + w * (cl->format.bitsPerPixel / 8) * h);
return TRUE;
}
@@ -708,19 +819,29 @@ SendSolidRect(rfbClientPtr cl)
memcpy (&cl->updateBuf[cl->ublen], tightBeforeBuf, len);
cl->ublen += len;
- rfbStatRecordEncodingSentAdd(cl, rfbEncodingTight, len+1);
+ rfbStatRecordEncodingSentAdd(cl, cl->tightEncoding, len + 1);
return TRUE;
}
static rfbBool
SendMonoRect(rfbClientPtr cl,
+ int x,
+ int y,
int w,
int h)
{
int streamId = 1;
int paletteLen, dataLen;
+#ifdef LIBVNCSERVER_HAVE_LIBPNG
+ if (CanSendPngRect(cl, w, h)) {
+ /* TODO: setup palette maybe */
+ return SendPngRect(cl, x, y, w, h);
+ /* TODO: destroy palette maybe */
+ }
+#endif
+
if ( cl->ublen + TIGHT_MIN_TO_COMPRESS + 6 +
2 * cl->format.bitsPerPixel / 8 > UPDATE_BUF_SIZE ) {
if (!rfbSendUpdateBuf(cl))
@@ -731,7 +852,12 @@ SendMonoRect(rfbClientPtr cl,
dataLen = (w + 7) / 8;
dataLen *= h;
- cl->updateBuf[cl->ublen++] = (streamId | rfbTightExplicitFilter) << 4;
+ if (tightConf[compressLevel].monoZlibLevel == 0 &&
+ cl->tightEncoding != rfbEncodingTightPng)
+ cl->updateBuf[cl->ublen++] =
+ (char)((rfbTightNoZlib | rfbTightExplicitFilter) << 4);
+ else
+ cl->updateBuf[cl->ublen++] = (streamId | rfbTightExplicitFilter) << 4;
cl->updateBuf[cl->ublen++] = rfbTightFilterPalette;
cl->updateBuf[cl->ublen++] = 1;
@@ -751,7 +877,7 @@ SendMonoRect(rfbClientPtr cl,
memcpy(&cl->updateBuf[cl->ublen], tightAfterBuf, paletteLen);
cl->ublen += paletteLen;
- rfbStatRecordEncodingSentAdd(cl, rfbEncodingTight, 3 + paletteLen);
+ rfbStatRecordEncodingSentAdd(cl, cl->tightEncoding, 3 + paletteLen);
break;
case 16:
@@ -762,7 +888,7 @@ SendMonoRect(rfbClientPtr cl,
memcpy(&cl->updateBuf[cl->ublen], tightAfterBuf, 4);
cl->ublen += 4;
- rfbStatRecordEncodingSentAdd(cl, rfbEncodingTight, 7);
+ rfbStatRecordEncodingSentAdd(cl, cl->tightEncoding, 7);
break;
default:
@@ -770,7 +896,7 @@ SendMonoRect(rfbClientPtr cl,
cl->updateBuf[cl->ublen++] = (char)monoBackground;
cl->updateBuf[cl->ublen++] = (char)monoForeground;
- rfbStatRecordEncodingSentAdd(cl, rfbEncodingTight, 5);
+ rfbStatRecordEncodingSentAdd(cl, cl->tightEncoding, 5);
}
return CompressData(cl, streamId, dataLen,
@@ -780,12 +906,20 @@ SendMonoRect(rfbClientPtr cl,
static rfbBool
SendIndexedRect(rfbClientPtr cl,
+ int x,
+ int y,
int w,
int h)
{
int streamId = 2;
int i, entryLen;
+#ifdef LIBVNCSERVER_HAVE_LIBPNG
+ if (CanSendPngRect(cl, w, h)) {
+ return SendPngRect(cl, x, y, w, h);
+ }
+#endif
+
if ( cl->ublen + TIGHT_MIN_TO_COMPRESS + 6 +
paletteNumColors * cl->format.bitsPerPixel / 8 >
UPDATE_BUF_SIZE ) {
@@ -794,7 +928,12 @@ SendIndexedRect(rfbClientPtr cl,
}
/* Prepare tight encoding header. */
- cl->updateBuf[cl->ublen++] = (streamId | rfbTightExplicitFilter) << 4;
+ if (tightConf[compressLevel].idxZlibLevel == 0 &&
+ cl->tightEncoding != rfbEncodingTightPng)
+ cl->updateBuf[cl->ublen++] =
+ (char)((rfbTightNoZlib | rfbTightExplicitFilter) << 4);
+ else
+ cl->updateBuf[cl->ublen++] = (streamId | rfbTightExplicitFilter) << 4;
cl->updateBuf[cl->ublen++] = rfbTightFilterPalette;
cl->updateBuf[cl->ublen++] = (char)(paletteNumColors - 1);
@@ -814,9 +953,11 @@ SendIndexedRect(rfbClientPtr cl,
} else
entryLen = 4;
- memcpy(&cl->updateBuf[cl->ublen], tightAfterBuf, paletteNumColors * entryLen);
+ memcpy(&cl->updateBuf[cl->ublen], tightAfterBuf,
+ paletteNumColors * entryLen);
cl->ublen += paletteNumColors * entryLen;
- rfbStatRecordEncodingSentAdd(cl, rfbEncodingTight, 3 + paletteNumColors * entryLen);
+ rfbStatRecordEncodingSentAdd(cl, cl->tightEncoding,
+ 3 + paletteNumColors * entryLen);
break;
case 16:
@@ -829,7 +970,8 @@ SendIndexedRect(rfbClientPtr cl,
memcpy(&cl->updateBuf[cl->ublen], tightAfterBuf, paletteNumColors * 2);
cl->ublen += paletteNumColors * 2;
- rfbStatRecordEncodingSentAdd(cl, rfbEncodingTight, 3 + paletteNumColors * 2);
+ rfbStatRecordEncodingSentAdd(cl, cl->tightEncoding,
+ 3 + paletteNumColors * 2);
break;
default:
@@ -843,19 +985,31 @@ SendIndexedRect(rfbClientPtr cl,
static rfbBool
SendFullColorRect(rfbClientPtr cl,
+ int x,
+ int y,
int w,
int h)
{
int streamId = 0;
int len;
+#ifdef LIBVNCSERVER_HAVE_LIBPNG
+ if (CanSendPngRect(cl, w, h)) {
+ return SendPngRect(cl, x, y, w, h);
+ }
+#endif
+
if (cl->ublen + TIGHT_MIN_TO_COMPRESS + 1 > UPDATE_BUF_SIZE) {
if (!rfbSendUpdateBuf(cl))
return FALSE;
}
- cl->updateBuf[cl->ublen++] = 0x00; /* stream id = 0, no flushing, no filter */
- rfbStatRecordEncodingSentAdd(cl, rfbEncodingTight, 1);
+ if (tightConf[compressLevel].rawZlibLevel == 0 &&
+ cl->tightEncoding != rfbEncodingTightPng)
+ cl->updateBuf[cl->ublen++] = (char)(rfbTightNoZlib << 4);
+ else
+ cl->updateBuf[cl->ublen++] = 0x00; /* stream id = 0, no flushing, no filter */
+ rfbStatRecordEncodingSentAdd(cl, cl->tightEncoding, 1);
if (usePixelFormat24) {
Pack24(cl, tightBeforeBuf, &cl->format, w * h);
@@ -869,45 +1023,6 @@ SendFullColorRect(rfbClientPtr cl,
}
static rfbBool
-SendGradientRect(rfbClientPtr cl,
- int w,
- int h)
-{
- int streamId = 3;
- int len;
-
- if (cl->format.bitsPerPixel == 8)
- return SendFullColorRect(cl, w, h);
-
- if (cl->ublen + TIGHT_MIN_TO_COMPRESS + 2 > UPDATE_BUF_SIZE) {
- if (!rfbSendUpdateBuf(cl))
- return FALSE;
- }
-
- if (prevRowBuf == NULL)
- prevRowBuf = (int *)malloc(2048 * 3 * sizeof(int));
-
- cl->updateBuf[cl->ublen++] = (streamId | rfbTightExplicitFilter) << 4;
- cl->updateBuf[cl->ublen++] = rfbTightFilterGradient;
- rfbStatRecordEncodingSentAdd(cl, rfbEncodingTight, 2);
-
- if (usePixelFormat24) {
- FilterGradient24(cl, tightBeforeBuf, &cl->format, w, h);
- len = 3;
- } else if (cl->format.bitsPerPixel == 32) {
- FilterGradient32(cl, (uint32_t *)tightBeforeBuf, &cl->format, w, h);
- len = 4;
- } else {
- FilterGradient16(cl, (uint16_t *)tightBeforeBuf, &cl->format, w, h);
- len = 2;
- }
-
- return CompressData(cl, streamId, w * h * len,
- tightConf[compressLevel].gradientZlibLevel,
- Z_FILTERED);
-}
-
-static rfbBool
CompressData(rfbClientPtr cl,
int streamId,
int dataLen,
@@ -920,10 +1035,13 @@ CompressData(rfbClientPtr cl,
if (dataLen < TIGHT_MIN_TO_COMPRESS) {
memcpy(&cl->updateBuf[cl->ublen], tightBeforeBuf, dataLen);
cl->ublen += dataLen;
- rfbStatRecordEncodingSentAdd(cl, rfbEncodingTight, dataLen);
+ rfbStatRecordEncodingSentAdd(cl, cl->tightEncoding, dataLen);
return TRUE;
}
+ if (zlibLevel == 0)
+ return SendCompressedData (cl, tightBeforeBuf, dataLen);
+
pz = &cl->zsStruct[streamId];
/* Initialize compression stream if needed. */
@@ -956,29 +1074,30 @@ CompressData(rfbClientPtr cl,
}
/* Actual compression. */
- if ( deflate (pz, Z_SYNC_FLUSH) != Z_OK ||
- pz->avail_in != 0 || pz->avail_out == 0 ) {
+ if (deflate(pz, Z_SYNC_FLUSH) != Z_OK ||
+ pz->avail_in != 0 || pz->avail_out == 0) {
return FALSE;
}
- return SendCompressedData(cl, tightAfterBufSize - pz->avail_out);
+ return SendCompressedData(cl, tightAfterBuf,
+ tightAfterBufSize - pz->avail_out);
}
-static rfbBool SendCompressedData(rfbClientPtr cl,
+static rfbBool SendCompressedData(rfbClientPtr cl, char *buf,
int compressedLen)
{
int i, portionLen;
cl->updateBuf[cl->ublen++] = compressedLen & 0x7F;
- rfbStatRecordEncodingSentAdd(cl, rfbEncodingTight, 1);
+ rfbStatRecordEncodingSentAdd(cl, cl->tightEncoding, 1);
if (compressedLen > 0x7F) {
cl->updateBuf[cl->ublen-1] |= 0x80;
cl->updateBuf[cl->ublen++] = compressedLen >> 7 & 0x7F;
- rfbStatRecordEncodingSentAdd(cl, rfbEncodingTight, 1);
+ rfbStatRecordEncodingSentAdd(cl, cl->tightEncoding, 1);
if (compressedLen > 0x3FFF) {
cl->updateBuf[cl->ublen-1] |= 0x80;
cl->updateBuf[cl->ublen++] = compressedLen >> 14 & 0xFF;
- rfbStatRecordEncodingSentAdd(cl, rfbEncodingTight, 1);
+ rfbStatRecordEncodingSentAdd(cl, cl->tightEncoding, 1);
}
}
@@ -991,14 +1110,15 @@ static rfbBool SendCompressedData(rfbClientPtr cl,
if (!rfbSendUpdateBuf(cl))
return FALSE;
}
- memcpy(&cl->updateBuf[cl->ublen], &tightAfterBuf[i], portionLen);
+ memcpy(&cl->updateBuf[cl->ublen], &buf[i], portionLen);
cl->ublen += portionLen;
}
- rfbStatRecordEncodingSentAdd(cl, rfbEncodingTight, compressedLen);
+ rfbStatRecordEncodingSentAdd(cl, cl->tightEncoding, compressedLen);
return TRUE;
}
+
/*
* Code to determine how many different colors used in rectangle.
*/
@@ -1045,6 +1165,7 @@ FillPalette8(int count)
}
}
+
#define DEFINE_FILL_PALETTE_FUNCTION(bpp) \
\
static void \
@@ -1110,13 +1231,117 @@ FillPalette##bpp(int count) { \
DEFINE_FILL_PALETTE_FUNCTION(16)
DEFINE_FILL_PALETTE_FUNCTION(32)
+#define DEFINE_FAST_FILL_PALETTE_FUNCTION(bpp) \
+ \
+static void \
+FastFillPalette##bpp(rfbClientPtr cl, uint##bpp##_t *data, int w, \
+ int pitch, int h) \
+{ \
+ uint##bpp##_t c0, c1, ci, mask, c0t, c1t, cit; \
+ int i, j, i2 = 0, j2, n0, n1, ni; \
+ \
+ if (cl->translateFn != rfbTranslateNone) { \
+ mask = cl->screen->serverFormat.redMax \
+ << cl->screen->serverFormat.redShift; \
+ mask |= cl->screen->serverFormat.greenMax \
+ << cl->screen->serverFormat.greenShift; \
+ mask |= cl->screen->serverFormat.blueMax \
+ << cl->screen->serverFormat.blueShift; \
+ } else mask = ~0; \
+ \
+ c0 = data[0] & mask; \
+ for (j = 0; j < h; j++) { \
+ for (i = 0; i < w; i++) { \
+ if ((data[j * pitch + i] & mask) != c0) \
+ goto done; \
+ } \
+ } \
+ done: \
+ if (j >= h) { \
+ paletteNumColors = 1; /* Solid rectangle */ \
+ return; \
+ } \
+ if (paletteMaxColors < 2) { \
+ paletteNumColors = 0; /* Full-color encoding preferred */ \
+ return; \
+ } \
+ \
+ n0 = j * w + i; \
+ c1 = data[j * pitch + i] & mask; \
+ n1 = 0; \
+ i++; if (i >= w) {i = 0; j++;} \
+ for (j2 = j; j2 < h; j2++) { \
+ for (i2 = i; i2 < w; i2++) { \
+ ci = data[j2 * pitch + i2] & mask; \
+ if (ci == c0) { \
+ n0++; \
+ } else if (ci == c1) { \
+ n1++; \
+ } else \
+ goto done2; \
+ } \
+ i = 0; \
+ } \
+ done2: \
+ (*cl->translateFn)(cl->translateLookupTable, \
+ &cl->screen->serverFormat, &cl->format, \
+ (char *)&c0, (char *)&c0t, bpp/8, 1, 1); \
+ (*cl->translateFn)(cl->translateLookupTable, \
+ &cl->screen->serverFormat, &cl->format, \
+ (char *)&c1, (char *)&c1t, bpp/8, 1, 1); \
+ if (j2 >= h) { \
+ if (n0 > n1) { \
+ monoBackground = (uint32_t)c0t; \
+ monoForeground = (uint32_t)c1t; \
+ } else { \
+ monoBackground = (uint32_t)c1t; \
+ monoForeground = (uint32_t)c0t; \
+ } \
+ paletteNumColors = 2; /* Two colors */ \
+ return; \
+ } \
+ \
+ PaletteReset(); \
+ PaletteInsert (c0t, (uint32_t)n0, bpp); \
+ PaletteInsert (c1t, (uint32_t)n1, bpp); \
+ \
+ ni = 1; \
+ i2++; if (i2 >= w) {i2 = 0; j2++;} \
+ for (j = j2; j < h; j++) { \
+ for (i = i2; i < w; i++) { \
+ if ((data[j * pitch + i] & mask) == ci) { \
+ ni++; \
+ } else { \
+ (*cl->translateFn)(cl->translateLookupTable, \
+ &cl->screen->serverFormat, \
+ &cl->format, (char *)&ci, \
+ (char *)&cit, bpp/8, 1, 1); \
+ if (!PaletteInsert (cit, (uint32_t)ni, bpp)) \
+ return; \
+ ci = data[j * pitch + i] & mask; \
+ ni = 1; \
+ } \
+ } \
+ i2 = 0; \
+ } \
+ \
+ (*cl->translateFn)(cl->translateLookupTable, \
+ &cl->screen->serverFormat, &cl->format, \
+ (char *)&ci, (char *)&cit, bpp/8, 1, 1); \
+ PaletteInsert (cit, (uint32_t)ni, bpp); \
+}
+
+DEFINE_FAST_FILL_PALETTE_FUNCTION(16)
+DEFINE_FAST_FILL_PALETTE_FUNCTION(32)
+
/*
* Functions to operate with palette structures.
*/
-#define HASH_FUNC16(rgb) ((int)(((rgb >> 8) + rgb) & 0xFF))
-#define HASH_FUNC32(rgb) ((int)(((rgb >> 16) + (rgb >> 8)) & 0xFF))
+#define HASH_FUNC16(rgb) ((int)((((rgb) >> 8) + (rgb)) & 0xFF))
+#define HASH_FUNC32(rgb) ((int)((((rgb) >> 16) + ((rgb) >> 8)) & 0xFF))
+
static void
PaletteReset(void)
@@ -1125,6 +1350,7 @@ PaletteReset(void)
memset(palette.hash, 0, 256 * sizeof(COLOR_LIST *));
}
+
static int
PaletteInsert(uint32_t rgb,
int numPixels,
@@ -1265,6 +1491,7 @@ EncodeIndexedRect##bpp(uint8_t *buf, int count) { \
DEFINE_IDX_ENCODE_FUNCTION(16)
DEFINE_IDX_ENCODE_FUNCTION(32)
+
#define DEFINE_MONO_ENCODE_FUNCTION(bpp) \
\
static void \
@@ -1321,393 +1548,124 @@ DEFINE_MONO_ENCODE_FUNCTION(32)
/*
- * ``Gradient'' filter for 24-bit color samples.
- * Should be called only when redMax, greenMax and blueMax are 255.
- * Color components assumed to be byte-aligned.
+ * JPEG compression stuff.
*/
-static void
-FilterGradient24(rfbClientPtr cl, char *buf, rfbPixelFormat *fmt, int w, int h)
+static rfbBool
+SendJpegRect(rfbClientPtr cl, int x, int y, int w, int h, int quality)
{
- uint32_t *buf32;
- uint32_t pix32;
- int *prevRowPtr;
- int shiftBits[3];
- int pixHere[3], pixUpper[3], pixLeft[3], pixUpperLeft[3];
- int prediction;
- int x, y, c;
-
- buf32 = (uint32_t *)buf;
- memset (prevRowBuf, 0, w * 3 * sizeof(int));
-
- if (!cl->screen->serverFormat.bigEndian == !fmt->bigEndian) {
- shiftBits[0] = fmt->redShift;
- shiftBits[1] = fmt->greenShift;
- shiftBits[2] = fmt->blueShift;
- } else {
- shiftBits[0] = 24 - fmt->redShift;
- shiftBits[1] = 24 - fmt->greenShift;
- shiftBits[2] = 24 - fmt->blueShift;
- }
+ unsigned char *srcbuf;
+ int ps = cl->screen->serverFormat.bitsPerPixel / 8;
+ int subsamp = subsampLevel2tjsubsamp[subsampLevel];
+ unsigned long size = 0;
+ int flags = 0, pitch;
+ unsigned char *tmpbuf = NULL;
- for (y = 0; y < h; y++) {
- for (c = 0; c < 3; c++) {
- pixUpper[c] = 0;
- pixHere[c] = 0;
- }
- prevRowPtr = prevRowBuf;
- for (x = 0; x < w; x++) {
- pix32 = *buf32++;
- for (c = 0; c < 3; c++) {
- pixUpperLeft[c] = pixUpper[c];
- pixLeft[c] = pixHere[c];
- pixUpper[c] = *prevRowPtr;
- pixHere[c] = (int)(pix32 >> shiftBits[c] & 0xFF);
- *prevRowPtr++ = pixHere[c];
-
- prediction = pixLeft[c] + pixUpper[c] - pixUpperLeft[c];
- if (prediction < 0) {
- prediction = 0;
- } else if (prediction > 0xFF) {
- prediction = 0xFF;
- }
- *buf++ = (char)(pixHere[c] - prediction);
- }
- }
- }
-}
-
-
-/*
- * ``Gradient'' filter for other color depths.
- */
-
-#define DEFINE_GRADIENT_FILTER_FUNCTION(bpp) \
- \
-static void \
-FilterGradient##bpp(rfbClientPtr cl, uint##bpp##_t *buf, \
- rfbPixelFormat *fmt, int w, int h) { \
- uint##bpp##_t pix, diff; \
- rfbBool endianMismatch; \
- int *prevRowPtr; \
- int maxColor[3], shiftBits[3]; \
- int pixHere[3], pixUpper[3], pixLeft[3], pixUpperLeft[3]; \
- int prediction; \
- int x, y, c; \
- \
- memset (prevRowBuf, 0, w * 3 * sizeof(int)); \
- \
- endianMismatch = (!cl->screen->serverFormat.bigEndian != !fmt->bigEndian); \
- \
- maxColor[0] = fmt->redMax; \
- maxColor[1] = fmt->greenMax; \
- maxColor[2] = fmt->blueMax; \
- shiftBits[0] = fmt->redShift; \
- shiftBits[1] = fmt->greenShift; \
- shiftBits[2] = fmt->blueShift; \
- \
- for (y = 0; y < h; y++) { \
- for (c = 0; c < 3; c++) { \
- pixUpper[c] = 0; \
- pixHere[c] = 0; \
- } \
- prevRowPtr = prevRowBuf; \
- for (x = 0; x < w; x++) { \
- pix = *buf; \
- if (endianMismatch) { \
- pix = Swap##bpp(pix); \
- } \
- diff = 0; \
- for (c = 0; c < 3; c++) { \
- pixUpperLeft[c] = pixUpper[c]; \
- pixLeft[c] = pixHere[c]; \
- pixUpper[c] = *prevRowPtr; \
- pixHere[c] = (int)(pix >> shiftBits[c] & maxColor[c]); \
- *prevRowPtr++ = pixHere[c]; \
- \
- prediction = pixLeft[c] + pixUpper[c] - pixUpperLeft[c]; \
- if (prediction < 0) { \
- prediction = 0; \
- } else if (prediction > maxColor[c]) { \
- prediction = maxColor[c]; \
- } \
- diff |= ((pixHere[c] - prediction) & maxColor[c]) \
- << shiftBits[c]; \
- } \
- if (endianMismatch) { \
- diff = Swap##bpp(diff); \
- } \
- *buf++ = diff; \
- } \
- } \
-}
-
-DEFINE_GRADIENT_FILTER_FUNCTION(16)
-DEFINE_GRADIENT_FILTER_FUNCTION(32)
-
-
-/*
- * Code to guess if given rectangle is suitable for smooth image
- * compression (by applying "gradient" filter or JPEG coder).
- */
-
-#define JPEG_MIN_RECT_SIZE 4096
-
-#define DETECT_SUBROW_WIDTH 7
-#define DETECT_MIN_WIDTH 8
-#define DETECT_MIN_HEIGHT 8
-
-static int
-DetectSmoothImage (rfbClientPtr cl, rfbPixelFormat *fmt, int w, int h)
-{
- long avgError;
+ if (cl->screen->serverFormat.bitsPerPixel == 8)
+ return SendFullColorRect(cl, x, y, w, h);
- if ( cl->screen->serverFormat.bitsPerPixel == 8 || fmt->bitsPerPixel == 8 ||
- w < DETECT_MIN_WIDTH || h < DETECT_MIN_HEIGHT ) {
+ if (ps < 2) {
+ rfbLog("Error: JPEG requires 16-bit, 24-bit, or 32-bit pixel format.\n");
return 0;
}
-
- if (qualityLevel != -1) {
- if (w * h < JPEG_MIN_RECT_SIZE) {
+ if (!j) {
+ if ((j = tjInitCompress()) == NULL) {
+ rfbLog("JPEG Error: %s\n", tjGetErrorStr());
return 0;
}
- } else {
- if ( rfbTightDisableGradient ||
- w * h < tightConf[compressLevel].gradientMinRectSize ) {
+ }
+
+ if (tightAfterBufSize < TJBUFSIZE(w, h)) {
+ if (tightAfterBuf == NULL)
+ tightAfterBuf = (char *)malloc(TJBUFSIZE(w, h));
+ else
+ tightAfterBuf = (char *)realloc(tightAfterBuf,
+ TJBUFSIZE(w, h));
+ if (!tightAfterBuf) {
+ rfbLog("Memory allocation failure!\n");
return 0;
}
+ tightAfterBufSize = TJBUFSIZE(w, h);
}
- if (fmt->bitsPerPixel == 32) {
- if (usePixelFormat24) {
- avgError = DetectSmoothImage24(cl, fmt, w, h);
- if (qualityLevel != -1) {
- return (avgError < tightConf[qualityLevel].jpegThreshold24);
+ if (ps == 2) {
+ uint16_t *srcptr, pix;
+ unsigned char *dst;
+ int inRed, inGreen, inBlue, i, j;
+
+ if((tmpbuf = (unsigned char *)malloc(w * h * 3)) == NULL)
+ rfbLog("Memory allocation failure!\n");
+ srcptr = (uint16_t *)&cl->scaledScreen->frameBuffer
+ [y * cl->scaledScreen->paddedWidthInBytes + x * ps];
+ dst = tmpbuf;
+ for(j = 0; j < h; j++) {
+ uint16_t *srcptr2 = srcptr;
+ unsigned char *dst2 = dst;
+ for (i = 0; i < w; i++) {
+ pix = *srcptr2++;
+ inRed = (int) (pix >> cl->screen->serverFormat.redShift
+ & cl->screen->serverFormat.redMax);
+ inGreen = (int) (pix >> cl->screen->serverFormat.greenShift
+ & cl->screen->serverFormat.greenMax);
+ inBlue = (int) (pix >> cl->screen->serverFormat.blueShift
+ & cl->screen->serverFormat.blueMax);
+ *dst2++ = (uint8_t)((inRed * 255
+ + cl->screen->serverFormat.redMax / 2)
+ / cl->screen->serverFormat.redMax);
+ *dst2++ = (uint8_t)((inGreen * 255
+ + cl->screen->serverFormat.greenMax / 2)
+ / cl->screen->serverFormat.greenMax);
+ *dst2++ = (uint8_t)((inBlue * 255
+ + cl->screen->serverFormat.blueMax / 2)
+ / cl->screen->serverFormat.blueMax);
}
- return (avgError < tightConf[compressLevel].gradientThreshold24);
- } else {
- avgError = DetectSmoothImage32(cl, fmt, w, h);
+ srcptr += cl->scaledScreen->paddedWidthInBytes / ps;
+ dst += w * 3;
}
+ srcbuf = tmpbuf;
+ pitch = w * 3;
+ ps = 3;
} else {
- avgError = DetectSmoothImage16(cl, fmt, w, h);
- }
- if (qualityLevel != -1) {
- return (avgError < tightConf[qualityLevel].jpegThreshold);
+ if (cl->screen->serverFormat.bigEndian && ps == 4)
+ flags |= TJ_ALPHAFIRST;
+ if (cl->screen->serverFormat.redShift == 16
+ && cl->screen->serverFormat.blueShift == 0)
+ flags |= TJ_BGR;
+ if (cl->screen->serverFormat.bigEndian)
+ flags ^= TJ_BGR;
+ pitch = cl->scaledScreen->paddedWidthInBytes;
+ srcbuf = (unsigned char *)&cl->scaledScreen->frameBuffer
+ [y * pitch + x * ps];
}
- return (avgError < tightConf[compressLevel].gradientThreshold);
-}
-static unsigned long
-DetectSmoothImage24 (rfbClientPtr cl,
- rfbPixelFormat *fmt,
- int w,
- int h)
-{
- int off;
- int x, y, d, dx, c;
- int diffStat[256];
- int pixelCount = 0;
- int pix, left[3];
- unsigned long avgError;
-
- /* If client is big-endian, color samples begin from the second
- byte (offset 1) of a 32-bit pixel value. */
- off = (fmt->bigEndian != 0);
-
- memset(diffStat, 0, 256*sizeof(int));
-
- y = 0, x = 0;
- while (y < h && x < w) {
- for (d = 0; d < h - y && d < w - x - DETECT_SUBROW_WIDTH; d++) {
- for (c = 0; c < 3; c++) {
- left[c] = (int)tightBeforeBuf[((y+d)*w+x+d)*4+off+c] & 0xFF;
- }
- for (dx = 1; dx <= DETECT_SUBROW_WIDTH; dx++) {
- for (c = 0; c < 3; c++) {
- pix = (int)tightBeforeBuf[((y+d)*w+x+d+dx)*4+off+c] & 0xFF;
- diffStat[abs(pix - left[c])]++;
- left[c] = pix;
- }
- pixelCount++;
- }
+ if (tjCompress(j, srcbuf, w, pitch, h, ps, (unsigned char *)tightAfterBuf,
+ &size, subsamp, quality, flags) == -1) {
+ rfbLog("JPEG Error: %s\n", tjGetErrorStr());
+ if (tmpbuf) {
+ free(tmpbuf);
+ tmpbuf = NULL;
}
- if (w > h) {
- x += h;
- y = 0;
- } else {
- x = 0;
- y += w;
- }
- }
-
- if (diffStat[0] * 33 / pixelCount >= 95)
return 0;
-
- avgError = 0;
- for (c = 1; c < 8; c++) {
- avgError += (unsigned long)diffStat[c] * (unsigned long)(c * c);
- if (diffStat[c] == 0 || diffStat[c] > diffStat[c-1] * 2)
- return 0;
- }
- for (; c < 256; c++) {
- avgError += (unsigned long)diffStat[c] * (unsigned long)(c * c);
- }
- avgError /= (pixelCount * 3 - diffStat[0]);
-
- return avgError;
-}
-
-#define DEFINE_DETECT_FUNCTION(bpp) \
- \
-static unsigned long \
-DetectSmoothImage##bpp (rfbClientPtr cl, rfbPixelFormat *fmt, int w, int h) {\
- rfbBool endianMismatch; \
- uint##bpp##_t pix; \
- int maxColor[3], shiftBits[3]; \
- int x, y, d, dx, c; \
- int diffStat[256]; \
- int pixelCount = 0; \
- int sample, sum, left[3]; \
- unsigned long avgError; \
- \
- endianMismatch = (!cl->screen->serverFormat.bigEndian != !fmt->bigEndian); \
- \
- maxColor[0] = fmt->redMax; \
- maxColor[1] = fmt->greenMax; \
- maxColor[2] = fmt->blueMax; \
- shiftBits[0] = fmt->redShift; \
- shiftBits[1] = fmt->greenShift; \
- shiftBits[2] = fmt->blueShift; \
- \
- memset(diffStat, 0, 256*sizeof(int)); \
- \
- y = 0, x = 0; \
- while (y < h && x < w) { \
- for (d = 0; d < h - y && d < w - x - DETECT_SUBROW_WIDTH; d++) { \
- pix = ((uint##bpp##_t *)tightBeforeBuf)[(y+d)*w+x+d]; \
- if (endianMismatch) { \
- pix = Swap##bpp(pix); \
- } \
- for (c = 0; c < 3; c++) { \
- left[c] = (int)(pix >> shiftBits[c] & maxColor[c]); \
- } \
- for (dx = 1; dx <= DETECT_SUBROW_WIDTH; dx++) { \
- pix = ((uint##bpp##_t *)tightBeforeBuf)[(y+d)*w+x+d+dx]; \
- if (endianMismatch) { \
- pix = Swap##bpp(pix); \
- } \
- sum = 0; \
- for (c = 0; c < 3; c++) { \
- sample = (int)(pix >> shiftBits[c] & maxColor[c]); \
- sum += abs(sample - left[c]); \
- left[c] = sample; \
- } \
- if (sum > 255) \
- sum = 255; \
- diffStat[sum]++; \
- pixelCount++; \
- } \
- } \
- if (w > h) { \
- x += h; \
- y = 0; \
- } else { \
- x = 0; \
- y += w; \
- } \
- } \
- \
- if ((diffStat[0] + diffStat[1]) * 100 / pixelCount >= 90) \
- return 0; \
- \
- avgError = 0; \
- for (c = 1; c < 8; c++) { \
- avgError += (unsigned long)diffStat[c] * (unsigned long)(c * c); \
- if (diffStat[c] == 0 || diffStat[c] > diffStat[c-1] * 2) \
- return 0; \
- } \
- for (; c < 256; c++) { \
- avgError += (unsigned long)diffStat[c] * (unsigned long)(c * c); \
- } \
- avgError /= (pixelCount - diffStat[0]); \
- \
- return avgError; \
-}
-
-DEFINE_DETECT_FUNCTION(16)
-DEFINE_DETECT_FUNCTION(32)
-
-
-/*
- * JPEG compression stuff.
- */
-
-static TLS struct jpeg_destination_mgr jpegDstManager;
-static TLS rfbBool jpegError = FALSE;
-static TLS int jpegDstDataLen = 0;
-
-static rfbBool
-SendJpegRect(rfbClientPtr cl, int x, int y, int w, int h, int quality)
-{
- struct jpeg_compress_struct cinfo;
- struct jpeg_error_mgr jerr;
- uint8_t *srcBuf;
- JSAMPROW rowPointer[1];
- int dy;
-
- if (cl->screen->serverFormat.bitsPerPixel == 8)
- return SendFullColorRect(cl, w, h);
-
- srcBuf = (uint8_t *)malloc(w * 3);
- if (srcBuf == NULL) {
- return SendFullColorRect(cl, w, h);
}
- rowPointer[0] = srcBuf;
- cinfo.err = jpeg_std_error(&jerr);
- jpeg_create_compress(&cinfo);
-
- cinfo.image_width = w;
- cinfo.image_height = h;
- cinfo.input_components = 3;
- cinfo.in_color_space = JCS_RGB;
-
- jpeg_set_defaults(&cinfo);
- jpeg_set_quality(&cinfo, quality, TRUE);
-
- JpegSetDstManager (&cinfo);
-
- jpeg_start_compress(&cinfo, TRUE);
-
- for (dy = 0; dy < h; dy++) {
- PrepareRowForJpeg(cl, srcBuf, x, y + dy, w);
- jpeg_write_scanlines(&cinfo, rowPointer, 1);
- if (jpegError)
- break;
+ if (tmpbuf) {
+ free(tmpbuf);
+ tmpbuf = NULL;
}
- if (!jpegError)
- jpeg_finish_compress(&cinfo);
-
- jpeg_destroy_compress(&cinfo);
- free(srcBuf);
-
- if (jpegError)
- return SendFullColorRect(cl, w, h);
-
if (cl->ublen + TIGHT_MIN_TO_COMPRESS + 1 > UPDATE_BUF_SIZE) {
if (!rfbSendUpdateBuf(cl))
return FALSE;
}
cl->updateBuf[cl->ublen++] = (char)(rfbTightJpeg << 4);
- rfbStatRecordEncodingSentAdd(cl, rfbEncodingTight, 1);
+ rfbStatRecordEncodingSentAdd(cl, cl->tightEncoding, 1);
- return SendCompressedData(cl, jpegDstDataLen);
+ return SendCompressedData(cl, tightAfterBuf, (int)size);
}
static void
-PrepareRowForJpeg(rfbClientPtr cl,
+PrepareRowForImg(rfbClientPtr cl,
uint8_t *dst,
int x,
int y,
@@ -1717,18 +1675,18 @@ PrepareRowForJpeg(rfbClientPtr cl,
if ( cl->screen->serverFormat.redMax == 0xFF &&
cl->screen->serverFormat.greenMax == 0xFF &&
cl->screen->serverFormat.blueMax == 0xFF ) {
- PrepareRowForJpeg24(cl, dst, x, y, count);
+ PrepareRowForImg24(cl, dst, x, y, count);
} else {
- PrepareRowForJpeg32(cl, dst, x, y, count);
+ PrepareRowForImg32(cl, dst, x, y, count);
}
} else {
/* 16 bpp assumed. */
- PrepareRowForJpeg16(cl, dst, x, y, count);
+ PrepareRowForImg16(cl, dst, x, y, count);
}
}
static void
-PrepareRowForJpeg24(rfbClientPtr cl,
+PrepareRowForImg24(rfbClientPtr cl,
uint8_t *dst,
int x,
int y,
@@ -1751,7 +1709,7 @@ PrepareRowForJpeg24(rfbClientPtr cl,
#define DEFINE_JPEG_GET_ROW_FUNCTION(bpp) \
\
static void \
-PrepareRowForJpeg##bpp(rfbClientPtr cl, uint8_t *dst, int x, int y, int count) { \
+PrepareRowForImg##bpp(rfbClientPtr cl, uint8_t *dst, int x, int y, int count) { \
uint##bpp##_t *fbptr; \
uint##bpp##_t pix; \
int inRed, inGreen, inBlue; \
@@ -1783,39 +1741,160 @@ DEFINE_JPEG_GET_ROW_FUNCTION(16)
DEFINE_JPEG_GET_ROW_FUNCTION(32)
/*
- * Destination manager implementation for JPEG library.
+ * PNG compression stuff.
*/
-static void
-JpegInitDestination(j_compress_ptr cinfo)
-{
- jpegError = FALSE;
- jpegDstManager.next_output_byte = (JOCTET *)tightAfterBuf;
- jpegDstManager.free_in_buffer = (size_t)tightAfterBufSize;
+#ifdef LIBVNCSERVER_HAVE_LIBPNG
+
+static TLS int pngDstDataLen = 0;
+
+static rfbBool CanSendPngRect(rfbClientPtr cl, int w, int h) {
+ if (cl->tightEncoding != rfbEncodingTightPng) {
+ return FALSE;
+ }
+
+ if ( cl->screen->serverFormat.bitsPerPixel == 8 ||
+ cl->format.bitsPerPixel == 8) {
+ return FALSE;
+ }
+
+ return TRUE;
}
-static boolean
-JpegEmptyOutputBuffer(j_compress_ptr cinfo)
+static void pngWriteData(png_structp png_ptr, png_bytep data,
+ png_size_t length)
{
- jpegError = TRUE;
- jpegDstManager.next_output_byte = (JOCTET *)tightAfterBuf;
- jpegDstManager.free_in_buffer = (size_t)tightAfterBufSize;
+#if 0
+ rfbClientPtr cl = png_get_io_ptr(png_ptr);
- return TRUE;
+ buffer_reserve(&vs->tight.png, vs->tight.png.offset + length);
+ memcpy(vs->tight.png.buffer + vs->tight.png.offset, data, length);
+#endif
+ memcpy(tightAfterBuf + pngDstDataLen, data, length);
+
+ pngDstDataLen += length;
}
-static void
-JpegTermDestination(j_compress_ptr cinfo)
+static void pngFlushData(png_structp png_ptr)
{
- jpegDstDataLen = tightAfterBufSize - jpegDstManager.free_in_buffer;
}
-static void
-JpegSetDstManager(j_compress_ptr cinfo)
+
+static void *pngMalloc(png_structp png_ptr, png_size_t size)
+{
+ return malloc(size);
+}
+
+static void pngFree(png_structp png_ptr, png_voidp ptr)
{
- jpegDstManager.init_destination = JpegInitDestination;
- jpegDstManager.empty_output_buffer = JpegEmptyOutputBuffer;
- jpegDstManager.term_destination = JpegTermDestination;
- cinfo->dest = &jpegDstManager;
+ free(ptr);
}
+static rfbBool SendPngRect(rfbClientPtr cl, int x, int y, int w, int h) {
+ /* rfbLog(">> SendPngRect x:%d, y:%d, w:%d, h:%d\n", x, y, w, h); */
+
+ png_byte color_type;
+ png_structp png_ptr;
+ png_infop info_ptr;
+ png_colorp png_palette = NULL;
+ int level = tightPngConf[cl->tightCompressLevel].png_zlib_level;
+ int filters = tightPngConf[cl->tightCompressLevel].png_filters;
+ uint8_t *buf;
+ int dy;
+
+ pngDstDataLen = 0;
+
+ png_ptr = png_create_write_struct_2(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL,
+ NULL, pngMalloc, pngFree);
+
+ if (png_ptr == NULL)
+ return FALSE;
+
+ info_ptr = png_create_info_struct(png_ptr);
+
+ if (info_ptr == NULL) {
+ png_destroy_write_struct(&png_ptr, NULL);
+ return FALSE;
+ }
+
+ png_set_write_fn(png_ptr, (void *) cl, pngWriteData, pngFlushData);
+ png_set_compression_level(png_ptr, level);
+ png_set_filter(png_ptr, PNG_FILTER_TYPE_DEFAULT, filters);
+
+#if 0
+ /* TODO: */
+ if (palette) {
+ color_type = PNG_COLOR_TYPE_PALETTE;
+ } else {
+ color_type = PNG_COLOR_TYPE_RGB;
+ }
+#else
+ color_type = PNG_COLOR_TYPE_RGB;
+#endif
+ png_set_IHDR(png_ptr, info_ptr, w, h,
+ 8, color_type, PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
+
+#if 0
+ if (color_type == PNG_COLOR_TYPE_PALETTE) {
+ struct palette_cb_priv priv;
+
+ png_palette = pngMalloc(png_ptr, sizeof(*png_palette) *
+ palette_size(palette));
+
+ priv.vs = vs;
+ priv.png_palette = png_palette;
+ palette_iter(palette, write_png_palette, &priv);
+
+ png_set_PLTE(png_ptr, info_ptr, png_palette, palette_size(palette));
+
+ offset = vs->tight.tight.offset;
+ if (vs->clientds.pf.bytes_per_pixel == 4) {
+ tight_encode_indexed_rect32(vs->tight.tight.buffer, w * h, palette);
+ } else {
+ tight_encode_indexed_rect16(vs->tight.tight.buffer, w * h, palette);
+ }
+ }
+
+ buffer_reserve(&vs->tight.png, 2048);
+#endif
+
+ png_write_info(png_ptr, info_ptr);
+ buf = malloc(w * 3);
+ for (dy = 0; dy < h; dy++)
+ {
+#if 0
+ if (color_type == PNG_COLOR_TYPE_PALETTE) {
+ memcpy(buf, vs->tight.tight.buffer + (dy * w), w);
+ } else {
+ PrepareRowForImg(cl, buf, x, y + dy, w);
+ }
+#else
+ PrepareRowForImg(cl, buf, x, y + dy, w);
+#endif
+ png_write_row(png_ptr, buf);
+ }
+ free(buf);
+
+ png_write_end(png_ptr, NULL);
+
+ if (color_type == PNG_COLOR_TYPE_PALETTE) {
+ pngFree(png_ptr, png_palette);
+ }
+
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+
+ /* done v */
+
+ if (cl->ublen + TIGHT_MIN_TO_COMPRESS + 1 > UPDATE_BUF_SIZE) {
+ if (!rfbSendUpdateBuf(cl))
+ return FALSE;
+ }
+
+ cl->updateBuf[cl->ublen++] = (char)(rfbTightPng << 4);
+ rfbStatRecordEncodingSentAdd(cl, cl->tightEncoding, 1);
+
+ /* rfbLog("<< SendPngRect\n"); */
+ return SendCompressedData(cl, tightAfterBuf, pngDstDataLen);
+}
+#endif
diff --git a/ica/x11/libvncserver/websockets.c b/ica/x11/libvncserver/websockets.c
new file mode 100644
index 0000000..10743fe
--- /dev/null
+++ b/ica/x11/libvncserver/websockets.c
@@ -0,0 +1,903 @@
+/*
+ * websockets.c - deal with WebSockets clients.
+ *
+ * This code should be independent of any changes in the RFB protocol. It is
+ * an additional handshake and framing of normal sockets:
+ * http://www.whatwg.org/specs/web-socket-protocol/
+ *
+ */
+
+/*
+ * Copyright (C) 2010 Joel Martin
+ *
+ * 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.
+ */
+
+#ifdef __STRICT_ANSI__
+#define _BSD_SOURCE
+#endif
+
+#include <rfb/rfb.h>
+#include <resolv.h> /* __b64_ntop */
+/* errno */
+#include <errno.h>
+
+#ifdef LIBVNCSERVER_HAVE_ENDIAN_H
+#include <endian.h>
+#elif LIBVNCSERVER_HAVE_SYS_ENDIAN_H
+#include <sys/endian.h>
+#endif
+
+#ifdef LIBVNCSERVER_HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#include <string.h>
+#include <unistd.h>
+#include "rfb/rfbconfig.h"
+#include "rfbssl.h"
+#include "rfbcrypto.h"
+
+#define WS_NTOH64(n) htobe64(n)
+#define WS_NTOH32(n) htobe32(n)
+#define WS_NTOH16(n) htobe16(n)
+#define WS_HTON64(n) htobe64(n)
+#define WS_HTON16(n) htobe16(n)
+
+#define B64LEN(__x) (((__x + 2) / 3) * 12 / 3)
+#define WSHLENMAX 14 /* 2 + sizeof(uint64_t) + sizeof(uint32_t) */
+
+enum {
+ WEBSOCKETS_VERSION_HIXIE,
+ WEBSOCKETS_VERSION_HYBI
+};
+
+#if 0
+#include <sys/syscall.h>
+static int gettid() {
+ return (int)syscall(SYS_gettid);
+}
+#endif
+
+typedef int (*wsEncodeFunc)(rfbClientPtr cl, const char *src, int len, char **dst);
+typedef int (*wsDecodeFunc)(rfbClientPtr cl, char *dst, int len);
+
+typedef struct ws_ctx_s {
+ char codeBuf[B64LEN(UPDATE_BUF_SIZE) + WSHLENMAX]; /* base64 + maximum frame header length */
+ char readbuf[8192];
+ int readbufstart;
+ int readbuflen;
+ int dblen;
+ char carryBuf[3]; /* For base64 carry-over */
+ int carrylen;
+ int version;
+ int base64;
+ wsEncodeFunc encode;
+ wsDecodeFunc decode;
+} ws_ctx_t;
+
+typedef union ws_mask_s {
+ char c[4];
+ uint32_t u;
+} ws_mask_t;
+
+/* XXX: The union and the structs do not need to be named.
+ * We are working around a bug present in GCC < 4.6 which prevented
+ * it from recognizing anonymous structs and unions.
+ * See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=4784
+ */
+typedef struct __attribute__ ((__packed__)) ws_header_s {
+ unsigned char b0;
+ unsigned char b1;
+ union {
+ struct __attribute__ ((__packed__)) {
+ uint16_t l16;
+ ws_mask_t m16;
+ } s16;
+ struct __attribute__ ((__packed__)) {
+ uint64_t l64;
+ ws_mask_t m64;
+ } s64;
+ ws_mask_t m;
+ } u;
+} ws_header_t;
+
+enum
+{
+ WS_OPCODE_CONTINUATION = 0x0,
+ WS_OPCODE_TEXT_FRAME,
+ WS_OPCODE_BINARY_FRAME,
+ WS_OPCODE_CLOSE = 0x8,
+ WS_OPCODE_PING,
+ WS_OPCODE_PONG
+};
+
+#define FLASH_POLICY_RESPONSE "<cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\n"
+#define SZ_FLASH_POLICY_RESPONSE 93
+
+/*
+ * draft-ietf-hybi-thewebsocketprotocol-10
+ * 5.2.2. Sending the Server's Opening Handshake
+ */
+#define GUID "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
+
+#define SERVER_HANDSHAKE_HIXIE "HTTP/1.1 101 Web Socket Protocol Handshake\r\n\
+Upgrade: WebSocket\r\n\
+Connection: Upgrade\r\n\
+%sWebSocket-Origin: %s\r\n\
+%sWebSocket-Location: %s://%s%s\r\n\
+%sWebSocket-Protocol: %s\r\n\
+\r\n%s"
+
+#define SERVER_HANDSHAKE_HYBI "HTTP/1.1 101 Switching Protocols\r\n\
+Upgrade: websocket\r\n\
+Connection: Upgrade\r\n\
+Sec-WebSocket-Accept: %s\r\n\
+Sec-WebSocket-Protocol: %s\r\n\
+\r\n"
+
+
+#define WEBSOCKETS_CLIENT_CONNECT_WAIT_MS 100
+#define WEBSOCKETS_CLIENT_SEND_WAIT_MS 100
+#define WEBSOCKETS_MAX_HANDSHAKE_LEN 4096
+
+#if defined(__linux__) && defined(NEED_TIMEVAL)
+struct timeval
+{
+ long int tv_sec,tv_usec;
+}
+;
+#endif
+
+static rfbBool webSocketsHandshake(rfbClientPtr cl, char *scheme);
+void webSocketsGenMd5(char * target, char *key1, char *key2, char *key3);
+
+static int webSocketsEncodeHybi(rfbClientPtr cl, const char *src, int len, char **dst);
+static int webSocketsEncodeHixie(rfbClientPtr cl, const char *src, int len, char **dst);
+static int webSocketsDecodeHybi(rfbClientPtr cl, char *dst, int len);
+static int webSocketsDecodeHixie(rfbClientPtr cl, char *dst, int len);
+
+static int
+min (int a, int b) {
+ return a < b ? a : b;
+}
+
+static void webSocketsGenSha1Key(char *target, int size, char *key)
+{
+ struct iovec iov[2];
+ unsigned char hash[20];
+
+ iov[0].iov_base = key;
+ iov[0].iov_len = strlen(key);
+ iov[1].iov_base = GUID;
+ iov[1].iov_len = sizeof(GUID) - 1;
+ digestsha1(iov, 2, hash);
+ if (-1 == __b64_ntop(hash, sizeof(hash), target, size))
+ rfbErr("b64_ntop failed\n");
+}
+
+/*
+ * rfbWebSocketsHandshake is called to handle new WebSockets connections
+ */
+
+rfbBool
+webSocketsCheck (rfbClientPtr cl)
+{
+ char bbuf[4], *scheme;
+ int ret;
+
+ ret = rfbPeekExactTimeout(cl, bbuf, 4,
+ WEBSOCKETS_CLIENT_CONNECT_WAIT_MS);
+ if ((ret < 0) && (errno == ETIMEDOUT)) {
+ rfbLog("Normal socket connection\n");
+ return TRUE;
+ } else if (ret <= 0) {
+ rfbErr("webSocketsHandshake: unknown connection error\n");
+ return FALSE;
+ }
+
+ if (strncmp(bbuf, "<", 1) == 0) {
+ rfbLog("Got Flash policy request, sending response\n");
+ if (rfbWriteExact(cl, FLASH_POLICY_RESPONSE,
+ SZ_FLASH_POLICY_RESPONSE) < 0) {
+ rfbErr("webSocketsHandshake: failed sending Flash policy response");
+ }
+ return FALSE;
+ } else if (strncmp(bbuf, "\x16", 1) == 0 || strncmp(bbuf, "\x80", 1) == 0) {
+ rfbLog("Got TLS/SSL WebSockets connection\n");
+ if (-1 == rfbssl_init(cl)) {
+ rfbErr("webSocketsHandshake: rfbssl_init failed\n");
+ return FALSE;
+ }
+ ret = rfbPeekExactTimeout(cl, bbuf, 4, WEBSOCKETS_CLIENT_CONNECT_WAIT_MS);
+ scheme = "wss";
+ } else {
+ scheme = "ws";
+ }
+
+ if (strncmp(bbuf, "GET ", 4) != 0) {
+ rfbErr("webSocketsHandshake: invalid client header\n");
+ return FALSE;
+ }
+
+ rfbLog("Got '%s' WebSockets handshake\n", scheme);
+
+ if (!webSocketsHandshake(cl, scheme)) {
+ return FALSE;
+ }
+ /* Start WebSockets framing */
+ return TRUE;
+}
+
+static rfbBool
+webSocketsHandshake(rfbClientPtr cl, char *scheme)
+{
+ char *buf, *response, *line;
+ int n, linestart = 0, len = 0, llen, base64 = TRUE;
+ char prefix[5], trailer[17];
+ char *path = NULL, *host = NULL, *origin = NULL, *protocol = NULL;
+ char *key1 = NULL, *key2 = NULL, *key3 = NULL;
+ char *sec_ws_origin = NULL;
+ char *sec_ws_key = NULL;
+ char sec_ws_version = 0;
+ ws_ctx_t *wsctx = NULL;
+
+ buf = (char *) malloc(WEBSOCKETS_MAX_HANDSHAKE_LEN);
+ if (!buf) {
+ rfbLogPerror("webSocketsHandshake: malloc");
+ return FALSE;
+ }
+ response = (char *) malloc(WEBSOCKETS_MAX_HANDSHAKE_LEN);
+ if (!response) {
+ free(buf);
+ rfbLogPerror("webSocketsHandshake: malloc");
+ return FALSE;
+ }
+
+ while (len < WEBSOCKETS_MAX_HANDSHAKE_LEN-1) {
+ if ((n = rfbReadExactTimeout(cl, buf+len, 1,
+ WEBSOCKETS_CLIENT_SEND_WAIT_MS)) <= 0) {
+ if ((n < 0) && (errno == ETIMEDOUT)) {
+ break;
+ }
+ if (n == 0)
+ rfbLog("webSocketsHandshake: client gone\n");
+ else
+ rfbLogPerror("webSocketsHandshake: read");
+ free(response);
+ free(buf);
+ return FALSE;
+ }
+
+ len += 1;
+ llen = len - linestart;
+ if (((llen >= 2)) && (buf[len-1] == '\n')) {
+ line = buf+linestart;
+ if ((llen == 2) && (strncmp("\r\n", line, 2) == 0)) {
+ if (key1 && key2) {
+ if ((n = rfbReadExact(cl, buf+len, 8)) <= 0) {
+ if ((n < 0) && (errno == ETIMEDOUT)) {
+ break;
+ }
+ if (n == 0)
+ rfbLog("webSocketsHandshake: client gone\n");
+ else
+ rfbLogPerror("webSocketsHandshake: read");
+ free(response);
+ free(buf);
+ return FALSE;
+ }
+ rfbLog("Got key3\n");
+ key3 = buf+len;
+ len += 8;
+ } else {
+ buf[len] = '\0';
+ }
+ break;
+ } else if ((llen >= 16) && ((strncmp("GET ", line, min(llen,4))) == 0)) {
+ /* 16 = 4 ("GET ") + 1 ("/.*") + 11 (" HTTP/1.1\r\n") */
+ path = line+4;
+ buf[len-11] = '\0'; /* Trim trailing " HTTP/1.1\r\n" */
+ cl->wspath = strdup(path);
+ /* rfbLog("Got path: %s\n", path); */
+ } else if ((strncasecmp("host: ", line, min(llen,6))) == 0) {
+ host = line+6;
+ buf[len-2] = '\0';
+ /* rfbLog("Got host: %s\n", host); */
+ } else if ((strncasecmp("origin: ", line, min(llen,8))) == 0) {
+ origin = line+8;
+ buf[len-2] = '\0';
+ /* rfbLog("Got origin: %s\n", origin); */
+ } else if ((strncasecmp("sec-websocket-key1: ", line, min(llen,20))) == 0) {
+ key1 = line+20;
+ buf[len-2] = '\0';
+ /* rfbLog("Got key1: %s\n", key1); */
+ } else if ((strncasecmp("sec-websocket-key2: ", line, min(llen,20))) == 0) {
+ key2 = line+20;
+ buf[len-2] = '\0';
+ /* rfbLog("Got key2: %s\n", key2); */
+ /* HyBI */
+
+ } else if ((strncasecmp("sec-websocket-protocol: ", line, min(llen,24))) == 0) {
+ protocol = line+24;
+ buf[len-2] = '\0';
+ rfbLog("Got protocol: %s\n", protocol);
+ } else if ((strncasecmp("sec-websocket-origin: ", line, min(llen,22))) == 0) {
+ sec_ws_origin = line+22;
+ buf[len-2] = '\0';
+ } else if ((strncasecmp("sec-websocket-key: ", line, min(llen,19))) == 0) {
+ sec_ws_key = line+19;
+ buf[len-2] = '\0';
+ } else if ((strncasecmp("sec-websocket-version: ", line, min(llen,23))) == 0) {
+ sec_ws_version = strtol(line+23, NULL, 10);
+ buf[len-2] = '\0';
+ }
+
+ linestart = len;
+ }
+ }
+
+ if (!(path && host && (origin || sec_ws_origin))) {
+ rfbErr("webSocketsHandshake: incomplete client handshake\n");
+ free(response);
+ free(buf);
+ return FALSE;
+ }
+
+ if ((protocol) && (strstr(protocol, "binary"))) {
+ if (! sec_ws_version) {
+ rfbErr("webSocketsHandshake: 'binary' protocol not supported with Hixie\n");
+ free(response);
+ free(buf);
+ return FALSE;
+ }
+ rfbLog(" - webSocketsHandshake: using binary/raw encoding\n");
+ base64 = FALSE;
+ protocol = "binary";
+ } else {
+ rfbLog(" - webSocketsHandshake: using base64 encoding\n");
+ base64 = TRUE;
+ if ((protocol) && (strstr(protocol, "base64"))) {
+ protocol = "base64";
+ } else {
+ protocol = "";
+ }
+ }
+
+ /*
+ * Generate the WebSockets server response based on the the headers sent
+ * by the client.
+ */
+
+ if (sec_ws_version) {
+ char accept[B64LEN(SHA1_HASH_SIZE) + 1];
+ rfbLog(" - WebSockets client version hybi-%02d\n", sec_ws_version);
+ webSocketsGenSha1Key(accept, sizeof(accept), sec_ws_key);
+ len = snprintf(response, WEBSOCKETS_MAX_HANDSHAKE_LEN,
+ SERVER_HANDSHAKE_HYBI, accept, protocol);
+ } else {
+ /* older hixie handshake, this could be removed if
+ * a final standard is established */
+ if (!(key1 && key2 && key3)) {
+ rfbLog(" - WebSockets client version hixie-75\n");
+ prefix[0] = '\0';
+ trailer[0] = '\0';
+ } else {
+ rfbLog(" - WebSockets client version hixie-76\n");
+ snprintf(prefix, 5, "Sec-");
+ webSocketsGenMd5(trailer, key1, key2, key3);
+ }
+ len = snprintf(response, WEBSOCKETS_MAX_HANDSHAKE_LEN,
+ SERVER_HANDSHAKE_HIXIE, prefix, origin, prefix, scheme,
+ host, path, prefix, protocol, trailer);
+ }
+
+ if (rfbWriteExact(cl, response, len) < 0) {
+ rfbErr("webSocketsHandshake: failed sending WebSockets response\n");
+ free(response);
+ free(buf);
+ return FALSE;
+ }
+ /* rfbLog("webSocketsHandshake: %s\n", response); */
+ free(response);
+ free(buf);
+
+
+ wsctx = calloc(1, sizeof(ws_ctx_t));
+ if (sec_ws_version) {
+ wsctx->version = WEBSOCKETS_VERSION_HYBI;
+ wsctx->encode = webSocketsEncodeHybi;
+ wsctx->decode = webSocketsDecodeHybi;
+ } else {
+ wsctx->version = WEBSOCKETS_VERSION_HIXIE;
+ wsctx->encode = webSocketsEncodeHixie;
+ wsctx->decode = webSocketsDecodeHixie;
+ }
+ wsctx->base64 = base64;
+ cl->wsctx = (wsCtx *)wsctx;
+ return TRUE;
+}
+
+void
+webSocketsGenMd5(char * target, char *key1, char *key2, char *key3)
+{
+ unsigned int i, spaces1 = 0, spaces2 = 0;
+ unsigned long num1 = 0, num2 = 0;
+ unsigned char buf[17];
+ struct iovec iov[1];
+
+ for (i=0; i < strlen(key1); i++) {
+ if (key1[i] == ' ') {
+ spaces1 += 1;
+ }
+ if ((key1[i] >= 48) && (key1[i] <= 57)) {
+ num1 = num1 * 10 + (key1[i] - 48);
+ }
+ }
+ num1 = num1 / spaces1;
+
+ for (i=0; i < strlen(key2); i++) {
+ if (key2[i] == ' ') {
+ spaces2 += 1;
+ }
+ if ((key2[i] >= 48) && (key2[i] <= 57)) {
+ num2 = num2 * 10 + (key2[i] - 48);
+ }
+ }
+ num2 = num2 / spaces2;
+
+ /* Pack it big-endian */
+ buf[0] = (num1 & 0xff000000) >> 24;
+ buf[1] = (num1 & 0xff0000) >> 16;
+ buf[2] = (num1 & 0xff00) >> 8;
+ buf[3] = num1 & 0xff;
+
+ buf[4] = (num2 & 0xff000000) >> 24;
+ buf[5] = (num2 & 0xff0000) >> 16;
+ buf[6] = (num2 & 0xff00) >> 8;
+ buf[7] = num2 & 0xff;
+
+ strncpy((char *)buf+8, key3, 8);
+ buf[16] = '\0';
+
+ iov[0].iov_base = buf;
+ iov[0].iov_len = 16;
+ digestmd5(iov, 1, target);
+ target[16] = '\0';
+
+ return;
+}
+
+static int
+webSocketsEncodeHixie(rfbClientPtr cl, const char *src, int len, char **dst)
+{
+ int sz = 0;
+ ws_ctx_t *wsctx = (ws_ctx_t *)cl->wsctx;
+
+ wsctx->codeBuf[sz++] = '\x00';
+ len = __b64_ntop((unsigned char *)src, len, wsctx->codeBuf+sz, sizeof(wsctx->codeBuf) - (sz + 1));
+ if (len < 0) {
+ return len;
+ }
+ sz += len;
+
+ wsctx->codeBuf[sz++] = '\xff';
+ *dst = wsctx->codeBuf;
+ return sz;
+}
+
+static int
+ws_read(rfbClientPtr cl, char *buf, int len)
+{
+ int n;
+ if (cl->sslctx) {
+ n = rfbssl_read(cl, buf, len);
+ } else {
+ n = read(cl->sock, buf, len);
+ }
+ return n;
+}
+
+static int
+ws_peek(rfbClientPtr cl, char *buf, int len)
+{
+ int n;
+ if (cl->sslctx) {
+ n = rfbssl_peek(cl, buf, len);
+ } else {
+ while (-1 == (n = recv(cl->sock, buf, len, MSG_PEEK))) {
+ if (errno != EAGAIN)
+ break;
+ }
+ }
+ return n;
+}
+
+static int
+webSocketsDecodeHixie(rfbClientPtr cl, char *dst, int len)
+{
+ int retlen = 0, n, i, avail, modlen, needlen;
+ char *buf, *end = NULL;
+ ws_ctx_t *wsctx = (ws_ctx_t *)cl->wsctx;
+
+ buf = wsctx->codeBuf;
+
+ n = ws_peek(cl, buf, len*2+2);
+
+ if (n <= 0) {
+ /* save errno because rfbErr() will tamper it */
+ int olderrno = errno;
+ rfbErr("%s: peek (%d) %m\n", __func__, errno);
+ errno = olderrno;
+ return n;
+ }
+
+
+ /* Base64 encoded WebSockets stream */
+
+ if (buf[0] == '\xff') {
+ i = ws_read(cl, buf, 1); /* Consume marker */
+ buf++;
+ n--;
+ }
+ if (n == 0) {
+ errno = EAGAIN;
+ return -1;
+ }
+ if (buf[0] == '\x00') {
+ i = ws_read(cl, buf, 1); /* Consume marker */
+ buf++;
+ n--;
+ }
+ if (n == 0) {
+ errno = EAGAIN;
+ return -1;
+ }
+
+ /* end = memchr(buf, '\xff', len*2+2); */
+ end = memchr(buf, '\xff', n);
+ if (!end) {
+ end = buf + n;
+ }
+ avail = end - buf;
+
+ len -= wsctx->carrylen;
+
+ /* Determine how much base64 data we need */
+ modlen = len + (len+2)/3;
+ needlen = modlen;
+ if (needlen % 4) {
+ needlen += 4 - (needlen % 4);
+ }
+
+ if (needlen > avail) {
+ /* rfbLog("Waiting for more base64 data\n"); */
+ errno = EAGAIN;
+ return -1;
+ }
+
+ /* Any carryover from previous decode */
+ for (i=0; i < wsctx->carrylen; i++) {
+ /* rfbLog("Adding carryover %d\n", wsctx->carryBuf[i]); */
+ dst[i] = wsctx->carryBuf[i];
+ retlen += 1;
+ }
+
+ /* Decode the rest of what we need */
+ buf[needlen] = '\x00'; /* Replace end marker with end of string */
+ /* rfbLog("buf: %s\n", buf); */
+ n = __b64_pton(buf, (unsigned char *)dst+retlen, 2+len);
+ if (n < len) {
+ rfbErr("Base64 decode error\n");
+ errno = EIO;
+ return -1;
+ }
+ retlen += n;
+
+ /* Consume the data from socket */
+ i = ws_read(cl, buf, needlen);
+
+ wsctx->carrylen = n - len;
+ retlen -= wsctx->carrylen;
+ for (i=0; i < wsctx->carrylen; i++) {
+ /* rfbLog("Saving carryover %d\n", dst[retlen + i]); */
+ wsctx->carryBuf[i] = dst[retlen + i];
+ }
+
+ /* rfbLog("<< webSocketsDecode, retlen: %d\n", retlen); */
+ return retlen;
+}
+
+static int
+webSocketsDecodeHybi(rfbClientPtr cl, char *dst, int len)
+{
+ char *buf, *payload;
+ uint32_t *payload32;
+ int ret = -1, result = -1;
+ int total = 0;
+ ws_mask_t mask;
+ ws_header_t *header;
+ int i;
+ unsigned char opcode;
+ ws_ctx_t *wsctx = (ws_ctx_t *)cl->wsctx;
+ int flength, fhlen;
+ /* int fin; */ /* not used atm */
+
+ /* rfbLog(" <== %s[%d]: %d cl: %p, wsctx: %p-%p (%d)\n", __func__, gettid(), len, cl, wsctx, (char *)wsctx + sizeof(ws_ctx_t), sizeof(ws_ctx_t)); */
+
+ if (wsctx->readbuflen) {
+ /* simply return what we have */
+ if (wsctx->readbuflen > len) {
+ memcpy(dst, wsctx->readbuf + wsctx->readbufstart, len);
+ result = len;
+ wsctx->readbuflen -= len;
+ wsctx->readbufstart += len;
+ } else {
+ memcpy(dst, wsctx->readbuf + wsctx->readbufstart, wsctx->readbuflen);
+ result = wsctx->readbuflen;
+ wsctx->readbuflen = 0;
+ wsctx->readbufstart = 0;
+ }
+ goto spor;
+ }
+
+ buf = wsctx->codeBuf;
+ header = (ws_header_t *)wsctx->codeBuf;
+
+ ret = ws_peek(cl, buf, B64LEN(len) + WSHLENMAX);
+
+ if (ret < 2) {
+ /* save errno because rfbErr() will tamper it */
+ if (-1 == ret) {
+ int olderrno = errno;
+ rfbErr("%s: peek; %m\n", __func__);
+ errno = olderrno;
+ } else if (0 == ret) {
+ result = 0;
+ } else {
+ errno = EAGAIN;
+ }
+ goto spor;
+ }
+
+ opcode = header->b0 & 0x0f;
+ /* fin = (header->b0 & 0x80) >> 7; */ /* not used atm */
+ flength = header->b1 & 0x7f;
+
+ /*
+ * 4.3. Client-to-Server Masking
+ *
+ * The client MUST mask all frames sent to the server. A server MUST
+ * close the connection upon receiving a frame with the MASK bit set to 0.
+ **/
+ if (!(header->b1 & 0x80)) {
+ rfbErr("%s: got frame without mask\n", __func__, ret);
+ errno = EIO;
+ goto spor;
+ }
+
+ if (flength < 126) {
+ fhlen = 2;
+ mask = header->u.m;
+ } else if (flength == 126 && 4 <= ret) {
+ flength = WS_NTOH16(header->u.s16.l16);
+ fhlen = 4;
+ mask = header->u.s16.m16;
+ } else if (flength == 127 && 10 <= ret) {
+ flength = WS_NTOH64(header->u.s64.l64);
+ fhlen = 10;
+ mask = header->u.s64.m64;
+ } else {
+ /* Incomplete frame header */
+ rfbErr("%s: incomplete frame header\n", __func__, ret);
+ errno = EIO;
+ goto spor;
+ }
+
+ /* absolute length of frame */
+ total = fhlen + flength + 4;
+ payload = buf + fhlen + 4; /* header length + mask */
+
+ if (-1 == (ret = ws_read(cl, buf, total))) {
+ int olderrno = errno;
+ rfbErr("%s: read; %m", __func__);
+ errno = olderrno;
+ return ret;
+ } else if (ret < total) {
+ /* GT TODO: hmm? */
+ rfbLog("%s: read; got partial data\n", __func__);
+ } else {
+ buf[ret] = '\0';
+ }
+
+ /* process 1 frame (32 bit op) */
+ payload32 = (uint32_t *)payload;
+ for (i = 0; i < flength / 4; i++) {
+ payload32[i] ^= mask.u;
+ }
+ /* process the remaining bytes (if any) */
+ for (i*=4; i < flength; i++) {
+ payload[i] ^= mask.c[i % 4];
+ }
+
+ switch (opcode) {
+ case WS_OPCODE_CLOSE:
+ rfbLog("got closure, reason %d\n", WS_NTOH16(((uint16_t *)payload)[0]));
+ errno = ECONNRESET;
+ break;
+ case WS_OPCODE_TEXT_FRAME:
+ if (-1 == (flength = __b64_pton(payload, (unsigned char *)wsctx->codeBuf, sizeof(wsctx->codeBuf)))) {
+ rfbErr("%s: Base64 decode error; %m\n", __func__);
+ break;
+ }
+ payload = wsctx->codeBuf;
+ /* fall through */
+ case WS_OPCODE_BINARY_FRAME:
+ if (flength > len) {
+ memcpy(wsctx->readbuf, payload + len, flength - len);
+ wsctx->readbufstart = 0;
+ wsctx->readbuflen = flength - len;
+ flength = len;
+ }
+ memcpy(dst, payload, flength);
+ result = flength;
+ break;
+ default:
+ rfbErr("%s: unhandled opcode %d, b0: %02x, b1: %02x\n", __func__, (int)opcode, header->b0, header->b1);
+ }
+
+ /* single point of return, if someone has questions :-) */
+spor:
+ /* rfbLog("%s: ret: %d/%d\n", __func__, result, len); */
+ return result;
+}
+
+static int
+webSocketsEncodeHybi(rfbClientPtr cl, const char *src, int len, char **dst)
+{
+ int blen, ret = -1, sz = 0;
+ unsigned char opcode = '\0'; /* TODO: option! */
+ ws_header_t *header;
+ ws_ctx_t *wsctx = (ws_ctx_t *)cl->wsctx;
+
+
+ /* Optional opcode:
+ * 0x0 - continuation
+ * 0x1 - text frame (base64 encode buf)
+ * 0x2 - binary frame (use raw buf)
+ * 0x8 - connection close
+ * 0x9 - ping
+ * 0xA - pong
+ **/
+ if (!len) {
+ /* nothing to encode */
+ return 0;
+ }
+
+ header = (ws_header_t *)wsctx->codeBuf;
+
+ if (wsctx->base64) {
+ opcode = WS_OPCODE_TEXT_FRAME;
+ /* calculate the resulting size */
+ blen = B64LEN(len);
+ } else {
+ blen = len;
+ }
+
+ header->b0 = 0x80 | (opcode & 0x0f);
+ if (blen <= 125) {
+ header->b1 = (uint8_t)blen;
+ sz = 2;
+ } else if (blen <= 65536) {
+ header->b1 = 0x7e;
+ header->u.s16.l16 = WS_HTON16((uint16_t)blen);
+ sz = 4;
+ } else {
+ header->b1 = 0x7f;
+ header->u.s64.l64 = WS_HTON64(blen);
+ sz = 10;
+ }
+
+ if (wsctx->base64) {
+ if (-1 == (ret = __b64_ntop((unsigned char *)src, len, wsctx->codeBuf + sz, sizeof(wsctx->codeBuf) - sz))) {
+ rfbErr("%s: Base 64 encode failed\n", __func__);
+ } else {
+ if (ret != blen)
+ rfbErr("%s: Base 64 encode; something weird happened\n", __func__);
+ ret += sz;
+ }
+ } else {
+ memcpy(wsctx->codeBuf + sz, src, len);
+ ret = sz + len;
+ }
+
+ *dst = wsctx->codeBuf;
+ return ret;
+}
+
+int
+webSocketsEncode(rfbClientPtr cl, const char *src, int len, char **dst)
+{
+ return ((ws_ctx_t *)cl->wsctx)->encode(cl, src, len, dst);
+}
+
+int
+webSocketsDecode(rfbClientPtr cl, char *dst, int len)
+{
+ return ((ws_ctx_t *)cl->wsctx)->decode(cl, dst, len);
+}
+
+
+/* returns TRUE if client sent a close frame or a single 'end of frame'
+ * marker was received, FALSE otherwise
+ *
+ * Note: This is a Hixie-only hack!
+ **/
+rfbBool
+webSocketCheckDisconnect(rfbClientPtr cl)
+{
+ ws_ctx_t *wsctx = (ws_ctx_t *)cl->wsctx;
+ /* With Base64 encoding we need at least 4 bytes */
+ char peekbuf[4];
+ int n;
+
+ if (wsctx->version == WEBSOCKETS_VERSION_HYBI)
+ return FALSE;
+
+ if (cl->sslctx)
+ n = rfbssl_peek(cl, peekbuf, 4);
+ else
+ n = recv(cl->sock, peekbuf, 4, MSG_PEEK);
+
+ if (n <= 0) {
+ if (n != 0)
+ rfbErr("%s: peek; %m", __func__);
+ rfbCloseClient(cl);
+ return TRUE;
+ }
+
+ if (peekbuf[0] == '\xff') {
+ int doclose = 0;
+ /* Make sure we don't miss a client disconnect on an end frame
+ * marker. Because we use a peek buffer in some cases it is not
+ * applicable to wait for more data per select(). */
+ switch (n) {
+ case 3:
+ if (peekbuf[1] == '\xff' && peekbuf[2] == '\x00')
+ doclose = 1;
+ break;
+ case 2:
+ if (peekbuf[1] == '\x00')
+ doclose = 1;
+ break;
+ default:
+ return FALSE;
+ }
+
+ if (cl->sslctx)
+ n = rfbssl_read(cl, peekbuf, n);
+ else
+ n = read(cl->sock, peekbuf, n);
+
+ if (doclose) {
+ rfbErr("%s: websocket close frame received\n", __func__);
+ rfbCloseClient(cl);
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
diff --git a/ica/x11/x11vnc/scan.c b/ica/x11/x11vnc/scan.c
index c6666e0..b55a0a3 100644
--- a/ica/x11/x11vnc/scan.c
+++ b/ica/x11/x11vnc/scan.c
@@ -451,7 +451,7 @@ void initialize_polling_images(void) {
* limits, e.g. the default 1MB on Solaris)
*/
#ifdef WIN32
- set_fs_factor(1 * MB);
+ set_fs_factor(10 * MB);
#else
if (UT.sysname && strstr(UT.sysname, "Linux")) {
set_fs_factor(10 * MB);
diff --git a/ica/x11/x11vnc/screen.c b/ica/x11/x11vnc/screen.c
index 5058ee3..942d955 100644
--- a/ica/x11/x11vnc/screen.c
+++ b/ica/x11/x11vnc/screen.c
@@ -4539,7 +4539,14 @@ void watch_loop(void) {
if (rawfb_vnc_reflect) {
static time_t lastone = 0;
- if (time(NULL) > lastone + 10) {
+
+ /* Tobias Doerffel, 2011/11 */
+#ifdef USE_AS_ITALC_DEMO_SERVER
+ if (1)
+#else
+ if (time(NULL) > lastone + 10)
+#endif
+ {
lastone = time(NULL);
vnc_reflect_process_client();
}
@@ -4564,7 +4571,22 @@ void watch_loop(void) {
if (! screen || ! screen->clientHead) {
/* waiting for a client */
+ /* Tobias Doerffel, 2011/11 */
+#ifdef USE_AS_ITALC_DEMO_SERVER
+ /* when running as demo server, increase main loop delay
+ and instead removed delay between vnc_reflect_process_client()
+ calls above */
+ if( rawfb_vnc_reflect )
+ {
+ usleep(400 * 1000);
+ }
+ else
+ {
+ usleep(200 * 1000);
+ }
+#else
usleep(200 * 1000);
+#endif
continue;
}
diff --git a/ima/CMakeLists.txt b/ima/CMakeLists.txt
index 06f9b73..3edeb9e 100644
--- a/ima/CMakeLists.txt
+++ b/ima/CMakeLists.txt
@@ -9,6 +9,7 @@ QT4_TRANSLATIONS_FOR_QRC(${QRC_FILE} ${italc_SOURCES} ${italc_INCLUDES})
IF(ITALC_BUILD_WIN32)
SET(WINRC "${CMAKE_CURRENT_BINARY_DIR}/italcrc.obj")
+ ADD_DEFINITIONS(-D__USE_MINGW_ANSI_STDIO=1)
ADD_CUSTOM_COMMAND(OUTPUT ${WINRC}
COMMAND ${WINDRES}
-I${CMAKE_CURRENT_SOURCE_DIR}
diff --git a/ima/italc.rc b/ima/italc.rc
index 8397877..3c60dfe 100644
--- a/ima/italc.rc
+++ b/ima/italc.rc
@@ -2,7 +2,7 @@ italcicon ICON data/italc.ico
#include <windows.h>
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,0,0,0
+ FILEVERSION 2,0,1,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
@@ -17,7 +17,7 @@ BEGIN
VALUE "CompanyName", "iTALC Solutions\0"
VALUE "FileDescription", "iTALC Master Application\0"
VALUE "FileVersion", "\0"
- VALUE "LegalCopyright", "Copyright (c) 2004-2011 Tobias Doerffel\0"
+ VALUE "LegalCopyright", "Copyright (c) 2004-2013 Tobias Doerffel\0"
VALUE "OriginalFilename", "italc.exe\0"
VALUE "ProductName", "iTALC\0"
VALUE "ProductVersion", "\0"
diff --git a/ima/italc.rc.in b/ima/italc.rc.in
index 70e15a7..3e57ee7 100644
--- a/ima/italc.rc.in
+++ b/ima/italc.rc.in
@@ -2,7 +2,7 @@ italcicon ICON data/italc.ico
#include <windows.h>
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,0,0,0
+ FILEVERSION 2,0,1,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
@@ -17,7 +17,7 @@ BEGIN
VALUE "CompanyName", "iTALC Solutions\0"
VALUE "FileDescription", "iTALC Master Application\0"
VALUE "FileVersion", "@PACKAGE_VERSION@\0"
- VALUE "LegalCopyright", "Copyright (c) 2004-2011 Tobias Doerffel\0"
+ VALUE "LegalCopyright", "Copyright (c) 2004-2013 Tobias Doerffel\0"
VALUE "OriginalFilename", "italc.exe\0"
VALUE "ProductName", "iTALC\0"
VALUE "ProductVersion", "@PACKAGE_VERSION@\0"
diff --git a/ima/resources/splash.png b/ima/resources/splash.png
index 6c2670f..127b71f 100644
Binary files a/ima/resources/splash.png and b/ima/resources/splash.png differ
diff --git a/ima/src/Dialogs.cpp b/ima/src/Dialogs.cpp
index eb3dca1..db1131f 100644
--- a/ima/src/Dialogs.cpp
+++ b/ima/src/Dialogs.cpp
@@ -1,7 +1,7 @@
/*
* Dialogs.cpp - implementation of dialogs
*
- * Copyright (c) 2006-2011 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
+ * Copyright (c) 2006-2013 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
*
* This file is part of iTALC - http://italc.sourceforge.net
*
@@ -63,9 +63,10 @@ ClientSettingsDialog::ClientSettingsDialog( Client * _client,
ui->setupUi( this );
ui->hostnameEdit->setFocus();
- int classroomIndex = 0, i = 0;
+ int classroomIndex = 0;
#ifdef ITALC3
+ int i = 0;
ClassroomManager * cm = MasterCore::classroomManager;
foreach( const Classroom * cr,
MasterCore::classroomManager->classrooms() )
diff --git a/ima/src/RemoteControlWidget.cpp b/ima/src/RemoteControlWidget.cpp
index 59353ef..2ca5072 100644
--- a/ima/src/RemoteControlWidget.cpp
+++ b/ima/src/RemoteControlWidget.cpp
@@ -1,7 +1,7 @@
/*
* RemoteControlWidget.cpp - widget containing a VNC-view and controls for it
*
- * Copyright (c) 2006-2011 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
+ * Copyright (c) 2006-2013 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
*
* This file is part of iTALC - http://italc.sourceforge.net
*
@@ -257,6 +257,8 @@ void RemoteControlWidgetToolBar::startConnection()
void RemoteControlWidgetToolBar::connectionEstablished()
{
+ m_parent->m_coreConnection->sendGetUserInformationRequest();
+
m_connecting = false;
m_iconStateTimeLine.stop();
QTimer::singleShot( 3000, this, SLOT( disappear() ) );
@@ -324,7 +326,10 @@ void RemoteControlWidget::updateWindowTitle()
}
else
{
- u = u.section( '(', 1 ).section( ')', 0, 0 );
+ if( u.contains( '(' ) && u.contains( ')' ) )
+ {
+ u = u.section( '(', 1 ).section( ')', 0, 0 );
+ }
}
setWindowTitle( s.arg( u ).arg( host() ) );
}
diff --git a/imc/CMakeLists.txt b/imc/CMakeLists.txt
index d088587..6a59a4a 100644
--- a/imc/CMakeLists.txt
+++ b/imc/CMakeLists.txt
@@ -9,6 +9,7 @@ QT4_TRANSLATIONS_FOR_QRC(${QRC_FILE} ${imc_SOURCES} ${imc_INCLUDES})
IF(ITALC_BUILD_WIN32)
SET(WINRC "${CMAKE_CURRENT_BINARY_DIR}/imcrc.obj")
+ ADD_DEFINITIONS(-D__USE_MINGW_ANSI_STDIO=1)
ADD_CUSTOM_COMMAND(OUTPUT ${WINRC}
COMMAND ${WINDRES}
-I${CMAKE_CURRENT_SOURCE_DIR}
diff --git a/imc/Forms/MainWindow.ui b/imc/Forms/MainWindow.ui
index bf50f34..b26ca55 100644
--- a/imc/Forms/MainWindow.ui
+++ b/imc/Forms/MainWindow.ui
@@ -458,7 +458,7 @@
<item row="1" column="0">
<widget class="QCheckBox" name="vncPollFullScreen">
<property name="text">
- <string>Poll full screen</string>
+ <string>Poll full screen (leave this enabled per default)</string>
</property>
</widget>
</item>
diff --git a/imc/imc.1 b/imc/imc.1
new file mode 100644
index 0000000..a44acc1
--- /dev/null
+++ b/imc/imc.1
@@ -0,0 +1,71 @@
+.TH imc 1 "Date: 2011/16/12 10:00:00" "imc"
+.SH NAME
+imc \- is the iTALC management console to setup iTALC.
+.SH SYNOPSIS
+\fBimc\fP [\fIoptions\fP]
+.SH OVERVIEW
+
+imc\[rg], is a X11 program to modify the various settings used by italc-client and italc-master.
+
+imc is free software delivered as a ready-to-run binary distribution or as source code that you can freely use, copy, modify, and distribute. Its license is compatible with the GPL. It runs on all major operating systems.
+
+The functionality of imc is typically utilized from X11 but also from the command line.
+
+In the paragraphs below, find a short description for each command-line option.If you are just getting acquianted with imc, start the program without any options.
+.TP
+.B -ListConfig -l
+
+The current configuration with all keys and values will be listed. This will give an output like
+ ...
+ Logging/LogLevel=1
+ Network/CoreServerPort=11100
+ Network/DemoServerPort=11400
+ ...
+
+.TP
+.B -SetConfigValue -s
+
+The value of configuration property can be changed with this option.
+Examples:
+ imc -SetConfigValue Logging/LogFileDirectory C:\temp
+ imc -s Logging/LogLevel=4
+
+.TP
+.B -ApplySettings -a
+
+You can apply the settings previously saved in a settings file using this command.
+Examples:
+ imc -ApplySettings MyCustomSettings.xml
+
+.TP
+.B -ImportPublicKey -i
+
+You can import a public key file which has been exported during the installation
+of the iTALC master computer using this command or its abbreviation.
+
+You can omit the the second parameter which specifies the public key file if it
+is located in the directory from which you launch IMC. IMC will automatically
+search for a *.key.txt file. If it finds exactly one, it'll import this one.
+Examples:
+ imc -ImportPublicKey MyPublicKey.key.txt
+ imc -i
+
+.TP
+.B -createkeypair <path>
+
+creates a new key pair for the default role (teacher) with the specified "path" as base dir. If "path" is omitted
+the path is taken from the settings file. This is used in conjunction with role. If role is omitted the default
+role is "teacher".
+
+.TP
+.B -role [supporter|teacher|admin]
+
+in connection with "createkeypair" creates a key pair for the specified role.
+
+.PP
+For more information about the imc, point your browser to file:///usr/share/doc/packages/imc or http://italc.sourceforge.net/.
+.SH SEE ALSO
+ica(1), italc(1)
+
+.SH COPYRIGHT
+\fBCopyright (C) 2004-2011 Tobias Doerffel. Additional copyrights and licenses apply to this software, see http://italc.sourceforge.net\fP
diff --git a/imc/imc.rc b/imc/imc.rc
index 298716b..be19391 100644
--- a/imc/imc.rc
+++ b/imc/imc.rc
@@ -2,7 +2,7 @@ imcicon ICON Resources/imc.ico
#include <windows.h>
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,0,0,0
+ FILEVERSION 2,0,1,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
@@ -17,7 +17,7 @@ BEGIN
VALUE "CompanyName", "iTALC Solutions\0"
VALUE "FileDescription", "iTALC Management Console\0"
VALUE "FileVersion", "\0"
- VALUE "LegalCopyright", "Copyright (c) 2010-2011 Tobias Doerffel\0"
+ VALUE "LegalCopyright", "Copyright (c) 2010-2013 Tobias Doerffel\0"
VALUE "OriginalFilename", "imc.exe\0"
VALUE "ProductName", "iTALC\0"
VALUE "ProductVersion", "\0"
diff --git a/imc/imc.rc.in b/imc/imc.rc.in
index a677cb3..c1704d3 100644
--- a/imc/imc.rc.in
+++ b/imc/imc.rc.in
@@ -2,7 +2,7 @@ imcicon ICON Resources/imc.ico
#include <windows.h>
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,0,0,0
+ FILEVERSION 2,0,1,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
@@ -17,7 +17,7 @@ BEGIN
VALUE "CompanyName", "iTALC Solutions\0"
VALUE "FileDescription", "iTALC Management Console\0"
VALUE "FileVersion", "@PACKAGE_VERSION@\0"
- VALUE "LegalCopyright", "Copyright (c) 2010-2011 Tobias Doerffel\0"
+ VALUE "LegalCopyright", "Copyright (c) 2010-2013 Tobias Doerffel\0"
VALUE "OriginalFilename", "imc.exe\0"
VALUE "ProductName", "iTALC\0"
VALUE "ProductVersion", "@PACKAGE_VERSION@\0"
diff --git a/imc/src/FileSystemBrowser.cpp b/imc/src/FileSystemBrowser.cpp
index 8eaa2ea..a8aa5fa 100644
--- a/imc/src/FileSystemBrowser.cpp
+++ b/imc/src/FileSystemBrowser.cpp
@@ -1,7 +1,7 @@
/*
* FileSystemBrowser.cpp - a wrapper class for easily browsing the file system
*
- * Copyright (c) 2010 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
+ * Copyright (c) 2010-2013 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
*
* This file is part of iTALC - http://italc.sourceforge.net
*
@@ -58,6 +58,8 @@ QString FileSystemBrowser::exec( const QString &path,
browsePath = QDir::homePath();
}
break;
+
+ default: break;
}
QString chosenPath;
@@ -77,6 +79,8 @@ QString FileSystemBrowser::exec( const QString &path,
chosenPath = QFileDialog::getSaveFileName( NULL, title,
browsePath, filter );
break;
+
+ default: break;
}
if( !chosenPath.isEmpty() )
diff --git a/imc/src/ImcCore.cpp b/imc/src/ImcCore.cpp
index 9088d39..1487d98 100644
--- a/imc/src/ImcCore.cpp
+++ b/imc/src/ImcCore.cpp
@@ -44,6 +44,7 @@ namespace ImcCore
// static data initialization
MainWindow *mainWindow = NULL;
+bool silent = false;
static void configApplyError( const QString &msg )
@@ -221,8 +222,7 @@ void informationMessage( const QString &title, const QString &msg )
{
LogStream( Logger::LogLevelInfo ) << title.toUtf8().constData()
<< ":" << msg.toUtf8().constData();
- if( QApplication::type() != QApplication::Tty &&
- !QCoreApplication::instance()->arguments().contains( "-quiet" ) )
+ if( QApplication::type() != QApplication::Tty && !silent )
{
QMessageBox::information( NULL, title, msg );
}
@@ -234,8 +234,7 @@ void criticalMessage( const QString &title, const QString &msg )
{
LogStream( Logger::LogLevelCritical ) << title.toUtf8().constData()
<< ":" << msg.toUtf8().constData();
- if( QApplication::type() != QApplication::Tty &&
- !QCoreApplication::instance()->arguments().contains( "-quiet" ) )
+ if( QApplication::type() != QApplication::Tty && !silent )
{
QMessageBox::critical( NULL, title, msg );
}
diff --git a/imc/src/ImcCore.h b/imc/src/ImcCore.h
index ab5f0c1..53ed59e 100644
--- a/imc/src/ImcCore.h
+++ b/imc/src/ImcCore.h
@@ -48,6 +48,8 @@ namespace ImcCore
void informationMessage( const QString &title, const QString &msg );
void criticalMessage( const QString &title, const QString &msg );
+ extern bool silent;
+
// UI objects
extern MainWindow * mainWindow;
diff --git a/imc/src/MainWindow.cpp b/imc/src/MainWindow.cpp
index 134d515..80ada0a 100644
--- a/imc/src/MainWindow.cpp
+++ b/imc/src/MainWindow.cpp
@@ -1,7 +1,7 @@
/*
* MainWindow.cpp - implementation of MainWindow class
*
- * Copyright (c) 2010-2011 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
+ * Copyright (c) 2010-2013 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
*
* This file is part of iTALC - http://italc.sourceforge.net
*
@@ -538,6 +538,8 @@ void MainWindow::generateBugReportArchive()
const QString buildType = "x86";
#elif defined( ITALC_HOST_X86_64 )
const QString buildType = "x86_64";
+#else
+ const QString buildType = "unknown";
#endif
obj.setValue( "OS", os, "General" );
obj.setValue( "MachineInfo", machineInfo, "General" );
diff --git a/imc/src/MainWindow.h b/imc/src/MainWindow.h
index a935b33..d6c29cb 100644
--- a/imc/src/MainWindow.h
+++ b/imc/src/MainWindow.h
@@ -42,6 +42,10 @@ public:
void apply();
+public slots:
+ void manageACLs();
+
+
private slots:
void configurationChanged();
void resetOrApply( QAbstractButton *btn );
@@ -58,7 +62,6 @@ private slots:
void loadSettingsFromFile();
void saveSettingsToFile();
void launchKeyFileAssistant();
- void manageACLs();
void testLogonAuthentication();
void generateBugReportArchive();
void aboutItalc();
diff --git a/imc/src/Win32AclEditor.h b/imc/src/Win32AclEditor.h
index f3f81af..a25e174 100644
--- a/imc/src/Win32AclEditor.h
+++ b/imc/src/Win32AclEditor.h
@@ -39,6 +39,10 @@ struct ItalcSecurityInfo : ISecurityInformation
m_pszObjectName(pszObjectName),
m_pszPageTitle(pszPageTitle) {}
+ virtual ~ItalcSecurityInfo()
+ {
+ }
+
STDMETHODIMP QueryInterface( REFIID iid, void** ppv );
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
diff --git a/imc/src/main.cpp b/imc/src/main.cpp
index ed31db4..9b84b9a 100644
--- a/imc/src/main.cpp
+++ b/imc/src/main.cpp
@@ -1,7 +1,7 @@
/*
* main.cpp - main file for iTALC Management Console
*
- * Copyright (c) 2010 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
+ * Copyright (c) 2010-2011 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
*
* This file is part of iTALC - http://italc.sourceforge.net
*
@@ -39,6 +39,7 @@
int main( int argc, char **argv )
{
+
// make sure to run as admin
if( !LocalSystem::Process::isRunningAsAdmin() )
{
@@ -60,6 +61,11 @@ int main( int argc, char **argv )
ItalcCore::init();
+ ImcCore::silent = app.arguments().contains( "-quiet" ) ||
+ app.arguments().contains( "-silent" ) ||
+ app.arguments().contains( "-q" );
+
+
// default to teacher role for various command line operations
ItalcCore::role = ItalcCore::RoleTeacher;
@@ -81,7 +87,7 @@ int main( int argc, char **argv )
}
// parse arguments
- QStringListIterator argIt( QCoreApplication::arguments() );
+ QStringListIterator argIt( app.arguments() );
argIt.next();
while( argc > 1 && argIt.hasNext() )
@@ -222,6 +228,11 @@ int main( int argc, char **argv )
mainWindow->show();
+ if( app.arguments().contains( "-manageACLs" ) )
+ {
+ mainWindow->manageACLs();
+ }
+
ilog( Info, "App.Exec" );
int ret = app.exec();
diff --git a/italcconfig.h.in b/italcconfig.h.in
index a2fcf86..02a00e1 100644
--- a/italcconfig.h.in
+++ b/italcconfig.h.in
@@ -7,6 +7,7 @@
#cmakedefine ITALC_HAVE_ARPA_INET_H 1
#cmakedefine ITALC_HAVE_FCNTL_H 1
+#cmakedefine ITALC_HAVE_FCNTL_H 1
#cmakedefine ITALC_HAVE_LIMITS_H 1
#cmakedefine ITALC_HAVE_MEMORY_H 1
#cmakedefine ITALC_HAVE_NETDB_H 1
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index dc31653..4165168 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -10,10 +10,12 @@ FILE(GLOB ic_UI ${CMAKE_CURRENT_SOURCE_DIR}/dialogs/*.ui)
SET(LIBVNCCLIENT_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/../ica/x11/common/minilzo.c
+${CMAKE_CURRENT_SOURCE_DIR}/../ica/x11/common/turbojpeg.c
${CMAKE_CURRENT_SOURCE_DIR}/../ica/x11/libvncclient/cursor.c
${CMAKE_CURRENT_SOURCE_DIR}/../ica/x11/libvncclient/listen.c
${CMAKE_CURRENT_SOURCE_DIR}/../ica/x11/libvncclient/rfbproto.c
${CMAKE_CURRENT_SOURCE_DIR}/../ica/x11/libvncclient/sockets.c
+${CMAKE_CURRENT_SOURCE_DIR}/../ica/x11/libvncclient/tls_none.c
${CMAKE_CURRENT_SOURCE_DIR}/../ica/x11/libvncclient/vncviewer.c)
diff --git a/lib/ItalcCore.qrc b/lib/ItalcCore.qrc
index defbf46..6703249 100644
--- a/lib/ItalcCore.qrc
+++ b/lib/ItalcCore.qrc
@@ -1,6 +1,8 @@
<RCC>
<qresource>
<file>resources/icon64.png</file>
+ <file>resources/manage-with-imc.png</file>
+ <file>resources/dialog-password.png</file>
<file>../COPYING</file>
<file>resources/license.png</file>
<file>../AUTHORS</file>
@@ -10,10 +12,12 @@
<file>resources/message.png</file>
<file>resources/ok.png</file>
<file>resources/de.qm</file>
+ <file>resources/ar.qm</file>
<file>resources/cs.qm</file>
<file>resources/it.qm</file>
<file>resources/es.qm</file>
<file>resources/fr.qm</file>
+ <file>resources/hu.qm</file>
<file>resources/nn.qm</file>
<file>resources/pl.qm</file>
<file>resources/sl.qm</file>
@@ -27,6 +31,7 @@
<file>resources/pt_br.qm</file>
<file>resources/el.qm</file>
<file>resources/tr.qm</file>
+ <file>resources/he.qm</file>
<file>resources/locked_bg.png</file>
<file>resources/icon16.png</file>
<file>resources/icon22.png</file>
diff --git a/lib/dialogs/AboutDialog.ui b/lib/dialogs/AboutDialog.ui
index 671e040..0d10fe5 100644
--- a/lib/dialogs/AboutDialog.ui
+++ b/lib/dialogs/AboutDialog.ui
@@ -102,7 +102,7 @@
<property name="text">
<string>iTALC - Intelligent Teaching And Learning with Computers
-Copyright © 2004-2011 Tobias Doerffel / iTALC Solutions</string>
+Copyright © 2004-2013 Tobias Doerffel / iTALC Solutions</string>
</property>
</widget>
</item>
diff --git a/lib/dialogs/PasswordDialog.ui b/lib/dialogs/PasswordDialog.ui
index 679092c..5e404af 100644
--- a/lib/dialogs/PasswordDialog.ui
+++ b/lib/dialogs/PasswordDialog.ui
@@ -6,15 +6,32 @@
<rect>
<x>0</x>
<y>0</y>
- <width>340</width>
- <height>150</height>
+ <width>499</width>
+ <height>166</height>
</rect>
</property>
<property name="windowTitle">
<string>iTALC Logon</string>
</property>
- <layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0" colspan="2">
+ <property name="windowIcon">
+ <iconset resource="../ItalcCore.qrc">
+ <normaloff>:/resources/dialog-password.png</normaloff>:/resources/dialog-password.png</iconset>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="0" column="0" rowspan="5">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="../ItalcCore.qrc">:/resources/dialog-password.png</pixmap>
+ </property>
+ <property name="margin">
+ <number>10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
@@ -30,40 +47,109 @@
</property>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Username</string>
+ <item row="2" column="1">
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="horizontalSpacing">
+ <number>16</number>
</property>
- </widget>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Username</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="username"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Password</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="password">
+ <property name="echoMode">
+ <enum>QLineEdit::Password</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
- <item row="1" column="1">
- <widget class="QLineEdit" name="username"/>
+ <item row="4" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="manageButton">
+ <property name="text">
+ <string>Manage</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../ItalcCore.qrc">
+ <normaloff>:/resources/manage-with-imc.png</normaloff>:/resources/manage-with-imc.png</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Password</string>
+ <item row="3" column="1">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
</property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QLineEdit" name="password">
- <property name="echoMode">
- <enum>QLineEdit::Password</enum>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>10</width>
+ <height>10</height>
+ </size>
</property>
- </widget>
+ </spacer>
</item>
- <item row="3" column="1">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="standardButtons">
- <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ <item row="1" column="1">
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
</property>
- </widget>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>10</width>
+ <height>10</height>
+ </size>
+ </property>
+ </spacer>
</item>
</layout>
</widget>
- <resources/>
+ <resources>
+ <include location="../ItalcCore.qrc"/>
+ </resources>
<connections>
<connection>
<sender>buttonBox</sender>
@@ -129,8 +215,25 @@
</hint>
</hints>
</connection>
+ <connection>
+ <sender>manageButton</sender>
+ <signal>clicked()</signal>
+ <receiver>PasswordDialog</receiver>
+ <slot>manage()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>444</x>
+ <y>147</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>249</x>
+ <y>82</y>
+ </hint>
+ </hints>
+ </connection>
</connections>
<slots>
<slot>updateOkButton()</slot>
+ <slot>manage()</slot>
</slots>
</ui>
diff --git a/lib/include/AboutDialog.h b/lib/include/AboutDialog.h
index 1187919..f1831b1 100644
--- a/lib/include/AboutDialog.h
+++ b/lib/include/AboutDialog.h
@@ -1,7 +1,7 @@
/*
* AboutDialog.h - declaration of AboutDialog class
*
- * Copyright (c) 2011 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
+ * Copyright (c) 2011-2013 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
*
* This file is part of iTALC - http://italc.sourceforge.net
*
diff --git a/lib/include/Configuration/Store.h b/lib/include/Configuration/Store.h
index 9f3dc9f..0a027bc 100644
--- a/lib/include/Configuration/Store.h
+++ b/lib/include/Configuration/Store.h
@@ -1,7 +1,7 @@
/*
* Configuration/Store.h - ConfigurationStore class
*
- * Copyright (c) 2009-2010 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
+ * Copyright (c) 2009-2012 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
*
* This file is part of iTALC - http://italc.sourceforge.net
*
@@ -61,6 +61,10 @@ public:
{
}
+ virtual ~Store()
+ {
+ }
+
Backend backend() const
{
return m_backend;
diff --git a/lib/include/ItalcCoreConnection.h b/lib/include/ItalcCoreConnection.h
index 50bedcd..2a3009a 100644
--- a/lib/include/ItalcCoreConnection.h
+++ b/lib/include/ItalcCoreConnection.h
@@ -106,6 +106,9 @@ public:
void reportSlaveStateFlags();
+signals:
+ void receivedUserInfo( const QString &, const QString & );
+ void receivedSlaveStateFlags( const int );
private slots:
void initNewClient( rfbClient *client );
diff --git a/lib/include/ItalcVncConnection.h b/lib/include/ItalcVncConnection.h
index 999d844..5a523cb 100644
--- a/lib/include/ItalcVncConnection.h
+++ b/lib/include/ItalcVncConnection.h
@@ -1,7 +1,7 @@
/*
* ItalcVncConnection.h - declaration of ItalcVncConnection class
*
- * Copyright (c) 2008-2010 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
+ * Copyright (c) 2008-2013 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
*
* This file is part of iTALC - http://italc.sourceforge.net
*
@@ -190,6 +190,7 @@ signals:
void passwordRequest();
void outputErrorMessage( const QString &message );
void connected();
+ void stateChanged( const int );
public slots:
@@ -237,9 +238,6 @@ private:
volatile bool m_stopped;
-private slots:
- void checkOutputErrorMessage();
-
} ;
#endif
diff --git a/lib/include/PasswordDialog.h b/lib/include/PasswordDialog.h
index 28e3547..13b50e4 100644
--- a/lib/include/PasswordDialog.h
+++ b/lib/include/PasswordDialog.h
@@ -46,6 +46,7 @@ public:
private slots:
void updateOkButton();
+ void manage();
private:
diff --git a/lib/include/rfb/rfb.h b/lib/include/rfb/rfb.h
index ed6f5e0..45d5223 100644
--- a/lib/include/rfb/rfb.h
+++ b/lib/include/rfb/rfb.h
@@ -1,8 +1,12 @@
#ifndef RFB_H
#define RFB_H
+/**
+ * @defgroup libvncserver_api LibVNCServer API Reference
+ * @{
+ */
-/*
- * rfb.h - header file for RFB DDX implementation.
+/**
+ * @file rfb.h
*/
/*
@@ -39,11 +43,17 @@ extern "C"
#include <string.h>
#include <rfb/rfbproto.h>
+#if defined(ANDROID) || defined(LIBVNCSERVER_HAVE_ANDROID)
+#include <arpa/inet.h>
+#include <sys/select.h>
+#endif
+
#ifdef LIBVNCSERVER_HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef __MINGW32__
+#undef SOCKET
#include <winsock2.h>
#include <ws2tcpip.h>
#endif
@@ -137,69 +147,72 @@ typedef rfbBool (*rfbPasswordCheckProcPtr)(struct _rfbClientRec* cl,const char*
typedef enum rfbNewClientAction (*rfbNewClientHookPtr)(struct _rfbClientRec* cl);
typedef void (*rfbDisplayHookPtr)(struct _rfbClientRec* cl);
typedef void (*rfbDisplayFinishedHookPtr)(struct _rfbClientRec* cl, int result);
-/* support the capability to view the caps/num/scroll states of the X server */
+/** support the capability to view the caps/num/scroll states of the X server */
typedef int (*rfbGetKeyboardLedStateHookPtr)(struct _rfbScreenInfo* screen);
typedef rfbBool (*rfbXvpHookPtr)(struct _rfbClientRec* cl, uint8_t, uint8_t);
-/* If x==1 and y==1 then set the whole display
+/**
+ * If x==1 and y==1 then set the whole display
* else find the window underneath x and y and set the framebuffer to the dimensions
* of that window
*/
typedef void (*rfbSetSingleWindowProcPtr) (struct _rfbClientRec* cl, int x, int y);
-/* Status determines if the X11 server permits input from the local user
+/**
+ * Status determines if the X11 server permits input from the local user
* status==0 or 1
*/
typedef void (*rfbSetServerInputProcPtr) (struct _rfbClientRec* cl, int status);
-/* Permit the server to allow or deny filetransfers. This is defaulted to deny
+/**
+ * Permit the server to allow or deny filetransfers. This is defaulted to deny
* It is called when a client initiates a connection to determine if it is permitted.
*/
typedef int (*rfbFileTransferPermitted) (struct _rfbClientRec* cl);
-/* Handle the textchat messages */
+/** Handle the textchat messages */
typedef void (*rfbSetTextChat) (struct _rfbClientRec* cl, int length, char *string);
typedef struct {
uint32_t count;
- rfbBool is16; /* is the data format short? */
+ rfbBool is16; /**< is the data format short? */
union {
uint8_t* bytes;
uint16_t* shorts;
- } data; /* there have to be count*3 entries */
+ } data; /**< there have to be count*3 entries */
} rfbColourMap;
-/*
+/**
* Security handling (RFB protocol version 3.7)
*/
typedef struct _rfbSecurity {
- uint32_t type;
+ uint8_t type;
void (*handler)(struct _rfbClientRec* cl);
struct _rfbSecurity* next;
} rfbSecurityHandler;
-/*
+/**
* Protocol extension handling.
*/
typedef struct _rfbProtocolExtension {
- /* returns FALSE if extension should be deactivated for client.
+ /** returns FALSE if extension should be deactivated for client.
if newClient == NULL, it is always deactivated. */
rfbBool (*newClient)(struct _rfbClientRec* client, void** data);
- /* returns FALSE if extension should be deactivated for client.
+ /** returns FALSE if extension should be deactivated for client.
if init == NULL, it stays activated. */
rfbBool (*init)(struct _rfbClientRec* client, void* data);
- /* if pseudoEncodings is not NULL, it contains a 0 terminated
+ /** if pseudoEncodings is not NULL, it contains a 0 terminated
list of the pseudo encodings handled by this extension. */
int *pseudoEncodings;
- /* returns TRUE if that pseudo encoding is handled by the extension.
+ /** returns TRUE if that pseudo encoding is handled by the extension.
encodingNumber==0 means "reset encodings". */
rfbBool (*enablePseudoEncoding)(struct _rfbClientRec* client,
void** data, int encodingNumber);
- /* returns TRUE if message was handled */
+ /** returns TRUE if message was handled */
rfbBool (*handleMessage)(struct _rfbClientRec* client,
void* data,
const rfbClientToServerMsg* message);
void (*close)(struct _rfbClientRec* client, void* data);
void (*usage)(void);
- /* processArguments returns the number of handled arguments */
+ /** processArguments returns the number of handled arguments */
int (*processArgument)(int argc, char *argv[]);
struct _rfbProtocolExtension* next;
} rfbProtocolExtension;
@@ -210,7 +223,7 @@ typedef struct _rfbExtensionData {
struct _rfbExtensionData* next;
} rfbExtensionData;
-/*
+/**
* Per-screen (framebuffer) structure. There can be as many as you wish,
* each serving different clients. However, you have to call
* rfbProcessEvents for each of these.
@@ -218,7 +231,7 @@ typedef struct _rfbExtensionData {
typedef struct _rfbScreenInfo
{
- /* this structure has children that are scaled versions of this screen */
+ /** this structure has children that are scaled versions of this screen */
struct _rfbScreenInfo *scaledScreenNext;
int scaledScreenRefCount;
@@ -232,16 +245,17 @@ typedef struct _rfbScreenInfo
rfbPixel blackPixel;
rfbPixel whitePixel;
- /* some screen specific data can be put into a struct where screenData
+ /**
+ * some screen specific data can be put into a struct where screenData
* points to. You need this if you have more than one screen at the
* same time while using the same functions.
*/
void* screenData;
-
+
/* additions by libvncserver */
rfbPixelFormat serverFormat;
- rfbColourMap colourMap; /* set this if rfbServerFormat.trueColour==FALSE */
+ rfbColourMap colourMap; /**< set this if rfbServerFormat.trueColour==FALSE */
const char* desktopName;
char thisHost[255];
@@ -278,13 +292,13 @@ typedef struct _rfbScreenInfo
rfbPasswordCheckProcPtr passwordCheck;
void* authPasswdData;
- /* If rfbAuthPasswdData is given a list, this is the first
- view only password. */
+ /** If rfbAuthPasswdData is given a list, this is the first
+ view only password. */
int authPasswdFirstViewOnly;
- /* send only this many rectangles in one update */
+ /** send only this many rectangles in one update */
int maxRectsPerUpdate;
- /* this is the amount of milliseconds to wait at least before sending
+ /** this is the amount of milliseconds to wait at least before sending
* an update. */
int deferUpdateTime;
#ifdef TODELETE
@@ -294,7 +308,7 @@ typedef struct _rfbScreenInfo
rfbBool neverShared;
rfbBool dontDisconnect;
struct _rfbClientRec* clientHead;
- struct _rfbClientRec* pointerClient; /* "Mutex" for pointer events */
+ struct _rfbClientRec* pointerClient; /**< "Mutex" for pointer events */
/* cursor */
@@ -303,8 +317,9 @@ typedef struct _rfbScreenInfo
rfbBool dontConvertRichCursorToXCursor;
struct rfbCursor* cursor;
- /* the frameBufferhas to be supplied by the serving process.
- * The buffer will not be freed by
+ /**
+ * the frameBuffer has to be supplied by the serving process.
+ * The buffer will not be freed by
*/
char* frameBuffer;
rfbKbdAddEventProcPtr kbdAddEvent;
@@ -317,13 +332,13 @@ typedef struct _rfbScreenInfo
rfbSetServerInputProcPtr setServerInput;
rfbFileTransferPermitted getFileTransferPermission;
rfbSetTextChat setTextChat;
-
- /* newClientHook is called just after a new client is created */
+
+ /** newClientHook is called just after a new client is created */
rfbNewClientHookPtr newClientHook;
- /* displayHook is called just before a frame buffer update */
+ /** displayHook is called just before a frame buffer update */
rfbDisplayHookPtr displayHook;
- /* These hooks are called to pass keyboard state back to the client */
+ /** These hooks are called to pass keyboard state back to the client */
rfbGetKeyboardLedStateHookPtr getKeyboardLedStateHook;
#ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
@@ -331,10 +346,10 @@ typedef struct _rfbScreenInfo
rfbBool backgroundLoop;
#endif
- /* if TRUE, an ignoring signal handler is installed for SIGPIPE */
+ /** if TRUE, an ignoring signal handler is installed for SIGPIPE */
rfbBool ignoreSIGPIPE;
- /* if not zero, only a slice of this height is processed every time
+ /** if not zero, only a slice of this height is processed every time
* an update should be sent. This should make working on a slow
* link more interactive. */
int progressiveSliceHeight;
@@ -342,27 +357,39 @@ typedef struct _rfbScreenInfo
in_addr_t listenInterface;
int deferPtrUpdateTime;
- /* handle as many input events as possible (default off) */
+ /** handle as many input events as possible (default off) */
rfbBool handleEventsEagerly;
- /* rfbEncodingServerIdentity */
+ /** rfbEncodingServerIdentity */
char *versionString;
- /* What does the server tell the new clients which version it supports */
+ /** What does the server tell the new clients which version it supports */
int protocolMajorVersion;
int protocolMinorVersion;
- /* command line authorization of file transfers */
+ /** command line authorization of file transfers */
rfbBool permitFileTransfer;
- /* displayFinishedHook is called just after a frame buffer update */
+ /** displayFinishedHook is called just after a frame buffer update */
rfbDisplayFinishedHookPtr displayFinishedHook;
- /* xvpHook is called to handle an xvp client message */
+ /** xvpHook is called to handle an xvp client message */
rfbXvpHookPtr xvpHook;
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ char *sslkeyfile;
+ char *sslcertfile;
+#endif
+ int ipv6port; /**< The port to listen on when using IPv6. */
+ char* listen6Interface;
+ /* We have an additional IPv6 listen socket since there are systems that
+ don't support dual binding sockets under *any* circumstances, for
+ instance OpenBSD */
+ SOCKET listen6Sock;
+ int http6Port;
+ SOCKET httpListen6Sock;
} rfbScreenInfo, *rfbScreenInfoPtr;
-/*
+/**
* rfbTranslateFnType is the type of translation functions.
*/
@@ -405,18 +432,21 @@ typedef struct _rfbStatList {
struct _rfbStatList *Next;
} rfbStatList;
+typedef struct _rfbSslCtx rfbSslCtx;
+typedef struct _wsCtx wsCtx;
+
typedef struct _rfbClientRec {
-
- /* back pointer to the screen */
+
+ /** back pointer to the screen */
rfbScreenInfoPtr screen;
- /* points to a scaled version of the screen buffer in cl->scaledScreenList */
+ /** points to a scaled version of the screen buffer in cl->scaledScreenList */
rfbScreenInfoPtr scaledScreen;
- /* how did the client tell us it wanted the screen changed? Ultra style or palm style? */
+ /** how did the client tell us it wanted the screen changed? Ultra style or palm style? */
rfbBool PalmVNC;
-
-
- /* private data. You should put any application client specific data
+
+
+ /** private data. You should put any application client specific data
* into a struct and let clientData point to it. Don't forget to
* free the struct via clientGoneHook!
*
@@ -435,13 +465,44 @@ typedef struct _rfbClientRec {
#ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
pthread_t client_thread;
#endif
- /* Possible client states: */
+
+ /* Note that the RFB_INITIALISATION_SHARED state is provided to support
+ clients that under some circumstances do not send a ClientInit message.
+ In particular the Mac OS X built-in VNC client (with protocolMinorVersion
+ == 889) is one of those. However, it only requires this support under
+ special circumstances that can only be determined during the initial
+ authentication. If the right conditions are met this state will be
+ set (see the auth.c file) when rfbProcessClientInitMessage is called.
+
+ If the state is RFB_INITIALISATION_SHARED we should not expect to recieve
+ any ClientInit message, but instead should proceed to the next stage
+ of initialisation as though an implicit ClientInit message was received
+ with a shared-flag of true. (There is currently no corresponding
+ RFB_INITIALISATION_NOTSHARED state to represent an implicit ClientInit
+ message with a shared-flag of false because no known existing client
+ requires such support at this time.)
+
+ Note that software using LibVNCServer to provide a VNC server will only
+ ever have a chance to see the state field set to
+ RFB_INITIALISATION_SHARED if the software is multi-threaded and manages
+ to examine the state field during the extremely brief window after the
+ 'None' authentication type selection has been received from the built-in
+ OS X VNC client and before the rfbProcessClientInitMessage function is
+ called -- control cannot return to the caller during this brief window
+ while the state field is set to RFB_INITIALISATION_SHARED. */
+
+ /** Possible client states: */
enum {
- RFB_PROTOCOL_VERSION, /* establishing protocol version */
- RFB_SECURITY_TYPE, /* negotiating security (RFB v.3.7) */
- RFB_AUTHENTICATION, /* authenticating */
- RFB_INITIALISATION, /* sending initialisation messages */
- RFB_NORMAL /* normal protocol messages */
+ RFB_PROTOCOL_VERSION, /**< establishing protocol version */
+ RFB_SECURITY_TYPE, /**< negotiating security (RFB v.3.7) */
+ RFB_AUTHENTICATION, /**< authenticating */
+ RFB_INITIALISATION, /**< sending initialisation messages */
+ RFB_NORMAL, /**< normal protocol messages */
+
+ /* Ephemeral internal-use states that will never be seen by software
+ * using LibVNCServer to provide services: */
+
+ RFB_INITIALISATION_SHARED /**< sending initialisation messages with implicit shared-flag already true */
} state;
rfbBool reverseConnection;
@@ -479,19 +540,19 @@ typedef struct _rfbClientRec {
the destination copyRegion. Just before an update is sent we remove
from the copyRegion anything in the modifiedRegion. */
- sraRegionPtr copyRegion; /* the destination region of the copy */
- int copyDX, copyDY; /* the translation by which the copy happens */
+ sraRegionPtr copyRegion; /**< the destination region of the copy */
+ int copyDX, copyDY; /**< the translation by which the copy happens */
sraRegionPtr modifiedRegion;
- /* As part of the FramebufferUpdateRequest, a client can express interest
+ /** As part of the FramebufferUpdateRequest, a client can express interest
in a subrectangle of the whole framebuffer. This is stored in the
requestedRegion member. In the normal case this is the whole
framebuffer if the client is ready, empty if it's not. */
sraRegionPtr requestedRegion;
- /* The following member represents the state of the "deferred update" timer
+ /** The following member represents the state of the "deferred update" timer
- when the framebuffer is modified and the client is ready, in most
cases it is more efficient to defer sending the update by a few
milliseconds so that several changes to the framebuffer can be combined
@@ -503,14 +564,14 @@ typedef struct _rfbClientRec {
int lastPtrY;
int lastPtrButtons;
- /* translateFn points to the translation function which is used to copy
+ /** translateFn points to the translation function which is used to copy
and translate a rectangle from the framebuffer to an output buffer. */
rfbTranslateFnType translateFn;
char *translateLookupTable;
rfbPixelFormat format;
- /*
+ /**
* UPDATE_BUF_SIZE must be big enough to send at least one whole line of the
* framebuffer. So for a max screen width of say 2K with 32-bit pixels this
* means 8K minimum.
@@ -526,14 +587,16 @@ typedef struct _rfbClientRec {
struct _rfbStatList *statMsgList;
int rawBytesEquivalent;
int bytesSent;
-
+
#ifdef LIBVNCSERVER_HAVE_LIBZ
/* zlib encoding -- necessary compression state info per client */
struct z_stream_s compStream;
rfbBool compStreamInited;
uint32_t zlibCompressLevel;
- /* the quality level is also used by ZYWRLE */
+#endif
+#if defined(LIBVNCSERVER_HAVE_LIBZ) || defined(LIBVNCSERVER_HAVE_LIBPNG)
+ /** the quality level is also used by ZYWRLE and TightPng */
int tightQualityLevel;
#ifdef LIBVNCSERVER_HAVE_LIBJPEG
@@ -551,28 +614,28 @@ typedef struct _rfbClientRec {
rfbFileTransferData fileTransfer;
- int lastKeyboardLedState; /* keep track of last value so we can send *change* events */
- rfbBool enableSupportedMessages; /* client supports SupportedMessages encoding */
- rfbBool enableSupportedEncodings; /* client supports SupportedEncodings encoding */
- rfbBool enableServerIdentity; /* client supports ServerIdentity encoding */
- rfbBool enableKeyboardLedState; /* client supports KeyboardState encoding */
- rfbBool enableLastRectEncoding; /* client supports LastRect encoding */
- rfbBool enableCursorShapeUpdates; /* client supports cursor shape updates */
- rfbBool enableCursorPosUpdates; /* client supports cursor position updates */
- rfbBool useRichCursorEncoding; /* rfbEncodingRichCursor is preferred */
- rfbBool cursorWasChanged; /* cursor shape update should be sent */
- rfbBool cursorWasMoved; /* cursor position update should be sent */
- int cursorX,cursorY; /* the coordinates of the cursor,
+ int lastKeyboardLedState; /**< keep track of last value so we can send *change* events */
+ rfbBool enableSupportedMessages; /**< client supports SupportedMessages encoding */
+ rfbBool enableSupportedEncodings; /**< client supports SupportedEncodings encoding */
+ rfbBool enableServerIdentity; /**< client supports ServerIdentity encoding */
+ rfbBool enableKeyboardLedState; /**< client supports KeyboardState encoding */
+ rfbBool enableLastRectEncoding; /**< client supports LastRect encoding */
+ rfbBool enableCursorShapeUpdates; /**< client supports cursor shape updates */
+ rfbBool enableCursorPosUpdates; /**< client supports cursor position updates */
+ rfbBool useRichCursorEncoding; /**< rfbEncodingRichCursor is preferred */
+ rfbBool cursorWasChanged; /**< cursor shape update should be sent */
+ rfbBool cursorWasMoved; /**< cursor position update should be sent */
+ int cursorX,cursorY; /**< the coordinates of the cursor,
if enableCursorShapeUpdates = FALSE */
- rfbBool useNewFBSize; /* client supports NewFBSize encoding */
- rfbBool newFBSizePending; /* framebuffer size was changed */
+ rfbBool useNewFBSize; /**< client supports NewFBSize encoding */
+ rfbBool newFBSizePending; /**< framebuffer size was changed */
struct _rfbClientRec *prev;
struct _rfbClientRec *next;
#ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
- /* whenever a client is referenced, the refCount has to be incremented
+ /** whenever a client is referenced, the refCount has to be incremented
and afterwards decremented, so that the client is not cleaned up
while being referenced.
Use the functions rfbIncrClientRef(cl) and rfbDecrClientRef(cl);
@@ -592,17 +655,17 @@ typedef struct _rfbClientRec {
int zywrleBuf[rfbZRLETileWidth * rfbZRLETileHeight];
#endif
- /* if progressive updating is on, this variable holds the current
+ /** if progressive updating is on, this variable holds the current
* y coordinate of the progressive slice. */
int progressiveSliceY;
rfbExtensionData* extensions;
- /* for threaded zrle */
+ /** for threaded zrle */
char *zrleBeforeBuf;
void *paletteHelper;
- /* for thread safety for rfbSendFBUpdate() */
+ /** for thread safety for rfbSendFBUpdate() */
#ifdef LIBVNCSERVER_HAVE_LIBPTHREAD
#define LIBVNCSERVER_SEND_MUTEX
MUTEX(sendMutex);
@@ -615,9 +678,23 @@ typedef struct _rfbClientRec {
char *afterEncBuf;
int afterEncBufSize;
int afterEncBufLen;
+#if defined(LIBVNCSERVER_HAVE_LIBZ) || defined(LIBVNCSERVER_HAVE_LIBPNG)
+ uint32_t tightEncoding; /* rfbEncodingTight or rfbEncodingTightPng */
+#ifdef LIBVNCSERVER_HAVE_LIBJPEG
+ /* TurboVNC Encoding support (extends TightVNC) */
+ int turboSubsampLevel;
+ int turboQualityLevel; /* 1-100 scale */
+#endif
+#endif
+
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+ rfbSslCtx *sslctx;
+ wsCtx *wsctx;
+ char *wspath; /* Requests path component */
+#endif
} rfbClientRec, *rfbClientPtr;
-/*
+/**
* This macro is used to test whether there is a framebuffer update needing to
* be sent to the client.
*/
@@ -667,15 +744,26 @@ extern void rfbDisconnectUDPSock(rfbScreenInfoPtr rfbScreen);
extern void rfbCloseClient(rfbClientPtr cl);
extern int rfbReadExact(rfbClientPtr cl, char *buf, int len);
extern int rfbReadExactTimeout(rfbClientPtr cl, char *buf, int len,int timeout);
+extern int rfbPeekExactTimeout(rfbClientPtr cl, char *buf, int len,int timeout);
extern int rfbWriteExact(rfbClientPtr cl, const char *buf, int len);
extern int rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec);
extern int rfbConnect(rfbScreenInfoPtr rfbScreen, char* host, int port);
extern int rfbConnectToTcpAddr(char* host, int port);
extern int rfbListenOnTCPPort(int port, in_addr_t iface);
+extern int rfbListenOnTCP6Port(int port, const char* iface);
extern int rfbListenOnUDPPort(int port, in_addr_t iface);
extern int rfbStringToAddr(char* string,in_addr_t* addr);
extern rfbBool rfbSetNonBlocking(int sock);
+#ifdef LIBVNCSERVER_WITH_WEBSOCKETS
+/* websockets.c */
+
+extern rfbBool webSocketsCheck(rfbClientPtr cl);
+extern rfbBool webSocketCheckDisconnect(rfbClientPtr cl);
+extern int webSocketsEncode(rfbClientPtr cl, const char *src, int len, char **dst);
+extern int webSocketsDecode(rfbClientPtr cl, char *dst, int len);
+#endif
+
/* rfbserver.c */
/* Routines to iterate over the client list in a thread-safe way.
@@ -776,7 +864,7 @@ extern rfbBool rfbSendRectEncodingUltra(rfbClientPtr cl, int x,int y,int w,int h
#ifdef LIBVNCSERVER_HAVE_LIBZ
/* zlib.c */
-/* Minimum zlib rectangle size in bytes. Anything smaller will
+/** Minimum zlib rectangle size in bytes. Anything smaller will
* not compress well due to overhead.
*/
#define VNC_ENCODE_ZLIB_MIN_COMP_SIZE (17)
@@ -795,12 +883,18 @@ extern rfbBool rfbSendRectEncodingZlib(rfbClientPtr cl, int x, int y, int w,
/* tight.c */
#define TIGHT_DEFAULT_COMPRESSION 6
+#define TURBO_DEFAULT_SUBSAMP 0
extern rfbBool rfbTightDisableGradient;
extern int rfbNumCodedRectsTight(rfbClientPtr cl, int x,int y,int w,int h);
+
extern rfbBool rfbSendRectEncodingTight(rfbClientPtr cl, int x,int y,int w,int h);
+#if defined(LIBVNCSERVER_HAVE_LIBPNG)
+extern rfbBool rfbSendRectEncodingTightPng(rfbClientPtr cl, int x,int y,int w,int h);
+#endif
+
#endif
#endif
@@ -808,16 +902,16 @@ extern rfbBool rfbSendRectEncodingTight(rfbClientPtr cl, int x,int y,int w,int h
/* cursor.c */
typedef struct rfbCursor {
- /* set this to true if LibVNCServer has to free this cursor */
+ /** set this to true if LibVNCServer has to free this cursor */
rfbBool cleanup, cleanupSource, cleanupMask, cleanupRichSource;
- unsigned char *source; /* points to bits */
- unsigned char *mask; /* points to bits */
- unsigned short width, height, xhot, yhot; /* metrics */
- unsigned short foreRed, foreGreen, foreBlue; /* device-independent colour */
- unsigned short backRed, backGreen, backBlue; /* device-independent colour */
- unsigned char *richSource; /* source bytes for a rich cursor */
- unsigned char *alphaSource; /* source for alpha blending info */
- rfbBool alphaPreMultiplied; /* if richSource already has alpha applied */
+ unsigned char *source; /**< points to bits */
+ unsigned char *mask; /**< points to bits */
+ unsigned short width, height, xhot, yhot; /**< metrics */
+ unsigned short foreRed, foreGreen, foreBlue; /**< device-independent colour */
+ unsigned short backRed, backGreen, backBlue; /**< device-independent colour */
+ unsigned char *richSource; /**< source bytes for a rich cursor */
+ unsigned char *alphaSource; /**< source for alpha blending info */
+ rfbBool alphaPreMultiplied; /**< if richSource already has alpha applied */
} rfbCursor, *rfbCursorPtr;
extern unsigned char rfbReverseByte[0x100];
@@ -832,7 +926,7 @@ extern void rfbMakeRichCursorFromXCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr
extern void rfbFreeCursor(rfbCursorPtr cursor);
extern void rfbSetCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr c);
-/* cursor handling for the pointer */
+/** cursor handling for the pointer */
extern void rfbDefaultPtrAddEvent(int buttonMask,int x,int y,rfbClientPtr cl);
/* zrle.c */
@@ -849,7 +943,7 @@ extern void rfbPrintStats(rfbClientPtr cl);
typedef struct rfbFontData {
unsigned char* data;
- /*
+ /**
metaData is a 256*5 array:
for each character
(offset,width,height,x,y)
@@ -859,18 +953,18 @@ typedef struct rfbFontData {
int rfbDrawChar(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,unsigned char c,rfbPixel colour);
void rfbDrawString(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,const char* string,rfbPixel colour);
-/* if colour==backColour, background is transparent */
+/** if colour==backColour, background is transparent */
int rfbDrawCharWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,unsigned char c,int x1,int y1,int x2,int y2,rfbPixel colour,rfbPixel backColour);
void rfbDrawStringWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,const char* string,int x1,int y1,int x2,int y2,rfbPixel colour,rfbPixel backColour);
int rfbWidthOfString(rfbFontDataPtr font,const char* string);
int rfbWidthOfChar(rfbFontDataPtr font,unsigned char c);
void rfbFontBBox(rfbFontDataPtr font,unsigned char c,int* x1,int* y1,int* x2,int* y2);
-/* this returns the smallest box enclosing any character of font. */
+/** this returns the smallest box enclosing any character of font. */
void rfbWholeFontBBox(rfbFontDataPtr font,int *x1, int *y1, int *x2, int *y2);
-/* dynamically load a linux console font (4096 bytes, 256 glyphs a 8x16 */
+/** dynamically load a linux console font (4096 bytes, 256 glyphs a 8x16 */
rfbFontDataPtr rfbLoadConsoleFont(char *filename);
-/* free a dynamically loaded font */
+/** free a dynamically loaded font */
void rfbFreeFont(rfbFontDataPtr font);
/* draw.c */
@@ -881,7 +975,7 @@ void rfbDrawLine(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,rfbPixel col);
/* selbox.c */
-/* this opens a modal select box. list is an array of strings, the end marked
+/** this opens a modal select box. list is an array of strings, the end marked
with a NULL.
It returns the index in the list or -1 if cancelled or something else
wasn't kosher. */
@@ -925,7 +1019,7 @@ rfbBool rfbEnableExtension(rfbClientPtr cl, rfbProtocolExtension* extension,
rfbBool rfbDisableExtension(rfbClientPtr cl, rfbProtocolExtension* extension);
void* rfbGetExtensionClientData(rfbClientPtr cl, rfbProtocolExtension* extension);
-/* to check against plain passwords */
+/** to check against plain passwords */
rfbBool rfbCheckPasswordByList(rfbClientPtr cl,const char* response,int len);
/* functions to make a vnc server */
@@ -959,7 +1053,7 @@ extern rfbBool rfbIsActive(rfbScreenInfoPtr screenInfo);
/* TightVNC file transfer extension */
void rfbRegisterTightVNCFileTransferExtension();
-void rfbUnregisterTightVNCFileTransferExtension();
+void rfbUnregisterTightVNCFileTransferExtension();
/* Statistics */
extern char *messageNameServer2Client(uint32_t type, char *buf, int len);
@@ -987,10 +1081,10 @@ extern int rfbStatGetMessageCountRcvd(rfbClientPtr cl, uint32_t type);
extern int rfbStatGetEncodingCountSent(rfbClientPtr cl, uint32_t type);
extern int rfbStatGetEncodingCountRcvd(rfbClientPtr cl, uint32_t type);
-/* Set which version you want to advertise 3.3, 3.6, 3.7 and 3.8 are currently supported*/
+/** Set which version you want to advertise 3.3, 3.6, 3.7 and 3.8 are currently supported*/
extern void rfbSetProtocolVersion(rfbScreenInfoPtr rfbScreen, int major_, int minor_);
-/* send a TextChat message to a client */
+/** send a TextChat message to a client */
extern rfbBool rfbSendTextChatMessage(rfbClientPtr cl, uint32_t length, char *buffer);
@@ -1006,5 +1100,174 @@ rfbBool rfbUpdateClient(rfbClientPtr cl);
}
#endif
-#endif
+/**
+ * @}
+ */
+
+/**
+ @page libvncserver_doc LibVNCServer Documentation
+ @section create_server Creating a server instance
+ To make a server, you just have to initialise a server structure using the
+ function rfbGetScreen(), like
+ @code
+ rfbScreenInfoPtr screen =
+ rfbGetScreen(argc,argv,screenwidth,screenheight,8,3,bpp);
+ @endcode
+ 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.c).
+
+ You then can set hooks and io functions (see @ref making_it_interactive) or other
+ options (see @ref server_options).
+
+ And you allocate the frame buffer like this:
+ @code
+ screen->frameBuffer = (char*)malloc(screenwidth*screenheight*bpp);
+ @endcode
+ After that, you initialize the server, like
+ @code
+ rfbInitServer(screen);
+ @endcode
+ You can use a blocking event loop, a background (pthread based) event loop,
+ or implement your own using the rfbProcessEvents() function.
+
+ @subsection server_options Optional Server Features
+
+ These options have to be set between rfbGetScreen() and rfbInitServer().
+
+ If you already have a socket to talk to, just set rfbScreenInfo::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 rfbScreenInfo::httpDir to a directory containing vncviewer.jar and
+ index.vnc (like the included "webclients" directory).
+
+ @section making_it_interactive Making it interactive
+
+ Whenever you draw something, you have to call
+ @code
+ rfbMarkRectAsModified(screen,x1,y1,x2,y2).
+ @endcode
+ This tells LibVNCServer to send updates to all connected clients.
+
+ There exist the following IO functions as members of rfbScreen:
+ rfbScreenInfo::kbdAddEvent(), rfbScreenInfo::kbdReleaseAllKeys(), rfbScreenInfo::ptrAddEvent() and rfbScreenInfo::setXCutText()
+
+ rfbScreenInfo::kbdAddEvent()
+ is called when a key is pressed.
+ rfbScreenInfo::kbdReleaseAllKeys()
+ is not called at all (maybe in the future).
+ rfbScreenInfo::ptrAddEvent()
+ is called when the mouse moves or a button is pressed.
+ WARNING: if you want to have proper cursor handling, call
+ rfbDefaultPtrAddEvent()
+ in your own function. This sets the coordinates of the cursor.
+ rfbScreenInfo::setXCutText()
+ is called when the selection changes.
+
+ There are only two hooks:
+ rfbScreenInfo::newClientHook()
+ is called when a new client has connected.
+ rfbScreenInfo::displayHook()
+ is called just before a frame buffer update is sent.
+
+ You can also override the following methods:
+ rfbScreenInfo::getCursorPtr()
+ This could be used to make an animated cursor (if you really want ...)
+ rfbScreenInfo::setTranslateFunction()
+ If you insist on colour maps or something more obscure, you have to
+ implement this. Default is a trueColour mapping.
+
+ @section cursor_handling Cursor handling
+
+ The screen holds a pointer
+ rfbScreenInfo::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 rfbCursor::mask
+ describes, which pixels are drawn for the cursor (a cursor needn't be
+ rectangular). The rfbCursor::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:
+ @code
+ char* cur=" "
+ " xx "
+ " x "
+ " ";
+ char* mask="xxxx"
+ "xxxx"
+ "xxxx"
+ "xxx ";
+ rfbCursorPtr c=rfbMakeXCursor(4,4,cur,mask);
+ @endcode
+ You can even set rfbCursor::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 rfbCursor::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).
+
+ @section screen_client_difference 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 rfbClientRec::screen which points to the server.
+ So, to access the server from the client structure, you use client->screen.
+
+ To access all clients from a server be sure to use the provided iterator
+ rfbGetClientIterator()
+ with
+ rfbClientIteratorNext()
+ and
+ rfbReleaseClientIterator()
+ to prevent thread clashes.
+
+ @section example_code Example Code
+
+ There are two documented examples included:
+ - example.c, a shared scribble sheet
+ - pnmshow.c, 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.c: it outputs on which port it listens (default: 5900), so it is
+ display 0. To view, call @code vncviewer :0 @endcode
+ 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,
+ whereas when you drag the mouse while clicked you draw a line. The size of the
+ blot 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 @code vncviewer machine.where.example.runs.com:0 @endcode
+ 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 to the position of the pointer! If you are done with that demo, press
+ the down or up arrows. If your viewer supports it, then the dimensions of the
+ sheet change. 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. You can press "Page Up" for a blank page.
+
+ The demo pnmshow.c 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.
+*/
+
+#endif
diff --git a/lib/include/rfb/rfbclient.h b/lib/include/rfb/rfbclient.h
index 758792a..5703468 100644
--- a/lib/include/rfb/rfbclient.h
+++ b/lib/include/rfb/rfbclient.h
@@ -1,6 +1,11 @@
#ifndef RFBCLIENT_H
#define RFBCLIENT_H
+/**
+ * @defgroup libvncclient_api LibVNCClient API Reference
+ * @{
+ */
+
/*
* Copyright (C) 2000, 2001 Const Kaplinsky. All Rights Reserved.
* Copyright (C) 2000 Tridia Corporation. All Rights Reserved.
@@ -22,8 +27,8 @@
* USA.
*/
-/*
- * vncviewer.h
+/**
+ * @file rfbclient.h
*/
#include <stdio.h>
@@ -33,9 +38,6 @@
#include <unistd.h>
#include <rfb/rfbproto.h>
#include <rfb/keysym.h>
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
-#include <gnutls/gnutls.h>
-#endif
#define rfbClientSwap16IfLE(s) \
(*(char *)&client->endianTest ? ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff)) : (s))
@@ -72,7 +74,7 @@ extern "C"
{
#endif
-/* vncrec */
+/** vncrec */
typedef struct {
FILE* file;
@@ -81,7 +83,7 @@ typedef struct {
rfbBool doNotSleep;
} rfbVNCRec;
-/* client data */
+/** client data */
typedef struct rfbClientData {
void* tag;
@@ -89,7 +91,7 @@ typedef struct rfbClientData {
struct rfbClientData* next;
} rfbClientData;
-/* app data (belongs into rfbClient?) */
+/** app data (belongs into rfbClient?) */
typedef struct {
rfbBool shareDesktop;
@@ -107,14 +109,14 @@ typedef struct {
int qualityLevel;
rfbBool enableJPEG;
rfbBool useRemoteCursor;
- rfbBool palmVNC; /* use palmvnc specific SetScale (vs ultravnc) */
- int scaleSetting; /* 0 means no scale set, else 1/scaleSetting */
+ rfbBool palmVNC; /**< use palmvnc specific SetScale (vs ultravnc) */
+ int scaleSetting; /**< 0 means no scale set, else 1/scaleSetting */
} AppData;
-/* For GetCredentialProc callback function to return */
+/** For GetCredentialProc callback function to return */
typedef union _rfbCredential
{
- /* X509 (VeNCrypt) */
+ /** X509 (VeNCrypt) */
struct
{
char *x509CACertFile;
@@ -122,7 +124,7 @@ typedef union _rfbCredential
char *x509ClientCertFile;
char *x509ClientKeyFile;
} x509Credential;
- /* Plain (VeNCrypt), MSLogon (UltraVNC) */
+ /** Plain (VeNCrypt), MSLogon (UltraVNC) */
struct
{
char *username;
@@ -135,7 +137,26 @@ typedef union _rfbCredential
struct _rfbClient;
+/**
+ * Handles a text chat message. If your application should accept text messages
+ * from the server, define a function with this prototype and set
+ * client->HandleTextChat to a pointer to that function subsequent to your
+ * rfbGetClient() call.
+ * @param client The client which called the text chat handler
+ * @param value text length if text != NULL, or one of rfbTextChatOpen,
+ * rfbTextChatClose, rfbTextChatFinished if text == NULL
+ * @param text The text message from the server
+ */
typedef void (*HandleTextChatProc)(struct _rfbClient* client, int value, char *text);
+/**
+ * Handles XVP server messages. If your application sends XVP messages to the
+ * server, you'll want to handle the server's XVP_FAIL and XVP_INIT responses.
+ * Define a function with this prototype and set client->HandleXvpMsg to a
+ * pointer to that function subsequent to your rfbGetClient() call.
+ * @param client The client which called the XVP message handler
+ * @param version The highest XVP extension version that the server supports
+ * @param opcode The opcode. 0 is XVP_FAIL, 1 is XVP_INIT
+ */
typedef void (*HandleXvpMsgProc)(struct _rfbClient* client, uint8_t version, uint8_t opcode);
typedef void (*HandleKeyboardLedStateProc)(struct _rfbClient* client, int value, int pad);
typedef rfbBool (*HandleCursorPosProc)(struct _rfbClient* client, int x, int y);
@@ -162,7 +183,7 @@ typedef struct _rfbClient {
const char* programName;
char* serverHost;
- int serverPort; /* if -1, then use file recorded by vncrec */
+ int serverPort; /**< if -1, then use file recorded by vncrec */
rfbBool listenSpecified;
int listenPort, flashPort;
@@ -170,7 +191,7 @@ typedef struct _rfbClient {
int x, y, w, h;
} updateRect;
- /* Note that the CoRRE encoding uses this buffer and assumes it is big enough
+ /** Note that the CoRRE encoding uses this buffer and assumes it is big enough
to hold 255 * 255 * 32 bits -> 260100 bytes. 640*480 = 307200 bytes.
Hextile also assumes it is big enough to hold 16 * 16 * 32 bits.
Tight encoding assumes BUFFER_SIZE is at least 16384 bytes. */
@@ -187,9 +208,6 @@ typedef struct _rfbClient {
rfbPixelFormat format;
rfbServerInitMsg si;
- /* listen.c */
- int listenSock;
-
/* sockets.c */
#define RFB_BUF_SIZE 8192
char buf[RFB_BUF_SIZE];
@@ -221,7 +239,7 @@ typedef struct _rfbClient {
* Variables for the ``tight'' encoding implementation.
*/
- /* Separate buffer for compressed data. */
+ /** Separate buffer for compressed data. */
#define ZLIB_BUFFER_SIZE 30000
char zlib_buffer[ZLIB_BUFFER_SIZE];
@@ -236,7 +254,7 @@ typedef struct _rfbClient {
uint8_t tightPrevRow[2048*3*sizeof(uint16_t)];
#ifdef LIBVNCSERVER_HAVE_LIBJPEG
- /* JPEG decoder state. */
+ /** JPEG decoder state. */
rfbBool jpegError;
struct jpeg_source_mgr* jpegSrcManager;
@@ -250,7 +268,7 @@ typedef struct _rfbClient {
/* cursor.c */
uint8_t *rcSource, *rcMask;
- /* private data pointer */
+ /** private data pointer */
rfbClientData* clientData;
rfbVNCRec* vncRec;
@@ -268,8 +286,7 @@ typedef struct _rfbClient {
SoftCursorLockAreaProc SoftCursorLockArea;
SoftCursorUnlockScreenProc SoftCursorUnlockScreen;
GotFrameBufferUpdateProc GotFrameBufferUpdate;
- FinishedFrameBufferUpdateProc FinishedFrameBufferUpdate;
- /* the pointer returned by GetPassword will be freed after use! */
+ /** the pointer returned by GetPassword will be freed after use! */
GetPasswordProc GetPassword;
MallocFrameBufferProc MallocFrameBuffer;
GotXCutTextProc GotXCutText;
@@ -278,7 +295,7 @@ typedef struct _rfbClient {
GotCursorShapeProc GotCursorShape;
GotCopyRectProc GotCopyRect;
- /* Which messages are supported by the server
+ /** Which messages are supported by the server
* This is a *guess* for most servers.
* (If we can even detect the type of server)
*
@@ -288,18 +305,16 @@ typedef struct _rfbClient {
*/
rfbSupportedMessages supportedMessages;
- /* negotiated protocol version */
+ /** negotiated protocol version */
int major, minor;
- /* The selected security types */
+ /** The selected security types */
uint32_t authScheme, subAuthScheme;
-#ifdef LIBVNCSERVER_WITH_CLIENT_TLS
- /* The TLS session for Anonymous TLS and VeNCrypt */
- gnutls_session_t tlsSession;
-#endif
+ /** The TLS session for Anonymous TLS and VeNCrypt */
+ void* tlsSession;
- /* To support security types that requires user input (except VNC password
+ /** To support security types that requires user input (except VNC password
* authentication), for example VeNCrypt and MSLogon, this callback function
* must be set before the authentication. Otherwise, it implicates that the
* caller application does not support it and related security types should
@@ -307,19 +322,30 @@ typedef struct _rfbClient {
*/
GetCredentialProc GetCredential;
- /* The 0-terminated security types supported by the client.
+ /** The 0-terminated security types supported by the client.
* Set by function SetClientAuthSchemes() */
uint32_t *clientAuthSchemes;
- /* When the server is a repeater, this specifies the final destination */
+ /** When the server is a repeater, this specifies the final destination */
char *destHost;
int destPort;
- /* the QoS IP DSCP for this client */
+ /** the QoS IP DSCP for this client */
int QoS_DSCP;
- /* hook to handle xvp server messages */
+ /** hook to handle xvp server messages */
HandleXvpMsgProc HandleXvpMsg;
+
+ /* listen.c */
+ int listenSock;
+
+ FinishedFrameBufferUpdateProc FinishedFrameBufferUpdate;
+
+ char *listenAddress;
+ /* IPv6 listen socket, address and port*/
+ int listen6Sock;
+ char* listen6Address;
+ int listen6Port;
} rfbClient;
/* cursor.c */
@@ -340,19 +366,123 @@ extern rfbBool ConnectToRFBServer(rfbClient* client,const char *hostname, int po
extern rfbBool ConnectToRFBRepeater(rfbClient* client,const char *repeaterHost, int repeaterPort, const char *destHost, int destPort);
extern void SetClientAuthSchemes(rfbClient* client,const uint32_t *authSchemes, int size);
extern rfbBool InitialiseRFBConnection(rfbClient* client);
+/**
+ * Sends format and encoding parameters to the server. Your application can
+ * modify the 'client' data structure directly. However some changes to this
+ * structure must be communicated back to the server. For instance, if you
+ * change the encoding to hextile, the server needs to know that it should send
+ * framebuffer updates in hextile format. Likewise if you change the pixel
+ * format of the framebuffer, the server must be notified about this as well.
+ * Call this function to propagate your changes of the local 'client' structure
+ * over to the server.
+ * @li Encoding type
+ * @li RFB protocol extensions announced via pseudo-encodings
+ * @li Framebuffer pixel format (like RGB vs ARGB)
+ * @li Remote cursor support
+ * @param client The client in which the format or encodings have been changed
+ * @return true if the format or encodings were sent to the server successfully,
+ * false otherwise
+ */
extern rfbBool SetFormatAndEncodings(rfbClient* client);
extern rfbBool SendIncrementalFramebufferUpdateRequest(rfbClient* client);
+/**
+ * Sends a framebuffer update request to the server. A VNC client may request an
+ * update from the server at any time. You can also specify which portions of
+ * the screen you want updated. This can be handy if a pointer is at certain
+ * location and the user pressed a mouse button, for instance. Then you can
+ * immediately request an update of the region around the pointer from the
+ * server.
+ * @note The coordinate system is a left-handed Cartesian coordinate system with
+ * the Z axis (unused) pointing out of the screen. Alternately you can think of
+ * it as a right-handed Cartesian coordinate system with the Z axis pointing
+ * into the screen. The origin is at the upper left corner of the framebuffer.
+ * @param client The client through which to send the request
+ * @param x The horizontal position of the update request rectangle
+ * @param y The vertical position of the update request rectangle
+ * @param w The width of the update request rectangle
+ * @param h The height of the update request rectangle
+ * @param incremental false: server sends rectangle even if nothing changed.
+ * true: server only sends changed parts of rectangle.
+ * @return true if the update request was sent successfully, false otherwise
+ */
extern rfbBool SendFramebufferUpdateRequest(rfbClient* client,
int x, int y, int w, int h,
rfbBool incremental);
extern rfbBool SendScaleSetting(rfbClient* client,int scaleSetting);
+/**
+ * Sends a pointer event to the server. A pointer event includes a cursor
+ * location and a button mask. The button mask indicates which buttons on the
+ * pointing device are pressed. Each button is represented by a bit in the
+ * button mask. A 1 indicates the button is pressed while a 0 indicates that it
+ * is not pressed. You may use these pre-defined button masks by ORing them
+ * together: rfbButton1Mask, rfbButton2Mask, rfbButton3Mask, rfbButton4Mask
+ * rfbButton5Mask
+ * @note The cursor location is relative to the client's framebuffer, not the
+ * client's screen itself.
+ * @note The coordinate system is a left-handed Cartesian coordinate system with
+ * the Z axis (unused) pointing out of the screen. Alternately you can think of
+ * it as a right-handed Cartesian coordinate system with the Z axis pointing
+ * into the screen. The origin is at the upper left corner of the screen.
+ * @param client The client through which to send the pointer event
+ * @param x the horizontal location of the cursor
+ * @param y the vertical location of the cursor
+ * @param buttonMask the button mask indicating which buttons are pressed
+ * @return true if the pointer event was sent successfully, false otherwise
+ */
extern rfbBool SendPointerEvent(rfbClient* client,int x, int y, int buttonMask);
+/**
+ * Sends a key event to the server. If your application is not merely a VNC
+ * viewer (i.e. it controls the server), you'll want to send the keys that the
+ * user presses to the server. Use this function to do that.
+ * @param client The client through which to send the key event
+ * @param key An rfbKeySym defined in rfb/keysym.h
+ * @param down true if this was a key down event, false otherwise
+ * @return true if the key event was send successfully, false otherwise
+ */
extern rfbBool SendKeyEvent(rfbClient* client,uint32_t key, rfbBool down);
-extern rfbBool SendClientCutText(rfbClient* client,char *str, int len);
+/**
+ * Places a string on the server's clipboard. Use this function if you want to
+ * be able to copy and paste between the server and your application. For
+ * instance, when your application is notified that the user copied some text
+ * onto the clipboard, you would call this function to synchronize the server's
+ * clipboard with your local clipboard.
+ * @param client The client structure through which to send the client cut text
+ * message
+ * @param str The string to send (doesn't need to be NULL terminated)
+ * @param len The length of the string
+ * @return true if the client cut message was sent successfully, false otherwise
+ */
+extern rfbBool SendClientCutText(rfbClient* client,const char *str, int len);
+/**
+ * Handles messages from the RFB server. You must call this function
+ * intermittently so LibVNCClient can parse messages from the server. For
+ * example, if your app has a draw loop, you could place a call to this
+ * function within that draw loop.
+ * @note You must call WaitForMessage() before you call this function.
+ * @param client The client which will handle the RFB server messages
+ * @return true if the client was able to handle the RFB server messages, false
+ * otherwise
+ */
extern rfbBool HandleRFBServerMessage(rfbClient* client);
+/**
+ * Sends a text chat message to the server.
+ * @param client The client through which to send the message
+ * @param text The text to send
+ * @return true if the text was sent successfully, false otherwise
+ */
extern rfbBool TextChatSend(rfbClient* client, char *text);
+/**
+ * Opens a text chat window on the server.
+ * @param client The client through which to send the message
+ * @return true if the window was opened successfully, false otherwise
+ */
extern rfbBool TextChatOpen(rfbClient* client);
+/**
+ * Closes the text chat window on the server.
+ * @param client The client through which to send the message
+ * @return true if the window was closed successfully, false otherwise
+ */
extern rfbBool TextChatClose(rfbClient* client);
extern rfbBool TextChatFinish(rfbClient* client);
extern rfbBool PermitServerInput(rfbClient* client, int enabled);
@@ -365,17 +495,38 @@ extern rfbBool SupportsServer2Client(rfbClient* client, int messageType);
/* client data */
+/**
+ * Associates a client data tag with the given pointer. LibVNCClient has
+ * several events to which you can associate your own handlers. These handlers
+ * have the client structure as one of their parameters. Sometimes, you may want
+ * to make data from elsewhere in your application available to these handlers
+ * without using a global variable. To do this, you call
+ * rfbClientSetClientData() and associate the data with a tag. Then, your
+ * handler can call rfbClientGetClientData() and get the a pointer to the data
+ * associated with that tag.
+ * @param client The client in which to set the client data
+ * @param tag A unique tag which identifies the data
+ * @param data A pointer to the data to associate with the tag
+ */
void rfbClientSetClientData(rfbClient* client, void* tag, void* data);
+/**
+ * Returns a pointer to the client data associated with the given tag. See the
+ * the documentation for rfbClientSetClientData() for a discussion of how you
+ * can use client data.
+ * @param client The client from which to get the client data
+ * @param tag The tag which identifies the client data
+ * @return a pointer to the client data
+ */
void* rfbClientGetClientData(rfbClient* client, void* tag);
/* protocol extensions */
typedef struct _rfbClientProtocolExtension {
int* encodings;
- /* returns TRUE if the encoding was handled */
+ /** returns TRUE if the encoding was handled */
rfbBool (*handleEncoding)(rfbClient* cl,
rfbFramebufferUpdateRectHeader* rect);
- /* returns TRUE if it handled the message */
+ /** returns TRUE if it handled the message */
rfbBool (*handleMessage)(rfbClient* cl,
rfbServerToClientMsg* message);
struct _rfbClientProtocolExtension* next;
@@ -388,9 +539,10 @@ void rfbClientRegisterExtension(rfbClientProtocolExtension* e);
extern rfbBool errorMessageOnReadFailure;
extern rfbBool ReadFromRFBServer(rfbClient* client, char *out, unsigned int n);
-extern rfbBool WriteToRFBServer(rfbClient* client, char *buf, int n);
+extern rfbBool WriteToRFBServer(rfbClient* client, const char *buf, int n);
extern int FindFreeTcpPort(void);
extern int ListenAtTcpPort(int port);
+extern int ListenAtTcpPortAndAddress(int port, const char *address);
extern int ConnectClientToTcpAddr(unsigned int host, int port);
extern int ConnectClientToTcpAddr6(const char *hostname, int port);
extern int ConnectClientToUnixSock(const char *sockFile);
@@ -400,17 +552,97 @@ extern rfbBool SetDSCP(int sock, int dscp);
extern rfbBool StringToIPAddr(const char *str, unsigned int *addr);
extern rfbBool SameMachine(int sock);
+/**
+ * Waits for an RFB message to arrive from the server. Before handling a message
+ * with HandleRFBServerMessage(), you must wait for your client to receive one.
+ * This function blocks until a message is received. You may specify a timeout
+ * in microseconds. Once this number of microseconds have elapsed, the function
+ * will return.
+ * @param client The client to cause to wait until a message is received
+ * @param usecs The timeout in microseconds
+ * @return the return value of the underlying select() call
+ */
extern int WaitForMessage(rfbClient* client,unsigned int usecs);
/* vncviewer.c */
+/**
+ * Allocates and returns a pointer to an rfbClient structure. This will probably
+ * be the first LibVNCClient function your client code calls. Most libVNCClient
+ * functions operate on an rfbClient structure, and this function allocates
+ * memory for that structure. When you're done with the rfbClient structure
+ * pointer this function returns, you should free the memory rfbGetClient()
+ * allocated by calling rfbClientCleanup().
+ *
+ * A pixel is one dot on the screen. The number of bytes in a pixel will depend
+ * on the number of samples in that pixel and the number of bits in each sample.
+ * A sample represents one of the primary colors in a color model. The RGB
+ * color model uses red, green, and blue samples respectively. Suppose you
+ * wanted to use 16-bit RGB color: You would have three samples per pixel (one
+ * for each primary color), five bits per sample (the quotient of 16 RGB bits
+ * divided by three samples), and two bytes per pixel (the smallest multiple of
+ * eight bits in which the 16-bit pixel will fit). If you wanted 32-bit RGB
+ * color, you would have three samples per pixel again, eight bits per sample
+ * (since that's how 32-bit color is defined), and four bytes per pixel (the
+ * smallest multiple of eight bits in which the 32-bit pixel will fit.
+ * @param bitsPerSample The number of bits in a sample
+ * @param samplesPerPixel The number of samples in a pixel
+ * @param bytesPerPixel The number of bytes in a pixel
+ * @return a pointer to the allocated rfbClient structure
+ */
rfbClient* rfbGetClient(int bitsPerSample,int samplesPerPixel,int bytesPerPixel);
+/**
+ * Initializes the client. The format is {PROGRAM_NAME, [OPTIONS]..., HOST}. This
+ * function does not initialize the program name if the rfbClient's program
+ * name is set already. The options are as follows:
+ * <table>
+ * <tr><th>Option</th><th>Description</th></tr>
+ * <tr><td>-listen</td><td>Listen for incoming connections.</td></tr>
+ * <tr><td>-listennofork</td><td>Listen for incoming connections without forking.
+ * </td></tr>
+ * <tr><td>-play</td><td>Set this client to replay a previously recorded session.</td></tr>
+ * <tr><td>-encodings</td><td>Set the encodings to use. The next item in the
+ * argv array is the encodings string, consisting of comma separated encodings like 'tight,ultra,raw'.</td></tr>
+ * <tr><td>-compress</td><td>Set the compression level. The next item in the
+ * argv array is the compression level as an integer. Ranges from 0 (lowest) to 9 (highest).
+ * </td></tr>
+ * <tr><td>-scale</td><td>Set the scaling level. The next item in the
+ * argv array is the scaling level as an integer. The screen will be scaled down by this factor.</td></tr>
+ * <tr><td>-qosdscp</td><td>Set the Quality of Service Differentiated Services
+ * Code Point (QoS DSCP). The next item in the argv array is the code point as
+ * an integer.</td></tr>
+ * <tr><td>-repeaterdest</td><td>Set a VNC repeater address. The next item in the argv array is
+ * the repeater's address as a string.</td></tr>
+ * </table>
+ *
+ * The host may include a port number (delimited by a ':').
+ * @param client The client to initialize
+ * @param argc The number of arguments to the initializer
+ * @param argv The arguments to the initializer as an array of NULL terminated
+ * strings
+ * @return true if the client was initialized successfully, false otherwise.
+ */
rfbBool rfbInitClient(rfbClient* client,int* argc,char** argv);
-/* rfbClientCleanup() does not touch client->frameBuffer */
+/**
+ * Cleans up the client structure and releases the memory allocated for it. You
+ * should call this when you're done with the rfbClient structure that you
+ * allocated with rfbGetClient().
+ * @note rfbClientCleanup() does not touch client->frameBuffer.
+ * @param client The client to clean up
+ */
void rfbClientCleanup(rfbClient* client);
#if(defined __cplusplus)
}
#endif
-#endif
+/**
+ * @}
+ */
+/**
+ @page libvncclient_doc LibVNCClient Documentation
+ @section example_code Example Code
+ See SDLvncviewer.c for a rather complete client example.
+*/
+
+#endif
diff --git a/lib/include/rfb/rfbproto.h b/lib/include/rfb/rfbproto.h
index 7476151..ad68b2b 100644
--- a/lib/include/rfb/rfbproto.h
+++ b/lib/include/rfb/rfbproto.h
@@ -2,7 +2,9 @@
#define RFBPROTO_H
/*
+ * Copyright (C) 2009-2010 D. R. Commander. All Rights Reserved.
* Copyright (C) 2005 Rohit Kumar, Johannes E. Schindelin
+ * Copyright (C) 2004-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright (C) 2000-2002 Constantin Kaplinsky. All Rights Reserved.
* Copyright (C) 2000 Tridia Corporation. All Rights Reserved.
* Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
@@ -429,6 +431,7 @@ typedef struct {
#define rfbEncodingHextile 5
#define rfbEncodingZlib 6
#define rfbEncodingTight 7
+#define rfbEncodingTightPng 0xFFFFFEFC /* -260 */
#define rfbEncodingZlibHex 8
#define rfbEncodingUltra 9
#define rfbEncodingUltra2 10
@@ -452,6 +455,8 @@ typedef struct {
/*
* Special encoding numbers:
+ * 0xFFFFFD00 .. 0xFFFFFD05 -- subsampling level
+ * 0xFFFFFE00 .. 0xFFFFFE64 -- fine-grained quality level (0-100 scale)
* 0xFFFFFF00 .. 0xFFFFFF0F -- encoding-specific compression levels;
* 0xFFFFFF10 .. 0xFFFFFF1F -- mouse cursor shape data;
* 0xFFFFFF20 .. 0xFFFFFF2F -- various protocol extensions;
@@ -460,6 +465,15 @@ typedef struct {
* 0xFFFFFFF0 .. 0xFFFFFFFF -- cross-encoding compression levels.
*/
+#define rfbEncodingFineQualityLevel0 0xFFFFFE00
+#define rfbEncodingFineQualityLevel100 0xFFFFFE64
+#define rfbEncodingSubsamp1X 0xFFFFFD00
+#define rfbEncodingSubsamp4X 0xFFFFFD01
+#define rfbEncodingSubsamp2X 0xFFFFFD02
+#define rfbEncodingSubsampGray 0xFFFFFD03
+#define rfbEncodingSubsamp8X 0xFFFFFD04
+#define rfbEncodingSubsamp16X 0xFFFFFD05
+
#define rfbEncodingCompressLevel0 0xFFFFFF00
#define rfbEncodingCompressLevel1 0xFFFFFF01
#define rfbEncodingCompressLevel2 0xFFFFFF02
@@ -703,7 +717,10 @@ typedef struct {
#ifdef LIBVNCSERVER_HAVE_LIBZ
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * Tight Encoding.
+ * Tight and TightPng Encoding.
+ *
+ *-- TightPng is like Tight but basic compression is not used, instead PNG
+ * data is sent.
*
*-- The first byte of each Tight-encoded rectangle is a "compression control
* byte". Its format is as follows (bit 0 is the least significant one):
@@ -714,28 +731,37 @@ typedef struct {
* bit 3: if 1, then compression stream 3 should be reset;
* bits 7-4: if 1000 (0x08), then the compression type is "fill",
* if 1001 (0x09), then the compression type is "jpeg",
- * if 0xxx, then the compression type is "basic",
- * values greater than 1001 are not valid.
- *
- * If the compression type is "basic", then bits 6..4 of the
- * compression control byte (those xxx in 0xxx) specify the following:
+ * (Tight only) if 1010 (0x0A), then the compression type is
+ * "basic" and no Zlib compression was used,
+ * (Tight only) if 1110 (0x0E), then the compression type is
+ * "basic", no Zlib compression was used, and a "filter id" byte
+ * follows this byte,
+ * (TightPng only) if 1010 (0x0A), then the compression type is
+ * "png",
+ * if 0xxx, then the compression type is "basic" and Zlib
+ * compression was used,
+ * values greater than 1010 are not valid.
+ *
+ * If the compression type is "basic" and Zlib compression was used, then bits
+ * 6..4 of the compression control byte (those xxx in 0xxx) specify the
+ * following:
*
* bits 5-4: decimal representation is the index of a particular zlib
* stream which should be used for decompressing the data;
* bit 6: if 1, then a "filter id" byte is following this byte.
*
*-- The data that follows after the compression control byte described
- * above depends on the compression type ("fill", "jpeg" or "basic").
+ * above depends on the compression type ("fill", "jpeg", "png" or "basic").
*
*-- If the compression type is "fill", then the only pixel value follows, in
* client pixel format (see NOTE 1). This value applies to all pixels of the
* rectangle.
*
- *-- If the compression type is "jpeg", the following data stream looks like
- * this:
+ *-- If the compression type is "jpeg" or "png", the following data stream
+ * looks like this:
*
* 1..3 bytes: data size (N) in compact representation;
- * N bytes: JPEG image.
+ * N bytes: JPEG or PNG image.
*
* Data size is compactly represented in one, two or three bytes, according
* to the following scheme:
@@ -816,7 +842,7 @@ typedef struct {
*-- NOTE 2. The decoder must reset compression streams' states before
* decoding the rectangle, if some of bits 0,1,2,3 in the compression control
* byte are set to 1. Note that the decoder must reset zlib streams even if
- * the compression type is "fill" or "jpeg".
+ * the compression type is "fill", "jpeg" or "png".
*
*-- NOTE 3. The "gradient" filter and "jpeg" compression may be used only
* when bits-per-pixel value is either 16 or 32, not 8.
@@ -830,7 +856,9 @@ typedef struct {
#define rfbTightExplicitFilter 0x04
#define rfbTightFill 0x08
#define rfbTightJpeg 0x09
-#define rfbTightMaxSubencoding 0x09
+#define rfbTightNoZlib 0x0A
+#define rfbTightPng 0x0A
+#define rfbTightMaxSubencoding 0x0A
/* Filters to improve compression efficiency */
#define rfbTightFilterCopy 0x00
diff --git a/lib/resources/ar.qm b/lib/resources/ar.qm
new file mode 100644
index 0000000..7f2cdba
Binary files /dev/null and b/lib/resources/ar.qm differ
diff --git a/lib/resources/de.ts b/lib/resources/ar.ts
similarity index 53%
copy from lib/resources/de.ts
copy to lib/resources/ar.ts
index 9ef80e4..84f0ea8 100644
--- a/lib/resources/de.ts
+++ b/lib/resources/ar.ts
@@ -1,23 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.0" language="de_DE">
+<TS version="2.0" language="ar_SA">
<context>
<name>AboutDialog</name>
<message>
<source>About iTALC</source>
- <translation>Über iTALC</translation>
+ <translation>حول "آيتالك"</translation>
</message>
<message>
<source>About</source>
- <translation>Über</translation>
- </message>
- <message utf8="true">
- <source>iTALC - Intelligent Teaching And Learning with Computers
-
-Copyright © 2004-2011 Tobias Doerffel</source>
- <translation>iTALC - Intelligent Teaching And Learning with Computers
-
-Copyright © 2004-2011 Tobias Doerffel</translation>
+ <translation>حول</translation>
</message>
<message>
<source><a href="http://italc.sourceforge.net">http://italc.sourceforge.net</a></source>
@@ -25,500 +17,500 @@ Copyright © 2004-2011 Tobias Doerffel</translation>
</message>
<message>
<source>Authors</source>
- <translation>Autoren</translation>
+ <translation>المؤلفون</translation>
</message>
<message>
<source>Translation</source>
- <translation>Übersetzung</translation>
+ <translation>ترجمة </translation>
</message>
<message>
<source>Current language not translated yet (or native English).
If you're interested in translating iTALC into your local or another language or want to improve an existing translation, please contact an iTALC developer!</source>
- <translation type="unfinished"></translation>
+ <translation>لم تتم ترجمة اللغة الحالية بعد (أو اللغة الأم هي الإنجليزية)
+إذا رغبت في ترجمة "آيتالك" إلى لغتك المحلية أو لغة أخرى أو إذا رغبت في تحسين الترجمة الحالية، يرجى الإتصال بمطور "آيتالك" !</translation>
</message>
<message>
<source>License</source>
- <translation>Lizenz</translation>
+ <translation>ترخيص</translation>
</message>
<message utf8="true">
<source>iTALC - Intelligent Teaching And Learning with Computers
Copyright © 2004-2011 Tobias Doerffel / iTALC Solutions</source>
- <translation type="unfinished"></translation>
+ <translation>"آيتالك" - التعليم والتعلم الذكي بواسطة الحاسب</translation>
</message>
</context>
<context>
<name>AccessDialogSlave</name>
<message>
<source>Never for this session</source>
- <translation>Nie für diese Sitzung</translation>
+ <translation>ليس لهذه الحلقة </translation>
</message>
<message>
<source>Always for this session</source>
- <translation>Immer für diese Sitzung</translation>
+ <translation>دائما لهذه الحلقة </translation>
</message>
<message>
<source>Confirm desktop access</source>
- <translation>Arbeitsflächenzugriff bestätigen</translation>
+ <translation>تأكيد أمكانية الوصول لسطح المكتب</translation>
</message>
<message>
<source>The user %1 at host %2 wants to access your desktop. Do you want to grant access?</source>
- <translation>Der Nutzer %1 am Rechner %2 möchte auf Ihre Arbeitsfläche zugreifen. Wollen Sie ihm Zugriff gewähren?</translation>
+ <translation>المستخدم 1% عند المضيف 2% يريد الوصول إلى سطح مكتبك. هل ترغب في منح صلاحية الوصول؟</translation>
</message>
</context>
<context>
<name>ClassroomManager</name>
<message>
<source>Classroom-Manager</source>
- <translation>Klassenraum-Verwaltung</translation>
+ <translation>مدير - غرفة الدراسة </translation>
</message>
<message>
<source>Use this workspace to manage your computers and classrooms in an easy way.</source>
- <translation>Nutzen Sie diesen Arbeitsbereich, um Ihre Computer und Klassenräume auf eine einfache Art und Weise zu verwalten.</translation>
+ <translation>استخدم مكان العمل هذا لإدارة حاسباتك وغرف الدراسة بطريقة سهلة </translation>
</message>
<message>
<source>This is where computers and classrooms are managed. You can add computers or classrooms by clicking right in this list.</source>
- <translation>An dieser Stelle werden Computer und Klassenräume verwaltet. Sie können Computer oder Klassenräume hinzufügen, indem Sie mit der rechten Maustaste in die Liste klicken.</translation>
+ <translation>هنا تتم إدارة الحاسبات وغرف الدراسة. يمكنك إضافة حاسبات وغرف دراسة بالنقر على يمين هذه القائمة </translation>
</message>
<message>
<source>Classrooms/computers</source>
- <translation>Klassenräume/Computer</translation>
+ <translation>غرف دراسة/ حاسبات</translation>
</message>
<message>
<source>IP-address</source>
- <translation>IP-Adresse</translation>
+ <translation>عنوان آي بيه</translation>
</message>
<message>
<source>Usernames</source>
- <translation>Nutzernamen</translation>
+ <translation>أسماء المستخدمين</translation>
</message>
<message>
<source>Show usernames</source>
- <translation>Nutzernamen anzeigen</translation>
+ <translation>عرض أسماء المستخدمين</translation>
</message>
<message>
<source>Use the context-menu (right mouse-button) to add/remove computers and/or classrooms.</source>
- <translation>Benutzen Sie das Kontextmenü (rechte Maustaste), um Computer und Klassenräume hinzuzufügen/zu entfernen.</translation>
+ <translation>استخدم قائمة السياق (زر الفأرة الأيمن) لإضافة أو إزالة الحاسبات او غرف الدراسة</translation>
</message>
<message>
<source>Export to text-file</source>
- <translation>In Text-Datei exportieren</translation>
+ <translation>تصدير إلى ملف نصي </translation>
</message>
<message>
<source>Use this button for exporting this list of computers and usernames into a text-file. You can use this file later for collecting files after an exam has finished. This is sometimes neccessary, because some users might have finished and logged out earlier and so you cannot collect their files at the end of the exam.</source>
- <translation>Benutzen Sie diesen Button, um diese Liste mit Computern und Nutzernamen in eine Textdatei zu exportieren. Sie können diese Datei später verwenden, um z.B. nach einer Leistungsüberprüfung Dateien einzusammeln. Das ist manchmal nötig, da einige Benutzer möglicherweise früher fertig waren und sich abgemeldet haben, so dass Sie deren Dateien nicht am Ende der Leistungsüberprüfung einsammeln können.</translation>
+ <translation>استخدم هذا الزر لتصدير قائمة الحاسبات وأسماء المستخدمين الحالية إلى ملف نصي. يمكنك استخدام هذا الملف لاحقا لجمع الملفات بعد إنتهاء الإختبار. يكون هذا الإجراء ضروريا، في بعض الأحيان، إذ أن بعض المستخدمين قد </translation>
</message>
<message>
<source>Hide teacher computers</source>
- <translation>Lehrercomputer ausblenden</translation>
+ <translation>إخفاء حاسب المعلِّم</translation>
</message>
<message>
<source>Show/hide</source>
- <translation>Zeigen/verstecken</translation>
+ <translation>عرض أو إخفاء</translation>
</message>
<message>
<source>Edit settings</source>
- <translation>Einstellungen bearbeiten</translation>
+ <translation>تحرير الإعدادات</translation>
</message>
<message>
<source>Remove</source>
- <translation>Entfernen</translation>
+ <translation>إزالة </translation>
</message>
<message>
<source>Show all computers in classroom</source>
- <translation>Zeige alle Computer im Klassenraum</translation>
+ <translation>عرض كافة الحاسبات في غرفة الدراسة </translation>
</message>
<message>
<source>Hide all computers in classroom</source>
- <translation>Verstecke alle Computer im Klassenraum</translation>
+ <translation>إخفاء كافة الحاسبات في غرفة الدراسة </translation>
</message>
<message>
<source>Edit name</source>
- <translation>Name bearbeiten</translation>
+ <translation>تحرير الاسم</translation>
</message>
<message>
<source>Remove classroom</source>
- <translation>Klassenraum entfernen</translation>
+ <translation>إزالة غرفة دراسة </translation>
</message>
<message>
<source>Add computer</source>
- <translation>Computer hinzufügen</translation>
+ <translation>إضافة حاسب</translation>
</message>
<message>
<source>Add classroom</source>
- <translation>Klassenraum hinzufügen</translation>
+ <translation>إضافة غرفة دراسة</translation>
</message>
<message>
<source>No configuration-file found</source>
- <translation>Keine Konfigurationsdatei gefunden</translation>
+ <translation>تعذر العثور على ملف التهيئة </translation>
</message>
<message>
<source>Could not open configuration file %1.
You will have to add at least one classroom and computers using the classroom-manager which you'll find inside the program in the sidebar on the left side.</source>
- <translation>Konnte die Konfigurationsdatei %1 nicht finden. Sie werden mindestens einen Klassenraum sowie Computer mit Hilfe der Klassenraum-Verwaltung hinzufügen müssen. Sie finden die Klassenraum-Verwaltung innerhalb des Programms in der Seitenleiste auf der linken Seite.</translation>
+ <translation>تعذر فتح ملف تهيئة 1%
+يلزم إضافة غرفة دراسة واحدة على الأقل وحاسبات باستخدام واجهة مدير غرفة الدراسة التي يمكنك الوصول إليها من الشريط الجانبي الأيسر </translation>
</message>
<message>
<source>Error in configuration-file</source>
- <translation>Fehler in der Konfigurationsdatei</translation>
+ <translation>خطأ في ملف التهيئة </translation>
</message>
<message>
<source>Error while parsing configuration-file %1.
Please edit it. Otherwise you should delete this file and have to add all classrooms and computers again.</source>
- <translation>Fehler beim Parsen der Konfigurationsdatei %1.Bitte bearbeiten Sie sie. Andernfalls müssen Sie die Datei löschen und alle Klassenräume und Computer erneut hinzufügen.</translation>
+ <translation>حدث خطأ أثناء التحليل اللغوي لملف التهيئة 1%
+يرجى تحريره وإلا سيلزم حذف هذا الملف وسيتعين عليك إضافة كافة غرف الدراسة والحاسبات مرة أخرى. </translation>
</message>
<message>
<source>Error while parsing configuration-file %1.
Please edit it. Otherwise you should delete this file.</source>
- <translation>Fehler beim Parsen der Konfigurationsdatei %1.
-Bitte bearbeiten Sie diese Datei. Andernfalls sollten Sie sie löschen.</translation>
+ <translation>حدث خطأ أثناء التحليل اللغوي لملف التهيئة 1%
+يرجى تحريره وإلا سيلزم حذف الملف </translation>
</message>
<message>
<source>Select output-file</source>
- <translation>Ausgabe-Datei wählen</translation>
+ <translation>إختيار ملف الخرج</translation>
</message>
<message>
<source>Text files (*.txt)</source>
- <translation>Textdateien (*.txt)</translation>
+ <translation>(*.txt) ملفات نصية</translation>
</message>
<message>
<source>Actions for selected</source>
- <translation>Aktionen für ausgewählte</translation>
+ <translation>عمليات لـلمختار</translation>
</message>
<message>
<source>Actions</source>
- <translation>Aktionen</translation>
+ <translation>عمليات</translation>
</message>
<message>
<source>Actions for %1</source>
- <translation>Aktionen für %1</translation>
+ <translation>عمليات لـ 1%</translation>
</message>
<message>
<source>New name for classroom</source>
- <translation>Neuer Name für Klassenraum</translation>
+ <translation>اسم جديد لغرفة الدراسة </translation>
</message>
<message>
<source>Please enter a new name for classroom "%1".</source>
- <translation>Bitte geben Sie einen neuen Namen für den Klassenraum "%1" ein.</translation>
+ <translation>يرجى إدخال اسم جديد لغرفة الدراسة "1%".</translation>
</message>
<message>
<source>Are you sure want to remove classroom "%1"?
All computers in it will be removed as well!</source>
- <translation>Sind Sie sicher, dass Sie den Klassenraum "%1" entfernen wollen?
-Alle darin befindlichen Computer werden ebenfalls gelöscht!</translation>
+ <translation>هل ترغب فعلا في إزالة غرفة الدراسة "1%"؟
+ستتم أيضا إزالة كافة الحاسبات التي بالغرفة</translation>
</message>
<message>
<source>Missing classroom</source>
- <translation>Fehlender Klassenraum</translation>
+ <translation>غرفة دراسة مفقودة</translation>
</message>
<message>
<source>Before adding computers you have to create at least one classroom.
Do you want to create a new classrom now?</source>
- <translation>Bevor Sie Computer hinzufügen können, müssen Sie mindestens einen Klassenraum erstellen.
-Möchten Sie jetzt einen neuen Klassenraum erstellen?</translation>
+ <translation>قبل إضافة حاسب، يلزم إنشاء غرفة دراسة
+هل ترغب في إنشاء غرفة دراسة الآن؟</translation>
</message>
<message>
<source>New classroom</source>
- <translation>Neuer Klassenraum</translation>
+ <translation>غرفة دراسة جديدة</translation>
</message>
<message>
<source>Please enter the name of the classroom you want to create.</source>
- <translation>Bitten geben Sie den Namen des zu erstellenden Klassenraums ein.</translation>
+ <translation>يرجى إدخال اسم غرفة الدراسة التي ترغب في إنشائها.</translation>
</message>
</context>
<context>
<name>Client</name>
<message>
<source>Unknown state</source>
- <translation>Unbekannter Zustand</translation>
+ <translation>حالة غير معروفة </translation>
</message>
<message>
<source>No user logged in</source>
- <translation>Kein Benutzer angemeldet</translation>
+ <translation>لم يسجل مستخدم دخول على النظام </translation>
</message>
<message>
<source>Host unreachable</source>
- <translation>Rechner nicht erreichbar</translation>
+ <translation>لا يمكن الوصول إلى الجهاز المضيف </translation>
</message>
<message>
<source>Demo running</source>
- <translation>Demo läuft</translation>
+ <translation>تشغيل العرض التعريفي</translation>
</message>
<message>
<source>Desktop locked</source>
- <translation>Arbeitsfläche gesperrt</translation>
+ <translation>سطح المكتب مغلق</translation>
</message>
</context>
<context>
<name>ClientAction</name>
<message>
<source>Are you sure want logout all users on all visible computers ?</source>
- <translation>Sind Sie sicher, dass Sie alle Nutzer an allen sichtbaren Computern abmelden wollen?</translation>
+ <translation>هل ترغب فعلا في إخراج كافة المستخدمين من كافة الحاسبات الظاهرة </translation>
</message>
<message>
<source>Are you sure want logout all users on all selected computers ?</source>
- <translation>Sind Sie sicher, dass Sie alle Nutzer auf allen markierten Computern abmelden wollen?</translation>
+ <translation>هل ترغب فعلا في إخراج كافة المستخدمين من كافة الحاسبات المختارة </translation>
</message>
<message>
<source>Logout user</source>
- <translation>Nutzer abmelden</translation>
+ <translation>إخراج المستخدم</translation>
</message>
<message>
<source>Are you sure want to reboot all visible computers?</source>
- <translation>Sind Sie sicher, dass Sie alle sichtbaren Computer neustarten wollen?</translation>
+ <translation>هل ترغب فعلا في إعادة تشغيل كافة الحاسبات الظاهرة </translation>
</message>
<message>
<source>Are you sure want to reboot all selected computers?</source>
- <translation>Sind Sie sicher, dass Sie alle gewählten Computer neustarten wollen?</translation>
+ <translation>هل ترغب فعلا في إعادة تشغيل كافة الحاسبات المختارة </translation>
</message>
<message>
<source>Reboot computers</source>
- <translation>Computer neustarten</translation>
+ <translation>إعادة تشغيل الحاسبات </translation>
</message>
<message>
<source>Are you sure want to power down all visible computers?</source>
- <translation>Sind Sie sicher, dass Sie alle sichtbaren Computer ausschalten wollen?</translation>
+ <translation>هل ترغب فعلا في إغلاق كافة الحاسبات الظاهرة </translation>
</message>
<message>
<source>Are you sure want to power down all selected computers?</source>
- <translation>Sind Sie sicher, dass Sie alle gewählten Computer ausschalten wollen?</translation>
+ <translation>هل ترغب فعلا في إغلاق كافة الحاسبات المختارة </translation>
</message>
</context>
<context>
<name>ClientSettingsDialog</name>
<message>
<source>Invalid MAC-address</source>
- <translation>Ungültige MAC-Adresse</translation>
+ <translation>عنوان ماك غير صحيح</translation>
</message>
<message>
<source>You specified an invalid MAC-address. Either leave the field blank or enter a valid MAC-address (use ":" as separator!).</source>
- <translation>Sie haben eine ungültige MAC-Adresse angegeben. Entweder Sie lassen das Feld frei oder geben eine gültige MAC-Adresse ein (verwenden Sie ":" als Trennzeichen!).</translation>
+ <translation>لقد أدخلت عنوان ماك غير صحيح. أترك الحقل خاليا أو أدخل عنوان ماك صحيح (استخدم علامة ":" كفاصل) </translation>
</message>
<message>
<source>Client settings</source>
- <translation>Rechner-Einstellungen</translation>
+ <translation>إعدادات الحاسب الفرعي</translation>
</message>
<message>
<source>IP/hostname</source>
- <translation>IP/Rechnername</translation>
+ <translation>عنوانIP أو اسم المضيف</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">enter an IP-address or hostname under which iTALC can reach the client (use ':' for specifying an optional port-number)</p></body></html></source>
- <translation><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Geben Sie eine IP-Adresse oder den Rechnernamen an, unter dem iTALC den Client erreichen kann (benutzen Sie ':' um eine optionale Portnummer anzugeben)</p></body></html></translation>
+ <translation>قم بادخال عنوانIP أو اسم مضيف يمكن لنظام "آيتالك" من خلاله الوصول إلى الحاسب الفرعي (استخدم العلامة ":" لتعريف رقم منفذ إختياري).</translation>
</message>
<message>
<source>Name</source>
- <translation>Name</translation>
+ <translation>الاسم</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Optional nickname of the host which is displayed in iTALC.</p></body></html></source>
- <translation type="unfinished"></translation>
+ <translation>كنية إختيارية للمضيف تعرض على نظام "آيتالك"</translation>
</message>
<message>
<source>MAC address</source>
- <translation>MAC-Adresse</translation>
+ <translation>IPعنوان</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hardware/MAC-address of client - only used for powering on client</p></body></html></source>
- <translation><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hardware/MAC-Adresse des Rechners - wird nur zum Anschalten des Rechners benötigt</p></body></html></translation>
+ <translation>عنوان ماك لجهاز الحاسب الفرعي - يستخدم فقط لتشغيل الحاسب الفرعي</translation>
</message>
<message>
<source>Classroom</source>
- <translation>Klassenraum</translation>
+ <translation>غرفة دراسة</translation>
</message>
<message>
<source>Type</source>
- <translation>Typ</translation>
+ <translation>النوع</translation>
</message>
<message>
<source>Student computer</source>
- <translation>Schülerrechner</translation>
+ <translation>حاسب الطالب</translation>
</message>
<message>
<source>Teacher computer</source>
- <translation>Lehrercomputer</translation>
+ <translation>حاسب المدرِّس</translation>
</message>
<message>
<source>Other/undefined computer</source>
- <translation>Anderer/undefinierter Computer</translation>
+ <translation>حاسب آخرغير معرّف</translation>
</message>
<message>
<source>Missing IP address/hostname</source>
- <translation>Fehlende IP-Adresse/Rechnername</translation>
+ <translation>عنوان IP أو مضيف مفقود</translation>
</message>
<message>
<source>You didn't specify an IP address or hostname for the computer!</source>
- <translation>Sie haben keine IP-Adresse oder keinen Rechnernamen für den Rechner angegeben!</translation>
+ <translation>لم تحدد عنوان IP أو مضيف لهذا الحاسب</translation>
</message>
</context>
<context>
<name>Config</name>
<message>
<source>Interval between updates</source>
- <translation>Aktualisierungsintervall</translation>
+ <translation>الفترات الفاصلة بين التحديثات</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Here you can set the interval between updates of clients. Higher values result in lower network-traffic and lower CPU-usage on this computer.</p></body></html></source>
- <translation><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hier können Sie den Aktualisierungsinterval für die Clients setzen. Höhere Werte resultieren in geringerer Netzlast und geringerer Prozessorbelastung auf diesem Computer.</p></body></html></translation>
+ <translation>يمكنك هنا ضبط الفترة الفاصلة بين عمليات تحديث الأجهزة الفرعية. القيم العالية يترتب عليها حركة أقل على الشبكة واستخدام أقل لمعالج هذا الحاسب </translation>
</message>
<message>
<source> seconds</source>
- <translation> Sekunden</translation>
+ <translation>ثواني</translation>
</message>
<message>
<source>User interface</source>
- <translation>Benutzeroberfläche</translation>
+ <translation>واجهة المستخدم</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Do not show balloon-tooltips for toolbar-buttons</p></body></html></source>
- <translation type="unfinished"></translation>
+ <translation>عدم إظهار تلميحات بالونية لازر شريط الأدوات</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this option if you're annoyed by the balloon-tooltips appearing when moving mouse-cursor over toolbar-buttons.</p></body></html></source>
- <translation type="unfinished"></translation>
+ <translation>أشِّرعلى هذا الخيار إن كنت لا ترغب في ظهور تلميحات بالونية عن تمرير مؤشر الفأرة فوق لازر شريط الأدوات</translation>
</message>
<message>
<source>No balloon-tooltips</source>
- <translation>Keine Ballon-Tooltips</translation>
+ <translation>تعطيل تلميحات البالونة</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Do not show texts on toolbar-buttons</p></body></html></source>
- <translation type="unfinished"></translation>
+ <translation>عدم إظهار النصوص على لازر شريط الأدوات</translation>
</message>
<message>
<source>No texts on toolbar-buttons</source>
- <translation>Kein Text auf Buttons der Werkzeugleiste</translation>
+ <translation>تعطيل النصوص على أزر شريط الادوات </translation>
</message>
<message>
<source>Your role (needs according keys!)</source>
- <translation>Ihre Rolle (entspr. Schlüssel nötig!)</translation>
+ <translation>دورك (الحاجة وفق المفاتيح)</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Here you can select your role. Only change this if you know what you're doing. Otherwise you won't be able to access any clients until you restore your old role.</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hier können Sie Ihre Rolle setzen. Ändern Sie diese nur, wenn Sie wissen, was sie tun! Anderenfalls werden Sie auf keine Computer zugreifen können, bis Sie ihre alte Rolle wieder hergestellt haben.</p></body></html></translation>
+ <translation>يمكنك هنا إختيار دورك. قم بتغيير هذا الاعداد فقط إن كنت تعرف ما تفعله؛ وإلا سوف لن تتمكن من الوصول الى أي أجهزة فرعية حتى تستعيد دورك القديم. </translation>
</message>
<message>
<source>Teacher</source>
- <translation>Lehrer</translation>
+ <translation>مدرِّس</translation>
</message>
<message>
<source>Administrator</source>
- <translation>Administrator</translation>
+ <translation>المدير</translation>
</message>
<message>
<source>Supporter</source>
- <translation>Support-Mitarbeiter</translation>
+ <translation>معاون</translation>
</message>
<message>
<source>Other</source>
- <translation>Andere</translation>
+ <translation>أخرى</translation>
</message>
<message>
<source>Settings for multi-logon</source>
- <translation>Einstellungen für Mehrfach-Anmeldung</translation>
+ <translation>إعدادات للدخول المتعدد</translation>
</message>
<message>
<source>Domain</source>
- <translation>Domäne</translation>
+ <translation>النطاق</translation>
</message>
<message>
<source>Double-click action for client-window</source>
- <translation>Doppelklick-Aktion für Client-Fenster</translation>
+ <translation>النقر المزدوج على نافذة حاسب فرعي</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Here you can set what should happen if you double-click a client-window.</p></body></html></source>
- <translation type="unfinished"></translation>
+ <translation>يمكنك هنا تحديد ما سيحدث في حالة النقر المزدوج على نافذة حاسب فرعي</translation>
</message>
<message>
<source>Remote control</source>
- <translation>Fernsteuern</translation>
+ <translation>تحكم من بُعد</translation>
</message>
<message>
<source>View live in fullscreen</source>
- <translation>Live im Vollbild anschauen</translation>
+ <translation>معاينة حيّة ملء الشاشة</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-style:italic;">Please note, that some changes won't take effect until you restart iTALC.</span></p></body></html></source>
- <translation><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-style:italic;">Bitte beachten Sie, dass einige Änderungen erst wirksam werden, wenn Sie iTALC neustarten.</span></p></body></html></translation>
+ <translation>يرجى ملاحظة أن بعض التغييرات لن يتم تفعيلها إلا بعد إعادة تشغيل نظام "آيتالك"</translation>
</message>
</context>
<context>
<name>ConfigWidget</name>
<message>
<source>Your iTALC-configuration</source>
- <translation>Ihre iTALC-Konfiguration</translation>
+ <translation>تهيئة نظام "آيتالك"</translation>
</message>
<message>
<source>In this workspace you can customize iTALC to fit your needs.</source>
- <translation>In diesem Arbeitsbereich können Sie iTALC Ihren Bedürfnissen anpassen.</translation>
+ <translation>على هذه الشاشة يمكنك تخصيص "آيتالك" وفق إحتياجاتك</translation>
</message>
</context>
<context>
<name>DecoratedMessageBox</name>
<message>
<source>OK</source>
- <translation>OK</translation>
+ <translation>موافق</translation>
</message>
</context>
<context>
<name>DemoClient</name>
<message>
<source>iTALC Demo</source>
- <translation>iTALC Demo</translation>
+ <translation>عرض تعريفي لـ "آيتالك"</translation>
</message>
</context>
<context>
<name>ItalcCoreServer</name>
<message>
<source>Authentication error</source>
- <translation>Authentifizierungsfehler</translation>
+ <translation>خطأ في عملية التوثيق</translation>
</message>
<message>
<source>Somebody (IP: %1) tried to access this computer but could not authenticate itself successfully!</source>
- <translation>Jemand (IP:%1) hat versucht, auf diesen Computer zuzugreifen, konnte sich jedoch nicht erfolgreich authentifizieren!</translation>
+ <translation>حاول أحد ( 1IP%) الوصول إلى هذا الحاسب ولكن لم يتمكن من توثيق هويته بنجاح</translation>
</message>
</context>
<context>
<name>ItalcVncConnection</name>
<message>
<source>VNC authentication failed because of too many authentication tries.</source>
- <translation>VNC-Authentifizierung aufgrund zu häufiger Versuche fehlgeschlagen.</translation>
+ <translation>ثعذر التحقق بسبب كثرة المحاولات.</translation>
</message>
<message>
<source>VNC authentication failed.</source>
- <translation>VNC-Authentifizierung fehlgeschlagen.</translation>
+ <translation>أخفقت عملية توثيق الدخول بسبب المحاولات المتعددة .</translation>
</message>
<message>
<source>VNC server closed connection.</source>
- <translation>VNC-Server hat die Verbindung geschlossen.</translation>
+ <translation>قام خادم شبكة الحوسبة الإلكترونية بقطع التوصيل</translation>
</message>
</context>
<context>
<name>KeyFileAssistant</name>
<message>
<source>iTALC Access Key Assistant</source>
- <translation>iTALC-Schlüsselassistent</translation>
+ <translation>مساعد مفتاح وصول "آيتالك"</translation>
</message>
<message>
<source>Create/import iTALC access keys</source>
- <translation>iTALC-Schlüssel erzeugen/importieren</translation>
+ <translation>إنشاء أو استيراد مفاتيح وصول لـ "آيتالك"</translation>
</message>
<message>
<source>This assistant will help you to create or import iTALC access keys.</source>
- <translation>Dieser Assistent wird Ihnen dabei helfen, iTALC-Schlüssel zu erstellen oder importieren.</translation>
+ <translation>سيقوم المساعد بمساعدتك في إنشاء او استيراد مفتاح وصول لنظام "آيتالك"</translation>
</message>
<message>
<source>How does it work?</source>
- <translation>Wie funktioniert's?</translation>
+ <translation>كيف يعمل؟</translation>
</message>
<message>
<source>iTALC access keys consist of two parts belonging together, a private and a public key part.
@@ -526,67 +518,65 @@ p, li { white-space: pre-wrap; }
Using the private key part, users on the master computer will be able to access client computers. It is important that only authorized users have read access to the private key file.
The public key part is used on the client computers to verify that any incoming connection request is authorized.</source>
- <translation>iTALC-Zugriffsschlüssel bestehen aus zwei zueinander gehörigen Teilen, einem privaten und einem öffentlichen Schlüsselteil.
-
-Mit Hilfe des privaten Schlüssels können Nutzer auf dem Mastercomputer auf Clientcomputer zugreifen. Es ist wichtig, dass nur autorisierte Nutzer Lesezugriff auf die private Schlüsseldatei besitzen.
-
-Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede eingehende Verbindungsanfrage zu prüfen, ob diese autorisiert ist.</translation>
+ <translation>يتألف مفتاح وصول "آيتالك" من جزئين مترابطين، جزء خاص وجزء عام
+باستخدام الجزء الخاص من المفتاح، يمكن لمستخدم الحاسب الرئيسي الوصول إلى الحاسب الفرعي. من الضروري منح صلاحية قراءة ملف المفاتيح الخاصة فقط للمستخدمين المصرح لهم.
+يستخدم الجزء العام من المفتاح على الحاسب الفرعي للتأكد من أن أي طلب اتصال وارد مصرح به </translation>
</message>
<message>
<source>Assistant mode</source>
- <translation>Assistentmodus</translation>
+ <translation>حالة المساعد</translation>
</message>
<message>
<source>Please choose whether to create new access keys or import a public key on a client.</source>
- <translation>Bitte wählen Sie, ob neue Schlüssel erzeugt oder ein öffentlicher Schlüssel auf einen Client importiert werden soll.</translation>
+ <translation>يرجى إختيار إما إنشاء مفاتيح وصول جديدة أو استيراد مفتاح عام إلى الحاسب الفرعي</translation>
</message>
<message>
<source>Create new access keys (master computer)</source>
- <translation>Neue Schlüssel erzeugen (Master-Computer)</translation>
+ <translation>إنشاء مفاتيح وصول جديدة (الحاسب الرئيسي)</translation>
</message>
<message>
<source>assistantModeButtonGroup</source>
- <translation></translation>
+ <translation>مجموعة أزر حالة المساعد</translation>
</message>
<message>
<source>Import public key (client computer)</source>
- <translation>Öffentlichen Schlüssel importieren (Client-Computer)</translation>
+ <translation>استيراد مفتاح عام (حاسب فرعي)</translation>
</message>
<message>
<source>Select user role</source>
- <translation>Nutzerrolle auswählen</translation>
+ <translation>إختيار دور المستخدم</translation>
</message>
<message>
<source>Please select a user role for which to create or import the access keys:</source>
- <translation>Bitte wählen Sie eine Nutzerrolle, für die die Schlüssel erzeugt oder importiert werden sollen:</translation>
+ <translation>يرجى إختيار دور المستخدم الذي ترغب في إنشاء أو استيراد مفاتيح وصول له. </translation>
</message>
<message>
<source>Teacher</source>
- <translation>Lehrer</translation>
+ <translation>مدرِّس</translation>
</message>
<message>
<source>Administrator</source>
- <translation>Administrator</translation>
+ <translation>المدير</translation>
</message>
<message>
<source>Support team member</source>
- <translation>Supportmitarbeiter</translation>
+ <translation>عضو فريق الدعم</translation>
</message>
<message>
<source>Other</source>
- <translation>Andere</translation>
+ <translation>آخر</translation>
</message>
<message>
<source>User roles allow using multiple access keys in parallel. For example there can be different teacher access keys for each classroom while the support access keys are the same for the whole school.</source>
- <translation>Nutzerrollen erlauben die gleichzeitige Verwendung von mehreren Zugriffsschlüsseln. Beispielsweise können verschiedene Lehrerschlüssel für jeden Klassenraum eingerichtet werden, während die Zugriffsschlüssel für den Support schulweit einmalig sind.</translation>
+ <translation>تسمح أدوار المستخدم باستخدام عدة مفاتيح وصول بالتوازي. مثلا، يمكن تخصيص مفاتيح مختلفة لوصول المدرس لكل غرفة دراسة بينما تكون مفاتيح الوصول للدعم متشابهة لكل أعضاء المدرسة.</translation>
</message>
<message>
<source>Directories</source>
- <translation>Verzeichnisse</translation>
+ <translation>أدلة </translation>
</message>
<message>
<source>Export public key part (master computer)</source>
- <translation>Öffentlichen Schlüssel exportieren (Mastercomputer)</translation>
+ <translation>تصدير جزء المفتاح العام (الحاسب الرئيسي)</translation>
</message>
<message>
<source>...</source>
@@ -594,117 +584,117 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e
</message>
<message>
<source>Use custom destination directory for access keys</source>
- <translation>Benutzerdefiniertes Zielverzeichnis für Zugriffsschlüssel verwenden</translation>
+ <translation>استخدم دليل وجهة مخصص لمفاتيح الوصول </translation>
</message>
<message>
<source>Please specify the location of the public access key to be imported.</source>
- <translation>Bitte geben Sie den Ort des öffentlichen Zugriffsschlüssels an, der importiert werden soll.</translation>
+ <translation>يرجى تحديد موقع مفاتيح الوصول المطلوب استيرادها</translation>
</message>
<message>
<source>Summary</source>
- <translation>Zusammenfassung</translation>
+ <translation>ملخص</translation>
</message>
<message>
<source>The following actions will be taken:</source>
- <translation>Die folgenden Aktionen werden durchgeführt:</translation>
+ <translation>سيتم إتخاذ الإجراءات التالية</translation>
</message>
<message utf8="true">
<source>• Create new access keys</source>
- <translation>• Neue Zugriffsschlüssel erzeugen</translation>
+ <translation>إنشاء مفاتيح وصول جديدة</translation>
</message>
<message utf8="true">
<source>• Import public access key from</source>
- <translation>• Öffentlichen Zugriffsschlüssel exportieren aus</translation>
+ <translation>استيراد مفتاح وصول عام من</translation>
</message>
<message>
<source><unknown></source>
- <translation><unbekannt></translation>
+ <translation><غير معروف></translation>
</message>
<message utf8="true">
<source>• Write access key(s) to</source>
- <translation>• Zugriffsschlüssel schreiben nach</translation>
+ <translation>مفتاح أو مفاتيح الوصول إلى الكتابة إلى </translation>
</message>
<message utf8="true">
<source>• Export public key to</source>
- <translation>• Öffentlichen Schlüssel exportieren nach</translation>
+ <translation>تصدير مفتاح عام إلى</translation>
</message>
<message utf8="true">
<source>• Configure for user role</source>
- <translation>• Konfigurieren für Nutzerrolle</translation>
+ <translation>تهيئة دور المستخدم</translation>
</message>
<message>
<source>Select directory in which to export the public key</source>
- <translation>Verzeichnis wählen, in welches der öffentliche Schlüssel exportiert werden soll</translation>
+ <translation>إختيار الدليل الذي سيتم تصدير الملف إليه</translation>
</message>
<message>
<source>Key files (*.key.txt)</source>
- <translation>Schlüsseldateien (*.key.txt)</translation>
+ <translation> (*.key.txt) ملفات رئيسية</translation>
</message>
<message>
<source>Invalid public key</source>
- <translation>Ungültiger öffentlicher Schlüssel</translation>
+ <translation>مفتاح عام غير صحيح</translation>
</message>
<message>
<source>The selected file does not contain a valid public iTALC access key!</source>
- <translation>Die gewählte Datei beinhaltet keinen gültigen öffentliche iTALC-Zugrifsschlüssel!</translation>
+ <translation>الملف المختار لا يحتوي مفتاح وصول عام صحيح لنظام "آيتالك"</translation>
</message>
<message>
<source>Select destination directory</source>
- <translation>Zielverzeichnis auswählen</translation>
+ <translation>اختيار دليل الوجهة</translation>
</message>
<message>
<source>Access key creation</source>
- <translation>Erstellung des Zugriffschlüssels</translation>
+ <translation>إنشاء مفتاح وصول</translation>
</message>
<message>
<source>Could not remove previously existing file %1.</source>
- <translation>Konnte bereits existierende Datei %1 nicht löschen.</translation>
+ <translation>تعذر إزالة الملف 1% الموجود مسبقا</translation>
</message>
<message>
<source>Failed exporting public access key from %1 to %2.</source>
- <translation>Der Export des öffentlichen Zugrifsschlüssels von %1 nach %2 ist fehlgeschlagen.</translation>
+ <translation>أخفقت عملية تصدير مفتاح الوصول العام من 1% إلى 2%</translation>
</message>
<message>
<source>Access keys were created and written successfully to %1 and %2.</source>
- <translation>Zugrifsschlüssel wurden erfolgreich erstellt und nach %1 und %2 geschrieben.</translation>
+ <translation>تم إنشاء مفاتيح الوصول بنجاح وكتابتها في 1% و 2%.</translation>
</message>
<message>
<source>An error occured while creating the access keys. You probably are not permitted to write to the selected directories.</source>
- <translation>Beim erstellen der Zugrifsschlüssel ist ein Fehler aufgetreten. Sie sind wahrscheinlich nicht berechtigt, in die gewählten Verzeichnisse zu schreiben.</translation>
+ <translation>حدث خطأ أثناء عملية إنشاء مفاتيح الوصول. من المرجح أنه غير مسموح لك بالكتابة على الأدلة المختارة</translation>
</message>
<message>
<source>Public key import</source>
- <translation>Import des öffentlichen Schlüssels</translation>
+ <translation>استيراد مفتاح عام</translation>
</message>
<message>
<source>An error occured while importing the public access key. You probably are not permitted to read the source key or to write the destination file.</source>
- <translation>Beim importieren des öffentlichen Zugrifsschlüssels ist ein Fehler aufgetreten. Sie sind wahrscheinlich nicht berechtigt, den Quellschlüssel zu lesen oder die Zieldatei zu schreiben.</translation>
+ <translation>حدث خطأ أثناء عملية استيراد مفاتيح الوصول العام. من المرجح أنه غير مسموح لك بقراءة مفتاح المصدر أو الكتابة إلى ملف الوجهة. </translation>
</message>
<message>
<source>The public key was successfully imported to %1.</source>
- <translation>Der öffentliche Schlüssel wurde erfolgreich nach %1 importiert.</translation>
+ <translation>تم استيراد المفتاح العام إلى 1% بنجاح</translation>
</message>
</context>
<context>
<name>LockWidget</name>
<message>
<source>screen lock</source>
- <translation>Bildschirmsperre</translation>
+ <translation>قفل الشاشة</translation>
</message>
</context>
<context>
<name>LogonGroupEditor</name>
<message>
<source>Logon group editor</source>
- <translation>Anmeldungsgruppeneditor</translation>
+ <translation>الدخول إلى محرر المجموعة</translation>
</message>
<message>
<source>Please add the groups whose members should be allowed to access computers in your iTALC network.</source>
- <translation>Bitte fügen Sie die Gruppen hinzu, deren Mitgliedern der Zugriff auf Computern in Ihrem iTALC-Netzwerk gestattet sein soll.</translation>
+ <translation>يرجى إضافة المجموعات التي يجب السماح لأعضائها بالوصول إلى الحاسبات على شبكة "آيتالك" </translation>
</message>
<message>
<source>All groups</source>
- <translation>Alle Gruppen</translation>
+ <translation>جميع المجموعات</translation>
</message>
<message>
<source>...</source>
@@ -712,81 +702,81 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e
</message>
<message>
<source>Groups with iTALC privileges</source>
- <translation>Gruppen mit iTALC-Privilegien</translation>
+ <translation>مجموعات ذات صلاحيات على "آيتالك"</translation>
</message>
</context>
<context>
<name>MainToolBar</name>
<message>
<source>Actions</source>
- <translation>Aktionen</translation>
+ <translation>عمليات</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<source>General</source>
- <translation>Allgemein</translation>
+ <translation>عام</translation>
</message>
<message>
<source>Quit</source>
- <translation>Beenden</translation>
+ <translation>خروج</translation>
</message>
<message>
<source>iTALC Management Console</source>
- <translation>iTALC Management Console</translation>
+ <translation>كونسولة إدارة نظام "آيتالك"</translation>
</message>
<message>
<source>iTALC Server</source>
- <translation>iTALC-Server</translation>
+ <translation>خادم "آيتالك"</translation>
</message>
<message>
<source>Paths</source>
- <translation>Pfade</translation>
+ <translation>مسارات</translation>
</message>
<message>
<source>Authentication</source>
- <translation>Authentifizierung</translation>
+ <translation>توثيق</translation>
</message>
<message>
<source>iTALC Service</source>
- <translation>iTALC-Dienst</translation>
+ <translation>خدمة "آيتالك"</translation>
</message>
<message>
<source>Hide tray icon</source>
- <translation>Icon im Systemabschnitt verstecken</translation>
+ <translation>إخفاء أيقونة الصينية</translation>
</message>
<message>
<source>Autostart</source>
- <translation>Autostart</translation>
+ <translation>التشغيل آليا</translation>
</message>
<message>
<source>Additional arguments</source>
- <translation>Zusätzliche Argumente</translation>
+ <translation>حجج إضافية</translation>
</message>
<message>
<source>Start service</source>
- <translation>Dienst starten</translation>
+ <translation>بدء الخدمة </translation>
</message>
<message>
<source>Stop service</source>
- <translation>Dienst stoppen</translation>
+ <translation>إيقاف الخدمة</translation>
</message>
<message>
<source>State:</source>
- <translation>Status:</translation>
+ <translation>بيان:</translation>
</message>
<message>
<source>Stopped</source>
- <translation>Beendet</translation>
+ <translation>توقف</translation>
</message>
<message>
<source>Logging</source>
- <translation>Logaufzeichnung</translation>
+ <translation>دخول</translation>
</message>
<message>
<source>Log file directory</source>
- <translation>Logdateiverzeichnis</translation>
+ <translation>دليل ملف الدخول</translation>
</message>
<message>
<source>...</source>
@@ -794,481 +784,479 @@ Der öffentliche Schlüssel wird auf den Clientcomputern genutzt, um für jede e
</message>
<message>
<source>Log level</source>
- <translation>Loglevel</translation>
+ <translation>مستوى الدخول</translation>
</message>
<message>
<source>Nothing</source>
- <translation>Nichts</translation>
+ <translation>لا شيء</translation>
</message>
<message>
<source>Only critical messages</source>
- <translation>Nur kritische Nachrichten</translation>
+ <translation>فقط الرسائل الحرجة</translation>
</message>
<message>
<source>Errors and critical messages</source>
- <translation>Fehler und kritische Nachrichten</translation>
+ <translation>أخطاء ورسائل حرجة </translation>
</message>
<message>
<source>Warnings and errors</source>
- <translation>Warnungen und Fehler</translation>
+ <translation>تحذيرات وأخطاء </translation>
</message>
<message>
<source>Information, warnings and errors</source>
- <translation>Informationen, Warnungen und Fehler</translation>
+ <translation>المعلومات، والتحذيرات والأخطاء</translation>
</message>
<message>
<source>Debug messages and everything else</source>
- <translation>Debugmeldungen und alles andere</translation>
+ <translation>رسائل الأخطاء وما عداها</translation>
</message>
<message>
<source>Limit log file size</source>
- <translation>Logdateigröße begrenzen</translation>
+ <translation>تحديد حجم ملف الدخول</translation>
</message>
<message>
<source>MB</source>
- <translation>MB</translation>
+ <translation>ام بي</translation>
</message>
<message>
<source>Clear all log files</source>
- <translation>Alle Logdateien leeren</translation>
+ <translation>مسح كافة ملفات الدخول</translation>
</message>
<message>
<source>Desktop capturing</source>
- <translation>Bildschirmaufzeichnung</translation>
+ <translation>إلتقاط صورة سطح المكتب</translation>
</message>
<message>
<source>Enable capturing of layered (semi-transparent) windows</source>
- <translation>Halbdurchsichtige Fenster (layered windows) aufzeichnen</translation>
- </message>
- <message>
- <source>Poll full screen</source>
- <translation>Vollen Bildschirm abfragen</translation>
+ <translation>تمكين إلتقاط صورة نوافذ طبقية (شبه شفافة)</translation>
</message>
<message>
<source>Low accuracy (turbo mode)</source>
- <translation>Niedrige Genauigkeit (Turbomodus)</translation>
+ <translation>دقة منخفضة (وضعية تيربو)</translation>
</message>
<message>
<source>Demo server</source>
- <translation>Demoserver</translation>
+ <translation>خادم العرض</translation>
</message>
<message>
<source>Network</source>
- <translation>Netzwerk</translation>
+ <translation>شبكة</translation>
</message>
<message>
<source>Core server port</source>
- <translation>Core-Server-Port</translation>
+ <translation>منفذ الخادم الأساسي</translation>
</message>
<message>
<source>Demo server port</source>
- <translation>Demoserver-Port</translation>
+ <translation>منفذ خادم العرض </translation>
</message>
<message>
<source>Enable firewall exception</source>
- <translation>Firewall-Ausnahme aktivieren</translation>
+ <translation>تمكين إستثناء الجدار الناري</translation>
</message>
<message>
<source>Configuration files</source>
- <translation>Konfigurationsdateien</translation>
+ <translation>ملفات التهيئة</translation>
</message>
<message>
<source>Global configuration</source>
- <translation>Globale Konfiguration</translation>
+ <translation>تهيئة عامة </translation>
</message>
<message>
<source>Personal configuration</source>
- <translation>Persönliche Konfiguration</translation>
+ <translation>تهيئة شخصية </translation>
</message>
<message>
<source>Data directories</source>
- <translation>Datenverzeichnisse</translation>
+ <translation>أدلة البيانات</translation>
</message>
<message>
<source>Snapshots</source>
- <translation>Schnappschüsse</translation>
+ <translation>لقطات</translation>
</message>
<message>
<source>Authentication methods</source>
- <translation>Authentifizierungsmethoden</translation>
+ <translation>طرق التوثيق</translation>
</message>
<message>
<source>Access key management</source>
- <translation>Schlüsselverwaltung</translation>
+ <translation>إدارة مفاتيح الوصول</translation>
</message>
<message>
<source>Logon settings</source>
- <translation>Anmeldeeinstellungen</translation>
+ <translation>إعدادات الدخول</translation>
</message>
<message>
<source>&File</source>
- <translation>&Datei</translation>
+ <translation>&ملف</translation>
</message>
<message>
<source>&Help</source>
- <translation>&Hilfe</translation>
+ <translation>&مساعدة</translation>
</message>
<message>
<source>&Quit</source>
- <translation>&Beenden</translation>
+ <translation>&خروج</translation>
</message>
<message>
<source>Ctrl+Q</source>
- <translation>Strg+Q</translation>
+ <translation>Ctrl+Q</translation>
</message>
<message>
<source>&Save settings into file</source>
- <translation>Einstellungen in Datei &speichern</translation>
+ <translation>&حفظ الاعدادات في الملف</translation>
</message>
<message>
<source>Save settings into file</source>
- <translation>Einstellungen in Datei speichern</translation>
+ <translation>حفظ الاعدادات في الملف</translation>
</message>
<message>
<source>Ctrl+S</source>
- <translation>Strg+S</translation>
+ <translation>Ctrl+S</translation>
</message>
<message>
<source>L&oad settings from file</source>
- <translation>Einstellungen aus Datei &laden</translation>
+ <translation>تحميل الاعدادات من الملف</translation>
</message>
<message>
<source>Ctrl+O</source>
- <translation>Strg+O</translation>
+ <translation>Ctrl+O</translation>
</message>
<message>
<source>About iTALC</source>
- <translation>Über iTALC</translation>
+ <translation>حول "آيتالك"</translation>
</message>
<message>
<source>About Qt</source>
- <translation>Über Qt</translation>
+ <translation>حول"كيو تي"</translation>
</message>
<message>
<source>MainWindow</source>
- <translation></translation>
+ <translation>الشاشة الرئيسية</translation>
</message>
<message>
<source>toolBar</source>
- <translation></translation>
+ <translation>شريط الأدوات</translation>
</message>
<message>
<source>iTALC Management Console %1</source>
- <translation>iTALC Management Console %1</translation>
+ <translation>كونسولة إدارة نظام "آيتالك" 1%</translation>
</message>
<message>
<source>Running</source>
- <translation>Läuft</translation>
+ <translation>تشغيل</translation>
</message>
<message>
<source>Load settings from file</source>
- <translation>Einstellungen aus Datei laden</translation>
+ <translation>تحميل الاعدادات من الملف</translation>
</message>
<message>
<source>XML files (*.xml)</source>
- <translation>XML-Dateien (*.xml)</translation>
+ <translation>(*.xml) XML ملفات </translation>
</message>
<message>
<source>Save settings to file</source>
- <translation>Einstellungen in Datei speichern</translation>
+ <translation>حفظ الاعدادات إلى الملف</translation>
</message>
<message>
<source>Unsaved settings</source>
- <translation>Ungespeicherte Einstellungen</translation>
+ <translation>إعدادات لم يتم حفظها</translation>
</message>
<message>
<source>There are unsaved settings. Quit anyway?</source>
- <translation>Einige Einstellungen sind nicht gespeichert. Trotzdem beenden?</translation>
+ <translation>هنالك إعدادات لم يتم حفظها. هل ترغب في الخروج على أي حال؟</translation>
</message>
<message>
<source>Configuration not writable</source>
- <translation>Konfiguration nicht schreibbar</translation>
+ <translation>تعيئة غير قابلة للكتابة</translation>
</message>
<message>
<source>The local configuration backend reported that the configuration is not writable! Please run the iTALC Management Console with higher privileges.</source>
- <translation>Laut lokalem Konfigurationsbackend ist die Konfiguration nicht scheibbar! Bitte führen Sie die iTALC-Management-Console mit höheren Privilegien aus.</translation>
+ <translation>يبدو ان ملف التهيئة المحلية الخلفي أن التهيئة غير قابلة للكتابة! يرجى تشغيل كونسولة إدارة "آيتالك" بصلاحيات عالية </translation>
</message>
<message>
<source>All settings were applied successfully.</source>
- <translation>Alle Einstellungen wurden erfolgreich angewendet.</translation>
+ <translation>تم تطبيق كافة الإعدادات بنجاح</translation>
</message>
<message>
<source>An error occured while applying settings!</source>
- <translation>Beim Anwenden der Einstellungen ist ein Fehler aufgetreten!</translation>
+ <translation>حدث خطأ أثناء عملية تطبيق الإعدادات</translation>
</message>
<message>
<source>iTALC</source>
- <translation>iTALC</translation>
+ <translation>"آيتالك"</translation>
</message>
<message>
<source>No write access</source>
- <translation>Kein Schreibzugriff</translation>
+ <translation>لا يوجد وصول للكتابة </translation>
</message>
<message>
<source>Could not read/write or create directory %1! For running iTALC, make sure you're permitted to create or write this directory.</source>
- <translation>Konnte das Verzeichnis %1 nicht lesen/schreiben oder erstellen. Um iTALC auszuführen, stellen Sie sicher, dass Sie berechtigt sind, dieses Verzeichnis zu erzeugen oder zu beschreiben.</translation>
+ <translation>تعذر قراءة أوكتابة أو إنشاء دليل لـ 1%! لتشغيل "آيتالك" يرجى التأكد من أن لديك صلاحية إنشاء أو كتابة هذا الدليل. </translation>
</message>
<message>
<source>Classroom</source>
- <translation>Klassenraum</translation>
+ <translation>غرفة دراسة</translation>
</message>
<message>
<source>Switch classroom</source>
- <translation>Klassenraum wechseln</translation>
+ <translation>تحويل غرفة الدراسة</translation>
</message>
<message>
<source>Click this button to open a menu where you can choose the active classroom.</source>
- <translation>Klicken Sie auf diesen Knopf, um ein Menü zu öffnen, in dem sie den aktiven Klassenraum wählen können.</translation>
+ <translation>أنقر على هذا المفتاح، لفتح قائمة يمكنك منها إختيار الفصل النشط </translation>
</message>
<message>
<source>Click on this button, to switch between classrooms.</source>
- <translation>Klicken Sie auf diesen Knopf, um zwischen Klassenräumen zu wechseln.</translation>
+ <translation>أنقر على هذا المفتاح، للتحول بين الفصول</translation>
</message>
<message>
<source>Overview mode</source>
- <translation>Übersichtsmodus</translation>
+ <translation>وضع اللمحة العامة</translation>
</message>
<message>
<source>Overview</source>
- <translation>Übersicht</translation>
+ <translation>لمحة عامة</translation>
</message>
<message>
<source>This is the default mode in iTALC and allows you to have an overview over all visible computers. Also click on this button for unlocking locked workstations or for leaving demo-mode.</source>
- <translation>Dies ist der Standardmodus in iTALC und ermöglicht es, einen Überblick über alle sichtbaren Computer zu bekommen. Weiterhin werden gesperrte Bildschirme entsperrt oder der Demo-Modus verlassen, wenn Sie auf diesen Knopf klicken.</translation>
+ <translation>هذه هي الوضعية الافتراضية لنظام "آيتالك" وتمكنك من الاطلاع على كافة الحاسبات الظاهرة. أيضا أنقر على هذا الزر لفتح محطات العمل المغلقة أو الخروج من وضعية العرض التعريفي.</translation>
</message>
<message>
<source>Fullscreen demo</source>
- <translation>Vollbild-Demo</translation>
+ <translation>عرض تعريفي ملء الشاشة</translation>
</message>
<message>
<source>Fullscreen Demo</source>
- <translation>Vollbild-Demo</translation>
+ <translation>عرض تعريفي ملء الشاشة</translation>
</message>
<message>
<source>Stop Demo</source>
- <translation>Demo beenden</translation>
+ <translation>إيقاف العرض التعريفي</translation>
</message>
<message>
<source>In this mode your screen is being displayed on all shown computers. Furthermore the users aren't able to do something else as all input devices are locked in this mode.</source>
- <translation>In diesem Modus wird Ihr Bildschirm auf alle angezeigte Computer übertragen. Weiterhin können die Nutzer nichts anderes machen, da in diesem Modus sämtliche Eingabegeräte gesperrt sind.</translation>
+ <translation>بهذا الوضع، يتم عرض شاشتك على نافذة على كافة الحاسبات الظاهرة. كما أنه لا يمكن للمستخدمين أداء عمل آخر إذ أن جميع الأجهزة تكون مغلقة في هذا الوضع.</translation>
</message>
<message>
<source>Window demo</source>
- <translation>Fenster-Demo</translation>
+ <translation>نافذة عرض تعريفي</translation>
</message>
<message>
<source>Window Demo</source>
- <translation>Fenster-Demo</translation>
+ <translation>نافذة عرض تعريفي</translation>
</message>
<message>
<source>In this mode your screen being displayed in a window on all shown computers. The users are able to switch to other windows and thus can continue to work.</source>
- <translation>In diesem Modus wird Ihr Bildschirm auf alle angezeigte Computer in einem Fenster übertragen. Die Nutzer sind in der Lage, zu anderen Fenstern zu wechseln und somit ihre Arbeiten fortzusetzen.</translation>
+ <translation>بهذا الوضع، يتم عرض شاشتك على نافذة على كافة الحاسبات الظاهرة. يمكن للمستخدمين التحول إلى نوافذ أخرى ومواصلة عملهم </translation>
</message>
<message>
<source>Lock/unlock desktops</source>
- <translation>Arbeitsflächen sperren/freigeben</translation>
+ <translation>إغلاق أو فتح أسطح المكاتب</translation>
</message>
<message>
<source>Lock all</source>
- <translation>Alle sperren</translation>
+ <translation>إغلاق الجميع</translation>
</message>
<message>
<source>Unlock all</source>
- <translation>Alle freigeben</translation>
+ <translation>فتح الجميع</translation>
</message>
<message>
<source>To have all user's full attention you can lock their desktops using this button. In this mode all input devices are locked and the screen is black.</source>
- <translation>Um die volle Aufmerksamkeit der Nutzer zu erlangen können Sie deren Arbeitsflächen mit Hilfe dieses Knopfes sperren. In diesem Modus werden alle Eingabegeräte gesperrt und der Bildschirm ist schwarz.</translation>
+ <translation>للفت إنتباه كافة المستخدمين، يمكنك إغلاق سطح المكتب لديهم باستخدام هذا الزر. في هذا الوضع، يتم قفل جميع أجهزة الإدخال وتصبح الشاشات سوداء.</translation>
</message>
<message>
<source>Send text message</source>
- <translation>Text-Nachricht schicken</translation>
+ <translation>إرسال رسالة نصية</translation>
</message>
<message>
<source>Text message</source>
- <translation>Text-Nachricht</translation>
+ <translation>رسالة نصيِّة</translation>
</message>
<message>
<source>Use this button to send a text message to all users e.g. to tell them new tasks etc.</source>
- <translation>Nutzen Sie diesen Knopf, um an alle Nutzer eine Text-Nachricht zu schicken, beispielsweise um ihnen neue Aufgaben mitzuteilen.</translation>
+ <translation>استخدم هذا الزر لإرسال رسالة نصية لجميع المستخدمين، مثلا لإخطارهم بمهمة جديدة أو ما شابه.</translation>
</message>
<message>
<source>Power on computers</source>
- <translation>Computer anschalten</translation>
+ <translation>تشغيل الحاسبات</translation>
</message>
<message>
<source>Power on</source>
- <translation>Anschalten</translation>
+ <translation>تشغيل</translation>
</message>
<message>
<source>Click this button to power on all visible computers. This way you do not have to turn on each computer by hand.</source>
- <translation>Klicken Sie auf diesen Knopf, um alle angezeigten Computer anzuschalten. Auf diese Weise müssen Sie nicht jeden Computer einzeln per Hand einschalten.</translation>
+ <translation>أنقر هذا الزر لتشغيل جميع الحاسبات الظاهرة. بهذه الآلية، لن تحتاج إلى تشغيل كل حاسب يدويا </translation>
</message>
<message>
<source>Power down computers</source>
- <translation>Computer ausschalten</translation>
+ <translation>إطفاء الحاسبات</translation>
</message>
<message>
<source>Power down</source>
- <translation>Ausschalten</translation>
+ <translation>إطفاء</translation>
</message>
<message>
<source>To power down all shown computers (e.g. after the lesson has finished) you can click this button.</source>
- <translation>Um alle angezeigten Computer herunterzufahren (z.B. nach Stundenende) klicken Sie einfach auf diesen Knopf.</translation>
+ <translation>لإطفاء كافة الحاسبات الظاهرة (مثلا، بعد إنتهاء الدرس) يمكنك النقر على هذا الزر.</translation>
</message>
<message>
<source>Support</source>
- <translation>Unterstützung</translation>
+ <translation>الدعم</translation>
</message>
<message>
<source>Direct support</source>
- <translation>Direkte Unterstützung</translation>
+ <translation>دعم مباشر</translation>
</message>
<message>
<source>If you need to support someone at a certain computer you can click this button and enter the according hostname or IP afterwards.</source>
- <translation>Wenn Sie jemanden an einem bestimmten Computer unterstützen wollen, können Sie diesen Button anklicken und anschließend den entsprechenden Rechnernamen oder die IP eingeben.</translation>
+ <translation>إذا رغبت في دعم أحد المستخدمين لحاسب معين يمكنك النقر على هذا الزر وادخال اسم المضيف أو عنوان IP بعد ذلك.</translation>
</message>
<message>
<source>Adjust/align</source>
- <translation>Ausrichtung</translation>
+ <translation>ضبط أو محاذاة</translation>
</message>
<message>
<source>Adjust windows and their size</source>
- <translation>Fenster und deren Größe ausrichten</translation>
+ <translation>قم بضبط النوافذ ومقاسها</translation>
</message>
<message>
<source>When clicking this button the biggest possible size for the client-windows is adjusted. Furthermore all windows are aligned.</source>
- <translation>Wenn Sie diesen Knopf anklicken, wird die größt-mögliche Größe für die Fenster eingestellt. Weiterhin werden alle Fenster ausgerichtet.</translation>
+ <translation>عند النقر على هذا الزر، يتم ضبط نوافذ الحاسب الفرعي على أكبر مقاس ممكن لها. كما تتم محاذاة جميع النوافذ.</translation>
</message>
<message>
<source>Auto view</source>
- <translation>Anordnung</translation>
+ <translation>معاينة آلية</translation>
</message>
<message>
<source>Auto re-arrange windows and their size</source>
- <translation>Automatische Neuanordnung der Fenster und deren Größe</translation>
+ <translation>إعادة ترتيب النوافذ ومقاساتها آليا</translation>
</message>
<message>
<source>When clicking this button all visible windows are re-arranged and adjusted.</source>
- <translation>Wenn Sie diesen Knopf anklicken werden alle sichtbaren Fenster neu angeordnet und ausgerichtet.</translation>
+ <translation>عند النقر على هذا الزر، تتم إعادة ترتيب وضبط كافة النوافذ الظاهرة.</translation>
</message>
<message>
<source>iTALC Master Control</source>
- <translation>iTALC Master Steuerung</translation>
+ <translation>التحكم الرئيسي في "آيتالك"</translation>
</message>
<message>
<source>Remote control</source>
- <translation>Fernsteuern</translation>
+ <translation>تحكم من بُعد</translation>
</message>
<message>
<source>Could not modify the autostart property for the iTALC Service.</source>
- <translation>Die Autostarteinstellung für den iTALC-Dienst konnte nicht geändert werden.</translation>
+ <translation>تعذر تعديل خاصية التشغيل الآلي لنظام "آيتالك"</translation>
</message>
<message>
<source>Could not modify the service arguments for the iTALC Service.</source>
- <translation>Die zusätzlichen Argumente für den iTALC-Dienst konnten nicht geändert werden.</translation>
+ <translation>تعذر تعديل خاصية حجج الخدمة لنظام "آيتالك"</translation>
</message>
<message>
<source>Could not change the firewall configuration for the iTALC Service.</source>
- <translation>Die Firewallkonfiguration für den iTALC-Dienst konnte nicht geändert werden.</translation>
+ <translation>تعذر تغيير تهيئة الجدار الناري لنظام "آيتالك" </translation>
</message>
<message>
<source>Debugging</source>
- <translation>Fehlersuche</translation>
+ <translation>إزالة الأخطاء </translation>
</message>
<message>
<source>Enable desktop switching for screen lock (experimental)</source>
- <translation>Desktopwechsel für Bildschirmsperre aktivieren (experimentell)</translation>
+ <translation>تمكين تحويل سطح المكتب لقفل الشاشة (تجريبي)</translation>
</message>
<message>
<source>Log to standard error output</source>
- <translation>Nach Standardfehlerausgabe loggen</translation>
+ <translation>الدخول إلى خرج الاخطاء القياسية</translation>
</message>
<message>
<source>Log to Windows event log</source>
- <translation>In Windows-Ereignisanzeige loggen</translation>
+ <translation>الدخول إلى نافذة احداث وندوز</translation>
</message>
<message>
<source>Backend</source>
- <translation>Backend</translation>
+ <translation>خلفي</translation>
</message>
<message>
<source>VNC reflector</source>
- <translation>VNC-Reflektor</translation>
+ <translation>VNC عاكس</translation>
</message>
<message>
<source>iTALC 1 demo server</source>
- <translation>iTALC 1 Demoserver</translation>
+ <translation>خادم العرض 1 "آيتالك"</translation>
</message>
<message>
<source>Multithreading (can be enabled when using the VNC reflector backend)</source>
- <translation>Multithreading (kann aktiviert werden, wenn das VNC-Reflektor-Backend genutzt wird)</translation>
+ <translation>مسارات تنفيذ متعددة (يمكن تفعيلها عند استخدام ملف شبكة الحوسبة الإلكترونية الخلفي)</translation>
</message>
<message>
<source>Enable HTTP server which provides a JavaViewer applet</source>
- <translation>HTTP-Server aktivieren, um JavaViewer-Applet bereitzustellen</translation>
+ <translation>تمكين خادم HTTP الذي يوفر عارض تطبيقات جافا </translation>
</message>
<message>
<source>HTTP server port</source>
- <translation>HTTP-Serverport</translation>
+ <translation>تقرير خادم HTTP</translation>
</message>
<message>
<source>Allow connections from localhost only</source>
- <translation>Nur Verbindungen vom lokalen Rechner erlauben</translation>
+ <translation>السماح بالتوصيل من المضيف المحلي فقط</translation>
</message>
<message>
<source>Key file authentication</source>
- <translation>Schlüsseldatei-Authentifizierung</translation>
+ <translation>توثيق ملف المفاتيح</translation>
</message>
<message>
<source>ACL-based logon authentication</source>
- <translation>ACL-basierte Anmelde-Authentifizierung</translation>
+ <translation>توثيق الدخول استنادا على قائمة التحكم في الوصول</translation>
</message>
<message>
<source>Public key file base directory</source>
- <translation>Basisverzeichnis der öffentlichen Schlüsseldatei</translation>
+ <translation>دليل ملفات المفاتيح العامة الأساسي </translation>
</message>
<message>
<source>Private key file base directory</source>
- <translation>Basisverzeichnis der privaten Schlüsseldatei</translation>
+ <translation>دليل ملفات المفاتيح الخاصة الأساسي </translation>
</message>
<message>
<source>Launch key file assistant</source>
- <translation>Schlüsseldatei-Assistent starten</translation>
+ <translation>تشغيل مساعد ملف المفاتيح</translation>
</message>
<message>
<source>Manage permissions</source>
- <translation>Berechtigungen verwalten</translation>
+ <translation>صلاحيات الإدارة </translation>
</message>
<message>
<source>Test</source>
- <translation>Testen</translation>
+ <translation>إختبار</translation>
</message>
<message>
<source>Access confirmation</source>
- <translation>Zugriffsbestätigung</translation>
+ <translation>تأكيد الوصول</translation>
</message>
<message>
<source>You can configure iTALC to ask the user for permission to access the desktop when using certain authentication methods.</source>
- <translation>Sie können iTALC so konfigurieren, dass der Nutzer bei bestimmten Authentifizierungsmethoden um Zugriffsbestätigung gebeten wird.</translation>
+ <translation>يمكن تهيئة "آيتالك" بحيث يمكنك طلب السماح من المستخدم للوصول إلى سطح مكتبه عند استخدام طرق توثيق معينة.</translation>
</message>
<message>
<source>Logon authentication</source>
- <translation>Anmelde-Authentifizierung</translation>
+ <translation>توثيق الدخول</translation>
</message>
<message>
<source>Allow same user to access desktop without confirmation</source>
- <translation>Gleichen Nutzer erlauben, ohne Bestätigung auf Arbeitsfläche zuzugreifen</translation>
+ <translation>السماح لذات المستخدم من الوصول إلى سطح المكتب دون تأكيد. </translation>
</message>
<message>
<source>Debugging iTALC</source>
- <translation>iTALC-Fehlersuche</translation>
+ <translation>إزالة الأخطاء من "آيتالك"</translation>
</message>
<message>
<source>When encountering bugs or other misbehaviour in iTALC it is important to inform the developers about them, so that the bugs can be fixed in future releases. This page allows you to submit a helpful bug report easily.
If the bug is not reproducible, skip step 1) - 3).</source>
- <translation type="unfinished"></translation>
+ <translation>عند مواجهة أخطاء أو سوء تشغيل في "آيتالك" فمن الضروري إخطار المطورين عنهاحتى تتم معالجة الاخطاء في الإصدارات اللاحقة. هذه الصفحة تمكنك من رفع تقرير أخطاء مفيد بكل سهولة.
+
+إذا كان الخطأ غير قابل للنسخ، تجاوز الخطوة 1 الى 3</translation>
</message>
<message>
<source>1)</source>
@@ -1276,7 +1264,7 @@ If the bug is not reproducible, skip step 1) - 3).</source>
</message>
<message>
<source>Clear the logfiles in the "General" section.</source>
- <translation>Löschen Sie die Logdateien im Abschnitt "Allgemein".</translation>
+ <translation> مسح ملفات الدخول في القسم "عام"</translation>
</message>
<message>
<source>2)</source>
@@ -1284,7 +1272,7 @@ If the bug is not reproducible, skip step 1) - 3).</source>
</message>
<message>
<source>In the "General" section set the log level to "Debug messages and everything else".</source>
- <translation>Setzen Sie den Logleve im Abschnitt "Allgemein" auf "Debugmeldungen und alles andere".</translation>
+ <translation> في قسم "عام" قم بضبط مستوى الدخول عند "رسائل إزالة الأخطاء وغيرها"</translation>
</message>
<message>
<source>3)</source>
@@ -1292,7 +1280,7 @@ If the bug is not reproducible, skip step 1) - 3).</source>
</message>
<message>
<source>Repeat the actions leading to the bug or misbehaviour.</source>
- <translation>Wiederholen Sie die Handlungen, die den Fehler oder das Fehlverhalten hevorrufen.</translation>
+ <translation> تكرار الإجراءات المؤدية إلى الخطأ أو سوء الأداء </translation>
</message>
<message>
<source>4)</source>
@@ -1300,11 +1288,11 @@ If the bug is not reproducible, skip step 1) - 3).</source>
</message>
<message>
<source>Click the following button and save the file to a known location.</source>
- <translation>Klicken Sie auf den folgenden Knopf und speichern die Datei an eine bekannte Stelle.</translation>
+ <translation> أنقر هذا الزر لحفظ الملف في وجهة معروفة</translation>
</message>
<message>
<source>Generate bug report archive</source>
- <translation>Fehlerberichtsarchiv erstellen</translation>
+ <translation>إنتاج ارشيف تقارير أخطاء</translation>
</message>
<message>
<source>5)</source>
@@ -1315,94 +1303,145 @@ If the bug is not reproducible, skip step 1) - 3).</source>
<br/>
<br/>
Note: if the bug involves both a master and client computer, attach bug report archives for both computers.</source>
- <translation type="unfinished"></translation>
+ <translation>اذهب إلى http://sourceforge.net/tracker/?group_id=132465&atid=724375" للوصول إلى راصد أخطاء"آيتالك"، افتح ملف أخطاء جديد، صف ما قمت به في الخطوة 3 ثم أرفق الملف الذي حفظته في
+
+
+ملحوظة: إذا كان الخطأ يشمل حاسب رئيسي وحاسب فرعي، قم بإلحاق أرشيف تقرير الأخطاء لكلا الحاسبين. </translation>
</message>
<message>
<source>Restart iTALC Service</source>
- <translation>iTALC-Dienst neustarten</translation>
+ <translation>إعادة تشغيل خدمة "آيتالك" </translation>
</message>
<message>
<source>All settings were saved successfully. In order to take effect the iTALC service needs to be restarted. Restart it now?</source>
- <translation>Alle Einstellungen wurden erfolgreich gespeichert. Um die Änderungen anzuwenden muss der iTALC-Dienst neugestartet werden. Dienst jetzt neustarten?</translation>
+ <translation>تم حفظ كافة الإعدادات بنجاح. لتفعيلها يلزم إعادة تشغيل آيتالك". هل ترغب في إعادة التشغيل الآن؟</translation>
</message>
<message>
<source>Starting iTALC service</source>
- <translation>Starte iTALC-Dienst</translation>
+ <translation>بدء خدمة "آيتالك"</translation>
</message>
<message>
<source>Stopping iTALC service</source>
- <translation>Stoppe iTALC-Dienst</translation>
+ <translation>إيقاف خدمة "آيتالك"</translation>
</message>
<message>
<source>The iTALC service needs to be stopped temporarily in order to remove the log files. Continue?</source>
- <translation>Der iTALC-Dienst muss temporär gestoppt werden, um die Logdateien zu entfernen. Fortfahren?</translation>
+ <translation>تحتاج خدمة "آيتالك" للإيقاف الموقت لأجل إزالة ملفات الدخول. هل ترغب في الاستمرار</translation>
</message>
<message>
<source>Log files cleared</source>
- <translation>Logdateien gelösch</translation>
+ <translation>مسح ملفات الدخول</translation>
</message>
<message>
<source>All log files were cleared successfully.</source>
- <translation>Alle Logdateien wurden erfolgreich gelöscht.</translation>
+ <translation>تمت إزالة جميع ملفات الدخول بنجاح</translation>
</message>
<message>
<source>Error</source>
- <translation>Fehler</translation>
+ <translation>خطأ</translation>
</message>
<message>
<source>Could not remove all log files.</source>
- <translation>Konnte nicht alle Logdateien entfernen.</translation>
+ <translation>تعذرت إزالة كافة ملفات الدخول</translation>
</message>
<message>
<source>Logon authentication test</source>
- <translation>Test der Anmelde-Authentifizierung</translation>
+ <translation>إختبار توثيق الدخول</translation>
</message>
<message>
<source>Authentication with provided credentials was successful.</source>
- <translation>Die Authentifizierung mit den angegebenen Anmeldedaten war erfolgreich.</translation>
+ <translation>نجحت عملية التوثيق عبر بيانات التوثيق المقدمة </translation>
</message>
<message>
<source>Authentication with provided credentials failed!</source>
- <translation>Die Authentifizierung mit den angegebenen Anmeldedaten ist fehlgeschlagen!</translation>
+ <translation>أخفقت عملية التوثيق عبر بيانات التوثيق المقدمة </translation>
</message>
<message>
<source>Save bug report archive</source>
- <translation>Fehlerberichtsarchiv speichern</translation>
+ <translation>حفظ أرشيف تقارير الأخطاء </translation>
</message>
<message>
<source>iTALC bug report archive (*.ibra.xml)</source>
- <translation>iTALC-Fehlerberichtsarchiv (*.ibra.xml)</translation>
+ <translation> لنظام "آيتالك"(*.ibra.xml) أرشيف تقارير الاخطاء </translation>
</message>
<message>
<source>iTALC bug report archive saved</source>
- <translation>iTALC-Fehlerberichtsarchiv gespeichert</translation>
+ <translation>تم حفظ أرشيف تقارير الاخطاء لنظام "آيتالك"</translation>
</message>
<message>
<source>An iTALC bug report archive has been saved to %1. It includes iTALC log files and information about your operating system. You can attach it to a bug report.</source>
- <translation>Ein iTALC-Fehlerberichtsarchiv wurde nach %1 gespeichert. Es beinhaltet iTALC-Logdateien und Informationen über Ihre Betriebssystem. Sie können es an einen Fehlerbericht anhängen.</translation>
+ <translation>تم حفظ تقرير أرشيفي لأخطاء "آيتالك" على 1%. وهو يحتوي على ملفات دخول "آيتالك" ومعلومات عن نظام التشغيل لديك. يمكنك إلحاقه بتقرير أخطاء. </translation>
</message>
<message>
<source>Could not contact iTALC service</source>
- <translation>Kein Kontakt zum iTALC-Dienst</translation>
+ <translation>تعذر الاتصال بنظام "آيتالك"</translation>
</message>
<message>
<source>Could not contact the local iTALC service. It is likely that you entered wrong credentials or key files are not set up properly. Try again or contact your administrator for solving this problem using the iTALC Management Console.</source>
- <translation>Es konnte keine Verbindung zum lokalen iTALC-Dienst hergestellt werden. Wahrscheinlich haben Sie falsche Anmeldedaten eingegeben oder die Schlüsseldateien sind nicht richtig eingerichtet. Versuchen SIe es erneut oder konktaktieren Sie Ihren Administrator, um das Problem mit Hilfe der iTALC-Management-Console zu lösen.</translation>
+ <translation>تعذر الاتصال بنظام "آيتالك" المحلي. من المرجح إنك أدخلت بيانات توثيق خاطئة، او أن الملفات لم يتم إنشاؤها بطريقة صحيحة. حاول ثانية أو اتصل بمدير النظام لحل هذه المشكلة باستخدام كنسولة إدارة "آيتالك". </translation>
</message>
<message>
<source>Authentication impossible</source>
- <translation>Authentifizierung nicht möglich</translation>
+ <translation>يتعذر التوثيق</translation>
</message>
<message>
<source>No authentication key files were found or your current ones are outdated. Please create new key files using the iTALC Management Console. Alternatively set up logon authentication using the iTALC Management Console. Otherwise you won't be able to access computers using iTALC.</source>
- <translation>Es wurden keine Authentifizierungsschlüsseldateien gefunden oder sie sind veraltet. Bitte erstellen Sie neue Schlüsseldateien mit Hilfe der iTALC-Management-Console. Alternativ können Sie die Anmelde-Authentifizierung mit Hilfe der iTALC-Management-Console einrichten. Andernfalls werden Sie nicht in der Lage sein, mit iTALC auf andere Rechner zuzugreifen.</translation>
+ <translation>تعذر العثور على ملفات مفاتيح التوثيق أو أن ملفاتك الحالية قديمة. يرجى إنشاء ملفات مفاتيح جديدة باستخدام كونسولة إدارة نظام "آيتالك". عوضا عن ذلك، قم باعداد توثيق الدخول باستخدام كونسولة إدارة نظام "آيتالك"، وإلا سوف </translation>
+ </message>
+ <message>
+ <source>Poll full screen (leave this enabled per default)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Remote Logon</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Logon key sequence settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Key sequence</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Alt+Ctrl+Del</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Tab</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Shift+Tab</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Escape</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><username></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><password></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Custom key</source>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MessageBoxSlave</name>
<message>
<source>Message from teacher</source>
- <translation>Nachricht vom Lehrer</translation>
+ <translation>رسالة من المدرس </translation>
</message>
</context>
<context>
@@ -1412,233 +1451,234 @@ Note: if the bug involves both a master and client computer, attach bug report a
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600; font-style:italic;">Welcome to iTALC!</span></p></body></html></source>
- <translation><html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600; font-style:italic;">Willkommen bei iTALC!</span></p></body></html></translation>
+ <translation>مرحبا بك إلى "آيتالك"</translation>
</message>
<message>
<source>Here you see the working-bar which contains several buttons. Each button is connected to a workspace. Just take a look at the available workspaces by clicking on the corresponding button.</source>
- <translation>Hier sehen Sie die Arbeitsleiste mit ihren verschiedenen Knöpfe. Jeder Knopf ist mit einem Arbeitsbereich verbunden. Schauen Sie sich einfach einmal die verfügbaren Arbeitsbereiche an, indem Sie auf den entsprechenden Knopf klicken.</translation>
+ <translation>هنا يمكنك رؤية شريط العمل الذي يحتوي على عدة أزر. كل زر متصل بمساحة عمل معينة. يمكنك معاينة مساحات العمل المتاحة عبر النقر على الزر المقابل.</translation>
</message>
<message>
<source>Using the classroom-manager you can manage your classrooms and computers. You can also see which users are logged in.</source>
- <translation>Mit Hilfe der Klassenraum-Verwaltung können Sie Ihre Klassenräume und Computer verwalten. Sie können außerdem sehen, welche Nutzer angemeldet sind.</translation>
+ <translation>باستخدام مدير غرفة الدراسة يمكنك إدارة غرفك الدراسية وحاسباتها. كما يمكنك أيضا معاينة المستخدمين الداخلين على النظام.</translation>
</message>
<message>
<source>The snapshot-workspace is a very useful tool. It let's you manage the snapshots you made.</source>
- <translation>Der Schnappschuss-Arbeitsbereich ist ein sehr nützliches Werzeug, mit dem Sie ihre Schnappschüsse verwalten können.</translation>
+ <translation>إن مساحة عمل اللقطات هي أداة هامة. فهي تمكنك من إدارة اللقطات التي أخذتها.</translation>
</message>
<message>
<source>Of course you can configure iTALC. This is usually done using the configuration-workspace.</source>
- <translation>Natürlich können Sie iTALC auch einrichten. Dies wird in der Regel mit dem Konfigurations-Arbeitsbereich erledigt.</translation>
+ <translation>يمكنك، بالطبع، تهيئة "آيتالك". يتم القيام عادة بذلك باستخدام مساحة عمل التهيئة.</translation>
</message>
<message>
<source>About iTALC</source>
- <translation>Über iTALC</translation>
+ <translation>حول "آيتالك"</translation>
</message>
</context>
<context>
<name>OverviewWidget</name>
<message>
<source>Overview</source>
- <translation>Übersicht</translation>
+ <translation>لمحة عامة</translation>
</message>
<message>
<source>Some basic information on iTALC and how to use it.</source>
- <translation>Grundlegende Informationen über iTALC und dessen Benutzung.</translation>
+ <translation>بعض المعلومات الأساسية حول "آيتالك" وكيفية استخدامه.</translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
<message>
<source>Please enter your username and password in order to access iTALC clients.</source>
- <translation>Bitte geben Sie Ihren Nutzernamen und Ihr Passwort ein, um auf iTALC-Clients zugreifen zu können.</translation>
+ <translation>يرجى إدخالك اسم المستخدم وكلمة السر الخاصين بك للوصول إلى الحاسبات الفرعية لنظام "آيتالك".</translation>
</message>
<message>
<source>Username</source>
- <translation>Nutzername</translation>
+ <translation>اسم المستخدم </translation>
</message>
<message>
<source>Password</source>
- <translation>Passwort</translation>
+ <translation>كلمة السر</translation>
</message>
<message>
<source>iTALC Logon</source>
- <translation>iTALC-Anmeldung</translation>
+ <translation>الدخول إلى "آيتالك"</translation>
+ </message>
+ <message>
+ <source>Manage</source>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
<name>QApplication</name>
<message>
<source>Unable to register service '%1'.</source>
- <translation>Der Dienst '%1' konnte nicht registriert werden.</translation>
+ <translation>غير قادر على تسجيل الخدمة 1%</translation>
</message>
<message>
<source>The Service Control Manager could not be contacted (do you have the neccessary rights?!) - the service '%1' was not registered.</source>
- <translation>Es konnte keine Verbindung zum Service-Control-Manager hergestellt werden (haben Sie die nötigen Rechte?!) - der Dienst '%1' wurde nicht registriert.</translation>
+ <translation>تعذر الاتصال بمدير التحكم في الخدمة (هل لديك الصلاحيات اللازمة؟) - لم يتم تسجيل الخدمة 1%.</translation>
</message>
<message>
<source>The service '%1' is already registered.</source>
- <translation>Der Dienst '%1' ist bereits registriert.</translation>
+ <translation>الخدمة 1% مسجلة مسبقا</translation>
</message>
<message>
<source>The service '%1' could not be registered.</source>
- <translation>Der Dienst '%1' konnte nicht registriert werden.</translation>
+ <translation>تعذر تسجيل الخدمة 1% </translation>
</message>
<message>
<source>The service '%1' was successfully registered.</source>
- <translation>Der Dienst '%1' wurde erfolgreich registriert.</translation>
+ <translation>تم تسجيل الخدمة 1% بنجاح</translation>
</message>
<message>
<source>The service '%1' could not be stopped.</source>
- <translation>Der Dienst '%1' konnte nicht gestoppt werden.</translation>
+ <translation>تعذر إيقاف الخدمة 1% </translation>
</message>
<message>
<source>The service '%1' has been unregistered.</source>
- <translation>Der Dienst '%1' wurde entfernt.</translation>
+ <translation>تم إلغاء تسجيل الخدمة 1% </translation>
</message>
<message>
<source>The service '%1' isn't registered and therefore can't be unregistered.</source>
- <translation>Der Dienst '%1' ist nicht registriert und kann daher nicht entfernt werden.</translation>
+ <translation>الخدمة 1% غير مسجلة وبالتالي لا يمكن إلغاء تسجيلها</translation>
</message>
<message>
<source>The service '%1' could not be unregistered.</source>
- <translation>Der Dienst '%1' konnte nicht entfernt werden.</translation>
+ <translation>تعذر إلغاء تسجيل الخدمة 1% </translation>
</message>
<message>
<source>The service '%1' could not be found.</source>
- <translation>Der Dienst '%1' wurde nicht gefunden.</translation>
+ <translation>تعذر العثور على الخدمة 1% </translation>
</message>
<message>
<source>The Service Control Manager could not be contacted (do you have the neccessary rights?!) - the service '%1' was not unregistered.</source>
- <translation>Es konnte keine Verbindung zum Service-Control-Manager hergestellt werden (haben Sie die nötigen Rechte?!) - der Dienst '%1' wurde nicht entfernt.</translation>
+ <translation>تعذر الاتصال بمدير التحكم في الخدمة (هل لديك الصلاحيات اللازمة؟) - لم يتم إلغاءتسجيل الخدمة 1%.</translation>
</message>
<message>
<source>The Service Control Manager could not be contacted (do you have the neccessary rights?!) - the service '%1' was not stopped.</source>
- <translation>Es konnte keine Verbindung zum Service-Control-Manager hergestellt werden (haben Sie die nötigen Rechte?!) - der Dienst '%1' wurde nicht beendet.</translation>
+ <translation>تعذر الاتصال بمدير التحكم في الخدمة (هل لديك الصلاحيات اللازمة؟) - لم يتم إيقاف الخدمة 1%.</translation>
</message>
<message>
<source>iTALC Client %1 on %2:%3</source>
- <translation>iTALC Client %1 auf %2:%3</translation>
+ <translation>الحاسب الفرعي 1% لنظام "آيتالك" على 2% و3%</translation>
</message>
</context>
<context>
<name>RemoteControlWidget</name>
<message>
<source>View live (%1 @ %2)</source>
- <translation>Live anschauen (%1 @ %2)</translation>
+ <translation>معاينة حية (1% @ 2%)</translation>
</message>
<message>
<source>Remote control (%1 @ %2)</source>
- <translation>Fernsteuerung (%1 @ %2)</translation>
+ <translation>تحكم من بُعد (1% @ 2%)</translation>
</message>
<message>
<source>unknown user</source>
- <translation>unbekannter Nutzer</translation>
+ <translation>مستخدم غير معروف</translation>
</message>
</context>
<context>
<name>RemoteControlWidgetToolBar</name>
<message>
<source>View only</source>
- <translation>Nur beobachten</translation>
+ <translation>معاينة فقط</translation>
</message>
<message>
<source>Remote control</source>
- <translation>Fernsteuern</translation>
+ <translation>تحكم من بُعد</translation>
</message>
<message>
<source>Lock student</source>
- <translation>Schüler sperren</translation>
+ <translation>غلق الطالب</translation>
</message>
<message>
<source>Unlock student</source>
- <translation>Schüler freigeben</translation>
+ <translation>فتح الطالب</translation>
</message>
<message>
<source>Snapshot</source>
- <translation>Schnappschuss</translation>
+ <translation>لقطة</translation>
</message>
<message>
<source>Fullscreen</source>
- <translation>Vollbild</translation>
+ <translation>ملء الشاشة</translation>
</message>
<message>
<source>Window</source>
- <translation>Fenster</translation>
+ <translation>نافذة</translation>
</message>
<message>
<source>Quit</source>
- <translation>Beenden</translation>
+ <translation>خروج</translation>
</message>
<message>
<source>Connecting %1</source>
- <translation>Verbindung wird hergestellt %1</translation>
+ <translation>توصيل 1%</translation>
</message>
<message>
<source>Connected.</source>
- <translation>Verbindung hergestellt.</translation>
+ <translation>متصل</translation>
</message>
</context>
<context>
<name>RemoteLogonDialog</name>
<message>
<source>Remote logon</source>
- <translation>Ferngesteuerte Anmeldung</translation>
+ <translation>دخول من بُعد</translation>
</message>
<message>
<source>Use the fields below to enter the username, password and optional the domain name. These information will be used to logon the computer(s).</source>
- <translation type="unfinished"></translation>
+ <translation>استخدم هذا الحقل لادخال اسم المستخدم وكلمة السر وإختياريا اسم النطاق. سيتم استخدام هذه المعلومات للدخول إلى الحاسب أو الحاسبات</translation>
</message>
<message>
<source>Username</source>
- <translation>Nutzername</translation>
+ <translation>اسم المستخدم </translation>
</message>
<message>
<source>Password</source>
- <translation>Passwort</translation>
+ <translation>كلمة السر</translation>
</message>
<message>
<source>Domain</source>
- <translation>Domäne</translation>
+ <translation>النطاق</translation>
</message>
</context>
<context>
<name>RunCommandsDialog</name>
<message>
<source>Run commands</source>
- <translation>Befehle ausführen</translation>
+ <translation>تشغيل الأوامر</translation>
</message>
<message>
<source>Please enter the commands to run on the selected client(s). You can separate multiple commands by line.</source>
- <translation>Bitte geben Sie die Befehle ein, die auf den gewählten Clients ausgeführt werden sollen. Sie können mehre Befehle zeilenweise trennen.</translation>
+ <translation>يرجى إدخال الأوامر المطلوب تشغيلها على الحاسب أو الحاسبات الفرعية. يمكنك الفصل بين الأوامر المتعددة باستخدام أسطر متعددة</translation>
</message>
</context>
<context>
<name>Snapshot</name>
<message>
<source>unknown</source>
- <translation>unbekannt</translation>
+ <translation>غير معروف</translation>
</message>
<message>
<source>Could not take a snapshot as directory %1 doesn't exist and couldn't be created.</source>
- <translation>Konnte keinen Schnappschuss erstellen, da das Verzeichnis %1 nicht existiert und nicht erstellt werden konnte.</translation>
+ <translation>تعذر أخذ لقطة إذ أن الدليل 1% غير موجود ولا يمكن إنشاؤه </translation>
</message>
<message>
<source>Snapshot</source>
- <translation>Schnappschuss</translation>
+ <translation>لقطة</translation>
</message>
</context>
<context>
<name>SnapshotList</name>
<message>
<source>Snapshots</source>
- <translation>Schnappschüsse</translation>
+ <translation>لقطات</translation>
</message>
<message>
<source>Simply manage the snapshots you made using this workspace.</source>
- <translation>Verwalten Sie Ihre Schnappschüsse mit Hilfe dieses Arbeitsbereiches.</translation>
+ <translation>قم ببساطة بمعالجة اللقطات التي أخذتها باستخدام مساحة العمل هذه.</translation>
</message>
</context>
<context>
@@ -1648,119 +1688,119 @@ p, li { white-space: pre-wrap; }
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">All snapshots you made are listed here. You can make snapshots by selecting the according entry in the context-menu of a client-window. These snapshosts can be managed using the buttons below.</p></body></html></source>
- <translation><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hier sind alle Schnappschüsse aufgelistet, die Sie erstellt haben. Sie können Schnappschüsse erstellen, indem Sie den entsprechenden Eintrag im Kontextmenü eines Client-Fenster anklicken. Diese Schnappschüsse können mit Hilfe der unterhalb befindlichen Buttons verwaltet werden.</p></body></html></translation>
+ <translation>كافة اللقطات التي أخذتها موجودة هنا. يمكنك أخذ لقطات باختيار الدخول الملائم من قائمة السياق على نافذة الحاسب الفرعي. هذه اللقطات يمكن إدارتها باستخدام الأزرار أدناه. </translation>
</message>
<message>
<source>User:</source>
- <translation>Benutzer:</translation>
+ <translation>المستخدم</translation>
</message>
<message>
<source>Host:</source>
- <translation>Rechner:</translation>
+ <translation>مضيف</translation>
</message>
<message>
<source>Date:</source>
- <translation>Datum:</translation>
+ <translation>التاريخ</translation>
</message>
<message>
<source>Time:</source>
- <translation>Zeit:</translation>
+ <translation>الزمن</translation>
</message>
<message>
<source>Show</source>
- <translation>Anzeigen</translation>
+ <translation>عرض</translation>
</message>
<message>
<source>Delete</source>
- <translation>Löschen</translation>
+ <translation>حذف</translation>
</message>
</context>
<context>
<name>SupportDialog</name>
<message>
<source>Support</source>
- <translation>Unterstützung</translation>
+ <translation>دعم</translation>
</message>
<message>
<source>Please enter the IP address or the name of the host to which you want to connect.</source>
- <translation>Bitte geben Sie die IP-Adresse oder den Namen des Rechners an, mit dem Sie sich verbinden möchten.</translation>
+ <translation>يرجى إدخال عنوان IP أو اسم المضيف الذي ترغب في الاتصال به</translation>
</message>
</context>
<context>
<name>TextMessageDialog</name>
<message>
<source>Send text message</source>
- <translation>Text-Nachricht schicken</translation>
+ <translation>إرسال رسالة نصية</translation>
</message>
<message>
<source>Use the field below to type your message which will be sent to all selected users.</source>
- <translation>Nutzen Sie das Feld unterhalb, um Ihre Nachricht zu tippen, die an alle Nutzer geschickt wird.</translation>
+ <translation>استخدم الحقل أدناه لطباعة رسالتك التي سيتم ارسالها الى كافة المستخدمين المختارين</translation>
</message>
</context>
<context>
<name>VncView</name>
<message>
<source>Establishing connection to %1 ...</source>
- <translation>Verbindung zu %1 wird hergestellt ...</translation>
+ <translation>انشاء اتصال بـ 1%</translation>
</message>
</context>
<context>
<name>clientMenu</name>
<message>
<source>Overview</source>
- <translation>Übersicht</translation>
+ <translation>لمحة عامة</translation>
</message>
<message>
<source>Fullscreen demo</source>
- <translation>Vollbild-Demo</translation>
+ <translation>عرض على كامل الشاشة</translation>
</message>
<message>
<source>Window demo</source>
- <translation>Fenster-Demo</translation>
+ <translation>عرض على نافذة</translation>
</message>
<message>
<source>Locked display</source>
- <translation>Bildschirm gesperrt</translation>
+ <translation>شاشة مغلقة</translation>
</message>
<message>
<source>View live</source>
- <translation>Live anschauen</translation>
+ <translation>معاينة حيّة</translation>
</message>
<message>
<source>Remote control</source>
- <translation>Fernsteuern</translation>
+ <translation>تحكم من بُعد</translation>
</message>
<message>
<source>Let student show demo</source>
- <translation>Schüler Demo zeigen lassen</translation>
+ <translation>السماح للطالب بالعرض</translation>
</message>
<message>
<source>Send text message</source>
- <translation>Text-Nachricht schicken</translation>
+ <translation>إرسال رسالة نصية</translation>
</message>
<message>
<source>Logout user</source>
- <translation>Nutzer abmelden</translation>
+ <translation>إخراج المستخدم</translation>
</message>
<message>
<source>Take a snapshot</source>
- <translation>Einen Schnappschuss machen</translation>
+ <translation>أخذ لقطة</translation>
</message>
<message>
<source>Power on</source>
- <translation>Anschalten</translation>
+ <translation>تشغيل </translation>
</message>
<message>
<source>Reboot</source>
- <translation>Neustarten</translation>
+ <translation>إعادة تشغيل الحاسب </translation>
</message>
<message>
<source>Power down</source>
- <translation>Ausschalten</translation>
+ <translation>إطفاء </translation>
</message>
<message>
<source>Execute commands</source>
- <translation>Befehle ausführen</translation>
+ <translation>تنفيذ الأوامر </translation>
</message>
</context>
</TS>
diff --git a/lib/resources/dialog-password.png b/lib/resources/dialog-password.png
new file mode 100644
index 0000000..d34ab70
Binary files /dev/null and b/lib/resources/dialog-password.png differ
diff --git a/lib/resources/he.qm b/lib/resources/he.qm
new file mode 100644
index 0000000..69d9023
Binary files /dev/null and b/lib/resources/he.qm differ
diff --git a/lib/resources/fi.ts b/lib/resources/he.ts
similarity index 74%
copy from lib/resources/fi.ts
copy to lib/resources/he.ts
index d5078a2..289e80b 100644
--- a/lib/resources/fi.ts
+++ b/lib/resources/he.ts
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.0" language="fi_FI">
+<TS version="2.0" language="he_IL" sourcelanguage="en">
<context>
<name>AboutDialog</name>
<message>
@@ -9,12 +9,12 @@
</message>
<message>
<source>About</source>
- <translation type="unfinished">Tietoja</translation>
+ <translation type="unfinished">אודות</translation>
</message>
<message utf8="true">
<source>iTALC - Intelligent Teaching And Learning with Computers
-Copyright © 2004-2011 Tobias Doerffel</source>
+Copyright © 2004-2011 Tobias Doerffel / iTALC Solutions</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -23,11 +23,11 @@ Copyright © 2004-2011 Tobias Doerffel</source>
</message>
<message>
<source>Authors</source>
- <translation type="unfinished">Tekijät</translation>
+ <translation type="unfinished">יוצרים</translation>
</message>
<message>
<source>Translation</source>
- <translation type="unfinished">Käännös</translation>
+ <translation type="unfinished">Translation</translation>
</message>
<message>
<source>Current language not translated yet (or native English).
@@ -37,26 +37,12 @@ If you're interested in translating iTALC into your local or another langua
</message>
<message>
<source>License</source>
- <translation type="unfinished">Lisenssi</translation>
- </message>
- <message utf8="true">
- <source>iTALC - Intelligent Teaching And Learning with Computers
-
-Copyright © 2004-2011 Tobias Doerffel / iTALC Solutions</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">רישיון</translation>
</message>
</context>
<context>
<name>AccessDialogSlave</name>
<message>
- <source>Never for this session</source>
- <translation type="unfinished">Ei koskaan tälle istunnolle</translation>
- </message>
- <message>
- <source>Always for this session</source>
- <translation type="unfinished">Aina tälle istunnolle</translation>
- </message>
- <message>
<source>Confirm desktop access</source>
<translation type="unfinished"></translation>
</message>
@@ -64,200 +50,213 @@ Copyright © 2004-2011 Tobias Doerffel / iTALC Solutions</source>
<source>The user %1 at host %2 wants to access your desktop. Do you want to grant access?</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Never for this session</source>
+ <translation type="unfinished">לעולם לא בהתחברות זו</translation>
+ </message>
+ <message>
+ <source>Always for this session</source>
+ <translation type="unfinished">תמיד בהתחברות זו</translation>
+ </message>
</context>
<context>
<name>ClassroomManager</name>
<message>
<source>Classroom-Manager</source>
- <translation type="unfinished">Hallinta</translation>
+ <translation type="unfinished">ניהול כיתה</translation>
</message>
<message>
<source>Use this workspace to manage your computers and classrooms in an easy way.</source>
- <translation type="unfinished">Käytä tätä näkymää tietokoneiden ja luokkahuoneiden hallintaan.</translation>
+ <translation type="unfinished">כפתור זה משמש לניהול המחשבים והכיתות בצורה נוחה</translation>
</message>
<message>
<source>This is where computers and classrooms are managed. You can add computers or classrooms by clicking right in this list.</source>
- <translation type="unfinished">Tällä hallitset tietokoneita ja luokkahuoneita. Voit lisätä uusia koneita tai luokkahuoneita painamalla hiiren oikeaa näppäintä listassa.</translation>
+ <translation type="unfinished">באיזור זה מנוהלים מחשבים וכיתות. ניתן להוסיף מחשבים ו/או כיתות על ידי לחיצה ברשימה זו .</translation>
</message>
<message>
<source>Classrooms/computers</source>
- <translation type="unfinished">Luokkahuoneet/koneet</translation>
+ <translation type="unfinished">כיתות\מחשבים</translation>
</message>
<message>
<source>IP-address</source>
- <translation type="unfinished">IP-osoite</translation>
+ <translation type="unfinished">כתובת רשת</translation>
</message>
<message>
<source>Usernames</source>
- <translation type="unfinished">Käyttäjänimet</translation>
+ <translation type="unfinished">שמות משתמשים</translation>
</message>
<message>
<source>Show usernames</source>
- <translation type="unfinished">Näytä kayttäjänimet</translation>
+ <translation type="unfinished">הצג שמות משתמשים</translation>
</message>
<message>
<source>Use the context-menu (right mouse-button) to add/remove computers and/or classrooms.</source>
- <translation type="unfinished">Käytä ponnahdusvalikkoa (hiiren oikea näppäin) lisätäksesi tai poistaaksesi luokkahuoneita ja tietokoneita.</translation>
+ <translation type="unfinished">קליק ימני עם העכבר על אחד הפריטים ברשימה שלעיל מאפשר להסיר ו/או להוסיף כיתות ו/או מחשבים</translation>
</message>
<message>
<source>Export to text-file</source>
- <translation type="unfinished">Vie tekstitiedostoksi</translation>
+ <translation type="unfinished">ייצא לקובץ טקסט</translation>
</message>
<message>
<source>Use this button for exporting this list of computers and usernames into a text-file. You can use this file later for collecting files after an exam has finished. This is sometimes neccessary, because some users might have finished and logged out earlier and so you cannot collect their files at the end of the exam.</source>
- <translation type="unfinished">Käytä tätä luodaksesi tekstitiedoston tietokoneista ja käyttäjistä. Voit käyttää tiedostoa myöhemmin kerätäksesi tiedostoja kokeen loputtua. Tätä tarvitaan, jos jotkut käyttäjät kirjautuvat ulos muita aikaisemmin ja tiedostojen suora kopiointi ei enää onnistu.</translation>
+ <translation type="unfinished">כפתור זה מאפשר ייצוא רשימה זו של מחשבים ושמות משתמשים לקובץ טקסט. רשימה זו יכולה לשמש לאיסוף קבצים בסיום של מבחן. לעיתים איסוף זה הוא הכרחי, מאחר ויהיו משתמשים שיבצעו ניתוק לפני שנאספו קיבצי המבחן שלהם</translation>
</message>
<message>
<source>Hide teacher computers</source>
- <translation type="unfinished">Piilota opettajan koneet</translation>
+ <translation type="unfinished">הסתר את מחשבי המורה</translation>
</message>
<message>
<source>Show/hide</source>
- <translation type="unfinished">Näytä/piilota</translation>
+ <translation type="unfinished">הצג\הסתר</translation>
</message>
<message>
<source>Edit settings</source>
- <translation type="unfinished">Muokkaa asetuksia</translation>
+ <translation type="unfinished">עריכת הגדרות</translation>
</message>
<message>
<source>Remove</source>
- <translation type="unfinished">Poista</translation>
+ <translation type="unfinished">הסר</translation>
</message>
<message>
<source>Show all computers in classroom</source>
- <translation type="unfinished">Näytä kaikki luokkahuoneen koneet</translation>
+ <translation type="unfinished">הצג את כל המחשבים בכיתה</translation>
</message>
<message>
<source>Hide all computers in classroom</source>
- <translation type="unfinished">Piilota kaikki luokkahuoneen koneet</translation>
+ <translation type="unfinished">הסתר את כל המחשבים בכיתה</translation>
</message>
<message>
<source>Edit name</source>
- <translation type="unfinished">Muokkaa nimeä</translation>
+ <translation type="unfinished">ערוך שם</translation>
</message>
<message>
<source>Remove classroom</source>
- <translation type="unfinished">Poista luokkahuone</translation>
+ <translation type="unfinished">הסר כיתה</translation>
</message>
<message>
<source>Add computer</source>
- <translation type="unfinished">Lisää tietokone</translation>
+ <translation type="unfinished">הוסף מחשב</translation>
</message>
<message>
<source>Add classroom</source>
- <translation type="unfinished">Lisää luokkahuone</translation>
+ <translation type="unfinished">הוסף כיתה</translation>
</message>
<message>
<source>No configuration-file found</source>
- <translation type="unfinished">Asetustiedostoa ei löytynyt</translation>
+ <translation type="unfinished">לא נמצא קובץ תצורה</translation>
</message>
<message>
<source>Could not open configuration file %1.
You will have to add at least one classroom and computers using the classroom-manager which you'll find inside the program in the sidebar on the left side.</source>
- <translation type="unfinished">Asetustiedoston %1 avaaminen epäonnistui.
-Sinun tulee lisätä ainakin yksi luokkahuone ja yksi tietokone käyttämällä hallintanäkymää, jonka löydät iTALC:n vasemmasta sivupalkista.</translation>
+ <translation type="unfinished">%1
+קובץ תצורה לא ניתן לפתיחה
+יש להוסיף לפחות כיתה אחת ומחשבים תוך שימוש בניהול-כיתה הזמין לשימוש בתוך התוכנית בסרגל הצדדי בצד שמאל</translation>
</message>
<message>
<source>Error in configuration-file</source>
- <translation type="unfinished">Virhe asetustiedostossa</translation>
+ <translation type="unfinished">שגיאה בקובץ תצורה</translation>
</message>
<message>
<source>Error while parsing configuration-file %1.
Please edit it. Otherwise you should delete this file and have to add all classrooms and computers again.</source>
- <translation type="unfinished">Virhe asetustiedostossa %1.
-Ole hyvä ja korjaa se. Vaihtoehtoisesta voit poistaa tiedoston ja luoda uudestaan luokkahuoneet ja tietokoneet.</translation>
+ <translation type="unfinished">%1
+שגיאה במהלך ניתוח קובץ תצורה
+נא לבצע עריכה לקובץ. אחרת, יש לבצע מחיקה לקובץ ולהוסיף את כל הכיתות והמחשבים שנית</translation>
</message>
<message>
<source>Error while parsing configuration-file %1.
Please edit it. Otherwise you should delete this file.</source>
- <translation type="unfinished">Virhe asetustiedossa %1.
-Ole hyvä ja korjaa se. Vaihtoehtoisesti voit poistaa tiedoston.</translation>
+ <translation type="unfinished">%1
+שגיאה במהלך ניתוח קובץ תצורה, נא לבצע מחיקה לקובץ</translation>
</message>
<message>
<source>Select output-file</source>
- <translation type="unfinished">Tallenna tiedostoksi</translation>
+ <translation type="unfinished">בחרו קובץ לאיחסון המידע</translation>
</message>
<message>
<source>Text files (*.txt)</source>
- <translation type="unfinished">Tekstitiedostot (*.txt)</translation>
+ <translation type="unfinished"></translation>
</message>
<message>
<source>Actions for selected</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">הפעולות שנבחרו</translation>
</message>
<message>
<source>Actions</source>
- <translation type="unfinished">Toiminnot</translation>
+ <translation type="unfinished">פעולות</translation>
</message>
<message>
<source>Actions for %1</source>
- <translation type="unfinished">Suorita %1:lle</translation>
+ <translation type="unfinished">פעולות עבור
+%1</translation>
</message>
<message>
<source>New name for classroom</source>
- <translation type="unfinished">Nimeä luokkahuone</translation>
+ <translation type="unfinished">שם חדש לכיתה</translation>
</message>
<message>
<source>Please enter a new name for classroom "%1".</source>
- <translation type="unfinished">Kirjoita luokkahuoneen "%1" uusi nimi.</translation>
+ <translation type="unfinished">נא להכניס שם חדש עבור כיתה :
+%1</translation>
</message>
<message>
<source>Are you sure want to remove classroom "%1"?
All computers in it will be removed as well!</source>
- <translation type="unfinished">Haluatko varmasti poistaa luokkahuoneen "%1"?
-Samalla poistuvat kaikki luokkahuoneen sisältämät tietokoneet!</translation>
+ <translation type="unfinished">האם אתם בטוחים בהסרת כיתה :
+%1
+כל המחשבים בכיתה זו ימחקו גם הם ! </translation>
</message>
<message>
<source>Missing classroom</source>
- <translation type="unfinished">Luokkahuone puuttuu</translation>
+ <translation type="unfinished">חסרה כיתה</translation>
</message>
<message>
<source>Before adding computers you have to create at least one classroom.
Do you want to create a new classrom now?</source>
- <translation type="unfinished">Sinun tulee luoda vähintään yksi luokkahuone ennen tietokoneiden lisäämistä.
-Haluatko luoda uuden luokkahuoneen?</translation>
+ <translation type="unfinished">לפני שניתן להוסיף מחשבים יש ליצור לפחות כיתה אחת .
+האם ליצור אחת ברגע זה ?</translation>
</message>
<message>
<source>New classroom</source>
- <translation type="unfinished">Uusi luokkahuone</translation>
+ <translation type="unfinished">כיתה חדשה</translation>
</message>
<message>
<source>Please enter the name of the classroom you want to create.</source>
- <translation type="unfinished">Kirjoita uuden luokkahuoneen nimi.</translation>
+ <translation type="unfinished">נא להכניס את שם הכיתה אותה רוצים ליצור</translation>
</message>
</context>
<context>
<name>Client</name>
<message>
<source>Unknown state</source>
- <translation type="unfinished">Tuntematon tila</translation>
+ <translation type="unfinished">לא מוגדר</translation>
</message>
<message>
<source>No user logged in</source>
- <translation type="unfinished">Ei käyttäjää</translation>
+ <translation type="unfinished">אין משתמש מחובר</translation>
</message>
<message>
<source>Host unreachable</source>
- <translation type="unfinished">Ei yhteyttä koneeseen</translation>
+ <translation type="unfinished">עמדה לא מחוברת</translation>
</message>
<message>
<source>Demo running</source>
- <translation type="unfinished">Esitys käynnissä</translation>
+ <translation type="unfinished">הדגמה מופעלת</translation>
</message>
<message>
<source>Desktop locked</source>
- <translation type="unfinished">Työpöytä lukittu</translation>
+ <translation type="unfinished">שולחן העבודה נעול</translation>
</message>
</context>
<context>
<name>ClientAction</name>
<message>
<source>Are you sure want logout all users on all visible computers ?</source>
- <translation type="unfinished">Haluatko varmasti kirjata käyttäjät ulos kaikilta näkyviltä tietokoneilta?</translation>
+ <translation type="unfinished">אתם עומדים לבצע ניתוק לכל המחשבים המחוברים. האם אתם בטוחים ?</translation>
</message>
<message>
<source>Are you sure want logout all users on all selected computers ?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">אתם עומדים לבצע ניתוק לכל המשתמשים על גבי כל המחשבים שניבחרו. האם אתם בטוחים ?</translation>
</message>
<message>
<source>Logout user</source>
@@ -265,54 +264,46 @@ Haluatko luoda uuden luokkahuoneen?</translation>
</message>
<message>
<source>Are you sure want to reboot all visible computers?</source>
- <translation type="unfinished">Haluatko varmasti uudelleenkäynnistää kaikki näkyvät tietokoneet?</translation>
+ <translation type="unfinished">האם אתם בטוחים ברצונכם לאתחל את כל המחשבים המחוברים ?</translation>
</message>
<message>
<source>Are you sure want to reboot all selected computers?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">האם אתם בטוחים ברצונכם לאתחל את כל המחשבים שניבחרו ?</translation>
</message>
<message>
<source>Reboot computers</source>
- <translation type="unfinished">Uudelleenkäynnistä tietokoneet</translation>
+ <translation type="unfinished">איתחול מחשבים</translation>
</message>
<message>
<source>Are you sure want to power down all visible computers?</source>
- <translation type="unfinished">Halutako varmasti sammuttaa kaikki näkyvät tietokoneet?</translation>
+ <translation type="unfinished">האם אתם בטוחים ברצונכם לכבות את כל המחשבים המחוברים ?</translation>
</message>
<message>
<source>Are you sure want to power down all selected computers?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">האם אתם בטוחים ברצונכם לכבות את כל המחשבים שניבחרו ?</translation>
</message>
</context>
<context>
<name>ClientSettingsDialog</name>
<message>
- <source>Invalid MAC-address</source>
- <translation type="unfinished">Virheellinen MAC-osoite</translation>
- </message>
- <message>
- <source>You specified an invalid MAC-address. Either leave the field blank or enter a valid MAC-address (use ":" as separator!).</source>
- <translation type="unfinished">Annoit virheellisen MAC-osoitteen. Jätä kenttä tyhjäksi tai kirjoita oikea MAC-osoite (muotoa 12:34:56:78:9A:BC).</translation>
- </message>
- <message>
<source>Client settings</source>
- <translation type="unfinished">Tietokoneen asetukset</translation>
+ <translation type="unfinished">הגדרות עמדת תלמיד</translation>
</message>
<message>
<source>IP/hostname</source>
- <translation type="unfinished">IP/verkkonimi</translation>
+ <translation type="unfinished">IP\שם מחשב</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">enter an IP-address or hostname under which iTALC can reach the client (use ':' for specifying an optional port-number)</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Kirjoita koneen verkkonimi tai IP-osoite (käytä ':' jos haluat määrittää erikoisen portin)</p></body></html></translation>
+ <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">הכניסו את שם המחשב או כתובת הרשת להתקשרות מול התוכנה (השתמשו ב- ':' לקביעת מספר פורט ספציפי) </p></body></html></translation>
</message>
<message>
<source>Name</source>
- <translation type="unfinished">Nimi</translation>
+ <translation type="unfinished">שם</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Optional nickname of the host which is displayed in iTALC.</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vaihtoehtoinen nimi koneelle iTALC:ssa.</p></body></html></translation>
+ <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">כינוי אופציונאלי למחשב כפי שיוצג בתוכנה</p></body></html></translation>
</message>
<message>
<source>MAC address</source>
@@ -320,27 +311,27 @@ Haluatko luoda uuden luokkahuoneen?</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hardware/MAC-address of client - only used for powering on client</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tietokoneen verkkokortin MAC-osoite - tarvitaan vain koneen etäkäynnistykseen</p></body></html></translation>
+ <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">כתובת ה- MAC - משמשת לצרכי הדלקת מחשב תלמיד בלבד</p></body></html></translation>
</message>
<message>
<source>Classroom</source>
- <translation type="unfinished">Luokkahuone</translation>
+ <translation type="unfinished">כיתה</translation>
</message>
<message>
<source>Type</source>
- <translation type="unfinished">Konetyyppi</translation>
+ <translation type="unfinished">סוג</translation>
</message>
<message>
<source>Student computer</source>
- <translation type="unfinished">Oppilaan kone</translation>
+ <translation type="unfinished">מחשב תלמיד</translation>
</message>
<message>
<source>Teacher computer</source>
- <translation type="unfinished">Opettajan kone</translation>
+ <translation type="unfinished">מחשב מורה</translation>
</message>
<message>
<source>Other/undefined computer</source>
- <translation type="unfinished">Muu/määrittelemätön kone</translation>
+ <translation type="unfinished">מחשב אחר\לא מוגדר</translation>
</message>
<message>
<source>Missing IP address/hostname</source>
@@ -350,48 +341,56 @@ Haluatko luoda uuden luokkahuoneen?</translation>
<source>You didn't specify an IP address or hostname for the computer!</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Invalid MAC-address</source>
+ <translation type="unfinished">כתובת פיזית שגוייה</translation>
+ </message>
+ <message>
+ <source>You specified an invalid MAC-address. Either leave the field blank or enter a valid MAC-address (use ":" as separator!).</source>
+ <translation type="unfinished">צויינה כתובת פיזית שגוייה. יש להשאיר את השדה ריק או להכניס כתובת נכונה (השתמש ב ":" כמפריד ! ) </translation>
+ </message>
</context>
<context>
<name>Config</name>
<message>
<source>Interval between updates</source>
- <translation type="unfinished">Näytön päivitysväli</translation>
+ <translation type="unfinished">מרווחי זמן בין עידכוני מסך</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Here you can set the interval between updates of clients. Higher values result in lower network-traffic and lower CPU-usage on this computer.</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tällä määrittelet koneiden näyttöjen päivitysvälin. Suurempi arvo vähentää verkkoliikennettä ja vähentää tietokoneen kuormaa.</p></body></html></translation>
+ <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">כאן ניתן לקבוע את גודל המרווח בין עידכוני המסך המועבר למחשבים. ככל שגדול, תעבורת הרשת נמוכה יותר והעומס על המעבד הראשי של מחשב זה יפחת</p></body></html></translation>
</message>
<message>
<source> seconds</source>
- <translation type="unfinished"> sekuntia</translation>
+ <translation type="unfinished">שניות</translation>
</message>
<message>
<source>User interface</source>
- <translation type="unfinished">Käyttöliittymä</translation>
+ <translation type="unfinished">ממשק משתמש</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Do not show balloon-tooltips for toolbar-buttons</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Estä opastetekstien näyttäminen</p></body></html></translation>
+ <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">אל תציג את חלונית העזרה של כפתורי סרגל הכלים</p></body></html></translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this option if you're annoyed by the balloon-tooltips appearing when moving mouse-cursor over toolbar-buttons.</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Valitse tämä jos opastetekstit häiritsevät hiiren osoittimen osuessa työkalupalkkiin.</p></body></html></translation>
+ <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">בדוק אופצייה זו אם חלונית העזרה קופצת בכל פעם שסמן העכבר חולף על-פני כפתורי סרגל הכלים</p></body></html></translation>
</message>
<message>
<source>No balloon-tooltips</source>
- <translation type="unfinished">Ei opastetekstejä</translation>
+ <translation type="unfinished">ללא חלונית העזרה</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Do not show texts on toolbar-buttons</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Piilota painikkeiden tekstit työkalupalkissa</p></body></html></translation>
+ <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">אל תציג טקסט על גבי כפתורי סרגל הכלים</p></body></html></translation>
</message>
<message>
<source>No texts on toolbar-buttons</source>
- <translation type="unfinished">Piilota työkalupalkin tekstit</translation>
+ <translation type="unfinished">ללא טקסט על גבי כפתורי סרגל הכלים</translation>
</message>
<message>
<source>Your role (needs according keys!)</source>
- <translation type="unfinished">Roolisi (tarvitset kyseisen avaimen!)</translation>
+ <translation type="unfinished">התפקיד שלך - יש צורך במפתחות מתאימים</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /><style type="text/css">
@@ -401,35 +400,35 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"><html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tällä valitset oman roolisi. Muuta tätä vain, jos tiedät varmsti mitä teet. Muuten saatat menettää yhteyden muihin koneisiin, kunnes palautat alkuperäisen roolisi.</p></body></html></translation>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">כאן ניתן לקבוע תפקידכם. יש לשנות שדה זה רק במידה ואכן ברורות ההשלכות, אחרת לא ניתן יהיה לגשת לכלל המחשבים עד אשר ישוחזרו הגדרות התפקיד הישן</p></body></html></translation>
</message>
<message>
<source>Teacher</source>
- <translation type="unfinished">Opettaja</translation>
+ <translation type="unfinished">מורה</translation>
</message>
<message>
<source>Administrator</source>
- <translation type="unfinished">Ylläpitäjä</translation>
+ <translation type="unfinished">מנהל מערכת</translation>
</message>
<message>
<source>Supporter</source>
- <translation type="unfinished">Tuki</translation>
+ <translation type="unfinished">תמיכה</translation>
</message>
<message>
<source>Other</source>
- <translation type="unfinished">Muu</translation>
+ <translation type="unfinished">אחר</translation>
</message>
<message>
<source>Settings for multi-logon</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">הגדרות להתחברות מספר משתמשים</translation>
</message>
<message>
<source>Domain</source>
- <translation type="unfinished">Toimialue</translation>
+ <translation type="unfinished">דומיין</translation>
</message>
<message>
<source>Double-click action for client-window</source>
- <translation type="unfinished">Ikkunan kaksoispainallus</translation>
+ <translation type="unfinished">הקשה כפולה על חלון המחשב המחובר</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /><style type="text/css">
@@ -439,30 +438,30 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"><html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tällä valitset mitä tapahtuu kaksoispainamalla hiiren näppäintä tietokoneiden näkymäikkunan kohdalla.</p></body></html></translation>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">כאן ניתן להגדיר את הפעולה שתתבצע ברגע שמקישים הקשה כפולה על גבי חלון התלמיד</p></body></html></translation>
</message>
<message>
<source>Remote control</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">שליטה מרחוק</translation>
</message>
<message>
<source>View live in fullscreen</source>
- <translation type="unfinished">Avaa näkymä</translation>
+ <translation type="unfinished">צפייה ישירה במסך מלא</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-style:italic;">Please note, that some changes won't take effect until you restart iTALC.</span></p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-style:italic;">Jotkut asetukset eivät vaikuta ennen kuin käynnistät iTALC:n uudestaan.</span></p></body></html></translation>
+ <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-style:italic;">שימו לב, הגדרות מסויימות ייכנסו לפעולה רק לאחר אתחול התוכנית</span></p></body></html></translation>
</message>
</context>
<context>
<name>ConfigWidget</name>
<message>
<source>Your iTALC-configuration</source>
- <translation type="unfinished">iTALC-asetukset</translation>
+ <translation type="unfinished">הגדרות תוכנה</translation>
</message>
<message>
<source>In this workspace you can customize iTALC to fit your needs.</source>
- <translation type="unfinished">Tässä tilassa voit muokata iTALC:a mieleiseksesi.</translation>
+ <translation type="unfinished">באיזור זה ניתן להגדיר את התוכנה על פי צרכי העבודה</translation>
</message>
</context>
<context>
@@ -476,18 +475,18 @@ p, li { white-space: pre-wrap; }
<name>DemoClient</name>
<message>
<source>iTALC Demo</source>
- <translation type="unfinished">iTALC esitys</translation>
+ <translation type="unfinished">הדגמה</translation>
</message>
</context>
<context>
<name>ItalcCoreServer</name>
<message>
<source>Authentication error</source>
- <translation type="unfinished">Autentikointivirhe</translation>
+ <translation type="unfinished">שגיאת זיהוי</translation>
</message>
<message>
<source>Somebody (IP: %1) tried to access this computer but could not authenticate itself successfully!</source>
- <translation type="unfinished">Joku (IP: %1) yritti päästä näkemään kuvaruutusi, mutta ei onnistunut autentikoimaan itseään!</translation>
+ <translation type="unfinished">משתמש (%1) ניסה לקבל גישה למחשב זה אך כשל בתהליך הזיהוי !</translation>
</message>
</context>
<context>
@@ -561,11 +560,11 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>Teacher</source>
- <translation type="unfinished">Opettaja</translation>
+ <translation type="unfinished">מורה</translation>
</message>
<message>
<source>Administrator</source>
- <translation type="unfinished">Ylläpitäjä</translation>
+ <translation type="unfinished">מנהל מערכת</translation>
</message>
<message>
<source>Support team member</source>
@@ -573,7 +572,7 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>Other</source>
- <translation type="unfinished">Muu</translation>
+ <translation type="unfinished">אחר</translation>
</message>
<message>
<source>User roles allow using multiple access keys in parallel. For example there can be different teacher access keys for each classroom while the support access keys are the same for the whole school.</source>
@@ -688,7 +687,7 @@ The public key part is used on the client computers to verify that any incoming
<name>LockWidget</name>
<message>
<source>screen lock</source>
- <translation type="unfinished">Lukitse</translation>
+ <translation type="unfinished">נעל מסך</translation>
</message>
</context>
<context>
@@ -718,602 +717,595 @@ The public key part is used on the client computers to verify that any incoming
<name>MainToolBar</name>
<message>
<source>Actions</source>
- <translation type="unfinished">Toiminnot</translation>
+ <translation type="unfinished">פעולות</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
- <source>General</source>
- <translation type="unfinished">Yleistä</translation>
- </message>
- <message>
- <source>Quit</source>
+ <source>MainWindow</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>iTALC Management Console</source>
+ <source>toolBar</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>iTALC Server</source>
- <translation type="unfinished"></translation>
+ <source>iTALC</source>
+ <translation type="unfinished">iTALC</translation>
</message>
<message>
- <source>Paths</source>
- <translation type="unfinished"></translation>
+ <source>Could not read/write or create directory %1! For running iTALC, make sure you're permitted to create or write this directory.</source>
+ <translation type="unfinished">לא ניתן לקרוא, לכתוב או ליצור את התיקייה הבאה. על מנת להריץ את התוכנה,וודאו כי יש ברשותכם הרשאות מתאימות ליצירת תיקייה זו
+%1</translation>
</message>
<message>
- <source>Authentication</source>
- <translation type="unfinished"></translation>
+ <source>Classroom</source>
+ <translation type="unfinished">כיתה</translation>
</message>
<message>
- <source>iTALC Service</source>
- <translation type="unfinished"></translation>
+ <source>Switch classroom</source>
+ <translation type="unfinished">החלף כיתה</translation>
</message>
<message>
- <source>Hide tray icon</source>
- <translation type="unfinished"></translation>
+ <source>Click this button to open a menu where you can choose the active classroom.</source>
+ <translation type="unfinished">לחיצה על כפתור זה תפתח תפריט שם ניתן לבחור את הכיתה הפעילה</translation>
</message>
<message>
- <source>Autostart</source>
- <translation type="unfinished"></translation>
+ <source>Click on this button, to switch between classrooms.</source>
+ <translation type="unfinished">לחיצה על כפתור זה תאפשר בחירה בין הכיתות</translation>
</message>
<message>
- <source>Additional arguments</source>
- <translation type="unfinished"></translation>
+ <source>Overview mode</source>
+ <translation type="unfinished">מצב צפייה ובקרה</translation>
</message>
<message>
- <source>Start service</source>
- <translation type="unfinished"></translation>
+ <source>Overview</source>
+ <translation type="unfinished">סקירה</translation>
</message>
<message>
- <source>Stop service</source>
- <translation type="unfinished"></translation>
+ <source>This is the default mode in iTALC and allows you to have an overview over all visible computers. Also click on this button for unlocking locked workstations or for leaving demo-mode.</source>
+ <translation type="unfinished">זהו מצב ברירת מחדל בתוכנה ומאפשר סקירה של כלל העמדות המחוברות. בנוסף, לחיצה על כפתור זה תאפשר פתיחה של עמדות נעולות או לצורך יציאה ממצב הדגמה</translation>
</message>
<message>
- <source>State:</source>
- <translation type="unfinished"></translation>
+ <source>Fullscreen demo</source>
+ <translation type="unfinished">הדגמה במסך מלא</translation>
</message>
<message>
- <source>Stopped</source>
- <translation type="unfinished"></translation>
+ <source>Fullscreen Demo</source>
+ <translation type="unfinished">הצגת מסך המורה</translation>
</message>
<message>
- <source>Logging</source>
- <translation type="unfinished"></translation>
+ <source>Stop Demo</source>
+ <translation type="unfinished">הפסק הצגה</translation>
</message>
<message>
- <source>Log file directory</source>
- <translation type="unfinished"></translation>
+ <source>In this mode your screen is being displayed on all shown computers. Furthermore the users aren't able to do something else as all input devices are locked in this mode.</source>
+ <translation type="unfinished">במצב זה, המסך שלך מוקרן על גבי כל העמדות המחוברות. יתרה מזו, המשתמשים נעולים ואינם יכולים לבצע כל פעולה במחשב</translation>
</message>
<message>
- <source>...</source>
- <translation type="unfinished"></translation>
+ <source>Window demo</source>
+ <translation type="unfinished">חלון הדגמה</translation>
</message>
<message>
- <source>Log level</source>
- <translation type="unfinished"></translation>
+ <source>Window Demo</source>
+ <translation type="unfinished">הצגה בחלון</translation>
</message>
<message>
- <source>Nothing</source>
- <translation type="unfinished"></translation>
+ <source>In this mode your screen being displayed in a window on all shown computers. The users are able to switch to other windows and thus can continue to work.</source>
+ <translation type="unfinished">במצב זה, המסך שלך מוקרן בחלון הניתן למיזעור על גבי מסכי העמדות המחוברות. המשתמשים יכולים לעבור לחלונות אחרים ובכך להמשיך בעבודתם</translation>
</message>
<message>
- <source>Only critical messages</source>
- <translation type="unfinished"></translation>
+ <source>Lock/unlock desktops</source>
+ <translation type="unfinished">נעל/שחרר שולחנות עבודה</translation>
</message>
<message>
- <source>Errors and critical messages</source>
- <translation type="unfinished"></translation>
+ <source>Lock all</source>
+ <translation type="unfinished">נעל הכל</translation>
</message>
<message>
- <source>Warnings and errors</source>
- <translation type="unfinished"></translation>
+ <source>Unlock all</source>
+ <translation type="unfinished">שחרר הכל</translation>
</message>
<message>
- <source>Information, warnings and errors</source>
- <translation type="unfinished"></translation>
+ <source>To have all user's full attention you can lock their desktops using this button. In this mode all input devices are locked and the screen is black.</source>
+ <translation type="unfinished">על מנת לקבל את מלוא תשומת הלב של המשתמשים ניתן לנעול את שולחן העבודה שלהם על ידי לחיצה על כפתור זה. במצב זה, המשתמשים נעולים, אינם יכולים לבצע כל פעולה במחשב והמסך יוחשך</translation>
</message>
<message>
- <source>Debug messages and everything else</source>
+ <source>Send text message</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Limit log file size</source>
- <translation type="unfinished"></translation>
+ <source>Text message</source>
+ <translation type="unfinished">הודעת טקסט</translation>
</message>
<message>
- <source>MB</source>
- <translation type="unfinished"></translation>
+ <source>Use this button to send a text message to all users e.g. to tell them new tasks etc.</source>
+ <translation type="unfinished">לחיצה על כפתור זה מאפשרת שליחת הודעת טקסט לכל המשתמשים. למשל: הוראות למטלה חדשה וכדומה</translation>
</message>
<message>
- <source>Clear all log files</source>
- <translation type="unfinished"></translation>
+ <source>Power on computers</source>
+ <translation type="unfinished">הדלקת מחשבים</translation>
</message>
<message>
- <source>Desktop capturing</source>
- <translation type="unfinished"></translation>
+ <source>Power on</source>
+ <translation type="unfinished">הדלקה</translation>
</message>
<message>
- <source>Enable capturing of layered (semi-transparent) windows</source>
- <translation type="unfinished"></translation>
+ <source>Click this button to power on all visible computers. This way you do not have to turn on each computer by hand.</source>
+ <translation type="unfinished">לחיצה על כפתור זה תדליק את כל המחשבים הנשלטים בתוכנה. כך נחסך הצורך להדליק כל מחשב ידנית ובניפרד</translation>
</message>
<message>
- <source>Poll full screen</source>
- <translation type="unfinished"></translation>
+ <source>Power down computers</source>
+ <translation type="unfinished">כבה מחשבים</translation>
</message>
<message>
- <source>Low accuracy (turbo mode)</source>
- <translation type="unfinished"></translation>
+ <source>Power down</source>
+ <translation type="unfinished">כיבוי</translation>
</message>
<message>
- <source>Demo server</source>
- <translation type="unfinished"></translation>
+ <source>To power down all shown computers (e.g. after the lesson has finished) you can click this button.</source>
+ <translation type="unfinished">לחיצה על כפתור זה תכבה את כל המחשבים. למשל: בסיום שיעור</translation>
</message>
<message>
- <source>Network</source>
- <translation type="unfinished"></translation>
+ <source>Support</source>
+ <translation type="unfinished">תמיכה</translation>
</message>
<message>
- <source>Core server port</source>
- <translation type="unfinished"></translation>
+ <source>Direct support</source>
+ <translation type="unfinished">תמיכה ישירה</translation>
</message>
<message>
- <source>Demo server port</source>
- <translation type="unfinished"></translation>
+ <source>If you need to support someone at a certain computer you can click this button and enter the according hostname or IP afterwards.</source>
+ <translation type="unfinished">אם נידרשת תמיכה במשתמש ספציפי, יש ללחוץ על כפתור זה ולהזין את שם המחשב או כתובתו</translation>
</message>
<message>
- <source>Enable firewall exception</source>
- <translation type="unfinished"></translation>
+ <source>Adjust/align</source>
+ <translation type="unfinished">התאם/ישר</translation>
</message>
<message>
- <source>Configuration files</source>
- <translation type="unfinished"></translation>
+ <source>Adjust windows and their size</source>
+ <translation type="unfinished">התאם חלונות וגודלם</translation>
</message>
<message>
- <source>Global configuration</source>
- <translation type="unfinished"></translation>
+ <source>When clicking this button the biggest possible size for the client-windows is adjusted. Furthermore all windows are aligned.</source>
+ <translation type="unfinished">בלחיצה על כפתור זה, חלונות התצוגה של עמדות התלמידים יותאמו לגודל המרבי במסך</translation>
</message>
<message>
- <source>Personal configuration</source>
- <translation type="unfinished"></translation>
+ <source>Auto view</source>
+ <translation type="unfinished">סידור אוטומטי</translation>
</message>
<message>
- <source>Data directories</source>
- <translation type="unfinished"></translation>
+ <source>Auto re-arrange windows and their size</source>
+ <translation type="unfinished">כיוון וסידור מחדש של החלונות</translation>
</message>
<message>
- <source>Snapshots</source>
- <translation type="unfinished">Kuvaruutukopiot</translation>
+ <source>When clicking this button all visible windows are re-arranged and adjusted.</source>
+ <translation type="unfinished">בלחיצה על כפתור זה, כל החלונות המוצגים יסודרו מחדש באופן אוטומטי</translation>
</message>
<message>
- <source>Authentication methods</source>
- <translation type="unfinished"></translation>
+ <source>iTALC Master Control</source>
+ <translation type="unfinished">שליטה ראשית בתוכנה</translation>
</message>
<message>
- <source>Access key management</source>
- <translation type="unfinished"></translation>
+ <source>Remote control</source>
+ <translation type="unfinished">שליטה מרחוק</translation>
</message>
<message>
- <source>Logon settings</source>
- <translation type="unfinished"></translation>
+ <source>Quit</source>
+ <translation type="unfinished">יציאה</translation>
</message>
<message>
- <source>&File</source>
+ <source>iTALC Management Console</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Help</source>
- <translation type="unfinished"></translation>
+ <source>General</source>
+ <translation type="unfinished">כללי</translation>
</message>
<message>
- <source>&Quit</source>
+ <source>iTALC Server</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Ctrl+Q</source>
+ <source>Paths</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Save settings into file</source>
+ <source>Authentication</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Save settings into file</source>
+ <source>Debugging</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Ctrl+S</source>
+ <source>iTALC Service</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>L&oad settings from file</source>
+ <source>Hide tray icon</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Ctrl+O</source>
+ <source>Autostart</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>About iTALC</source>
+ <source>Additional arguments</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>About Qt</source>
+ <source>Start service</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>MainWindow</source>
+ <source>Stop service</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>toolBar</source>
+ <source>State:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>iTALC Management Console %1</source>
+ <source>Stopped</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Running</source>
+ <source>Enable desktop switching for screen lock (experimental)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Load settings from file</source>
+ <source>Logging</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>XML files (*.xml)</source>
+ <source>Log file directory</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Save settings to file</source>
+ <source>...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Unsaved settings</source>
+ <source>Log level</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>There are unsaved settings. Quit anyway?</source>
+ <source>Nothing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Configuration not writable</source>
+ <source>Only critical messages</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>The local configuration backend reported that the configuration is not writable! Please run the iTALC Management Console with higher privileges.</source>
+ <source>Errors and critical messages</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>All settings were applied successfully.</source>
+ <source>Warnings and errors</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>An error occured while applying settings!</source>
+ <source>Information, warnings and errors</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>iTALC</source>
- <translation type="unfinished">iTALC</translation>
+ <source>Debug messages and everything else</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>No write access</source>
+ <source>Limit log file size</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Could not read/write or create directory %1! For running iTALC, make sure you're permitted to create or write this directory.</source>
- <translation type="unfinished">Hakemiston %1 luku/kirjoitus tai luonti ei onnistu. Käyttääksesi iTALC:ia varmista, että sinulla on oikeudet luoda ja kirjoittaa tähän hakemistoon.</translation>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Classroom</source>
- <translation type="unfinished">Luokkahuone</translation>
+ <source>Log to standard error output</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Switch classroom</source>
- <translation type="unfinished">Vaihda luokkahuonetta</translation>
+ <source>Log to Windows event log</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Click this button to open a menu where you can choose the active classroom.</source>
- <translation type="unfinished">Painamalla tätä voit valita käytettävän luokkahuoneen.</translation>
+ <source>Clear all log files</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Click on this button, to switch between classrooms.</source>
- <translation type="unfinished">Painamalla tätä valitset eri luokkahuoneiden välillä.</translation>
+ <source>Desktop capturing</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Overview mode</source>
- <translation type="unfinished">Yleisnäkymä</translation>
+ <source>Enable capturing of layered (semi-transparent) windows</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Overview</source>
+ <source>Poll full screen</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>This is the default mode in iTALC and allows you to have an overview over all visible computers. Also click on this button for unlocking locked workstations or for leaving demo-mode.</source>
- <translation type="unfinished">Tämä on iTALC:n oletustila. Siinä näet kaikkien aktiivisten koneiden kuvaruudut. Painamalla tätä vapautat myös lukitut tietokoneet tai poistut esitystilasta.</translation>
+ <source>Low accuracy (turbo mode)</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Fullscreen demo</source>
- <translation type="unfinished">Esitys koko näytöllä</translation>
+ <source>Demo server</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Fullscreen Demo</source>
- <translation type="unfinished">Esitys koko näytöllä</translation>
+ <source>Backend</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Stop Demo</source>
- <translation type="unfinished">Lopeta esitys</translation>
+ <source>VNC reflector</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>In this mode your screen is being displayed on all shown computers. Furthermore the users aren't able to do something else as all input devices are locked in this mode.</source>
- <translation type="unfinished">Tässä tilassa näyttösi pakotetaan kaikkien muiden koneiden näytölle. Tällöin muiden käyttäjien laitteet lukkiutuvat.</translation>
+ <source>iTALC 1 demo server</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Window demo</source>
- <translation type="unfinished">Esitys ikkunassa</translation>
+ <source>Multithreading (can be enabled when using the VNC reflector backend)</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Window Demo</source>
- <translation type="unfinished">Esitys ikkunassa</translation>
+ <source>Network</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>In this mode your screen being displayed in a window on all shown computers. The users are able to switch to other windows and thus can continue to work.</source>
- <translation type="unfinished">Tässä tilassa näyttösi näytetään muiden koneilla omassa ikkunassaan. Käyttäjät voivat samanaikaisesti työskennellä muissa ikkunoissa.</translation>
+ <source>Core server port</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Lock/unlock desktops</source>
- <translation type="unfinished">Lukitse/vapauta työtilat</translation>
+ <source>Demo server port</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Lock all</source>
- <translation type="unfinished">Lukitse kaikki</translation>
+ <source>Enable firewall exception</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Unlock all</source>
- <translation type="unfinished">Vapauta kaikki</translation>
+ <source>Enable HTTP server which provides a JavaViewer applet</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>To have all user's full attention you can lock their desktops using this button. In this mode all input devices are locked and the screen is black.</source>
- <translation type="unfinished">Saadaksesi käyttäjien täyden huomion, voit lukita heidän työtilansa painamalla tätä. Tässä tilassa käyttäjien koneet on lukittu ja näyttö pimennetty.</translation>
+ <source>HTTP server port</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Send text message</source>
+ <source>Allow connections from localhost only</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Text message</source>
- <translation type="unfinished">Viesti</translation>
+ <source>Configuration files</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Use this button to send a text message to all users e.g. to tell them new tasks etc.</source>
- <translation type="unfinished">Käytä tätä lähettääksesi viestin kaikille käyttäjille, esim. antaaksesi heille tehtävän, tms.</translation>
+ <source>Global configuration</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Power on computers</source>
- <translation type="unfinished">Käynnistä tietokone</translation>
+ <source>Personal configuration</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Power on</source>
+ <source>Data directories</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Click this button to power on all visible computers. This way you do not have to turn on each computer by hand.</source>
- <translation type="unfinished">Painamalla tätä käynnistät kaikki näkyvät tietokoneet. Tällä tavalla sinun ei tarvitse käydä käynnistämässä niitä jokaista käsin (MAC-osoite tulee olla määritetty koneen asetuksissa!).</translation>
+ <source>Snapshots</source>
+ <translation type="unfinished">צילומי מסך</translation>
</message>
<message>
- <source>Power down computers</source>
+ <source>Authentication methods</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Power down</source>
+ <source>Key file authentication</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>To power down all shown computers (e.g. after the lesson has finished) you can click this button.</source>
- <translation type="unfinished">Painamalla tätä voit sammuttaa kaikki näkyvät tietokoneet (esim. oppitunnin päättyessä).</translation>
- </message>
- <message>
- <source>Support</source>
- <translation type="unfinished">Tukitoiminto</translation>
+ <source>ACL-based logon authentication</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Direct support</source>
- <translation type="unfinished">Etätuki koneelle</translation>
+ <source>Access key management</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>If you need to support someone at a certain computer you can click this button and enter the according hostname or IP afterwards.</source>
- <translation type="unfinished">Tällä voit etähallita jotain vierasta konetta antamalla sen verkkonimi tai IP-osoite.</translation>
+ <source>Public key file base directory</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Adjust/align</source>
- <translation type="unfinished">Sovita</translation>
+ <source>Private key file base directory</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Adjust windows and their size</source>
- <translation type="unfinished">Sovita ikkunat</translation>
+ <source>Launch key file assistant</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>When clicking this button the biggest possible size for the client-windows is adjusted. Furthermore all windows are aligned.</source>
- <translation type="unfinished">Painamalla tätä kaikki ikkunat sovitetaan ruudulle mahdollisimman isokokoisina.</translation>
+ <source>Logon settings</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Auto view</source>
- <translation type="unfinished">Järjestä</translation>
+ <source>Manage permissions</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Auto re-arrange windows and their size</source>
- <translation type="unfinished">Järjestä ja sovita ikkunat</translation>
+ <source>Test</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>When clicking this button all visible windows are re-arranged and adjusted.</source>
- <translation type="unfinished">Painamalla tätä uudelleenjärjestetään ja sovitetaaan kaikki näkyvät ikkunat.</translation>
+ <source>Access confirmation</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>iTALC Master Control</source>
- <translation type="unfinished">iTALC</translation>
+ <source>You can configure iTALC to ask the user for permission to access the desktop when using certain authentication methods.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Remote control</source>
+ <source>Logon authentication</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Could not modify the autostart property for the iTALC Service.</source>
+ <source>Allow same user to access desktop without confirmation</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Could not modify the service arguments for the iTALC Service.</source>
+ <source>Debugging iTALC</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Could not change the firewall configuration for the iTALC Service.</source>
+ <source>When encountering bugs or other misbehaviour in iTALC it is important to inform the developers about them, so that the bugs can be fixed in future releases. This page allows you to submit a helpful bug report easily.
+
+If the bug is not reproducible, skip step 1) - 3).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Debugging</source>
+ <source>1)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Enable desktop switching for screen lock (experimental)</source>
+ <source>Clear the logfiles in the "General" section.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Log to standard error output</source>
+ <source>2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Log to Windows event log</source>
+ <source>In the "General" section set the log level to "Debug messages and everything else".</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Backend</source>
+ <source>3)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>VNC reflector</source>
+ <source>Repeat the actions leading to the bug or misbehaviour.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>iTALC 1 demo server</source>
+ <source>4)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Multithreading (can be enabled when using the VNC reflector backend)</source>
+ <source>Click the following button and save the file to a known location.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Enable HTTP server which provides a JavaViewer applet</source>
+ <source>Generate bug report archive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>HTTP server port</source>
+ <source>5)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Allow connections from localhost only</source>
+ <source>Go to the <a href="http://sourceforge.net/tracker/?group_id=132465&atid=724375">iTALC bug tracker</a>, open a new bug, describe what you did in step 3) and attach the file you saved in step 4).</p>
+<br/>
+<br/>
+Note: if the bug involves both a master and client computer, attach bug report archives for both computers.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Key file authentication</source>
+ <source>&File</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>ACL-based logon authentication</source>
+ <source>&Help</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Public key file base directory</source>
+ <source>&Quit</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Private key file base directory</source>
+ <source>Ctrl+Q</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Launch key file assistant</source>
+ <source>&Save settings into file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Manage permissions</source>
+ <source>Save settings into file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Test</source>
+ <source>Ctrl+S</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Access confirmation</source>
+ <source>L&oad settings from file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>You can configure iTALC to ask the user for permission to access the desktop when using certain authentication methods.</source>
+ <source>Ctrl+O</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Logon authentication</source>
+ <source>About iTALC</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Allow same user to access desktop without confirmation</source>
+ <source>About Qt</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Debugging iTALC</source>
+ <source>No write access</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>When encountering bugs or other misbehaviour in iTALC it is important to inform the developers about them, so that the bugs can be fixed in future releases. This page allows you to submit a helpful bug report easily.
-
-If the bug is not reproducible, skip step 1) - 3).</source>
+ <source>Could not contact iTALC service</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>1)</source>
+ <source>Could not contact the local iTALC service. It is likely that you entered wrong credentials or key files are not set up properly. Try again or contact your administrator for solving this problem using the iTALC Management Console.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Clear the logfiles in the "General" section.</source>
+ <source>Authentication impossible</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>2)</source>
+ <source>No authentication key files were found or your current ones are outdated. Please create new key files using the iTALC Management Console. Alternatively set up logon authentication using the iTALC Management Console. Otherwise you won't be able to access computers using iTALC.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>In the "General" section set the log level to "Debug messages and everything else".</source>
+ <source>Could not modify the autostart property for the iTALC Service.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>3)</source>
+ <source>Could not modify the service arguments for the iTALC Service.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Repeat the actions leading to the bug or misbehaviour.</source>
+ <source>Could not change the firewall configuration for the iTALC Service.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>4)</source>
+ <source>Configuration not writable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Click the following button and save the file to a known location.</source>
+ <source>The local configuration backend reported that the configuration is not writable! Please run the iTALC Management Console with higher privileges.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Generate bug report archive</source>
+ <source>All settings were applied successfully.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>5)</source>
+ <source>An error occured while applying settings!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Go to the <a href="http://sourceforge.net/tracker/?group_id=132465&atid=724375">iTALC bug tracker</a>, open a new bug, describe what you did in step 3) and attach the file you saved in step 4).</p>
-<br/>
-<br/>
-Note: if the bug involves both a master and client computer, attach bug report archives for both computers.</source>
+ <source>iTALC Management Console %1</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -1333,6 +1325,10 @@ Note: if the bug involves both a master and client computer, attach bug report a
<translation type="unfinished"></translation>
</message>
<message>
+ <source>Running</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<source>The iTALC service needs to be stopped temporarily in order to remove the log files. Continue?</source>
<translation type="unfinished"></translation>
</message>
@@ -1353,6 +1349,18 @@ Note: if the bug involves both a master and client computer, attach bug report a
<translation type="unfinished"></translation>
</message>
<message>
+ <source>Load settings from file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>XML files (*.xml)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save settings to file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<source>Logon authentication test</source>
<translation type="unfinished"></translation>
</message>
@@ -1381,19 +1389,11 @@ Note: if the bug involves both a master and client computer, attach bug report a
<translation type="unfinished"></translation>
</message>
<message>
- <source>Could not contact iTALC service</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Could not contact the local iTALC service. It is likely that you entered wrong credentials or key files are not set up properly. Try again or contact your administrator for solving this problem using the iTALC Management Console.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Authentication impossible</source>
+ <source>Unsaved settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>No authentication key files were found or your current ones are outdated. Please create new key files using the iTALC Management Console. Alternatively set up logon authentication using the iTALC Management Console. Otherwise you won't be able to access computers using iTALC.</source>
+ <source>There are unsaved settings. Quit anyway?</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1401,7 +1401,7 @@ Note: if the bug involves both a master and client computer, attach bug report a
<name>MessageBoxSlave</name>
<message>
<source>Message from teacher</source>
- <translation type="unfinished">Viesti opettajalta</translation>
+ <translation type="unfinished">הודעה מהמורה</translation>
</message>
</context>
<context>
@@ -1414,23 +1414,23 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"><html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600; font-style:italic;">Tervetuloa iTALC:n pariin!</span></p></body></html></translation>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600; font-style:italic;">ברוכים הבאים !</span></p></body></html></translation>
</message>
<message>
<source>Here you see the working-bar which contains several buttons. Each button is connected to a workspace. Just take a look at the available workspaces by clicking on the corresponding button.</source>
- <translation type="unfinished">Viereisen työkalupalkin avulla valitset sen, mitä tässä työtilassa näytetään. Kokeile eri tiloja painamalla kuvakkeita. Painamalla valitun työtilan kuvaketta uudestaan piilotat tämän työtilan.</translation>
+ <translation type="unfinished">כאן ניתן לראות את סרגל העבודה המכיל מספר כפתורים. כל כפתור מחובר לעמדת עבודה. ניתן להציץ בעמדות העבודה פשוט על ידי לחיצה על על אחד החלונות</translation>
</message>
<message>
<source>Using the classroom-manager you can manage your classrooms and computers. You can also see which users are logged in.</source>
- <translation type="unfinished">Luokkahuoneiden hallinnassa kontrolloit eri luokkahuoneita ja tietokoneita. Siinä näet myös käyttäjät, jotka ovat kirjautuneina koneille.</translation>
+ <translation type="unfinished">בעזרת ניהול כיתה, אתם יכולים לנהל את הכיתות ואת המחשבים שלכם. ניתן גם לראות אילו משתמשים מחוברים</translation>
</message>
<message>
<source>The snapshot-workspace is a very useful tool. It let's you manage the snapshots you made.</source>
- <translation type="unfinished">Kuvaruutukopioiden hallinta on hyvin hyödyllinen työkalu. Sillä hallitset ottamiasi kuvaruutukopioita.</translation>
+ <translation type="unfinished">מנהל תמונות המצב הוא כלי מאוד שימושי המאפשר ניהול של תמונות המצב שנילקחו</translation>
</message>
<message>
<source>Of course you can configure iTALC. This is usually done using the configuration-workspace.</source>
- <translation type="unfinished">Tässä tilassa voit muokata iTALC:a mieleiseksesi.</translation>
+ <translation type="unfinished">שינוי הגדרות התוכנה יבוצע דרך מנהל ההגדרות</translation>
</message>
<message>
<source>About iTALC</source>
@@ -1441,85 +1441,97 @@ p, li { white-space: pre-wrap; }
<name>OverviewWidget</name>
<message>
<source>Overview</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">סקירה</translation>
</message>
<message>
<source>Some basic information on iTALC and how to use it.</source>
- <translation type="unfinished">Perustietoja iTALC:sta ja sen käytöstä.</translation>
+ <translation type="unfinished">קצת מידע בסיסי על התוכנה והשימוש בה</translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
<message>
+ <source>iTALC Logon</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<source>Please enter your username and password in order to access iTALC clients.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Username</source>
- <translation type="unfinished">Käyttäjätunnus</translation>
+ <translation type="unfinished">שם משתמש</translation>
</message>
<message>
<source>Password</source>
- <translation type="unfinished">Salasana</translation>
- </message>
- <message>
- <source>iTALC Logon</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">סיסמא</translation>
</message>
</context>
<context>
<name>QApplication</name>
<message>
<source>iTALC Client %1 on %2:%3</source>
- <translation>ICA %1 portissa %2:%3</translation>
+ <translation>תלמיד %1 ב- %2:%3</translation>
</message>
<message>
<source>Unable to register service '%1'.</source>
- <translation>Rekisteröityminen palveluun '%1' epäonnistui.</translation>
+ <translation>לא ניתן לבצע רישום לשירות
+%1</translation>
</message>
<message>
<source>The Service Control Manager could not be contacted (do you have the neccessary rights?!) - the service '%1' was not registered.</source>
- <translation>Kytkeytyminen Service Control Manageriin epäonnistui (ovatko käyttöoikeutesi riittävät?) - palvelua '%1' ei rekisteröity.</translation>
+ <translation>לא ניתן לבצע התקשרות לאפלקציית ניהול השירות. (האם יש בידך הרשאות מתאימות?!) השירות הבא לא נירשם
+%1</translation>
</message>
<message>
<source>The service '%1' is already registered.</source>
- <translation>Palvelu '%1' on jo rekisteröity.</translation>
+ <translation>%1
+שירות זה כבר רשום</translation>
</message>
<message>
<source>The service '%1' could not be registered.</source>
- <translation>Palvelua '%1' ei voitu rekisteröidä.</translation>
+ <translation>לא ניתן לבצע רישום לשירות
+%1</translation>
</message>
<message>
<source>The service '%1' was successfully registered.</source>
- <translation>Palvelu '%1' rekisteröity onnistuneesti.</translation>
+ <translation>%1
+שירות זה נירשם בהצלחה</translation>
</message>
<message>
<source>The service '%1' could not be stopped.</source>
- <translation>Palvelua '%1' ei voitu pysäyttää.</translation>
+ <translation>%1
+שירות זה לא ניתן לעצירה</translation>
</message>
<message>
<source>The service '%1' has been unregistered.</source>
- <translation>Palvelu '%1' poistettu.</translation>
+ <translation>%1
+בוטל רישום של שירות זה</translation>
</message>
<message>
<source>The service '%1' isn't registered and therefore can't be unregistered.</source>
- <translation>Palvelua '%1' ei ole rekisteröity, joten sitä ei voida poistaa.</translation>
+ <translation>%1
+לא ניתן להוציא שירות זה מרישום מאחר ואינו רשום</translation>
</message>
<message>
<source>The service '%1' could not be unregistered.</source>
- <translation>Palvelua '%1' ei voitu poistaa.</translation>
+ <translation>%1
+לא ניתן להוציא שירות זה מרישום</translation>
</message>
<message>
<source>The service '%1' could not be found.</source>
- <translation>Palvelua '%1' ei löydy.</translation>
+ <translation>%1
+לא ניתן למצוא שירות זה</translation>
</message>
<message>
<source>The Service Control Manager could not be contacted (do you have the neccessary rights?!) - the service '%1' was not unregistered.</source>
- <translation>Kytkeytyminen Service Control Manageriin epäonnistui (ovatko käyttöoikeutesi riittävät?!) - palvelua '%1' ei poistettu.</translation>
+ <translation>לא ניתן לבצע התקשרות לאפלקציית ניהול השירות. (האם יש בידך הרשאות מתאימות?!) - השירות הבא לא הוצא מרישום
+%1</translation>
</message>
<message>
<source>The Service Control Manager could not be contacted (do you have the neccessary rights?!) - the service '%1' was not stopped.</source>
- <translation>Kytkeytyminen Service Control Manageriin epäonnistui (ovatko käyttöoikeutesi riittävät?!) - palvelua '%1' ei pysäytetty.</translation>
+ <translation>לא ניתן לבצע התקשרות לאפלקציית ניהול השירות. (האם יש בידך הרשאות מתאימות?!) - השירות הבא לא הופסק
+%1</translation>
</message>
</context>
<context>
@@ -1534,57 +1546,57 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>unknown user</source>
- <translation type="unfinished">tuntematon käyttäjä</translation>
+ <translation type="unfinished">משתמש לא מוכר</translation>
</message>
</context>
<context>
<name>RemoteControlWidgetToolBar</name>
<message>
<source>View only</source>
- <translation type="unfinished">Etänäkymä</translation>
+ <translation type="unfinished">צפייה בלבד</translation>
</message>
<message>
<source>Remote control</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">שליטה מרחוק</translation>
</message>
<message>
<source>Lock student</source>
- <translation type="unfinished">Lukitse</translation>
+ <translation type="unfinished">נעל תלמיד</translation>
</message>
<message>
<source>Unlock student</source>
- <translation type="unfinished">Vapauta</translation>
+ <translation type="unfinished">שחרר תלמיד</translation>
</message>
<message>
<source>Snapshot</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">צילום מסך</translation>
</message>
<message>
<source>Fullscreen</source>
- <translation type="unfinished">Koko ruutu</translation>
+ <translation type="unfinished">מסך מלא</translation>
</message>
<message>
<source>Window</source>
- <translation type="unfinished">Ikkunoitu</translation>
+ <translation type="unfinished">מזער</translation>
</message>
<message>
<source>Quit</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">יציאה</translation>
</message>
<message>
<source>Connecting %1</source>
- <translation type="unfinished">Muodostaa yhteyttä %1</translation>
+ <translation type="unfinished">מתחבר %1</translation>
</message>
<message>
<source>Connected.</source>
- <translation type="unfinished">Yhteys muodostettu.</translation>
+ <translation type="unfinished">מחובר</translation>
</message>
</context>
<context>
<name>RemoteLogonDialog</name>
<message>
<source>Remote logon</source>
- <translation type="unfinished">Kirjaudu</translation>
+ <translation type="unfinished">התחברות</translation>
</message>
<message>
<source>Use the fields below to enter the username, password and optional the domain name. These information will be used to logon the computer(s).</source>
@@ -1592,15 +1604,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Username</source>
- <translation type="unfinished">Käyttäjätunnus</translation>
+ <translation type="unfinished">שם משתמש</translation>
</message>
<message>
<source>Password</source>
- <translation type="unfinished">Salasana</translation>
+ <translation type="unfinished">סיסמא</translation>
</message>
<message>
<source>Domain</source>
- <translation type="unfinished">Toimialue</translation>
+ <translation type="unfinished">דומיין</translation>
</message>
</context>
<context>
@@ -1622,22 +1634,23 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Could not take a snapshot as directory %1 doesn't exist and couldn't be created.</source>
- <translation type="unfinished">Kuvaruutukopion ottaminen epäonnistui, koska hakemistoa %1 ei ole olemassa eikä sitä pystytty luomaan.</translation>
+ <translation type="unfinished">לא ניתן היה לבצע צילום מסך מאחר והתיקייה הבאה אינה קיימת או שאינה ניתנת ליצירה
+%1</translation>
</message>
<message>
<source>Snapshot</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">צילום מסך</translation>
</message>
</context>
<context>
<name>SnapshotList</name>
<message>
<source>Snapshots</source>
- <translation type="unfinished">Kuvaruutukopiot</translation>
+ <translation type="unfinished">צילומי מסך</translation>
</message>
<message>
<source>Simply manage the snapshots you made using this workspace.</source>
- <translation type="unfinished">Hallitse ottamiasi kuvaruutukopioita.</translation>
+ <translation type="unfinished">בלחיצה על כפתור זה מתאפשר ניהול צילומי המסך שנלקחו</translation>
</message>
</context>
<context>
@@ -1650,23 +1663,23 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"><html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tässä on lueteltu kaikki ottamasti kuvaruutukopiot. Kuvaruutukopion saat otettua painamalla haluamasi koneen ikkunassa hiiren oikeaa näppäintä ja valitsemalla alivalikosta "Ota kuvaruutukopio". Näitä kuvia voidaan hallita alla olevilla painikkeilla.</p></body></html></translation>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">כל צילומי המסך שנעשו רשומים כאן. ניתן לעשות צילום על ידי בחירה מתאימה בחלון התלמיד. ניהול צילומים אלו יתבצע בעזרת שני כפתורים שלמטה</p></body></html></translation>
</message>
<message>
<source>User:</source>
- <translation type="unfinished">Käyttäjä:</translation>
+ <translation type="unfinished">משתמש:</translation>
</message>
<message>
<source>Host:</source>
- <translation type="unfinished">Tietokone:</translation>
+ <translation type="unfinished">שם מחשב :</translation>
</message>
<message>
<source>Date:</source>
- <translation type="unfinished">Pvm:</translation>
+ <translation type="unfinished">תאריך :</translation>
</message>
<message>
<source>Time:</source>
- <translation type="unfinished">Aika:</translation>
+ <translation type="unfinished">שעה :</translation>
</message>
<message>
<source>Show</source>
@@ -1681,7 +1694,7 @@ p, li { white-space: pre-wrap; }
<name>SupportDialog</name>
<message>
<source>Support</source>
- <translation type="unfinished">Tukitoiminto</translation>
+ <translation type="unfinished">תמיכה</translation>
</message>
<message>
<source>Please enter the IP address or the name of the host to which you want to connect.</source>
@@ -1696,73 +1709,74 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Use the field below to type your message which will be sent to all selected users.</source>
- <translation type="unfinished">Kirjoita viesti alla olevaan kentään. Viesti lähetetään kaikille valituille koneille.</translation>
+ <translation type="unfinished">בשדה למטה יש להכניס את תוכן ההודעה שתישלח לרשימת משתמשים ניבחרים</translation>
</message>
</context>
<context>
<name>VncView</name>
<message>
<source>Establishing connection to %1 ...</source>
- <translation type="unfinished">Luodaan yhteyttä %1 ...</translation>
+ <translation type="unfinished">מבצע התחברות ל
+%1</translation>
</message>
</context>
<context>
<name>clientMenu</name>
<message>
<source>Overview</source>
- <translation type="unfinished"></translation>
+ <translation>סקירה</translation>
</message>
<message>
<source>Fullscreen demo</source>
- <translation type="unfinished">Esitys koko näytöllä</translation>
+ <translation>הדגמה במסך מלא</translation>
</message>
<message>
<source>Window demo</source>
- <translation type="unfinished">Esitys ikkunassa</translation>
+ <translation>חלון הדגמה</translation>
</message>
<message>
<source>Locked display</source>
- <translation type="unfinished">Lukitse</translation>
+ <translation>תצוגה נעולה</translation>
</message>
<message>
<source>View live</source>
- <translation type="unfinished">Avaa näkymä</translation>
+ <translation>צפייה ישירה</translation>
</message>
<message>
<source>Remote control</source>
- <translation type="unfinished"></translation>
+ <translation>שליטה מרחוק</translation>
</message>
<message>
<source>Let student show demo</source>
- <translation type="unfinished">Oppilaan esitys</translation>
+ <translation>אפשרו לתלמיד להציג הדגמה</translation>
</message>
<message>
<source>Send text message</source>
- <translation type="unfinished"></translation>
+ <translation>שלחו הודעת טקסט</translation>
</message>
<message>
<source>Logout user</source>
- <translation type="unfinished"></translation>
+ <translation>נתק משתמש</translation>
</message>
<message>
<source>Take a snapshot</source>
- <translation type="unfinished">Ota kuvaruutukopio</translation>
+ <translation>צילום מסך</translation>
</message>
<message>
<source>Power on</source>
- <translation type="unfinished"></translation>
+ <translation>הדלקה</translation>
</message>
<message>
<source>Reboot</source>
- <translation type="unfinished">Uudelleenkäynnistä tietokone</translation>
+ <translation>איתחול</translation>
</message>
<message>
<source>Power down</source>
- <translation type="unfinished"></translation>
+ <translation>כיבוי</translation>
</message>
<message>
<source>Execute commands</source>
- <translation type="unfinished">Suorita komento</translation>
+ <translation>בצע פקודות</translation>
</message>
</context>
</TS>
diff --git a/lib/resources/hu.qm b/lib/resources/hu.qm
new file mode 100644
index 0000000..638f589
Binary files /dev/null and b/lib/resources/hu.qm differ
diff --git a/lib/resources/fr.ts b/lib/resources/hu.ts
similarity index 53%
copy from lib/resources/fr.ts
copy to lib/resources/hu.ts
index 4486b40..cd406fc 100644
--- a/lib/resources/fr.ts
+++ b/lib/resources/hu.ts
@@ -1,387 +1,390 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.0">
+<TS version="2.0" language="hu_HU">
<context>
<name>AboutDialog</name>
<message>
<source>About iTALC</source>
- <translation type="unfinished">À propos d'iTALC</translation>
+ <translation type="unfinished">Az iTALC névjegye</translation>
</message>
<message>
<source>About</source>
- <translation type="unfinished">À propos</translation>
- </message>
- <message utf8="true">
- <source>iTALC - Intelligent Teaching And Learning with Computers
-
-Copyright © 2004-2011 Tobias Doerffel</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Névjegy</translation>
</message>
<message>
<source><a href="http://italc.sourceforge.net">http://italc.sourceforge.net</a></source>
- <translation type="unfinished"></translation>
+ <translation><a href="http://italc.sourceforge.net">http://italc.sourceforge.net</a></translation>
</message>
<message>
<source>Authors</source>
- <translation type="unfinished">Auteurs</translation>
+ <translation type="unfinished">Szerzők</translation>
</message>
<message>
<source>Translation</source>
- <translation type="unfinished">Traduction </translation>
+ <translation>Fordítás</translation>
</message>
<message>
<source>Current language not translated yet (or native English).
If you're interested in translating iTALC into your local or another language or want to improve an existing translation, please contact an iTALC developer!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A magyar fordítást készítették a Novell PSH Kft. munkatársai:
+Maxi Attila, Kovács Lajos és Óvári Ákos
+
+Amennyiben hibát talál a magyar fordításban, kérem mielőbb jelezze a Novell PSH Kft. munkatársai felé: huedudl at npsh.hu e-mail címen.
+
+Ha szeretné lefordítani másik nyelvre is, kérem jelezze az iTALC fejlesztőcsapatának.</translation>
</message>
<message>
<source>License</source>
- <translation type="unfinished">Licence</translation>
+ <translation>Licence</translation>
</message>
<message utf8="true">
<source>iTALC - Intelligent Teaching And Learning with Computers
Copyright © 2004-2011 Tobias Doerffel / iTALC Solutions</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">iTALC - Intelligent Teaching And Learning with Computer
+
+Copyright © 2004-2011 Tobias Doerffel / iTALC Solutions
+</translation>
</message>
</context>
<context>
<name>AccessDialogSlave</name>
<message>
<source>Never for this session</source>
- <translation type="unfinished">Jamais pour cette session</translation>
+ <translation type="unfinished">Ebben a munkamenetben soha</translation>
</message>
<message>
<source>Always for this session</source>
- <translation type="unfinished">Toujours pour cette session</translation>
+ <translation type="unfinished">Ebben a munkamenetben mindig</translation>
</message>
<message>
<source>Confirm desktop access</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hozzáférés megerősítése a munkaasztalhoz</translation>
</message>
<message>
<source>The user %1 at host %2 wants to access your desktop. Do you want to grant access?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">%1 felhasználó a(z) %2 gépről hozzáférést kezdeményezett az Ön munkaasztalához. Engedélyezi?</translation>
</message>
</context>
<context>
<name>ClassroomManager</name>
<message>
<source>Classroom-Manager</source>
- <translation type="unfinished">Gestionnaire de salle</translation>
+ <translation>Osztályterem-Kezelés</translation>
</message>
<message>
<source>Use this workspace to manage your computers and classrooms in an easy way.</source>
- <translation type="unfinished">Utilisez cet espace pour gérer facilement vos ordinateurs et vos salles.</translation>
+ <translation>Ezen a munkaasztalon kezelheti a számítógépeket és az osztálytermeket</translation>
</message>
<message>
<source>This is where computers and classrooms are managed. You can add computers or classrooms by clicking right in this list.</source>
- <translation type="unfinished">C'est d'ici que vous gérez les ordinateurs et les salles. Vous pouvez ajouter des ordinateurs ou des salles par un clic droit sur cette liste.</translation>
+ <translation>Itt tudja kezelni a számítógépeit és az osztálytermeit. Számítógép vagy osztályterem hozzáadásához kattintson az egér jobb gombjával a listára.</translation>
</message>
<message>
<source>Classrooms/computers</source>
- <translation type="unfinished">Salles/ordinateurs</translation>
+ <translation>Osztálytermek/Számítógépek</translation>
</message>
<message>
<source>IP-address</source>
- <translation type="unfinished">Adresse IP</translation>
+ <translation>IP-Cím</translation>
</message>
<message>
<source>Usernames</source>
- <translation type="unfinished">Noms</translation>
+ <translation>Felhasználók</translation>
</message>
<message>
<source>Show usernames</source>
- <translation type="unfinished">Afficher les noms d'utilisateurs</translation>
+ <translation type="unfinished">Felhasználók megjelenítése</translation>
</message>
<message>
<source>Use the context-menu (right mouse-button) to add/remove computers and/or classrooms.</source>
- <translation type="unfinished">Utilisez le menu contextuel (bouton droit) pour ajouter/enlever des ordinateurs ou des salles.</translation>
+ <translation type="unfinished">A lenyíló menü segítségével (egér jobb gomb megnyomásával) hozzáadhatja, törölheti a számítógépeket vagy osztálytermeket.</translation>
</message>
<message>
<source>Export to text-file</source>
- <translation type="unfinished">Export�fichier texte</translation>
+ <translation type="unfinished">Exportálás fájlba</translation>
</message>
<message>
<source>Use this button for exporting this list of computers and usernames into a text-file. You can use this file later for collecting files after an exam has finished. This is sometimes neccessary, because some users might have finished and logged out earlier and so you cannot collect their files at the end of the exam.</source>
- <translation type="unfinished">Utilisez ce bouton pour exporter cette liste d'ordinateurs et de noms d'utilisateurs dans un fichier texte.
-Vous pourrez utiliser ensuite ce fichier pour collecter des fichiers à la fin d'un examen. C'est parfois nécessaires, car certains étudiants peuvent terminer et se déconnecter en avance, ce qui vous empêche de collecter leurs fichiers.</translation>
+ <translation type="unfinished">A gomb segítségével exportálhatja a számítógépeket és a felhasználókat a szöveges állományba. A vizsga befejeztével egyszerűen begyűjtheti ezeket a fájlokat. Néhány alkalommal szükséges lehet, mert a vizsgával már korábban végzett és kijelentkezett felhasználók már nem érhetőek el a rendszerben.</translation>
</message>
<message>
<source>Hide teacher computers</source>
- <translation type="unfinished">Cacher les ordinateurs des professeurs</translation>
+ <translation>Tanári számítógépek elrejtése</translation>
</message>
<message>
<source>Show/hide</source>
- <translation type="unfinished">Afficher/cacher</translation>
+ <translation>Megtekint/Elrejt</translation>
</message>
<message>
<source>Edit settings</source>
- <translation type="unfinished">Modifier les réglages</translation>
+ <translation>Beállítások szerkesztése</translation>
</message>
<message>
<source>Remove</source>
- <translation type="unfinished">Supprimer</translation>
+ <translation>Törlés</translation>
</message>
<message>
<source>Show all computers in classroom</source>
- <translation type="unfinished">Afficher tous les ordinateurs de cette salle</translation>
+ <translation>Összes számítógép megtekintése az osztályteremben</translation>
</message>
<message>
<source>Hide all computers in classroom</source>
- <translation type="unfinished">Cacher tous les ordinateurs de cette salle</translation>
+ <translation>Összes számítógép elrejtése az osztályteremben</translation>
</message>
<message>
<source>Edit name</source>
- <translation type="unfinished">Modifier le nom </translation>
+ <translation>Név szerkesztése</translation>
</message>
<message>
<source>Remove classroom</source>
- <translation type="unfinished">Supprimer la salle </translation>
+ <translation>Osztályterem törlése</translation>
</message>
<message>
<source>Add computer</source>
- <translation type="unfinished">Ajouter un ordinateur</translation>
+ <translation>Számítógép hozzáadása</translation>
</message>
<message>
<source>Add classroom</source>
- <translation type="unfinished">Ajouter une salle</translation>
+ <translation>Osztályterem hozzáadása</translation>
</message>
<message>
<source>No configuration-file found</source>
- <translation type="unfinished">Aucun fichier de configuration trouvé</translation>
+ <translation>Nem található a konfigurációs fájl</translation>
</message>
<message>
<source>Could not open configuration file %1.
You will have to add at least one classroom and computers using the classroom-manager which you'll find inside the program in the sidebar on the left side.</source>
- <translation type="unfinished">Impossible d'ouvrir le fichier de configuration %1.
-Vous devez ajouter au moins une salle et un ordinateur, en utilisant le gestionnaire de salle dans la barre latérale gauche.</translation>
+ <translatorcomment>Legalább egy számítógépterem csoportot definiálnunk kell ahhoz, hogy a számítógép(ek)et megfelelően tudjuk kezelni a bal oldalsávon.</translatorcomment>
+ <translation type="unfinished">Nem nyitható meg a %1 konfigurációs fájl.
+Legalább egy számítógépterem csoportot definiálnunk kell ahhoz, hogy a számítógép(ek)et megfelelően tudjuk kezelni a bal oldalsávon.</translation>
</message>
<message>
<source>Error in configuration-file</source>
- <translation type="unfinished">Erreur dans le fichier de configuration
-</translation>
+ <translation>Hiba a konfigurációs fájlban</translation>
</message>
<message>
<source>Error while parsing configuration-file %1.
Please edit it. Otherwise you should delete this file and have to add all classrooms and computers again.</source>
- <translation type="unfinished">Erreur pendant la lecture du fichier de configuration.
-Veuillez le modifier, ou bien supprimer le fichier puis re-créer les salles et les ordinateurs.</translation>
+ <translation type="unfinished">Hiba történt a %1 konfigurációs fájl feldogozása közben.
+Kérem módosítsa, máskülönben törlésre kerülhet a fájl és újból létre kell hozni az összes osztályterme(ke)t és számítógépe(ke)t.</translation>
</message>
<message>
<source>Error while parsing configuration-file %1.
Please edit it. Otherwise you should delete this file.</source>
- <translation type="unfinished">Erreur pendant la lecture du fichier de configuration %1.
-Veuillez le modifier ou le supprimer.</translation>
+ <translation type="unfinished">Hiba történt a %1 konfigurációs fájl feldogozása közben.
+Kérem módosítsa, máskülönben törlésre kerülhet a fájl.</translation>
</message>
<message>
<source>Select output-file</source>
- <translation type="unfinished">Choisir le fichier de sortie</translation>
+ <translation>Kimeneti fájl kiválasztása</translation>
</message>
<message>
<source>Text files (*.txt)</source>
- <translation type="unfinished">Fichiers texte (*.txt)</translation>
+ <translation>Szöveges fájlok (*.txt)</translation>
</message>
<message>
<source>Actions for selected</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Kiválasztottak műveletei</translation>
</message>
<message>
<source>Actions</source>
- <translation type="unfinished">Actions</translation>
+ <translation>Műveletek</translation>
</message>
<message>
<source>Actions for %1</source>
- <translation type="unfinished">Actions pour %1</translation>
+ <translation type="unfinished">%1 terem műveletei</translation>
</message>
<message>
<source>New name for classroom</source>
- <translation type="unfinished">Nouveau nom pour la salle</translation>
+ <translation>Új név hozzáadása az osztályteremhez</translation>
</message>
<message>
<source>Please enter a new name for classroom "%1".</source>
- <translation type="unfinished">Veuillez entrer un nouveau nom pour la salle "%1".</translation>
+ <translation>Kérem írja be az új osztály terem nevét "%1".</translation>
</message>
<message>
<source>Are you sure want to remove classroom "%1"?
All computers in it will be removed as well!</source>
- <translation type="unfinished">Voulez-vous vraiment supprimer la salle "%1" ?
-Tous les ordinateurs lui appartenant seront supprimés également !</translation>
+ <translation type="unfinished">Biztos benne, hogy törli a "%1" osztálytermet?
+Az összes számítógép törlésre kerül!</translation>
</message>
<message>
<source>Missing classroom</source>
- <translation type="unfinished">Salle manquante</translation>
+ <translation>Hiányzó osztályterem</translation>
</message>
<message>
<source>Before adding computers you have to create at least one classroom.
Do you want to create a new classrom now?</source>
- <translation type="unfinished">Avant d'ajouter des ordinateurs, vous devez créer au moins une salle.
-Voulez-vous en créer une maintenant ?</translation>
+ <translation type="unfinished">Új számítógép hozzáadása előtt, hozzon létre egy osztálytermet.
+Szeretne létrehozni új osztálytermet?</translation>
</message>
<message>
<source>New classroom</source>
- <translation type="unfinished">Nouvelle salle</translation>
+ <translation>Új osztályterem</translation>
</message>
<message>
<source>Please enter the name of the classroom you want to create.</source>
- <translation type="unfinished">Veuillez entrer le nom de la salle que vous voulez créer.</translation>
+ <translation type="unfinished">Kérem írja be az osztályterem nevét, amit létre szeretne hozni.</translation>
</message>
</context>
<context>
<name>Client</name>
<message>
<source>Unknown state</source>
- <translation type="unfinished">État inconnu</translation>
+ <translation>Ismeretlen állapot</translation>
</message>
<message>
<source>No user logged in</source>
- <translation type="unfinished">Aucun utilisateur connecté</translation>
+ <translation>Nincsen felhasználó bejelentkezve</translation>
</message>
<message>
<source>Host unreachable</source>
- <translation type="unfinished">Hôte impossible à atteindre</translation>
+ <translation>A számítógép nem érhető el</translation>
</message>
<message>
<source>Demo running</source>
- <translation type="unfinished">Démo en cours</translation>
+ <translation type="unfinished">Aktuális bemutatói futás</translation>
</message>
<message>
<source>Desktop locked</source>
- <translation type="unfinished">Bureau verrouillé</translation>
+ <translation type="unfinished">Blokkolt asztal</translation>
</message>
</context>
<context>
<name>ClientAction</name>
<message>
<source>Are you sure want logout all users on all visible computers ?</source>
- <translation type="unfinished">Voulez-vous vraiment déconnecter tous les utilisateurs de tous les ordinateurs visibles ?</translation>
+ <translatorcomment>Biztosan ki szeretné jelentkeztetni az összes felhasználót a kijelölt számítógépekről?</translatorcomment>
+ <translation type="unfinished">Biztosan szeretné,hogy az összes felhasználó kijelentkezzen a számítógépekről?</translation>
</message>
<message>
<source>Are you sure want logout all users on all selected computers ?</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>Biztosan ki szeretné jelentkeztetni az összes felhasználót a kijelölt számítógépekről?</translatorcomment>
+ <translation type="unfinished">Biztosan szeretné,hogy az összes felhasználó kijelentkezzen a kijelölt számítógépekről?</translation>
</message>
<message>
<source>Logout user</source>
- <translation type="unfinished">Déconnecter l'utilisateur</translation>
+ <translation type="unfinished">Felhasználói kijelentkezés</translation>
</message>
<message>
<source>Are you sure want to reboot all visible computers?</source>
- <translation type="unfinished">Voulez-vous vraiment redémarrer tous les ordinateurs visibles ?</translation>
+ <translation type="unfinished">Biztos benne, hogy újra szeretné indítani az összes számítógépet?</translation>
</message>
<message>
<source>Are you sure want to reboot all selected computers?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Biztos benne, hogy újra szeretné indítani az összes kijelölt számítógépet?</translation>
</message>
<message>
<source>Reboot computers</source>
- <translation type="unfinished">Redémarrer les ordinateurs</translation>
+ <translation type="unfinished">Számítógépek újraindítása</translation>
</message>
<message>
<source>Are you sure want to power down all visible computers?</source>
- <translation type="unfinished">Voulez-vous vraiment éteindre tous les ordinateurs visibiles ?</translation>
+ <translation type="unfinished">Biztos benne, hogy ki szeretné kapcsolni az összes számítógépet?</translation>
</message>
<message>
<source>Are you sure want to power down all selected computers?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Biztos benne, hogy ki szeretné kapcsolni az összes kijelölt számítógépet?</translation>
</message>
</context>
<context>
<name>ClientSettingsDialog</name>
<message>
<source>Invalid MAC-address</source>
- <translation type="unfinished">Adresse MAC invalide</translation>
+ <translation type="unfinished">Érvénytelen MAC azonosító</translation>
</message>
<message>
<source>You specified an invalid MAC-address. Either leave the field blank or enter a valid MAC-address (use ":" as separator!).</source>
- <translation type="unfinished">Vous avez entré une adresse MAC invalide. Laissez le champ vide ou entrez une adresse valide (séparateur = ":").</translation>
+ <translation type="unfinished">Érvénytelen MAC azonosítót adott meg. Hagyja üresen a mezőt vagy adjon meg egy érvényes MAC azonosítót (használjon ":" az elválasztáshoz!).</translation>
</message>
<message>
<source>Client settings</source>
- <translation type="unfinished">Réglages client</translation>
+ <translation type="unfinished">Kliens beállítások</translation>
</message>
<message>
<source>IP/hostname</source>
- <translation type="unfinished">IP/nom d'hôte</translation>
+ <translation type="unfinished">IP cím vagy gépnév</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">enter an IP-address or hostname under which iTALC can reach the client (use ':' for specifying an optional port-number)</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Entrez une adresse IP ou un nom d'hôte pour le client (utilisez un : pour préciser un numéro de port optionnel)</p></body></html></translation>
+ <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">adja meg az IP címet vagy gépnevet, amivel iTALC elérheti a kliens gépeket (használjon ":" - megadhatározhatja a kívánt port számát)</p></body></html></translation>
</message>
<message>
<source>Name</source>
- <translation type="unfinished">Nom</translation>
+ <translation type="unfinished">Név</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Optional nickname of the host which is displayed in iTALC.</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Surnom optionnel de l'hôte affiché dans iTALC.</p></body></html></translation>
+ <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adjon meg egy becenevet a géphez, amit szeretne hogy az iTALC-ban megjelenjen.</p></body></html></translation>
</message>
<message>
<source>MAC address</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">MAC azonosító</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hardware/MAC-address of client - only used for powering on client</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Adresse MAC du client - utilisée seulement pour l'arrêt de la machine</p></body></html></translation>
+ <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hardver/MAC azonosítója a kliensnek - csak a számítógép bekapcsolásához használatos</p></body></html></translation>
</message>
<message>
<source>Classroom</source>
- <translation type="unfinished">Salle</translation>
+ <translation type="unfinished">Osztályterem</translation>
</message>
<message>
<source>Type</source>
- <translation type="unfinished">Type</translation>
+ <translation type="unfinished">Típus</translation>
</message>
<message>
<source>Student computer</source>
- <translation type="unfinished">Ordinateur étudiant</translation>
+ <translation type="unfinished">Diák számítógép</translation>
</message>
<message>
<source>Teacher computer</source>
- <translation type="unfinished">Ordinateur professeur</translation>
+ <translation type="unfinished">Tanári számítógép</translation>
</message>
<message>
<source>Other/undefined computer</source>
- <translation type="unfinished">Ordinateur autre/indéfini</translation>
+ <translation type="unfinished">Hozzá nem rendelt számítógép</translation>
</message>
<message>
<source>Missing IP address/hostname</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hiányzó IP cím/gépnév</translation>
</message>
<message>
<source>You didn't specify an IP address or hostname for the computer!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Még nem adta hozzá az IP címet vagy a gépnevet a számítógéphez!</translation>
</message>
</context>
<context>
<name>Config</name>
<message>
<source>Interval between updates</source>
- <translation type="unfinished">Intervalle entre les mises à jour</translation>
+ <translation type="unfinished">Képfrissítés gyakorisága</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Here you can set the interval between updates of clients. Higher values result in lower network-traffic and lower CPU-usage on this computer.</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vous réglez ici l'intervalle de temps entre les mises à jour des clients. Plus la valeur est élevée, plus le trafic réseau et l'occupation du processeur sont réduits.</p></body></html></translation>
+ <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Here you can set the interval between updates of clients. Higher values result in lower network-traffic and lower CPU-usage on this computer.</p></body></html></translation>
</message>
<message>
<source> seconds</source>
- <translation type="unfinished"> secondes</translation>
+ <translation type="unfinished"> másodperc</translation>
</message>
<message>
<source>User interface</source>
- <translation type="unfinished">Interface utilisateur</translation>
+ <translation type="unfinished">Felhasználói felület</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Do not show balloon-tooltips for toolbar-buttons</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ne pas afficher les infobulles pour les boutons de la barre d'outils</p></body></html></translation>
+ <translation type="unfinished"></translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Check this option if you're annoyed by the balloon-tooltips appearing when moving mouse-cursor over toolbar-buttons.</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cochez cette option si vous voulez supprimer les infobulles qui apparaissent quand la souris passe sur les boutons de la barre d'outils.</p></body></html></translation>
+ <translation type="unfinished"></translation>
</message>
<message>
<source>No balloon-tooltips</source>
- <translation type="unfinished">Pas d'infobulles</translation>
+ <translation type="unfinished">Felugró üzenetek tiltása</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Do not show texts on toolbar-buttons</p></body></html></source>
@@ -389,11 +392,11 @@ Voulez-vous en créer une maintenant ?</translation>
</message>
<message>
<source>No texts on toolbar-buttons</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Felirat nélküli eszköztár</translation>
</message>
<message>
<source>Your role (needs according keys!)</source>
- <translation type="unfinished">Votre rôle (nécessite les clés correspondantes)</translation>
+ <translation type="unfinished">Szerepkörök (hozzáférési kulcsok szerint)</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /><style type="text/css">
@@ -403,127 +406,125 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"><html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Vous pouvez choisir votre rôle. Ne modifiez ce champ que si vous savez parfaitement ce que vous faites, sans quoi il vous sera impossible d'accéder aux clients à moins de restaurer votre ancien rôle.</p></body></html></translation>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Itt választhatja ki a szerepköröket. Csak akkor változtassa meg, ha biztosan tudja, hogy mit csinál. Az is előfordulhat máskülönben, hogy nem fog tudni hozzáférni a kliens gépekhez, csak akkor ha visszaállítja az eredeti beállításokat.</p></body></html></translation>
</message>
<message>
<source>Teacher</source>
- <translation type="unfinished">Professeur</translation>
+ <translation type="unfinished">Tanár</translation>
</message>
<message>
<source>Administrator</source>
- <translation type="unfinished">Administrateur</translation>
+ <translation type="unfinished">Adminisztrátor</translation>
</message>
<message>
<source>Supporter</source>
- <translation type="unfinished">Assistant</translation>
+ <translation type="unfinished">Támogató</translation>
</message>
<message>
<source>Other</source>
- <translation type="unfinished">Autre</translation>
+ <translation type="unfinished">Más</translation>
</message>
<message>
<source>Settings for multi-logon</source>
- <translation type="unfinished">Réglages pour connexion multiple</translation>
+ <translation type="unfinished">Tartomány beállításai</translation>
</message>
<message>
<source>Domain</source>
- <translation type="unfinished">Domaine</translation>
+ <translation type="unfinished">Domain</translation>
</message>
<message>
<source>Double-click action for client-window</source>
- <translation type="unfinished">Action double-clic sur fenêtre client</translation>
+ <translation type="unfinished">Dupla kattintás a kliens ablakhoz</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Here you can set what should happen if you double-click a client-window.</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ici, paramétrez l'action à effectuer lors d'un double-clic sur une fenêtre client.</p></body></html></translation>
+ <translation type="unfinished"></translation>
</message>
<message>
<source>Remote control</source>
- <translation type="unfinished">Contrôle à distance</translation>
+ <translation type="unfinished">Távoli hozzáférés</translation>
</message>
<message>
<source>View live in fullscreen</source>
- <translation type="unfinished">Voir en direct en plein écran</translation>
+ <translation type="unfinished">Teljes képernyős élő nézet</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-style:italic;">Please note, that some changes won't take effect until you restart iTALC.</span></p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-style:italic;">Attention, certains changements ne prendront effet qu'au prochain démarrage d'iTALC.</span></p></body></html></translation>
+ <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-style:italic;">Felhívjuk a figyelmét arra, hogy az egyes változások életbelépéshez újra kell indítani az iTALC szolgáltatást.</span></p></body></html></translation>
</message>
</context>
<context>
<name>ConfigWidget</name>
<message>
<source>Your iTALC-configuration</source>
- <translation type="unfinished">Votre configuration iTALC</translation>
+ <translation type="unfinished">iTALC konfiguráció</translation>
</message>
<message>
<source>In this workspace you can customize iTALC to fit your needs.</source>
- <translation type="unfinished">Dans cet espace, vous pouvez paramétrer iTALC pour vos besoins.</translation>
+ <translation type="unfinished">Ezen a munkaterületen szabhatja testre az iTALC-t az Ön igényeinek megfelelően.</translation>
</message>
</context>
<context>
<name>DecoratedMessageBox</name>
<message>
<source>OK</source>
- <translation type="unfinished">OK</translation>
+ <translation>OK</translation>
</message>
</context>
<context>
<name>DemoClient</name>
<message>
<source>iTALC Demo</source>
- <translation type="unfinished">Démo iTALC</translation>
+ <translation type="unfinished">iTALC Bemutató</translation>
</message>
</context>
<context>
<name>ItalcCoreServer</name>
<message>
<source>Authentication error</source>
- <translation type="unfinished">Erreur d'authentification</translation>
+ <translation type="unfinished">Bejelentkezési probléma</translation>
</message>
<message>
<source>Somebody (IP: %1) tried to access this computer but could not authenticate itself successfully!</source>
- <translation type="unfinished">Quelqu'un (IP %1) a essayé d'accéder à cet ordinateur, mais n'a pas réussi à s'authentifier !</translation>
+ <translatorcomment>Valaki (IP: %1) megpróbálta elérni ezt a számítógéphez, de nem tudta hitelesíteni magát!</translatorcomment>
+ <translation type="unfinished">Valaki (IP: %1) megpróbált hozzáférni ehhez a számítógéphez, de nem tudta megfelelően hitelesíteni magát!</translation>
</message>
</context>
<context>
<name>ItalcVncConnection</name>
<message>
<source>VNC authentication failed because of too many authentication tries.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Túl sok próbálkozás miatt a VNC bejelentkezések száma hibára futott.</translation>
</message>
<message>
<source>VNC authentication failed.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">VNC bejelentkezési probléma.</translation>
</message>
<message>
<source>VNC server closed connection.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">VNC szerver lezárta a kapcsolatot.</translation>
</message>
</context>
<context>
<name>KeyFileAssistant</name>
<message>
<source>iTALC Access Key Assistant</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">iTALC hozzáférési kulcs Varázsló</translation>
</message>
<message>
<source>Create/import iTALC access keys</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hozzáférési kulcs Készítése/Importálása</translation>
</message>
<message>
<source>This assistant will help you to create or import iTALC access keys.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A Varázsló segítségével létrehozhatunk vagy importálhatunk hozzáférési kulcsokat.</translation>
</message>
<message>
<source>How does it work?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hogyan működik ?</translation>
</message>
<message>
<source>iTALC access keys consist of two parts belonging together, a private and a public key part.
@@ -531,873 +532,888 @@ p, li { white-space: pre-wrap; }
Using the private key part, users on the master computer will be able to access client computers. It is important that only authorized users have read access to the private key file.
The public key part is used on the client computers to verify that any incoming connection request is authorized.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A hozzáférési azonosítás egy kulcspár segítségével valósul meg, ami a privát kulcs és publikus kulcsból áll.
+
+A privát kulcs a master (tanári) számítógépen azonosítja a kliens gépeket. Nagyon fontos, hogy csak azonosított felhasználóknak legyen joga a privát kulcs olvasásához!
+
+A publikus kulcs a kliens (diák) számítógépein azonosítja a bejövő kérések hitelességét.</translation>
</message>
<message>
<source>Assistant mode</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Varázsló mód</translation>
</message>
<message>
<source>Please choose whether to create new access keys or import a public key on a client.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Kérjük válassza ki, hogy létrehozni vagy importálni szeretne egy új hozzáférési kulcsot a kliens számára.</translation>
</message>
<message>
<source>Create new access keys (master computer)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Új hozzáférési kulcsok készítése (tanári számítógép)</translation>
</message>
<message>
<source>assistantModeButtonGroup</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">assistantModeButtonGroup</translation>
</message>
<message>
<source>Import public key (client computer)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Publikus kulcs importálás (kliens számítógép)</translation>
</message>
<message>
<source>Select user role</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Szerepkör kiválasztása</translation>
</message>
<message>
<source>Please select a user role for which to create or import the access keys:</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Kérjük válassza ki azt a felhasználót, aki számára létrehonzi vagy importálni szeretné a hozzáférési kulcsot:</translation>
</message>
<message>
<source>Teacher</source>
- <translation type="unfinished">Professeur</translation>
+ <translation type="unfinished">Tanár</translation>
</message>
<message>
<source>Administrator</source>
- <translation type="unfinished">Administrateur</translation>
+ <translation type="unfinished">Adminisztrátor</translation>
</message>
<message>
<source>Support team member</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Támogatók</translation>
</message>
<message>
<source>Other</source>
- <translation type="unfinished">Autre</translation>
+ <translation type="unfinished">Más</translation>
</message>
<message>
<source>User roles allow using multiple access keys in parallel. For example there can be different teacher access keys for each classroom while the support access keys are the same for the whole school.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A felhasználói szerepkörökhöz rendelt hozzáférési kulcsok lehetővé teszik a párhuzamos hozzáférést. Például: Minden osztályteremhez különböző tanári kulcsok tartozhatnak, de az iskolára nézve elegendő egy támogatói (support) kulcs készítése.</translation>
</message>
<message>
<source>Directories</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Könyvtárak</translation>
</message>
<message>
<source>Export public key part (master computer)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Publikus kulcspár exportálása (tanári számítógép)</translation>
</message>
<message>
<source>...</source>
- <translation type="unfinished"></translation>
+ <translation>...</translation>
</message>
<message>
<source>Use custom destination directory for access keys</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A hozzáférési kulcsok mentése egyéni könyvtárba</translation>
</message>
<message>
<source>Please specify the location of the public access key to be imported.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Kérem határozza meg a publikus kulcs importálásához az elérési útvonalat.</translation>
</message>
<message>
<source>Summary</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Összefoglalás</translation>
</message>
<message>
<source>The following actions will be taken:</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A következő műveletekre kerül sor:</translation>
</message>
<message utf8="true">
<source>• Create new access keys</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">• Új hozzáférési kulcs elkészítése</translation>
</message>
<message utf8="true">
<source>• Import public access key from</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">• Publikus kulcs importálás</translation>
</message>
<message>
<source><unknown></source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished"><unknown></translation>
</message>
<message utf8="true">
<source>• Write access key(s) to</source>
- <translation type="unfinished"></translation>
+ <translation>• Hozzáférési kulcs(ok) másolása ide:</translation>
</message>
<message utf8="true">
<source>• Export public key to</source>
- <translation type="unfinished"></translation>
+ <translation>• Publikus kulcs exportálás ide:</translation>
</message>
<message utf8="true">
<source>• Configure for user role</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">• Felhasználói szerepkör beállítása:</translation>
</message>
<message>
<source>Select directory in which to export the public key</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Válassza ki azt a könyvtárat, ahonnan exportálni szeretné a publikus kulcsot</translation>
</message>
<message>
<source>Key files (*.key.txt)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Kulcs fájlok (*.key.txt)</translation>
</message>
<message>
<source>Invalid public key</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Érvénytelen publikus kulcs</translation>
</message>
<message>
<source>The selected file does not contain a valid public iTALC access key!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A kiválasztott fájl nem tartalmaz érvényes hozzáférési publikus kulcs adatokat az iTALC-hoz!</translation>
</message>
<message>
<source>Select destination directory</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Cél könyvtár megadása</translation>
</message>
<message>
<source>Access key creation</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hozzáférési kulcs készítése</translation>
</message>
<message>
<source>Could not remove previously existing file %1.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Nem sikerült eltávolítani,a létező fájlt: %1.</translation>
</message>
<message>
<source>Failed exporting public access key from %1 to %2.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Sikertelen volt a publikus kulcs exportálás a %1-ról a %2-re.</translation>
</message>
<message>
<source>Access keys were created and written successfully to %1 and %2.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Sikeresen létrehozta a hozzáférési kulcspárt. A mentése helye: %1 és %2 könvytárban.</translation>
</message>
<message>
<source>An error occured while creating the access keys. You probably are not permitted to write to the selected directories.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A hozzáférési kulcs készítése közben probléma történt. Valószínűleg nincsen írási joga a kiválasztott könyvtárba.</translation>
</message>
<message>
<source>Public key import</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Publikus kulcs importálása</translation>
</message>
<message>
<source>An error occured while importing the public access key. You probably are not permitted to read the source key or to write the destination file.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A publikus kulcs importálás közben hiba lépett fel. Önnek valószínűleg nincsen olvasási joga a forrás fájlból, vagy írási joga a cél fájlba.</translation>
</message>
<message>
<source>The public key was successfully imported to %1.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A publikus kulcs importálása sikeresen végrehajtódott a %1-ba.</translation>
</message>
</context>
<context>
<name>LockWidget</name>
<message>
<source>screen lock</source>
- <translation type="unfinished">ver. écran</translation>
+ <translation type="unfinished">Képernyő blokkolása</translation>
</message>
</context>
<context>
<name>LogonGroupEditor</name>
<message>
<source>Logon group editor</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Bejelentkezési csoport szerkesztő</translation>
</message>
<message>
<source>Please add the groups whose members should be allowed to access computers in your iTALC network.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Kérjük a csoportokhoz rendelje hozzá azokat, akiknek engedélyezi az iTALC hálózati a hozzáférést.</translation>
</message>
<message>
<source>All groups</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Minden csoport</translation>
</message>
<message>
<source>...</source>
- <translation type="unfinished"></translation>
+ <translation>...</translation>
</message>
<message>
<source>Groups with iTALC privileges</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Csoportok iTALC jogosultságokkal</translation>
</message>
</context>
<context>
<name>MainToolBar</name>
<message>
<source>Actions</source>
- <translation type="unfinished">Actions</translation>
+ <translation type="unfinished">Műveletek</translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<source>General</source>
- <translation type="unfinished">Général</translation>
+ <translation type="unfinished">Általános</translation>
</message>
<message>
<source>Quit</source>
- <translation type="unfinished">Quitter</translation>
+ <translation type="unfinished">Kilépés</translation>
</message>
<message>
<source>iTALC Management Console</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">iTALC Kezelő Konzol</translation>
</message>
<message>
<source>iTALC Server</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">iTALC-Szerver</translation>
</message>
<message>
<source>Paths</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Útvonalak</translation>
</message>
<message>
<source>Authentication</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hitelesítés</translation>
</message>
<message>
<source>iTALC Service</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">iTALC-Szolgáltatás</translation>
</message>
<message>
<source>Hide tray icon</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>Tálca icon elrejtése</translatorcomment>
+ <translation type="unfinished">Icon elrejtése a tálcáról</translation>
</message>
<message>
<source>Autostart</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Automatikus indítása</translation>
</message>
<message>
<source>Additional arguments</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">További paraméterek</translation>
</message>
<message>
<source>Start service</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Szolgáltatás indítása</translation>
</message>
<message>
<source>Stop service</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Szolgáltatás leállítása</translation>
</message>
<message>
<source>State:</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Státusz:</translation>
</message>
<message>
<source>Stopped</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Leállítva</translation>
</message>
<message>
<source>Logging</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Bejelentkezés</translation>
</message>
<message>
<source>Log file directory</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Naplófájlok helye</translation>
</message>
<message>
<source>...</source>
- <translation type="unfinished"></translation>
+ <translation>...</translation>
</message>
<message>
<source>Log level</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Naplózási szint</translation>
</message>
<message>
<source>Nothing</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Semmi</translation>
</message>
<message>
<source>Only critical messages</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Csak a kritikus üzenetek</translation>
</message>
<message>
<source>Errors and critical messages</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hiba és kritikus üzenetek</translation>
</message>
<message>
<source>Warnings and errors</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Figyelmeztető és kritikus üzenetek</translation>
</message>
<message>
<source>Information, warnings and errors</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Tájékoztató, figyelmeztető és hiba üzenetek</translation>
</message>
<message>
<source>Debug messages and everything else</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Az összes hiba üzenet</translation>
</message>
<message>
<source>Limit log file size</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Naplófájl maximális mérete</translation>
</message>
<message>
<source>MB</source>
- <translation type="unfinished"></translation>
+ <translation>MB</translation>
</message>
<message>
<source>Clear all log files</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Naplófájlok ürítése</translation>
</message>
<message>
<source>Desktop capturing</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Az asztal rögzítése</translation>
</message>
<message>
<source>Enable capturing of layered (semi-transparent) windows</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Poll full screen</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>A réteg rögzítésének engedélyezése az ablakban (félig átlátszó)</translatorcomment>
+ <translation type="unfinished">Átfedő ablakok rögzítése (félig átlátszó)</translation>
</message>
<message>
<source>Low accuracy (turbo mode)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Alacsony felbontás (turbó mód)</translation>
</message>
<message>
<source>Demo server</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Bemutató szerver</translation>
</message>
<message>
<source>Network</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hálózat</translation>
</message>
<message>
<source>Core server port</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Elsődleges szerver port</translation>
</message>
<message>
<source>Demo server port</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Bemutató szerver port</translation>
</message>
<message>
<source>Enable firewall exception</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hozzáadás a tűzfal kivételekhez</translation>
</message>
<message>
<source>Configuration files</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Konfigurációs fájlok</translation>
</message>
<message>
<source>Global configuration</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Globális beállítások</translation>
</message>
<message>
<source>Personal configuration</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Személyes beállítások</translation>
</message>
<message>
<source>Data directories</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Mentett képernyőképek könyvtára</translation>
</message>
<message>
<source>Snapshots</source>
- <translation type="unfinished">Captures</translation>
+ <translation type="unfinished">Képernyóképek</translation>
</message>
<message>
<source>Authentication methods</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hitelesítési eljárás</translation>
</message>
<message>
<source>Access key management</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hozzáférési kulcs kezelő</translation>
</message>
<message>
<source>Logon settings</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Bejelentkezési beállítások</translation>
</message>
<message>
<source>&File</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">&Fájl</translation>
</message>
<message>
<source>&Help</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">&Segítség</translation>
</message>
<message>
<source>&Quit</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">&Kilépés</translation>
</message>
<message>
<source>Ctrl+Q</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Ctrl+Q</translation>
</message>
<message>
<source>&Save settings into file</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Beállítások &mentése fájlba</translation>
</message>
<message>
<source>Save settings into file</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Beállítások mentése fájlba</translation>
</message>
<message>
<source>Ctrl+S</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Ctrl+S</translation>
</message>
<message>
<source>L&oad settings from file</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>Beállítások be&töltése fájlból</translatorcomment>
+ <translation type="unfinished">Beállítások be&töltése fájlból</translation>
</message>
<message>
<source>Ctrl+O</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Ctrl+O</translation>
</message>
<message>
<source>About iTALC</source>
- <translation type="unfinished">À propos d'iTALC</translation>
+ <translation type="unfinished">Az iTALC névjegye</translation>
</message>
<message>
<source>About Qt</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Qt-ról</translation>
</message>
<message>
<source>MainWindow</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Főablak</translation>
</message>
<message>
<source>toolBar</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">toolBar</translation>
</message>
<message>
<source>iTALC Management Console %1</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">iTALC Management Konzol %1</translation>
</message>
<message>
<source>Running</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Futtatás</translation>
</message>
<message>
<source>Load settings from file</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Beállítások betöltése fájlból</translation>
</message>
<message>
<source>XML files (*.xml)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">XML-fájlok (*.xml)</translation>
</message>
<message>
<source>Save settings to file</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Beállítások mentése fájlba</translation>
</message>
<message>
<source>Unsaved settings</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Nem mentett beállítások</translation>
</message>
<message>
<source>There are unsaved settings. Quit anyway?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A beállítások még nincsenek mentve. Biztosan kilép?</translation>
</message>
<message>
<source>Configuration not writable</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Nem írhatóak ki a beállítások</translation>
</message>
<message>
<source>The local configuration backend reported that the configuration is not writable! Please run the iTALC Management Console with higher privileges.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A konfigurációs kezelő visszajelzése alapján nem írható a konfiguráció. Kérlek indítsd el adminisztrátorként az iTALC Management Konzolt.</translation>
</message>
<message>
<source>All settings were applied successfully.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Az összes beállítást sikeresen végrehajtottuk.</translation>
</message>
<message>
<source>An error occured while applying settings!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hiba lépett fel a beállítások érvényre juttatása közben!</translation>
</message>
<message>
<source>iTALC</source>
- <translation type="unfinished">iTALC</translation>
+ <translation>iTALC</translation>
</message>
<message>
<source>No write access</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Nincsen írási engedélye</translation>
</message>
<message>
<source>Could not read/write or create directory %1! For running iTALC, make sure you're permitted to create or write this directory.</source>
- <translation type="unfinished">Impossible de lire/écrire dans le répertoire %1, ou de le créer. Assurez-vous que vous avez les permissions nécessaires.</translation>
+ <translation type="unfinished">Nem olvasható/írható vagy hozható létre a %1 könyvtár! Győződjön meg róla, hogy engedélyezett-e az iTALC számára létrehozni vagy írni ebben a könyvtárba.</translation>
</message>
<message>
<source>Classroom</source>
- <translation type="unfinished">Salle</translation>
+ <translation type="unfinished">Osztályterem</translation>
</message>
<message>
<source>Switch classroom</source>
- <translation type="unfinished">Changer de salle
-</translation>
+ <translation type="unfinished">Osztályterem választás</translation>
</message>
<message>
<source>Click this button to open a menu where you can choose the active classroom.</source>
- <translation type="unfinished">Ce bouton ouvre un menu dans lequel vous pouvez choisir la salle active.</translation>
+ <translation type="unfinished">A gombra kattintva kiválasztható, hogy melyik legyen az aktív osztályterem.</translation>
</message>
<message>
<source>Click on this button, to switch between classrooms.</source>
- <translation type="unfinished">Cliquez sur ce bouton pour changer de salle.</translation>
+ <translation type="unfinished">Az osztálytermek között váltáshoz kattintson a gombra.</translation>
</message>
<message>
<source>Overview mode</source>
- <translation type="unfinished">Mode aperçu</translation>
+ <translation type="unfinished">Áttekintési mód</translation>
</message>
<message>
<source>Overview</source>
- <translation type="unfinished">Aperçu</translation>
+ <translation type="unfinished">Áttekintés</translation>
</message>
<message>
<source>This is the default mode in iTALC and allows you to have an overview over all visible computers. Also click on this button for unlocking locked workstations or for leaving demo-mode.</source>
- <translation type="unfinished">C'est le mode par défaut d'iTALC, qui vous fournit un aperçu de tous les ordinateurs visibles. Cliquez sur ce bouton pour déverrouiller les clients verrouillés ou pour quitter le mode démo.</translation>
+ <translatorcomment>Ezzel az alapbeállítással megtekintheti az elérhető gépek listáját az iTALC-ban. A gombra kattintva feloldhatja a munkaállomások blokkolását vagy kiléphet az oktatói bemutató üzemmódból.</translatorcomment>
+ <translation type="unfinished">A menü segítségével megtekintheti az elérhető gépeket. A gombra kattintva feloldhatja a munkaállomások blokkolását vagy kiléphet az oktatói bemutató üzemmódból.</translation>
</message>
<message>
<source>Fullscreen demo</source>
- <translation type="unfinished">Démo plein écran</translation>
+ <translation type="unfinished">Oktatói bemutató a teljes képernyőn</translation>
</message>
<message>
<source>Fullscreen Demo</source>
- <translation type="unfinished">Démo plein écran</translation>
+ <translation type="unfinished">Bemutató</translation>
</message>
<message>
<source>Stop Demo</source>
- <translation type="unfinished">Arrêter la démo</translation>
+ <translation type="unfinished">Bemutató vége</translation>
</message>
<message>
<source>In this mode your screen is being displayed on all shown computers. Furthermore the users aren't able to do something else as all input devices are locked in this mode.</source>
- <translation type="unfinished">Dans ce mode, votre écran est affiché sur tous les ordinateurs visibles. De plus, les périphériques d'entrée des clients sont verrouillés.</translation>
+ <translation type="unfinished">Ebben az üzemmódban az oktató megoszthatja a képernyőjének a tartalmát. A megosztott képernyő teljes méretben fog megjelenni a tanulók számítógépein. A bemutató közben a tanulók nem foglalkozhatnak mással, mert a beviteli eszközök (egér, billentyűzet) blokkolásra kerülnek.</translation>
</message>
<message>
<source>Window demo</source>
- <translation type="unfinished">Démo fenêtre</translation>
+ <translation type="unfinished">Oktatói bemutató ablak méretben</translation>
</message>
<message>
<source>Window Demo</source>
- <translation type="unfinished">Démo fenêtre</translation>
+ <translation type="unfinished">Bemutató ablak</translation>
</message>
<message>
<source>In this mode your screen being displayed in a window on all shown computers. The users are able to switch to other windows and thus can continue to work.</source>
- <translation type="unfinished">Dans ce mode, votre écran est affiché dans une fenêtre sur tous les ordinateurs visibles. Les utilisateurs peuvent changer de fenêtre, et continuer à travailler.</translation>
+ <translation type="unfinished">Ebben az üzemmódban az oktató megoszthatja a képernyőjének a tartalmát. A megosztott képernyő ablak méretben fog megjelenni a tanulók számítógépein.
+A bemutató közben a felhasználók mással is foglalkozhatnak.</translation>
</message>
<message>
<source>Lock/unlock desktops</source>
- <translation type="unfinished">(Dé-)verrouiller les bureaux</translation>
+ <translation type="unfinished">Képernyő Blokkolása/feloldása</translation>
</message>
<message>
<source>Lock all</source>
- <translation type="unfinished">Tout verrouiller</translation>
+ <translation type="unfinished">Blokkolás</translation>
</message>
<message>
<source>Unlock all</source>
- <translation type="unfinished">Tout déverrouiller</translation>
+ <translation type="unfinished">Feloldás</translation>
</message>
<message>
<source>To have all user's full attention you can lock their desktops using this button. In this mode all input devices are locked and the screen is black.</source>
- <translation type="unfinished">Pour retenir l'attention de tous les utilisateurs, vous pouvez verrouiller leurs bureaux avec ce bouton.
-Dans ce mode, l'écran est noir et les périphériques d'entrée sont verrouillés.</translation>
+ <translation type="unfinished">Ezzel a gombbal az összes diák gépét blokkolhatja. Ebben az üzemmóddal az összes bemeneti eszközt blokkolja és a képernyők elsötétülnek.</translation>
</message>
<message>
<source>Send text message</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Üzenet küldése</translation>
</message>
<message>
<source>Text message</source>
- <translation type="unfinished">Message texte</translation>
+ <translation type="unfinished">Szöveges üzenet</translation>
</message>
<message>
<source>Use this button to send a text message to all users e.g. to tell them new tasks etc.</source>
- <translation type="unfinished">Utilisez ce bouton pour envoyer un message à tous les utilisateurs, p. ex. pour leur donner une nouvelle tâche.</translation>
+ <translation type="unfinished">A gomb segítségével üzenet küldhet minden felhasználónak. (például: "Kezdhetitek az új feladatot megoldani", stb..).</translation>
</message>
<message>
<source>Power on computers</source>
- <translation type="unfinished">Démarrer les ordinateurs</translation>
+ <translation type="unfinished">Számítógépek bekapcsolása</translation>
</message>
<message>
<source>Power on</source>
- <translation type="unfinished">Allumer</translation>
+ <translation type="unfinished">Bekapcsolás</translation>
</message>
<message>
<source>Click this button to power on all visible computers. This way you do not have to turn on each computer by hand.</source>
- <translation type="unfinished">Cliquez sur ce bouton pour démarrer tous les ordinateurs visibles. Ainsi, vous n'avez pas à le faire à la main pour chacun.</translation>
+ <translation type="unfinished">A számítógépek bekapcsolásához kattintsunk a gombra. Így nem kell minden gépet egyesével bekapcsolnunk. (A hardvernek is támogatnia kell a "Wake-on-Lan funkciót")</translation>
</message>
<message>
<source>Power down computers</source>
- <translation type="unfinished">Éteindre les ordinateurs</translation>
+ <translation type="unfinished">Számítógépek kikapcsolása</translation>
</message>
<message>
<source>Power down</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Kikapcsolás</translation>
</message>
<message>
<source>To power down all shown computers (e.g. after the lesson has finished) you can click this button.</source>
- <translation type="unfinished">Pour éteindre tous les ordinateurs allumés (p. ex. à la fin du cours) vous pouvez utiliser ce bouton.</translation>
+ <translation type="unfinished">Az összes elérhető számítógép kikapcsolásához kattintson a gombra. (az óra végeztével kikapcsolhatja az összes számítógépet).</translation>
</message>
<message>
<source>Support</source>
- <translation type="unfinished">Assistance</translation>
+ <translation type="unfinished">Támogatás</translation>
</message>
<message>
<source>Direct support</source>
- <translation type="unfinished">Assistance directe</translation>
+ <translation type="unfinished">Közvetlen támogatás</translation>
</message>
<message>
<source>If you need to support someone at a certain computer you can click this button and enter the according hostname or IP afterwards.</source>
- <translation type="unfinished">Si vous voulez assister quelqu'un sur un ordinateur, cliquez sur ce bouton puis entrez le nom d'hôte ou son adresse IP.</translation>
+ <translation type="unfinished">Ha egy diáknak szüksége van támogatásra, a gombra kattintva a gép nevét vagy az IP címét beírva csatlakozhat és segítséget nyújthat.</translation>
</message>
<message>
<source>Adjust/align</source>
- <translation type="unfinished">Ajuster/aligner</translation>
+ <translation type="unfinished">Elrendezés</translation>
</message>
<message>
<source>Adjust windows and their size</source>
- <translation type="unfinished">Ajuster les fenêtres et leurs tailles</translation>
+ <translation type="unfinished">Ablak méretének beállítása</translation>
</message>
<message>
<source>When clicking this button the biggest possible size for the client-windows is adjusted. Furthermore all windows are aligned.</source>
- <translation type="unfinished">Les fenêtres clientes sont ajustées pour utiliser la place maximale, et sont alignées.</translation>
+ <translation type="unfinished">A gombra kattintva a lehető legnagyobb méretben tekinthetjük meg a felhasználók asztalát. Továbbá az összes ablakot ehhez igazíthatjuk.</translation>
</message>
<message>
<source>Auto view</source>
- <translation type="unfinished">Auto-vue</translation>
+ <translation type="unfinished">Automatikus nézet</translation>
</message>
<message>
<source>Auto re-arrange windows and their size</source>
- <translation type="unfinished">Réordonne automatiquement les fenêtres</translation>
+ <translation type="unfinished">Az ablakok automatikus újrarendezése és átméretezése</translation>
</message>
<message>
<source>When clicking this button all visible windows are re-arranged and adjusted.</source>
- <translation type="unfinished">Toutes les fenêtres visibles sont ré-ordonnées et leurs tailles sont ajustées.</translation>
+ <translation type="unfinished">Ide kattintva az elérhető ablakok sorrendét módosíthatjuk vagy rendezhetjük át.</translation>
</message>
<message>
<source>iTALC Master Control</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">iTALC Tanár kontroll</translation>
</message>
<message>
<source>Remote control</source>
- <translation type="unfinished">Contrôle à distance</translation>
+ <translation type="unfinished">Távoligép kezelés</translation>
</message>
<message>
<source>Could not modify the autostart property for the iTALC Service.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Az iTALC nem tudta modosítani a Windows "autostart" beállításait.</translation>
</message>
<message>
<source>Could not modify the service arguments for the iTALC Service.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Az iTALC nem tudta modosítani a Windows szolgáltatás argumentumait.</translation>
</message>
<message>
<source>Could not change the firewall configuration for the iTALC Service.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Az iTALC nem tudta megváltoztatni a Windows tűzfal konfigurációját.</translation>
</message>
<message>
<source>Debugging</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hibakeresés</translation>
</message>
<message>
<source>Enable desktop switching for screen lock (experimental)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Képernyő blokkolása asztalváltáskor (kísérleti)</translation>
</message>
<message>
<source>Log to standard error output</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>Hibanaplózás az elsődleges kimenetre /Standard error output-ra történő naplózás</translatorcomment>
+ <translation type="unfinished">Naplózás az elsődleges hiba kimenetre</translation>
</message>
<message>
<source>Log to Windows event log</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>Naplózás a rendszer esemény naplójába / A (Windows )rendszer eseménynapló használata</translatorcomment>
+ <translation type="unfinished">Naplózás a Windows eseménynaplóba</translation>
</message>
<message>
<source>Backend</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Backend</translation>
</message>
<message>
<source>VNC reflector</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">VNC reflektor</translation>
</message>
<message>
<source>iTALC 1 demo server</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">iTALC 1 Bemutató szerver</translation>
</message>
<message>
<source>Multithreading (can be enabled when using the VNC reflector backend)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Többszálú futtatás (ajánlott a VNC reflektor használatánál)</translation>
</message>
<message>
<source>Enable HTTP server which provides a JavaViewer applet</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A HTTP szerver futásának engedélyezése a JavaViewer alkalmazáshoz</translation>
</message>
<message>
<source>HTTP server port</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">HTTP-Szerver port</translation>
</message>
<message>
<source>Allow connections from localhost only</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Kapcsolatok engedélyezése kizárólag a helyi gépről</translation>
</message>
<message>
<source>Key file authentication</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Kulcsos azonosítás</translation>
</message>
<message>
<source>ACL-based logon authentication</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">ACL-alapú bejelentkezés</translation>
</message>
<message>
<source>Public key file base directory</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Publikus kulcs könyvtára</translation>
</message>
<message>
<source>Private key file base directory</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Privát kulcs könyvtára</translation>
</message>
<message>
<source>Launch key file assistant</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hozzáférési kulcs Varázsló</translation>
</message>
<message>
<source>Manage permissions</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Engedélyek kezelése</translation>
</message>
<message>
<source>Test</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Teszt</translation>
</message>
<message>
<source>Access confirmation</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hozzáférés megerősítése</translation>
</message>
<message>
<source>You can configure iTALC to ask the user for permission to access the desktop when using certain authentication methods.</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>Beállíthatja az iTalcot, hogy felhasználói engedélyt kérjen a számítógéphez való hozzáféréshez, amikor bizonyos hitelesítési módszereket alkalmaz.</translatorcomment>
+ <translation type="unfinished">A számítógépek hozzáférésének hitelesítés-módszereinek beállításai.</translation>
</message>
<message>
<source>Logon authentication</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Bejelentkezés hitelesítéssel</translation>
</message>
<message>
<source>Allow same user to access desktop without confirmation</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Megerősítés nélkül engedélyezzük a hozzáférést ugyan annak a felhasználónak</translation>
</message>
<message>
<source>Debugging iTALC</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hibakeresés az iTALC-ban</translation>
</message>
<message>
<source>When encountering bugs or other misbehaviour in iTALC it is important to inform the developers about them, so that the bugs can be fixed in future releases. This page allows you to submit a helpful bug report easily.
If the bug is not reproducible, skip step 1) - 3).</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Amennyiben rendellenes működést tapasztal az iTALC használata közben, kérem hogy mielőbb tájékoztassa a fejlesztőket a problémáról. Az útmutató segítségével könnyedén elkészítheti a hibajelentést. A visszajelzések segítségével elkerülhetőek lesznek a működésebeli problémák, és hozzájárulhat a program tökéletesítéséhez is.
+
+Ha a hiba nem reprodukálható, akkor hagyja ki a 1) -3) lépéseket.</translation>
</message>
<message>
<source>1)</source>
- <translation type="unfinished"></translation>
+ <translation>1)</translation>
</message>
<message>
<source>Clear the logfiles in the "General" section.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Törölje a naplófájlokat. Az "Általános" menüpont alatt találja a "Naplófájlok ürítése" gombot.</translation>
</message>
<message>
<source>2)</source>
- <translation type="unfinished"></translation>
+ <translation>2)</translation>
</message>
<message>
<source>In the "General" section set the log level to "Debug messages and everything else".</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Az "Általános" menüpontban válassza ki a naplózási szintnek: "Az összes hiba üzenet".</translation>
</message>
<message>
<source>3)</source>
- <translation type="unfinished"></translation>
+ <translation>3)</translation>
</message>
<message>
<source>Repeat the actions leading to the bug or misbehaviour.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Ismételje meg azokat a lépéseket, amik a hibához vagy a rendellenes működéshez vezettek.</translation>
</message>
<message>
<source>4)</source>
- <translation type="unfinished"></translation>
+ <translation>4)</translation>
</message>
<message>
<source>Click the following button and save the file to a known location.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A gombra kattintva készíthet-, és mentheti el a hibajelentést.</translation>
</message>
<message>
<source>Generate bug report archive</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hibajelentés készítése</translation>
</message>
<message>
<source>5)</source>
- <translation type="unfinished"></translation>
+ <translation>5)</translation>
</message>
<message>
<source>Go to the <a href="http://sourceforge.net/tracker/?group_id=132465&atid=724375">iTALC bug tracker</a>, open a new bug, describe what you did in step 3) and attach the file you saved in step 4).</p>
<br/>
<br/>
Note: if the bug involves both a master and client computer, attach bug report archives for both computers.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Kérem látogasson el <a href="http://sourceforge.net/tracker/?group_id=132465&atid=724375">az iTALC hibajelentő weboldalára</a>, majd nyisson egy hibajegyet. A 3) lépésben leírtakat hajtsa végre, és a 4) lépésnek megfelelően mentse el az elkészült hibajelentést.</p>
+<br/>
+<br/>
+Megjegyzés: amennyiben a hiba mind a master (tanári) és a kliens (diák) számítógépeken is előfordult, akkor csatolja mind a két számítógéphez tartoró hibajelentését.</translation>
</message>
<message>
<source>Restart iTALC Service</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">iTALC szolgáltatás újraindítása</translation>
</message>
<message>
<source>All settings were saved successfully. In order to take effect the iTALC service needs to be restarted. Restart it now?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Az összes beállítást sikeren elmentettük. Annak érdekében, hogy a beállítások érvényre jussanak, újra kell indítani az iTALC szolgáltatást. Újraindítja ?</translation>
</message>
<message>
<source>Starting iTALC service</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">iTALC szolgáltatás indítása</translation>
</message>
<message>
<source>Stopping iTALC service</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">iTALC szolgáltatás leállítása</translation>
</message>
<message>
<source>The iTALC service needs to be stopped temporarily in order to remove the log files. Continue?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Az iTALC szolgáltatást arra az átmeneti időre le kell állítani, amíg a naplófájlt eltávolítjuk. Folytassuk?</translation>
</message>
<message>
<source>Log files cleared</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A naplófájl törölve</translation>
</message>
<message>
<source>All log files were cleared successfully.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Az naplófájlok ürítése sikeresen megtörtént.</translation>
</message>
<message>
<source>Error</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Hiba</translation>
</message>
<message>
<source>Could not remove all log files.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Nem törölhető az összes naplófájl.</translation>
</message>
<message>
<source>Logon authentication test</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Bejelentkezési hitelesítés vizsgálata</translation>
</message>
<message>
<source>Authentication with provided credentials was successful.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A hozzáférési hitelesítés sikeresen megtörtént.</translation>
</message>
<message>
<source>Authentication with provided credentials failed!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">A hozzáférési hitelesítés sikertelenül fejeződött be!</translation>
</message>
<message>
<source>Save bug report archive</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Bug jelentés elmentése</translation>
</message>
<message>
<source>iTALC bug report archive (*.ibra.xml)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">iTALC bug report archiválás (*.ibra.xml)</translation>
</message>
<message>
<source>iTALC bug report archive saved</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Az iTALC "bug" hibajelentések mentése megtörtént</translation>
</message>
<message>
<source>An iTALC bug report archive has been saved to %1. It includes iTALC log files and information about your operating system. You can attach it to a bug report.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Az iTALC hiba jelentése mentésre került a %1 -ba. A jelentés tartalmazza az iTALC naplófájlt és egyéb információkat az operációs rendszerről. Ezt csatolhatja a hibajelentéshez.</translation>
</message>
<message>
<source>Could not contact iTALC service</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Az iTALC szolgáltatás kapcsolata megszakadt</translation>
</message>
<message>
<source>Could not contact the local iTALC service. It is likely that you entered wrong credentials or key files are not set up properly. Try again or contact your administrator for solving this problem using the iTALC Management Console.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Nem létesíthető kapcsolat a helyi iTALC szolgáltatással. Feltehetően rossz hitelesítési adatokkal vagy kulcs azonosítással próbálkozik. Próbálja meg ismét vagy lépjen kapcsolatba a rendszer adminisztrátorral a probléma megoldása érdekében, ehhez használja az iTALC Management Konzolt.</translation>
</message>
<message>
<source>Authentication impossible</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Lehetetlen a hitelesítés</translation>
</message>
<message>
<source>No authentication key files were found or your current ones are outdated. Please create new key files using the iTALC Management Console. Alternatively set up logon authentication using the iTALC Management Console. Otherwise you won't be able to access computers using iTALC.</source>
+ <translation type="unfinished">Nem találhatóak vagy már lejártak a hitelességet érvényesítő kulcsok. Kérem hozzon létre új hitelesítő kulcsokat az iTALC Management Konzol segítségével. Az iTALC Management Konzol segítségével választhat más azonosítási eljárások közül. Nem megfelelő azonosítási eljárási esetében az iTALC nem fog megfelelően működni.</translation>
+ </message>
+ <message>
+ <source>Poll full screen (leave this enabled per default)</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1405,7 +1421,7 @@ Note: if the bug involves both a master and client computer, attach bug report a
<name>MessageBoxSlave</name>
<message>
<source>Message from teacher</source>
- <translation type="unfinished">Message du professeur</translation>
+ <translation type="unfinished">Üzenet a tanártól</translation>
</message>
</context>
<context>
@@ -1418,56 +1434,64 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"><html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600; font-style:italic;">Bienvenue dans iTALC !</span></p></body></html></translation>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:12pt; font-weight:600; font-style:italic;">Üdvözlöm az iTALC-ban!</span></p></body></html></translation>
</message>
<message>
<source>Here you see the working-bar which contains several buttons. Each button is connected to a workspace. Just take a look at the available workspaces by clicking on the corresponding button.</source>
- <translation type="unfinished">Voici la barre de travail qui contient plusieurs boutons. Chaque bouton ouvre un espace de travail. Parcourez tous les espaces disponibles en cliquant sur les boutons successifs.</translation>
+ <translatorcomment>Ezen a munkaterületen található vezérlő gombok segítségével végezhetjük el az alapvető adminisztrációs műveleteket. Segítségével tudunk csatlakozni különböző munkaasztalokhoz. Az elérhető munkaterület(ek) megjelölése a megfelelő gombra kattintva választható ki.
+vagy Az elérhető munkaterület(ek) / munkaasztal(ok) kiválasztásához kattintson a megfelelő gombra.</translatorcomment>
+ <translation type="unfinished">A munkafelületen található vezérlő gombok segítségével végezhetjük el az alapvető adminisztrációs műveleteket. Ennek segítségével tudunk csatlakozni más munkaállomásokhoz. Az elérhető munkaterület(ek)et / munkaasztalok(at) a megfelelő gombra kattintva választhatjuk ki.</translation>
</message>
<message>
<source>Using the classroom-manager you can manage your classrooms and computers. You can also see which users are logged in.</source>
- <translation type="unfinished">Avec le gestionnaire de salle, vous pouvez gérer les salles et les ordinateurs, et également voir qui est connecté.</translation>
+ <translation type="unfinished">Csak a felügyelő személy kezelheti az osztálytermeket és a számítógépeket. Ezenkívül a bejelentkezett felhasználókat tudja megtekinteni.</translation>
</message>
<message>
<source>The snapshot-workspace is a very useful tool. It let's you manage the snapshots you made.</source>
- <translation type="unfinished">L'espace Capture vous permet de gérer toutes les captures d'écran que vous avez effectuées.</translation>
+ <translatorcomment>Nagyon hasznos a képernyőkép készítő eszköz. /A képernyőkép készítő eszköz nagyon hasznos</translatorcomment>
+ <translation type="unfinished">Nagyon hasznos a képernyőkép készítő eszköz. Segítségével könnyedén kezelhetjük a különböző munkaasztalokról elkészült képeket.</translation>
</message>
<message>
<source>Of course you can configure iTALC. This is usually done using the configuration-workspace.</source>
- <translation type="unfinished">Vous pouvez bien sûr configurer iTALC. Cela se fait généralement dans l'espace Configuration.</translation>
+ <translatorcomment>A testreszabáshoz a konfigurációs használjuk.</translatorcomment>
+ <translation type="unfinished">Természetesen az iTALC is testreszabható. A munkaasztalok beállítását a konfigurációs menüből érhetjük el.</translation>
</message>
<message>
<source>About iTALC</source>
- <translation type="unfinished">À propos d'iTALC</translation>
+ <translation type="unfinished">Az iTALC névjegye</translation>
</message>
</context>
<context>
<name>OverviewWidget</name>
<message>
<source>Overview</source>
- <translation type="unfinished">Aperçu</translation>
+ <translation type="unfinished">Áttekintés</translation>
</message>
<message>
<source>Some basic information on iTALC and how to use it.</source>
- <translation type="unfinished">Quelques informations de base sur iTALC et la manière de l'utiliser.</translation>
+ <translation type="unfinished">Néhány alapvető információt megtalál az iTALC-ról és arról, hogy, hogyan használjuk.</translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
<message>
<source>Please enter your username and password in order to access iTALC clients.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Kérem írja be a felhasználó nevét és a jelszavát a iTALC kliens indításához.</translation>
</message>
<message>
<source>Username</source>
- <translation type="unfinished">Nom d'utilisateur</translation>
+ <translation type="unfinished">Felhasználó</translation>
</message>
<message>
<source>Password</source>
- <translation type="unfinished">Mot de passe</translation>
+ <translation type="unfinished">Jelszó</translation>
</message>
<message>
<source>iTALC Logon</source>
+ <translation type="unfinished">iTALC bejelentkezés</translation>
+ </message>
+ <message>
+ <source>Manage</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1475,173 +1499,173 @@ p, li { white-space: pre-wrap; }
<name>QApplication</name>
<message>
<source>Unable to register service '%1'.</source>
- <translation>Impossible d'enregistrer le service '%1'.</translation>
+ <translation type="unfinished">Nem sikerült regisztrálni a %1 szolgáltatást.</translation>
</message>
<message>
<source>The Service Control Manager could not be contacted (do you have the neccessary rights?!) - the service '%1' was not registered.</source>
- <translation>Le contrôleur de services (SCM) ne répond pas (avez-vous les permissions nécessaires ?) - le service '%1' n'a pas été enregistré.</translation>
+ <translation type="unfinished">A Service Control Manager nem tudott kapcsolódni (rendelkezik Ön a megfelelő jogosultságokkal?!) - a '%1' szolgáltatás nem volt regisztrálva.</translation>
</message>
<message>
<source>The service '%1' is already registered.</source>
- <translation>Le service '%1' est déjà enregistré.</translation>
+ <translation type="unfinished">A %1 szolgáltatás már regisztrálva van.</translation>
</message>
<message>
<source>The service '%1' could not be registered.</source>
- <translation>Le service '%1' n'a pas pu être enregistré.</translation>
+ <translation type="unfinished">Nem regisztrálódott a %1 szolgáltatás.</translation>
</message>
<message>
<source>The service '%1' was successfully registered.</source>
- <translation>Le service '%1' a bien été enregistré.</translation>
+ <translation type="unfinished">A %1 szolgáltatás sikeresen regisztrálódott.</translation>
</message>
<message>
<source>The service '%1' could not be stopped.</source>
- <translation>Le service '%1' ne peut pas être arrêté.</translation>
+ <translation type="unfinished">Nem sikerült leállítani a %1 szolgáltatást.</translation>
</message>
<message>
<source>The service '%1' has been unregistered.</source>
- <translation>Le service '%1' a été désenregistré.</translation>
+ <translation type="unfinished">A %1 szolgáltatás már nincsen regisztrálva.</translation>
</message>
<message>
<source>The service '%1' isn't registered and therefore can't be unregistered.</source>
- <translation>Le service '%1' n'est pas enregistré et ne peut donc pas être désenregistré.</translation>
+ <translation type="unfinished">Ez a %1 szolgáltatás nem regisztrált ezért nem lehet törölni.</translation>
</message>
<message>
<source>The service '%1' could not be unregistered.</source>
- <translation>Le service '%1' ne peut pas être désenregistré.</translation>
+ <translation type="unfinished">A %1 szolgáltatást nem lehetett regisztrálni.</translation>
</message>
<message>
<source>The service '%1' could not be found.</source>
- <translation>Le service '%1' est introuvable.</translation>
+ <translation type="unfinished">Nem található a '%1' szolgáltatás.</translation>
</message>
<message>
<source>The Service Control Manager could not be contacted (do you have the neccessary rights?!) - the service '%1' was not unregistered.</source>
- <translation>Le contrôleur de service (SCM) ne répond pas (avez-vous les permissions nécessaires ?) - le service '%1' n'a pas été désenregistré.</translation>
+ <translation type="unfinished">A Service Control Manager nem tudott kapcsolódni (rendelkezik Ön a megfelelő jogosultságokkal?!) - a '%1' szolgáltatás még nem volt regisztrálva.</translation>
</message>
<message>
<source>The Service Control Manager could not be contacted (do you have the neccessary rights?!) - the service '%1' was not stopped.</source>
- <translation>Le contrôleur de services (SCM) ne répond pas (avez-vous les permissions nécessaires ?) - le service '%1' n'a pas été arrêté.</translation>
+ <translation type="unfinished">A Service Control Manager nem tudott kapcsolódni (rendelkezik Ön a megfelelő jogosultságokkal?!) - a '%1' szolgáltatás nem állt meg.</translation>
</message>
<message>
<source>iTALC Client %1 on %2:%3</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Az iTALC kliens %1 elérhető %2:%3</translation>
</message>
</context>
<context>
<name>RemoteControlWidget</name>
<message>
<source>View live (%1 @ %2)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Elöl nézet (%1 @ %2)</translation>
</message>
<message>
<source>Remote control (%1 @ %2)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Távoli hozzáférés (%1 @ %2)</translation>
</message>
<message>
<source>unknown user</source>
- <translation type="unfinished">utilisateur inconnu</translation>
+ <translation type="unfinished">ismeretlen felhasználó</translation>
</message>
</context>
<context>
<name>RemoteControlWidgetToolBar</name>
<message>
<source>View only</source>
- <translation type="unfinished">Voir seulement</translation>
+ <translation type="unfinished">Csak nézet</translation>
</message>
<message>
<source>Remote control</source>
- <translation type="unfinished">Contrôle à distance</translation>
+ <translation type="unfinished">Távoli hozzáférés</translation>
</message>
<message>
<source>Lock student</source>
- <translation type="unfinished">Verrouiller l'étudiant</translation>
+ <translation type="unfinished">Diák gép blokkolása</translation>
</message>
<message>
<source>Unlock student</source>
- <translation type="unfinished">Déverrouiller l'étudiant</translation>
+ <translation type="unfinished">Diák gép feloldása</translation>
</message>
<message>
<source>Snapshot</source>
- <translation type="unfinished">Capture</translation>
+ <translation type="unfinished">Képernyőképek</translation>
</message>
<message>
<source>Fullscreen</source>
- <translation type="unfinished">Plein écran</translation>
+ <translation type="unfinished">Teljes képernyő</translation>
</message>
<message>
<source>Window</source>
- <translation type="unfinished">Fenêtre</translation>
+ <translation type="unfinished">Ablak</translation>
</message>
<message>
<source>Quit</source>
- <translation type="unfinished">Quitter</translation>
+ <translation type="unfinished">Kilépés</translation>
</message>
<message>
<source>Connecting %1</source>
- <translation type="unfinished">Connexion à %1...</translation>
+ <translation type="unfinished">A kapcsolódás folyamatban %1</translation>
</message>
<message>
<source>Connected.</source>
- <translation type="unfinished">Connecté.</translation>
+ <translation type="unfinished">Kapcsolódva.</translation>
</message>
</context>
<context>
<name>RemoteLogonDialog</name>
<message>
<source>Remote logon</source>
- <translation type="unfinished">Connexion distante</translation>
+ <translation type="unfinished">Távoli bejelentkezés</translation>
</message>
<message>
<source>Use the fields below to enter the username, password and optional the domain name. These information will be used to logon the computer(s).</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Töltse ki az alábbi mezőket, adja meg a felhasználói nevét, jelszavát vagy domain név alapú azonosítást is használhatja. Ezeket az információkat fogják használni a számítógép bejelentkezéséhez.</translation>
</message>
<message>
<source>Username</source>
- <translation type="unfinished">Nom d'utilisateur</translation>
+ <translation type="unfinished">Felhasználó</translation>
</message>
<message>
<source>Password</source>
- <translation type="unfinished">Mot de passe</translation>
+ <translation type="unfinished">Jelszó</translation>
</message>
<message>
<source>Domain</source>
- <translation type="unfinished">Domaine</translation>
+ <translation type="unfinished">Domain</translation>
</message>
</context>
<context>
<name>RunCommandsDialog</name>
<message>
<source>Run commands</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Parancs futtatása</translation>
</message>
<message>
<source>Please enter the commands to run on the selected client(s). You can separate multiple commands by line.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Kérem adja meg a parancsokat amiket futtatni szeretne a kijelölt kliens gépeken. Több parancs futtatásához használjon új sorokat.</translation>
</message>
</context>
<context>
<name>Snapshot</name>
<message>
<source>unknown</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">ismeretlen</translation>
</message>
<message>
<source>Could not take a snapshot as directory %1 doesn't exist and couldn't be created.</source>
- <translation type="unfinished">Impossible de prendre une capture : le répertoire %1 n'existe pas et ne peut être créé.</translation>
+ <translation type="unfinished">Nem lehet képernyőképeket készíteni, ,mert a %1 könyvtár még nem létezik, és nem is hozható létre.</translation>
</message>
<message>
<source>Snapshot</source>
- <translation type="unfinished">Capture</translation>
+ <translation type="unfinished">Képernyőkép</translation>
</message>
</context>
<context>
<name>SnapshotList</name>
<message>
<source>Snapshots</source>
- <translation type="unfinished">Captures</translation>
+ <translation type="unfinished">Képernyőképek</translation>
</message>
<message>
<source>Simply manage the snapshots you made using this workspace.</source>
- <translation type="unfinished">Cet espace vous permet de gérer les captures que vous avez faites.</translation>
+ <translation type="unfinished">A munkaterület segítségével egyszerűen kezelheti a képernyőképeket.</translation>
</message>
</context>
<context>
@@ -1651,119 +1675,120 @@ p, li { white-space: pre-wrap; }
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">All snapshots you made are listed here. You can make snapshots by selecting the according entry in the context-menu of a client-window. These snapshosts can be managed using the buttons below.</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Toutes les captures que vous avez faites sont listées ci-dessous. Vous pouvez lancer une capture en sélectionnant l'entrée dans le menu contextuel d'une fenêtre cliente. Ces captures peuvent être gérées grâce aux boutons ci-dessous.</p></body></html></translation>
+ <translatorcomment>You can make snapshots by selecting the according entry in the context-menu of a client-window. =? Csinálhat pillanatképet a felhasználói felület (képernyő) megfelelő szövegének a kiválasztásával.</translatorcomment>
+ <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Kilistázhatja az elkészült képernyőképeket. You can make snapshots by selecting the according entry in the context-menu of a client-window. Az alábbi gomb megnyomásával kezelheti az elkészült képernyőképeket.</p></body></html></translation>
</message>
<message>
<source>User:</source>
- <translation type="unfinished">Utilisateur :</translation>
+ <translation type="unfinished">Felhasználó:</translation>
</message>
<message>
<source>Host:</source>
- <translation type="unfinished">Hôte :</translation>
+ <translation type="unfinished">Gépnév:</translation>
</message>
<message>
<source>Date:</source>
- <translation type="unfinished">Date :</translation>
+ <translation type="unfinished">Dátum:</translation>
</message>
<message>
<source>Time:</source>
- <translation type="unfinished">Heure :</translation>
+ <translation type="unfinished">Idő:</translation>
</message>
<message>
<source>Show</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Nézet</translation>
</message>
<message>
<source>Delete</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Törlés</translation>
</message>
</context>
<context>
<name>SupportDialog</name>
<message>
<source>Support</source>
- <translation type="unfinished">Assistance</translation>
+ <translation type="unfinished">Támogatás</translation>
</message>
<message>
<source>Please enter the IP address or the name of the host to which you want to connect.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Kérem írja be annak a gépnek az IP címét vagy a nevét amihez csatlakozni szeretne.</translation>
</message>
</context>
<context>
<name>TextMessageDialog</name>
<message>
<source>Send text message</source>
- <translation type="unfinished"></translation>
+ <translation>Szöveges üzenet küldése</translation>
</message>
<message>
<source>Use the field below to type your message which will be sent to all selected users.</source>
- <translation type="unfinished">Tapez votre message dans le champ ci-dessous. Il sera envoyé à tous les utilisateurs sélectionnés.</translation>
+ <translation type="unfinished">Ide írhatja be azt az üzenetet, amit elszeretne küldeni a kijelölt tanulóknak.</translation>
</message>
</context>
<context>
<name>VncView</name>
<message>
<source>Establishing connection to %1 ...</source>
- <translation type="unfinished">Établissement de la connexion à %1 ...</translation>
+ <translation>Kapcsolat létrehozása a %1 ...</translation>
</message>
</context>
<context>
<name>clientMenu</name>
<message>
<source>Overview</source>
- <translation type="unfinished">Aperçu</translation>
+ <translation type="unfinished">Áttekintés</translation>
</message>
<message>
<source>Fullscreen demo</source>
- <translation type="unfinished">Démo plein écran</translation>
+ <translation type="unfinished">Bemutató a teljes képernyőn</translation>
</message>
<message>
<source>Window demo</source>
- <translation type="unfinished">Démo fenêtre</translation>
+ <translation type="unfinished">Bemutató ablakban</translation>
</message>
<message>
<source>Locked display</source>
- <translation type="unfinished">Affichage verrouillé</translation>
+ <translation>Képernyő blokkolása</translation>
</message>
<message>
<source>View live</source>
- <translation type="unfinished">Voir en direct</translation>
+ <translation type="unfinished">Távoli gép követése (teljes képernyőn)</translation>
</message>
<message>
<source>Remote control</source>
- <translation type="unfinished">Contrôle à distance</translation>
+ <translation type="unfinished">Távoli számítógép átvétele</translation>
</message>
<message>
<source>Let student show demo</source>
- <translation type="unfinished">Laisser l'étudiant faire une démo</translation>
+ <translation type="unfinished">Oktatói bemutató indítása a tanulói gépen</translation>
</message>
<message>
<source>Send text message</source>
- <translation type="unfinished"></translation>
+ <translation>Szöveges üzenet küldése</translation>
</message>
<message>
<source>Logout user</source>
- <translation type="unfinished">Déconnecter l'utilisateur</translation>
+ <translation>Kijelentkezés</translation>
</message>
<message>
<source>Take a snapshot</source>
- <translation type="unfinished">Prendre une capture</translation>
+ <translation type="unfinished">Képernyőkép készítése</translation>
</message>
<message>
<source>Power on</source>
- <translation type="unfinished">Allumer</translation>
+ <translation>Bekapcsolás</translation>
</message>
<message>
<source>Reboot</source>
- <translation type="unfinished">Redémarrer</translation>
+ <translation>Újraindítás</translation>
</message>
<message>
<source>Power down</source>
- <translation type="unfinished"></translation>
+ <translation>Kikapcsolás</translation>
</message>
<message>
<source>Execute commands</source>
- <translation type="unfinished">Exécuter des commandes</translation>
+ <translation type="unfinished">Parancs futtatása</translation>
</message>
</context>
</TS>
diff --git a/lib/resources/manage-with-imc.png b/lib/resources/manage-with-imc.png
new file mode 100644
index 0000000..dd51949
Binary files /dev/null and b/lib/resources/manage-with-imc.png differ
diff --git a/lib/resources/pt_br.qm b/lib/resources/pt_br.qm
index 75cf7ec..f43a0ae 100644
Binary files a/lib/resources/pt_br.qm and b/lib/resources/pt_br.qm differ
diff --git a/lib/resources/pt_br.ts b/lib/resources/pt_br.ts
index 296193a..96465e7 100644
--- a/lib/resources/pt_br.ts
+++ b/lib/resources/pt_br.ts
@@ -5,45 +5,43 @@
<name>AboutDialog</name>
<message>
<source>About iTALC</source>
- <translation type="unfinished">Sobre iTALC</translation>
+ <translation>Sobre iTALC</translation>
</message>
<message>
<source>About</source>
- <translation type="unfinished">Sobre</translation>
+ <translation>Sobre</translation>
</message>
<message utf8="true">
<source>iTALC - Intelligent Teaching And Learning with Computers
Copyright © 2004-2011 Tobias Doerffel / iTALC Solutions</source>
- <translation type="unfinished"></translation>
+ <translation>iTALC -Ensino e Aprendizagem Inteligente com Computadores
+
+Copyright © 2004-2011 Tobias Doerffel / iTALC Solutions</translation>
</message>
<message>
<source><a href="http://italc.sourceforge.net">http://italc.sourceforge.net</a></source>
- <translation type="unfinished"></translation>
+ <translation><a href="http://italc.sourceforge.net">http://italc.sourceforge.net</a></translation>
</message>
<message>
<source>Authors</source>
- <translation type="unfinished">Autores</translation>
+ <translation>Autores</translation>
</message>
<message>
<source>Translation</source>
- <translation type="unfinished">Tradução</translation>
+ <translation>Tradução</translation>
</message>
<message>
<source>Current language not translated yet (or native English).
If you're interested in translating iTALC into your local or another language or want to improve an existing translation, please contact an iTALC developer!</source>
- <translation type="unfinished"></translation>
+ <translation>Idioma atual não traduzido ainda (ou está em Inglês nativo).
+
+Se você estiver interessado em traduzir o iTALC em seu idioma local ou outro idioma ou quer melhorar uma tradução existente, entre em contato com um desenvolvedor iTALC!</translation>
</message>
<message>
<source>License</source>
- <translation type="unfinished">Licença</translation>
- </message>
- <message utf8="true">
- <source>iTALC - Intelligent Teaching And Learning with Computers
-
-Copyright © 2004-2011 Tobias Doerffel</source>
- <translation type="unfinished"></translation>
+ <translation>Licença</translation>
</message>
</context>
<context>
@@ -58,11 +56,11 @@ Copyright © 2004-2011 Tobias Doerffel</source>
</message>
<message>
<source>Confirm desktop access</source>
- <translation type="unfinished"></translation>
+ <translation>Confirmar acesso ao desktop</translation>
</message>
<message>
<source>The user %1 at host %2 wants to access your desktop. Do you want to grant access?</source>
- <translation type="unfinished"></translation>
+ <translation>O usuário %1 do computador %2 deseja acessar o seu desktop. Você quer conceder o acesso?</translation>
</message>
</context>
<context>
@@ -73,15 +71,15 @@ Copyright © 2004-2011 Tobias Doerffel</source>
</message>
<message>
<source>Use this workspace to manage your computers and classrooms in an easy way.</source>
- <translation>Use este espaço para gerenciar os computadores e salas de aula de forma muito simples.</translation>
+ <translation>Use este espaço para gerenciar seus computadores e salas de aula de uma forma fácil.</translation>
</message>
<message>
<source>This is where computers and classrooms are managed. You can add computers or classrooms by clicking right in this list.</source>
- <translation>Aqui, os computadores e salas de aula são gerenciados. Você pode adicionar computadores e salas de aula clicando nesta lista.</translation>
+ <translation>Este é o lugar onde os computadores e salas de aula são gerenciados. Você pode adicionar computadores e salas de aula clicando à direita nesta lista.</translation>
</message>
<message>
<source>Classrooms/computers</source>
- <translation>Salas de aual/Computadores</translation>
+ <translation>Salas de aual/computadores</translation>
</message>
<message>
<source>IP-address</source>
@@ -105,7 +103,7 @@ Copyright © 2004-2011 Tobias Doerffel</source>
</message>
<message>
<source>Use this button for exporting this list of computers and usernames into a text-file. You can use this file later for collecting files after an exam has finished. This is sometimes neccessary, because some users might have finished and logged out earlier and so you cannot collect their files at the end of the exam.</source>
- <translation>Use este botão para exportar esta lista de computadores e nomes de usuários para um arquivo texto. Você pode usar este arquivo mais tarde para recolher os arquivos dos usuários depois que um exame terminou. As vezes isso é necessário, pois alguns usuários podem ter terminado o exame mais cedo e ter feito logoff do computador impedindo o professor de recolher seus arquivos no final do exame.</translation>
+ <translation>Use este botão para exportar esta lista de computadores e nomes de usuários para um arquivo texto. Você pode usar este arquivo mais tarde para recolher os arquivos dos usuários depois que um exame terminou. As vezes isso é necessário, porque alguns usuários podem ter terminado o exame mais cedo e ter feito logoff do computador e por isso impedindo você de recolher seus arquivos no final do exame.</translation>
</message>
<message>
<source>Hide teacher computers</source>
@@ -113,7 +111,7 @@ Copyright © 2004-2011 Tobias Doerffel</source>
</message>
<message>
<source>Show/hide</source>
- <translation>Mostrar/Ocultar</translation>
+ <translation>Mostrar/ocultar</translation>
</message>
<message>
<source>Edit settings</source>
@@ -129,7 +127,7 @@ Copyright © 2004-2011 Tobias Doerffel</source>
</message>
<message>
<source>Hide all computers in classroom</source>
- <translation>Ocultarr todos os computadores da sala de aula</translation>
+ <translation>Ocultar todos os computadores da sala de aula</translation>
</message>
<message>
<source>Edit name</source>
@@ -242,11 +240,11 @@ Quer criar uma nova sala agora?</translation>
</message>
<message>
<source>Demo running</source>
- <translation>Demo em andamento</translation>
+ <translation>Demonstração em execução</translation>
</message>
<message>
<source>Desktop locked</source>
- <translation>Travar área de trabalho</translation>
+ <translation>Desktop bloqueado</translation>
</message>
</context>
<context>
@@ -296,59 +294,59 @@ Quer criar uma nova sala agora?</translation>
</message>
<message>
<source>Client settings</source>
- <translation type="unfinished">Configurações do cliente</translation>
+ <translation>Configurações do cliente</translation>
</message>
<message>
<source>IP/hostname</source>
- <translation type="unfinished">IP/nome do computador</translation>
+ <translation>IP/nome do computador</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">enter an IP-address or hostname under which iTALC can reach the client (use ':' for specifying an optional port-number)</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Digite um endereço IP ou nome do computador em que o iTALC possa acessar o cliente (use ':' para especificar um número de porta opcional)</p></body></html></translation>
+ <translation><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Digite um endereço IP ou nome do computador para que o iTALC possa acessar o cliente (use ':' para especificar um número de porta opcional)</p></body></html></translation>
</message>
<message>
<source>Name</source>
- <translation type="unfinished">Nome</translation>
+ <translation>Nome</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Optional nickname of the host which is displayed in iTALC.</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Apelido opcional do computador que é exibido no iTALC.</p></body></html></translation>
+ <translation><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Apelido opcional do computador que é exibido no iTALC.</p></body></html></translation>
</message>
<message>
<source>MAC address</source>
- <translation type="unfinished"></translation>
+ <translation>Endereço MAC</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hardware/MAC-address of client - only used for powering on client</p></body></html></source>
- <translation type="unfinished"><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Endereço de Hardware (MAC) do cliente - somente usado para ligar o computador remotamente</p></body></html></translation>
+ <translation><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Endereço de Hardware (MAC) do cliente - somente usado para ligar o computador remotamente</p></body></html></translation>
</message>
<message>
<source>Classroom</source>
- <translation type="unfinished">Sala de aula</translation>
+ <translation>Sala de aula</translation>
</message>
<message>
<source>Type</source>
- <translation type="unfinished">Tipo</translation>
+ <translation>Tipo</translation>
</message>
<message>
<source>Student computer</source>
- <translation type="unfinished">Computador do estudante</translation>
+ <translation>Computador do aluno</translation>
</message>
<message>
<source>Teacher computer</source>
- <translation type="unfinished">Computador do professor</translation>
+ <translation>Computador do professor</translation>
</message>
<message>
<source>Other/undefined computer</source>
- <translation type="unfinished">Outro computador (indefinido)</translation>
+ <translation>Outro computador (indefinido)</translation>
</message>
<message>
<source>Missing IP address/hostname</source>
- <translation type="unfinished"></translation>
+ <translation>Faltando endereço IP/nome do computador</translation>
</message>
<message>
<source>You didn't specify an IP address or hostname for the computer!</source>
- <translation type="unfinished"></translation>
+ <translation>Você não especificou um endereço IP ou nome para o computador!</translation>
</message>
</context>
<context>
@@ -391,7 +389,7 @@ Quer criar uma nova sala agora?</translation>
</message>
<message>
<source>Your role (needs according keys!)</source>
- <translation>Sua função (necessário as chaves estaremde acordo!)</translation>
+ <translation>Sua função (necessário as chaves estarem de acordo!)</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /><style type="text/css">
@@ -401,7 +399,7 @@ p, li { white-space: pre-wrap; }
<translation><html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Aqui, você pode selecionar sua função. Somente modifique isto, se você conhece o que está fazendo. Caso contrário, você não será capaz de acessar todos os computadores clientes até que você restaure sua antiga funação.</p></body></html></translation>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Aqui, você pode selecionar sua função. Somente modifique isto, se você conhece o que está fazendo. Caso contrário, você não será capaz de acessar todos os computadores clientes até que você restaure sua antiga função.</p></body></html></translation>
</message>
<message>
<source>Teacher</source>
@@ -439,7 +437,7 @@ p, li { white-space: pre-wrap; }
<translation><html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Aqui, você pode definir o que deve acontecer se você clicar duas vezes em uma janela cliente.</p></body></html></translation>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Aqui, você pode definir o que deve acontecer se você clicar duas vezes em uma janela do cliente.</p></body></html></translation>
</message>
<message>
<source>Remote control</source>
@@ -447,7 +445,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>View live in fullscreen</source>
- <translation>Visualização ao vivo em tela cheia</translation>
+ <translation>Ver ao vivo em tela cheia</translation>
</message>
<message>
<source><html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt; font-style:italic;">Please note, that some changes won't take effect until you restart iTALC.</span></p></body></html></source>
@@ -509,19 +507,19 @@ p, li { white-space: pre-wrap; }
<name>KeyFileAssistant</name>
<message>
<source>iTALC Access Key Assistant</source>
- <translation type="unfinished">Assistente de Chave de Acesso do iTALC</translation>
+ <translation>Assistente Da Chave De Acesso Do iTALC</translation>
</message>
<message>
<source>Create/import iTALC access keys</source>
- <translation type="unfinished">Criar/importar chaves de acesso do iTALC</translation>
+ <translation>Criar/importar chaves de acesso do iTALC</translation>
</message>
<message>
<source>This assistant will help you to create or import iTALC access keys.</source>
- <translation type="unfinished">Este assistente irá ajudá-lo a criar ou importar as chaves de acesso do iTALC.</translation>
+ <translation>Este assistente irá ajudá-lo a criar ou importar as chaves de acesso do iTALC.</translation>
</message>
<message>
<source>How does it work?</source>
- <translation type="unfinished">Como isso funciona?</translation>
+ <translation>Como isso funciona?</translation>
</message>
<message>
<source>iTALC access keys consist of two parts belonging together, a private and a public key part.
@@ -529,7 +527,7 @@ p, li { white-space: pre-wrap; }
Using the private key part, users on the master computer will be able to access client computers. It is important that only authorized users have read access to the private key file.
The public key part is used on the client computers to verify that any incoming connection request is authorized.</source>
- <translation type="unfinished">As chaves de acesso do iTALC consistem em duas partes pertencentes em conjunto, uma chave pública e uma privada.
+ <translation>As chaves de acesso do iTALC consistem em duas partes pertencentes em conjunto, uma chave pública e uma privada.
Usando a chave privada, os usuários no computador mestre serão capazes de acessar os computadores clientes. É importante que somente usuários autorizados tenham acesso de leitura para o arquivo da chave privada.
@@ -537,185 +535,185 @@ A chave pública é usada nos computadores clientes para verificar que qualquer
</message>
<message>
<source>Assistant mode</source>
- <translation type="unfinished">Modo assistente</translation>
+ <translation>Modo assistente</translation>
</message>
<message>
<source>Please choose whether to create new access keys or import a public key on a client.</source>
- <translation type="unfinished">Por favor, escolha se deseja criar novas chaves de acesso ou importar uma chave pública de um cliente.</translation>
+ <translation>Por favor, escolha se deseja criar novas chaves de acesso ou importar uma chave pública de um cliente.</translation>
</message>
<message>
<source>Create new access keys (master computer)</source>
- <translation type="unfinished">Criar novas chaves de acesso (computador mestre)</translation>
+ <translation>Criar novas chaves de acesso (computador mestre)</translation>
</message>
<message>
<source>assistantModeButtonGroup</source>
- <translation type="unfinished">assistantModeButtonGroup</translation>
+ <translation>assistantModeButtonGroup</translation>
</message>
<message>
<source>Import public key (client computer)</source>
- <translation type="unfinished">Importar chave pública (computador cliente)</translation>
+ <translation>Importar chave pública (computador cliente)</translation>
</message>
<message>
<source>Select user role</source>
- <translation type="unfinished">Selecionar a função do usuário</translation>
+ <translation>Selecionar a função do usuário</translation>
</message>
<message>
<source>Please select a user role for which to create or import the access keys:</source>
- <translation type="unfinished">Por favor, selecione uma função para o usuário para criar ou importar chaves de acesso:</translation>
+ <translation>Por favor, selecione uma função para o usuário para criar ou importar as chaves de acesso:</translation>
</message>
<message>
<source>Teacher</source>
- <translation type="unfinished">Professor</translation>
+ <translation>Professor</translation>
</message>
<message>
<source>Administrator</source>
- <translation type="unfinished">Administrador</translation>
+ <translation>Administrador</translation>
</message>
<message>
<source>Support team member</source>
- <translation type="unfinished">Ajudar membro da equipe</translation>
+ <translation>Membro da equipe de apoio</translation>
</message>
<message>
<source>Other</source>
- <translation type="unfinished">Outro</translation>
+ <translation>Outro</translation>
</message>
<message>
<source>User roles allow using multiple access keys in parallel. For example there can be different teacher access keys for each classroom while the support access keys are the same for the whole school.</source>
- <translation type="unfinished">Funções de usuário permitem usar múltiplas chaves de acesso em paralelo. Por exemplo, pode haver diferentes chaves de acesso do professor para cada sala de aula, enquanto que as chaves de acesso são as mesmas para toda a escola.</translation>
+ <translation>Funções de usuário permitem usar múltiplas chaves de acesso em paralelo. Por exemplo, pode haver diferentes chaves de acesso do professor para cada sala de aula, enquanto que as chaves de acesso são as mesmas para toda a escola.</translation>
</message>
<message>
<source>Directories</source>
- <translation type="unfinished">Diretórios</translation>
+ <translation>Diretórios</translation>
</message>
<message>
<source>Export public key part (master computer)</source>
- <translation type="unfinished">Exportar parte de chave pública (computador mestre)</translation>
+ <translation>Exportar parte de chave pública (computador mestre)</translation>
</message>
<message>
<source>...</source>
- <translation type="unfinished">...</translation>
+ <translation>...</translation>
</message>
<message>
<source>Use custom destination directory for access keys</source>
- <translation type="unfinished">Usar um diretório de destino personalizado para as chaves de acesso</translation>
+ <translation>Usar um diretório de destino personalizado para as chaves de acesso</translation>
</message>
<message>
<source>Please specify the location of the public access key to be imported.</source>
- <translation type="unfinished">Por favor, especifique a localização da chave pública de acesso para ser importada.</translation>
+ <translation>Por favor, especifique a localização da chave de acesso pública para ser importada.</translation>
</message>
<message>
<source>Summary</source>
- <translation type="unfinished">Resumo</translation>
+ <translation>Resumo</translation>
</message>
<message>
<source>The following actions will be taken:</source>
- <translation type="unfinished">As seguintes ações serão tomadas:</translation>
+ <translation>As seguintes ações serão tomadas:</translation>
</message>
<message utf8="true">
<source>• Create new access keys</source>
- <translation type="unfinished">• Criar novas chaves de acesso</translation>
+ <translation>• Criar novas chaves de acesso</translation>
</message>
<message utf8="true">
<source>• Import public access key from</source>
- <translation type="unfinished">• Importar chave pública de</translation>
+ <translation>• Importar chave de acesso pública de</translation>
</message>
<message>
<source><unknown></source>
- <translation type="unfinished"><desconhecida></translation>
+ <translation><desconhecida></translation>
</message>
<message utf8="true">
<source>• Write access key(s) to</source>
- <translation type="unfinished">• Salvar chave(s) de acesso em</translation>
+ <translation>• Salvar chave(s) de acesso em</translation>
</message>
<message utf8="true">
<source>• Export public key to</source>
- <translation type="unfinished">• Exportar chave púlica para</translation>
+ <translation>• Exportar chave pública para</translation>
</message>
<message utf8="true">
<source>• Configure for user role</source>
- <translation type="unfinished">• Configurar para a função de usuário</translation>
+ <translation>• Configurar para a função de usuário</translation>
</message>
<message>
<source>Select directory in which to export the public key</source>
- <translation type="unfinished">Selecionar o diretório para o qual a chave pública será exportada</translation>
+ <translation>Selecionar o diretório para o qual a chave pública será exportada</translation>
</message>
<message>
<source>Key files (*.key.txt)</source>
- <translation type="unfinished">Chaves de acesso (*.key.txt)</translation>
+ <translation>Chaves de acesso (*.key.txt)</translation>
</message>
<message>
<source>Invalid public key</source>
- <translation type="unfinished">Chave pública inválida</translation>
+ <translation>Chave pública inválida</translation>
</message>
<message>
<source>The selected file does not contain a valid public iTALC access key!</source>
- <translation type="unfinished">O arquivo selecionado não contém uma chave pública de acesso do iTALC!</translation>
+ <translation>O arquivo selecionado não contém uma válida chave de acesso pública do iTALC!</translation>
</message>
<message>
<source>Select destination directory</source>
- <translation type="unfinished">Selecionar diretório de destino</translation>
+ <translation>Selecionar diretório de destino</translation>
</message>
<message>
<source>Access key creation</source>
- <translation type="unfinished">Criação da chave de acesso</translation>
+ <translation>Criação da chave de acesso</translation>
</message>
<message>
<source>Could not remove previously existing file %1.</source>
- <translation type="unfinished">Não foi possível remove arquivo %1 previamente existente.</translation>
+ <translation>Não foi possível remover arquivo %1 previamente existente.</translation>
</message>
<message>
<source>Failed exporting public access key from %1 to %2.</source>
- <translation type="unfinished">Falha ao exportar chave pública de acesso de %1 para %2.</translation>
+ <translation>Falha ao exportar chave pública de acesso de %1 para %2.</translation>
</message>
<message>
<source>Access keys were created and written successfully to %1 and %2.</source>
- <translation type="unfinished">Chaves de acesso foram criadas e escritas com sucesso para %1 e %2.</translation>
+ <translation>Chaves de acesso foram criadas e escritas com sucesso para %1 e %2.</translation>
</message>
<message>
<source>An error occured while creating the access keys. You probably are not permitted to write to the selected directories.</source>
- <translation type="unfinished">Um erro ocorreu ao criar as chaves de acesso. Você provavalmente não tem permissão para escrever no diretório selecionado.</translation>
+ <translation>Um erro ocorreu ao criar as chaves de acesso. Você provavalmente não tem permissão para escrever no diretório selecionado.</translation>
</message>
<message>
<source>Public key import</source>
- <translation type="unfinished">Chave pública importada</translation>
+ <translation>Chave pública importada</translation>
</message>
<message>
<source>An error occured while importing the public access key. You probably are not permitted to read the source key or to write the destination file.</source>
- <translation type="unfinished">Um erro ocorreu ao importa a chave pública de acesso. Você provavelmente não tem permissão para ler a chave de origem ou escrever no arquivo de destino.</translation>
+ <translation>Um erro ocorreu ao importa a chave pública de acesso. Você provavelmente não tem permissão para ler a chave de origem ou escrever no arquivo de destino.</translation>
</message>
<message>
<source>The public key was successfully imported to %1.</source>
- <translation type="unfinished"></translation>
+ <translation>A chave pública foi importada com sucesso de %1.</translation>
</message>
</context>
<context>
<name>LockWidget</name>
<message>
<source>screen lock</source>
- <translation>travar tela</translation>
+ <translation>bloquear tela</translation>
</message>
</context>
<context>
<name>LogonGroupEditor</name>
<message>
<source>Logon group editor</source>
- <translation type="unfinished"></translation>
+ <translation>Editor de grupo de acesso</translation>
</message>
<message>
<source>Please add the groups whose members should be allowed to access computers in your iTALC network.</source>
- <translation type="unfinished">Por favor, adicione os grupos cujos membros devem ser autorizados a acessar os computadores na sua rede iTALC.</translation>
+ <translation>Por favor, adicione os grupos cujos membros devem ser autorizados a acessar os computadores em sua rede iTALC.</translation>
</message>
<message>
<source>All groups</source>
- <translation type="unfinished">Todos os grupos</translation>
+ <translation>Todos os grupos</translation>
</message>
<message>
<source>...</source>
- <translation type="unfinished">...</translation>
+ <translation>...</translation>
</message>
<message>
<source>Groups with iTALC privileges</source>
- <translation type="unfinished">Grupos com privilégios do iTALC</translation>
+ <translation>Grupos com privilégios do iTALC</translation>
</message>
</context>
<context>
@@ -844,10 +842,6 @@ A chave pública é usada nos computadores clientes para verificar que qualquer
<translation>Habilitar captura de janelas em camadas (semi-transparente)</translation>
</message>
<message>
- <source>Poll full screen</source>
- <translation>Pesquisa em tela cheia</translation>
- </message>
- <message>
<source>Low accuracy (turbo mode)</source>
<translation>Baixa precisão (modo turbo)</translation>
</message>
@@ -869,7 +863,7 @@ A chave pública é usada nos computadores clientes para verificar que qualquer
</message>
<message>
<source>Enable firewall exception</source>
- <translation>Hablitar exceção de firewall</translation>
+ <translation>Habilitar exceção de firewall</translation>
</message>
<message>
<source>Configuration files</source>
@@ -921,11 +915,11 @@ A chave pública é usada nos computadores clientes para verificar que qualquer
</message>
<message>
<source>&Save settings into file</source>
- <translation>&Salvar as configurações no arquivo</translation>
+ <translation>&Salvar configurações em arquivo</translation>
</message>
<message>
<source>Save settings into file</source>
- <translation>Salvar as configurações no arquivo</translation>
+ <translation>Salvar configurações em arquivo</translation>
</message>
<message>
<source>Ctrl+S</source>
@@ -1025,7 +1019,7 @@ A chave pública é usada nos computadores clientes para verificar que qualquer
</message>
<message>
<source>Click on this button, to switch between classrooms.</source>
- <translation>Clique neste botão, para alternar entre as sala de aula.</translation>
+ <translation>Clique neste botão, para alternar entre as salas de aula.</translation>
</message>
<message>
<source>Overview mode</source>
@@ -1057,11 +1051,11 @@ A chave pública é usada nos computadores clientes para verificar que qualquer
</message>
<message>
<source>Window demo</source>
- <translation>Demonstração da janela</translation>
+ <translation>Demonstração em janela</translation>
</message>
<message>
<source>Window Demo</source>
- <translation>Demonstração da janela</translation>
+ <translation>Demonstração em janela</translation>
</message>
<message>
<source>In this mode your screen being displayed in a window on all shown computers. The users are able to switch to other windows and thus can continue to work.</source>
@@ -1069,7 +1063,7 @@ A chave pública é usada nos computadores clientes para verificar que qualquer
</message>
<message>
<source>Lock/unlock desktops</source>
- <translation>Bloquear/desbloquear áreas de trabalho</translation>
+ <translation>Bloquear/desbloquear os desktops</translation>
</message>
<message>
<source>Lock all</source>
@@ -1093,7 +1087,7 @@ A chave pública é usada nos computadores clientes para verificar que qualquer
</message>
<message>
<source>Use this button to send a text message to all users e.g. to tell them new tasks etc.</source>
- <translation>Use este botão para enviar uma mensagem de texto para todos os usuaŕios, por exemplo, para comunicar a nova tarefa etc.</translation>
+ <translation>Use este botão para enviar uma mensagem de texto para todos os usuários, por exemplo, para comunicar a nova tarefa etc.</translation>
</message>
<message>
<source>Power on computers</source>
@@ -1137,7 +1131,7 @@ A chave pública é usada nos computadores clientes para verificar que qualquer
</message>
<message>
<source>Adjust windows and their size</source>
- <translation>Ajustar o tamanho da janela</translation>
+ <translation>Ajustar janelas e seus tamanhos</translation>
</message>
<message>
<source>When clicking this button the biggest possible size for the client-windows is adjusted. Furthermore all windows are aligned.</source>
@@ -1157,7 +1151,7 @@ A chave pública é usada nos computadores clientes para verificar que qualquer
</message>
<message>
<source>iTALC Master Control</source>
- <translation>Controle Mestre do iTALC</translation>
+ <translation>Controle Mestre Do iTALC</translation>
</message>
<message>
<source>Remote control</source>
@@ -1177,227 +1171,236 @@ A chave pública é usada nos computadores clientes para verificar que qualquer
</message>
<message>
<source>Debugging</source>
- <translation type="unfinished"></translation>
+ <translation>Depuração</translation>
</message>
<message>
<source>Enable desktop switching for screen lock (experimental)</source>
- <translation type="unfinished"></translation>
+ <translation>Habilitar alternando desktop para bloquear tela (experimental)</translation>
</message>
<message>
<source>Log to standard error output</source>
- <translation type="unfinished"></translation>
+ <translation>Log para a saída de erro padrão</translation>
</message>
<message>
<source>Log to Windows event log</source>
- <translation type="unfinished"></translation>
+ <translation>Log para registro de eventos de Janelas</translation>
</message>
<message>
<source>Backend</source>
- <translation type="unfinished"></translation>
+ <translation>Backend</translation>
</message>
<message>
<source>VNC reflector</source>
- <translation type="unfinished"></translation>
+ <translation>Refletor VNC</translation>
</message>
<message>
<source>iTALC 1 demo server</source>
- <translation type="unfinished"></translation>
+ <translation>Servidor de demonstração iTALC</translation>
</message>
<message>
<source>Multithreading (can be enabled when using the VNC reflector backend)</source>
- <translation type="unfinished"></translation>
+ <translation>Multithreading (pode ser habilitado ao usar o backend refletor VNC)</translation>
</message>
<message>
<source>Enable HTTP server which provides a JavaViewer applet</source>
- <translation type="unfinished"></translation>
+ <translation>Habilitar servidor HTTP que fornece um applet JavaViewer</translation>
</message>
<message>
<source>HTTP server port</source>
- <translation type="unfinished"></translation>
+ <translation>Porta do servidor HTTP</translation>
</message>
<message>
<source>Allow connections from localhost only</source>
- <translation type="unfinished"></translation>
+ <translation>Permitir conexões de localhost apenas</translation>
</message>
<message>
<source>Key file authentication</source>
- <translation type="unfinished"></translation>
+ <translation>Autenticação de arquivo de chave</translation>
</message>
<message>
<source>ACL-based logon authentication</source>
- <translation type="unfinished"></translation>
+ <translation>Autenticação de logon baseado em ACL</translation>
</message>
<message>
<source>Public key file base directory</source>
- <translation type="unfinished"></translation>
+ <translation>Diretório base do arquivo de chave pública</translation>
</message>
<message>
<source>Private key file base directory</source>
- <translation type="unfinished"></translation>
+ <translation>Diretório base do arquivo de chave privada</translation>
</message>
<message>
<source>Launch key file assistant</source>
- <translation type="unfinished"></translation>
+ <translation>Lançar assistente de arquivo de chave</translation>
</message>
<message>
<source>Manage permissions</source>
- <translation type="unfinished"></translation>
+ <translation>Gerenciar permissões</translation>
</message>
<message>
<source>Test</source>
- <translation type="unfinished"></translation>
+ <translation>Teste</translation>
</message>
<message>
<source>Access confirmation</source>
- <translation type="unfinished"></translation>
+ <translation>Confirmação de acesso</translation>
</message>
<message>
<source>You can configure iTALC to ask the user for permission to access the desktop when using certain authentication methods.</source>
- <translation type="unfinished"></translation>
+ <translation>Você pode configurar iTALC para pedir a permissão do usuário para acessar o desktop ao usar determinados métodos de autenticação.</translation>
</message>
<message>
<source>Logon authentication</source>
- <translation type="unfinished"></translation>
+ <translation>Autenticação de logon</translation>
</message>
<message>
<source>Allow same user to access desktop without confirmation</source>
- <translation type="unfinished"></translation>
+ <translation>Permitir que o mesmo usuário acesse o desktop sem confirmação</translation>
</message>
<message>
<source>Debugging iTALC</source>
- <translation type="unfinished"></translation>
+ <translation>Depurando iTALC</translation>
</message>
<message>
<source>When encountering bugs or other misbehaviour in iTALC it is important to inform the developers about them, so that the bugs can be fixed in future releases. This page allows you to submit a helpful bug report easily.
If the bug is not reproducible, skip step 1) - 3).</source>
- <translation type="unfinished"></translation>
+ <translation>Ao encontrar falhas ou outro mau comportamento em iTALC é importante informar os desenvolvedores sobre eles, de modo que as falhas possam ser corrigidas em versões futuras. Esta página permite que você envie um relatório de falha útil facilmente.
+
+Se a falha não é reproduzível, pule o passo1) - 3).</translation>
</message>
<message>
<source>1)</source>
- <translation type="unfinished"></translation>
+ <translation>1)</translation>
</message>
<message>
<source>Clear the logfiles in the "General" section.</source>
- <translation type="unfinished"></translation>
+ <translation>Limpar os arquivos de log na seção "Geral".</translation>
</message>
<message>
<source>2)</source>
- <translation type="unfinished"></translation>
+ <translation>2)</translation>
</message>
<message>
<source>In the "General" section set the log level to "Debug messages and everything else".</source>
- <translation type="unfinished"></translation>
+ <translation>Na seção "Geral" defina o nível do log para "Mensagens de depuração e tudo mais".</translation>
</message>
<message>
<source>3)</source>
- <translation type="unfinished"></translation>
+ <translation>3)</translation>
</message>
<message>
<source>Repeat the actions leading to the bug or misbehaviour.</source>
- <translation type="unfinished"></translation>
+ <translation>Repita as ações que conduzem ao erro ou mau comportamento.</translation>
</message>
<message>
<source>4)</source>
- <translation type="unfinished"></translation>
+ <translation>4)</translation>
</message>
<message>
<source>Click the following button and save the file to a known location.</source>
- <translation type="unfinished"></translation>
+ <translation>Clique no botão abaixo e salve o arquivo em um local conhecido.</translation>
</message>
<message>
<source>Generate bug report archive</source>
- <translation type="unfinished"></translation>
+ <translation>Gerar arquivo de relatório de falha</translation>
</message>
<message>
<source>5)</source>
- <translation type="unfinished"></translation>
+ <translation>5)</translation>
</message>
<message>
<source>Go to the <a href="http://sourceforge.net/tracker/?group_id=132465&atid=724375">iTALC bug tracker</a>, open a new bug, describe what you did in step 3) and attach the file you saved in step 4).</p>
<br/>
<br/>
Note: if the bug involves both a master and client computer, attach bug report archives for both computers.</source>
- <translation type="unfinished"></translation>
+ <translation>Ir para o <a href="http://sourceforge.net/tracker/?group_id=132465&atid=724375">iTALC bug tracker</a>, abra um novo bug, descrever o que você fez no passo 3) e anexe o arquivo que você salvou no passo 4).</p>
+<br/>
+<br/>
+Nota: se o erro envolve ambos os computadores mestre e cliente, anexe os arquivos de relatório de erro para ambos os computadores.</translation>
</message>
<message>
<source>Restart iTALC Service</source>
- <translation type="unfinished"></translation>
+ <translation>Reiniciar Servidor iTALC</translation>
</message>
<message>
<source>All settings were saved successfully. In order to take effect the iTALC service needs to be restarted. Restart it now?</source>
- <translation type="unfinished"></translation>
+ <translation>Todas as configurações foram salvas com sucesso. A fim de ter efeito, o serviço iTALC precisa ser reiniciado. Reiniciá-lo agora?</translation>
</message>
<message>
<source>Starting iTALC service</source>
- <translation type="unfinished"></translation>
+ <translation>Iniciando serviço iTALC</translation>
</message>
<message>
<source>Stopping iTALC service</source>
- <translation type="unfinished"></translation>
+ <translation>Parando serviço iTALC</translation>
</message>
<message>
<source>The iTALC service needs to be stopped temporarily in order to remove the log files. Continue?</source>
- <translation type="unfinished"></translation>
+ <translation>O serviço iTALC precisa ser parado temporariamente, a fim de remover os arquivos de log. Continuar?</translation>
</message>
<message>
<source>Log files cleared</source>
- <translation type="unfinished"></translation>
+ <translation>Arquivos de log limpos</translation>
</message>
<message>
<source>All log files were cleared successfully.</source>
- <translation type="unfinished"></translation>
+ <translation>Todos os arquivos de log foram limpos com sucesso.</translation>
</message>
<message>
<source>Error</source>
- <translation type="unfinished"></translation>
+ <translation>Erro</translation>
</message>
<message>
<source>Could not remove all log files.</source>
- <translation type="unfinished"></translation>
+ <translation>Não foi possível remover todos os arquivos de log.</translation>
</message>
<message>
<source>Logon authentication test</source>
- <translation type="unfinished"></translation>
+ <translation>Teste de autenticação de logon</translation>
</message>
<message>
<source>Authentication with provided credentials was successful.</source>
- <translation type="unfinished"></translation>
+ <translation>A autenticação com credenciais fornecidas foi bem sucedida.</translation>
</message>
<message>
<source>Authentication with provided credentials failed!</source>
- <translation type="unfinished"></translation>
+ <translation>A autenticação com credenciais fornecidas falhou!</translation>
</message>
<message>
<source>Save bug report archive</source>
- <translation type="unfinished"></translation>
+ <translation>Salvar arquivo de relatório de bug</translation>
</message>
<message>
<source>iTALC bug report archive (*.ibra.xml)</source>
- <translation type="unfinished"></translation>
+ <translation>Arquivo de relatório de bug iTALC (*.ibra.xml)</translation>
</message>
<message>
<source>iTALC bug report archive saved</source>
- <translation type="unfinished"></translation>
+ <translation>Arquivo de relatório de bug iTALC salvo</translation>
</message>
<message>
<source>An iTALC bug report archive has been saved to %1. It includes iTALC log files and information about your operating system. You can attach it to a bug report.</source>
- <translation type="unfinished"></translation>
+ <translation>Um arquivo de relatório de bug do iTALC foi salvo em %1.Ele inclui arquivos de log do iTALC e informações sobre seu sistema operacional. Você pode atachá-lo a um relatório de bug.</translation>
</message>
<message>
<source>Could not contact iTALC service</source>
- <translation type="unfinished"></translation>
+ <translation>Não foi possível contactar o serviço iTALC</translation>
</message>
<message>
<source>Could not contact the local iTALC service. It is likely that you entered wrong credentials or key files are not set up properly. Try again or contact your administrator for solving this problem using the iTALC Management Console.</source>
- <translation type="unfinished"></translation>
+ <translation>Não foi possível contactar o serviço local iTALC. É provável que você inseriu as credenciais erradas ou arquivos de chaves não estão configurados corretamente. Tente novamente ou contate o administrador para resolver esse problema usando o Console De Gerenciamento Do iTALC. </translation>
</message>
<message>
<source>Authentication impossible</source>
- <translation type="unfinished"></translation>
+ <translation>Autenticação impossível</translation>
</message>
<message>
<source>No authentication key files were found or your current ones are outdated. Please create new key files using the iTALC Management Console. Alternatively set up logon authentication using the iTALC Management Console. Otherwise you won't be able to access computers using iTALC.</source>
+ <translation>Nenhum arquivos de chave de autenticação foram encontrados ou seus atuais estão desatualizados. Por favor, crie novos arquivos de chave usando o Console De Gerenciamento Do iTALC. Alternativamente, configure a autenticação do usuário no Console De Gerenciamento Do iTALC. Caso contrário, você não será capaz de acessar computadores usando o iTALC.</translation>
+ </message>
+ <message>
+ <source>Poll full screen (leave this enabled per default)</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1422,7 +1425,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Here you see the working-bar which contains several buttons. Each button is connected to a workspace. Just take a look at the available workspaces by clicking on the corresponding button.</source>
- <translation>Aqui, você vê a barra de ferramentas que contém vários butões. Cada botão está conectado a um espaço de trabalho. Basta dar uma olhada nos espaços de trabalho disponíveis, clicando no botão correspondente.</translation>
+ <translation>Aqui, você vê a barra de ferramentas que contém vários botões. Cada botão está conectado a um espaço de trabalho. Para dar uma olhada nos espaços de trabalho disponíveis, basta clicar no botão correspondente.</translation>
</message>
<message>
<source>Using the classroom-manager you can manage your classrooms and computers. You can also see which users are logged in.</source>
@@ -1456,7 +1459,7 @@ p, li { white-space: pre-wrap; }
<name>PasswordDialog</name>
<message>
<source>Please enter your username and password in order to access iTALC clients.</source>
- <translation>Por favor, digite seu nome de usuário e senha para acessar os clientes do iTALC.</translation>
+ <translation>Por favor, digite seu nome de usuário e senha para acessar os clientes iTALC.</translation>
</message>
<message>
<source>Username</source>
@@ -1468,6 +1471,10 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>iTALC Logon</source>
+ <translation>Acessar iTALC</translation>
+ </message>
+ <message>
+ <source>Manage</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1475,7 +1482,7 @@ p, li { white-space: pre-wrap; }
<name>QApplication</name>
<message>
<source>iTALC Client %1 on %2:%3</source>
- <translation>iTALC Cliente %1 no %2:%3</translation>
+ <translation>Cliente iTALC %1 no %2:%3</translation>
</message>
<message>
<source>Unable to register service '%1'.</source>
@@ -1483,7 +1490,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>The Service Control Manager could not be contacted (do you have the neccessary rights?!) - the service '%1' was not registered.</source>
- <translation>O Gerenciador de Controle de Servicos não pôde ser contatado (você tem os direitos necessários?!) - o serviço '%1' não foi registrado.</translation>
+ <translation>O Gerenciador de Controle de Servicos não pode ser contatado (você tem os direitos necessários?!) - o serviço '%1' não foi registrado.</translation>
</message>
<message>
<source>The service '%1' is already registered.</source>
@@ -1491,7 +1498,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>The service '%1' could not be registered.</source>
- <translation>O serviço '%1' não pôde se registrado.</translation>
+ <translation>O serviço '%1' não pode se registrado.</translation>
</message>
<message>
<source>The service '%1' was successfully registered.</source>
@@ -1499,38 +1506,38 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>The service '%1' could not be stopped.</source>
- <translation>O serviço '%1' não pôde ser parado.</translation>
+ <translation>O serviço '%1' não pode ser parado.</translation>
</message>
<message>
<source>The service '%1' has been unregistered.</source>
- <translation>O serviço '%1' não tem sido registrado.</translation>
+ <translation>O serviço '%1' tem sido registrado.</translation>
</message>
<message>
<source>The service '%1' isn't registered and therefore can't be unregistered.</source>
- <translation>O serviço '%1' não tem sido registrado e por isso não pôde ser registrado.</translation>
+ <translation>O serviço '%1' não tem sido registrado e por isso não pode ser registrado.</translation>
</message>
<message>
<source>The service '%1' could not be unregistered.</source>
- <translation>O serviço '%1' não pôde ser registrado.</translation>
+ <translation>O serviço '%1' não pode ser registrado.</translation>
</message>
<message>
<source>The service '%1' could not be found.</source>
- <translation>O serviço '%1' não pôde ser encontrado.</translation>
+ <translation>O serviço '%1' não pode ser encontrado.</translation>
</message>
<message>
<source>The Service Control Manager could not be contacted (do you have the neccessary rights?!) - the service '%1' was not unregistered.</source>
- <translation>O Gerenciador de Controle de Servicos não pôde ser contatado (você tem os direitos necessários?!) - o serviço '%1' não foi registrado.</translation>
+ <translation>O Gerenciador de Controle de Servicos não pode ser contatado (você tem os direitos necessários?!) - o serviço '%1' não foi registrado.</translation>
</message>
<message>
<source>The Service Control Manager could not be contacted (do you have the neccessary rights?!) - the service '%1' was not stopped.</source>
- <translation>O Gerenciador de Controle de Servicos não pôde ser contatado (você tem os direitos necessários?!) - o serviço '%1' não foi parado.</translation>
+ <translation>O Gerenciador de Controle de Servicos não pode ser contatado (você tem os direitos necessários?!) - o serviço '%1' não foi parado.</translation>
</message>
</context>
<context>
<name>RemoteControlWidget</name>
<message>
<source>View live (%1 @ %2)</source>
- <translation>Visualização ao vivo (%1 @ %2)</translation>
+ <translation>Ver ao vivo (%1 @ %2)</translation>
</message>
<message>
<source>Remote control (%1 @ %2)</source>
@@ -1553,11 +1560,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Lock student</source>
- <translation>Travar estudante</translation>
+ <translation>Bloquear aluno</translation>
</message>
<message>
<source>Unlock student</source>
- <translation>Destravar estudante</translation>
+ <translation>Desbloquear aluno</translation>
</message>
<message>
<source>Snapshot</source>
@@ -1581,41 +1588,41 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Connected.</source>
- <translation>Cnectado.</translation>
+ <translation>Conectado.</translation>
</message>
</context>
<context>
<name>RemoteLogonDialog</name>
<message>
<source>Remote logon</source>
- <translation type="unfinished">Fazer logon remoto</translation>
+ <translation>Acessar remotamente</translation>
</message>
<message>
<source>Use the fields below to enter the username, password and optional the domain name. These information will be used to logon the computer(s).</source>
- <translation type="unfinished"></translation>
+ <translation>Use os campos abaixo para digitar o nome de usuário, senha e nome de domínio opcional. Estas informações serão usadas para fazer acessar o(s) computador(es).</translation>
</message>
<message>
<source>Username</source>
- <translation type="unfinished"></translation>
+ <translation>Nome de usuário</translation>
</message>
<message>
<source>Password</source>
- <translation type="unfinished">Senha</translation>
+ <translation>Senha</translation>
</message>
<message>
<source>Domain</source>
- <translation type="unfinished">Domínio</translation>
+ <translation>Domínio</translation>
</message>
</context>
<context>
<name>RunCommandsDialog</name>
<message>
<source>Run commands</source>
- <translation type="unfinished"></translation>
+ <translation>Executar comandos</translation>
</message>
<message>
<source>Please enter the commands to run on the selected client(s). You can separate multiple commands by line.</source>
- <translation type="unfinished"></translation>
+ <translation>Por favor, digite os comandos para executar no(s) cliente(s) selecionado(s). Você pode separar vários comandos por linha.</translation>
</message>
</context>
<context>
@@ -1685,22 +1692,22 @@ p, li { white-space: pre-wrap; }
<name>SupportDialog</name>
<message>
<source>Support</source>
- <translation type="unfinished">Ajuda</translation>
+ <translation>Ajuda</translation>
</message>
<message>
<source>Please enter the IP address or the name of the host to which you want to connect.</source>
- <translation type="unfinished"></translation>
+ <translation>Por favor, digite o endereço IP ou nome do computador para o qual você deseja se conectar.</translation>
</message>
</context>
<context>
<name>TextMessageDialog</name>
<message>
<source>Send text message</source>
- <translation type="unfinished">Enviar mensagem de texto</translation>
+ <translation>Enviar mensagem de texto</translation>
</message>
<message>
<source>Use the field below to type your message which will be sent to all selected users.</source>
- <translation type="unfinished">Use o campo abaixo para digitar sua mensagem que será enviada para todos os usuários selecionados.</translation>
+ <translation>Use o campo abaixo para digitar sua mensagem que será enviada para todos os usuários selecionados.</translation>
</message>
</context>
<context>
@@ -1726,11 +1733,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Locked display</source>
- <translation>Travar tela</translation>
+ <translation>Bloquear tela</translation>
</message>
<message>
<source>View live</source>
- <translation>Visualizar ao vivo</translation>
+ <translation>Ver ao vivo</translation>
</message>
<message>
<source>Remote control</source>
@@ -1738,7 +1745,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Let student show demo</source>
- <translation>Deixar o estudante exibir uma demonstração</translation>
+ <translation>Deixar o aluno exibir uma demonstração</translation>
</message>
<message>
<source>Send text message</source>
diff --git a/lib/resources/ru.qm b/lib/resources/ru.qm
index a695399..0405f76 100644
Binary files a/lib/resources/ru.qm and b/lib/resources/ru.qm differ
diff --git a/lib/resources/ru.ts b/lib/resources/ru.ts
index 503b9dd..ecb9009 100644
--- a/lib/resources/ru.ts
+++ b/lib/resources/ru.ts
@@ -5,18 +5,12 @@
<name>AboutDialog</name>
<message>
<source>About iTALC</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">О программе iTALC</translation>
</message>
<message>
<source>About</source>
<translation type="unfinished">О программе</translation>
</message>
- <message utf8="true">
- <source>iTALC - Intelligent Teaching And Learning with Computers
-
-Copyright © 2004-2011 Tobias Doerffel</source>
- <translation type="unfinished"></translation>
- </message>
<message>
<source><a href="http://italc.sourceforge.net">http://italc.sourceforge.net</a></source>
<translation type="unfinished"></translation>
@@ -33,7 +27,9 @@ Copyright © 2004-2011 Tobias Doerffel</source>
<source>Current language not translated yet (or native English).
If you're interested in translating iTALC into your local or another language or want to improve an existing translation, please contact an iTALC developer!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Перевод на данный язык еще не осуществлен.
+
+Если Вы желаете добавить перевод программы iTALC на новый язык или улучшить уже существующий, пожалуйста, свяжитесь с разработчиками iTALC!</translation>
</message>
<message>
<source>License</source>
@@ -58,11 +54,11 @@ Copyright © 2004-2011 Tobias Doerffel / iTALC Solutions</source>
</message>
<message>
<source>Confirm desktop access</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Подтверждать доступ к рабочему столу</translation>
</message>
<message>
<source>The user %1 at host %2 wants to access your desktop. Do you want to grant access?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Пользователь %1 компьютера %2 пытается подключиться к Вашему рабочему столу. Разрешить ему доступ к Вашему рабочему столу?</translation>
</message>
</context>
<context>
@@ -101,7 +97,7 @@ Copyright © 2004-2011 Tobias Doerffel / iTALC Solutions</source>
</message>
<message>
<source>Export to text-file</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Экспортировать в текстовый файл</translation>
</message>
<message>
<source>Use this button for exporting this list of computers and usernames into a text-file. You can use this file later for collecting files after an exam has finished. This is sometimes neccessary, because some users might have finished and logged out earlier and so you cannot collect their files at the end of the exam.</source>
@@ -175,15 +171,15 @@ Please edit it. Otherwise you should delete this file.</source>
</message>
<message>
<source>Select output-file</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Выберите выходной файл</translation>
</message>
<message>
<source>Text files (*.txt)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Текстовые файлы (*.txt)</translation>
</message>
<message>
<source>Actions for selected</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Действия для выбранных элементов</translation>
</message>
<message>
<source>Actions</source>
@@ -253,11 +249,11 @@ Do you want to create a new classrom now?</source>
<name>ClientAction</name>
<message>
<source>Are you sure want logout all users on all visible computers ?</source>
- <translation type="unfinished">Вы уверены, что хотите завершить работу всех пользователей на всех видимых компьютерах?</translation>
+ <translation type="unfinished">Вы действительно хотите завершить работу пользователей на всех видимых компьютерах?</translation>
</message>
<message>
<source>Are you sure want logout all users on all selected computers ?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Вы действительно хотите завершить работу пользователей на всех выбранных компьютерах?</translation>
</message>
<message>
<source>Logout user</source>
@@ -265,11 +261,11 @@ Do you want to create a new classrom now?</source>
</message>
<message>
<source>Are you sure want to reboot all visible computers?</source>
- <translation type="unfinished">Вы уверены, что хотите перезагрузить все видимые компьютеры?</translation>
+ <translation type="unfinished">Вы действительно хотите перезагрузить все видимые компьютеры?</translation>
</message>
<message>
<source>Are you sure want to reboot all selected computers?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Вы действительно хотите перезагрузить все выбранные компьютеры?</translation>
</message>
<message>
<source>Reboot computers</source>
@@ -277,11 +273,11 @@ Do you want to create a new classrom now?</source>
</message>
<message>
<source>Are you sure want to power down all visible computers?</source>
- <translation type="unfinished">Вы уверены, что хотите выключить все видимые компьютеры?</translation>
+ <translation type="unfinished">Вы действительно хотите завершить работу всех видимых компьютеров?</translation>
</message>
<message>
<source>Are you sure want to power down all selected computers?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Вы действительно хотите завершить работу всех выбранных компьютеров?</translation>
</message>
</context>
<context>
@@ -494,34 +490,34 @@ p, li { white-space: pre-wrap; }
<name>ItalcVncConnection</name>
<message>
<source>VNC authentication failed because of too many authentication tries.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Превышено количество попыток VNC аутентификации.</translation>
</message>
<message>
<source>VNC authentication failed.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">VNC аутентификация не удалась.</translation>
</message>
<message>
<source>VNC server closed connection.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">VNC сервер закрыл соединение.</translation>
</message>
</context>
<context>
<name>KeyFileAssistant</name>
<message>
<source>iTALC Access Key Assistant</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Помощник операций с ключем доступа к iTALC</translation>
</message>
<message>
<source>Create/import iTALC access keys</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Создать/Импортировать ключи доступа к iTALC</translation>
</message>
<message>
<source>This assistant will help you to create or import iTALC access keys.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Помощник поможет Вам создать или импортировать ключи доступа к iTALC</translation>
</message>
<message>
<source>How does it work?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Как он работает?</translation>
</message>
<message>
<source>iTALC access keys consist of two parts belonging together, a private and a public key part.
@@ -529,19 +525,23 @@ p, li { white-space: pre-wrap; }
Using the private key part, users on the master computer will be able to access client computers. It is important that only authorized users have read access to the private key file.
The public key part is used on the client computers to verify that any incoming connection request is authorized.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Ключи доступа к iTALC состоят из двух частей - закрытого и открытого ключа.
+
+С помощью закрытого ключа пользователи главного компьютера смогут получить доступ к клиентским компьютерам. Обязательно необходимо убедиться, что только авторизованные пользователи имеют доступ на чтение файла, содержащего закрытый ключ.
+
+Открытый ключ используется на клиентских компьютерах для проверки, что все входящие запросы посылаются главным компьютером.</translation>
</message>
<message>
<source>Assistant mode</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Режим работы помощника</translation>
</message>
<message>
<source>Please choose whether to create new access keys or import a public key on a client.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Пожалуйста, выберите, нужно ли создавать новые ключи доступа или импортировать уже существующий открытый ключ на клиентскую машину.</translation>
</message>
<message>
<source>Create new access keys (master computer)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Создать новые ключи доступа (главный компьютер)</translation>
</message>
<message>
<source>assistantModeButtonGroup</source>
@@ -549,7 +549,7 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>Import public key (client computer)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Импортировать открытый ключ (для клиентских машин)</translation>
</message>
<message>
<source>Select user role</source>
@@ -557,7 +557,7 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>Please select a user role for which to create or import the access keys:</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Пожалуйста, выберите роль пользователя, который будет создавать или импортировать ключи доступа:</translation>
</message>
<message>
<source>Teacher</source>
@@ -569,7 +569,7 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>Support team member</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Член службы поддержки</translation>
</message>
<message>
<source>Other</source>
@@ -577,15 +577,15 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>User roles allow using multiple access keys in parallel. For example there can be different teacher access keys for each classroom while the support access keys are the same for the whole school.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Роли пользователей позволяют использовать несколько ключей доступа одновременно. Например, можно создать различные ключи доступа учителям для каждого класса, а ключи доступа для технической поддержки будут одинаковы для всего учебного заведения.</translation>
</message>
<message>
<source>Directories</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Каталоги</translation>
</message>
<message>
<source>Export public key part (master computer)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Экспортировать открытый ключ (главный компьютер)</translation>
</message>
<message>
<source>...</source>
@@ -593,27 +593,27 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>Use custom destination directory for access keys</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Использовать пользовательский каталог для хранения ключей доступа</translation>
</message>
<message>
<source>Please specify the location of the public access key to be imported.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Пожалуйста, укажите расположение открытого ключа доступа для его импорта</translation>
</message>
<message>
<source>Summary</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Основная информация</translation>
</message>
<message>
<source>The following actions will be taken:</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Будут выполнены следующие действия:</translation>
</message>
<message utf8="true">
<source>• Create new access keys</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">• Созданы новые ключи доступа</translation>
</message>
<message utf8="true">
<source>• Import public access key from</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">• Импортирован открытый ключ из</translation>
</message>
<message>
<source><unknown></source>
@@ -621,67 +621,67 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message utf8="true">
<source>• Write access key(s) to</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">• Записаны ключи в</translation>
</message>
<message utf8="true">
<source>• Export public key to</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">• Экспортирован открытый ключ в</translation>
</message>
<message utf8="true">
<source>• Configure for user role</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">• Выполнена настройка для роли пользователя</translation>
</message>
<message>
<source>Select directory in which to export the public key</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Выберите каталог, в который будет осуществлен экспорт открытого ключа</translation>
</message>
<message>
<source>Key files (*.key.txt)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Файлы ключей (*.key.txt)</translation>
</message>
<message>
<source>Invalid public key</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Неправильный формат открытого ключа</translation>
</message>
<message>
<source>The selected file does not contain a valid public iTALC access key!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Выбранный файл не содержит открытый ключ доступа к iTALC</translation>
</message>
<message>
<source>Select destination directory</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Выберите каталог назначения</translation>
</message>
<message>
<source>Access key creation</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Создание ключа доступа</translation>
</message>
<message>
<source>Could not remove previously existing file %1.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Не удается удалить ранее существующий файл %1.</translation>
</message>
<message>
<source>Failed exporting public access key from %1 to %2.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Ошибка экспорта открытых ключей доступа из %1 в %2.</translation>
</message>
<message>
<source>Access keys were created and written successfully to %1 and %2.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Ключи доступа были успешно созданы в %1 и %2.</translation>
</message>
<message>
<source>An error occured while creating the access keys. You probably are not permitted to write to the selected directories.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Произошла ошибка при создании ключей доступа. Возможно, у выбранного каталога установлен запрет на запись.</translation>
</message>
<message>
<source>Public key import</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Импорт открытого ключа</translation>
</message>
<message>
<source>An error occured while importing the public access key. You probably are not permitted to read the source key or to write the destination file.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Произошла ошибка при импорте открытого ключа доступа. Возможно, у файла, содержащего исходный ключ, установлен запрет на чтение или существует запрет на запись в каталоге, содержащем ключи (конечном каталоге).</translation>
</message>
<message>
<source>The public key was successfully imported to %1.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Открытый ключ был успешно импортирован в %1.</translation>
</message>
</context>
<context>
@@ -694,16 +694,12 @@ The public key part is used on the client computers to verify that any incoming
<context>
<name>LogonGroupEditor</name>
<message>
- <source>Logon group editor</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Please add the groups whose members should be allowed to access computers in your iTALC network.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Пожалуйста, добавьте группы, члены которых могут иметь доступ к компьютерам в сети iTALC.</translation>
</message>
<message>
<source>All groups</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Все группы</translation>
</message>
<message>
<source>...</source>
@@ -711,6 +707,10 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>Groups with iTALC privileges</source>
+ <translation type="unfinished">Группы с привилегиями iTALC</translation>
+ </message>
+ <message>
+ <source>Logon group editor</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -732,60 +732,56 @@ The public key part is used on the client computers to verify that any incoming
<translation type="unfinished">Выход</translation>
</message>
<message>
- <source>iTALC Management Console</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>iTALC Server</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Сервер iTALC</translation>
</message>
<message>
<source>Paths</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Пути</translation>
</message>
<message>
<source>Authentication</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Аутентификация</translation>
</message>
<message>
<source>iTALC Service</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Сервис iTALC</translation>
</message>
<message>
<source>Hide tray icon</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Скрыть иконку в трее</translation>
</message>
<message>
<source>Autostart</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Автозапуск</translation>
</message>
<message>
<source>Additional arguments</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Дополнительные параметры</translation>
</message>
<message>
<source>Start service</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить сервис</translation>
</message>
<message>
<source>Stop service</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Остановить сервис</translation>
</message>
<message>
<source>State:</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Состояние:</translation>
</message>
<message>
<source>Stopped</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Остановлен</translation>
</message>
<message>
<source>Logging</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Ведение журнала</translation>
</message>
<message>
<source>Log file directory</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Каталог, содержащий файл журнала</translation>
</message>
<message>
<source>...</source>
@@ -793,95 +789,91 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>Log level</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Уровень журналирования</translation>
</message>
<message>
<source>Nothing</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Отключить журналирование</translation>
</message>
<message>
<source>Only critical messages</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Только критические ошибки</translation>
</message>
<message>
<source>Errors and critical messages</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Все ошибки</translation>
</message>
<message>
<source>Warnings and errors</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Предупреждения и ошибки</translation>
</message>
<message>
<source>Information, warnings and errors</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Информационные сообщения, предупреждения и ошибки</translation>
</message>
<message>
<source>Debug messages and everything else</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Все сообщения вместе с отладочной информацией</translation>
</message>
<message>
<source>Limit log file size</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Ограничить размер файла журнала</translation>
</message>
<message>
<source>MB</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Мб</translation>
</message>
<message>
<source>Clear all log files</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Очистить все файлы журналов</translation>
</message>
<message>
<source>Desktop capturing</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Захват рабочего стола</translation>
</message>
<message>
<source>Enable capturing of layered (semi-transparent) windows</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Poll full screen</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Включить захват с помощью полупрозрачного окна</translation>
</message>
<message>
<source>Low accuracy (turbo mode)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Низкая четкость (высокая скорость)</translation>
</message>
<message>
<source>Demo server</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Демонстрационный сервер</translation>
</message>
<message>
<source>Network</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Сеть</translation>
</message>
<message>
<source>Core server port</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Основной порт сервера</translation>
</message>
<message>
<source>Demo server port</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Порт демонстрационного сервера</translation>
</message>
<message>
<source>Enable firewall exception</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Включить исключения рандмауэра</translation>
</message>
<message>
<source>Configuration files</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Конфигурационные файлы</translation>
</message>
<message>
<source>Global configuration</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Общие настройки</translation>
</message>
<message>
<source>Personal configuration</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Персональные настройки</translation>
</message>
<message>
<source>Data directories</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Каталоги с данными</translation>
</message>
<message>
<source>Snapshots</source>
@@ -889,27 +881,27 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>Authentication methods</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Методы аутентификации</translation>
</message>
<message>
<source>Access key management</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Управление ключами доступа</translation>
</message>
<message>
<source>Logon settings</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Настройки входа в систему</translation>
</message>
<message>
<source>&File</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">&Файл</translation>
</message>
<message>
<source>&Help</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">&Помощь</translation>
</message>
<message>
<source>&Quit</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">&Выход</translation>
</message>
<message>
<source>Ctrl+Q</source>
@@ -917,11 +909,11 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>&Save settings into file</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">&Сохранить настройки в файл</translation>
</message>
<message>
<source>Save settings into file</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Сохранить настройки в файл</translation>
</message>
<message>
<source>Ctrl+S</source>
@@ -929,7 +921,7 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>L&oad settings from file</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Загрузить настройки из файла</translation>
</message>
<message>
<source>Ctrl+O</source>
@@ -937,11 +929,11 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>About iTALC</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">О программе iTALC</translation>
</message>
<message>
<source>About Qt</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">О пакете Qt</translation>
</message>
<message>
<source>MainWindow</source>
@@ -953,47 +945,47 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>iTALC Management Console %1</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Консоль управления iTALC %1</translation>
</message>
<message>
<source>Running</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Работает</translation>
</message>
<message>
<source>Load settings from file</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Загрузить настройки из файла</translation>
</message>
<message>
<source>XML files (*.xml)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Файлы XML (*.xml)</translation>
</message>
<message>
<source>Save settings to file</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Сохранить настройки в файл</translation>
</message>
<message>
<source>Unsaved settings</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Несохраненные настройки</translation>
</message>
<message>
<source>There are unsaved settings. Quit anyway?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Существуют несохраненные настройки. Выйти, не сохранив их?</translation>
</message>
<message>
<source>Configuration not writable</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Файл конфигурации не доступен для записи</translation>
</message>
<message>
<source>The local configuration backend reported that the configuration is not writable! Please run the iTALC Management Console with higher privileges.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Локальный сервер сообщил, что конфигурация защищена от записи. Запустите консоль управления iTALC с более высокими привилегиями.</translation>
</message>
<message>
<source>All settings were applied successfully.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Все настройки были успешно применены.</translation>
</message>
<message>
<source>An error occured while applying settings!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Ошибка в применении параметров!</translation>
</message>
<message>
<source>iTALC</source>
@@ -1001,7 +993,7 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>No write access</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Нет доступа на запись</translation>
</message>
<message>
<source>Could not read/write or create directory %1! For running iTALC, make sure you're permitted to create or write this directory.</source>
@@ -1117,7 +1109,7 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>Support</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Поддержка</translation>
</message>
<message>
<source>Direct support</source>
@@ -1161,31 +1153,31 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>Could not modify the autostart property for the iTALC Service.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Не удалось изменить настройки автозапуска службы iTALC.</translation>
</message>
<message>
<source>Could not modify the service arguments for the iTALC Service.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Не удалось изменить параметры для службы iTALC.</translation>
</message>
<message>
<source>Could not change the firewall configuration for the iTALC Service.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Невозможно изменить настройки брандмауэра для службы iTALC.</translation>
</message>
<message>
<source>Debugging</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Отладка</translation>
</message>
<message>
<source>Enable desktop switching for screen lock (experimental)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Включение переключения рабочего стола для блокировки экрана (экспериментальная функция)</translation>
</message>
<message>
<source>Log to standard error output</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Обычное журналирование</translation>
</message>
<message>
<source>Log to Windows event log</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Журналирование в системный журнал событий</translation>
</message>
<message>
<source>Backend</source>
@@ -1197,77 +1189,79 @@ The public key part is used on the client computers to verify that any incoming
</message>
<message>
<source>iTALC 1 demo server</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">iTALC 1 - демонстрационный сервер</translation>
</message>
<message>
<source>Multithreading (can be enabled when using the VNC reflector backend)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Многопоточность (может быть включена при использовании VNC reflector backend)</translation>
</message>
<message>
<source>Enable HTTP server which provides a JavaViewer applet</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Включить HTTP-сервер, предоставляющий апплет JavaViewer</translation>
</message>
<message>
<source>HTTP server port</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Порт HTTP-сервера</translation>
</message>
<message>
<source>Allow connections from localhost only</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Разрешить только локальные подключения</translation>
</message>
<message>
<source>Key file authentication</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Аутентификация с помощью ключа доступа</translation>
</message>
<message>
<source>ACL-based logon authentication</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Аутентификация с помощью списков доступа (ACL)</translation>
</message>
<message>
<source>Public key file base directory</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Каталог, содержащий открытые ключи</translation>
</message>
<message>
<source>Private key file base directory</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Каталог, содержащий закрытые ключи</translation>
</message>
<message>
<source>Launch key file assistant</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запустить помощник операций с ключем доступа</translation>
</message>
<message>
<source>Manage permissions</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Управление разрешениями</translation>
</message>
<message>
<source>Test</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Тестировать</translation>
</message>
<message>
<source>Access confirmation</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Подтверждение доступа</translation>
</message>
<message>
<source>You can configure iTALC to ask the user for permission to access the desktop when using certain authentication methods.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Вы можете настроить iTALC так, что он будет спрашивать у пользователя разрешение на доступ к рабочему столу, используя определенные методы аутентификации.</translation>
</message>
<message>
<source>Logon authentication</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Аутентификация при входе в систему</translation>
</message>
<message>
<source>Allow same user to access desktop without confirmation</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Предоставить пользователю доступ к рабочему столу без повторного подтверждения</translation>
</message>
<message>
<source>Debugging iTALC</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Отладка iTALC</translation>
</message>
<message>
<source>When encountering bugs or other misbehaviour in iTALC it is important to inform the developers about them, so that the bugs can be fixed in future releases. This page allows you to submit a helpful bug report easily.
If the bug is not reproducible, skip step 1) - 3).</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">При возникновении ошибки или другого неожиданного поведения iTALC желательно сообщить об этом разработчикам. В этом случае ошибки могут быть исправлены в будущих версиях. На этой странице можно создать отчет об ошибке.
+
+Если ошибка повторно не воспроизводится, пропустите шаг 1) - 3).</translation>
</message>
<message>
<source>1)</source>
@@ -1275,7 +1269,7 @@ If the bug is not reproducible, skip step 1) - 3).</source>
</message>
<message>
<source>Clear the logfiles in the "General" section.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Очистите файлы журналов в разделе "Общие настройки".</translation>
</message>
<message>
<source>2)</source>
@@ -1283,7 +1277,7 @@ If the bug is not reproducible, skip step 1) - 3).</source>
</message>
<message>
<source>In the "General" section set the log level to "Debug messages and everything else".</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">В разделе "Общие настройки" установите уровень журналирования в "Все сообщения вместе с отладочной информацией".</translation>
</message>
<message>
<source>3)</source>
@@ -1291,7 +1285,7 @@ If the bug is not reproducible, skip step 1) - 3).</source>
</message>
<message>
<source>Repeat the actions leading to the bug or misbehaviour.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Повторите действия, ведущие к ошибке или неправильному поведению программы.</translation>
</message>
<message>
<source>4)</source>
@@ -1299,11 +1293,11 @@ If the bug is not reproducible, skip step 1) - 3).</source>
</message>
<message>
<source>Click the following button and save the file to a known location.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Нажмите следующую кнопку и сохраните файл</translation>
</message>
<message>
<source>Generate bug report archive</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Создать архив, содержащий отчет об ошибке</translation>
</message>
<message>
<source>5)</source>
@@ -1314,23 +1308,26 @@ If the bug is not reproducible, skip step 1) - 3).</source>
<br/>
<br/>
Note: if the bug involves both a master and client computer, attach bug report archives for both computers.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Откройте <a href="http://sourceforge.net/tracker/?group_id=132465&atid=724375">трекер ошибок iTALC</a>, откройте новую запись с ошибкой, опишите шаги, приводящие к ней (шаг 3) и прикрепите файл с отладочной информацией (шаг 4).</p>
+<br/>
+<br/>
+Замечание: Если ошибка возникает на главном комьютере и клиентском компьютере одновременно, отправьте оба отчета об ошибке.</translation>
</message>
<message>
<source>Restart iTALC Service</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Перезапуск сервиса iTALC</translation>
</message>
<message>
<source>All settings were saved successfully. In order to take effect the iTALC service needs to be restarted. Restart it now?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Все настройки были успешно сохранены. Для того чтобы они вступили в силу необходимо перезапустить службу iTALC. Перезапустить ее сейчас?</translation>
</message>
<message>
<source>Starting iTALC service</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Запуск сервиса iTALC</translation>
</message>
<message>
<source>Stopping iTALC service</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Остановка сервиса iTALC</translation>
</message>
<message>
<source>The iTALC service needs to be stopped temporarily in order to remove the log files. Continue?</source>
@@ -1338,43 +1335,43 @@ Note: if the bug involves both a master and client computer, attach bug report a
</message>
<message>
<source>Log files cleared</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Файлы журналов были очищены</translation>
</message>
<message>
<source>All log files were cleared successfully.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Все файлы журналов были успешно очищены.</translation>
</message>
<message>
<source>Error</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Ошибка</translation>
</message>
<message>
<source>Could not remove all log files.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Невозможно удалить все файлы журналов.</translation>
</message>
<message>
<source>Logon authentication test</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Тестирования аутентификации входа в систему</translation>
</message>
<message>
<source>Authentication with provided credentials was successful.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Аутентификация учетных данных прошла успешно.</translation>
</message>
<message>
<source>Authentication with provided credentials failed!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">При прохождении аутентификации учетных данных возникли ошибки!</translation>
</message>
<message>
<source>Save bug report archive</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Сохранить архив, содрежащий отчет об ошибках</translation>
</message>
<message>
<source>iTALC bug report archive (*.ibra.xml)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Архив отчета об ошибках iTALC (*.ibra.xml)</translation>
</message>
<message>
<source>iTALC bug report archive saved</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Архив, содержащий отчет об ошибках iTALC, сохранен</translation>
</message>
<message>
<source>An iTALC bug report archive has been saved to %1. It includes iTALC log files and information about your operating system. You can attach it to a bug report.</source>
@@ -1382,18 +1379,26 @@ Note: if the bug involves both a master and client computer, attach bug report a
</message>
<message>
<source>Could not contact iTALC service</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Невозможно соединиться с сервисом iTALC</translation>
</message>
<message>
<source>Could not contact the local iTALC service. It is likely that you entered wrong credentials or key files are not set up properly. Try again or contact your administrator for solving this problem using the iTALC Management Console.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Невозможно соединиться с локальным сервисом iTALC. Возможно, Вы неправильно указали учетные данные или не установили файлы, содержащие ключи доступа. Попробуйте повторить попытку соединения. В случае, если ошибка повториться вновь, обратитесь к Вашему администратору для ее решения с помощью консоли управления iTALC.</translation>
</message>
<message>
<source>Authentication impossible</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Невозможно выполнить аутентификацию</translation>
</message>
<message>
<source>No authentication key files were found or your current ones are outdated. Please create new key files using the iTALC Management Console. Alternatively set up logon authentication using the iTALC Management Console. Otherwise you won't be able to access computers using iTALC.</source>
+ <translation type="unfinished">Не найдены файлы ключей аутентификации или они устарели. Пожалуйста, создайте новые файлы, используя консоль управления iTALC. Иначе Вы не сможете получить доступ к компьютерам с помощью iTALC.</translation>
+ </message>
+ <message>
+ <source>iTALC Management Console</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Poll full screen (leave this enabled per default)</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1434,7 +1439,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>About iTALC</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">О программе iTALC</translation>
</message>
</context>
<context>
@@ -1452,7 +1457,7 @@ p, li { white-space: pre-wrap; }
<name>PasswordDialog</name>
<message>
<source>Please enter your username and password in order to access iTALC clients.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Пожалуйста, введите имя пользователя и пароль для доступа клиентских компьютеров к iTALC.</translation>
</message>
<message>
<source>Username</source>
@@ -1464,6 +1469,10 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>iTALC Logon</source>
+ <translation type="unfinished">Вход в систему iTALC</translation>
+ </message>
+ <message>
+ <source>Manage</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1526,11 +1535,11 @@ p, li { white-space: pre-wrap; }
<name>RemoteControlWidget</name>
<message>
<source>View live (%1 @ %2)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Живой просмотр (%1 @ %2)</translation>
</message>
<message>
<source>Remote control (%1 @ %2)</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Удаленное управление (%1 @ %2)</translation>
</message>
<message>
<source>unknown user</source>
@@ -1588,7 +1597,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Use the fields below to enter the username, password and optional the domain name. These information will be used to logon the computer(s).</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Используйте приведенные ниже поля для ввода имени пользователя, пароля и необязательного названия домена. Эта информация будет использована для входа в систему(ы).</translation>
</message>
<message>
<source>Username</source>
@@ -1607,11 +1616,11 @@ p, li { white-space: pre-wrap; }
<name>RunCommandsDialog</name>
<message>
<source>Run commands</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Выполнить команды</translation>
</message>
<message>
<source>Please enter the commands to run on the selected client(s). You can separate multiple commands by line.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Пожалуйста, введите команды для их выполнения на выбранных клиентских компьютерах. Вы можете записать несколько команд, по одной в строке.</translation>
</message>
</context>
<context>
@@ -1670,22 +1679,22 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Show</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Показать</translation>
</message>
<message>
<source>Delete</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Удалить</translation>
</message>
</context>
<context>
<name>SupportDialog</name>
<message>
<source>Support</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Поддержка</translation>
</message>
<message>
<source>Please enter the IP address or the name of the host to which you want to connect.</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Пожалуйста, введите IP-адрес или имя хоста, к которому вы хотите подключиться.</translation>
</message>
</context>
<context>
diff --git a/lib/src/3rdparty/XEventLog.cpp b/lib/src/3rdparty/XEventLog.cpp
index 4f4b1a4..ae3a654 100644
--- a/lib/src/3rdparty/XEventLog.cpp
+++ b/lib/src/3rdparty/XEventLog.cpp
@@ -65,11 +65,9 @@ CXEventLog::CXEventLog(LPCTSTR lpszApp /* = NULL*/,
m_hEventLog = NULL;
m_pszAppName = NULL;
- BOOL bRet = FALSE;
-
// open event log
if (lpszApp && (lpszApp[0] != _T('\0')))
- bRet = Init(lpszApp, lpszEventMessageDll);
+ Init(lpszApp, lpszEventMessageDll);
}
///////////////////////////////////////////////////////////////////////////////
diff --git a/lib/src/AboutDialog.cpp b/lib/src/AboutDialog.cpp
index 5135898..17ff08b 100644
--- a/lib/src/AboutDialog.cpp
+++ b/lib/src/AboutDialog.cpp
@@ -1,7 +1,7 @@
/*
* AboutDialog.cpp - implementation of AboutDialog
*
- * Copyright (c) 2011 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
+ * Copyright (c) 2011-2013 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
*
* This file is part of iTALC - http://italc.sourceforge.net
*
diff --git a/lib/src/DecoratedMessageBox.cpp b/lib/src/DecoratedMessageBox.cpp
index 95ac99e..e43cc9b 100644
--- a/lib/src/DecoratedMessageBox.cpp
+++ b/lib/src/DecoratedMessageBox.cpp
@@ -1,7 +1,7 @@
/*
* DecoratedMessageBox.cpp - simple message-box
*
- * Copyright (c) 2006-2010 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
+ * Copyright (c) 2006-2013 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
*
* This file is part of iTALC - http://italc.sourceforge.net
*
@@ -133,6 +133,8 @@ void DecoratedMessageBox::trySysTrayMessage( const QString & _title,
case Critical:
p = QPixmap( ":/resources/stop.png" );
break;
+
+ default: break;
}
new DecoratedMessageBox( _title, _msg, p );
diff --git a/lib/src/Ipc/QtSlaveLauncher.cpp b/lib/src/Ipc/QtSlaveLauncher.cpp
index dce5a78..9010c69 100644
--- a/lib/src/Ipc/QtSlaveLauncher.cpp
+++ b/lib/src/Ipc/QtSlaveLauncher.cpp
@@ -2,7 +2,7 @@
* QtSlaveLauncher.cpp - class Ipc::QtSlaveLauncher providing mechanisms for
* launching a slave application via QProcess
*
- * Copyright (c) 2010 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
+ * Copyright (c) 2010-2013 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
* Copyright (c) 2010 Univention GmbH
*
* This file is part of iTALC - http://italc.sourceforge.net
@@ -34,6 +34,10 @@
#include "ItalcConfiguration.h"
#include "Logger.h"
+#ifdef ITALC_BUILD_WIN32
+#include <windows.h>
+#endif
+
namespace Ipc
{
@@ -87,6 +91,13 @@ void QtSlaveLauncher::stop()
while( t.elapsed() < 5000 && m_process->state() != QProcess::NotRunning )
{
QCoreApplication::processEvents();
+#ifdef ITALC_BUILD_WIN32
+ // Silvio 2012-01-07: I don't know why this works and why this "Sleep" helps
+ // but after adding these two lines taskbar returns and screen unlocks almost
+ // instantly (before it took few seconds). Same is true for demo mode.
+ Sleep( 500 );
+ QCoreApplication::processEvents();
+#endif
}
if( m_process->state() != QProcess::NotRunning )
diff --git a/lib/src/ItalcCore.cpp b/lib/src/ItalcCore.cpp
index 84a415c..e1eddc5 100644
--- a/lib/src/ItalcCore.cpp
+++ b/lib/src/ItalcCore.cpp
@@ -157,6 +157,12 @@ bool ItalcCore::init()
#endif
QCoreApplication::installTranslator( qtTr );
+ if( QLocale::system().language() == QLocale::Hebrew ||
+ QLocale::system().language() == QLocale::Arabic )
+ {
+ QApplication::setLayoutDirection( Qt::RightToLeft );
+ }
+
config = new ItalcConfiguration( ItalcConfiguration::defaultConfiguration() );
*config += ItalcConfiguration( Configuration::Store::LocalBackend );
diff --git a/lib/src/ItalcCoreConnection.cpp b/lib/src/ItalcCoreConnection.cpp
index f619e0c..76ab24b 100644
--- a/lib/src/ItalcCoreConnection.cpp
+++ b/lib/src/ItalcCoreConnection.cpp
@@ -132,10 +132,12 @@ bool ItalcCoreConnection::handleServerMessage( rfbClient *cl, uint8_t msg )
{
m_user = m.arg( "username" );
m_userHomeDir = m.arg( "homedir" );
+ emit receivedUserInfo( m_user, m_userHomeDir );
}
else if( m.cmd() == ItalcCore::ReportSlaveStateFlags )
{
m_slaveStateFlags = m.arg( "slavestateflags" ).toInt();
+ emit receivedSlaveStateFlags( m_slaveStateFlags );
}
// TODO: plugin hook
else
diff --git a/lib/src/ItalcVncConnection.cpp b/lib/src/ItalcVncConnection.cpp
index 363b5ff..e147892 100644
--- a/lib/src/ItalcVncConnection.cpp
+++ b/lib/src/ItalcVncConnection.cpp
@@ -1,7 +1,7 @@
/*
* ItalcVncConnection.cpp - implementation of ItalcVncConnection class
*
- * Copyright (c) 2008-2010 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
+ * Copyright (c) 2008-2013 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
*
* This file is part of iTALC - http://italc.sourceforge.net
*
@@ -42,8 +42,6 @@
extern "C" void rfbClientEncryptBytes2( unsigned char *where, const int length, unsigned char *key );
-static QString outputErrorMessageString;
-
class KeyClientEvent : public ClientEvent
@@ -93,18 +91,18 @@ private:
class ClientCutEvent : public ClientEvent
{
public:
- ClientCutEvent( char *text ) :
- m_text( text )
+ ClientCutEvent( const QString& text ) :
+ m_text( text.toUtf8() )
{
}
virtual void fire( rfbClient *cl )
{
- SendClientCutText( cl, m_text, qstrlen( m_text ) );
+ SendClientCutText( cl, m_text.constData(), m_text.size() );
}
private:
- char * m_text;
+ QByteArray m_text;
} ;
@@ -297,6 +295,7 @@ void ItalcVncConnection::hookOutputHandler( const char *format, ... )
message = message.trimmed();
ilog( Warning, "ItalcVncConnection: " + message );
+#if 0
if( ( message.contains( "Couldn't convert " ) ) ||
( message.contains( "Unable to connect to VNC server" ) ) )
{
@@ -321,6 +320,7 @@ void ItalcVncConnection::hookOutputHandler( const char *format, ... )
// internal messages, not displayed to user
if (message.contains("VNC server supports protocol version 3.889")) // see http://bugs.kde.org/162640
outputErrorMessageString = "INTERNAL:APPLE_VNC_COMPATIBILTY";
+#endif
}
@@ -356,18 +356,6 @@ ItalcVncConnection::~ItalcVncConnection()
-void ItalcVncConnection::checkOutputErrorMessage()
-{
- if( !outputErrorMessageString.isEmpty() )
- {
-// QString errorMessage = outputErrorMessageString;
- outputErrorMessageString.clear();
- }
-}
-
-
-
-
void ItalcVncConnection::stop()
{
if( isRunning() )
@@ -513,6 +501,7 @@ void ItalcVncConnection::rescaleScreen()
void ItalcVncConnection::run()
{
m_state = Disconnected;
+ emit stateChanged( m_state );
m_stopped = false;
rfbClientLog = hookOutputHandler;
@@ -563,12 +552,13 @@ void ItalcVncConnection::doConnection()
emit newClient( m_cl );
- int argc;
+ int argc = 0;
if( rfbInitClient( m_cl, &argc, NULL ) )
{
emit connected();
m_state = Connected;
+ emit stateChanged( m_state );
if( m_framebufferUpdateInterval < 0 )
{
rfbClientSetClientData( m_cl, (void *) 0x555, (void *) 1 );
@@ -581,15 +571,18 @@ void ItalcVncConnection::doConnection()
if( argc < 0 )
{
m_state = HostUnreachable;
+ emit stateChanged( m_state );
}
else if( argc > 0 )
{
m_state = AuthenticationFailed;
+ emit stateChanged( m_state );
}
else
{
// failed for an unknown reason
m_state = ConnectionFailed;
+ emit stateChanged( m_state );
}
// do not sleep when already requested to stop
@@ -614,7 +607,7 @@ void ItalcVncConnection::doConnection()
}
}
- QTime lastFullUpdate = QTime::currentTime();
+ //QTime lastFullUpdate = QTime::currentTime();
// Main VNC event loop
while( !m_stopped )
@@ -625,18 +618,21 @@ void ItalcVncConnection::doConnection()
timeout = 100*1000; // 100 ms
}
const int i = WaitForMessage( m_cl, timeout );
- if( i < 0 )
+ if( m_stopped || i < 0 )
{
break;
}
else if( i )
{
- // read and process remaining messages many messages as available
+ // handle all available messages
bool handledOkay = true;
- while( WaitForMessage( m_cl, 0 ) && handledOkay )
- {
- handledOkay = HandleRFBServerMessage( m_cl );
- }
+ do {
+ if( !HandleRFBServerMessage( m_cl ) )
+ {
+ handledOkay = false;
+ }
+ } while( handledOkay && WaitForMessage( m_cl, 0 ) );
+
if( handledOkay == false )
{
break;
@@ -691,6 +687,7 @@ void ItalcVncConnection::doConnection()
}
m_state = Disconnected;
+ emit stateChanged( m_state );
}
@@ -728,7 +725,7 @@ void ItalcVncConnection::keyEvent( unsigned int key, bool pressed )
void ItalcVncConnection::clientCut( const QString &text )
{
- enqueueEvent( new ClientCutEvent( strdup( text.toUtf8() ) ) );
+ enqueueEvent( new ClientCutEvent( text ) );
}
diff --git a/lib/src/LocalSystem.cpp b/lib/src/LocalSystem.cpp
index fd40609..467cb98 100644
--- a/lib/src/LocalSystem.cpp
+++ b/lib/src/LocalSystem.cpp
@@ -2,7 +2,7 @@
* LocalSystem.cpp - namespace LocalSystem, providing an interface for
* transparent usage of operating-system-specific functions
*
- * Copyright (c) 2006-2011 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
+ * Copyright (c) 2006-2012 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
*
* This file is part of iTALC - http://italc.sourceforge.net
*
@@ -69,6 +69,10 @@ QString windowsConfigPath( int _type )
#endif
+#ifdef ITALC_HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
#ifdef ITALC_HAVE_PWD_H
#include <pwd.h>
#endif
diff --git a/lib/src/PasswordDialog.cpp b/lib/src/PasswordDialog.cpp
index e57e3e7..fb74729 100644
--- a/lib/src/PasswordDialog.cpp
+++ b/lib/src/PasswordDialog.cpp
@@ -24,6 +24,8 @@
#include <italcconfig.h>
+#include <QtCore/QDir>
+#include <QtCore/QProcess>
#include <QtGui/QPushButton>
#include "PasswordDialog.h"
@@ -98,3 +100,12 @@ void PasswordDialog::updateOkButton()
setEnabled( !username().isEmpty() && !password().isEmpty() );
}
+
+
+void PasswordDialog::manage()
+{
+ QProcess::startDetached( QCoreApplication::applicationDirPath() +
+ QDir::separator() + "imc",
+ QStringList( "-manageACLs" ) );
+}
+
diff --git a/lib/src/SystemKeyTrapper.cpp b/lib/src/SystemKeyTrapper.cpp
index 1e3c4d0..0d3d3e2 100644
--- a/lib/src/SystemKeyTrapper.cpp
+++ b/lib/src/SystemKeyTrapper.cpp
@@ -2,7 +2,7 @@
* SystemKeyTrapper.cpp - class for trapping system-keys and -key-sequences
* such as Alt+Ctrl+Del, Alt+Tab etc.
*
- * Copyright (c) 2006-2011 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
+ * Copyright (c) 2006-2013 Tobias Doerffel <tobydox/at/users/dot/sf/dot/net>
*
* This file is part of iTALC - http://italc.sourceforge.net
*
@@ -147,10 +147,6 @@ void enableStickyKeys( bool _enable )
{
if( _enable )
{
- STICKYKEYS sk = settings_sk;
- TOGGLEKEYS tk = settings_tk;
- FILTERKEYS fk = settings_fk;
-
SystemParametersInfo( SPI_SETSTICKYKEYS, sizeof( STICKYKEYS ),
&settings_sk, 0 );
SystemParametersInfo( SPI_SETTOGGLEKEYS, sizeof( TOGGLEKEYS ),
@@ -221,13 +217,13 @@ void SystemKeyTrapper::setTaskBarHidden( bool on )
if( on )
{
EnableWindow( FindWindow( "Shell_traywnd", NULL ), false );
- ShowWindow( FindWindow( "Shell_traywnd", NULL ), SW_HIDE );
-
+ //ShowWindow( FindWindow( "Shell_traywnd", NULL ), SW_HIDE );
}
else
{
EnableWindow( FindWindow( "Shell_traywnd", NULL ), true );
- ShowWindow( FindWindow( "Shell_traywnd", NULL ), SW_NORMAL );
+ // causes hang on Win7
+ //ShowWindow( FindWindow( "Shell_traywnd", NULL ), SW_NORMAL );
}
#endif
}
hooks/post-receive
--
italc.git (Debian package italc)
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "italc.git" (Debian package italc).
More information about the debian-edu-commits
mailing list