From 79a18152064005d9d3a4ef51c8ce5a35728cd2b8 Mon Sep 17 00:00:00 2001 From: Nick Bolton Date: Tue, 4 Sep 2012 02:16:45 +0000 Subject: [PATCH] removed experimental vnc --- src/CMakeLists.txt | 4 - src/vnc/CMakeLists.txt | 23 - src/vnc/LICENCE.txt | 340 --- src/vnc/common/CMakeLists.txt | 20 - src/vnc/common/Makefile.in | 4 - src/vnc/common/Xregion/CMakeLists.txt | 36 - src/vnc/common/Xregion/Makefile.in | 15 - src/vnc/common/Xregion/Region.c | 1687 ------------ src/vnc/common/Xregion/Xregion.h | 220 -- src/vnc/common/Xregion/region.h | 190 -- src/vnc/common/boilerplate.mk | 35 - src/vnc/common/configure | 2344 ----------------- src/vnc/common/configure.in | 99 - src/vnc/common/depend.mk | 76 - src/vnc/common/javabin/index.vnc | 13 - src/vnc/common/javabin/logo150x150.gif | Bin 3584 -> 0 bytes src/vnc/common/javabin/vncviewer.jar | Bin 104689 -> 0 bytes src/vnc/common/network/CMakeLists.txt | 35 - src/vnc/common/network/Makefile.in | 17 - src/vnc/common/network/Socket.h | 147 -- src/vnc/common/network/TcpSocket.cxx | 467 ---- src/vnc/common/network/TcpSocket.h | 99 - src/vnc/common/rdr/CMakeLists.txt | 58 - src/vnc/common/rdr/Exception.cxx | 73 - src/vnc/common/rdr/Exception.h | 58 - src/vnc/common/rdr/FdInStream.cxx | 283 -- src/vnc/common/rdr/FdInStream.h | 77 - src/vnc/common/rdr/FdOutStream.cxx | 174 -- src/vnc/common/rdr/FdOutStream.h | 56 - src/vnc/common/rdr/FixedMemOutStream.h | 52 - src/vnc/common/rdr/HexInStream.cxx | 117 - src/vnc/common/rdr/HexInStream.h | 50 - src/vnc/common/rdr/HexOutStream.cxx | 110 - src/vnc/common/rdr/HexOutStream.h | 51 - src/vnc/common/rdr/InStream.cxx | 35 - src/vnc/common/rdr/InStream.h | 153 -- src/vnc/common/rdr/Makefile.in | 19 - src/vnc/common/rdr/MemInStream.h | 63 - src/vnc/common/rdr/MemOutStream.h | 83 - src/vnc/common/rdr/OutStream.h | 152 -- src/vnc/common/rdr/RandomStream.cxx | 130 - src/vnc/common/rdr/RandomStream.h | 63 - src/vnc/common/rdr/SubstitutingInStream.h | 102 - src/vnc/common/rdr/ZlibInStream.cxx | 125 - src/vnc/common/rdr/ZlibInStream.h | 59 - src/vnc/common/rdr/ZlibOutStream.cxx | 140 - src/vnc/common/rdr/ZlibOutStream.h | 57 - src/vnc/common/rdr/types.h | 66 - src/vnc/common/rfb/Blacklist.cxx | 86 - src/vnc/common/rfb/Blacklist.h | 91 - src/vnc/common/rfb/CConnection.cxx | 276 -- src/vnc/common/rfb/CConnection.h | 183 -- src/vnc/common/rfb/CMakeLists.txt | 162 -- src/vnc/common/rfb/CMsgHandler.cxx | 99 - src/vnc/common/rfb/CMsgHandler.h | 69 - src/vnc/common/rfb/CMsgReader.cxx | 160 -- src/vnc/common/rfb/CMsgReader.h | 73 - src/vnc/common/rfb/CMsgReaderV3.cxx | 95 - src/vnc/common/rfb/CMsgReaderV3.h | 35 - src/vnc/common/rfb/CMsgWriter.cxx | 126 - src/vnc/common/rfb/CMsgWriter.h | 65 - src/vnc/common/rfb/CMsgWriterV3.cxx | 49 - src/vnc/common/rfb/CMsgWriterV3.h | 35 - src/vnc/common/rfb/CSecurity.h | 52 - src/vnc/common/rfb/CSecurityNone.h | 36 - src/vnc/common/rfb/CSecurityVncAuth.cxx | 74 - src/vnc/common/rfb/CSecurityVncAuth.h | 39 - src/vnc/common/rfb/ColourCube.h | 96 - src/vnc/common/rfb/ColourMap.h | 36 - src/vnc/common/rfb/ComparingUpdateTracker.cxx | 137 - src/vnc/common/rfb/ComparingUpdateTracker.h | 43 - src/vnc/common/rfb/Configuration.cxx | 446 ---- src/vnc/common/rfb/Configuration.h | 260 -- src/vnc/common/rfb/ConnParams.cxx | 105 - src/vnc/common/rfb/ConnParams.h | 86 - src/vnc/common/rfb/Cursor.cxx | 179 -- src/vnc/common/rfb/Cursor.h | 56 - src/vnc/common/rfb/Decoder.cxx | 68 - src/vnc/common/rfb/Decoder.h | 52 - src/vnc/common/rfb/Encoder.cxx | 75 - src/vnc/common/rfb/Encoder.h | 57 - src/vnc/common/rfb/Exception.h | 37 - src/vnc/common/rfb/HTTPServer.cxx | 412 --- src/vnc/common/rfb/HTTPServer.h | 110 - src/vnc/common/rfb/HextileDecoder.cxx | 59 - src/vnc/common/rfb/HextileDecoder.h | 35 - src/vnc/common/rfb/HextileEncoder.cxx | 61 - src/vnc/common/rfb/HextileEncoder.h | 35 - src/vnc/common/rfb/Hostname.h | 55 - src/vnc/common/rfb/ImageGetter.h | 30 - src/vnc/common/rfb/InputHandler.h | 40 - src/vnc/common/rfb/KeyRemapper.cxx | 84 - src/vnc/common/rfb/KeyRemapper.h | 39 - src/vnc/common/rfb/LogWriter.cxx | 137 - src/vnc/common/rfb/LogWriter.h | 106 - src/vnc/common/rfb/Logger.cxx | 118 - src/vnc/common/rfb/Logger.h | 70 - src/vnc/common/rfb/Logger_file.cxx | 127 - src/vnc/common/rfb/Logger_file.h | 51 - src/vnc/common/rfb/Logger_stdio.cxx | 32 - src/vnc/common/rfb/Logger_stdio.h | 39 - src/vnc/common/rfb/Makefile.in | 68 - src/vnc/common/rfb/Password.cxx | 77 - src/vnc/common/rfb/Password.h | 46 - src/vnc/common/rfb/Pixel.h | 26 - src/vnc/common/rfb/PixelBuffer.cxx | 309 --- src/vnc/common/rfb/PixelBuffer.h | 172 -- src/vnc/common/rfb/PixelFormat.cxx | 240 -- src/vnc/common/rfb/PixelFormat.h | 58 - src/vnc/common/rfb/RREDecoder.cxx | 58 - src/vnc/common/rfb/RREDecoder.h | 35 - src/vnc/common/rfb/RREEncoder.cxx | 75 - src/vnc/common/rfb/RREEncoder.h | 37 - src/vnc/common/rfb/RawDecoder.cxx | 55 - src/vnc/common/rfb/RawDecoder.h | 35 - src/vnc/common/rfb/RawEncoder.cxx | 59 - src/vnc/common/rfb/RawEncoder.h | 35 - src/vnc/common/rfb/Rect.h | 116 - src/vnc/common/rfb/Region.cxx | 250 -- src/vnc/common/rfb/Region.h | 84 - src/vnc/common/rfb/SConnection.cxx | 322 --- src/vnc/common/rfb/SConnection.h | 193 -- src/vnc/common/rfb/SDesktop.h | 121 - src/vnc/common/rfb/SMsgHandler.cxx | 52 - src/vnc/common/rfb/SMsgHandler.h | 62 - src/vnc/common/rfb/SMsgReader.cxx | 99 - src/vnc/common/rfb/SMsgReader.h | 56 - src/vnc/common/rfb/SMsgReaderV3.cxx | 58 - src/vnc/common/rfb/SMsgReaderV3.h | 32 - src/vnc/common/rfb/SMsgWriter.cxx | 175 -- src/vnc/common/rfb/SMsgWriter.h | 153 -- src/vnc/common/rfb/SMsgWriterV3.cxx | 169 -- src/vnc/common/rfb/SMsgWriterV3.h | 54 - src/vnc/common/rfb/SSecurity.h | 84 - .../common/rfb/SSecurityFactoryStandard.cxx | 128 - src/vnc/common/rfb/SSecurityFactoryStandard.h | 68 - src/vnc/common/rfb/SSecurityNone.h | 36 - src/vnc/common/rfb/SSecurityVncAuth.cxx | 88 - src/vnc/common/rfb/SSecurityVncAuth.h | 55 - src/vnc/common/rfb/ServerCore.cxx | 82 - src/vnc/common/rfb/ServerCore.h | 53 - src/vnc/common/rfb/Threading.h | 31 - src/vnc/common/rfb/Timer.cxx | 176 -- src/vnc/common/rfb/Timer.h | 102 - src/vnc/common/rfb/TransImageGetter.cxx | 278 -- src/vnc/common/rfb/TransImageGetter.h | 104 - src/vnc/common/rfb/TrueColourMap.h | 42 - src/vnc/common/rfb/UpdateTracker.cxx | 156 -- src/vnc/common/rfb/UpdateTracker.h | 103 - src/vnc/common/rfb/UserPasswdGetter.h | 30 - src/vnc/common/rfb/VNCSConnectionST.cxx | 623 ----- src/vnc/common/rfb/VNCSConnectionST.h | 165 -- src/vnc/common/rfb/VNCServer.h | 86 - src/vnc/common/rfb/VNCServerST.cxx | 419 --- src/vnc/common/rfb/VNCServerST.h | 227 -- src/vnc/common/rfb/ZRLEDecoder.cxx | 91 - src/vnc/common/rfb/ZRLEDecoder.h | 37 - src/vnc/common/rfb/ZRLEEncoder.cxx | 122 - src/vnc/common/rfb/ZRLEEncoder.h | 54 - src/vnc/common/rfb/d3des.c | 434 --- src/vnc/common/rfb/d3des.h | 51 - src/vnc/common/rfb/encodings.cxx | 46 - src/vnc/common/rfb/encodings.h | 38 - src/vnc/common/rfb/hextileConstants.h | 27 - src/vnc/common/rfb/hextileDecode.h | 126 - src/vnc/common/rfb/hextileEncode.h | 247 -- src/vnc/common/rfb/keysymdef.h | 1595 ----------- src/vnc/common/rfb/msgTypes.h | 39 - src/vnc/common/rfb/rreDecode.h | 64 - src/vnc/common/rfb/rreEncode.h | 164 -- src/vnc/common/rfb/secTypes.cxx | 71 - src/vnc/common/rfb/secTypes.h | 54 - src/vnc/common/rfb/transInitTempl.h | 254 -- src/vnc/common/rfb/transTempl.h | 151 -- src/vnc/common/rfb/util.cxx | 78 - src/vnc/common/rfb/util.h | 98 - src/vnc/common/rfb/zrleDecode.h | 253 -- src/vnc/common/rfb/zrleEncode.h | 328 --- src/vnc/common/zlib/CMakeLists.txt | 53 - src/vnc/common/zlib/ChangeLog | 481 ---- src/vnc/common/zlib/FAQ | 100 - src/vnc/common/zlib/INDEX | 86 - src/vnc/common/zlib/Make_vms.com | 115 - src/vnc/common/zlib/Makefile.in | 175 -- src/vnc/common/zlib/Makefile.riscos | 151 -- src/vnc/common/zlib/README | 147 -- src/vnc/common/zlib/adler32.c | 48 - src/vnc/common/zlib/algorithm.txt | 213 -- src/vnc/common/zlib/compress.c | 68 - src/vnc/common/zlib/configure | 212 -- src/vnc/common/zlib/crc32.c | 162 -- src/vnc/common/zlib/deflate.c | 1350 ---------- src/vnc/common/zlib/deflate.h | 318 --- src/vnc/common/zlib/descrip.mms | 48 - src/vnc/common/zlib/example.c | 556 ---- src/vnc/common/zlib/gzio.c | 875 ------ src/vnc/common/zlib/infblock.c | 403 --- src/vnc/common/zlib/infblock.h | 39 - src/vnc/common/zlib/infcodes.c | 251 -- src/vnc/common/zlib/infcodes.h | 27 - src/vnc/common/zlib/inffast.c | 183 -- src/vnc/common/zlib/inffast.h | 17 - src/vnc/common/zlib/inffixed.h | 151 -- src/vnc/common/zlib/inflate.c | 366 --- src/vnc/common/zlib/inftrees.c | 454 ---- src/vnc/common/zlib/inftrees.h | 58 - src/vnc/common/zlib/infutil.c | 87 - src/vnc/common/zlib/infutil.h | 98 - src/vnc/common/zlib/maketree.c | 85 - src/vnc/common/zlib/minigzip.c | 324 --- src/vnc/common/zlib/trees.c | 1214 --------- src/vnc/common/zlib/trees.h | 128 - src/vnc/common/zlib/uncompr.c | 58 - src/vnc/common/zlib/zconf.h | 279 -- src/vnc/common/zlib/zlib.3 | 107 - src/vnc/common/zlib/zlib.h | 893 ------- src/vnc/common/zlib/zlib.html | 971 ------- src/vnc/common/zlib/zutil.c | 225 -- src/vnc/common/zlib/zutil.h | 220 -- src/vnc/unix/Makefile.in | 4 - src/vnc/unix/README | 289 -- src/vnc/unix/README.hpux_aCC | 41 - src/vnc/unix/README.hpux_gcc | 63 - src/vnc/unix/boilerplate.mk | 35 - src/vnc/unix/cleanDeps | 3 - src/vnc/unix/common.mk | 2 - src/vnc/unix/configure | 2261 ---------------- src/vnc/unix/configure.in | 82 - src/vnc/unix/depend.mk | 76 - src/vnc/unix/hpux_aCC.patch | 255 -- src/vnc/unix/hpux_gcc.patch | 255 -- src/vnc/unix/tx/Makefile.in | 17 - src/vnc/unix/tx/TXButton.h | 124 - src/vnc/unix/tx/TXCheckbox.h | 142 - src/vnc/unix/tx/TXDialog.h | 96 - src/vnc/unix/tx/TXEntry.h | 188 -- src/vnc/unix/tx/TXImage.cxx | 340 --- src/vnc/unix/tx/TXImage.h | 89 - src/vnc/unix/tx/TXLabel.h | 126 - src/vnc/unix/tx/TXMenu.cxx | 186 -- src/vnc/unix/tx/TXMenu.h | 67 - src/vnc/unix/tx/TXMsgBox.h | 112 - src/vnc/unix/tx/TXScrollbar.cxx | 119 - src/vnc/unix/tx/TXScrollbar.h | 82 - src/vnc/unix/tx/TXViewport.cxx | 155 -- src/vnc/unix/tx/TXViewport.h | 77 - src/vnc/unix/tx/TXWindow.cxx | 486 ---- src/vnc/unix/tx/TXWindow.h | 211 -- src/vnc/unix/vncconfig/Makefile.in | 24 - src/vnc/unix/vncconfig/QueryConnectDialog.cxx | 88 - src/vnc/unix/vncconfig/QueryConnectDialog.h | 56 - src/vnc/unix/vncconfig/buildtime.c | 18 - src/vnc/unix/vncconfig/vncExt.c | 384 --- src/vnc/unix/vncconfig/vncExt.h | 343 --- src/vnc/unix/vncconfig/vncconfig.cxx | 438 --- src/vnc/unix/vncconfig/vncconfig.man | 127 - src/vnc/unix/vncinstall | 97 - src/vnc/unix/vncmkdepend/Makefile | 4 - src/vnc/unix/vncmkdepend/README | 39 - src/vnc/unix/vncmkdepend/cppsetup.c | 242 -- src/vnc/unix/vncmkdepend/def.h | 140 - src/vnc/unix/vncmkdepend/ifparser.c | 445 ---- src/vnc/unix/vncmkdepend/ifparser.h | 76 - src/vnc/unix/vncmkdepend/include.c | 312 --- src/vnc/unix/vncmkdepend/main.c | 593 ----- src/vnc/unix/vncmkdepend/parse.c | 568 ---- src/vnc/unix/vncmkdepend/pr.c | 130 - src/vnc/unix/vncpasswd/Makefile.in | 18 - src/vnc/unix/vncpasswd/vncpasswd.cxx | 138 - src/vnc/unix/vncpasswd/vncpasswd.man | 42 - src/vnc/unix/vncserver | 570 ---- src/vnc/unix/vncserver.man | 120 - src/vnc/unix/vncviewer/AboutDialog.h | 37 - src/vnc/unix/vncviewer/CConn.cxx | 681 ----- src/vnc/unix/vncviewer/CConn.h | 130 - src/vnc/unix/vncviewer/DesktopWindow.cxx | 571 ---- src/vnc/unix/vncviewer/DesktopWindow.h | 129 - src/vnc/unix/vncviewer/InfoDialog.h | 60 - src/vnc/unix/vncviewer/Makefile.in | 25 - src/vnc/unix/vncviewer/OptionsDialog.h | 168 -- src/vnc/unix/vncviewer/PasswdDialog.h | 72 - src/vnc/unix/vncviewer/ServerDialog.h | 91 - src/vnc/unix/vncviewer/buildtime.c | 18 - src/vnc/unix/vncviewer/parameters.h | 44 - src/vnc/unix/vncviewer/vncviewer.cxx | 262 -- src/vnc/unix/vncviewer/vncviewer.man | 190 -- src/vnc/unix/x0vncserver/Image.cxx | 150 -- src/vnc/unix/x0vncserver/Image.h | 48 - src/vnc/unix/x0vncserver/Makefile.in | 25 - src/vnc/unix/x0vncserver/buildtime.c | 18 - src/vnc/unix/x0vncserver/x0vncserver.cxx | 363 --- src/vnc/unix/x0vncserver/x0vncserver.man | 32 - src/vnc/unix/xc.patch | 191 -- src/vnc/unix/xc/config/cf/host.def | 1 - src/vnc/unix/xc/config/cf/vnc.def | 35 - src/vnc/unix/xc/programs/Xserver/Xvnc.man | 283 -- .../unix/xc/programs/Xserver/vnc/Imakefile | 45 - .../xc/programs/Xserver/vnc/RegionHelper.h | 84 - .../xc/programs/Xserver/vnc/XserverDesktop.cc | 1152 -------- .../xc/programs/Xserver/vnc/XserverDesktop.h | 130 - .../xc/programs/Xserver/vnc/Xvnc/Imakefile | 78 - .../xc/programs/Xserver/vnc/Xvnc/buildtime.c | 18 - .../unix/xc/programs/Xserver/vnc/Xvnc/xvnc.cc | 1218 --------- .../xc/programs/Xserver/vnc/module/Imakefile | 61 - .../xc/programs/Xserver/vnc/vncExtInit.cc | 866 ------ .../unix/xc/programs/Xserver/vnc/vncExtInit.h | 32 - .../unix/xc/programs/Xserver/vnc/vncHooks.cc | 1475 ----------- .../unix/xc/programs/Xserver/vnc/vncHooks.h | 26 - .../xc/programs/Xserver/vnc/xf86vncModule.cc | 97 - src/vnc/win/CMakeLists.txt | 19 - src/vnc/win/logmessages/messages.h | 47 - src/vnc/win/logmessages/messages.mc | 7 - src/vnc/win/logmessages/messages.rc | 2 - src/vnc/win/rfb_win32/AboutDialog.cxx | 49 - src/vnc/win/rfb_win32/AboutDialog.h | 55 - src/vnc/win/rfb_win32/BitmapInfo.h | 48 - src/vnc/win/rfb_win32/CKeyboard.cxx | 260 -- src/vnc/win/rfb_win32/CKeyboard.h | 51 - src/vnc/win/rfb_win32/CMakeLists.txt | 119 - src/vnc/win/rfb_win32/CPointer.cxx | 186 -- src/vnc/win/rfb_win32/CPointer.h | 74 - src/vnc/win/rfb_win32/CleanDesktop.cxx | 323 --- src/vnc/win/rfb_win32/CleanDesktop.h | 57 - src/vnc/win/rfb_win32/Clipboard.cxx | 200 -- src/vnc/win/rfb_win32/Clipboard.h | 66 - src/vnc/win/rfb_win32/CompatibleBitmap.h | 46 - src/vnc/win/rfb_win32/ComputerName.h | 40 - src/vnc/win/rfb_win32/CurrentUser.cxx | 152 -- src/vnc/win/rfb_win32/CurrentUser.h | 100 - src/vnc/win/rfb_win32/DIBSectionBuffer.cxx | 222 -- src/vnc/win/rfb_win32/DIBSectionBuffer.h | 85 - src/vnc/win/rfb_win32/DeviceContext.cxx | 188 -- src/vnc/win/rfb_win32/DeviceContext.h | 86 - src/vnc/win/rfb_win32/DeviceFrameBuffer.cxx | 289 -- src/vnc/win/rfb_win32/DeviceFrameBuffer.h | 106 - src/vnc/win/rfb_win32/Dialog.cxx | 391 --- src/vnc/win/rfb_win32/Dialog.h | 158 -- src/vnc/win/rfb_win32/DynamicFn.cxx | 45 - src/vnc/win/rfb_win32/DynamicFn.h | 51 - src/vnc/win/rfb_win32/EventManager.cxx | 103 - src/vnc/win/rfb_win32/EventManager.h | 77 - src/vnc/win/rfb_win32/Handle.h | 43 - src/vnc/win/rfb_win32/IconInfo.h | 44 - src/vnc/win/rfb_win32/IntervalTimer.h | 70 - src/vnc/win/rfb_win32/LaunchProcess.cxx | 103 - src/vnc/win/rfb_win32/LaunchProcess.h | 71 - src/vnc/win/rfb_win32/LocalMem.h | 45 - src/vnc/win/rfb_win32/LogicalPalette.h | 90 - src/vnc/win/rfb_win32/LowLevelKeyEvents.cxx | 96 - src/vnc/win/rfb_win32/LowLevelKeyEvents.h | 49 - src/vnc/win/rfb_win32/ModuleFileName.h | 40 - src/vnc/win/rfb_win32/MonitorInfo.cxx | 207 -- src/vnc/win/rfb_win32/MonitorInfo.h | 72 - src/vnc/win/rfb_win32/MsgBox.h | 63 - src/vnc/win/rfb_win32/MsgWindow.cxx | 116 - src/vnc/win/rfb_win32/MsgWindow.h | 53 - src/vnc/win/rfb_win32/OSVersion.cxx | 47 - src/vnc/win/rfb_win32/OSVersion.h | 53 - src/vnc/win/rfb_win32/RegConfig.cxx | 114 - src/vnc/win/rfb_win32/RegConfig.h | 84 - src/vnc/win/rfb_win32/Registry.cxx | 316 --- src/vnc/win/rfb_win32/Registry.h | 112 - src/vnc/win/rfb_win32/SDisplay.cxx | 525 ---- src/vnc/win/rfb_win32/SDisplay.h | 163 -- src/vnc/win/rfb_win32/SDisplayCoreDriver.h | 52 - src/vnc/win/rfb_win32/SDisplayCorePolling.cxx | 81 - src/vnc/win/rfb_win32/SDisplayCorePolling.h | 75 - src/vnc/win/rfb_win32/SDisplayCoreWMHooks.cxx | 74 - src/vnc/win/rfb_win32/SDisplayCoreWMHooks.h | 68 - src/vnc/win/rfb_win32/SInput.cxx | 468 ---- src/vnc/win/rfb_win32/SInput.h | 68 - src/vnc/win/rfb_win32/Security.cxx | 192 -- src/vnc/win/rfb_win32/Security.h | 123 - src/vnc/win/rfb_win32/Service.cxx | 645 ----- src/vnc/win/rfb_win32/Service.h | 128 - src/vnc/win/rfb_win32/SocketManager.cxx | 209 -- src/vnc/win/rfb_win32/SocketManager.h | 90 - src/vnc/win/rfb_win32/TCharArray.cxx | 85 - src/vnc/win/rfb_win32/TCharArray.h | 135 - src/vnc/win/rfb_win32/Threading.cxx | 151 -- src/vnc/win/rfb_win32/Threading.h | 154 -- src/vnc/win/rfb_win32/TrayIcon.h | 89 - src/vnc/win/rfb_win32/TsSessions.cxx | 93 - src/vnc/win/rfb_win32/TsSessions.h | 61 - src/vnc/win/rfb_win32/WMCursor.cxx | 104 - src/vnc/win/rfb_win32/WMCursor.h | 61 - src/vnc/win/rfb_win32/WMHooks.cxx | 395 --- src/vnc/win/rfb_win32/WMHooks.h | 92 - src/vnc/win/rfb_win32/WMNotifier.cxx | 57 - src/vnc/win/rfb_win32/WMNotifier.h | 68 - src/vnc/win/rfb_win32/WMPoller.cxx | 85 - src/vnc/win/rfb_win32/WMPoller.h | 62 - src/vnc/win/rfb_win32/WMShatter.cxx | 57 - src/vnc/win/rfb_win32/WMShatter.h | 50 - src/vnc/win/rfb_win32/WMWindowCopyRect.cxx | 67 - src/vnc/win/rfb_win32/WMWindowCopyRect.h | 53 - src/vnc/win/rfb_win32/Win32Util.cxx | 114 - src/vnc/win/rfb_win32/Win32Util.h | 55 - src/vnc/win/rfb_win32/keymap.h | 149 -- src/vnc/win/vnc.suo | Bin 26624 -> 0 bytes src/vnc/win/vncconfig/Authentication.h | 142 - src/vnc/win/vncconfig/Connections.h | 298 --- src/vnc/win/vncconfig/Desktop.h | 94 - src/vnc/win/vncconfig/Hooking.h | 88 - src/vnc/win/vncconfig/Inputs.h | 84 - src/vnc/win/vncconfig/Legacy.cxx | 248 -- src/vnc/win/vncconfig/Legacy.h | 85 - src/vnc/win/vncconfig/PasswordDialog.cxx | 52 - src/vnc/win/vncconfig/PasswordDialog.h | 40 - src/vnc/win/vncconfig/Sharing.h | 59 - src/vnc/win/vncconfig/resource.h | 102 - src/vnc/win/vncconfig/vncconfig.cxx | 191 -- src/vnc/win/vncconfig/vncconfig.exe.manifest | 22 - src/vnc/win/vncconfig/vncconfig.ico | Bin 6006 -> 0 bytes src/vnc/win/vncconfig/vncconfig.rc | 497 ---- src/vnc/win/vncviewer/CConn.cxx | 630 ----- src/vnc/win/vncviewer/CConn.h | 166 -- src/vnc/win/vncviewer/CConnOptions.cxx | 383 --- src/vnc/win/vncviewer/CConnOptions.h | 89 - src/vnc/win/vncviewer/CConnThread.cxx | 208 -- src/vnc/win/vncviewer/CConnThread.h | 63 - src/vnc/win/vncviewer/CMakeLists.txt | 58 - src/vnc/win/vncviewer/ConnectingDialog.cxx | 160 -- src/vnc/win/vncviewer/ConnectingDialog.h | 65 - src/vnc/win/vncviewer/ConnectionDialog.cxx | 79 - src/vnc/win/vncviewer/ConnectionDialog.h | 52 - src/vnc/win/vncviewer/DesktopWindow.cxx | 948 ------- src/vnc/win/vncviewer/DesktopWindow.h | 238 -- src/vnc/win/vncviewer/InfoDialog.cxx | 65 - src/vnc/win/vncviewer/InfoDialog.h | 48 - src/vnc/win/vncviewer/ListenServer.h | 56 - src/vnc/win/vncviewer/ListenTrayIcon.h | 95 - src/vnc/win/vncviewer/MRU.h | 133 - src/vnc/win/vncviewer/OptionsDialog.cxx | 309 --- src/vnc/win/vncviewer/OptionsDialog.h | 48 - src/vnc/win/vncviewer/UserPasswdDialog.cxx | 85 - src/vnc/win/vncviewer/UserPasswdDialog.h | 58 - src/vnc/win/vncviewer/buildTime.cxx | 18 - src/vnc/win/vncviewer/cursor1.cur | Bin 326 -> 0 bytes src/vnc/win/vncviewer/resource.h | 86 - src/vnc/win/vncviewer/vncviewer.bmp | Bin 2006 -> 0 bytes src/vnc/win/vncviewer/vncviewer.cxx | 300 --- src/vnc/win/vncviewer/vncviewer.exe.manifest | 22 - src/vnc/win/vncviewer/vncviewer.h | 20 - src/vnc/win/vncviewer/vncviewer.ico | Bin 6006 -> 0 bytes src/vnc/win/vncviewer/vncviewer.rc | 531 ---- src/vnc/win/winvnc/AddNewClientDialog.h | 56 - src/vnc/win/winvnc/CMakeLists.txt | 55 - src/vnc/win/winvnc/JavaViewer.cxx | 98 - src/vnc/win/winvnc/JavaViewer.h | 55 - src/vnc/win/winvnc/ManagedListener.cxx | 94 - src/vnc/win/winvnc/ManagedListener.h | 57 - src/vnc/win/winvnc/QueryConnectDialog.cxx | 100 - src/vnc/win/winvnc/QueryConnectDialog.h | 60 - src/vnc/win/winvnc/STrayIcon.cxx | 246 -- src/vnc/win/winvnc/STrayIcon.h | 59 - src/vnc/win/winvnc/VNCServerService.cxx | 52 - src/vnc/win/winvnc/VNCServerService.h | 41 - src/vnc/win/winvnc/VNCServerWin32.cxx | 310 --- src/vnc/win/winvnc/VNCServerWin32.h | 124 - src/vnc/win/winvnc/buildTime.cxx | 18 - src/vnc/win/winvnc/connected.ico | Bin 6006 -> 0 bytes src/vnc/win/winvnc/resource.h | 38 - src/vnc/win/winvnc/winvnc.bmp | Bin 2018 -> 0 bytes src/vnc/win/winvnc/winvnc.cxx | 262 -- src/vnc/win/winvnc/winvnc.h | 18 - src/vnc/win/winvnc/winvnc.ico | Bin 6006 -> 0 bytes src/vnc/win/winvnc/winvnc.rc | 273 -- src/vnc/win/winvnc/winvnc4.exe.manifest | 22 - src/vnc/win/wm_hooks/CMakeLists.txt | 42 - src/vnc/win/wm_hooks/resource.h | 15 - src/vnc/win/wm_hooks/wm_hooks.aps | Bin 18964 -> 0 bytes src/vnc/win/wm_hooks/wm_hooks.cxx | 465 ---- src/vnc/win/wm_hooks/wm_hooks.def | 5 - src/vnc/win/wm_hooks/wm_hooks.h | 102 - src/vnc/win/wm_hooks/wm_hooks.rc | 109 - 476 files changed, 76670 deletions(-) delete mode 100644 src/vnc/CMakeLists.txt delete mode 100644 src/vnc/LICENCE.txt delete mode 100644 src/vnc/common/CMakeLists.txt delete mode 100644 src/vnc/common/Makefile.in delete mode 100644 src/vnc/common/Xregion/CMakeLists.txt delete mode 100644 src/vnc/common/Xregion/Makefile.in delete mode 100644 src/vnc/common/Xregion/Region.c delete mode 100644 src/vnc/common/Xregion/Xregion.h delete mode 100644 src/vnc/common/Xregion/region.h delete mode 100644 src/vnc/common/boilerplate.mk delete mode 100644 src/vnc/common/configure delete mode 100644 src/vnc/common/configure.in delete mode 100644 src/vnc/common/depend.mk delete mode 100644 src/vnc/common/javabin/index.vnc delete mode 100644 src/vnc/common/javabin/logo150x150.gif delete mode 100644 src/vnc/common/javabin/vncviewer.jar delete mode 100644 src/vnc/common/network/CMakeLists.txt delete mode 100644 src/vnc/common/network/Makefile.in delete mode 100644 src/vnc/common/network/Socket.h delete mode 100644 src/vnc/common/network/TcpSocket.cxx delete mode 100644 src/vnc/common/network/TcpSocket.h delete mode 100644 src/vnc/common/rdr/CMakeLists.txt delete mode 100644 src/vnc/common/rdr/Exception.cxx delete mode 100644 src/vnc/common/rdr/Exception.h delete mode 100644 src/vnc/common/rdr/FdInStream.cxx delete mode 100644 src/vnc/common/rdr/FdInStream.h delete mode 100644 src/vnc/common/rdr/FdOutStream.cxx delete mode 100644 src/vnc/common/rdr/FdOutStream.h delete mode 100644 src/vnc/common/rdr/FixedMemOutStream.h delete mode 100644 src/vnc/common/rdr/HexInStream.cxx delete mode 100644 src/vnc/common/rdr/HexInStream.h delete mode 100644 src/vnc/common/rdr/HexOutStream.cxx delete mode 100644 src/vnc/common/rdr/HexOutStream.h delete mode 100644 src/vnc/common/rdr/InStream.cxx delete mode 100644 src/vnc/common/rdr/InStream.h delete mode 100644 src/vnc/common/rdr/Makefile.in delete mode 100644 src/vnc/common/rdr/MemInStream.h delete mode 100644 src/vnc/common/rdr/MemOutStream.h delete mode 100644 src/vnc/common/rdr/OutStream.h delete mode 100644 src/vnc/common/rdr/RandomStream.cxx delete mode 100644 src/vnc/common/rdr/RandomStream.h delete mode 100644 src/vnc/common/rdr/SubstitutingInStream.h delete mode 100644 src/vnc/common/rdr/ZlibInStream.cxx delete mode 100644 src/vnc/common/rdr/ZlibInStream.h delete mode 100644 src/vnc/common/rdr/ZlibOutStream.cxx delete mode 100644 src/vnc/common/rdr/ZlibOutStream.h delete mode 100644 src/vnc/common/rdr/types.h delete mode 100644 src/vnc/common/rfb/Blacklist.cxx delete mode 100644 src/vnc/common/rfb/Blacklist.h delete mode 100644 src/vnc/common/rfb/CConnection.cxx delete mode 100644 src/vnc/common/rfb/CConnection.h delete mode 100644 src/vnc/common/rfb/CMakeLists.txt delete mode 100644 src/vnc/common/rfb/CMsgHandler.cxx delete mode 100644 src/vnc/common/rfb/CMsgHandler.h delete mode 100644 src/vnc/common/rfb/CMsgReader.cxx delete mode 100644 src/vnc/common/rfb/CMsgReader.h delete mode 100644 src/vnc/common/rfb/CMsgReaderV3.cxx delete mode 100644 src/vnc/common/rfb/CMsgReaderV3.h delete mode 100644 src/vnc/common/rfb/CMsgWriter.cxx delete mode 100644 src/vnc/common/rfb/CMsgWriter.h delete mode 100644 src/vnc/common/rfb/CMsgWriterV3.cxx delete mode 100644 src/vnc/common/rfb/CMsgWriterV3.h delete mode 100644 src/vnc/common/rfb/CSecurity.h delete mode 100644 src/vnc/common/rfb/CSecurityNone.h delete mode 100644 src/vnc/common/rfb/CSecurityVncAuth.cxx delete mode 100644 src/vnc/common/rfb/CSecurityVncAuth.h delete mode 100644 src/vnc/common/rfb/ColourCube.h delete mode 100644 src/vnc/common/rfb/ColourMap.h delete mode 100644 src/vnc/common/rfb/ComparingUpdateTracker.cxx delete mode 100644 src/vnc/common/rfb/ComparingUpdateTracker.h delete mode 100644 src/vnc/common/rfb/Configuration.cxx delete mode 100644 src/vnc/common/rfb/Configuration.h delete mode 100644 src/vnc/common/rfb/ConnParams.cxx delete mode 100644 src/vnc/common/rfb/ConnParams.h delete mode 100644 src/vnc/common/rfb/Cursor.cxx delete mode 100644 src/vnc/common/rfb/Cursor.h delete mode 100644 src/vnc/common/rfb/Decoder.cxx delete mode 100644 src/vnc/common/rfb/Decoder.h delete mode 100644 src/vnc/common/rfb/Encoder.cxx delete mode 100644 src/vnc/common/rfb/Encoder.h delete mode 100644 src/vnc/common/rfb/Exception.h delete mode 100644 src/vnc/common/rfb/HTTPServer.cxx delete mode 100644 src/vnc/common/rfb/HTTPServer.h delete mode 100644 src/vnc/common/rfb/HextileDecoder.cxx delete mode 100644 src/vnc/common/rfb/HextileDecoder.h delete mode 100644 src/vnc/common/rfb/HextileEncoder.cxx delete mode 100644 src/vnc/common/rfb/HextileEncoder.h delete mode 100644 src/vnc/common/rfb/Hostname.h delete mode 100644 src/vnc/common/rfb/ImageGetter.h delete mode 100644 src/vnc/common/rfb/InputHandler.h delete mode 100644 src/vnc/common/rfb/KeyRemapper.cxx delete mode 100644 src/vnc/common/rfb/KeyRemapper.h delete mode 100644 src/vnc/common/rfb/LogWriter.cxx delete mode 100644 src/vnc/common/rfb/LogWriter.h delete mode 100644 src/vnc/common/rfb/Logger.cxx delete mode 100644 src/vnc/common/rfb/Logger.h delete mode 100644 src/vnc/common/rfb/Logger_file.cxx delete mode 100644 src/vnc/common/rfb/Logger_file.h delete mode 100644 src/vnc/common/rfb/Logger_stdio.cxx delete mode 100644 src/vnc/common/rfb/Logger_stdio.h delete mode 100644 src/vnc/common/rfb/Makefile.in delete mode 100644 src/vnc/common/rfb/Password.cxx delete mode 100644 src/vnc/common/rfb/Password.h delete mode 100644 src/vnc/common/rfb/Pixel.h delete mode 100644 src/vnc/common/rfb/PixelBuffer.cxx delete mode 100644 src/vnc/common/rfb/PixelBuffer.h delete mode 100644 src/vnc/common/rfb/PixelFormat.cxx delete mode 100644 src/vnc/common/rfb/PixelFormat.h delete mode 100644 src/vnc/common/rfb/RREDecoder.cxx delete mode 100644 src/vnc/common/rfb/RREDecoder.h delete mode 100644 src/vnc/common/rfb/RREEncoder.cxx delete mode 100644 src/vnc/common/rfb/RREEncoder.h delete mode 100644 src/vnc/common/rfb/RawDecoder.cxx delete mode 100644 src/vnc/common/rfb/RawDecoder.h delete mode 100644 src/vnc/common/rfb/RawEncoder.cxx delete mode 100644 src/vnc/common/rfb/RawEncoder.h delete mode 100644 src/vnc/common/rfb/Rect.h delete mode 100644 src/vnc/common/rfb/Region.cxx delete mode 100644 src/vnc/common/rfb/Region.h delete mode 100644 src/vnc/common/rfb/SConnection.cxx delete mode 100644 src/vnc/common/rfb/SConnection.h delete mode 100644 src/vnc/common/rfb/SDesktop.h delete mode 100644 src/vnc/common/rfb/SMsgHandler.cxx delete mode 100644 src/vnc/common/rfb/SMsgHandler.h delete mode 100644 src/vnc/common/rfb/SMsgReader.cxx delete mode 100644 src/vnc/common/rfb/SMsgReader.h delete mode 100644 src/vnc/common/rfb/SMsgReaderV3.cxx delete mode 100644 src/vnc/common/rfb/SMsgReaderV3.h delete mode 100644 src/vnc/common/rfb/SMsgWriter.cxx delete mode 100644 src/vnc/common/rfb/SMsgWriter.h delete mode 100644 src/vnc/common/rfb/SMsgWriterV3.cxx delete mode 100644 src/vnc/common/rfb/SMsgWriterV3.h delete mode 100644 src/vnc/common/rfb/SSecurity.h delete mode 100644 src/vnc/common/rfb/SSecurityFactoryStandard.cxx delete mode 100644 src/vnc/common/rfb/SSecurityFactoryStandard.h delete mode 100644 src/vnc/common/rfb/SSecurityNone.h delete mode 100644 src/vnc/common/rfb/SSecurityVncAuth.cxx delete mode 100644 src/vnc/common/rfb/SSecurityVncAuth.h delete mode 100644 src/vnc/common/rfb/ServerCore.cxx delete mode 100644 src/vnc/common/rfb/ServerCore.h delete mode 100644 src/vnc/common/rfb/Threading.h delete mode 100644 src/vnc/common/rfb/Timer.cxx delete mode 100644 src/vnc/common/rfb/Timer.h delete mode 100644 src/vnc/common/rfb/TransImageGetter.cxx delete mode 100644 src/vnc/common/rfb/TransImageGetter.h delete mode 100644 src/vnc/common/rfb/TrueColourMap.h delete mode 100644 src/vnc/common/rfb/UpdateTracker.cxx delete mode 100644 src/vnc/common/rfb/UpdateTracker.h delete mode 100644 src/vnc/common/rfb/UserPasswdGetter.h delete mode 100644 src/vnc/common/rfb/VNCSConnectionST.cxx delete mode 100644 src/vnc/common/rfb/VNCSConnectionST.h delete mode 100644 src/vnc/common/rfb/VNCServer.h delete mode 100644 src/vnc/common/rfb/VNCServerST.cxx delete mode 100644 src/vnc/common/rfb/VNCServerST.h delete mode 100644 src/vnc/common/rfb/ZRLEDecoder.cxx delete mode 100644 src/vnc/common/rfb/ZRLEDecoder.h delete mode 100644 src/vnc/common/rfb/ZRLEEncoder.cxx delete mode 100644 src/vnc/common/rfb/ZRLEEncoder.h delete mode 100644 src/vnc/common/rfb/d3des.c delete mode 100644 src/vnc/common/rfb/d3des.h delete mode 100644 src/vnc/common/rfb/encodings.cxx delete mode 100644 src/vnc/common/rfb/encodings.h delete mode 100644 src/vnc/common/rfb/hextileConstants.h delete mode 100644 src/vnc/common/rfb/hextileDecode.h delete mode 100644 src/vnc/common/rfb/hextileEncode.h delete mode 100644 src/vnc/common/rfb/keysymdef.h delete mode 100644 src/vnc/common/rfb/msgTypes.h delete mode 100644 src/vnc/common/rfb/rreDecode.h delete mode 100644 src/vnc/common/rfb/rreEncode.h delete mode 100644 src/vnc/common/rfb/secTypes.cxx delete mode 100644 src/vnc/common/rfb/secTypes.h delete mode 100644 src/vnc/common/rfb/transInitTempl.h delete mode 100644 src/vnc/common/rfb/transTempl.h delete mode 100644 src/vnc/common/rfb/util.cxx delete mode 100644 src/vnc/common/rfb/util.h delete mode 100644 src/vnc/common/rfb/zrleDecode.h delete mode 100644 src/vnc/common/rfb/zrleEncode.h delete mode 100644 src/vnc/common/zlib/CMakeLists.txt delete mode 100644 src/vnc/common/zlib/ChangeLog delete mode 100644 src/vnc/common/zlib/FAQ delete mode 100644 src/vnc/common/zlib/INDEX delete mode 100644 src/vnc/common/zlib/Make_vms.com delete mode 100644 src/vnc/common/zlib/Makefile.in delete mode 100644 src/vnc/common/zlib/Makefile.riscos delete mode 100644 src/vnc/common/zlib/README delete mode 100644 src/vnc/common/zlib/adler32.c delete mode 100644 src/vnc/common/zlib/algorithm.txt delete mode 100644 src/vnc/common/zlib/compress.c delete mode 100644 src/vnc/common/zlib/configure delete mode 100644 src/vnc/common/zlib/crc32.c delete mode 100644 src/vnc/common/zlib/deflate.c delete mode 100644 src/vnc/common/zlib/deflate.h delete mode 100644 src/vnc/common/zlib/descrip.mms delete mode 100644 src/vnc/common/zlib/example.c delete mode 100644 src/vnc/common/zlib/gzio.c delete mode 100644 src/vnc/common/zlib/infblock.c delete mode 100644 src/vnc/common/zlib/infblock.h delete mode 100644 src/vnc/common/zlib/infcodes.c delete mode 100644 src/vnc/common/zlib/infcodes.h delete mode 100644 src/vnc/common/zlib/inffast.c delete mode 100644 src/vnc/common/zlib/inffast.h delete mode 100644 src/vnc/common/zlib/inffixed.h delete mode 100644 src/vnc/common/zlib/inflate.c delete mode 100644 src/vnc/common/zlib/inftrees.c delete mode 100644 src/vnc/common/zlib/inftrees.h delete mode 100644 src/vnc/common/zlib/infutil.c delete mode 100644 src/vnc/common/zlib/infutil.h delete mode 100644 src/vnc/common/zlib/maketree.c delete mode 100644 src/vnc/common/zlib/minigzip.c delete mode 100644 src/vnc/common/zlib/trees.c delete mode 100644 src/vnc/common/zlib/trees.h delete mode 100644 src/vnc/common/zlib/uncompr.c delete mode 100644 src/vnc/common/zlib/zconf.h delete mode 100644 src/vnc/common/zlib/zlib.3 delete mode 100644 src/vnc/common/zlib/zlib.h delete mode 100644 src/vnc/common/zlib/zlib.html delete mode 100644 src/vnc/common/zlib/zutil.c delete mode 100644 src/vnc/common/zlib/zutil.h delete mode 100644 src/vnc/unix/Makefile.in delete mode 100644 src/vnc/unix/README delete mode 100644 src/vnc/unix/README.hpux_aCC delete mode 100644 src/vnc/unix/README.hpux_gcc delete mode 100644 src/vnc/unix/boilerplate.mk delete mode 100644 src/vnc/unix/cleanDeps delete mode 100644 src/vnc/unix/common.mk delete mode 100644 src/vnc/unix/configure delete mode 100644 src/vnc/unix/configure.in delete mode 100644 src/vnc/unix/depend.mk delete mode 100644 src/vnc/unix/hpux_aCC.patch delete mode 100644 src/vnc/unix/hpux_gcc.patch delete mode 100644 src/vnc/unix/tx/Makefile.in delete mode 100644 src/vnc/unix/tx/TXButton.h delete mode 100644 src/vnc/unix/tx/TXCheckbox.h delete mode 100644 src/vnc/unix/tx/TXDialog.h delete mode 100644 src/vnc/unix/tx/TXEntry.h delete mode 100644 src/vnc/unix/tx/TXImage.cxx delete mode 100644 src/vnc/unix/tx/TXImage.h delete mode 100644 src/vnc/unix/tx/TXLabel.h delete mode 100644 src/vnc/unix/tx/TXMenu.cxx delete mode 100644 src/vnc/unix/tx/TXMenu.h delete mode 100644 src/vnc/unix/tx/TXMsgBox.h delete mode 100644 src/vnc/unix/tx/TXScrollbar.cxx delete mode 100644 src/vnc/unix/tx/TXScrollbar.h delete mode 100644 src/vnc/unix/tx/TXViewport.cxx delete mode 100644 src/vnc/unix/tx/TXViewport.h delete mode 100644 src/vnc/unix/tx/TXWindow.cxx delete mode 100644 src/vnc/unix/tx/TXWindow.h delete mode 100644 src/vnc/unix/vncconfig/Makefile.in delete mode 100644 src/vnc/unix/vncconfig/QueryConnectDialog.cxx delete mode 100644 src/vnc/unix/vncconfig/QueryConnectDialog.h delete mode 100644 src/vnc/unix/vncconfig/buildtime.c delete mode 100644 src/vnc/unix/vncconfig/vncExt.c delete mode 100644 src/vnc/unix/vncconfig/vncExt.h delete mode 100644 src/vnc/unix/vncconfig/vncconfig.cxx delete mode 100644 src/vnc/unix/vncconfig/vncconfig.man delete mode 100644 src/vnc/unix/vncinstall delete mode 100644 src/vnc/unix/vncmkdepend/Makefile delete mode 100644 src/vnc/unix/vncmkdepend/README delete mode 100644 src/vnc/unix/vncmkdepend/cppsetup.c delete mode 100644 src/vnc/unix/vncmkdepend/def.h delete mode 100644 src/vnc/unix/vncmkdepend/ifparser.c delete mode 100644 src/vnc/unix/vncmkdepend/ifparser.h delete mode 100644 src/vnc/unix/vncmkdepend/include.c delete mode 100644 src/vnc/unix/vncmkdepend/main.c delete mode 100644 src/vnc/unix/vncmkdepend/parse.c delete mode 100644 src/vnc/unix/vncmkdepend/pr.c delete mode 100644 src/vnc/unix/vncpasswd/Makefile.in delete mode 100644 src/vnc/unix/vncpasswd/vncpasswd.cxx delete mode 100644 src/vnc/unix/vncpasswd/vncpasswd.man delete mode 100644 src/vnc/unix/vncserver delete mode 100644 src/vnc/unix/vncserver.man delete mode 100644 src/vnc/unix/vncviewer/AboutDialog.h delete mode 100644 src/vnc/unix/vncviewer/CConn.cxx delete mode 100644 src/vnc/unix/vncviewer/CConn.h delete mode 100644 src/vnc/unix/vncviewer/DesktopWindow.cxx delete mode 100644 src/vnc/unix/vncviewer/DesktopWindow.h delete mode 100644 src/vnc/unix/vncviewer/InfoDialog.h delete mode 100644 src/vnc/unix/vncviewer/Makefile.in delete mode 100644 src/vnc/unix/vncviewer/OptionsDialog.h delete mode 100644 src/vnc/unix/vncviewer/PasswdDialog.h delete mode 100644 src/vnc/unix/vncviewer/ServerDialog.h delete mode 100644 src/vnc/unix/vncviewer/buildtime.c delete mode 100644 src/vnc/unix/vncviewer/parameters.h delete mode 100644 src/vnc/unix/vncviewer/vncviewer.cxx delete mode 100644 src/vnc/unix/vncviewer/vncviewer.man delete mode 100644 src/vnc/unix/x0vncserver/Image.cxx delete mode 100644 src/vnc/unix/x0vncserver/Image.h delete mode 100644 src/vnc/unix/x0vncserver/Makefile.in delete mode 100644 src/vnc/unix/x0vncserver/buildtime.c delete mode 100644 src/vnc/unix/x0vncserver/x0vncserver.cxx delete mode 100644 src/vnc/unix/x0vncserver/x0vncserver.man delete mode 100644 src/vnc/unix/xc.patch delete mode 100644 src/vnc/unix/xc/config/cf/host.def delete mode 100644 src/vnc/unix/xc/config/cf/vnc.def delete mode 100644 src/vnc/unix/xc/programs/Xserver/Xvnc.man delete mode 100644 src/vnc/unix/xc/programs/Xserver/vnc/Imakefile delete mode 100644 src/vnc/unix/xc/programs/Xserver/vnc/RegionHelper.h delete mode 100644 src/vnc/unix/xc/programs/Xserver/vnc/XserverDesktop.cc delete mode 100644 src/vnc/unix/xc/programs/Xserver/vnc/XserverDesktop.h delete mode 100644 src/vnc/unix/xc/programs/Xserver/vnc/Xvnc/Imakefile delete mode 100644 src/vnc/unix/xc/programs/Xserver/vnc/Xvnc/buildtime.c delete mode 100644 src/vnc/unix/xc/programs/Xserver/vnc/Xvnc/xvnc.cc delete mode 100644 src/vnc/unix/xc/programs/Xserver/vnc/module/Imakefile delete mode 100644 src/vnc/unix/xc/programs/Xserver/vnc/vncExtInit.cc delete mode 100644 src/vnc/unix/xc/programs/Xserver/vnc/vncExtInit.h delete mode 100644 src/vnc/unix/xc/programs/Xserver/vnc/vncHooks.cc delete mode 100644 src/vnc/unix/xc/programs/Xserver/vnc/vncHooks.h delete mode 100644 src/vnc/unix/xc/programs/Xserver/vnc/xf86vncModule.cc delete mode 100644 src/vnc/win/CMakeLists.txt delete mode 100644 src/vnc/win/logmessages/messages.h delete mode 100644 src/vnc/win/logmessages/messages.mc delete mode 100644 src/vnc/win/logmessages/messages.rc delete mode 100644 src/vnc/win/rfb_win32/AboutDialog.cxx delete mode 100644 src/vnc/win/rfb_win32/AboutDialog.h delete mode 100644 src/vnc/win/rfb_win32/BitmapInfo.h delete mode 100644 src/vnc/win/rfb_win32/CKeyboard.cxx delete mode 100644 src/vnc/win/rfb_win32/CKeyboard.h delete mode 100644 src/vnc/win/rfb_win32/CMakeLists.txt delete mode 100644 src/vnc/win/rfb_win32/CPointer.cxx delete mode 100644 src/vnc/win/rfb_win32/CPointer.h delete mode 100644 src/vnc/win/rfb_win32/CleanDesktop.cxx delete mode 100644 src/vnc/win/rfb_win32/CleanDesktop.h delete mode 100644 src/vnc/win/rfb_win32/Clipboard.cxx delete mode 100644 src/vnc/win/rfb_win32/Clipboard.h delete mode 100644 src/vnc/win/rfb_win32/CompatibleBitmap.h delete mode 100644 src/vnc/win/rfb_win32/ComputerName.h delete mode 100644 src/vnc/win/rfb_win32/CurrentUser.cxx delete mode 100644 src/vnc/win/rfb_win32/CurrentUser.h delete mode 100644 src/vnc/win/rfb_win32/DIBSectionBuffer.cxx delete mode 100644 src/vnc/win/rfb_win32/DIBSectionBuffer.h delete mode 100644 src/vnc/win/rfb_win32/DeviceContext.cxx delete mode 100644 src/vnc/win/rfb_win32/DeviceContext.h delete mode 100644 src/vnc/win/rfb_win32/DeviceFrameBuffer.cxx delete mode 100644 src/vnc/win/rfb_win32/DeviceFrameBuffer.h delete mode 100644 src/vnc/win/rfb_win32/Dialog.cxx delete mode 100644 src/vnc/win/rfb_win32/Dialog.h delete mode 100644 src/vnc/win/rfb_win32/DynamicFn.cxx delete mode 100644 src/vnc/win/rfb_win32/DynamicFn.h delete mode 100644 src/vnc/win/rfb_win32/EventManager.cxx delete mode 100644 src/vnc/win/rfb_win32/EventManager.h delete mode 100644 src/vnc/win/rfb_win32/Handle.h delete mode 100644 src/vnc/win/rfb_win32/IconInfo.h delete mode 100644 src/vnc/win/rfb_win32/IntervalTimer.h delete mode 100644 src/vnc/win/rfb_win32/LaunchProcess.cxx delete mode 100644 src/vnc/win/rfb_win32/LaunchProcess.h delete mode 100644 src/vnc/win/rfb_win32/LocalMem.h delete mode 100644 src/vnc/win/rfb_win32/LogicalPalette.h delete mode 100644 src/vnc/win/rfb_win32/LowLevelKeyEvents.cxx delete mode 100644 src/vnc/win/rfb_win32/LowLevelKeyEvents.h delete mode 100644 src/vnc/win/rfb_win32/ModuleFileName.h delete mode 100644 src/vnc/win/rfb_win32/MonitorInfo.cxx delete mode 100644 src/vnc/win/rfb_win32/MonitorInfo.h delete mode 100644 src/vnc/win/rfb_win32/MsgBox.h delete mode 100644 src/vnc/win/rfb_win32/MsgWindow.cxx delete mode 100644 src/vnc/win/rfb_win32/MsgWindow.h delete mode 100644 src/vnc/win/rfb_win32/OSVersion.cxx delete mode 100644 src/vnc/win/rfb_win32/OSVersion.h delete mode 100644 src/vnc/win/rfb_win32/RegConfig.cxx delete mode 100644 src/vnc/win/rfb_win32/RegConfig.h delete mode 100644 src/vnc/win/rfb_win32/Registry.cxx delete mode 100644 src/vnc/win/rfb_win32/Registry.h delete mode 100644 src/vnc/win/rfb_win32/SDisplay.cxx delete mode 100644 src/vnc/win/rfb_win32/SDisplay.h delete mode 100644 src/vnc/win/rfb_win32/SDisplayCoreDriver.h delete mode 100644 src/vnc/win/rfb_win32/SDisplayCorePolling.cxx delete mode 100644 src/vnc/win/rfb_win32/SDisplayCorePolling.h delete mode 100644 src/vnc/win/rfb_win32/SDisplayCoreWMHooks.cxx delete mode 100644 src/vnc/win/rfb_win32/SDisplayCoreWMHooks.h delete mode 100644 src/vnc/win/rfb_win32/SInput.cxx delete mode 100644 src/vnc/win/rfb_win32/SInput.h delete mode 100644 src/vnc/win/rfb_win32/Security.cxx delete mode 100644 src/vnc/win/rfb_win32/Security.h delete mode 100644 src/vnc/win/rfb_win32/Service.cxx delete mode 100644 src/vnc/win/rfb_win32/Service.h delete mode 100644 src/vnc/win/rfb_win32/SocketManager.cxx delete mode 100644 src/vnc/win/rfb_win32/SocketManager.h delete mode 100644 src/vnc/win/rfb_win32/TCharArray.cxx delete mode 100644 src/vnc/win/rfb_win32/TCharArray.h delete mode 100644 src/vnc/win/rfb_win32/Threading.cxx delete mode 100644 src/vnc/win/rfb_win32/Threading.h delete mode 100644 src/vnc/win/rfb_win32/TrayIcon.h delete mode 100644 src/vnc/win/rfb_win32/TsSessions.cxx delete mode 100644 src/vnc/win/rfb_win32/TsSessions.h delete mode 100644 src/vnc/win/rfb_win32/WMCursor.cxx delete mode 100644 src/vnc/win/rfb_win32/WMCursor.h delete mode 100644 src/vnc/win/rfb_win32/WMHooks.cxx delete mode 100644 src/vnc/win/rfb_win32/WMHooks.h delete mode 100644 src/vnc/win/rfb_win32/WMNotifier.cxx delete mode 100644 src/vnc/win/rfb_win32/WMNotifier.h delete mode 100644 src/vnc/win/rfb_win32/WMPoller.cxx delete mode 100644 src/vnc/win/rfb_win32/WMPoller.h delete mode 100644 src/vnc/win/rfb_win32/WMShatter.cxx delete mode 100644 src/vnc/win/rfb_win32/WMShatter.h delete mode 100644 src/vnc/win/rfb_win32/WMWindowCopyRect.cxx delete mode 100644 src/vnc/win/rfb_win32/WMWindowCopyRect.h delete mode 100644 src/vnc/win/rfb_win32/Win32Util.cxx delete mode 100644 src/vnc/win/rfb_win32/Win32Util.h delete mode 100644 src/vnc/win/rfb_win32/keymap.h delete mode 100644 src/vnc/win/vnc.suo delete mode 100644 src/vnc/win/vncconfig/Authentication.h delete mode 100644 src/vnc/win/vncconfig/Connections.h delete mode 100644 src/vnc/win/vncconfig/Desktop.h delete mode 100644 src/vnc/win/vncconfig/Hooking.h delete mode 100644 src/vnc/win/vncconfig/Inputs.h delete mode 100644 src/vnc/win/vncconfig/Legacy.cxx delete mode 100644 src/vnc/win/vncconfig/Legacy.h delete mode 100644 src/vnc/win/vncconfig/PasswordDialog.cxx delete mode 100644 src/vnc/win/vncconfig/PasswordDialog.h delete mode 100644 src/vnc/win/vncconfig/Sharing.h delete mode 100644 src/vnc/win/vncconfig/resource.h delete mode 100644 src/vnc/win/vncconfig/vncconfig.cxx delete mode 100644 src/vnc/win/vncconfig/vncconfig.exe.manifest delete mode 100644 src/vnc/win/vncconfig/vncconfig.ico delete mode 100644 src/vnc/win/vncconfig/vncconfig.rc delete mode 100644 src/vnc/win/vncviewer/CConn.cxx delete mode 100644 src/vnc/win/vncviewer/CConn.h delete mode 100644 src/vnc/win/vncviewer/CConnOptions.cxx delete mode 100644 src/vnc/win/vncviewer/CConnOptions.h delete mode 100644 src/vnc/win/vncviewer/CConnThread.cxx delete mode 100644 src/vnc/win/vncviewer/CConnThread.h delete mode 100644 src/vnc/win/vncviewer/CMakeLists.txt delete mode 100644 src/vnc/win/vncviewer/ConnectingDialog.cxx delete mode 100644 src/vnc/win/vncviewer/ConnectingDialog.h delete mode 100644 src/vnc/win/vncviewer/ConnectionDialog.cxx delete mode 100644 src/vnc/win/vncviewer/ConnectionDialog.h delete mode 100644 src/vnc/win/vncviewer/DesktopWindow.cxx delete mode 100644 src/vnc/win/vncviewer/DesktopWindow.h delete mode 100644 src/vnc/win/vncviewer/InfoDialog.cxx delete mode 100644 src/vnc/win/vncviewer/InfoDialog.h delete mode 100644 src/vnc/win/vncviewer/ListenServer.h delete mode 100644 src/vnc/win/vncviewer/ListenTrayIcon.h delete mode 100644 src/vnc/win/vncviewer/MRU.h delete mode 100644 src/vnc/win/vncviewer/OptionsDialog.cxx delete mode 100644 src/vnc/win/vncviewer/OptionsDialog.h delete mode 100644 src/vnc/win/vncviewer/UserPasswdDialog.cxx delete mode 100644 src/vnc/win/vncviewer/UserPasswdDialog.h delete mode 100644 src/vnc/win/vncviewer/buildTime.cxx delete mode 100644 src/vnc/win/vncviewer/cursor1.cur delete mode 100644 src/vnc/win/vncviewer/resource.h delete mode 100644 src/vnc/win/vncviewer/vncviewer.bmp delete mode 100644 src/vnc/win/vncviewer/vncviewer.cxx delete mode 100644 src/vnc/win/vncviewer/vncviewer.exe.manifest delete mode 100644 src/vnc/win/vncviewer/vncviewer.h delete mode 100644 src/vnc/win/vncviewer/vncviewer.ico delete mode 100644 src/vnc/win/vncviewer/vncviewer.rc delete mode 100644 src/vnc/win/winvnc/AddNewClientDialog.h delete mode 100644 src/vnc/win/winvnc/CMakeLists.txt delete mode 100644 src/vnc/win/winvnc/JavaViewer.cxx delete mode 100644 src/vnc/win/winvnc/JavaViewer.h delete mode 100644 src/vnc/win/winvnc/ManagedListener.cxx delete mode 100644 src/vnc/win/winvnc/ManagedListener.h delete mode 100644 src/vnc/win/winvnc/QueryConnectDialog.cxx delete mode 100644 src/vnc/win/winvnc/QueryConnectDialog.h delete mode 100644 src/vnc/win/winvnc/STrayIcon.cxx delete mode 100644 src/vnc/win/winvnc/STrayIcon.h delete mode 100644 src/vnc/win/winvnc/VNCServerService.cxx delete mode 100644 src/vnc/win/winvnc/VNCServerService.h delete mode 100644 src/vnc/win/winvnc/VNCServerWin32.cxx delete mode 100644 src/vnc/win/winvnc/VNCServerWin32.h delete mode 100644 src/vnc/win/winvnc/buildTime.cxx delete mode 100644 src/vnc/win/winvnc/connected.ico delete mode 100644 src/vnc/win/winvnc/resource.h delete mode 100644 src/vnc/win/winvnc/winvnc.bmp delete mode 100644 src/vnc/win/winvnc/winvnc.cxx delete mode 100644 src/vnc/win/winvnc/winvnc.h delete mode 100644 src/vnc/win/winvnc/winvnc.ico delete mode 100644 src/vnc/win/winvnc/winvnc.rc delete mode 100644 src/vnc/win/winvnc/winvnc4.exe.manifest delete mode 100644 src/vnc/win/wm_hooks/CMakeLists.txt delete mode 100644 src/vnc/win/wm_hooks/resource.h delete mode 100644 src/vnc/win/wm_hooks/wm_hooks.aps delete mode 100644 src/vnc/win/wm_hooks/wm_hooks.cxx delete mode 100644 src/vnc/win/wm_hooks/wm_hooks.def delete mode 100644 src/vnc/win/wm_hooks/wm_hooks.h delete mode 100644 src/vnc/win/wm_hooks/wm_hooks.rc diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c10dca62..4ee77129 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -21,7 +21,3 @@ if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "IRIX") endif() add_subdirectory(plugin) add_subdirectory(micro) - -if (VNC_SUPPORT) - add_subdirectory(vnc) -endif() diff --git a/src/vnc/CMakeLists.txt b/src/vnc/CMakeLists.txt deleted file mode 100644 index 56fce6da..00000000 --- a/src/vnc/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -# synergy -- mouse and keyboard sharing utility -# Copyright (C) 2012 Nick Bolton -# -# This package is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# found in the file COPYING that should have accompanied this file. -# -# This package 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, see . - - -if (WIN32) -add_subdirectory(common) - add_subdirectory(win) -elseif (UNIX) - #add_subdirectory(unix) -endif() - diff --git a/src/vnc/LICENCE.txt b/src/vnc/LICENCE.txt deleted file mode 100644 index ae3b5319..00000000 --- a/src/vnc/LICENCE.txt +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/src/vnc/common/CMakeLists.txt b/src/vnc/common/CMakeLists.txt deleted file mode 100644 index 2754c024..00000000 --- a/src/vnc/common/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -# synergy -- mouse and keyboard sharing utility -# Copyright (C) 2012 Nick Bolton -# -# This package is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# found in the file COPYING that should have accompanied this file. -# -# This package 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, see . - -add_subdirectory(rfb) -add_subdirectory(network) -add_subdirectory(rdr) -add_subdirectory(Xregion) -add_subdirectory(zlib) diff --git a/src/vnc/common/Makefile.in b/src/vnc/common/Makefile.in deleted file mode 100644 index b55d23e3..00000000 --- a/src/vnc/common/Makefile.in +++ /dev/null @@ -1,4 +0,0 @@ - -SUBDIRS = @ZLIB_DIR@ rdr network Xregion rfb - -# followed by boilerplate.mk diff --git a/src/vnc/common/Xregion/CMakeLists.txt b/src/vnc/common/Xregion/CMakeLists.txt deleted file mode 100644 index 3276ce35..00000000 --- a/src/vnc/common/Xregion/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -# synergy -- mouse and keyboard sharing utility -# Copyright (C) 2012 Nick Bolton -# -# This package is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# found in the file COPYING that should have accompanied this file. -# -# This package 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, see . - -set(inc - region.h - - Xregion.h -) - -set(src - Region.c -) - -if (WIN32) - list(APPEND src ${inc}) -endif() - -set(inc - .. - ../../win -) - -include_directories(${inc}) -add_library(vnc_Xregion STATIC ${src}) diff --git a/src/vnc/common/Xregion/Makefile.in b/src/vnc/common/Xregion/Makefile.in deleted file mode 100644 index 878a29b6..00000000 --- a/src/vnc/common/Xregion/Makefile.in +++ /dev/null @@ -1,15 +0,0 @@ - -SRCS = Region.c - -OBJS = $(SRCS:.c=.o) - -library = libXregion.a - -all:: $(library) - -$(library): $(OBJS) - rm -f $(library) - $(AR) $(library) $(OBJS) - $(RANLIB) $(library) - -# followed by boilerplate.mk diff --git a/src/vnc/common/Xregion/Region.c b/src/vnc/common/Xregion/Region.c deleted file mode 100644 index bf2d123b..00000000 --- a/src/vnc/common/Xregion/Region.c +++ /dev/null @@ -1,1687 +0,0 @@ -/* $Xorg: Region.c,v 1.6 2001/02/09 02:03:35 xorgcvs Exp $ */ -/************************************************************************ - -Copyright 1987, 1988, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall not be -used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from The Open Group. - - -Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Digital not be -used in advertising or publicity pertaining to distribution of the -software without specific, written prior permission. - -DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -************************************************************************/ -/* $XFree86: xc/lib/X11/Region.c,v 1.8 2001/12/14 19:54:05 dawes Exp $ */ -/* - * The functions in this file implement the Region abstraction, similar to one - * used in the X11 sample server. A Region is simply an area, as the name - * implies, and is implemented as a "y-x-banded" array of rectangles. To - * explain: Each Region is made up of a certain number of rectangles sorted - * by y coordinate first, and then by x coordinate. - * - * Furthermore, the rectangles are banded such that every rectangle with a - * given upper-left y coordinate (y1) will have the same lower-right y - * coordinate (y2) and vice versa. If a rectangle has scanlines in a band, it - * will span the entire vertical distance of the band. This means that some - * areas that could be merged into a taller rectangle will be represented as - * several shorter rectangles to account for shorter rectangles to its left - * or right but within its "vertical scope". - * - * An added constraint on the rectangles is that they must cover as much - * horizontal area as possible. E.g. no two rectangles in a band are allowed - * to touch. - * - * Whenever possible, bands will be merged together to cover a greater vertical - * distance (and thus reduce the number of rectangles). Two bands can be merged - * only if the bottom of one touches the top of the other and they have - * rectangles in the same places (of the same width, of course). This maintains - * the y-x-banding that's so nice to have... - */ - -#include "Xregion.h" -//#include "Xlibint.h" -//#include "Xutil.h" -#include "region.h" -//#include "poly.h" - -#ifdef DEBUG -#include -#define assert(expr) {if (!(expr)) fprintf(stderr,\ -"Assertion failed file %s, line %d: expr\n", __FILE__, __LINE__); } -#else -#define assert(expr) -#endif - -typedef void (*voidProcp)(); - -static void miRegionOp(); -/* Create a new empty region */ -Region -XCreateRegion() -{ - Region temp; - - if (! (temp = ( Region )Xmalloc( (unsigned) sizeof( REGION )))) - return (Region) NULL; - if (! (temp->rects = ( BOX * )Xmalloc( (unsigned) sizeof( BOX )))) { - Xfree((char *) temp); - return (Region) NULL; - } - temp->numRects = 0; - temp->extents.x1 = 0; - temp->extents.y1 = 0; - temp->extents.x2 = 0; - temp->extents.y2 = 0; - temp->size = 1; - return( temp ); -} - -int -XClipBox( r, rect ) - Region r; - XRectangle *rect; -{ - rect->x = r->extents.x1; - rect->y = r->extents.y1; - rect->width = r->extents.x2 - r->extents.x1; - rect->height = r->extents.y2 - r->extents.y1; - return 1; -} - -int -XUnionRectWithRegion(rect, source, dest) - register XRectangle *rect; - Region source, dest; -{ - REGION region; - - if (!rect->width || !rect->height) - return 0; - region.rects = ®ion.extents; - region.numRects = 1; - region.extents.x1 = rect->x; - region.extents.y1 = rect->y; - region.extents.x2 = rect->x + rect->width; - region.extents.y2 = rect->y + rect->height; - region.size = 1; - - return XUnionRegion(®ion, source, dest); -} - -/*- - *----------------------------------------------------------------------- - * miSetExtents -- - * Reset the extents of a region to what they should be. Called by - * miSubtract and miIntersect b/c they can't figure it out along the - * way or do so easily, as miUnion can. - * - * Results: - * None. - * - * Side Effects: - * The region's 'extents' structure is overwritten. - * - *----------------------------------------------------------------------- - */ -static void -miSetExtents (pReg) - Region pReg; -{ - register BoxPtr pBox, - pBoxEnd, - pExtents; - - if (pReg->numRects == 0) - { - pReg->extents.x1 = 0; - pReg->extents.y1 = 0; - pReg->extents.x2 = 0; - pReg->extents.y2 = 0; - return; - } - - pExtents = &pReg->extents; - pBox = pReg->rects; - pBoxEnd = &pBox[pReg->numRects - 1]; - - /* - * Since pBox is the first rectangle in the region, it must have the - * smallest y1 and since pBoxEnd is the last rectangle in the region, - * it must have the largest y2, because of banding. Initialize x1 and - * x2 from pBox and pBoxEnd, resp., as good things to initialize them - * to... - */ - pExtents->x1 = pBox->x1; - pExtents->y1 = pBox->y1; - pExtents->x2 = pBoxEnd->x2; - pExtents->y2 = pBoxEnd->y2; - - assert(pExtents->y1 < pExtents->y2); - while (pBox <= pBoxEnd) - { - if (pBox->x1 < pExtents->x1) - { - pExtents->x1 = pBox->x1; - } - if (pBox->x2 > pExtents->x2) - { - pExtents->x2 = pBox->x2; - } - pBox++; - } - assert(pExtents->x1 < pExtents->x2); -} - -extern void _XSetClipRectangles(); - -#if 0 -int -XSetRegion( dpy, gc, r ) - Display *dpy; - GC gc; - register Region r; -{ - register int i; - register XRectangle *xr, *pr; - register BOX *pb; - unsigned long total; - - LockDisplay (dpy); - total = r->numRects * sizeof (XRectangle); - if ((xr = (XRectangle *) _XAllocTemp(dpy, total))) { - for (pr = xr, pb = r->rects, i = r->numRects; --i >= 0; pr++, pb++) { - pr->x = pb->x1; - pr->y = pb->y1; - pr->width = pb->x2 - pb->x1; - pr->height = pb->y2 - pb->y1; - } - } - if (xr || !r->numRects) - _XSetClipRectangles(dpy, gc, 0, 0, xr, r->numRects, YXBanded); - if (xr) - _XFreeTemp(dpy, (char *)xr, total); - UnlockDisplay(dpy); - SyncHandle(); - return 1; -} -#endif - -int -XDestroyRegion( r ) - Region r; -{ - Xfree( (char *) r->rects ); - Xfree( (char *) r ); - return 1; -} - - -/* TranslateRegion(pRegion, x, y) - translates in place - added by raymond -*/ - -int -XOffsetRegion(pRegion, x, y) - register Region pRegion; - register int x; - register int y; -{ - register int nbox; - register BOX *pbox; - - pbox = pRegion->rects; - nbox = pRegion->numRects; - - while(nbox--) - { - pbox->x1 += x; - pbox->x2 += x; - pbox->y1 += y; - pbox->y2 += y; - pbox++; - } - pRegion->extents.x1 += x; - pRegion->extents.x2 += x; - pRegion->extents.y1 += y; - pRegion->extents.y2 += y; - return 1; -} - -/* - Utility procedure Compress: - Replace r by the region r', where - p in r' iff (Quantifer m <= dx) (p + m in r), and - Quantifier is Exists if grow is TRUE, For all if grow is FALSE, and - (x,y) + m = (x+m,y) if xdir is TRUE; (x,y+m) if xdir is FALSE. - - Thus, if xdir is TRUE and grow is FALSE, r is replaced by the region - of all points p such that p and the next dx points on the same - horizontal scan line are all in r. We do this using by noting - that p is the head of a run of length 2^i + k iff p is the head - of a run of length 2^i and p+2^i is the head of a run of length - k. Thus, the loop invariant: s contains the region corresponding - to the runs of length shift. r contains the region corresponding - to the runs of length 1 + dxo & (shift-1), where dxo is the original - value of dx. dx = dxo & ~(shift-1). As parameters, s and t are - scratch regions, so that we don't have to allocate them on every - call. -*/ - -#define ZOpRegion(a,b,c) if (grow) XUnionRegion(a,b,c); \ - else XIntersectRegion(a,b,c) -#define ZShiftRegion(a,b) if (xdir) XOffsetRegion(a,b,0); \ - else XOffsetRegion(a,0,b) -#define ZCopyRegion(a,b) XUnionRegion(a,a,b) - -static void -Compress(r, s, t, dx, xdir, grow) - Region r, s, t; - register unsigned dx; - register int xdir, grow; -{ - register unsigned shift = 1; - - ZCopyRegion(r, s); - while (dx) { - if (dx & shift) { - ZShiftRegion(r, -(int)shift); - ZOpRegion(r, s, r); - dx -= shift; - if (!dx) break; - } - ZCopyRegion(s, t); - ZShiftRegion(s, -(int)shift); - ZOpRegion(s, t, s); - shift <<= 1; - } -} - -#undef ZOpRegion -#undef ZShiftRegion -#undef ZCopyRegion - -int -XShrinkRegion(r, dx, dy) - Region r; - int dx, dy; -{ - Region s, t; - int grow; - - if (!dx && !dy) return 0; - if ((! (s = XCreateRegion())) || (! (t = XCreateRegion()))) return 0; - if ((grow = (dx < 0))) dx = -dx; - if (dx) Compress(r, s, t, (unsigned) 2*dx, TRUE, grow); - if ((grow = (dy < 0))) dy = -dy; - if (dy) Compress(r, s, t, (unsigned) 2*dy, FALSE, grow); - XOffsetRegion(r, dx, dy); - XDestroyRegion(s); - XDestroyRegion(t); - return 0; -} - -#ifdef notdef -/*********************************************************** - * Bop down the array of rects until we have passed - * scanline y. numRects is the size of the array. - ***********************************************************/ - -static BOX -*IndexRects(rects, numRects, y) - register BOX *rects; - register int numRects; - register int y; -{ - while ((numRects--) && (rects->y2 <= y)) - rects++; - return(rects); -} -#endif - -/*====================================================================== - * Region Intersection - *====================================================================*/ -/*- - *----------------------------------------------------------------------- - * miIntersectO -- - * Handle an overlapping band for miIntersect. - * - * Results: - * None. - * - * Side Effects: - * Rectangles may be added to the region. - * - *----------------------------------------------------------------------- - */ -/* static void*/ -static int -miIntersectO (pReg, r1, r1End, r2, r2End, y1, y2) - register Region pReg; - register BoxPtr r1; - BoxPtr r1End; - register BoxPtr r2; - BoxPtr r2End; - short y1; - short y2; -{ - register short x1; - register short x2; - register BoxPtr pNextRect; - - pNextRect = &pReg->rects[pReg->numRects]; - - while ((r1 != r1End) && (r2 != r2End)) - { - x1 = max(r1->x1,r2->x1); - x2 = min(r1->x2,r2->x2); - - /* - * If there's any overlap between the two rectangles, add that - * overlap to the new region. - * There's no need to check for subsumption because the only way - * such a need could arise is if some region has two rectangles - * right next to each other. Since that should never happen... - */ - if (x1 < x2) - { - assert(y1rects); - pNextRect->x1 = x1; - pNextRect->y1 = y1; - pNextRect->x2 = x2; - pNextRect->y2 = y2; - pReg->numRects += 1; - pNextRect++; - assert(pReg->numRects <= pReg->size); - } - - /* - * Need to advance the pointers. Shift the one that extends - * to the right the least, since the other still has a chance to - * overlap with that region's next rectangle, if you see what I mean. - */ - if (r1->x2 < r2->x2) - { - r1++; - } - else if (r2->x2 < r1->x2) - { - r2++; - } - else - { - r1++; - r2++; - } - } - return 0; /* lint */ -} - -int -XIntersectRegion(reg1, reg2, newReg) - Region reg1; - Region reg2; /* source regions */ - register Region newReg; /* destination Region */ -{ - /* check for trivial reject */ - if ( (!(reg1->numRects)) || (!(reg2->numRects)) || - (!EXTENTCHECK(®1->extents, ®2->extents))) - newReg->numRects = 0; - else - miRegionOp (newReg, reg1, reg2, - (voidProcp) miIntersectO, (voidProcp) NULL, (voidProcp) NULL); - - /* - * Can't alter newReg's extents before we call miRegionOp because - * it might be one of the source regions and miRegionOp depends - * on the extents of those regions being the same. Besides, this - * way there's no checking against rectangles that will be nuked - * due to coalescing, so we have to examine fewer rectangles. - */ - miSetExtents(newReg); - return 1; -} - -static void -miRegionCopy(dstrgn, rgn) - register Region dstrgn; - register Region rgn; - -{ - if (dstrgn != rgn) /* don't want to copy to itself */ - { - if (dstrgn->size < rgn->numRects) - { - if (dstrgn->rects) - { - BOX *prevRects = dstrgn->rects; - - if (! (dstrgn->rects = (BOX *) - Xrealloc((char *) dstrgn->rects, - (unsigned) rgn->numRects * (sizeof(BOX))))) { - Xfree(prevRects); - return; - } - } - dstrgn->size = rgn->numRects; - } - dstrgn->numRects = rgn->numRects; - dstrgn->extents.x1 = rgn->extents.x1; - dstrgn->extents.y1 = rgn->extents.y1; - dstrgn->extents.x2 = rgn->extents.x2; - dstrgn->extents.y2 = rgn->extents.y2; - - memcpy((char *) dstrgn->rects, (char *) rgn->rects, - (int) (rgn->numRects * sizeof(BOX))); - } -} - -#ifdef notdef - -/* - * combinRegs(newReg, reg1, reg2) - * if one region is above or below the other. -*/ - -static void -combineRegs(newReg, reg1, reg2) - register Region newReg; - Region reg1; - Region reg2; -{ - register Region tempReg; - register BOX *rects; - register BOX *rects1; - register BOX *rects2; - register int total; - - rects1 = reg1->rects; - rects2 = reg2->rects; - - total = reg1->numRects + reg2->numRects; - if (! (tempReg = XCreateRegion())) - return; - tempReg->size = total; - /* region 1 is below region 2 */ - if (reg1->extents.y1 > reg2->extents.y1) - { - miRegionCopy(tempReg, reg2); - rects = &tempReg->rects[tempReg->numRects]; - total -= tempReg->numRects; - while (total--) - *rects++ = *rects1++; - } - else - { - miRegionCopy(tempReg, reg1); - rects = &tempReg->rects[tempReg->numRects]; - total -= tempReg->numRects; - while (total--) - *rects++ = *rects2++; - } - tempReg->extents = reg1->extents; - tempReg->numRects = reg1->numRects + reg2->numRects; - EXTENTS(®2->extents, tempReg); - miRegionCopy(newReg, tempReg); - Xfree((char *)tempReg); -} - -/* - * QuickCheck checks to see if it does not have to go through all the - * the ugly code for the region call. It returns 1 if it did all - * the work for Union, otherwise 0 - still work to be done. -*/ - -static int -QuickCheck(newReg, reg1, reg2) - Region newReg, reg1, reg2; -{ - - /* if unioning with itself or no rects to union with */ - if ( (reg1 == reg2) || (!(reg1->numRects)) ) - { - miRegionCopy(newReg, reg2); - return TRUE; - } - - /* if nothing to union */ - if (!(reg2->numRects)) - { - miRegionCopy(newReg, reg1); - return TRUE; - } - - /* could put an extent check to see if add above or below */ - - if ((reg1->extents.y1 >= reg2->extents.y2) || - (reg2->extents.y1 >= reg1->extents.y2) ) - { - combineRegs(newReg, reg1, reg2); - return TRUE; - } - return FALSE; -} - -/* TopRects(rects, reg1, reg2) - * N.B. We now assume that reg1 and reg2 intersect. Therefore we are - * NOT checking in the two while loops for stepping off the end of the - * region. - */ - -static int -TopRects(newReg, rects, reg1, reg2, FirstRect) - register Region newReg; - register BOX *rects; - register Region reg1; - register Region reg2; - BOX *FirstRect; -{ - register BOX *tempRects; - - /* need to add some rects from region 1 */ - if (reg1->extents.y1 < reg2->extents.y1) - { - tempRects = reg1->rects; - while(tempRects->y1 < reg2->extents.y1) - { - MEMCHECK(newReg, rects, FirstRect); - ADDRECTNOX(newReg,rects, tempRects->x1, tempRects->y1, - tempRects->x2, MIN(tempRects->y2, reg2->extents.y1)); - tempRects++; - } - } - /* need to add some rects from region 2 */ - if (reg2->extents.y1 < reg1->extents.y1) - { - tempRects = reg2->rects; - while (tempRects->y1 < reg1->extents.y1) - { - MEMCHECK(newReg, rects, FirstRect); - ADDRECTNOX(newReg, rects, tempRects->x1,tempRects->y1, - tempRects->x2, MIN(tempRects->y2, reg1->extents.y1)); - tempRects++; - } - } - return 1; -} -#endif - -/*====================================================================== - * Generic Region Operator - *====================================================================*/ - -/*- - *----------------------------------------------------------------------- - * miCoalesce -- - * Attempt to merge the boxes in the current band with those in the - * previous one. Used only by miRegionOp. - * - * Results: - * The new index for the previous band. - * - * Side Effects: - * If coalescing takes place: - * - rectangles in the previous band will have their y2 fields - * altered. - * - pReg->numRects will be decreased. - * - *----------------------------------------------------------------------- - */ -/* static int*/ -static int -miCoalesce (pReg, prevStart, curStart) - register Region pReg; /* Region to coalesce */ - int prevStart; /* Index of start of previous band */ - int curStart; /* Index of start of current band */ -{ - register BoxPtr pPrevBox; /* Current box in previous band */ - register BoxPtr pCurBox; /* Current box in current band */ - register BoxPtr pRegEnd; /* End of region */ - int curNumRects; /* Number of rectangles in current - * band */ - int prevNumRects; /* Number of rectangles in previous - * band */ - int bandY1; /* Y1 coordinate for current band */ - - pRegEnd = &pReg->rects[pReg->numRects]; - - pPrevBox = &pReg->rects[prevStart]; - prevNumRects = curStart - prevStart; - - /* - * Figure out how many rectangles are in the current band. Have to do - * this because multiple bands could have been added in miRegionOp - * at the end when one region has been exhausted. - */ - pCurBox = &pReg->rects[curStart]; - bandY1 = pCurBox->y1; - for (curNumRects = 0; - (pCurBox != pRegEnd) && (pCurBox->y1 == bandY1); - curNumRects++) - { - pCurBox++; - } - - if (pCurBox != pRegEnd) - { - /* - * If more than one band was added, we have to find the start - * of the last band added so the next coalescing job can start - * at the right place... (given when multiple bands are added, - * this may be pointless -- see above). - */ - pRegEnd--; - while (pRegEnd[-1].y1 == pRegEnd->y1) - { - pRegEnd--; - } - curStart = pRegEnd - pReg->rects; - pRegEnd = pReg->rects + pReg->numRects; - } - - if ((curNumRects == prevNumRects) && (curNumRects != 0)) { - pCurBox -= curNumRects; - /* - * The bands may only be coalesced if the bottom of the previous - * matches the top scanline of the current. - */ - if (pPrevBox->y2 == pCurBox->y1) - { - /* - * Make sure the bands have boxes in the same places. This - * assumes that boxes have been added in such a way that they - * cover the most area possible. I.e. two boxes in a band must - * have some horizontal space between them. - */ - do - { - if ((pPrevBox->x1 != pCurBox->x1) || - (pPrevBox->x2 != pCurBox->x2)) - { - /* - * The bands don't line up so they can't be coalesced. - */ - return (curStart); - } - pPrevBox++; - pCurBox++; - prevNumRects -= 1; - } while (prevNumRects != 0); - - pReg->numRects -= curNumRects; - pCurBox -= curNumRects; - pPrevBox -= curNumRects; - - /* - * The bands may be merged, so set the bottom y of each box - * in the previous band to that of the corresponding box in - * the current band. - */ - do - { - pPrevBox->y2 = pCurBox->y2; - pPrevBox++; - pCurBox++; - curNumRects -= 1; - } while (curNumRects != 0); - - /* - * If only one band was added to the region, we have to backup - * curStart to the start of the previous band. - * - * If more than one band was added to the region, copy the - * other bands down. The assumption here is that the other bands - * came from the same region as the current one and no further - * coalescing can be done on them since it's all been done - * already... curStart is already in the right place. - */ - if (pCurBox == pRegEnd) - { - curStart = prevStart; - } - else - { - do - { - *pPrevBox++ = *pCurBox++; - } while (pCurBox != pRegEnd); - } - - } - } - return (curStart); -} - -/*- - *----------------------------------------------------------------------- - * miRegionOp -- - * Apply an operation to two regions. Called by miUnion, miInverse, - * miSubtract, miIntersect... - * - * Results: - * None. - * - * Side Effects: - * The new region is overwritten. - * - * Notes: - * The idea behind this function is to view the two regions as sets. - * Together they cover a rectangle of area that this function divides - * into horizontal bands where points are covered only by one region - * or by both. For the first case, the nonOverlapFunc is called with - * each the band and the band's upper and lower extents. For the - * second, the overlapFunc is called to process the entire band. It - * is responsible for clipping the rectangles in the band, though - * this function provides the boundaries. - * At the end of each band, the new region is coalesced, if possible, - * to reduce the number of rectangles in the region. - * - *----------------------------------------------------------------------- - */ -/* static void*/ -static void -miRegionOp(newReg, reg1, reg2, overlapFunc, nonOverlap1Func, nonOverlap2Func) - register Region newReg; /* Place to store result */ - Region reg1; /* First region in operation */ - Region reg2; /* 2d region in operation */ - void (*overlapFunc)(); /* Function to call for over- - * lapping bands */ - void (*nonOverlap1Func)(); /* Function to call for non- - * overlapping bands in region - * 1 */ - void (*nonOverlap2Func)(); /* Function to call for non- - * overlapping bands in region - * 2 */ -{ - register BoxPtr r1; /* Pointer into first region */ - register BoxPtr r2; /* Pointer into 2d region */ - BoxPtr r1End; /* End of 1st region */ - BoxPtr r2End; /* End of 2d region */ - register short ybot; /* Bottom of intersection */ - register short ytop; /* Top of intersection */ - BoxPtr oldRects; /* Old rects for newReg */ - int prevBand; /* Index of start of - * previous band in newReg */ - int curBand; /* Index of start of current - * band in newReg */ - register BoxPtr r1BandEnd; /* End of current band in r1 */ - register BoxPtr r2BandEnd; /* End of current band in r2 */ - short top; /* Top of non-overlapping - * band */ - short bot; /* Bottom of non-overlapping - * band */ - - /* - * Initialization: - * set r1, r2, r1End and r2End appropriately, preserve the important - * parts of the destination region until the end in case it's one of - * the two source regions, then mark the "new" region empty, allocating - * another array of rectangles for it to use. - */ - r1 = reg1->rects; - r2 = reg2->rects; - r1End = r1 + reg1->numRects; - r2End = r2 + reg2->numRects; - - oldRects = newReg->rects; - - EMPTY_REGION(newReg); - - /* - * Allocate a reasonable number of rectangles for the new region. The idea - * is to allocate enough so the individual functions don't need to - * reallocate and copy the array, which is time consuming, yet we don't - * have to worry about using too much memory. I hope to be able to - * nuke the Xrealloc() at the end of this function eventually. - */ - newReg->size = max(reg1->numRects,reg2->numRects) * 2; - - if (! (newReg->rects = (BoxPtr) - Xmalloc ((unsigned) (sizeof(BoxRec) * newReg->size)))) { - newReg->size = 0; - return; - } - - /* - * Initialize ybot and ytop. - * In the upcoming loop, ybot and ytop serve different functions depending - * on whether the band being handled is an overlapping or non-overlapping - * band. - * In the case of a non-overlapping band (only one of the regions - * has points in the band), ybot is the bottom of the most recent - * intersection and thus clips the top of the rectangles in that band. - * ytop is the top of the next intersection between the two regions and - * serves to clip the bottom of the rectangles in the current band. - * For an overlapping band (where the two regions intersect), ytop clips - * the top of the rectangles of both regions and ybot clips the bottoms. - */ - if (reg1->extents.y1 < reg2->extents.y1) - ybot = reg1->extents.y1; - else - ybot = reg2->extents.y1; - - /* - * prevBand serves to mark the start of the previous band so rectangles - * can be coalesced into larger rectangles. qv. miCoalesce, above. - * In the beginning, there is no previous band, so prevBand == curBand - * (curBand is set later on, of course, but the first band will always - * start at index 0). prevBand and curBand must be indices because of - * the possible expansion, and resultant moving, of the new region's - * array of rectangles. - */ - prevBand = 0; - - do - { - curBand = newReg->numRects; - - /* - * This algorithm proceeds one source-band (as opposed to a - * destination band, which is determined by where the two regions - * intersect) at a time. r1BandEnd and r2BandEnd serve to mark the - * rectangle after the last one in the current band for their - * respective regions. - */ - r1BandEnd = r1; - while ((r1BandEnd != r1End) && (r1BandEnd->y1 == r1->y1)) - { - r1BandEnd++; - } - - r2BandEnd = r2; - while ((r2BandEnd != r2End) && (r2BandEnd->y1 == r2->y1)) - { - r2BandEnd++; - } - - /* - * First handle the band that doesn't intersect, if any. - * - * Note that attention is restricted to one band in the - * non-intersecting region at once, so if a region has n - * bands between the current position and the next place it overlaps - * the other, this entire loop will be passed through n times. - */ - if (r1->y1 < r2->y1) - { - top = max(r1->y1,ybot); - bot = min(r1->y2,r2->y1); - - if ((top != bot) && (nonOverlap1Func != (void (*)())NULL)) - { - (* nonOverlap1Func) (newReg, r1, r1BandEnd, top, bot); - } - - ytop = r2->y1; - } - else if (r2->y1 < r1->y1) - { - top = max(r2->y1,ybot); - bot = min(r2->y2,r1->y1); - - if ((top != bot) && (nonOverlap2Func != (void (*)())NULL)) - { - (* nonOverlap2Func) (newReg, r2, r2BandEnd, top, bot); - } - - ytop = r1->y1; - } - else - { - ytop = r1->y1; - } - - /* - * If any rectangles got added to the region, try and coalesce them - * with rectangles from the previous band. Note we could just do - * this test in miCoalesce, but some machines incur a not - * inconsiderable cost for function calls, so... - */ - if (newReg->numRects != curBand) - { - prevBand = miCoalesce (newReg, prevBand, curBand); - } - - /* - * Now see if we've hit an intersecting band. The two bands only - * intersect if ybot > ytop - */ - ybot = min(r1->y2, r2->y2); - curBand = newReg->numRects; - if (ybot > ytop) - { - (* overlapFunc) (newReg, r1, r1BandEnd, r2, r2BandEnd, ytop, ybot); - - } - - if (newReg->numRects != curBand) - { - prevBand = miCoalesce (newReg, prevBand, curBand); - } - - /* - * If we've finished with a band (y2 == ybot) we skip forward - * in the region to the next band. - */ - if (r1->y2 == ybot) - { - r1 = r1BandEnd; - } - if (r2->y2 == ybot) - { - r2 = r2BandEnd; - } - } while ((r1 != r1End) && (r2 != r2End)); - - /* - * Deal with whichever region still has rectangles left. - */ - curBand = newReg->numRects; - if (r1 != r1End) - { - if (nonOverlap1Func != (void (*)())NULL) - { - do - { - r1BandEnd = r1; - while ((r1BandEnd < r1End) && (r1BandEnd->y1 == r1->y1)) - { - r1BandEnd++; - } - (* nonOverlap1Func) (newReg, r1, r1BandEnd, - max(r1->y1,ybot), r1->y2); - r1 = r1BandEnd; - } while (r1 != r1End); - } - } - else if ((r2 != r2End) && (nonOverlap2Func != (void (*)())NULL)) - { - do - { - r2BandEnd = r2; - while ((r2BandEnd < r2End) && (r2BandEnd->y1 == r2->y1)) - { - r2BandEnd++; - } - (* nonOverlap2Func) (newReg, r2, r2BandEnd, - max(r2->y1,ybot), r2->y2); - r2 = r2BandEnd; - } while (r2 != r2End); - } - - if (newReg->numRects != curBand) - { - (void) miCoalesce (newReg, prevBand, curBand); - } - - /* - * A bit of cleanup. To keep regions from growing without bound, - * we shrink the array of rectangles to match the new number of - * rectangles in the region. This never goes to 0, however... - * - * Only do this stuff if the number of rectangles allocated is more than - * twice the number of rectangles in the region (a simple optimization...). - */ - if (newReg->numRects < (newReg->size >> 1)) - { - if (REGION_NOT_EMPTY(newReg)) - { - BoxPtr prev_rects = newReg->rects; - newReg->size = newReg->numRects; - newReg->rects = (BoxPtr) Xrealloc ((char *) newReg->rects, - (unsigned) (sizeof(BoxRec) * newReg->size)); - if (! newReg->rects) - newReg->rects = prev_rects; - } - else - { - /* - * No point in doing the extra work involved in an Xrealloc if - * the region is empty - */ - newReg->size = 1; - Xfree((char *) newReg->rects); - newReg->rects = (BoxPtr) Xmalloc(sizeof(BoxRec)); - } - } - Xfree ((char *) oldRects); - return; -} - - -/*====================================================================== - * Region Union - *====================================================================*/ - -/*- - *----------------------------------------------------------------------- - * miUnionNonO -- - * Handle a non-overlapping band for the union operation. Just - * Adds the rectangles into the region. Doesn't have to check for - * subsumption or anything. - * - * Results: - * None. - * - * Side Effects: - * pReg->numRects is incremented and the final rectangles overwritten - * with the rectangles we're passed. - * - *----------------------------------------------------------------------- - */ -/* static void*/ -static int -miUnionNonO (pReg, r, rEnd, y1, y2) - register Region pReg; - register BoxPtr r; - BoxPtr rEnd; - register short y1; - register short y2; -{ - register BoxPtr pNextRect; - - pNextRect = &pReg->rects[pReg->numRects]; - - assert(y1 < y2); - - while (r != rEnd) - { - assert(r->x1 < r->x2); - MEMCHECK(pReg, pNextRect, pReg->rects); - pNextRect->x1 = r->x1; - pNextRect->y1 = y1; - pNextRect->x2 = r->x2; - pNextRect->y2 = y2; - pReg->numRects += 1; - pNextRect++; - - assert(pReg->numRects<=pReg->size); - r++; - } - return 0; /* lint */ -} - - -/*- - *----------------------------------------------------------------------- - * miUnionO -- - * Handle an overlapping band for the union operation. Picks the - * left-most rectangle each time and merges it into the region. - * - * Results: - * None. - * - * Side Effects: - * Rectangles are overwritten in pReg->rects and pReg->numRects will - * be changed. - * - *----------------------------------------------------------------------- - */ - -/* static void*/ -static int -miUnionO (pReg, r1, r1End, r2, r2End, y1, y2) - register Region pReg; - register BoxPtr r1; - BoxPtr r1End; - register BoxPtr r2; - BoxPtr r2End; - register short y1; - register short y2; -{ - register BoxPtr pNextRect; - - pNextRect = &pReg->rects[pReg->numRects]; - -#define MERGERECT(r) \ - if ((pReg->numRects != 0) && \ - (pNextRect[-1].y1 == y1) && \ - (pNextRect[-1].y2 == y2) && \ - (pNextRect[-1].x2 >= r->x1)) \ - { \ - if (pNextRect[-1].x2 < r->x2) \ - { \ - pNextRect[-1].x2 = r->x2; \ - assert(pNextRect[-1].x1rects); \ - pNextRect->y1 = y1; \ - pNextRect->y2 = y2; \ - pNextRect->x1 = r->x1; \ - pNextRect->x2 = r->x2; \ - pReg->numRects += 1; \ - pNextRect += 1; \ - } \ - assert(pReg->numRects<=pReg->size);\ - r++; - - assert (y1x1 < r2->x1) - { - MERGERECT(r1); - } - else - { - MERGERECT(r2); - } - } - - if (r1 != r1End) - { - do - { - MERGERECT(r1); - } while (r1 != r1End); - } - else while (r2 != r2End) - { - MERGERECT(r2); - } - return 0; /* lint */ -} - -int -XUnionRegion(reg1, reg2, newReg) - Region reg1; - Region reg2; /* source regions */ - Region newReg; /* destination Region */ -{ - /* checks all the simple cases */ - - /* - * Region 1 and 2 are the same or region 1 is empty - */ - if ( (reg1 == reg2) || (!(reg1->numRects)) ) - { - if (newReg != reg2) - miRegionCopy(newReg, reg2); - return 1; - } - - /* - * if nothing to union (region 2 empty) - */ - if (!(reg2->numRects)) - { - if (newReg != reg1) - miRegionCopy(newReg, reg1); - return 1; - } - - /* - * Region 1 completely subsumes region 2 - */ - if ((reg1->numRects == 1) && - (reg1->extents.x1 <= reg2->extents.x1) && - (reg1->extents.y1 <= reg2->extents.y1) && - (reg1->extents.x2 >= reg2->extents.x2) && - (reg1->extents.y2 >= reg2->extents.y2)) - { - if (newReg != reg1) - miRegionCopy(newReg, reg1); - return 1; - } - - /* - * Region 2 completely subsumes region 1 - */ - if ((reg2->numRects == 1) && - (reg2->extents.x1 <= reg1->extents.x1) && - (reg2->extents.y1 <= reg1->extents.y1) && - (reg2->extents.x2 >= reg1->extents.x2) && - (reg2->extents.y2 >= reg1->extents.y2)) - { - if (newReg != reg2) - miRegionCopy(newReg, reg2); - return 1; - } - - miRegionOp (newReg, reg1, reg2, (voidProcp) miUnionO, - (voidProcp) miUnionNonO, (voidProcp) miUnionNonO); - - newReg->extents.x1 = min(reg1->extents.x1, reg2->extents.x1); - newReg->extents.y1 = min(reg1->extents.y1, reg2->extents.y1); - newReg->extents.x2 = max(reg1->extents.x2, reg2->extents.x2); - newReg->extents.y2 = max(reg1->extents.y2, reg2->extents.y2); - - return 1; -} - - -/*====================================================================== - * Region Subtraction - *====================================================================*/ - -/*- - *----------------------------------------------------------------------- - * miSubtractNonO -- - * Deal with non-overlapping band for subtraction. Any parts from - * region 2 we discard. Anything from region 1 we add to the region. - * - * Results: - * None. - * - * Side Effects: - * pReg may be affected. - * - *----------------------------------------------------------------------- - */ -/* static void*/ -static int -miSubtractNonO1 (pReg, r, rEnd, y1, y2) - register Region pReg; - register BoxPtr r; - BoxPtr rEnd; - register short y1; - register short y2; -{ - register BoxPtr pNextRect; - - pNextRect = &pReg->rects[pReg->numRects]; - - assert(y1x1x2); - MEMCHECK(pReg, pNextRect, pReg->rects); - pNextRect->x1 = r->x1; - pNextRect->y1 = y1; - pNextRect->x2 = r->x2; - pNextRect->y2 = y2; - pReg->numRects += 1; - pNextRect++; - - assert(pReg->numRects <= pReg->size); - - r++; - } - return 0; /* lint */ -} - -/*- - *----------------------------------------------------------------------- - * miSubtractO -- - * Overlapping band subtraction. x1 is the left-most point not yet - * checked. - * - * Results: - * None. - * - * Side Effects: - * pReg may have rectangles added to it. - * - *----------------------------------------------------------------------- - */ -/* static void*/ -static int -miSubtractO (pReg, r1, r1End, r2, r2End, y1, y2) - register Region pReg; - register BoxPtr r1; - BoxPtr r1End; - register BoxPtr r2; - BoxPtr r2End; - register short y1; - register short y2; -{ - register BoxPtr pNextRect; - register int x1; - - x1 = r1->x1; - - assert(y1rects[pReg->numRects]; - - while ((r1 != r1End) && (r2 != r2End)) - { - if (r2->x2 <= x1) - { - /* - * Subtrahend missed the boat: go to next subtrahend. - */ - r2++; - } - else if (r2->x1 <= x1) - { - /* - * Subtrahend preceeds minuend: nuke left edge of minuend. - */ - x1 = r2->x2; - if (x1 >= r1->x2) - { - /* - * Minuend completely covered: advance to next minuend and - * reset left fence to edge of new minuend. - */ - r1++; - if (r1 != r1End) - x1 = r1->x1; - } - else - { - /* - * Subtrahend now used up since it doesn't extend beyond - * minuend - */ - r2++; - } - } - else if (r2->x1 < r1->x2) - { - /* - * Left part of subtrahend covers part of minuend: add uncovered - * part of minuend to region and skip to next subtrahend. - */ - assert(x1x1); - MEMCHECK(pReg, pNextRect, pReg->rects); - pNextRect->x1 = x1; - pNextRect->y1 = y1; - pNextRect->x2 = r2->x1; - pNextRect->y2 = y2; - pReg->numRects += 1; - pNextRect++; - - assert(pReg->numRects<=pReg->size); - - x1 = r2->x2; - if (x1 >= r1->x2) - { - /* - * Minuend used up: advance to new... - */ - r1++; - if (r1 != r1End) - x1 = r1->x1; - } - else - { - /* - * Subtrahend used up - */ - r2++; - } - } - else - { - /* - * Minuend used up: add any remaining piece before advancing. - */ - if (r1->x2 > x1) - { - MEMCHECK(pReg, pNextRect, pReg->rects); - pNextRect->x1 = x1; - pNextRect->y1 = y1; - pNextRect->x2 = r1->x2; - pNextRect->y2 = y2; - pReg->numRects += 1; - pNextRect++; - assert(pReg->numRects<=pReg->size); - } - r1++; - if (r1 != r1End) - x1 = r1->x1; - } - } - - /* - * Add remaining minuend rectangles to region. - */ - while (r1 != r1End) - { - assert(x1x2); - MEMCHECK(pReg, pNextRect, pReg->rects); - pNextRect->x1 = x1; - pNextRect->y1 = y1; - pNextRect->x2 = r1->x2; - pNextRect->y2 = y2; - pReg->numRects += 1; - pNextRect++; - - assert(pReg->numRects<=pReg->size); - - r1++; - if (r1 != r1End) - { - x1 = r1->x1; - } - } - return 0; /* lint */ -} - -/*- - *----------------------------------------------------------------------- - * miSubtract -- - * Subtract regS from regM and leave the result in regD. - * S stands for subtrahend, M for minuend and D for difference. - * - * Results: - * TRUE. - * - * Side Effects: - * regD is overwritten. - * - *----------------------------------------------------------------------- - */ - -int -XSubtractRegion(regM, regS, regD) - Region regM; - Region regS; - register Region regD; -{ - /* check for trivial reject */ - if ( (!(regM->numRects)) || (!(regS->numRects)) || - (!EXTENTCHECK(®M->extents, ®S->extents)) ) - { - miRegionCopy(regD, regM); - return 1; - } - - miRegionOp (regD, regM, regS, (voidProcp) miSubtractO, - (voidProcp) miSubtractNonO1, (voidProcp) NULL); - - /* - * Can't alter newReg's extents before we call miRegionOp because - * it might be one of the source regions and miRegionOp depends - * on the extents of those regions being the unaltered. Besides, this - * way there's no checking against rectangles that will be nuked - * due to coalescing, so we have to examine fewer rectangles. - */ - miSetExtents (regD); - return 1; -} - -int -XXorRegion( sra, srb, dr ) - Region sra, srb, dr; -{ - Region tra, trb; - - if ((! (tra = XCreateRegion())) || (! (trb = XCreateRegion()))) - return 0; - (void) XSubtractRegion(sra,srb,tra); - (void) XSubtractRegion(srb,sra,trb); - (void) XUnionRegion(tra,trb,dr); - XDestroyRegion(tra); - XDestroyRegion(trb); - return 0; -} - -/* - * Check to see if the region is empty. Assumes a region is passed - * as a parameter - */ -int -XEmptyRegion( r ) - Region r; -{ - if( r->numRects == 0 ) return TRUE; - else return FALSE; -} - -/* - * Check to see if two regions are equal - */ -int -XEqualRegion( r1, r2 ) - Region r1, r2; -{ - int i; - - if( r1->numRects != r2->numRects ) return FALSE; - else if( r1->numRects == 0 ) return TRUE; - else if ( r1->extents.x1 != r2->extents.x1 ) return FALSE; - else if ( r1->extents.x2 != r2->extents.x2 ) return FALSE; - else if ( r1->extents.y1 != r2->extents.y1 ) return FALSE; - else if ( r1->extents.y2 != r2->extents.y2 ) return FALSE; - else for( i=0; i < r1->numRects; i++ ) { - if ( r1->rects[i].x1 != r2->rects[i].x1 ) return FALSE; - else if ( r1->rects[i].x2 != r2->rects[i].x2 ) return FALSE; - else if ( r1->rects[i].y1 != r2->rects[i].y1 ) return FALSE; - else if ( r1->rects[i].y2 != r2->rects[i].y2 ) return FALSE; - } - return TRUE; -} - -int -XPointInRegion( pRegion, x, y ) - Region pRegion; - int x, y; -{ - int i; - - if (pRegion->numRects == 0) - return FALSE; - if (!INBOX(pRegion->extents, x, y)) - return FALSE; - for (i=0; inumRects; i++) - { - if (INBOX (pRegion->rects[i], x, y)) - return TRUE; - } - return FALSE; -} - -int -XRectInRegion(region, rx, ry, rwidth, rheight) - register Region region; - int rx, ry; - unsigned int rwidth, rheight; -{ - register BoxPtr pbox; - register BoxPtr pboxEnd; - Box rect; - register BoxPtr prect = ▭ - int partIn, partOut; - - prect->x1 = rx; - prect->y1 = ry; - prect->x2 = rwidth + rx; - prect->y2 = rheight + ry; - - /* this is (just) a useful optimization */ - if ((region->numRects == 0) || !EXTENTCHECK(®ion->extents, prect)) - return(RectangleOut); - - partOut = FALSE; - partIn = FALSE; - - /* can stop when both partOut and partIn are TRUE, or we reach prect->y2 */ - for (pbox = region->rects, pboxEnd = pbox + region->numRects; - pbox < pboxEnd; - pbox++) - { - - if (pbox->y2 <= ry) - continue; /* getting up to speed or skipping remainder of band */ - - if (pbox->y1 > ry) - { - partOut = TRUE; /* missed part of rectangle above */ - if (partIn || (pbox->y1 >= prect->y2)) - break; - ry = pbox->y1; /* x guaranteed to be == prect->x1 */ - } - - if (pbox->x2 <= rx) - continue; /* not far enough over yet */ - - if (pbox->x1 > rx) - { - partOut = TRUE; /* missed part of rectangle to left */ - if (partIn) - break; - } - - if (pbox->x1 < prect->x2) - { - partIn = TRUE; /* definitely overlap */ - if (partOut) - break; - } - - if (pbox->x2 >= prect->x2) - { - ry = pbox->y2; /* finished with this band */ - if (ry >= prect->y2) - break; - rx = prect->x1; /* reset x out to left again */ - } else - { - /* - * Because boxes in a band are maximal width, if the first box - * to overlap the rectangle doesn't completely cover it in that - * band, the rectangle must be partially out, since some of it - * will be uncovered in that band. partIn will have been set true - * by now... - */ - break; - } - - } - - return(partIn ? ((ry < prect->y2) ? RectanglePart : RectangleIn) : - RectangleOut); -} diff --git a/src/vnc/common/Xregion/Xregion.h b/src/vnc/common/Xregion/Xregion.h deleted file mode 100644 index 7fa44d96..00000000 --- a/src/vnc/common/Xregion/Xregion.h +++ /dev/null @@ -1,220 +0,0 @@ -/* $Xorg: Xutil.h,v 1.8 2001/02/09 02:03:39 xorgcvs Exp $ */ - -/*********************************************************** - -Copyright 1987, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall not be -used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from The Open Group. - - -Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Digital not be -used in advertising or publicity pertaining to distribution of the -software without specific, written prior permission. - -DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -******************************************************************/ -/* $XFree86: xc/lib/X11/Xutil.h,v 3.4 2001/12/14 19:54:10 dawes Exp $ */ - -#ifndef _XREGION_H_ -#define _XREGION_H_ - -// - Faked defines to fool the X11 region code - -#include -#include - -#define Bool int -#define Xmalloc malloc -#define Xfree free -#define Xrealloc realloc - -#ifndef max -#define max(a,b) (((a) > (b)) ? (a) : (b)) -#endif - -#ifndef min -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#endif - -#define NeedFunctionPrototypes 1 - -// - Cribbed from Xlib.h - -typedef struct { - short x, y; -} XPoint; - -typedef struct { - short x, y; - unsigned short width, height; -} XRectangle; - -/* - * opaque reference to Region data type - */ -typedef struct _XRegion *Region; - -/* Return values from XRectInRegion() */ - -#define RectangleOut 0 -#define RectangleIn 1 -#define RectanglePart 2 - -#ifdef __cplusplus -extern "C" { -#endif - -extern int XClipBox( -#if NeedFunctionPrototypes - Region /* r */, - XRectangle* /* rect_return */ -#endif -); - -extern Region XCreateRegion( -#if NeedFunctionPrototypes - void -#endif -); - -extern const char *XDefaultString (void); - -extern int XDestroyRegion( -#if NeedFunctionPrototypes - Region /* r */ -#endif -); - -extern int XEmptyRegion( -#if NeedFunctionPrototypes - Region /* r */ -#endif -); - -extern int XEqualRegion( -#if NeedFunctionPrototypes - Region /* r1 */, - Region /* r2 */ -#endif -); - -extern int XIntersectRegion( -#if NeedFunctionPrototypes - Region /* sra */, - Region /* srb */, - Region /* dr_return */ -#endif -); - -extern int XOffsetRegion( -#if NeedFunctionPrototypes - Region /* r */, - int /* dx */, - int /* dy */ -#endif -); - -extern Bool XPointInRegion( -#if NeedFunctionPrototypes - Region /* r */, - int /* x */, - int /* y */ -#endif -); - -extern Region XPolygonRegion( -#if NeedFunctionPrototypes - XPoint* /* points */, - int /* n */, - int /* fill_rule */ -#endif -); - -extern int XRectInRegion( -#if NeedFunctionPrototypes - Region /* r */, - int /* x */, - int /* y */, - unsigned int /* width */, - unsigned int /* height */ -#endif -); - -extern int XShrinkRegion( -#if NeedFunctionPrototypes - Region /* r */, - int /* dx */, - int /* dy */ -#endif -); - -extern int XSubtractRegion( -#if NeedFunctionPrototypes - Region /* sra */, - Region /* srb */, - Region /* dr_return */ -#endif -); - -extern int XUnionRectWithRegion( -#if NeedFunctionPrototypes - XRectangle* /* rectangle */, - Region /* src_region */, - Region /* dest_region_return */ -#endif -); - -extern int XUnionRegion( -#if NeedFunctionPrototypes - Region /* sra */, - Region /* srb */, - Region /* dr_return */ -#endif -); - -extern int XXorRegion( -#if NeedFunctionPrototypes - Region /* sra */, - Region /* srb */, - Region /* dr_return */ -#endif -); - -#ifdef __cplusplus -}; -#endif - -#endif /* _XUTIL_H_ */ diff --git a/src/vnc/common/Xregion/region.h b/src/vnc/common/Xregion/region.h deleted file mode 100644 index 2ddf12ca..00000000 --- a/src/vnc/common/Xregion/region.h +++ /dev/null @@ -1,190 +0,0 @@ -/* $Xorg: region.h,v 1.4 2001/02/09 02:03:40 xorgcvs Exp $ */ -/************************************************************************ - -Copyright 1987, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall not be -used in advertising or otherwise to promote the sale, use or other dealings -in this Software without prior written authorization from The Open Group. - - -Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Digital not be -used in advertising or publicity pertaining to distribution of the -software without specific, written prior permission. - -DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING -ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL -DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR -ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -SOFTWARE. - -************************************************************************/ - -#ifndef _XREGION_H -#define _XREGION_H - -typedef struct { - short x1, x2, y1, y2; -} Box, BOX, BoxRec, *BoxPtr; - -typedef struct { - short x, y, width, height; -}RECTANGLE, RectangleRec, *RectanglePtr; - -#define TRUE 1 -#define FALSE 0 -#define MAXSHORT 32767 -#define MINSHORT -MAXSHORT -#ifndef MAX -#define MAX(a,b) (((a) > (b)) ? (a) : (b)) -#endif -#ifndef MIN -#define MIN(a,b) (((a) < (b)) ? (a) : (b)) -#endif - - -/* - * clip region - */ - -typedef struct _XRegion { - long size; - long numRects; - BOX *rects; - BOX extents; -} REGION; - -/* Xutil.h contains the declaration: - * typedef struct _XRegion *Region; - */ - -/* 1 if two BOXs overlap. - * 0 if two BOXs do not overlap. - * Remember, x2 and y2 are not in the region - */ -#define EXTENTCHECK(r1, r2) \ - ((r1)->x2 > (r2)->x1 && \ - (r1)->x1 < (r2)->x2 && \ - (r1)->y2 > (r2)->y1 && \ - (r1)->y1 < (r2)->y2) - -/* - * update region extents - */ -#define EXTENTS(r,idRect){\ - if((r)->x1 < (idRect)->extents.x1)\ - (idRect)->extents.x1 = (r)->x1;\ - if((r)->y1 < (idRect)->extents.y1)\ - (idRect)->extents.y1 = (r)->y1;\ - if((r)->x2 > (idRect)->extents.x2)\ - (idRect)->extents.x2 = (r)->x2;\ - if((r)->y2 > (idRect)->extents.y2)\ - (idRect)->extents.y2 = (r)->y2;\ - } - -/* - * Check to see if there is enough memory in the present region. - */ -#define MEMCHECK(reg, rect, firstrect){\ - if ((reg)->numRects >= ((reg)->size - 1)){\ - (firstrect) = (BOX *) Xrealloc \ - ((char *)(firstrect), (unsigned) (2 * (sizeof(BOX)) * ((reg)->size)));\ - if ((firstrect) == 0)\ - return(0);\ - (reg)->size *= 2;\ - (rect) = &(firstrect)[(reg)->numRects];\ - }\ - } - -/* this routine checks to see if the previous rectangle is the same - * or subsumes the new rectangle to add. - */ - -#define CHECK_PREVIOUS(Reg, R, Rx1, Ry1, Rx2, Ry2)\ - (!(((Reg)->numRects > 0)&&\ - ((R-1)->y1 == (Ry1)) &&\ - ((R-1)->y2 == (Ry2)) &&\ - ((R-1)->x1 <= (Rx1)) &&\ - ((R-1)->x2 >= (Rx2)))) - -/* add a rectangle to the given Region */ -#define ADDRECT(reg, r, rx1, ry1, rx2, ry2){\ - if (((rx1) < (rx2)) && ((ry1) < (ry2)) &&\ - CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\ - (r)->x1 = (rx1);\ - (r)->y1 = (ry1);\ - (r)->x2 = (rx2);\ - (r)->y2 = (ry2);\ - EXTENTS((r), (reg));\ - (reg)->numRects++;\ - (r)++;\ - }\ - } - - - -/* add a rectangle to the given Region */ -#define ADDRECTNOX(reg, r, rx1, ry1, rx2, ry2){\ - if ((rx1 < rx2) && (ry1 < ry2) &&\ - CHECK_PREVIOUS((reg), (r), (rx1), (ry1), (rx2), (ry2))){\ - (r)->x1 = (rx1);\ - (r)->y1 = (ry1);\ - (r)->x2 = (rx2);\ - (r)->y2 = (ry2);\ - (reg)->numRects++;\ - (r)++;\ - }\ - } - -#define EMPTY_REGION(pReg) pReg->numRects = 0 - -#define REGION_NOT_EMPTY(pReg) pReg->numRects - -#define INBOX(r, x, y) \ - ( ( ((r).x2 > x)) && \ - ( ((r).x1 <= x)) && \ - ( ((r).y2 > y)) && \ - ( ((r).y1 <= y)) ) - -/* - * number of points to buffer before sending them off - * to scanlines() : Must be an even number - */ -#define NUMPTSTOBUFFER 200 - -/* - * used to allocate buffers for points and link - * the buffers together - */ -typedef struct _POINTBLOCK { - XPoint pts[NUMPTSTOBUFFER]; - struct _POINTBLOCK *next; -} POINTBLOCK; - -#endif diff --git a/src/vnc/common/boilerplate.mk b/src/vnc/common/boilerplate.mk deleted file mode 100644 index 979731c5..00000000 --- a/src/vnc/common/boilerplate.mk +++ /dev/null @@ -1,35 +0,0 @@ - -all:: - @subdirs="$(SUBDIRS)"; for d in $$subdirs; do (cd $$d; $(MAKE) $@) || exit 1; done - -clean:: - @subdirs="$(SUBDIRS)"; for d in $$subdirs; do (cd $$d; $(MAKE) $@) || exit 1; done - -clean:: - rm -f $(program) $(library) *.o - -SHELL = @SHELL@ -top_srcdir = @top_srcdir@ -@SET_MAKE@ -CC = @CC@ -CFLAGS = @CFLAGS@ $(DIR_CFLAGS) -CCLD = $(CC) -CXX = @CXX@ -CXXFLAGS = @CXXFLAGS@ -CXXLD = $(CXX) -CPPFLAGS = @CPPFLAGS@ -DEFS = @DEFS@ -ALL_CPPFLAGS = $(CPPFLAGS) $(DEFS) $(DIR_CPPFLAGS) -LIBS = @LIBS@ -LDFLAGS = @LDFLAGS@ -RANLIB = @RANLIB@ -AR = ar cq - -.SUFFIXES: -.SUFFIXES: .cxx .c .o - -.c.o: - $(CC) $(ALL_CPPFLAGS) $(CFLAGS) -c $< - -.cxx.o: - $(CXX) $(ALL_CPPFLAGS) $(CXXFLAGS) -c $< diff --git a/src/vnc/common/configure b/src/vnc/common/configure deleted file mode 100644 index c7be2edd..00000000 --- a/src/vnc/common/configure +++ /dev/null @@ -1,2344 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.13 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --with-x use the X Window System" -ac_help="$ac_help - --with-installed-zlib use the version of zlib which is installed on the - system instead of the one distributed with VNC" - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.13" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=rdr/InStream.h - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -ac_exeext= -ac_objext=o -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - - -ac_cv_prog_cc_g=no -ac_cv_prog_cxx_g=no - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:537: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:567: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_prog_rejected=no - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - if test -z "$CC"; then - case "`uname -s`" in - *win32* | *WIN32*) - # Extract the first word of "cl", so it can be a program name with args. -set dummy cl; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:618: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="cl" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - ;; - esac - fi - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:650: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -cat > conftest.$ac_ext << EOF - -#line 661 "configure" -#include "confdefs.h" - -main(){return(0);} -EOF -if { (eval echo configure:666: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - ac_cv_prog_cc_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - ac_cv_prog_cc_cross=no - else - ac_cv_prog_cc_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_prog_cc_works=no -fi -rm -fr conftest* -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 -if test $ac_cv_prog_cc_works = no; then - { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } -fi -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:692: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 -echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 -cross_compiling=$ac_cv_prog_cc_cross - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:697: checking whether we are using GNU C" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes -else - GCC= -fi - -ac_test_CFLAGS="${CFLAGS+set}" -ac_save_CFLAGS="$CFLAGS" -CFLAGS= -echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:725: checking whether ${CC-cc} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 -if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi - -for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl -do -# Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:761: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CXX="$ac_prog" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CXX="$ac_cv_prog_CXX" -if test -n "$CXX"; then - echo "$ac_t""$CXX" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -test -n "$CXX" && break -done -test -n "$CXX" || CXX="gcc" - - -echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:793: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 - -ac_ext=C -# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cxx_cross - -cat > conftest.$ac_ext << EOF - -#line 804 "configure" -#include "confdefs.h" - -int main(){return(0);} -EOF -if { (eval echo configure:809: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - ac_cv_prog_cxx_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - ac_cv_prog_cxx_cross=no - else - ac_cv_prog_cxx_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_prog_cxx_works=no -fi -rm -fr conftest* -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6 -if test $ac_cv_prog_cxx_works = no; then - { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } -fi -echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:835: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 -echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 -cross_compiling=$ac_cv_prog_cxx_cross - -echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 -echo "configure:840: checking whether we are using GNU C++" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.C <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gxx=yes -else - ac_cv_prog_gxx=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gxx" 1>&6 - -if test $ac_cv_prog_gxx = yes; then - GXX=yes -else - GXX= -fi - -ac_test_CXXFLAGS="${CXXFLAGS+set}" -ac_save_CXXFLAGS="$CXXFLAGS" -CXXFLAGS= -echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 -echo "configure:868: checking whether ${CXX-g++} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.cc -if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then - ac_cv_prog_cxx_g=yes -else - ac_cv_prog_cxx_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6 -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS="$ac_save_CXXFLAGS" -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi - -for ac_declaration in \ - ''\ - '#include ' \ - 'extern "C" void std::exit (int) throw (); using std::exit;' \ - 'extern "C" void std::exit (int); using std::exit;' \ - 'extern "C" void exit (int) throw ();' \ - 'extern "C" void exit (int);' \ - 'void exit (int);' -do - cat > conftest.$ac_ext < -$ac_declaration -int main() { -exit (42); -; return 0; } -EOF -if { (eval echo configure:917: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - : -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - continue -fi -rm -f conftest* - cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - break -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 -fi -rm -f conftest* -done -if test -n "$ac_declaration"; then - echo '#ifdef __cplusplus' >>confdefs.h - echo $ac_declaration >>confdefs.h - echo '#endif' >>confdefs.h -fi - - -# Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:953: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="ranlib" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:981: checking whether ${MAKE-make} sets \${MAKE}" >&5 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftestmake <<\EOF -all: - @echo 'ac_maketemp="${MAKE}"' -EOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi -rm -f conftestmake -fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$ac_t""yes" 1>&6 - SET_MAKE= -else - echo "$ac_t""no" 1>&6 - SET_MAKE="MAKE=${MAKE-make}" -fi - -ac_ext=C -# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cxx_cross - - -case "`(uname -sr) 2>/dev/null`" in -"SunOS 5"*) - SOLARIS=yes - USE_MITSHM=yes - ;; -"Linux"*) - LINUX=yes - USE_MITSHM=yes - ;; -esac - -if test "$USE_MITSHM" = yes; then - MITSHM_CPPFLAGS="-DMITSHM" -fi - - -if test "$GCC" = yes; then - CFLAGS="$CFLAGS -Wall" - if test "$SOLARIS" = yes; then - CFLAGS="$CFLAGS -Wno-unknown-pragmas -Wno-implicit-int" - fi -fi -if test "$GXX" = yes; then - CXXFLAGS="$CXXFLAGS -Wall" - if test "$SOLARIS" = yes; then - CXXFLAGS="$CXXFLAGS -Wno-unknown-pragmas -Wno-implicit-int -fpermissive" - fi -fi - -echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6 -echo "configure:1045: checking how to run the C++ preprocessor" >&5 -if test -z "$CXXCPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_ext=C -# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cxx_cross - CXXCPP="${CXX-g++} -E" - cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1063: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CXXCPP=/lib/cpp -fi -rm -f conftest* - ac_cv_prog_CXXCPP="$CXXCPP" -ac_ext=C -# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cxx_cross -fi -fi -CXXCPP="$ac_cv_prog_CXXCPP" -echo "$ac_t""$CXXCPP" 1>&6 - -# If we find X, set shell vars x_includes and x_libraries to the -# paths, otherwise set no_x=yes. -# Uses ac_ vars as temps to allow command line to override cache and checks. -# --without-x overrides everything else, but does not touch the cache. -echo $ac_n "checking for X""... $ac_c" 1>&6 -echo "configure:1092: checking for X" >&5 - -# Check whether --with-x or --without-x was given. -if test "${with_x+set}" = set; then - withval="$with_x" - : -fi - -# $have_x is `yes', `no', `disabled', or empty when we do not yet know. -if test "x$with_x" = xno; then - # The user explicitly disabled X. - have_x=disabled -else - if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then - # Both variables are already set. - have_x=yes - else -if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # One or both of the vars are not set, and there is no cached value. -ac_x_includes=NO ac_x_libraries=NO -rm -fr conftestdir -if mkdir conftestdir; then - cd conftestdir - # Make sure to not put "make" in the Imakefile rules, since we grep it out. - cat > Imakefile <<'EOF' -acfindx: - @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' -EOF - if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then - # GNU make sometimes prints "make[1]: Entering...", which would confuse us. - eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` - # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. - for ac_extension in a so sl; do - if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && - test -f $ac_im_libdir/libX11.$ac_extension; then - ac_im_usrlibdir=$ac_im_libdir; break - fi - done - # Screen out bogus values from the imake configuration. They are - # bogus both because they are the default anyway, and because - # using them would break gcc on systems where it needs fixed includes. - case "$ac_im_incroot" in - /usr/include) ;; - *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;; - esac - case "$ac_im_usrlibdir" in - /usr/lib | /lib) ;; - *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;; - esac - fi - cd .. - rm -fr conftestdir -fi - -if test "$ac_x_includes" = NO; then - # Guess where to find include files, by looking for this one X11 .h file. - test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h - - # First, try using that file with no special directory specified. -cat > conftest.$ac_ext < -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1159: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - # We can compile using X headers with no special include directory. -ac_x_includes= -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - # Look for the header file in a standard set of common directories. -# Check X11 before X11Rn because it is often a symlink to the current release. - for ac_dir in \ - /usr/X11/include \ - /usr/X11R6/include \ - /usr/X11R5/include \ - /usr/X11R4/include \ - \ - /usr/include/X11 \ - /usr/include/X11R6 \ - /usr/include/X11R5 \ - /usr/include/X11R4 \ - \ - /usr/local/X11/include \ - /usr/local/X11R6/include \ - /usr/local/X11R5/include \ - /usr/local/X11R4/include \ - \ - /usr/local/include/X11 \ - /usr/local/include/X11R6 \ - /usr/local/include/X11R5 \ - /usr/local/include/X11R4 \ - \ - /usr/X386/include \ - /usr/x386/include \ - /usr/XFree86/include/X11 \ - \ - /usr/include \ - /usr/local/include \ - /usr/unsupported/include \ - /usr/athena/include \ - /usr/local/x11r5/include \ - /usr/lpp/Xamples/include \ - \ - /usr/openwin/include \ - /usr/openwin/share/include \ - ; \ - do - if test -r "$ac_dir/$x_direct_test_include"; then - ac_x_includes=$ac_dir - break - fi - done -fi -rm -f conftest* -fi # $ac_x_includes = NO - -if test "$ac_x_libraries" = NO; then - # Check for the libraries. - - test -z "$x_direct_test_library" && x_direct_test_library=Xt - test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc - - # See if we find them without any special options. - # Don't add to $LIBS permanently. - ac_save_LIBS="$LIBS" - LIBS="-l$x_direct_test_library $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - LIBS="$ac_save_LIBS" -# We can link X programs with no special library path. -ac_x_libraries= -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - LIBS="$ac_save_LIBS" -# First see if replacing the include by lib works. -# Check X11 before X11Rn because it is often a symlink to the current release. -for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \ - /usr/X11/lib \ - /usr/X11R6/lib \ - /usr/X11R5/lib \ - /usr/X11R4/lib \ - \ - /usr/lib/X11 \ - /usr/lib/X11R6 \ - /usr/lib/X11R5 \ - /usr/lib/X11R4 \ - \ - /usr/local/X11/lib \ - /usr/local/X11R6/lib \ - /usr/local/X11R5/lib \ - /usr/local/X11R4/lib \ - \ - /usr/local/lib/X11 \ - /usr/local/lib/X11R6 \ - /usr/local/lib/X11R5 \ - /usr/local/lib/X11R4 \ - \ - /usr/X386/lib \ - /usr/x386/lib \ - /usr/XFree86/lib/X11 \ - \ - /usr/lib \ - /usr/local/lib \ - /usr/unsupported/lib \ - /usr/athena/lib \ - /usr/local/x11r5/lib \ - /usr/lpp/Xamples/lib \ - /lib/usr/lib/X11 \ - \ - /usr/openwin/lib \ - /usr/openwin/share/lib \ - ; \ -do - for ac_extension in a so sl; do - if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then - ac_x_libraries=$ac_dir - break 2 - fi - done -done -fi -rm -f conftest* -fi # $ac_x_libraries = NO - -if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then - # Didn't find X anywhere. Cache the known absence of X. - ac_cv_have_x="have_x=no" -else - # Record where we found X for the cache. - ac_cv_have_x="have_x=yes \ - ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" -fi -fi - fi - eval "$ac_cv_have_x" -fi # $with_x != no - -if test "$have_x" != yes; then - echo "$ac_t""$have_x" 1>&6 - no_x=yes -else - # If each of the values was on the command line, it overrides each guess. - test "x$x_includes" = xNONE && x_includes=$ac_x_includes - test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries - # Update the cache value to reflect the command line values. - ac_cv_have_x="have_x=yes \ - ac_x_includes=$x_includes ac_x_libraries=$x_libraries" - echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6 -fi - -if test "$no_x" = yes; then - # Not all programs may use this symbol, but it does not hurt to define it. - cat >> confdefs.h <<\EOF -#define X_DISPLAY_MISSING 1 -EOF - - X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= -else - if test -n "$x_includes"; then - X_CFLAGS="$X_CFLAGS -I$x_includes" - fi - - # It would also be nice to do this for all -L options, not just this one. - if test -n "$x_libraries"; then - X_LIBS="$X_LIBS -L$x_libraries" - # For Solaris; some versions of Sun CC require a space after -R and - # others require no space. Words are not sufficient . . . . - case "`(uname -sr) 2>/dev/null`" in - "SunOS 5"*) - echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6 -echo "configure:1341: checking whether -R must be followed by a space" >&5 - ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries" - cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_R_nospace=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_R_nospace=no -fi -rm -f conftest* - if test $ac_R_nospace = yes; then - echo "$ac_t""no" 1>&6 - X_LIBS="$X_LIBS -R$x_libraries" - else - LIBS="$ac_xsave_LIBS -R $x_libraries" - cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_R_space=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_R_space=no -fi -rm -f conftest* - if test $ac_R_space = yes; then - echo "$ac_t""yes" 1>&6 - X_LIBS="$X_LIBS -R $x_libraries" - else - echo "$ac_t""neither works" 1>&6 - fi - fi - LIBS="$ac_xsave_LIBS" - esac - fi - - # Check for system-dependent libraries X programs must link with. - # Do this before checking for the system-independent R6 libraries - # (-lICE), since we may need -lsocket or whatever for X linking. - - if test "$ISC" = yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" - else - # Martyn.Johnson@cl.cam.ac.uk says this is needed for Ultrix, if the X - # libraries were built with DECnet support. And karl@cs.umb.edu says - # the Alpha needs dnet_stub (dnet does not exist). - echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6 -echo "configure:1406: checking for dnet_ntoa in -ldnet" >&5 -ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldnet $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" -else - echo "$ac_t""no" 1>&6 -fi - - if test $ac_cv_lib_dnet_dnet_ntoa = no; then - echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6 -echo "configure:1450: checking for dnet_ntoa in -ldnet_stub" >&5 -ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ldnet_stub $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" -else - echo "$ac_t""no" 1>&6 -fi - - fi - - # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, - # to get the SysV transport functions. - # chad@anasazi.com says the Pyramis MIS-ES running DC/OSx (SVR4) - # needs -lnsl. - # The nsl library prevents programs from opening the X display - # on Irix 5.2, according to dickey@clark.net. - echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 -echo "configure:1501: checking for gethostbyname" >&5 -if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char gethostbyname(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname) -choke me -#else -gethostbyname(); -#endif - -; return 0; } -EOF -if { (eval echo configure:1532: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_gethostbyname=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_gethostbyname=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then - echo "$ac_t""yes" 1>&6 - : -else - echo "$ac_t""no" 1>&6 -fi - - if test $ac_cv_func_gethostbyname = no; then - echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 -echo "configure:1553: checking for gethostbyname in -lnsl" >&5 -ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lnsl $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" -else - echo "$ac_t""no" 1>&6 -fi - - fi - - # lieder@skyler.mavd.honeywell.com says without -lsocket, - # socket/setsockopt and other routines are undefined under SCO ODT - # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary - # on later versions), says simon@lia.di.epfl.ch: it contains - # gethostby* variants that don't use the nameserver (or something). - # -lsocket must be given before -lnsl if both are needed. - # We assume that if connect needs -lnsl, so does gethostbyname. - echo $ac_n "checking for connect""... $ac_c" 1>&6 -echo "configure:1605: checking for connect" >&5 -if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char connect(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_connect) || defined (__stub___connect) -choke me -#else -connect(); -#endif - -; return 0; } -EOF -if { (eval echo configure:1636: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_connect=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_connect=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then - echo "$ac_t""yes" 1>&6 - : -else - echo "$ac_t""no" 1>&6 -fi - - if test $ac_cv_func_connect = no; then - echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6 -echo "configure:1657: checking for connect in -lsocket" >&5 -ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lsocket $X_EXTRA_LIBS $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" -else - echo "$ac_t""no" 1>&6 -fi - - fi - - # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX. - echo $ac_n "checking for remove""... $ac_c" 1>&6 -echo "configure:1703: checking for remove" >&5 -if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char remove(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_remove) || defined (__stub___remove) -choke me -#else -remove(); -#endif - -; return 0; } -EOF -if { (eval echo configure:1734: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_remove=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_remove=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'remove`\" = yes"; then - echo "$ac_t""yes" 1>&6 - : -else - echo "$ac_t""no" 1>&6 -fi - - if test $ac_cv_func_remove = no; then - echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6 -echo "configure:1755: checking for remove in -lposix" >&5 -ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lposix $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" -else - echo "$ac_t""no" 1>&6 -fi - - fi - - # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. - echo $ac_n "checking for shmat""... $ac_c" 1>&6 -echo "configure:1801: checking for shmat" >&5 -if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char shmat(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_shmat) || defined (__stub___shmat) -choke me -#else -shmat(); -#endif - -; return 0; } -EOF -if { (eval echo configure:1832: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_shmat=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_shmat=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'shmat`\" = yes"; then - echo "$ac_t""yes" 1>&6 - : -else - echo "$ac_t""no" 1>&6 -fi - - if test $ac_cv_func_shmat = no; then - echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6 -echo "configure:1853: checking for shmat in -lipc" >&5 -ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lipc $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" -else - echo "$ac_t""no" 1>&6 -fi - - fi - fi - - # Check for libraries that X11R6 Xt/Xaw programs need. - ac_save_LDFLAGS="$LDFLAGS" - test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" - # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to - # check for ICE first), but we must link in the order -lSM -lICE or - # we get undefined symbols. So assume we have SM if we have ICE. - # These have to be linked with before -lX11, unlike the other - # libraries we check for below, so use a different variable. - # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. - echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6 -echo "configure:1908: checking for IceConnectionNumber in -lICE" >&5 -ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lICE $X_EXTRA_LIBS $LIBS" -cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" -else - echo "$ac_t""no" 1>&6 -fi - - LDFLAGS="$ac_save_LDFLAGS" - -fi - - -# Check whether --with-installed-zlib or --without-installed-zlib was given. -if test "${with_installed_zlib+set}" = set; then - withval="$with_installed_zlib" - : -fi - - -if test "$with_installed_zlib" = yes; then - echo "using installed zlib" - ZLIB_LIB=-lz -else - ZLIB_DIR=zlib - ZLIB_INCLUDE='-I$(top_srcdir)/zlib' - ZLIB_LIB='$(top_srcdir)/zlib/libz.a' - echo "configuring zlib..." - (cd zlib; ./configure) - echo "...done configuring zlib" -fi - - - - - -if test "$SOLARIS" = yes; then - VSNPRINTF_DEFINE= -else - echo $ac_n "checking for vsnprintf""... $ac_c" 1>&6 -echo "configure:1982: checking for vsnprintf" >&5 -if eval "test \"`echo '$''{'ac_cv_func_vsnprintf'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char vsnprintf(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_vsnprintf) || defined (__stub___vsnprintf) -choke me -#else -vsnprintf(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2013: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_vsnprintf=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_vsnprintf=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'vsnprintf`\" = yes"; then - echo "$ac_t""yes" 1>&6 - VSNPRINTF_DEFINE='-DHAVE_VSNPRINTF' -else - echo "$ac_t""no" 1>&6 -VSNPRINTF_DEFINE= -fi - -fi - - -echo $ac_n "checking for socklen_t""... $ac_c" 1>&6 -echo "configure:2037: checking for socklen_t" >&5 -cat > conftest.$ac_ext < - #include -int main() { -socklen_t x; -accept(0, 0, &x); -; return 0; } -EOF -if { (eval echo configure:2048: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - echo "$ac_t""yes" 1>&6 -SOCKLEN_T_DEFINE='-DVNC_SOCKLEN_T=socklen_t' -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - echo "$ac_t""using int" 1>&6 -SOCKLEN_T_DEFINE='-DVNC_SOCKLEN_T=int' -fi -rm -f conftest* - - -BOILERPLATE=boilerplate.mk - -if (sh -c "make --version" 2>/dev/null | grep GNU 2>&1 >/dev/null); then - if sh -c "vncmkdepend" >/dev/null 2>&1; then - BOILERPLATE="$BOILERPLATE:depend.mk" - fi -fi - -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -cat > conftest.defs <<\EOF -s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g -s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g -s%\[%\\&%g -s%\]%\\&%g -s%\$%$$%g -EOF -DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` -rm -f conftest.defs - - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS </dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.13" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir - -trap 'rm -fr `echo "Makefile:Makefile.in:$BOILERPLATE \ - rdr/Makefile:rdr/Makefile.in:$BOILERPLATE \ - network/Makefile:network/Makefile.in:$BOILERPLATE \ - Xregion/Makefile:Xregion/Makefile.in:$BOILERPLATE \ - rfb/Makefile:rfb/Makefile.in:$BOILERPLATE \ -" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@SHELL@%$SHELL%g -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@FFLAGS@%$FFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@CC@%$CC%g -s%@CXX@%$CXX%g -s%@RANLIB@%$RANLIB%g -s%@SET_MAKE@%$SET_MAKE%g -s%@MITSHM_CPPFLAGS@%$MITSHM_CPPFLAGS%g -s%@CXXCPP@%$CXXCPP%g -s%@X_CFLAGS@%$X_CFLAGS%g -s%@X_PRE_LIBS@%$X_PRE_LIBS%g -s%@X_LIBS@%$X_LIBS%g -s%@X_EXTRA_LIBS@%$X_EXTRA_LIBS%g -s%@ZLIB_DIR@%$ZLIB_DIR%g -s%@ZLIB_INCLUDE@%$ZLIB_INCLUDE%g -s%@ZLIB_LIB@%$ZLIB_LIB%g -s%@VSNPRINTF_DEFINE@%$VSNPRINTF_DEFINE%g -s%@SOCKLEN_T_DEFINE@%$SOCKLEN_T_DEFINE%g - -CEOF -EOF - -cat >> $CONFIG_STATUS <<\EOF - -# Split the substitutions into bite-sized pieces for seds with -# small command number limits, like on Digital OSF/1 and HP-UX. -ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. -ac_file=1 # Number of current file. -ac_beg=1 # First line for current file. -ac_end=$ac_max_sed_cmds # Line after last line for current file. -ac_more_lines=: -ac_sed_cmds="" -while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file - else - sed "${ac_end}q" conftest.subs > conftest.s$ac_file - fi - if test ! -s conftest.s$ac_file; then - ac_more_lines=false - rm -f conftest.s$ac_file - else - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f conftest.s$ac_file" - else - ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" - fi - ac_file=`expr $ac_file + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_cmds` - fi -done -if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat -fi -EOF - -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file -fi; done -rm -f conftest.s* - -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff --git a/src/vnc/common/configure.in b/src/vnc/common/configure.in deleted file mode 100644 index cc1897a3..00000000 --- a/src/vnc/common/configure.in +++ /dev/null @@ -1,99 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -AC_INIT(rdr/InStream.h) - -dnl dirty hack to prevent use of -g in CFLAGS and CXXFLAGS -ac_cv_prog_cc_g=no -ac_cv_prog_cxx_g=no - -dnl Checks for programs. -AC_PROG_CC -AC_PROG_CXX -AC_PROG_RANLIB -AC_PROG_MAKE_SET -AC_LANG_CPLUSPLUS - -case "`(uname -sr) 2>/dev/null`" in -"SunOS 5"*) - SOLARIS=yes - USE_MITSHM=yes - ;; -"Linux"*) - LINUX=yes - USE_MITSHM=yes - ;; -esac - -if test "$USE_MITSHM" = yes; then - MITSHM_CPPFLAGS="-DMITSHM" -fi -AC_SUBST(MITSHM_CPPFLAGS) - -if test "$GCC" = yes; then - CFLAGS="$CFLAGS -Wall" - if test "$SOLARIS" = yes; then - CFLAGS="$CFLAGS -Wno-unknown-pragmas -Wno-implicit-int" - fi -fi -if test "$GXX" = yes; then - CXXFLAGS="$CXXFLAGS -Wall" - if test "$SOLARIS" = yes; then - CXXFLAGS="$CXXFLAGS -Wno-unknown-pragmas -Wno-implicit-int -fpermissive" - fi -fi - -AC_PATH_XTRA - -AC_ARG_WITH(installed-zlib, -[ --with-installed-zlib use the version of zlib which is installed on the - system instead of the one distributed with VNC]) - -if test "$with_installed_zlib" = yes; then - echo "using installed zlib" - ZLIB_LIB=-lz -else - ZLIB_DIR=zlib - ZLIB_INCLUDE='-I$(top_srcdir)/zlib' - ZLIB_LIB='$(top_srcdir)/zlib/libz.a' - echo "configuring zlib..." - (cd zlib; ./configure) - echo "...done configuring zlib" -fi - -AC_SUBST(ZLIB_DIR) -AC_SUBST(ZLIB_INCLUDE) -AC_SUBST(ZLIB_LIB) - -if test "$SOLARIS" = yes; then - dnl Solaris 2.5 lacks vsnprintf, so use our own version & support 2.5 - VSNPRINTF_DEFINE= -else - AC_CHECK_FUNC(vsnprintf,VSNPRINTF_DEFINE='-DHAVE_VSNPRINTF',VSNPRINTF_DEFINE=) -fi -AC_SUBST(VSNPRINTF_DEFINE) - -AC_MSG_CHECKING(for socklen_t) -AC_TRY_COMPILE( -[#include - #include ], -[socklen_t x; -accept(0, 0, &x);], -AC_MSG_RESULT(yes) -SOCKLEN_T_DEFINE='-DVNC_SOCKLEN_T=socklen_t', -AC_MSG_RESULT(using int) -SOCKLEN_T_DEFINE='-DVNC_SOCKLEN_T=int') -AC_SUBST(SOCKLEN_T_DEFINE) - -BOILERPLATE=boilerplate.mk - -if (sh -c "make --version" 2>/dev/null | grep GNU 2>&1 >/dev/null); then - if sh -c "vncmkdepend" >/dev/null 2>&1; then - BOILERPLATE="$BOILERPLATE:depend.mk" - fi -fi - -AC_OUTPUT(Makefile:Makefile.in:$BOILERPLATE \ - rdr/Makefile:rdr/Makefile.in:$BOILERPLATE \ - network/Makefile:network/Makefile.in:$BOILERPLATE \ - Xregion/Makefile:Xregion/Makefile.in:$BOILERPLATE \ - rfb/Makefile:rfb/Makefile.in:$BOILERPLATE \ -) diff --git a/src/vnc/common/depend.mk b/src/vnc/common/depend.mk deleted file mode 100644 index 51d4cd63..00000000 --- a/src/vnc/common/depend.mk +++ /dev/null @@ -1,76 +0,0 @@ -# -# C / C++ header dependency stuff -# -# Needs GNU make and vncmkdepend, a hacked version of makedepend - -.SUFFIXES: .d - -CMAKEDEPEND = vncmkdepend -CXXMAKEDEPEND = vncmkdepend - -# -# The recommended method of doing dependency analysis in the GNU make manual -# turns out to be painfully slow. This method is similar but it's -# substantially faster and retains the desirable property that the user doesn't -# need to manually invoke a "make depend" step. -# -# As with the method described in the manual, we generate a separate dependency -# (.d) file for each source file. The .d file records the header files that -# each C or C++ source file includes. Any source file recorded in SRCS or -# CXXSRCS will cause us to try and include the corresponding .d file and GNU -# make then treats each .d file as a target to be remade. -# -# Unlike the manual's method, the rule we provide for making the .d file is -# actually a fake. All it does is record in a temporary file that the .d file -# needs to be remade. But as well as all the .d files, we also try to include -# a file called "depend.phony". This file never exists, but it causes GNU make -# to try and make the target "depend.phony". The rule for depend.phony then -# looks at the temporary files generated by the .d rules and then invokes the -# "omkdepend" program on all of the source files in one go. -# - -# -# We use simple assignment here to remove any of the depend.tmp files -# at the time make parses this bit. -# - -dummyvariable := $(shell $(RM) cdepend.tmp cxxdepend.tmp) - -# -# Now the "fake" rules for generating .d files. -# - -%.d: %.c - @echo "$<" >> cdepend.tmp - -%.d: %.cxx - @echo "$<" >> cxxdepend.tmp - -# -# The depend.phony rule which actually runs omkdepend. -# - -depend.phony: - @if [ -f cdepend.tmp ]; then \ - echo $(CMAKEDEPEND) $(ALL_CPPFLAGS) `cat cdepend.tmp`; \ - $(CMAKEDEPEND) $(ALL_CPPFLAGS) `cat cdepend.tmp`; \ - rm -f cdepend.tmp; \ - fi; \ - if [ -f cxxdepend.tmp ]; then \ - echo $(CXXMAKEDEPEND) $(ALL_CPPFLAGS) `cat cxxdepend.tmp`; \ - $(CXXMAKEDEPEND) $(ALL_CPPFLAGS) `cat cxxdepend.tmp`; \ - rm -f cxxdepend.tmp; \ - fi - -# -# Now include the .d files and the "depend.phony" file which never exists. -# For some reason GNU make evaluates the targets in reverse order, so we need -# to include depend.phony first. The "-" tells make not to complain that it -# can't find the file. -# - --include depend.phony - -ifdef SRCS --include $(patsubst %.c,%.d,$(patsubst %.cxx,%.d,$(SRCS))) -endif diff --git a/src/vnc/common/javabin/index.vnc b/src/vnc/common/javabin/index.vnc deleted file mode 100644 index aecb6131..00000000 --- a/src/vnc/common/javabin/index.vnc +++ /dev/null @@ -1,13 +0,0 @@ - - - -VNC viewer for Java - - - - - - - - diff --git a/src/vnc/common/javabin/logo150x150.gif b/src/vnc/common/javabin/logo150x150.gif deleted file mode 100644 index f1699ba5894157998459c8455541206c04091d6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3584 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 diff --git a/src/vnc/common/javabin/vncviewer.jar b/src/vnc/common/javabin/vncviewer.jar deleted file mode 100644 index 9916d39822c9b5b8b47d368230c6651a97de78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104689 zcma&MLzrgWwyhhs9r1;2W!ScDX4tlE+qUftXV|uF`~GXMeb3$d6xMU+oP|-El|FhK zZ*OfVNP~i*0YUxqws<%(0sW5$?Vq)*sEQz+q?{Oote~8vn5eP}y{uS>x@1$KImVWm z$amN#Y6^1{_8jbQHFE3}yunezqRH2bjhDu*&dhyHZsDKv{iL^f$XzuSwjGY%7(Q_`$E4mbeH6yC2DGp>B{pLGxwft5FCj^zh(T!{xC zsTroyvPR&!IPw}gp2LAJvQJnY03>(Cxl5l9?{ghiYyK^dFlWZdn0+tNh$_*(6MeEs z6X*{ldJ6+(lU;zm?La$7-0P}}z4>v=^^xZ0-$gf==7dCalEFL;q~$qGZ);|8c==f{ zMYyckZtXMUXB0e_o(Y`4yW7B5VG4eiGthE*lvECIqUBrQ9m~A|b)XCFoM5s)mI1P) zi9{VF_Kqmov#IE&N)PjbX|A54HIz(JX;^=LBIl8`z7O~C9OsH}Gb9+n3Df1oi8U$C zK>yk_sn6kBqefDTs0F;Yb74{%^6duQm#29xrA{=jDR{C4?Q;wsOMirb>GIu@%sOnI*>vkW z3A>9Tz8&;N_1O2?k#CQ1!+FB-l1zU$h`4htWyty~lfWu?)ple0Ksk5$X1n25?4NgH zm6kAqd{PJUpdGU$Q5rT!@8kjL4wEc=X9p>h%`))u zw?PUmlv)gA4cG7IPt7(m(GXj_;d56kxG%NUiRPGC^P3wUIoHOzm^ad4*H8t7aaY$J zMW#hMxCL_YW~j(-S`sq`XQ__dyrRP6O?D-u?br67_%kbjlFkXe+!f^kRR#+W)pKW?Kws+py!YX!Q^N(U$JKlLg8C2$R%@=w zEB1NKy#g6d+MQj;XrmdcDF+r|g&{qokAI--K*>E;mA`_VQIcmC zy5RqwNv>Umz>7bD>v(dI_-W!^UzSNOz4u{62^*B;=IAIVnBkgkkB6)4SW?X<6Ta|U z(-dUh&L(Z7*GO^(qUfiMzYo^BGt7C53w8HGeQfp+#<--~1gVy}R$@^Qmp!tD>FiZP z>+|%OKh0at9oe^uXI~vlrrKvr(I85b+fmW`UDxg*iqU;kN*D%QShKp@F))VY_Zvm~ ziix|ibBg#j8KlyX+Zfo^P&AY8l#jTPg>-NAOSsCx=iR#Yyt)MWzSQp{W+~C!%fo3 zOx)VYw2{48=Aczz2<)N|d!J6)!=SLQkqu2#pWk-p`ED>us4^XPguCjj7Bzm03pTn! zZyK(81KxLY->fu~zTgta!6B~fL+{E;;sN&khLZ!k81Di$$FVdcySO0SV2wNhFoEsI zOB@QD%f`c%dQ}QX#zIXW-&=1QYTQ~zZCS+g;{Jl?%!25#+f9=E8m$TP2X2vd56>e)I%s2jQ zXeIcVyOLfXvm2k;t*=1OKqbgDsbo@M--dsoKHuls!WbL(pgT+v9tycloQenLsC*jT z{2lzpt{@Ewl@@4E@d^n9WP=I>r11Zb97KMxGm3BuG14oGg``Q&WXWKJyd>NcY@4)I zgH2va^Z>!JnbrgU@>m#9fHS2eH{M-gmn^>a_U^vUx!a$s@UqMC8kaekzsZGvH4Q42 zHGDfT{=oZs53%##3AhEYe}4wO#(n|F_`VJKCJQ8e}bVPs6MELo9-9JSgWA2WM>qGd!=;aI2 z`)>3O_?(|Ge&ZiLtmyyc=MzbJ2o{@X*1EQ*7h2uALr{sR_iuwy5!`rZ+TE>>%sNL~ za<=sc^!scV5Hgdg`fv9w`JG!8aucU)4ci^hAh1-Gt5gRce7a^n%y=Sk{3x?hz1h2Rm63=gQ5c6Kef)?`0p`%tQ2hbzBVuS*zZ1D(J6>A-U z4HfcgLB6#FFsKd=@1bb5p3{-uSpoomeq>NQGr}W?XUR!~GoKKW9pl1Nqp4JMfjMQl z*r!I+70I`F*_<^rjoJ4bs=_O&uCC5RjZWW#OF{p3n4txTQ6G&^4UFaV4j84<-S%ZfL0sx&Q)_eWxu&L)e2sl=1x&8Z^HZuH_wqnob0D(qkr=VfcD z;O<^l%%9@Y;IzOVSfNIC9XL9V>|Jgam*+czl$RT0UL@txM!-j$Kmp6!2G4y2kyYxv z7Z^kPG2h_p)&UiBXT1z`1`|#@-nE&c4RYEMm@Taa+*lK_eT&ST)K*<#A<|%^?JmKjt(uKHel2&u*%BcZ7xv%oi1C^m9@hp6d zb8gwJX)RHtAbS_dsm_psg%q5C0xM|(#DhOPm}D(IzJA(ksz`M?T373Po|A7+^$*)u zLbu$H+hdwoB)`|1?eUm%+^NxqfllPoITTmFNHusJj!FVFunynWdK!FvRufTZ99NJ> zO<;HW2a%pD#GSY2-_0bnMs8jbG>_>6jfJQkq!MBPUyK1BJaPAKnu5&x_lWF(Msn~Vg^h#cGh5)FvakKZMm>;)1hH?>THwoE6?l;j`OAXX18 z1tJ~A5UHby_35W-Z&(UGaQEX0ysYg_A09DML!+QXH=v6R{hhTex-R+ELc7SInWqpP z#L?y)i1=!5Y3OM~k8ov8PPRqsHua&%lVFG}x_R-pBzsQ%&e;kngQGy_)+12^(gc&) zT>C0ff3Hf;*r+~ASuX|Klul;%@a5Z!gz|;f&Deb;qW;n}rJK={rvlN4ksk8HkMk_a zJqVM$$P-h?HeKm2vmWa;JKAL>#0*AbFf)(1ok)o~cp~m30%C>?XBCrt7=B6fNxxQY zut&_jMT)ml`IIX^QFdwY!{Pi1jNsR=u^iIX6@ZJV4Vrn~0=uT<&&*`xGt%g(j{mn-WQXyT&4 z`;N$cwm2WQ##9d|=2`{?!>$H)m)+P`&&USW?e8Zm-PO{^?B)&+Fh~m6;ZOi$Vv<4I)lS@-tHumli&?T$*W88F1o_QA*=IpcW>M26 zaaNh{M{i7OvaOfVxyCW29*8r5wSwMorcA6h?Q$i`VCyg3ju!`SEP@~bo+ex8>`(-U z2-9$F;wrbdtDQAm%Z(e_cAYb}+&c|2>%lg4XxUcr5z`Ogi$$Zh4f%#TLPS4}UPc)4 zS)SGfii5v%-PHp929wSoW=_>5>*E2GMl$!r$+FM(wF)`a;xNr4qMqv0mKRU8xGyO( zyFHEP4(Iu=?k}&dC%1Rz_+GC>g(F+x`EfBZ{GK*&0IU5+IZ(Cq7v0;8%?GxX;OloV zr)$D_QV1*Dc-Qr`51G%Q@t|(#MCFX=56_aE+^^lDPOC4Fg`C-u!*8e={M1cfyOy7S z00R=r5?mag0SXAH?mq$t`v0^l{ts{{DGP3;T4*Sb;*2^qHjSac6AGf3qe#@i9+y)QLMgTDr5QzrN2&{oASrrNN7_?`r%J6^CeVb7B3njL z?(!0a@Ak;|JxM=g^PF`5`uTN|lksC`3RDPD#h@uu?9t|vV0FDv3D=LsA zp|)fI4F)&+njeG~-iaw-&j!?gOl_|L71ayWd<=$!zcis`2%j%DWb+4=YL(K?ohhFZ zlv&gXRh@P(GMI&&I|KFt7|(<$qOcUs0$Eat$QmS-dSa349hs+9WuSy9DR@6w1X>?U z{=nWq+n}a;IX|7bgBY4WcE(WpRZ>WcLp^!?#D17X-5d7oaG3B}0_mB^pn-)pDcrUoX=lc1Ps!9jR!t!S=e-EBwhJsLqfxAitd?iRqT z21AUq9ww_*N6)ey_(Pa04+uo$AB6CB>KOd_+Nd`hYGY z2P6nCQQ%Giz*Rjoc;NOPG*H+!-#rn6>@t@<_|x(+yL<)8)ckx6a;`C+Y+jR*QE)A; zQ^iCsOwfiLYhMDQ44a_sjnMf>Ip1XeI^|E>4%=yFY%N{elU-%sRny0N) z#WN-W<9aL@rq#JF7Ip6_r&eF67wv^yQJAXB_uM*9*o*|j5!1}dTC#bHhRh;cTKuDr zf{Ku$N~M{iVqPBc9z!IIy@;YihA_BV==6=^T77+=+8?1M=!2iD;47{%1a7T*(o}>j z5LDI3MNUoHG>qvuOzIGs8-5n+!6h7kT87wq6^XJ zn9pve$xK+tP8$rYH_oiw&20}p4I>UtYj#VTc$fkQA)YMp!`KX`x?)Bl&dM%h$3>lq zjf+adgMNxSHW5+YAi;6DiHbn0q-I6KA1Q7l0p>ccfoX?eK0M*i)D4DJ38C(m6P`Do zY9F+=(H?>DT%WWc?y8ECqUEp;esnm$bCq*{|1~7X8`io|L=og>_Ng=jxZC{lN+g>w4em-tK=jF*D5S)h|rLe!DB9 zs&Ft^s}h$WKNzVK&19GDlt0JBL+uDnmIlqMeNwU7GH5pX?f-jCoh=&01@&vAGJIez z@ri%i_nS0|D(4Dp(@@>rlt3T{KKmrZV6=P27Ag?_j}iJr@`wqAEu0CpQ=lphZX_co50xCTNz`$0JGhX)z%juFK|nK;c?TCp0O6#Y ziy&kucfRmde`=7K4GsY>j3(_`0+IzL8FN-i=1#XTwkix-mEaxS?DLYT50n%Sl4why`dkTd**d7lXm z*C8hVwW~NI_P4MyM9RCJQX}XtF-^&b7mfU6+nvVAKWj$3+aN3#+&AQ3~srodvB$B{qL<=b)0iu9>a~dqi5B@;yvkuLPsluyUK4}(gD+B1s zol&4fWwR`){qUrdmJrid--LdU$)7c}9tkVlVIs4$yd!9%5j~7cDJcaKRIEnYC;te& zpC?v1{rR%CAi57i*9geE`p<3REaS6@vLf|W4JDXri0F&5FpM${GaG z0*;GW;rFLlUle% zMIE+?#mFNq*k`IWn9b-l7C+^Tt{AjUTU?K>W~^0~`-}7Bg==Z|Q$MB-Qfsx!CcVYC zVB1b+GsyaR6SM#U!xUK+{63}SMqcMt{wO`KlL9%`6EE=A6New&N~_@<|MOS(HkBrn zqKBuEZUycfuX(bGC?&Am^_zQG*Uy^9XmTzBc%ti;v(?pOokGja1j8{=Z=1+(78={2zA$9PWR*6CBR}JJ-PZ2Nqmy zja@BF+)Nx9WKEo${&9?j?A+;%tqq-=QdD=80jg-eN;hX?RJhz|>X& zKLJ9UbtKCQgIn<~QfUpSE|xW*C-IAD`FBW;gRBGL3%r)pyM71n+bu|a?_1Gt zn5V8Ts$dL)%?z)X+@_OUr{0@vua}iRzgJ|z$6eHbpek3}CFYe$rJG<)dH}f7qNX|# zn3ijAw5He`RXG$)Fu9nWydEYJRX}O5ahmR+YgvrZFkB#FN^ZXd8&jfWbXiGa?|_Qw zXc=>o5`uzjsu)e}#VW|hLexm*oK+_37L7}lK1IJ=MHAW<`H zvuzeiij_vIrjmn3euH)Aw^+d7T+VNwtzg5X#`*Y17cg;F=UuD{FE(lPQE-)s>8y*S z2j&?SH>pt?j)FZCXJo^ht100@FjGH@d;=e>p$rV%jbQ%|$VVxdR}Bk-5-x#V8AlIs)Ft`3o1oGShC3`yz4wQk`p3yU~8BV~8=klE?EKUUHy zn5YBEfQ#QT_pmOF(;0LWc3f-G*+HLTjT~+Fr5~BC@Qb#?$+9B3y9#W7hov(#Wy}{}9M6E#!!kLjGdHXA@d9a{W@7Brn>h>?A%@*ndj@?O%H!F-7d+uiB z_7M-5}0oY@m?WUY-ZnG$>Lmr!eMcEcIUeAY0TStrEX zpJ6lC(L3TfZ*#mWB|IaS0asG!%D)<@w~yW3j=340y|T^bM&2mbc*IP(9OBLTg4lHs z<#w4n;|C;7y|N)mBVXoX;*dtoIAR!PqZsDG!cIqDID+z+{CDgz{C07_hde$*1lK{; zdtj{h*sk5f+YAh1t0z=rvmvpb+zt&JiM!Jn<#Ps3bt&!93*%-QfTFlG>-hTg+C{9! za&V#`*&CWc#UBD^l#*gz=w{VjFi*ChepBN*o;14`+5^I;1=-oZo?47f$=bek-|G#W|$q zf?a#z6MVw{OX5uTnSHasfPjwvk-7iRfc?KE4*P#eoSK}l+JA}NzZLFE)59D0$;D4T zv8T$!yGGs`)c8Pn+3*dlI~6{W));$@Ig!q=3nI?d%x!c%N7K}_CAA~YJ~&IDUrv~@ z7&)1wzf}!EF1uNhuz*tn6q=OC=5(v{Y^&4;=Ih({m)B|jQ<>i}D&WS>_vYpJYx}0> zhTC@#K+x@(N?j4)mt}G6kB!Ipm~G4cd})1^AP;O*dP`&@V717ck$la@HbEqi0`4jG z3pGYpb7Apa$l2^_+CgNYUu7mqB}c7<(nNUW5qCiSd6^X%EYqIz1T!}jQ$FeIJa z%13Qkcd8laqbe8VTupmrsWp91D4&|M42@%jk)*kQq>CQwn^@4 zz9l(+es4q#!oqVerA5Z7lZf%GGeg4Im_AM0A_$d2AG>AVa0^%{D!@NO zW=ZLf?N|N8;U@!3=(K3b?2mW^r;L=2lTL$R8h!}=FYZfsed8#T5?71X)MeeR(10>i zyq>{G%ZladD-AYfiHT0Nw%o*<;Qcj~$|WgH&1w})a`#-a5Y{rdDXKI!65|Vpt=1=v zEbJDeTcQQ)v2%~+Y<9}q1&dM$LpzF!J-kv2EtX2N&E@2TvnCcmGF7bY$oR2Svx*$R zxid+vR=W*2mo7B5v3?3IeW>Vi2;=BMH}wj}9h!ArwoNB&%ob%iItF6LRuZ)eKRUym zV8O#-&~?)^Pbq|#uJml%N^9E2THXp8kAaFWpSzilmo-vYX{cWo5gq}oO?c6N(Jync zZcyrRJ=8A0)O?%~-tCuxep4Z2c8!`$wl$iuKbrwr4Yp}~@U-kVO_SBg=t3lZ2;1B- zlIW>p$nxB~Wo5o;L!03_chec));1ln@~W^wp?DKK(@TVt<+ES%WGfP>jY(#(L5prk z>s(17actRI1aQ7xpn5?~nlP9IxdbI3?(lxtEd6pT%XSJREl3j!AbBJeh>QT~b$88%mOu8gnVx zKn5P-Oe^Hrix`2JHYNKD4k>1`j$3c1B%IQp}j@0ptNc){joE_46fCDgT6dRZ2Un z4)pqpgy~|q)$-r1vQ>f3s0*P^+*9IUyL3ccLT%K}$QApHZ6rRAuWzgpZp<}1Mi~>p zZo6>#SdWSjE$>f)8Ct470_?itrwp4Xe;2WfyU?@_JudNst=c9R1m8IpT;&ZW?F&;a zU~Z(F%k_{ziLj-E6Le4vm-5F+8A3owzG_nhj~sQ1*9o`kW{vF9AQNIT#W4d2d86|m z!Y!KxREs3BfJ2jsv}*5*V015`z2L?gySjbBpnE1z1TzI@)06lsW>MrPnTmUlp(o_x zeZ$7?m+kpz)X9NMk!j~^i4V-dJyFcBQ6)#m2=(?MW{uPBBhOO+tjhkm_Hias3FS`~ z$P?kzyb|(M&5O!c7JF#=duFqBmk@QQfX|xD#MA@ZZ32r(6NrQzb^;_~UL(@^WI@AC z+~OI^=1JixGsU_QwJ{*xFj9I;^LXF5vp=VJsoa(Eg_(`+i&dEizZZz%;^{;hpPDfN zp1$K`G3HA1pM%E+(dj9_lv6QK|9al(JXm#weWVFL^7zOV9I24V-9`$zs4(Qp30**( z6&hw+US0s>0IT-#Rh48v2V1OpRvn)bD6+m#J%W3(ijxFQ0YrPTz zNoxis&Xqg)X(jHtI+$wy>P96U?etoxPk{2`sOEX*J%pGk#bBF;w!vU3C(Q zFB1BYh}10{=^2B-{aTVQzUD}zK<@e`@{yK!WlIE2jMEYJt-=0*aPO10gW0|zqLH%? z2J#{3@e)H)DiyMeD&41h2R>(73|U6uixs+o>JmNG?ei_liUUMc(`79IePKoV>oe0l z=I(w$f1#ZSORP^7PE}gy&sEOm&CUcr?TFjhH~PfZy;{@C6~E=p<-uO}8EE;+NuYfD z#C=O$eyu1#=>~LLQ$Ds0fQg@;>_cj)MtlSFX7zjfNfZ(mVsv4+^pR~qmNj7YP6NC2 z3HX9>GAGT80O6;{)1jR|h9|^V!c11mQvHruG)4C->>X23tPv3kPSt@8i9|jxS0s(& z(`Dn7ATJDK+ALn5C4E_?U4ZJ$RUDG78V7$htau`!UjlY`51dqr70SmTW0TCCDv)D1 zvZ5j(=SC1mr|PW_nNeMDlE9LtIxEb?;$>14`3))+Y|GWo2!BeWs!E!dxCf?AiUu>! zUzjC{9jh&{#Sc6B75oi8M@>{Y+vfrF<>s!)Z~gjL2;>d%eFka&whztnc7DVU)VMVF z;_hSKgB6vnl*Uu!vWTXpRjC2QF6Fe_K@lm4dY$d?S8X5yQx8Lyf_vj-H>W>Fy*ov` zjhuf~KR7}AdpT^7&Sv?oN41Jmco~}AiX&YNNK_==uEl-oVXOJvcd(6#s9w6}FEtp1 ziC-MJ`)AP~XDt5SQRq{pMERoRy=Nh`2K(E+WmTXX)5n~rJs$L{!!~A5@2X*Ub|wSi zkZ;}$3Wp_-CS|6NT?84)QkY~Rn72Yi-yk7sN+dEfm=TvmwTPkzbV}y%HRx8DuyJFl z@4R}EshMdJN+H|*UGW~VW|`U?Zf`G;9?v*>z!LU!pP)U%qEgw~d!9G(@T*;)P{6h# zzMv;;VD$r4z?6E!R)@0Hco_jJ1=qKpcV9w4?WkXmjrYG7*4&_cX23eIAp4RT{<%t^ zv%!J#dovJ2Ci$KFbmUuorpjG+w)NMp9p|;GV%@UDyoJZLTofDr!+e-p^CxEI-esRoXVg@72zi&UV7wDa z92*d3T3el^uA^mS!EX zSl$^v#E0h1lL(a4GP8Q1X1JB-&pwU(NNZu|!KHnC3B>G*eX3JPr@ntiO481yJL8bJ zh`It9A2*eEQQD%tpQ1Id4g6_OXoRoao_27yZ?7tt3p0&&I^F35S}$G%2CSPvM)ZmT zp~F>c3uWP*@qP)3H>R~#<1j)w1VNid7^t^=_zgPVEDN_Oduv9+bo)-+txpk}EjO(# z?7crCp?#rZew%T$N63|nAOVS$af1zj4(3sT{W@3Cr;3O#OonbbC?yc^QVdf`?9AZI z_YFZAequ?iFf*t_l_fvyt+nP2alF^~MmuSiHg&S^hHt(<eest{Lz`=G z?PdAI!t?xxa>=V__kw_OetJC9s8>*JAp(^R%2j?&{OJBcGDX|HcRPfgBLcJAQf@(Q z&)(KvZYAbSF>h>noi~6_+j+2$$>wCSjSL8ei3!_Y!AXg*1 zxAChfe!)iQ8Ny9UT*%F{UdKw-4yNy)EdIkO0%*U1jeQ5ZZ;{t>_Mc+*AC=by{2vGT z@20(-r$a=;@6YX9*uAv+?>9p(MQu)*GHQ1CxgrGl7!EutXYUgrjiN)PGoTl}0JUrWMu|xA15uM(==0R*fPt!< zT41P>Td0$|;~;PlZH5&>Ag;M8%wW9tJ`cJmbo2t>H%)A3h8(`$FRE=*73JMV)9(4X zz)4UIm$-Wng#Mf;$D4V#`@>K4dI01HvMY~~Ktde?xoPDNc%O5IMM*D*`#Xhf)U(uQ?mf=x zlO5i%O-q@(cJ7AsiA_IM1cbvj$)8(zb2Zx`DmxHcJF%SJkXoS1R$$eh*Rq8xjSkTC zPI!(^*w>CMJ)rT(h)BK1D`k1AZTgLTo93vx#0Z$&W4vB{zN?LD_+GP?MikStYxFqx zRc@czIg8_c;G<1XIg!syE3Shr zAt3s^RuO4+ff|(0JivSOdW5H5mwUy4XmrCHmtUjpcto2TJYE0tt~0>di^IeMb2h?v zmcuKeO2;n}D4AR%wmdJ7y-7QO@SWv2R7ILhP&f_*0WyP)W=fIRVsH%i6{mODSV zACD-&;0cNsK8`@Vm`7NBp{Y5KFG_|#7|II)`_SX{8{8sa3mcsM4Wcq1@Ji&1bzD9g zbByeZmJCHVus~5)jL`8w6W5*om{7ZggQ5bA4h*@Zqm1#B#Ur4a zRm&@PX@1r7#Zr~tK>8!>^_Ra;4K?13Rp-q*%NX?iw#@i^eSd%jqxY$VX985Y7)6CS z*47Gp7*1sMT4->vgjepW>Xr$GSGTh^(&k&SrU6}_{$?J+ro0O*!lTg^8TV|$j2Y`j zP)C=I`6QYWHpBTuIHFKyRBhTaJ6dCB+O`plz6Pf}<87z6nX~q>=e(GX3(2bE^GS~| zY8|R$wi2Vw)C<&C9z#W^LT&v0IBg=T!g16%vBUvUa9iSbH=L$xy9`i)p#<2|q-m)< z-ad+t`xK$C30Bjsr0jHi=IsMWL@auQ!ut2^elx9;bb83Kuu`Kfl(mIBh~vAW;FkVI zaoj7IctnpOja0H5^Ax`h4B@CK7Z(T-$r&n#BLS`v zr@OHgkF89kZj&c)m@&$BP&J2Zk@?Di6wyu-J>85akR$ZM0B)8lr`iI#>=Tgy!3%@1to@P0hnBlO!gEK(Q3 z+B4$hTNu9(+QjDV93~z*e-(Dm%TD$=7}CXO3sH>efh>hJwMX0P6kya63p+xr*b{td zi~_+pFHmC%;j!N`D80t1IV2Ff)M0N95;(gWV@jh9{{7*?pG~sd{^Qv7R#r^&GjywM zO=(aU9yrTQsSq-IL89W2HlQe!Tu`TmfysDXm1?f8EH8gsChY>^w^yKjWye0jum4|H zGss82&22$}fCj+-Q`;i{)3%PLMht4U#)2-+=KpS18x?6~l7EFPo!odrrl-JzgAFIc zJVGc?ao8#bSVRX;epzb1D0zro-S-1YO@dUYoczvh*Gm8TQ=Vt#Cb)Avg6iUqLYq8pUhX&cKZZ93r$z7M4bvmh>mh^|YPXp79P&LJ`Ws(C%l$=A z;Ta+Vg%Ep%eGtpMza|puE1QU$zqz_MeynqTQ_tw{Dy0^+hyU8d&QDWc3b3HLr&gM+ zF3=HdV{-x@T%SN6P~%W%teMjxGO{^@QCocvmS13Y;wSvhspS4^mW-h>g0_#Pr1&<2 z-Fuo)fZphIk5=b4KR~@I714sQ%e9^V&%pw?I?TgnHCHG7<6?7%`N4~vpnb=|X zi<~TX&^v36eNqWo@;Ef`yD(~zX|lPdrQ@HUlXLpSwf|<#U7p8TbLQCGW9-i|B^-7r z<9vkPmq7U<9c3E6UV!-#F4@!3*6*;~OREA8;TO54`&3>m2_aZCXoz`Nclq+4Ldbn` zmXb!ENz9ZQ&waz$Gai~w_%Z2YK6bWQ-X#@#Y)^;;{L=UFHV{0&#{#P!MT{9Cp{f`*1L;NQ(_}4ux$KU@7U2P<7m7N_;3~l}` z2)gnUasvuTylJUrs`xOGg}VT&WW?F_KN9m`E&)VL*0hf(R{5-H0|R!B#>7l>A}_wl z4z?9>_Lxp))05dw#}5}zcrXYGrV=pHD$^c2_Bgq_ru;A?`I5JYide*>t;SvyaC44T zmRMf05KoIO96?IkR+dmCss521pjN+vwN&AM&F+Iu&HwG8C^s~hASP>IG2ComnUp^V zzgKL-^JThh>u6`*;3b}3+=^YZ${a{_0jk`t;Wdz0DYGU}oM7fn%I@5{_V+5DJ&0X& zh3u6K>h2<;ABvx~&#+|-yqLkgX#8-x@B{(eN2g!i`40LLPK6sQ$k9fGa--qtHI*bS z@;?o7JN-7oBkC0811AlD8m3f5SVEaOV~{xgFrGXMVPf_)d@_x`M0FARJH~hQx7-NX zfz}Yg<9CA$dcHgs)YJzI=K$+|+8T_~5MdLDiINw(Re)=VFDLqPUV_JGO603Se_8Hq zFsLQEXma2Yjx5dN=ytusSKw4!#aCgUe&*z-R+M3sH6#DVa}CqwYgX6JzY2Q;@racQ z3@}CNe`QIupWM^lsVCZOQW8!S$`0vujC~erHD5B{?LZlCta36_x1S}0Wjapn~)p|_&T#x(-bX;pV_c>w|J{+=c;RLN>EO*(abelh| zHPQYy4wWf&{+*j1l4`*Y3)yS6HkGp{MW$`4@SM%1xbhv9Kxd_p5H1{0N)&jCCDdL> zv>ZW>l}I*mT(>c*dfm%fMW?hZEjMMIBD;d(p`h}Km^#X+iG$-6R@y}6&5$k(QLcHS z7n6AzEcVjQ5COM9@@ZzlU0uG9GdN`MD^zqH^JkS!dmHFO_9=YD+sLXtpoF8=ID_bL zm0C@rT-al&887W71AoOH78azLywq_+M>Lh_Gs24+uG3F>nCnQcsGv~b88AdHlR#=C zK8$y660At3jJ%OEs+P^>k(aI-dPn}Ee;c}H`}RA_kU9ykB?+wmkbzK8aRL=k^5i@L zcL!Q_wfrhA-TPM`b_Xd?qfi=MAosBrjcQ-@tST^>QOqoxS&qN@Pl==0H}{CsnVm!= zi3`yfS57CG4%s~|O8OueJga1iPFOgV3@CFZ5n9q5ttb)p6f%R%k_RoAdakngBLY0H zPehiP2Fv4;^zUg#n^R6~^U&O~U9^a7p-{de^HYHCr75OYS5yzcU=RfWokw%R`!c~o z8(->%hgqUob-n-iGb>%ye-+A5EW;A)RW*B8l!UaCw&tVBgw!Y!j4(-*vDEQVnz9X zk0-6bpHpdPs=7|7s#w0QvW;s~&p`ufQrfb> zXOJb}Q3Ys}1+zl+LKe~mDr8yC3)Zqp?Q2qALDPTX4#;}u_k;|y&qDN0;Q~p1dEOw} zch75op)Q|f!*7K5)N^;8@ZNCVj6P(a6!(389mtoDBGXcvJ33|bQ<+WCN7o!XwpIx# z&URb-n8RaK@6YcpO*ZB{sVve!(P`zD6SGN~~19^FW zDwes;3=n1TT+B@(CCkk9HFd{Uud7q2R$;Wrr8TP<%{pS!)pLj#ZdAUPx)5`FR?Nmt zK=Ec-Q?FHK30tG<{{6HW|^a`AX`h>R?GjLoc3M zoA&Il(NNPnb{%ytd$y{Wdh63U^+5a6*!L6DIcn%*WMA=$vO{LcHfwVt0L1ykKq~xxC}F@ zNsAXN9re-EggXZd+71-3xMFn7A+5c$^;BZzCM#Ntwc za*iBg9UyGe`T{rs2R7;)Y%jbAAGmZ6GxZ--dT+74T$e{}3Ecj!BX0T7IpznGx5o8x zzO%=yRmWK;*IcnSVR^et$ETR)?y;}l6W?a;UnjkTJ4IgH4pG(|)6bptfR8h7!lbr$ z=*qE>C1FBRG0FxlQ-$dO`yEtgKR|J`#7Tc9{@@Zzmp#@OHyEP#gVJpQUJ#@k9N)8} z{Yz}W9a#Tphj#T@VWUL6AE&UqEClba+v(5KcAKzAi0Do=#Lw^`GK$0#?=Z9nUx>(1 zw7n~Ho&q<@oUC&jMYC)(^9R*0%SsPr>8w4-rWcms#dYq5xYqA(Ow~#AFzmvwi)X{@ zG%fCdebB`LLTQ4d2K)mjv@*^<5xByR>>UC7cBRri<}U8lSH9J zwe+`{UECU|D%>(pmr8F2tL!rL;VN(X+4*z_TvXN7J|;O8+2ucKvP)rjHJJVfHio~9 zEOXwP1-6M4#2>ECrU@9S3bG2swf(G%wkYg00=Kda2nL576G;)9HWF}>$ACIhP{JF?Oz1xQYpiy^JTA3DW`~!4K;kZaS9SgOwMbyJhW7HZYOL`Tu}WUsmet@qz!($OZjQ6B$2USrHaLN5oa$Uypoy;L z!8Esu!2}2uGCf$|nrV=quT(ZKO(^{?=Of3-?7>u?)Ho@ssRKRQ+A(!kadl6@DmB+F zqAnd!TfjtkycrsuQ)8!ZTKTmyctAJnaVhE~z41m54I^OyYp zVj?+|-pHAMPJ?im|HMT9FYHRni@F<|*gIR;+5Y$RoA3|p3ZRAlC{w3tU1JLBwihE^ zff{UL$+E=I6I#m#Ku7l@U`O3+(Ju~#Anpod&!C}3bf#xG^*-cHOnQ6w_K<`KU!q2O z7JfxtG%ab+8dVg+g~zkogO)(0Y9OEY+q@#ZE7_PnLY@6Te7$pY=j_5ZTHAJ~wr$(C zZ5vY?Qyah9p4yz+nA*18ug^YbpMBoF*7vTJtgQT(OM4zxQoi5l&hPkY7nNY7<|qjl_Rpy(@BJntud5g8fUzVlAhi*T0p zr!W-4C)N#Op8S_4U5)MOCApW+zf7H_ti_Vl-vD&A%^*e*;i;2P@P62A~P! z_VfQ-Zl`Qcsf{LkZz&yZC^VdoP+p)2aIva_Ak}?vTvjRa6V;m7Y^Gg+=8SO2f*4^y zxNvrcX7PenU53k7+}EB#Pi>7-zX~3s=SkTXJSvy(h>AabvLrrZ*a6FDh6f2je22rE zg>gP!GS<1KuM*s(zR__Ted2iC+#8Q~fiiY{c{3wgk`T23RmLD(3MO;vDcOL3>5A^e zGf`iBB2k|VzJROJh%r7p4n3Z#OFfVkNE#W(>4 z-(Vd5ttEpTC^PzzI`$)wPe_vFO)(a(U9F-raf>3(eI;^P)r2GsDHNs!g+yBX2#z`5 zSAnmCjFL6GIV;fnX@J?h&DlJ*4ofpkzhR($T0z9C+m-q?s!U%Wn!Y2a7|XXOPI~mp zQcrQQzxk4>(~Z~;sWKFT{iIvx-hPijjbK7@g~@Mqjcu*TBaauB;GyYmQm>(19l^i% z&AqY6IFSe9cnZfkKRnzeJj)~8BYJ>+faF}M>S7PiIbEb`ZkZ?KkuJzh#8cSI?&){2 z_K|?3j~L2JcVy7N?#dR+BH{h-Ns{~h8Ty}z^551t{Qp5Ci<-IExH>p$SlOF8c>F(i zXO0%EZ}MV_0LAEpX&53@Ag~As1ehE-6Qw0uzlfwK7>a(MpkM++2E%Btsd;t=Z|`b_ zBBAP;4(zj_s0q4(Bm{c2I-UK7TgU3}j%u|to0c`VJiXtm6(4y%J-#enif=j}WKTC6 zK9^tFcLGPbxcVQbfA^B*EN;hTQQL{>^oT0gqNdC0QPvV?S6&rKu`V8wSYkJ=-7{Dw zF85=sS?0{hd6OrTYsm-9i|mG1rz8h$5p)QgnPMZtf){5c=b}haHPzDemwv^B6WgiD zYSGcjnw-u_sGEq0@`rGzM=|qPAv|dAh~-pQt9LdJ*f!RYx6s)SuZqwi@i$KaH!tK4 z28}|~XyL<4@a#R9+d6@TYe%{P5NNt<`0O+K0@LsD+}m`x_aZH`N6VsH*r&_XNhabK z?qUI=P&mvt;wvK4bmz<>Mk0)BZt67R;$JO_Iy_#2^EDAH3FWAs#ZgJY+bNZj#wbu%Kx={UVPy41mX zN2@*`WFqB?tClkvsyl^1lZ=))a!<+_IdngSk!{Q@Bv`Ub;Ij=d?U)8)&3Q>pe4M=_ zK`LomNpY?ilhi~ci{m*5B)C*ZMcZ7vg$Tw{f)BCw$@1`8kzE&FV9?MQZ#NrHitt3ItdL+T*GL_--NxtL)!z zL5TL5d}Pyzsk6R#)_J~#{lZvPs~N1Zv}sJHSi;<5g4Odv8B;4@x#VJU$^=_Pq93rQ z@`>Uh;?OjkWTr1u%Ia5G?(1f!RC}b;aL|g=<99=XI}?S@T^T{xtE)GfEa!;sZ zA|Jyki?J1u0c%#_Y2L@oz1Ze~;q;L4+^DGqo?mSy=;vaymYPiC($rF00GiHwyLJ?I zyxYGbJY+oDqv9;=0GX;ET6TFl8S5hISvkyo!1ajoY zv-=Ri-3+E1k{l%zS#a%I3Y)~XT68{!3>w0?KI=1{Xr~)O9xz7!K$&2Zq$`QPtrCQM ztnx4qyJ3^l{&Le4{8+|uMckk{dm_1KW*&YNojbjr0d5_M8JWDGn_Y1)5j0oVTI@uZ zs;_WQr$U#4JOL)$P(TEc49@^EAV7h`Jqhpqf!b?0L*o1@&P|GhzeLY$8Dmx$~t|k274;DPg zoiIW{jes!Vhy2Og^#jD;cE)lH6|#r5*Zwu=Zbrdz#A3DLYpOYEfQFx2=qE{yY^D=w zg$DQ%^s5e-pbcei-6AL|aXaLP^RC?_v=ey^kH@-nSrMC+;EKlaN#dOG3WF`U%LzOl za#JSH8r-Wy&hr-Qv0F~oC-fuq@Z{y{J-EdT>Ex;bHmg>8nph9}vFe7;NWSsLTda_Z z>y@8p5v0J{d<)@ubq*2fAM$SR9-*EE{&$XF<$tYV#qP~AD=`+O^N+L>QY{rXmI!E! z4Vv4k0gjp;5@HGC{pPf@gtd>r5v^Y(U&w#IY-WDWj_i(nu^by58<<_H+*m?AcM?gh zY9~)mF-B46&0{tk#4}no{YLNXFYkBlTBroBNHLgQX2ek?D_lf_JQ0JiD97ugoE?TU ziV4?yjVeb7H-_*5ir&b!A#6ZWWm7@(3}X0 zqLFL5*&14f(-QPbj+>X!YNHq>h5{&C@Ocrj;N#VQZXFvzeMVcso;!7-a&>jL)UwAH zB6eK~2ncm**f)M)L(8ehDHcZo4>xmH#paEq@Hz44M<0qxT~LtA4H6_Uj}KP}9yMl0 zj>F=`uR5^u<%UDFZ#5=AoTdILUA=8M_fXLXOn=v}aB!VV+@jA}X?i_20i-c^|6XD4 z=b#>_t=q>k$Yvp>wPOF<7L|crVv;jzH7F*l{AV+{X+g=|HLa8h^-pu#^hAF7TL)%) zag^$ej=&Gyn)_QWUxJtvK{U=hxZG+f_VAMh2c*57wpU^W0hlR5a;tAA`4o3Yp>s;# zomXJ|(G9rl&_Hc%pP|&sxvp@u1?vOc{6bQ8;$|p|wP$@=B{t^jg2V9sj@b_# z%7oOJ8SH4WJt>+pm<0!3h4=PsjhNm_;DaqotO^6)*mhc)FC1)<3#)5seKKJU#7^-P zF5VdHSv$Q|t1#4H>N|fAphfQPnGyJyUt?FPIE3_}Ullw_XH^9I8SsfcKCM!lBB0nK zs+u0k+#r9+yP+PC4B+%h=Qgut1RaCZtZYO%V5DkcGT}cBf9U-q%I_I}DPU#P> zgeh*GD%QU)dp<*N|K3bRMBo1uqWb7h4fW$98y~`*zKK@^zI7@YwR&BMLfy+@GHrni z>IOoCr-ad|A|raxB-8{Ob62(2@(dzzzD6MO3am7_`BbOdEUFj+mH$m?rWQR?W^LrS z_+#3!O?El~WvEZoqHgbC`cM;0iY@ZmxvC9cx2oW@Aob(u!9l zC9<^dxCgBHgt5HL8G^1@Sv$J@&6rw+Gn$Rs8j!E-z@oJPGcjkQqRsT1M?AfF*irY# zuL4Ixu{p^0#qbR2G63dZ;gLUUs~C()nttP6mBOUys^55 zh_m)~zZ~!ZmCCLc`eR-ws2xwj_VR@M1jV?F-K}-;_KD49@%Ab1i2@X2EmDZr4hplm zAR5gvaWfkgaq7>^ZedgCCc|6!ENryE6z;GTW|*qfNz650h`DLhBmx-WDqd? zppqkempM&q*ypDDw^SJO2@E6O*I1Y5wrrGF#(Ty%Iq~Hc<^LUmZ9C~rFYVOVOg_~> zmw!EC{WCh&t^@3bdn@%#eF4R92T*Eak3)rNvG>+v5vl`GklgVW109a8&4xWN)1HZU zfQ@vSsa)Fu-`g8G5@bFd?kz(m1*LEWp7VRt%&?9;6bQ4I|H(7aY3+SbX7IXxd!Zou z4OgXg`~#uvJRNA4l-Y#BSqsxynL~Cy*l;s&F)dJq$C62}W+tzYvu;paAklnW45oZ9 zf6FMe8wmP@WGIhH5;{}B>z4a>;dm$mu}P_AQ@AyZSRp7BHQ3x*Xi{^8J>)2+U`zZa z9SZ&dP5&8R8EKvXr{n?f$Zug;9I^8ke8N3HYD;I;tv*qi0{U@Ki%jEQ!tPg zp}~#)eOf!)RY3ANel*826K#RdG_R}T@8AU*`;VLvPjl%3gp>;AX4@8*JsVgyH5($0 zq&jd@vs8~`O>~trS1=ea8+~ZFU8bC`i1Kss`O4g2-}&pN_&$#K`Otf?hHaz$6cTLr zW2f_(y%oSny-2)CIKc=4AFuL@jCWx&{_VblQ8WH!6U(@55!zG|4O)~fmmn}H^3?L) z9+rZtR@fbaa_$sm_Rn9sT;UCfTv7X#d%1zn7CVC`f54|r2VZR=pZ~MqdNRekp}gvL zwBJyr{n+#hK0c76PWzP zzL~&&^F?*>+o*^M(>a084p}{#&NsZxlU70Q20K_~;%w#`p3JOM|72xhgsct>RIi-G z0sEZ3@^%bt9+{toCricm@wHEROBDV!8m`s%a|zVez!1AI1d$*6pVpMprNV!vRHE2_8?Sa;HDTBnI{Y)h4BzM+(ZH zEGBjzE9Va*1cJS#lKOT3WRdik63&EOdNVxnDosaTP)HSsKCc{FyvDO6Y-j_`l!ivf4T&1QryqQ2<(w#_K& z7d%$KQ^5hNT;Dd3bePJ-R>iwP|;V3?66kx&)bS zfl|gZ{aE!F)ZTdoQ9&9?;vG^Sm-xH&l%2UM2s~b7rq{MEn|i*Bw5bGv!4rA;++S!ZFGrNd zJ-w*M3YsruLkY9BVxoG}vQJJJ#hh7jE(rR6=)KWxHVp|sq9kVCuKOjjzZ3IVuZeem zhfKUkQA7w71O@Yg>ZrDzbBA5LxR)KRxbZx_esW$r`v(w$_0zt1aPi<>hP9C85e4L(pERfeRJU#DoYRNIR%FH6+U*TOf|mSBaY^7#hTE%O|MTC35@q$40*` z`~aPz_Dd-Q1->NjguMr-W%FW*l)cQFwokmHJ*V~3l(yFDH$(oO4h7tqtDB=;>~y`8 z3o#;Ms`$&tj*m^c=0W!!n`pbAJj!3V&R1`*Zf|x4Mr-L89AzJ;vNtLX zlJxFeHW697s$h5Y`AUC4RJ@4PZi%&f7af)0=?=-7veRb0Yl?qxqVJ$L<(yez))wJ< zq4P~to}lZ?)H;EFWG~P1tV`QW^`7IhNX4B zo9ME-Tz>^rM9}#Ly01fIH7DhXxMDbf=dx#x?7+28d(_Nhih=apTl_nRPOJ{+u4NT08Om&O_KqRmv zpfsSk5ktKQq#0P8|MISV%0|aTejo0@_xc~M@V`&!-5bEL}44t2YGbnb*m73b9fD(8~Xkxf|#H@Y0hW5W3e>W%}droDkSlmiJ zHU-8`{I06A(2eJ@-;5ePws@YheXhJ1e)hcVDHL6UKVp;nHtN$lfK^L`%{R5>L74pE zW6{SFTXWPN8hNnjL@r4%#;mH;ONNVe)5QEpTsVyupg-NfZsydnk~R+t`0D2 z@Gh{VHs;;l5h373)T=fB5MJ5wEhZkr_P1giUKc&zus9+>Jx#)flqX3SZav z_=rPh&K@66M75!5U=P%p-i5d|CIvUXnP~YS>w~ijvd6)Bz*iG(_N@J5lH5g60v@D26}Y zI?ia92HUZBuk1qNg86rKJ|qHl z${LrolD}n#;~S3Qgv$8kKhU^J%+@OEk}Z@ruq#cPTD4~j=ZVj7oaBFg0_@qOP&TeO~x4lJ~#|krOe;mOCD__k(V2PNCfG)UfI5 zy{!Ro{H0&AMt#IlekXC)i&E`pqG>-7@i(NUTF~BF(O$}WhHpO?mPcBjmLvbtl4j4F z9H|?Jfxm26lto91Vo+=nW^0~jJ;SRP4(5?HDD28*v{taAvisw%J#X}^J_i&Sd8a|h zY`o?bjd@~8*`bO@=V)H-4JIzoQmR&!@4ZQ?l%iI#x~X0VyFQNe?df0gTw43?+ROOn z4e~^)q-OVtyN;C@OyhrDDLY&}vsXh;;kZLY*7)WhqyEi{ za3`59RW`aJ{O8#>To8GA{4FUcL;r7&iht`*A`bTERu*o~M*orfV%7dC<4U0M6@n9a z#SF#$ty%#qN(eb$`3uKs#KvsQqPb#P4{1dT5uL!Bs5>R|IiN6_W#Cz-LbW4Zp_`J{ zN=^97;E#$w(dbDoa8RJCwAzM;{no+y{8O|4+gT~cHF0ESka|a5N+!Jyc%x>^L#9?U zh$32u$9<`HMUl?X!tGLALM8aN+V&dzeP_^PjN@49&!-3S_MY*wmPM{zH1 zteF*$-V`o1h$TW__^%*X?D=nrszWENtHvP(4%{xoS)RenZ4GU!W=>;`y%Lfu4%j5_ zutF(`3q3}ZMFMNty4ebSMBdss%a!`GROLL`TD1wl2ZqS48y1HTIa8c}*QA(5-G2-X zz{S*x6mwBJfaU@JEcGs*68Sj z4G*5^dTxqWBE#ZRm6ymj{X~lx@IgZ1>OG# zbtnDx=o_H!L(Xii4vlhu&4IW4jBHGHUqa+o$#sG8Q$>Ew5d<*n=uzpt8hN)Gb zDHw%jtP>)haM438;?ZWV`J@!-QO=^8HL)rgyD=_2RFMsLWx{}RK|U-dCIXnSFO5;! zMa)5ii>5nZi~xsHdS7{N$o(H<6em8^D0m_(yUK%CgmM+BF>K? zy`9VDN2g14a75K*sN+7bnhKKu4Bc%4w2Lclhndy!E;XOnsi8rg=PsW}PtY!(@IdV% zA%P7@M}%Nz!$Buu!iQgTKx9+Ud=MF{BuV$JQvMYFN_{0Bx_9i1X!8E?LR+neE@oR=Ww??t)4)|G%nPmo}5sr=VF8mCM*9yOW z1Itrxq|~w`1{Jy~YG>m=j0}G(CS*+Y3Y3o}^$z$t$uK8EHuXrZrb|!w4}hwNDeq;FXynwN$4vWZM=w; zsOroXPXDEm;;WE8MSRzXD128c{@-yA*8dCSglw&hT>e{4S6-7}6GY-migsZEkO~3- z>)JmMW+eS+o0J(&lhlX;-xbv=*hf(?uyOw)7z}|*3KsL*jH{CatT^*S#QvHa#;E`2m2uLZ$&WyP5(1EE;Bub!>1f8EivVn-**Tkt~9Z zPdYVWR%PeMc7q1%Jt`*LowJ=fEE7@=h~XbKVR9z9JThBV*X|!=R%bOzQ8Wo6Sx?x{ zjC>&d3cAqPf!y+tvn5^43ONM`z`Wiz&W*5t@m;471hG9<0tIx=>I!FU!4x{Y ztGI5Q+g`nIdpu!0*bH;Y-sv1sKVyKxmKh-{V7VpwPvip+Dxo%3l@xNtIXkgVXY*S8 zO}i;-(VhJ*eFX7v!Nc3pNoX>7uTCqF$GS1D!C83lTh)g4fqPg`OJ-x|rD#sM%9NbX zglrDM;%>Qy{CPa%{bA&pf#QWG<2`odaVvBECtK21Tt`*UKd-ra^#Y%TZ}oiZf2imG zH$<$hEGs5zX5wJ_Z$uob?qI8wWi_soW@_V@Rvp-6 zHBWAXt7$UAaAT8mwB6Yxg{2oB1O%{JfqWQCHKP9E#< z10F1e9G)oly5ow=Dw9F;w(BUzW9lX6j^{}K4e`tGZTWhK$XD-&b{5s6J{B&v_j-0s z>O>|2(M(mc4oqGE!_U*?04xkkF7@A-*+CbwXw=aqh=Phg6j@+d(Ia9hr%fm@%tv(P z1oSkjzyk**t5wgs6zih~9TJioWPfC=oh-8vZ3~F|Li}-)6P*dt#PS~` zfg-{S3L~9$A6_6DkfbRz7fn{;fyJx0z1!c_ovq5DL!&7fE9TZKlSQ*m^|q({kk>lE zCj8q6Ils_#N)Ho~>^i2+Ow%;cMrM~XFXl|V#>VZ=k&Z2}tImYir@u}(Ou+jipQ>re zM+6EihXL0b zMw>%Si*zEVcJe!9UjoRKK7e@NUO0mIH8_Jou%7{Aj#HLpirIKBStQRGp}HJ*kObP7 zpX`nDjx?Y}xz55z0WG^B4p^Dd;xC9COuQ;@SfLSbR38+7v~7CV7)O|s&Tno43JMnW z;$0^cS1u<&Zf}wi+>U1<)r;8(DZtyF`Ks#+rMrrm(CCo*cxJAN>q=8iXGAIxbPZ=c zjgFQ!o$Y}>t1{i)eS5abDy;$0>?lWD!@a~%Z9*9d?`H;Xn-2OoIpW8rWn3sz6pQST za+7yk*oJOK95ePv$k-!QssYQWDcI2>Z>dvYsdeO*nSbrAjyb$p?enD3`ler^rmEaL z`KWrp-zo0)l_Ci>G-HKc$)#=kH49>}ed2zkaxpmme*^PW>TI?pkKuVKeeNi1-KC zb|4(~R;L`Xi^?wY$uGDHQ9E>@BHy5fS&Gf8foI3{934*eN4g0eLg8A+^z73kECQy9 zM)dMwH*#H6D9$WPqc=WaiMkeZca)gAh@dMG$c|Vh&^hV$JmR?i#P`perPeW?)@LbD{iI&U zyu-fXM#)Hzp$Ttsv~^{pH`NtiX8$BA{3I+OLA`sxx{*z?O(nukFv2z%an$Q1(s9@> ziP;p)%F4b}VHp3s<(6LvB`K_5kpna7<6bpW?Sa;-EmRZFqGV%2?m>RShR#ck>_|cq;In69@ zZMWx9DMggT+}V6n$o*M^(m6q_l_>2nCb{6$u2hk5k6TWMmywvLC5b&UjL6QvYZ8>t zF?)j`K20INHT-w04up6ZT|}zCSX~9T*5N%GfNFy)P`&pTpYvdH1xA9ri~au7pf|N6 zfVq53wxQcJo~Wg7Jm~>EoE~ zoGQ|jHPD@Q=Ph92O6c8+;3$39`A6c#HO@qT7+BS-!=R6dH+bL~;VJE!QUAd0!;d#8 zFCS50PtG@5<96-d7gJ%^Z}^MiiKkOSU>NE%81-GpQTdsP+BF-)C?=B9q0>DZJtrN> z$Llx#FjvA+hmn3eYAYo<6J4&jRI*XjcseqI`H-3}%CeJ|FE08Gi0utd#jf1KAcNJN z4sGO?iB@Mg`VGY=+Y8Wi1mX?+4TmnK$948INB5{oS4HRz9bM>^HU4vMGvu_5L|p;? zkjyG&`)}Bl(#dTzJA~RYRM`p01*(lsC`!K}o}J`wX(^ZDQmPl-6JoL+8aY6365*We z(>>&`r71v!RqnR}VU=74ZQQejn4}B^y6Tq>KpR#%WRoe!E`-xBK_gn&IaYIvrh z-(kLLt9XW`UJ!E7evie_*of!YXqwf@x zwyl-%|BNw(s>?b2!wXHj8;|5%BSRUm8$zL3C`-Z?HNE8j6701LXbuz=DECq8Nn$An?`nbCt-nhGRV&uIh5Mak%*I>zLiJQU zs?2Qac6bi@AmwB010_akp56J5s9oc@YxeTgBg|YrSn$Xz#Dv8gKUg4|4RuhMY&otG zxI2*g5E>?FMD62nS3)=RTrZgn!KPRTY+Ec1^CnDIrnxe(Igut1sn0!m3ONzToHQR# zhRFlD3+lYaoG!*=r8ggIv|pIH9%R*E)xCyq@iM}P(|h(8hMr1ZCzz3`Ss5~H9UD(FPew zb!jhiH?-fJHe7hYk8LDO9t_UW`Q-K()Y){axb1NkGR{o#ql&{>P%nMN?5&|ok(#jd z)2|MJ4WoNE3I&d*c5wb-EMY-Wz0gImaMJJd6PruM1tfRzF>5MR2}o z;GNc{QnjHGwcWat{*2SRmT-1pvO*UaP({hxO>{L&2gaS6yvdq#MN2*J*8??>v@(89 ztPxvVhId6bF>c35cSY1gl;tREk%86>(jHiTox)BZkUPn%4SJ|*Z*u8jJ+YgRSplJ{ z(=<}#^>N`fOqUP>iEau#G9SodQS2}9OoP%vv|5M$v#BQ8V#AXSJ-|XXP9@_<4Fjp~ z@aU52AgA6Hb#Rk0@6KPh&Nb1;w&AlQpZMW*8Tq%?FMnGR2*}Y}$}Ms}9uQZ! zZ9c)D_={Dc1I@n%oNAQtP!E?_G)D|!yHwT?tw>2UQHiNK;}QFxy)LKLQr;mmIgLuP zuwc?*&oDIOF)pD{rVYn@{)A{hq7ls!yA)Gt$$6r!P`d|Z0$AK2K)hkBO&P9jOls0#<5 zC}nWNG>1nf+#n~$f!DL$!1Wdd<0D2MC?T4U;x~=7TrrdTdUGI9exK;ezld$Bd{FO7 z6F6_HWSCAI`|Fgl7+Zue67e?ej(FG!9+h|Fs4hZ^U=`Mpi~f%JHMM2Vqjf=jaxvDr zW>=bWf|`GMG3HMwK?LBj5!dtsRf?}U%nEy%5f!d+NJ+};m`W#UfYRVE+q!qm#w~hP zeSdK|+X{dUy`oWNco!#|sao2b=r|h4SkP9aynvMkSsy@K1$dA7!aT-lRSrJNd>8p# z6wU~H@amS&u)oGgHyd+tR#Gm};fx30jQ64i03nL`f@UQ|dy0-fp~;alKL~lENH@Vg ztt=4F+PN2&l6enKl@BZ*H37yO-~Yv^IrOs+5P#d}G5%LZ?OSg6mzwZx(G{_BwEXvn zM)h}lrP@P^z|rR0W!KdK*-IBBB9s;sso)Z3!!^o}tQBKq(t<#yAZaLI5TZULQ)ClC z-Luvu@M>6hfH75yW}38)4S?RQMSg9zxmm^T_xx%`^Spb>SoU34JdnTn38C25%ZLBb z`_v=f(No7$7w^~Xa*q_d+T5FL256;*x?h3M{0SfKvOA*Zpscyx5m}B}SB{@e#j1ME z*(J{XAM>%}%QKvnW+z9Xr)D|XrG}S&?L|M7al-TOu%-W2zHC>@8bpW2Biw0sTl=|I zAs)Gpi3VE|&x!!&j6j50?2OBF4Fvq*?|ip>79o}VhkW?mvii!F(prl;EiAHPnT+iD zHw`xlD%k`^E!No*qr`jd6f|lkXjIblN`a%1RvcyvTY@sJ#q$}?H1va%7dyA`8vVAEuvXh5JvT$H^N5MXLk5eF z*W(35iEUjUdS@BLCyg8PEn$(C`sA7@SI(s&i%_z zfA2NKWX+nnWWt*;Pk z5}@|)j!3RaTvb88YFd9~19-nYm8a)isD1P&ZSjsTb&FpwJ{Tcb?iS&jy9F6em(m6W zH5@#S1bv>=BL_!1?H;WEZh(h?`g3XuZWlZ7@aTMw*7Leg)TI1m$1gN_^nao7e7Y}Y z=>41w?winxAD`9olPdjjYenEll$aDAy z!kX2UqwobjQEk@%o4-%Eg{)7w1I!vvjE#1vw|T2yi1TE~Kmr0!?()*k;N2Rx@J&!N z0tbJ2^*}Ucv)l8{s9gb49`QmnCiKJJknljgdLj`D%>ogLxogC*FFvzL9D){;O!zt0 znV~T&t;j?ZOe`*w-7pr3Yt>CCIWN(ku<$UC9SQ3st0h8-P$DA>DXdC?6`C~;Dl2?2 zD=FPxmX`29iMHinGR!1nQmD9G+>9(LYNlDga3eU1$;7!kd|`>+0Hw_`V@Z<@7HTND ztnM)3I`mG|sR`m~Gxv+^M(WGBzFic9eDgZ>a3=3U4 zR~6u^YROHl8VsYBFC1E?h)%5<2Qw)cS^^M$D4Q`=Eki(`8%rr1r=D?2ISwNoQ#K=q zK1MG=hpbSZR!;c-BS>yBHJ=O%n)B755)6X0=2K?GWl|EDI;(zldS&Wp)H3BE0Ybvw zF;Ud=DG>-hYVEuTSZ2iZf(jTn0S5V?im=P>gD^$VVNenw7PX*g(sn))k(@Z1%7Pa1 zIT}f8`3f_j5%)0NjMN`BO5+n zcCacfNf&lYlBTTfYO(kDnJU)R#)sF;!e5v)`>`-Dq!+isx(0H+o!HA7us`zP|2!~{ zMdU#Y9s%7*9Xl_Mg{4MLgYTAt-k2Nu;ndMXEXDS|qV~SJ8g76jtI;rgN)6%Y!_--z za3%rRz#pTx>#kQyw+3IwoJx`I= zWId$llZhgUDWVbtjo^zpnF+sK( z1Fp1sJz%c&z0etAYRuSE#Gc-dr%<0tO`5@)05WCc(ETH<8 zMuiZ=HUPzNPIKZVw1TQ|XHe!0@an%pKrX%3gG=OPYy+;*WwDAr?Ja3gyY>A!bL;u^ zxkdWE<(rgWK+n@E&nBU8`#b@@kiP^B65?m&1G?els(s+?6Sn{2FH7|3lE|RlZWHAI z+2|TN`c^q&l~q>asbyn1IvX)E)FsyLNG4SdNCgfE|DhPzK^s&7b8`BTi=ZxLSc&E{ zzFoKuyeSjVLT;Pbr-&}f0jgdBO2gLP#vTDcs4<5yDn(M{qy1;#18e{Ou}8pTg&@!B zwMLj|ia3PQ`*rEz=jF7Ec{=Hw!2S`n#~|Kk6N`H#dS(!^WDp60Rsf_&*(=@j3DfjR ztqQpJ6>O#t| z9HA155L;1&OH)BUW{oH%X+`0r3~hq5A2VtPnH%dBMIo>FksH`ru~Q9^YtvUAe1djc z2H6AbW8T+iJID_?%Vwm&vfc#sGsJs7r(3B0a$bD7MTTRu*6`_s%|5_Qpl%9s2{-Uz zsF#~i(*bA+wAY)YZnH>pL>u0a0B9n3^}KKVY~|TJzq-olnvvfhdPbcax!Gk;XJ)@H z0WlP$j=ay42v08T7Of23NP$T>C#tsud~6=s09vzHktR6uR!|q%iR?bHPN_Hpb{!M+ zk`73lZ=r8(;zu|d`=W`8NN;AStOZH6_%U0b63a7PKOw-*suvdR`eJoG4Q9d9@5zl? z^9pDw4fu@6P!A}XK_giN$P4R-1LU9X(6~+LG7q3rJs37l6F^FYL11?`oaEK_Wf_I; zW|xJt-S5}Y_iX_o0NEVq_2IZC5cj!)*aYu=Q{MKYy55YtROjXcYw`fTFv{;jozw%W zV-Rr}Fhbc;4`d@TR3q8M5mk=HI@@MO2U!sj^nz4W-^u;#6M)2zD_B=G z&ctfAl7(NZ$6^f%FZ`;7{oQc8Q-Hrm_QfsWectlQ2I&34^6DqpEeGXoUs{cA8MbZg zki+*bV3Y_8whQb$HhK&0cyTyHFdJ5#;Qkh%0koHN-BpWpH=3>xsI9c!gf*rD;H5K^ z8`(rzp$u(>Qy)jx0&i9)ZX-QcBRa7r)d;?}uJ1v3v*?$H@xiIHz(C1>=ca(_X2QzM z-+)`ALpgxjcxCL4{VD#(<{k=Jfjq5r#*@B)IfKHBdhv$!6-}Wux;3QPg=%BU%=Op! z2~`6Ajn8KMVRfPt-E{qH>uh^w zRuyF1U++MjD#X@Bf`QV%54_9z!=-C!w|H;PxfTYa7Atu>3V+|cy8S|?o3{4B9|=7H zs0WSN#`^mUE?JEc)9y>x#z)TlBW=OcZV1jDceD&noBPF6KD^T}@Oek?xd$@%d4$y4 zW&kt>M7mvAVVdXu8TD>TSNvKizTO;wgs0gt_$ACokVfd|*v6%%{)PHAPD{pe`_Z-6 zrLz7J{n3Lx!&AFRXJ1#&+j{W&75_NyM$3!w(=_k)kY|#{aIij!!(-|-*{1g9F8rPP zmHg%*-^5y1Vds=joQEgFo!Mpw@4nw)+FMxo2l3{~^p4)Aa(DmL-o_`JZ}Cq7g9F0t z%8x?d*e`a2v#-!v*pZj{9hh!@-ZYPpqZ|00P+ybQBnKFWy{rL_JGvdnm!<2Z_l)Z^ zU!7Oe36FnS5ip+zDqUIAE~o9E4=vJghZ+4@DF& zd|$LA+9ISo6q#ivh@9G$D2RTsnWgt<^`;WQ=t?1s=O0uMjlW$kbht^H6}aA+fcq3T zNB+sun9!5b7LqrnJGnKrKCED|*&EL6utSpJaXUK!`o1wi@-BO*^KN@c_|jHI>(6h4 z^OK=6)!>hIFN1mYZdwEVURtC5o<;-0b*0wU?s9|v!E)o~(Uk@M9?4(!9EBD@M{)Iu zdppVVL%4THVdtn>{4Bvsg(K%JTRRWmrV7T~PItqt#7W?6p%Cf~$z15ZB8Qk2TWm1} zRhqgYkz4;zYwr)gIR07z+R<}ZG-Qveo|2LcdJMab6iOP8F#Hk-5c6`3!#rwoBgg7uSwx8ShRzk2Ru_eSanXsz`2QJYI*LM+7R-eBILujk`2w&*YlOY{;Ii zoYxzrbpz@Ybq)ouh1l5isHErZ&4rnrouf(;6n;TNNRlqFf*0bi(MVF^-ATFT3!ZvL zugXL#1uviYF3a0b$b+yRA+3I2&N1 z_cS{n9ZjcsC-Ux=h$AQTZ6Q~O)NQU7vq*XJPq!Jagqgd*A8RNKoSSIOZ!np{7LX^E ztIW(kn#Rpm$bORHmZIE@eN=6S5|pI%m@;rA#69+|j}ynX+z0c8%y*U<$B>O|_u}5o zf%+vQribGLyWb{*b3~P7onz<>F-rP+e?4<-lmY)yboeosq0&#YV|tzgsiE`aj`$in zg^(hk(Zl<6XKECC|MyX%J$t*PlUq}N+P88d)W6(#w5V|~Bs}72NF5EE7tF4Rh#ALD zdh^Vt6H*o7;hm_N#34)e@u<0}ABm_B_9eD}xy$=}y#9}%ArVz!gA#9U!8@>{;vmOx z!%pdId?eFw@aQw}Wn3|fc*CLxE{Z?y_cNPfTS&54EY(qDso}?21y<1?llOEBBj{fW z0DhyBXoo_K=5?a*0G|2z`<#0}=ah5kQBCDsinKp|-!60S5?PCrcwNS=;C$wti1P!~ zze6{7Pb$iJ4&!u>O$)C)5v}xf95_zUT_~=}6Z+_180NLm)5GU(q7(NYJzOO|pLyxI zDe1XM>A7j?-A_G(_p6q&weiFEW8WKMa+xn$)WQ91y0eH@uO<1=@e9*28jnQhF3-)l zkPe#9VMXd>M^u2`m~=>Ib;rFm3q=17QHcS>%}x$+CfX zA{X9#Bu+p0NZi2r>0$2CA|)See4K550?vHNVW9Kx7wkDh^`%H>_DAtwHYK$eRZ$1IVh5U2y%ah zJ2!qsNFR757POQ_`pa6(D4ghe>*$C3i|gGpG$r^GO;>vCb3N3oYxX4Kp7D7pco|&Q z7>r+h;d-^a2bNWub#vSHI*qu{!8v!xLX$vt7R=mtA+c?X;v%@PDX#>!3cGr(ZNcaCdii zzPLls;1B}A-Q8V6a1R#TJrE?gy9Jlv?gV$|dzUBAd(L@J)%jK3y7&HZtAJ*D`qR@h zJ3Bi&+tXuDybeE0nPKc3NUNpfTyc%Gw^5-%oN>A39z62G*XU?^Lu03t*%nNAO{+sY zxUU;$Oq|Gc-9K8Jg;j9XfBmEQEo+-2X+u;_krMwBzpO~IrpAkanDjKy>iCrZ#8Ic* zU|z(NgoUJL1(xk`#3CLsAvwc%wVOOxTkZH4_H}FbcL>q9?9g!;x(T-IT**a{wd~|C zFq4j+w7R%4!HPb&-LAd*NjMY0dih|zd6P!UW&UqIotmm2u)XcTnQ8S z^jyPiOAn=sAeKvK!C0G4=T1dJMsE2b8op@K!BDRF$e=~et-`FA zIILE(n6bdSz|R&6Q?ZZ>xrDwLRWUbjomv*>&aDIF^A`-QMfT~#Da;}Ujns2yX4}04 z2;9`}R*z8p1zi`LV=)ra4v#3ubyd8EXp^}|fs2qF^ZE=~es zdb+A=gkHS($5W8FoDp=Hq}%sx->$v5pm)zoYy9M_F040HS!w6Ug84W~2db>!N@C^4 zJ*#>Qu(C>^Y~PPXg|`Vhi?lqM#ld-Kijfb5$$wC?vkVQ*NgAm?fPPMNj&72J!I7

xyS0Kxp7p|321UFQJPo@PczE1*X33*9*Uc1=IE(f7msc6s$FD4`B^&9x6+U? z)#?fQ^(u=Y@z|6A-Y~)cG3p)A4gOwbz(4$xljZ+#b+=X51>D2&{AO)1dL>1p5XjXh zW~<1;O6t%i2}JV^(6;jp>h5_v5vUy9DRbJcSg*SA&H42_m&P;}4_v%{m%YTi1iS=H z?PchG`%INkW4?Bob?ck8*Ls@z^t^WJPZ1(;=;?OIpZ@`m)~^rOGT?g{CL5R2-4`h0!%uYDg~L+g>H{7g+}#b~$q#H_-h7 zj4%&ETiD3gg=wF)q`Tnanu&KnKPH*EwgK4rzSc~VsjX{d~eN5Lm3PA<*OvGti%hB%GFrL z`N^i9Q2$rZ1hlFZ_%nia0HJq#lpsKkZ;&Hz9 zf6u7|_5&okDcS$DN%9zJ7nd+gXzC_ZpVS4NVa*l19dE3qDBr=J6CLB&@l?G3e)vre zlg~U!Qf*r0;QOP74Z9u_U;Eq-CT)Zqg1wYae7_6~@a5uBHbRN!zFprB(IAIVF6Z1F zXu83DH`HwOhGp?CIGkqe)L3n((R?6kM4_OMOzx}-8Qbo94&}^b_Ld99s#PYBcsOwS z%@PKZyHVNFJH3)6@Pd_l2g@rq%dj2V06DP5j|hLAp@NP_M9Awet8}nr7E(WH<0m0! zLTKK+1N<4ab$Kbz%iQybKtC7)jkO(PfdbSs`k?EI^46Vwa-HfoDB?$QhaRq+pF1Pf zjShKw{8)SmleanAqla@hP%YwFg~C^Dky_y`!|xt5{cpwhKYrwg%S|93$Lxkqx`ONw zlJ`xuq$Zk{!|FU3P}8AA;%kXv#Xsh}UCm)GAoJUKH=}jOBI!*`U^iPU@(0$Hg5V*n zaxE`cO$qJerK0m}P4vt>|IhO^2QYJtXNX6=P|D$g*^v&azbFMx3^**Iy6S?n^|uD^ zBTXwNV#m_`fPC$T*mI$u?i0P|7;9dhPQDi8ZExXqda+}mg8Z=?WXywt`eimiFmVHD z>U{1VTdm#9)csY`^k`dLG(I4`EplHIXdC(fu@Pg&0GE2-VhlR@aVDB)j;Htf_{^qK zPaILfYZTx8KaWACtqRHC+uUZugYl<#w!d!4a}2;SS|rwSN=3O3-I9Pz26z0B13z|> zNmh^qVwv#@`ro6RncBMjJorthGr8 zicCkAy4h>NMM1ZDOqXAt)1qMdk=m(VKO;?!|GeCr7rhkRf&SC-{yKXd0;F)slG0O? zc9V+gF#_u~4*cZrH^g?vkMF1Yr}vH)y&rX@$X;2hLTORFc&oOqpF*()4XyXRNpTb6 zGjCQ+IhUT{Qw`MFPzTW;2JJ1$ZEDi11nH3z{fVE+w0WN^XM3aHI#Ozw!~eR*_~n-& z32^s{MaeRqmH-IY6I%RcK&u4eKHTW!c_@Q5!+wyhW4md^q2ZKNND+a47V^$@lN=z7^p&M4)y+e3`zEQ`S_pDG{TN3q}@|L6aBlK zP?$v^Jx=F$mJ?WS9!HiZqbdp-^s|^ga2)49Ml^SS0C^5ENg&p!5YkIB7F`o(Ue)R= z>ai#i(%R*lNfHMxrVgpq8Do{AOA3{C#u^TQ*+Io{;BX*=I(1oh(DQ@q%n3tz(V)eTNk zTF%8AJD6i4#J$ubwxVo60_J({Pgd*B!}Rt;LeB* z6zEnQ*hQW0*+&@0p32;9qu&9UvpEpyJbU2?y2ld&m;TH zkC)!(%?YM394Uq{5-GYc!Yv|d=Rie#k&@WvAu_ksx_SC~a_M_gs*FU?n0L1x)S()lRST*&g1yk?yEd zwHt;7K6xXe3Q-Ahyff>J=?D?lK@B)uY!j8J10)qcE5YndGMy=1Z-UbC!_5I|bgQ97 zPZaTr_62*TPVKh+pODkpS=?eD0B>cP|9BK85imz{`yZ$Ms+u~vnL7Qi=SH}yFK83a zVS|wgK!JiV^2W5^c@|=f$q6@XTp`ax-bhy?$>i{&HH?x)_sw4*5yP;pOcfl&x5+iL zE)cZHHS<wq%XHoySvWmiF1r=++SBcw2(~7u zAMxztn@e^7a)M5q;{3&LuHw!VDlOzD$$oe$C1e-Bw0NVao6mdfq<*jGL}ky2cb`A$ zLuE+N7It9p!Nj!?a=N;UlWM!ROG#B%)|Gir`vRLzey+sK{Jz{}swwfbNXLklhcqH#wnY zKV)E_?||eJFO=fgt-@12aj<*k1!A`8xp`Y}6dJ5vTbBb*k9a&!)wr^J&^(P9p#7(2 z7}`5P4X;s6oax8UR_1`V`Qlt-(>b45PftaI9940|1Z6XV`l3&6ibIMES-NhJsl$Fm z@5ury`i&573RFQ8qqeFVhag7*Ozq-~)?a&LZ&5Z`kZoN_J!9!d@b0iO3of5jBW|f2 z;BGNU+)5KKS>+$Iwm<_FAw-9pdWPRv%N^-!PWpV|-3}d$VgJl?JAAaUz&iJU9GEaC zk1?BE_uKT!LGi)io=>UkZV!0G95l{`hALv?Unt2Zvt7rMri0YuPUiwKifO+45hU+) z67s~x#UUVc44bRUu0p{+uZ(COEK6d__l!+3`-PGJ>p;_QgK#aIoNfj@!_FF7Mie0r zBS@A``|`Wm!=xuqsBClX;^R$EL=MORh(>2y=r48_H{Au8Q3$w5s%MdIrXwgi=Opmg z4!?HJ);?%}@eZ-gL;q0A*?k*$ld3?yS1zOtpY#V!TE4LZC8)ezP!oN1j+B_eM)xuJ zk{uH!0}o=VlIAQ3uh=7%l+|kD0;fHsSc~r2i%PfZOo93yXF%@#?#c&V(+zxT-*3KH zQ}hGOO4Y~XjOU0<&*j>s8h7;=KA}5J7=vXoGjK~d?V-s*i?{f*ne}qG%umYrFJa0l z$zzgVo^kxXWFy><|8Xk1L!|cB6yIyc{5{dKG34AEno(5ap_Tzr37Vr&`?P|`SRche z!Rj#TtN;@4X0O7}4*%AO?nD|vP_N&BioAjo+Nk@nVQe*o3U=4->$=3&Bvl>KQ=Foh z0G+^wm8b+a&T97(bK{q?3=XhhO=gvHj}hYdjfmqTQDuRH`37--39+0JQqhwq^*2~% zg_j8TzJZSL4}071ez$WQf;=IRF(_YblwDwS18x+e=f@Bb3wTHQ-y}pzqxWW$uaTiZ z%kW6dMC|v6U3~kR=>9evRAuJ#Wjy_Jk)u@~#PMWQdssRL@eqNV+0CbFM(3OeA-Q>h z_Ar;&ESW!CCLD6SysM7VKIrZPM$IJJ-MNmGIFZbG#UYgVe!|?VtMy^a64+2)On#Xm zwIbxl*Mq|Czl6sfP$!ym4$rUKQKQ`j8^c0NL9)<=lXe6l)v~7YrGni^S2se3hw^lp z9FDmOdir}cvU}BLxi!YoigR2xgF1bppO7V|#6nej5)F*FGGg~#ib56`ZM-md?|cwp z@0Nds*l(HH?u8t6njLL(1Z!8PyIAfId4+vQuMJvScetMq9gxYENHdow zV9mp1O=$0j_sKj&sND9CZy(T@YkcWh^9NHuztQv=y!KxmhBv8;<}ImnvfcWfLET2| zZWZbYi@IrN8#Z@>hhmA@2zxnl#{!M6)BB|py@?g=L)v!xdu1+}6S+I~uDU?I_HHEC zm&-IYwjS_ZVer*9M%Frx$bvD=sI8h0rKMfv=0QP|X5}VdyazTbje>ATI%k3uwn$ES zQv@mPXgz};OLnEn4ecm_p1$QFv4o&Q3PcRsk9?a05ceG~;ljY~_T6+|b_W4W323kZ z)8ozU@XxW5#BakCw{orIzbM?{mBN1x>eApQELRR5#6NO1HE#QfS7#49gT7CfY1x0}GT$1UJs!8NPC{f*YeHsU7~<_%x&Cpgl8E^mO9 zfR`X7Q!02UM882Alt9zuzhUb&duETn(H8s9b20DRL);kP#H^3>pH`^;D>|*Dor#j! ze>;jnQOLeq6v>w+U;+){ZCz#y1jgu0_;)#I)wfV|k8wI1%8eiAl&|ew#r|}nu1l-A zLPB+adpdtQ+S^(?g}@2f$Izkyb!pJn+6g++ z5gnu==?`=4^FtUu^XyLtdRL~o0OoKwgU4~?f+~5m^hb?SHlxbC{>hD#RL9LDq^ESD zR#Fy53nv#os9SlTPUcUm;UPGSJ8_CbSAVDU4P_MZd%*mF8(8W2KktV7A6t7>O^scF zRUS`8dppy=6MNII3QFCgXd&i{7v!WAq+cAS2=S_USn*gTFcW@3cegQF>jt)%Xv^Oz zkzAQN!53D5qO`7@MfPy{U%=?^_K9i^v*FO)NaeNTNebKT3+d6+`s zXt^iH%p_!3-?Ts^A*hC*C-!O5a^vG`-qZ2zuTW}4#T~cdh_S3snzU_Ki(}yI37Tjz zDJ;n!dXB%8owE4gH*UR0#7Fx`QaY_YbjAN|Cs&51->MM51M{4)o=Gna-T?+jXu$_1 z=N<~n*~OWja%be8mdIzK>kDL`jgDXlMc)UC9G#*l2e>4x_Be$ORxZP0>zGrgsv zv~o1=Y);l#<9pQqJDs{6#4$joXEZT0tO*w^(p_)OwhHQ=hq z{m1pUe;o0FfD^Cr8UC)nsdN1M#uc|_h4~JvzawGAt>%#1cBZzjw7&i~P3aEftQvc4W0$TEk@dYT^1SfWr<01d+P2f`P@*hFXnP0 zf*|TqD}i2So3|R$sj%c*B!pY_*a?l%0uWB~n-Yt-vNv!pVuQdl+}5??#j8sxpT=;* zhE4X7{3Jck^$7FJmPtYLg{g_2{u8(_cC61lpk>6(P#D)_cc^S&67eMvbz}eGjl>r;Ih>8$&!*|ORbMDRos~FJinnj^4tST|V3zIJpDmv{WP-S@ zjct?&v6x%}AxyJ2ifn87>07Nn8m$RLQ6K$u`r@Cp;TvgwgoQufi*s@05ph}RAbjI6 zzUi@ue=^uFy1L$9GBWL^S!Zs!A(1=@r&d<}4E5SQWPwp*3FscM|8cY8KOV%uJ`E*T zm;ZHuEBtqLHrWOPj`6JxQ(CloIRYYRrw2=-gvLmrFz<`9D08|AdDqv8Q7Kq+Edk=T z{lZUe7u~624n2~YrM1(MFQ4^Xi~MsxJwvrI`i?E^Q0dNXM)h>^?XCQ?PD^Tjcbu*7 zM@`x%lf3^ql?QX0%etQ(*;nX&yu=3Ab9)xu!Orhq7q`(t&36|vRHoEcTCy_ROI7kj z9P{`)tr9OfU4ttLeN`d+JtPe}P{a3*&vt-l`k?|^ebqMe6mF%T*AqbEr zVL5wQx}4o`Sem}r>D3-Z7GXbpl}Z_>Gx}c6n^}3Wf$88FOW`-Cf$gf^a#Unm6{L2G z&2t8ULe3&&x)dlRS1RBC!?h-Y6ZYVz1aq_HpY*0*{Y4U5Tg=D(_`@D4Z;B_de+BIu zKfImsToEIMVPIrbgZgAu&67}GhgD(fB@WIri^};#7*lQ%ZLZ!>A9A^VCfNYdcBoJP z`@5T!V{zwqLsM%;rs%fvnuSyzo~5%@l#j%bK}T=LaEB$W#d4Qi7$w+O-u*OV;NmdX zVfl$;i)rf_vZ5s%V>Bd@!kJn}?8css&|ZIb&9?hSjd~fYSo-YBka)tcpuR*)qo3d< zOYtn<8O~D0H5A3J2D4@_ztGW@@SVaH$_oi3dM@A6WF$jo=eUgQgk?nMLl!bhwtM(p z1tJAiyFipKCa!ZYIuL$eL4%UT4gctp^{pWx>~TKSOssPTCh<=wXq8^_KL%Udol5WM zF8@ru!Gn4L*+NJ}UR=mc2xb1@cuN%Sy3G=>94xmmH~{@~gKU7S1JKI&oo<+yT+!wx^&9tL@V`>T@w*AX?#?BCO_2$G z3clQo{tn6lH_}L(BqdQEoYq7_(4&LLU6LXr?ot`BhZ}z(TuAF`@c1*}zG)0w!65E^ zTvBkKfOH2HM{#PSU(7lbJ_~bqMOpiP02Gxq<_wksZvgaLt|ITAv%K;A&&KB2b z6OYT>nuCV=O;^)-NYBq^)G>vC%U;h?n!3)Vj*lnqrEktCN@mZvSFFEs(o-oQ$Z&{F z@x&A)HWV~?(8`JG!7AZ*W__=b z!_nAC)tEq}GnPGzNB(n8P0HYy)~*pfKkQitx2ehBWcm z4AV8F)ce%&5>~6j54SFn19rsc5-LNV>ycJ@k4eIvL;VI0>M}aj_IOJ|b=`BEF255N z9LXrrgV^8aNOTEi2d%u%WBz({RUl5BDw=f<#pB|uBy%a#u%10khIf%szF5yNmc_rP z*tX|Ed%bIcCaYCN{nhPDC%)@bP26WSp^RCgIwezDn|Uz&!mljv#_TTLkI)}jhSE-G z$BaC3$rb2FCatd{_BoHc&=yw7g-!KVvRhB6F|5e!#p1UjcoHfnVm5 z)Z7_gs7q#^#PSu~FAoWwL<>U~mp^h?N*1ZMT^*9H!eZ3PjFpc9y=kF&8dp$SANH@3$bbyT$qSwt(Ot?p2Wk9wEhXRV$9e z;Z-o8h4&tTgG>ukt%R=n1m~vgsaVW+oodC4`mg{j zgR_~2Qh1hFaMU`q3-K=6(FLNNASohB--viq`5}+QBS%m7v;YO`UL1`A)CJ5|GB%qc zRkO5^K5vC#ms>=p=&>GEq0T@@?|C#hl&fA!3^_E$x8Ed%KFh2S*zUU%PZJc@gcNFE zi$O4OzC~k_Aen{3symlKXSGAKE}aMsHP@rAGR;*+6x0`gdnk^iS(uAPj_;E%dd@WP zh8xiWY0W@2M%3>kWMm$H5OdfhQ8syXd%JL$7P6#Xt=G>fdySsBn|`u-s|mqt zHyYW}t?lL*lexHKGB+!_8=?~|I=(+Dq%yQbJyl;UW|TKIZ_hkpLD({1mBg{XG`m%X zd>9WH3H54Yq92ApHqF{0lVi#f!ij_bNb-Z=mr$&mSM6YsR0?sd;f|w*`1~brH*AAf zX-vV#n`Ta?a~mPZLfsHd`+xDNGLZ(H9wsxddbeEXn z2|in`LC_BFa8M;V(eSA&P>^bq6-#d6-;2B*bV7i0t?|Uj2y}B;a4M1>9XdvCp#;<1 zh~a(p;)b%6u{8?H%354`x^@@*5KU}9*lEGNIagbLc>ji~%4WtvNOxJW(8XG#Ui;cd zoC%oYCgkM?<9j$GPl=Z7kHi>N{|K?0_E@&dLoK0|qg@}`vp4QLVw z-w+NX0s6r8*_Cf^Q`6sum~yat9AuQDcWREMN=zvd5|G6Ex}%^@GYhn8DF|7{B9xD1 z^3+6AZK?>W4<^Kpr?qEseWqRDJW#!vk*DM4(|_h13q8Zi8iKWZ>Rn*lVe885=L=3t z$s?wvx-vh{=)G!ndDMM*qW8BO{HA80Pt&#POT`OI>1`t_BXP^1m$0w5SEAQR{+WmG z2VXGk6B}bbVt<^)YQF$^Yw$2+nUl{`_*c_>q|>3t)jhIrrzh)76KA=hx0C_ceA2%~ z2T72&Fg?#yF=p+Rc;WL`5{Y%UukG7L*k?K7px4Xz5XfnHwnb1h>u~PNb}Rc{v^FaX zU$k~BcU}l?=BTZb&XbMs{ga(Qa$~el}%JNH;ipylS+czv;`^gb`?r)u<8^Nf@ zg(9?jaZOfiRA3NReXB7cu0O||k*H5o2}ZGMsYVZ+e@mS1m_~y6G?F3Cb;uUdf@j%u zD@7#PVYDe26Q}(yJexf`9Ck>e{py(nYQVa}u&U+T*-7+oGY6-tn{=jnHvG3>0(uFd zRC}^y?cc=cr!F@!J5ePZZseDoL0`o>^{(v&y4$Yitl06ku!}i(FI{h9`Vf}JG8(nG zD_~$PP3N8(AzAdxHzN-9geBF=Y22XG*;AUMjAWDW1=*Qp6YJku4j0}aWDTx&uXDbr zeDdV$B8F zQ##R!p#m4E*!$j}bg??Sm1m0zrBebiRb(&#Z$Prv>8iH+a_Jl!Wdi|aOL}&bb>zr? zzn65sTfcnR|K5>RqEaJ3xH^k(L_NPGZHSJVH6JpYQC|NE_4P4O#M2kq158gY{^OV2 z|C*l28oC+&_g((BYPw2TfO}5}vD<>_jvS84{4Z%qyx!llUnD1SL~vCsKB-7B^qepu z9gS_Wl^K=w(-hb)dQ3V5gxgN_7w`Z}_1f~be|*7Wm0ok;iGmwG^AJ;Vixj}gC*$_e zGyC=^8~l6&>$Be_4$bBED+c+X;kq%&!A5)>CWj6V@i?TvIETTs;M%7jf20_5S4cbn z<5Shv$1yDzmtp*A4$mIgTG4l=v$Zgnsh*C}3`q=Y8BHZ*?1BTlAP(tqM9%?NKlyhK zUDeW42a-K1XeoNPr|$CnX@)t62v$v?ia$lh1)H-Q;-MEV#YpsU@VX6$!X^Cq^P^!B^oN>shuH~ra}~9Cn_L?oa5ZU zc>bV{B0e!BB*s%`h-&E5>k~fFl)!sj@ipgL_TMp_$x}=rf-^2=B>t!@WTVwz=;O9n z#R{A)*bic?c zzr1)jmx04Xd)DSLSy0blkNlyqYr9k>k=rlHkpRN&d2b~DW=P)MZhHI86!{1oQ<>?k zx)oKMpHT=~Xum73*lN<J3_i-q{-Kt&8UwvDR1{!u%MiiAI$Y zK)Jy8#C>$Y+k{A}K11R9I)%Pl@%})_Oqa&_@Y;!R{g}Pt-H(=fXlveP^a3PbKez-44!I2I>k`&#VXP?p;wjRooyL)TI(6vri~-+!^oO^ z%F5HyUbBh#NE^CGL8(jeTN=-@mP%F|^b0%6Qzb?==ks?3wWn6-42kgM?|I2(lB^)q zRVTx?-yY??jmsSBnyZc0K*a*L@I^ZW~MgsO*lHS=a-0Nwu0qel_%_)wwEw4J%hfXoe%P5<%(Rw z=7${ei5!CK!4%)Fu#O_5`q^8hqK2R3c%=oLE%FZ`Le;EvwE-jSL)h_R`pR!+rqO2l zdZa-(r8-4Kk$2g*WtCqE*M3xV`7vAHg@7{^R69EP?W!r#RZnx^JwLplggYhIH1=Ay z3}}&}wS=~w!`+_qwRf|(`E)hh%Y|#C&6c->%`^Bms&;5)Jg6;y3%j@Qm7eMdSAmZ3 z>u>6|aP{$3{7@r7Kd2^gbJ?&3YV(g6r+PjeW)ZpjCpdyRo93)0@byLv@qhg$@xQ;L zQ2)1g6s3O-7j*vX)*xg$^3>WYKQ%*F$92LdXmjzMgOWI% zr8tFc6nJ+X_D;nJ3I%0#r!&A??{okYNdT^!-!rqkDgE8-oJAmMta{S~3E+u4B?OE9 zEmKyOe@9!BCv!3`5WUx8^H$s-{n+%waV*B317R(nra4?$$F(oYryxk`i->qOacKGN zRI-tpfz5x`ZR3kn7$N}E>ww??^9L6UAon$n^m}_}7dzl6>Ay8`Rr%)_KcR%=g!NjP zMH*Y3{T8YaZmjtUsge?m?hiBS2!EPmI9zp_xYKyivpadJ$Vn$87vA=ML0!*Bb0=!p zKyOVExP2J$+<&>dKNi@W?{bDw)2ThQf6`k|{iFk7JgA=rRdbS-r7L2o@5HE#X8xXw zXdGUTy|=86BcwNOZG$2Hy=k0inqmEc$5W&K@7>KG3vPUXJF<3>w;6);%_JMTOD0K= z{H6N>6inZ4fDL|q*=TrxIvLTpaLKd4L(iT^5t))i%-qJQ63hGVRx?Q0k|U-nor2>1 zNg>Sz@lxR!P0KZbK(sH1NR9YLgblA}H&zo9IyGeDh~@~><>WJ1q^1D#x<)()M|n+? z6MD1hZ>JBdrAiB_pcwBzh!HJp!0|F4)aS4&zc@xwVlR2nU4Osm0}~x!oQLJI-CKJ= zG&Ct!iIc3R<_%cp<;DD9ayt(qU%Ghg-mD~U%3MB{a-)WtMa$p$#fn1Xu23wdo5_%$ zHq$|NnaTn(Igk(T@m$VVC59^5Eiq#YT-dKxFadpM^z!o$3J$qJFEzTCibRf^m7XB* z(jhe5*^Q|e>lIBUVa2${P*G!pjc(pi{?1v{!*DMdrZoT)Zdw)o3mQlBw}Qv5%K6Ct3)!5@!w#Jv7>@*e8pVErZnfb;{InG) zr#fw6Iv_!0zN}}+*O^^;_4M&NqYT&2>k2-B z4NBe~v@#}g88y3Qu9)p}l32PmCgk*|4_C)WF&rIaYOd65@!>E^hGX1HXg8{+STRf2 z2*ap#Az>^9q$az5=ss5zAd@4w_LG;YDuJ)msM;HEwey24$ZJ^;oJf$IEE}-`z77sB7MtRnY%p zM!a}nt@;VvwB30(z+Km8ZW|5iI~)*^ICqCn;H2*JH#S1S|McX0o^2S({;;rBbX5@4 z!0q~hB0LUNOjLMhN9?v9EykSd}eXj>gkn@T1gR zM$|8gpY)bqStjaE)KxzzN+n{@SB*gmVv9lQcO$@l3_7~(i*PfPQY+zZkk?Tv zsCqBZIT3i*R1c6PpQ0GTmg^XdXCeo6%NV4Rd>rfFs11}vSfDB^M12o`fteAI;*yAk zxDHpb&*S<06ZA*?%06ci&-5Ou$@+I+$u|HdEamF6o+*k9`cC@*tIQ&WEMe!#)lVnA zJ^M*Dioo+;;B%VsjKr0DPCLko#_80p1Miv|AYi;}N-q=(gQy2gUziz!d>rBMmVgTo zf#?;SGPx8~xH@EAUrCY$v$A*8MeEa{sJPKbvIi6kizpcM6_^?H{4Sq{6?HtEd~S*c z?3-{E0n&ZFeP3hFpux6@9%If#R2S9_KhPgCC)SM@5P_77z(fFOF?63iC(x*tb+Swp zcEEynl1G%%xRx|K=<&O_QLRWEK#X19klqnY7=j4iT`^CT;1LhP3ZuA4M4?bT&`!jG z_)`XTtzDv|Fq*81vGc_}JR1fFdiRwn8U|ydCk;_tolmzMK?IW9S-tak#AC3{^a3nW z(r8T}Z=a}`?F5I)Kky&|g>Ajxn8q$xr2E_#cX-4K+uRp2ApVfSwk6sD3#2&j2Bq-H zYMtOyD21>|M+p&#OoIGspBzHV;yw$aIDic7djM6Y>ED0*O8WLCC~k?z!zMidLOZZe zMZv>g)Vpu;O8WP)+Ij7?Gx77`B~Ffc8KsIb+F&`ErHav?Q7ycp6ltBt50CH^r~rZs zO6$cP(6yF|8Y6R>G-pOci;@-&xX4!OOcXvftVZ@wI8tHo(vQ{?cW!puqoRV zP?o^u`}k!q=}tGwPbMhmy$*UlpTu2EI5em^1x|q3(KO0WvX*H7JKl5JK1)t8C{3;w zaz734IRws{%h5K9g}hr)jwxcYP(lgvxjKy9jATL8U@kycDx@N*k>tqf=e0p(m!Din zYIY-pjWB+M>ZX!G2c>uv^$U_4G`_5g5&Zn=P!{YX;yfh#Ol+@yR|S<*<0ej(^`LSs#&Bl^wYV&m9kjMY2%la?8t9R7!K`Y> zU@p!u9(VZNNCmAo=8{5KB>8)W=Vo^y(MN|ThqzAfny5^8Oz8;p5lldz@UVFPR8 z%W9e*pM?}du5GZ7;MvQ~)89PO;?Gvp85|CtW&D7>p~9CczV6DR=y9&6Hc(2~;9H`a z_hNr)<%YgN!oLYc?#!a@88?&b%AyqKUgVsIVK>Q$?#!YU=U-$oVEt;?vA|x1J5;r1 z17kypzpB54eMHTEgujG*WXgW@P8;P00skiF7^OZO$$IeSjd#)!Y*m&)WgGxQsG56) zu~v>*0?m*=N|7kZwTu zR@ujh^_fUQ{WnmLK}g=eZ(tu2k-Qh{Kl@76rNCzh< zkKn3EhaB)4V80ww19;eg=UAkbZW5#$Onk2tV)z>leE#HUr6zok$-dW(G8=ghUoQzv zkqIyTyo$kN!No^NN5T$VU@v4&Kx4y9weYWyF%0DM98ZTsjuj(FUsgy0^Hv!D7?mBORa8>sHd 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. - -set(inc - Socket.h - TcpSocket.h -) - -set(src - ${inc} - TcpSocket.cxx -) - -if (WIN32) - list(APPEND src ${inc}) -endif() - -set(inc - .. -) - -include_directories(${inc}) -add_library(vnc_network STATIC ${src}) diff --git a/src/vnc/common/network/Makefile.in b/src/vnc/common/network/Makefile.in deleted file mode 100644 index 8aed303a..00000000 --- a/src/vnc/common/network/Makefile.in +++ /dev/null @@ -1,17 +0,0 @@ - -SRCS = TcpSocket.cxx - -OBJS = $(SRCS:.cxx=.o) - -DIR_CPPFLAGS = -I$(top_srcdir) @SOCKLEN_T_DEFINE@ - -library = libnetwork.a - -all:: $(library) - -$(library): $(OBJS) - rm -f $(library) - $(AR) $(library) $(OBJS) - $(RANLIB) $(library) - -# followed by boilerplate.mk diff --git a/src/vnc/common/network/Socket.h b/src/vnc/common/network/Socket.h deleted file mode 100644 index 7713d2cd..00000000 --- a/src/vnc/common/network/Socket.h +++ /dev/null @@ -1,147 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- Socket.h - abstract base-class for any kind of network stream/socket - -#ifndef __NETWORK_SOCKET_H__ -#define __NETWORK_SOCKET_H__ - -#include -#include -#include -#include - -namespace network { - - class Socket { - public: - Socket(int fd) - : instream(new rdr::FdInStream(fd)), - outstream(new rdr::FdOutStream(fd)), - ownStreams(true), isShutdown_(false), - queryConnection(false) {} - virtual ~Socket() { - if (ownStreams) { - delete instream; - delete outstream; - } - } - rdr::FdInStream &inStream() {return *instream;} - rdr::FdOutStream &outStream() {return *outstream;} - int getFd() {return outstream->getFd();} - - // if shutdown() is overridden then the override MUST call on to here - virtual void shutdown() {isShutdown_ = true;} - bool isShutdown() const {return isShutdown_;} - - // information about this end of the socket - virtual char* getMyAddress() = 0; // a string e.g. "192.168.0.1" - virtual int getMyPort() = 0; - virtual char* getMyEndpoint() = 0; //

:: - - // information about the remote end of the socket - virtual char* getPeerAddress() = 0; // a string e.g. "192.168.0.1" - virtual int getPeerPort() = 0; - virtual char* getPeerEndpoint() = 0; //
:: - - // Is the remote end on the same machine? - virtual bool sameMachine() = 0; - - // Was there a "?" in the ConnectionFilter used to accept this Socket? - void setRequiresQuery() {queryConnection = true;} - bool requiresQuery() const {return queryConnection;} - - protected: - Socket() : instream(0), outstream(0), ownStreams(false), - isShutdown_(false), queryConnection(false) {} - Socket(rdr::FdInStream* i, rdr::FdOutStream* o, bool own) - : instream(i), outstream(o), ownStreams(own), - isShutdown_(false), queryConnection(false) {} - rdr::FdInStream* instream; - rdr::FdOutStream* outstream; - bool ownStreams; - bool isShutdown_; - bool queryConnection; - }; - - class ConnectionFilter { - public: - virtual bool verifyConnection(Socket* s) = 0; - }; - - class SocketListener { - public: - SocketListener() : fd(0), filter(0) {} - virtual ~SocketListener() {} - - // shutdown() stops the socket from accepting further connections - virtual void shutdown() = 0; - - // accept() returns a new Socket object if there is a connection - // attempt in progress AND if the connection passes the filter - // if one is installed. Otherwise, returns 0. - virtual Socket* accept() = 0; - - // setFilter() applies the specified filter to all new connections - void setFilter(ConnectionFilter* f) {filter = f;} - int getFd() {return fd;} - protected: - int fd; - ConnectionFilter* filter; - }; - - struct SocketException : public rdr::SystemException { - SocketException(const char* text, int err_) : rdr::SystemException(text, err_) {} - }; - - class SocketServer { - public: - virtual ~SocketServer() {} - - // addSocket() tells the server to serve the Socket. The caller - // retains ownership of the Socket - the only way for the server - // to discard a Socket is by calling shutdown() on it. - // outgoing is set to true if the socket was created by connecting out - // to another host, or false if the socket was created by accept()ing - // an incoming connection. - virtual void addSocket(network::Socket* sock, bool outgoing=false) = 0; - - // removeSocket() tells the server to stop serving the Socket. The - // caller retains ownership of the Socket - the server must NOT - // delete the Socket! This call is used mainly to cause per-Socket - // resources to be freed. - virtual void removeSocket(network::Socket* sock) = 0; - - // processSocketEvent() tells the server there is a Socket read event. - // The implementation can indicate that the Socket is no longer active - // by calling shutdown() on it. The caller will then call removeSocket() - // soon after processSocketEvent returns, to allow any pre-Socket - // resources to be tidied up. - virtual void processSocketEvent(network::Socket* sock) = 0; - - // checkTimeouts() allows the server to check socket timeouts, etc. The - // return value is the number of milliseconds to wait before - // checkTimeouts() should be called again. If this number is zero then - // there is no timeout and checkTimeouts() should be called the next time - // an event occurs. - virtual int checkTimeouts() = 0; - }; - -} - -#endif // __NETWORK_SOCKET_H__ diff --git a/src/vnc/common/network/TcpSocket.cxx b/src/vnc/common/network/TcpSocket.cxx deleted file mode 100644 index 058621b1..00000000 --- a/src/vnc/common/network/TcpSocket.cxx +++ /dev/null @@ -1,467 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#ifdef WIN32 -//#include -#include -#define errorNumber WSAGetLastError() -#define snprintf _snprintf -#else -#define errorNumber errno -#define closesocket close -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#endif - -#include -#include -#include - -#ifndef VNC_SOCKLEN_T -#define VNC_SOCKLEN_T int -#endif - -#ifndef INADDR_NONE -#define INADDR_NONE ((unsigned long)-1) -#endif - -using namespace network; -using namespace rdr; - -static rfb::LogWriter vlog("TcpSocket"); - - -// -=- Socket initialisation -static bool socketsInitialised = false; -static void initSockets() { - if (socketsInitialised) - return; -#ifdef WIN32 - WORD requiredVersion = MAKEWORD(2,0); - WSADATA initResult; - - if (WSAStartup(requiredVersion, &initResult) != 0) - throw SocketException("unable to initialise Winsock2", errorNumber); -#else - signal(SIGPIPE, SIG_IGN); -#endif - socketsInitialised = true; -} - - -// -=- TcpSocket - -TcpSocket::TcpSocket(int sock, bool close) - : Socket(new FdInStream(sock), new FdOutStream(sock), true), closeFd(close) -{ -} - -TcpSocket::TcpSocket(const char *host, int port) - : closeFd(true) -{ - int sock; - - // - Create a socket - initSockets(); - if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) - throw SocketException("unable to create socket", errorNumber); - -#ifndef WIN32 - // - By default, close the socket on exec() - fcntl(sock, F_SETFD, FD_CLOEXEC); -#endif - - // - Connect it to something - - // Try processing the host as an IP address - struct sockaddr_in addr; - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = inet_addr(host); - addr.sin_port = htons(port); - if ((int)addr.sin_addr.s_addr == -1) { - // Host was not an IP address - try resolving as DNS name - struct hostent *hostinfo; - hostinfo = gethostbyname(host); - if (hostinfo && hostinfo->h_addr) { - addr.sin_addr.s_addr = ((struct in_addr *)hostinfo->h_addr)->s_addr; - } else { - int e = errorNumber; - closesocket(sock); - throw SocketException("unable to resolve host by name", e); - } - } - - // Attempt to connect to the remote host - if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) != 0) { - int e = errorNumber; - closesocket(sock); - throw SocketException("unable to connect to host", e); - } - - // Disable Nagle's algorithm, to reduce latency - enableNagles(sock, false); - - // Create the input and output streams - instream = new FdInStream(sock); - outstream = new FdOutStream(sock); - ownStreams = true; -} - -TcpSocket::~TcpSocket() { - if (closeFd) - closesocket(getFd()); -} - -char* TcpSocket::getMyAddress() { - struct sockaddr_in info; - struct in_addr addr; - VNC_SOCKLEN_T info_size = sizeof(info); - - getsockname(getFd(), (struct sockaddr *)&info, &info_size); - memcpy(&addr, &info.sin_addr, sizeof(addr)); - - char* name = inet_ntoa(addr); - if (name) { - return rfb::strDup(name); - } else { - return rfb::strDup(""); - } -} - -int TcpSocket::getMyPort() { - return getSockPort(getFd()); -} - -char* TcpSocket::getMyEndpoint() { - rfb::CharArray address; address.buf = getMyAddress(); - int port = getMyPort(); - - int buflen = strlen(address.buf) + 32; - char* buffer = new char[buflen]; - sprintf(buffer, "%s::%d", address.buf, port); - return buffer; -} - -char* TcpSocket::getPeerAddress() { - struct sockaddr_in info; - struct in_addr addr; - VNC_SOCKLEN_T info_size = sizeof(info); - - getpeername(getFd(), (struct sockaddr *)&info, &info_size); - memcpy(&addr, &info.sin_addr, sizeof(addr)); - - char* name = inet_ntoa(addr); - if (name) { - return rfb::strDup(name); - } else { - return rfb::strDup(""); - } -} - -int TcpSocket::getPeerPort() { - struct sockaddr_in info; - VNC_SOCKLEN_T info_size = sizeof(info); - - getpeername(getFd(), (struct sockaddr *)&info, &info_size); - return ntohs(info.sin_port); -} - -char* TcpSocket::getPeerEndpoint() { - rfb::CharArray address; address.buf = getPeerAddress(); - int port = getPeerPort(); - - int buflen = strlen(address.buf) + 32; - char* buffer = new char[buflen]; - sprintf(buffer, "%s::%d", address.buf, port); - return buffer; -} - -bool TcpSocket::sameMachine() { - struct sockaddr_in peeraddr, myaddr; - VNC_SOCKLEN_T addrlen = sizeof(struct sockaddr_in); - - getpeername(getFd(), (struct sockaddr *)&peeraddr, &addrlen); - getsockname(getFd(), (struct sockaddr *)&myaddr, &addrlen); - - return (peeraddr.sin_addr.s_addr == myaddr.sin_addr.s_addr); -} - -void TcpSocket::shutdown() -{ - Socket::shutdown(); - ::shutdown(getFd(), 2); -} - -bool TcpSocket::enableNagles(int sock, bool enable) { - int one = enable ? 0 : 1; - if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, - (char *)&one, sizeof(one)) < 0) { - int e = errorNumber; - vlog.error("unable to setsockopt TCP_NODELAY: %d", e); - return false; - } - return true; -} - -bool TcpSocket::isSocket(int sock) -{ - struct sockaddr_in info; - VNC_SOCKLEN_T info_size = sizeof(info); - return getsockname(sock, (struct sockaddr *)&info, &info_size) >= 0; -} - -bool TcpSocket::isConnected(int sock) -{ - struct sockaddr_in info; - VNC_SOCKLEN_T info_size = sizeof(info); - return getpeername(sock, (struct sockaddr *)&info, &info_size) >= 0; -} - -int TcpSocket::getSockPort(int sock) -{ - struct sockaddr_in info; - VNC_SOCKLEN_T info_size = sizeof(info); - if (getsockname(sock, (struct sockaddr *)&info, &info_size) < 0) - return 0; - return ntohs(info.sin_port); -} - - -TcpListener::TcpListener(int port, bool localhostOnly, int sock, bool close_) - : closeFd(close_) -{ - if (sock != -1) { - fd = sock; - return; - } - - initSockets(); - if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) - throw SocketException("unable to create listening socket", errorNumber); - -#ifndef WIN32 - // - By default, close the socket on exec() - fcntl(fd, F_SETFD, FD_CLOEXEC); - - int one = 1; - if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, - (const char *)&one, sizeof(one)) < 0) { - int e = errorNumber; - closesocket(fd); - throw SocketException("unable to create listening socket", e); - } -#endif - - // - Bind it to the desired port - struct sockaddr_in addr; - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_port = htons(port); - if (localhostOnly) - addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - else - addr.sin_addr.s_addr = htonl(INADDR_ANY); - if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - int e = errorNumber; - closesocket(fd); - throw SocketException("unable to bind listening socket", e); - } - - // - Set it to be a listening socket - if (listen(fd, 5) < 0) { - int e = errorNumber; - closesocket(fd); - throw SocketException("unable to set socket to listening mode", e); - } -} - -TcpListener::~TcpListener() { - if (closeFd) closesocket(fd); -} - -void TcpListener::shutdown() -{ -#ifdef WIN32 - closesocket(getFd()); -#else - ::shutdown(getFd(), 2); -#endif -} - - -Socket* -TcpListener::accept() { - int new_sock = -1; - - // Accept an incoming connection - if ((new_sock = ::accept(fd, 0, 0)) < 0) - throw SocketException("unable to accept new connection", errorNumber); - -#ifndef WIN32 - // - By default, close the socket on exec() - fcntl(new_sock, F_SETFD, FD_CLOEXEC); -#endif - - // Disable Nagle's algorithm, to reduce latency - TcpSocket::enableNagles(new_sock, false); - - // Create the socket object & check connection is allowed - TcpSocket* s = new TcpSocket(new_sock); - if (filter && !filter->verifyConnection(s)) { - delete s; - return 0; - } - return s; -} - -void TcpListener::getMyAddresses(std::list* result) { - const hostent* addrs = gethostbyname(0); - if (addrs == 0) - throw rdr::SystemException("gethostbyname", errorNumber); - if (addrs->h_addrtype != AF_INET) - throw rdr::Exception("getMyAddresses: bad family"); - for (int i=0; addrs->h_addr_list[i] != 0; i++) { - const char* addrC = inet_ntoa(*((struct in_addr*)addrs->h_addr_list[i])); - char* addr = new char[strlen(addrC)+1]; - strcpy(addr, addrC); - result->push_back(addr); - } -} - -int TcpListener::getMyPort() { - return TcpSocket::getSockPort(getFd()); -} - - -TcpFilter::TcpFilter(const char* spec) { - rfb::CharArray tmp; - tmp.buf = rfb::strDup(spec); - while (tmp.buf) { - rfb::CharArray first; - rfb::strSplit(tmp.buf, ',', &first.buf, &tmp.buf); - if (strlen(first.buf)) - filter.push_back(parsePattern(first.buf)); - } -} - -TcpFilter::~TcpFilter() { -} - - -static bool -patternMatchIP(const TcpFilter::Pattern& pattern, const char* value) { - unsigned long address = inet_addr(value); - if (address == INADDR_NONE) return false; - return ((pattern.address & pattern.mask) == (address & pattern.mask)); -} - -bool -TcpFilter::verifyConnection(Socket* s) { - rfb::CharArray name; - - name.buf = s->getPeerAddress(); - std::list::iterator i; - for (i=filter.begin(); i!=filter.end(); i++) { - if (patternMatchIP(*i, name.buf)) { - switch ((*i).action) { - case Accept: - vlog.debug("ACCEPT %s", name.buf); - return true; - case Query: - vlog.debug("QUERY %s", name.buf); - s->setRequiresQuery(); - return true; - case Reject: - vlog.debug("REJECT %s", name.buf); - return false; - } - } - } - - vlog.debug("[REJECT] %s", name.buf); - return false; -} - - -TcpFilter::Pattern TcpFilter::parsePattern(const char* p) { - TcpFilter::Pattern pattern; - - bool expandMask = false; - rfb::CharArray addr, mask; - - if (rfb::strSplit(&p[1], '/', &addr.buf, &mask.buf)) { - if (rfb::strContains(mask.buf, '.')) { - pattern.mask = inet_addr(mask.buf); - } else { - pattern.mask = atoi(mask.buf); - expandMask = true; - } - } else { - pattern.mask = 32; - expandMask = true; - } - if (expandMask) { - unsigned long expanded = 0; - // *** check endianness! - for (int i=0; i<(int)pattern.mask; i++) - expanded |= 1<<(31-i); - pattern.mask = htonl(expanded); - } - - pattern.address = inet_addr(addr.buf) & pattern.mask; - if ((pattern.address == INADDR_NONE) || - (pattern.address == 0)) pattern.mask = 0; - - switch(p[0]) { - case '+': pattern.action = TcpFilter::Accept; break; - case '-': pattern.action = TcpFilter::Reject; break; - case '?': pattern.action = TcpFilter::Query; break; - }; - - return pattern; -} - -char* TcpFilter::patternToStr(const TcpFilter::Pattern& p) { - in_addr tmp; - rfb::CharArray addr, mask; - tmp.s_addr = p.address; - addr.buf = rfb::strDup(inet_ntoa(tmp)); - tmp.s_addr = p.mask; - mask.buf = rfb::strDup(inet_ntoa(tmp)); - char* result = new char[strlen(addr.buf)+1+strlen(mask.buf)+1+1]; - switch (p.action) { - case Accept: result[0] = '+'; break; - case Reject: result[0] = '-'; break; - case Query: result[0] = '?'; break; - }; - result[1] = 0; - strcat(result, addr.buf); - strcat(result, "/"); - strcat(result, mask.buf); - return result; -} diff --git a/src/vnc/common/network/TcpSocket.h b/src/vnc/common/network/TcpSocket.h deleted file mode 100644 index 8b19c7ef..00000000 --- a/src/vnc/common/network/TcpSocket.h +++ /dev/null @@ -1,99 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- TcpSocket.h - base-class for TCP stream sockets. -// This header also defines the TcpListener class, used -// to listen for incoming socket connections over TCP -// -// NB: Any file descriptors created by the TcpSocket or -// TcpListener classes are close-on-exec if the OS supports -// it. TcpSockets initialised with a caller-supplied fd -// are NOT set to close-on-exec. - -#ifndef __NETWORK_TCP_SOCKET_H__ -#define __NETWORK_TCP_SOCKET_H__ - -#include - -#include - -namespace network { - - class TcpSocket : public Socket { - public: - TcpSocket(int sock, bool close=true); - TcpSocket(const char *name, int port); - virtual ~TcpSocket(); - - virtual char* getMyAddress(); - virtual int getMyPort(); - virtual char* getMyEndpoint(); - - virtual char* getPeerAddress(); - virtual int getPeerPort(); - virtual char* getPeerEndpoint(); - virtual bool sameMachine(); - - virtual void shutdown(); - - static bool enableNagles(int sock, bool enable); - static bool isSocket(int sock); - static bool isConnected(int sock); - static int getSockPort(int sock); - private: - bool closeFd; - }; - - class TcpListener : public SocketListener { - public: - TcpListener(int port, bool localhostOnly=false, int sock=-1, - bool close=true); - virtual ~TcpListener(); - - virtual void shutdown(); - virtual Socket* accept(); - - void getMyAddresses(std::list* addrs); - int getMyPort(); - - private: - bool closeFd; - }; - - class TcpFilter : public ConnectionFilter { - public: - TcpFilter(const char* filter); - virtual ~TcpFilter(); - - virtual bool verifyConnection(Socket* s); - - typedef enum {Accept, Reject, Query} Action; - struct Pattern { - Action action; - unsigned long address; - unsigned long mask; - }; - static Pattern parsePattern(const char* s); - static char* patternToStr(const Pattern& p); - protected: - std::list filter; - }; - -} - -#endif // __NETWORK_TCP_SOCKET_H__ diff --git a/src/vnc/common/rdr/CMakeLists.txt b/src/vnc/common/rdr/CMakeLists.txt deleted file mode 100644 index 5bd1f7ad..00000000 --- a/src/vnc/common/rdr/CMakeLists.txt +++ /dev/null @@ -1,58 +0,0 @@ -# synergy -- mouse and keyboard sharing utility -# Copyright (C) 2012 Nick Bolton -# -# This package is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# found in the file COPYING that should have accompanied this file. -# -# This package 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, see . - -set(inc - Exception.h - FdInStream.h - FdOutStream.h - FixedMemOutStream.h - HexInStream.h - HexOutStream.h - InStream.h - MemInStream.h - MemOutStream.h - OutStream.h - RandomStream.h - SubstitutingInStream.h - types.h - ZlibInStream.h - ZlibOutStream.h -) - -set(src - Exception.cxx - FdInStream.cxx - FdOutStream.cxx - HexInStream.cxx - HexOutStream.cxx - InStream.cxx - RandomStream.cxx - ZlibInStream.cxx - ZlibOutStream.cxx -) - -if (WIN32) - list(APPEND src ${inc}) -endif() - -set(inc - .. - ../zlib -) - -include_directories(${inc}) -add_library(vnc_rdr STATIC ${src}) -target_link_libraries(vnc_rdr - vnc_zlib) diff --git a/src/vnc/common/rdr/Exception.cxx b/src/vnc/common/rdr/Exception.cxx deleted file mode 100644 index 1f1ce66c..00000000 --- a/src/vnc/common/rdr/Exception.cxx +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -#include -#ifdef _WIN32 -#include -#include -//#include -#endif - -using namespace rdr; - -SystemException::SystemException(const char* s, int err_) - : Exception(s), err(err_) -{ - strncat(str_, ": ", len-1-strlen(str_)); -#ifdef _WIN32 - // Windows error messages are crap, so use unix ones for common errors. - const char* msg = 0; - switch (err) { - case WSAECONNREFUSED: msg = "Connection refused"; break; - case WSAETIMEDOUT: msg = "Connection timed out"; break; - case WSAECONNRESET: msg = "Connection reset by peer"; break; - case WSAECONNABORTED: msg = "Connection aborted"; break; - } - if (msg) { - strncat(str_, msg, len-1-strlen(str_)); - } else { -#ifdef UNICODE - WCHAR* tmsg = new WCHAR[len-strlen(str_)]; - FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - 0, err, 0, tmsg, len-1-strlen(str_), 0); - WideCharToMultiByte(CP_ACP, 0, tmsg, wcslen(tmsg)+1, - str_+strlen(str_), len-strlen(str_), 0, 0); - delete [] tmsg; -#else - char* currStr = str_+strlen(str_); - FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - 0, err, 0, currStr, len-1-strlen(str_), 0); -#endif - int l = strlen(str_); - if ((l >= 2) && (str_[l-2] == '\r') && (str_[l-1] == '\n')) - str_[l-2] = 0; - } - -#else - strncat(str_, strerror(err), len-1-strlen(str_)); -#endif - strncat(str_, " (", len-1-strlen(str_)); - char buf[20]; -#ifdef WIN32 - if (err < 0) - sprintf(buf, "%x", err); - else -#endif - sprintf(buf,"%d",err); - strncat(str_, buf, len-1-strlen(str_)); - strncat(str_, ")", len-1-strlen(str_)); -} diff --git a/src/vnc/common/rdr/Exception.h b/src/vnc/common/rdr/Exception.h deleted file mode 100644 index 1b92f777..00000000 --- a/src/vnc/common/rdr/Exception.h +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#ifndef __RDR_EXCEPTION_H__ -#define __RDR_EXCEPTION_H__ - -#include -#include - -namespace rdr { - - struct Exception { - enum { len = 256 }; - char str_[len]; - Exception(const char* s=0) { - str_[0] = 0; - if (s) - strncat(str_, s, len-1); - else - strcat(str_, "Exception"); - } - virtual const char* str() const { return str_; } - }; - - struct SystemException : public Exception { - int err; - SystemException(const char* s, int err_); - }; - - struct TimedOut : public Exception { - TimedOut(const char* s="Timed out") : Exception(s) {} - }; - - struct EndOfStream : public Exception { - EndOfStream(const char* s="End of stream") : Exception(s) {} - }; - - struct FrameException : public Exception { - FrameException(const char* s="Frame exception") : Exception(s) {} - }; -} - -#endif diff --git a/src/vnc/common/rdr/FdInStream.cxx b/src/vnc/common/rdr/FdInStream.cxx deleted file mode 100644 index 6496ed5b..00000000 --- a/src/vnc/common/rdr/FdInStream.cxx +++ /dev/null @@ -1,283 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include -#include -#ifdef _WIN32 -#include -#ifndef _WIN32_WCE -#include -#endif -#define read(s,b,l) recv(s,(char*)b,l,0) -#define close closesocket -#undef errno -#define errno WSAGetLastError() -#undef EINTR -#define EINTR WSAEINTR -#else -#include -#include -#include -#include -#endif - -// XXX should use autoconf HAVE_SYS_SELECT_H -#ifdef _AIX -#include -#endif - -#include -#include - -#pragma warning(disable: 4244) - -using namespace rdr; - -enum { DEFAULT_BUF_SIZE = 8192, - MIN_BULK_SIZE = 1024 }; - -FdInStream::FdInStream(int fd_, int timeoutms_, int bufSize_, - bool closeWhenDone_) - : fd(fd_), closeWhenDone(closeWhenDone_), - timeoutms(timeoutms_), blockCallback(0), - timing(false), timeWaitedIn100us(5), timedKbits(0), - bufSize(bufSize_ ? bufSize_ : DEFAULT_BUF_SIZE), offset(0) -{ - ptr = end = start = new U8[bufSize]; -} - -FdInStream::FdInStream(int fd_, FdInStreamBlockCallback* blockCallback_, - int bufSize_) - : fd(fd_), timeoutms(0), blockCallback(blockCallback_), - timing(false), timeWaitedIn100us(5), timedKbits(0), - bufSize(bufSize_ ? bufSize_ : DEFAULT_BUF_SIZE), offset(0) -{ - ptr = end = start = new U8[bufSize]; -} - -FdInStream::~FdInStream() -{ - delete [] start; - if (closeWhenDone) close(fd); -} - - -void FdInStream::setTimeout(int timeoutms_) { - timeoutms = timeoutms_; -} - -void FdInStream::setBlockCallback(FdInStreamBlockCallback* blockCallback_) -{ - blockCallback = blockCallback_; - timeoutms = 0; -} - -int FdInStream::pos() -{ - return offset + ptr - start; -} - -void FdInStream::readBytes(void* data, int length) -{ - if (length < MIN_BULK_SIZE) { - InStream::readBytes(data, length); - return; - } - - U8* dataPtr = (U8*)data; - - int n = end - ptr; - if (n > length) n = length; - - memcpy(dataPtr, ptr, n); - dataPtr += n; - length -= n; - ptr += n; - - while (length > 0) { - n = readWithTimeoutOrCallback(dataPtr, length); - dataPtr += n; - length -= n; - offset += n; - } -} - - -int FdInStream::overrun(int itemSize, int nItems, bool wait) -{ - if (itemSize > bufSize) - throw Exception("FdInStream overrun: max itemSize exceeded"); - - if (end - ptr != 0) - memmove(start, ptr, end - ptr); - - offset += ptr - start; - end -= ptr - start; - ptr = start; - - while (end < start + itemSize) { - int n = readWithTimeoutOrCallback((U8*)end, start + bufSize - end, wait); - if (n == 0) return 0; - end += n; - } - - if (itemSize * nItems > end - ptr) - nItems = (end - ptr) / itemSize; - - return nItems; -} - -#ifdef _WIN32 -static void gettimeofday(struct timeval* tv, void*) -{ - LARGE_INTEGER counts, countsPerSec; - static double usecPerCount = 0.0; - - if (QueryPerformanceCounter(&counts)) { - if (usecPerCount == 0.0) { - QueryPerformanceFrequency(&countsPerSec); - usecPerCount = 1000000.0 / countsPerSec.QuadPart; - } - - LONGLONG usecs = (LONGLONG)(counts.QuadPart * usecPerCount); - tv->tv_usec = (long)(usecs % 1000000); - tv->tv_sec = (long)(usecs / 1000000); - - } else { -#ifndef _WIN32_WCE - struct timeb tb; - ftime(&tb); - tv->tv_sec = tb.time; - tv->tv_usec = tb.millitm * 1000; -#else - throw SystemException("QueryPerformanceCounter", GetLastError()); -#endif - } -} -#endif - -// -// readWithTimeoutOrCallback() reads up to the given length in bytes from the -// file descriptor into a buffer. If the wait argument is false, then zero is -// returned if no bytes can be read without blocking. Otherwise if a -// blockCallback is set, it will be called (repeatedly) instead of blocking. -// If alternatively there is a timeout set and that timeout expires, it throws -// a TimedOut exception. Otherwise it returns the number of bytes read. It -// never attempts to read() unless select() indicates that the fd is readable - -// this means it can be used on an fd which has been set non-blocking. It also -// has to cope with the annoying possibility of both select() and read() -// returning EINTR. -// - -int FdInStream::readWithTimeoutOrCallback(void* buf, int len, bool wait) -{ - struct timeval before, after; - if (timing) - gettimeofday(&before, 0); - - int n; - while (true) { - do { - fd_set fds; - struct timeval tv; - struct timeval* tvp = &tv; - - if (!wait) { - tv.tv_sec = tv.tv_usec = 0; - } else if (timeoutms != -1) { - tv.tv_sec = timeoutms / 1000; - tv.tv_usec = (timeoutms % 1000) * 1000; - } else { - tvp = 0; - } - - FD_ZERO(&fds); - FD_SET(fd, &fds); - n = select(fd+1, &fds, 0, 0, tvp); - } while (n < 0 && errno == EINTR); - - if (n > 0) break; - if (n < 0) throw SystemException("select",errno); - if (!wait) return 0; - if (!blockCallback) throw TimedOut(); - - blockCallback->blockCallback(); - } - - do { - n = ::read(fd, buf, len); - } while (n < 0 && errno == EINTR); - - if (n < 0) throw SystemException("read",errno); - if (n == 0) throw EndOfStream(); - - if (timing) { - gettimeofday(&after, 0); -// fprintf(stderr,"%d.%06d\n",(after.tv_sec - before.tv_sec), -// (after.tv_usec - before.tv_usec)); - int newTimeWaited = ((after.tv_sec - before.tv_sec) * 10000 + - (after.tv_usec - before.tv_usec) / 100); - int newKbits = n * 8 / 1000; - -// if (newTimeWaited == 0) { -// fprintf(stderr,"new kbps infinite t %d k %d\n", -// newTimeWaited, newKbits); -// } else { -// fprintf(stderr,"new kbps %d t %d k %d\n", -// newKbits * 10000 / newTimeWaited, newTimeWaited, newKbits); -// } - - // limit rate to between 10kbit/s and 40Mbit/s - - if (newTimeWaited > newKbits*1000) newTimeWaited = newKbits*1000; - if (newTimeWaited < newKbits/4) newTimeWaited = newKbits/4; - - timeWaitedIn100us += newTimeWaited; - timedKbits += newKbits; - } - - return n; -} - -void FdInStream::startTiming() -{ - timing = true; - - // Carry over up to 1s worth of previous rate for smoothing. - - if (timeWaitedIn100us > 10000) { - timedKbits = timedKbits * 10000 / timeWaitedIn100us; - timeWaitedIn100us = 10000; - } -} - -void FdInStream::stopTiming() -{ - timing = false; - if (timeWaitedIn100us < timedKbits/2) - timeWaitedIn100us = timedKbits/2; // upper limit 20Mbit/s -} - -unsigned int FdInStream::kbitsPerSecond() -{ - // The following calculation will overflow 32-bit arithmetic if we have - // received more than about 50Mbytes (400Mbits) since we started timing, so - // it should be OK for a single RFB update. - - return timedKbits * 10000 / timeWaitedIn100us; -} diff --git a/src/vnc/common/rdr/FdInStream.h b/src/vnc/common/rdr/FdInStream.h deleted file mode 100644 index 5d9598c8..00000000 --- a/src/vnc/common/rdr/FdInStream.h +++ /dev/null @@ -1,77 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// FdInStream streams from a file descriptor. -// - -#ifndef __RDR_FDINSTREAM_H__ -#define __RDR_FDINSTREAM_H__ - -#include - -namespace rdr { - - class FdInStreamBlockCallback { - public: - virtual void blockCallback() = 0; - }; - - class FdInStream : public InStream { - - public: - - FdInStream(int fd, int timeoutms=-1, int bufSize=0, - bool closeWhenDone_=false); - FdInStream(int fd, FdInStreamBlockCallback* blockCallback, int bufSize=0); - virtual ~FdInStream(); - - void setTimeout(int timeoutms); - void setBlockCallback(FdInStreamBlockCallback* blockCallback); - int getFd() { return fd; } - int pos(); - void readBytes(void* data, int length); - - void startTiming(); - void stopTiming(); - unsigned int kbitsPerSecond(); - unsigned int timeWaited() { return timeWaitedIn100us; } - - protected: - int overrun(int itemSize, int nItems, bool wait); - - private: - int readWithTimeoutOrCallback(void* buf, int len, bool wait=true); - - int fd; - bool closeWhenDone; - int timeoutms; - FdInStreamBlockCallback* blockCallback; - - bool timing; - unsigned int timeWaitedIn100us; - unsigned int timedKbits; - - int bufSize; - int offset; - U8* start; - }; - -} // end of namespace rdr - -#endif diff --git a/src/vnc/common/rdr/FdOutStream.cxx b/src/vnc/common/rdr/FdOutStream.cxx deleted file mode 100644 index bfe1d36a..00000000 --- a/src/vnc/common/rdr/FdOutStream.cxx +++ /dev/null @@ -1,174 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include -#include -#ifdef _WIN32 -#include -#define write(s,b,l) send(s,(const char*)b,l,0) -#define EWOULDBLOCK WSAEWOULDBLOCK -#undef errno -#define errno WSAGetLastError() -#undef EINTR -#define EINTR WSAEINTR -#else -#include -#include -#include -#include -#endif - -#include -#include - - -using namespace rdr; - -enum { DEFAULT_BUF_SIZE = 16384, - MIN_BULK_SIZE = 1024 }; - -FdOutStream::FdOutStream(int fd_, int timeoutms_, int bufSize_) - : fd(fd_), timeoutms(timeoutms_), - bufSize(bufSize_ ? bufSize_ : DEFAULT_BUF_SIZE), offset(0) -{ - ptr = start = new U8[bufSize]; - end = start + bufSize; -} - -FdOutStream::~FdOutStream() -{ - try { - flush(); - } catch (Exception&) { - } - delete [] start; -} - -void FdOutStream::setTimeout(int timeoutms_) { - timeoutms = timeoutms_; -} - -void FdOutStream::writeBytes(const void* data, int length) -{ - if (length < MIN_BULK_SIZE) { - OutStream::writeBytes(data, length); - return; - } - - const U8* dataPtr = (const U8*)data; - - flush(); - - while (length > 0) { - int n = writeWithTimeout(dataPtr, length); - length -= n; - dataPtr += n; - offset += n; - } -} - -int FdOutStream::length() -{ - return offset + ptr - start; -} - -void FdOutStream::flush() -{ - U8* sentUpTo = start; - while (sentUpTo < ptr) { - int n = writeWithTimeout((const void*) sentUpTo, ptr - sentUpTo); - sentUpTo += n; - offset += n; - } - - ptr = start; -} - - -int FdOutStream::overrun(int itemSize, int nItems) -{ - if (itemSize > bufSize) - throw Exception("FdOutStream overrun: max itemSize exceeded"); - - flush(); - - if (itemSize * nItems > end - ptr) - nItems = (end - ptr) / itemSize; - - return nItems; -} - -// -// writeWithTimeout() writes up to the given length in bytes from the given -// buffer to the file descriptor. If there is a timeout set and that timeout -// expires, it throws a TimedOut exception. Otherwise it returns the number of -// bytes written. It never attempts to write() unless select() indicates that -// the fd is writable - this means it can be used on an fd which has been set -// non-blocking. It also has to cope with the annoying possibility of both -// select() and write() returning EINTR. -// - -int FdOutStream::writeWithTimeout(const void* data, int length) -{ - int n; - - do { - - do { - fd_set fds; - struct timeval tv; - struct timeval* tvp = &tv; - - if (timeoutms != -1) { - tv.tv_sec = timeoutms / 1000; - tv.tv_usec = (timeoutms % 1000) * 1000; - } else { - tvp = 0; - } - - FD_ZERO(&fds); - FD_SET(fd, &fds); -#ifdef _WIN32_WCE - // NB: This fixes a broken Winsock2 select() behaviour. select() - // never returns for non-blocking sockets, unless they're already - // ready to be written to... - u_long zero = 0; ioctlsocket(fd, FIONBIO, &zero); -#endif - n = select(fd+1, 0, &fds, 0, tvp); -#ifdef _WIN32_WCE - u_long one = 0; ioctlsocket(fd, FIONBIO, &one); -#endif - } while (n < 0 && errno == EINTR); - - if (n < 0) throw SystemException("select",errno); - - if (n == 0) throw TimedOut(); - - do { - n = ::write(fd, data, length); - } while (n < 0 && (errno == EINTR)); - - // NB: This outer loop simply fixes a broken Winsock2 EWOULDBLOCK - // condition, found only under Win98 (first edition), with slow - // network connections. Should in fact never ever happen... - } while (n < 0 && (errno == EWOULDBLOCK)); - - if (n < 0) throw SystemException("write",errno); - - return n; -} diff --git a/src/vnc/common/rdr/FdOutStream.h b/src/vnc/common/rdr/FdOutStream.h deleted file mode 100644 index f75917cd..00000000 --- a/src/vnc/common/rdr/FdOutStream.h +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// FdOutStream streams to a file descriptor. -// - -#ifndef __RDR_FDOUTSTREAM_H__ -#define __RDR_FDOUTSTREAM_H__ - -#include - -namespace rdr { - - class FdOutStream : public OutStream { - - public: - - FdOutStream(int fd, int timeoutms=-1, int bufSize=0); - virtual ~FdOutStream(); - - void setTimeout(int timeoutms); - int getFd() { return fd; } - - void flush(); - int length(); - void writeBytes(const void* data, int length); - - private: - int overrun(int itemSize, int nItems); - int writeWithTimeout(const void* data, int length); - int fd; - int timeoutms; - int bufSize; - int offset; - U8* start; - }; - -} - -#endif diff --git a/src/vnc/common/rdr/FixedMemOutStream.h b/src/vnc/common/rdr/FixedMemOutStream.h deleted file mode 100644 index e4ec52cb..00000000 --- a/src/vnc/common/rdr/FixedMemOutStream.h +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// A FixedMemOutStream writes to a buffer of a fixed length. -// - -#ifndef __RDR_FIXEDMEMOUTSTREAM_H__ -#define __RDR_FIXEDMEMOUTSTREAM_H__ - -#include -#include - -namespace rdr { - - class FixedMemOutStream : public OutStream { - - public: - - FixedMemOutStream(void* buf, int len) { - ptr = start = (U8*)buf; - end = start + len; - } - - int length() { return ptr - start; } - void reposition(int pos) { ptr = start + pos; } - const void* data() { return (const void*)start; } - - private: - - int overrun(int itemSize, int nItems) { throw EndOfStream(); } - U8* start; - }; - -} - -#endif diff --git a/src/vnc/common/rdr/HexInStream.cxx b/src/vnc/common/rdr/HexInStream.cxx deleted file mode 100644 index 80f8a796..00000000 --- a/src/vnc/common/rdr/HexInStream.cxx +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include -#include - -#include -#include - -using namespace rdr; - -const int DEFAULT_BUF_LEN = 16384; - -static inline int min(int a, int b) {return a= '0') && (c <= '9')) - *v = (*v << 4) + (c - '0'); - else if ((c >= 'a') && (c <= 'f')) - *v = (*v << 4) + (c - 'a' + 10); - else - return false; - return true; -} - -bool HexInStream::hexStrToBin(const char* s, char** data, int* length) { - int l=strlen(s); - if ((l % 2) == 0) { - delete [] *data; - *data = 0; *length = 0; - if (l == 0) - return true; - *data = new char[l/2]; - *length = l/2; - for(int i=0;i bufSize) - throw Exception("HexInStream overrun: max itemSize exceeded"); - - if (end - ptr != 0) - memmove(start, ptr, end - ptr); - - end -= ptr - start; - offset += ptr - start; - ptr = start; - - while (end < ptr + itemSize) { - int n = in_stream.check(2, 1, wait); - if (n == 0) return 0; - const U8* iptr = in_stream.getptr(); - const U8* eptr = in_stream.getend(); - int length = min((eptr - iptr)/2, start + bufSize - end); - - U8* optr = (U8*) end; - for (int i=0; i end - ptr) - nItems = (end - ptr) / itemSize; - - return nItems; -} diff --git a/src/vnc/common/rdr/HexInStream.h b/src/vnc/common/rdr/HexInStream.h deleted file mode 100644 index 6bfb8433..00000000 --- a/src/vnc/common/rdr/HexInStream.h +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#ifndef __RDR_HEX_INSTREAM_H__ -#define __RDR_HEX_INSTREAM_H__ - -#include - -namespace rdr { - - class HexInStream : public InStream { - public: - - HexInStream(InStream& is, int bufSize=0); - virtual ~HexInStream(); - - int pos(); - - static bool readHexAndShift(char c, int* v); - static bool hexStrToBin(const char* s, char** data, int* length); - - protected: - int overrun(int itemSize, int nItems, bool wait); - - private: - int bufSize; - U8* start; - int offset; - - InStream& in_stream; - }; - -} // end of namespace rdr - -#endif diff --git a/src/vnc/common/rdr/HexOutStream.cxx b/src/vnc/common/rdr/HexOutStream.cxx deleted file mode 100644 index 9b0b6c4d..00000000 --- a/src/vnc/common/rdr/HexOutStream.cxx +++ /dev/null @@ -1,110 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include -#include - -using namespace rdr; - -const int DEFAULT_BUF_LEN = 16384; - -static inline int min(int a, int b) {return a=0) && (i<=9)) - return '0'+i; - else if ((i>=10) && (i<=15)) - return 'a'+(i-10); - else - throw rdr::Exception("intToHex failed"); -} - -char* HexOutStream::binToHexStr(const char* data, int length) { - char* buffer = new char[length*2+1]; - for (int i=0; i> 4) & 15); - buffer[i*2+1] = intToHex((data[i] & 15)); - if (!buffer[i*2] || !buffer[i*2+1]) { - delete [] buffer; - return 0; - } - } - buffer[length*2] = 0; - return buffer; -} - - -void -HexOutStream::writeBuffer() { - U8* pos = start; - while (pos != ptr) { - out_stream.check(2); - U8* optr = out_stream.getptr(); - U8* oend = out_stream.getend(); - int length = min(ptr-pos, (oend-optr)/2); - - for (int i=0; i> 4) & 0xf); - optr[i*2+1] = intToHex(pos[i] & 0xf); - } - - out_stream.setptr(optr + length*2); - pos += length; - } - offset += ptr - start; - ptr = start; -} - -int HexOutStream::length() -{ - return offset + ptr - start; -} - -void -HexOutStream::flush() { - writeBuffer(); - out_stream.flush(); -} - -int -HexOutStream::overrun(int itemSize, int nItems) { - if (itemSize > bufSize) - throw Exception("HexOutStream overrun: max itemSize exceeded"); - - writeBuffer(); - - if (itemSize * nItems > end - ptr) - nItems = (end - ptr) / itemSize; - - return nItems; -} - diff --git a/src/vnc/common/rdr/HexOutStream.h b/src/vnc/common/rdr/HexOutStream.h deleted file mode 100644 index 10247e68..00000000 --- a/src/vnc/common/rdr/HexOutStream.h +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#ifndef __RDR_HEX_OUTSTREAM_H__ -#define __RDR_HEX_OUTSTREAM_H__ - -#include - -namespace rdr { - - class HexOutStream : public OutStream { - public: - - HexOutStream(OutStream& os, int buflen=0); - virtual ~HexOutStream(); - - void flush(); - int length(); - - static char intToHex(int i); - static char* binToHexStr(const char* data, int length); - - private: - void writeBuffer(); - int overrun(int itemSize, int nItems); - - OutStream& out_stream; - - U8* start; - int offset; - int bufSize; - }; - -} - -#endif diff --git a/src/vnc/common/rdr/InStream.cxx b/src/vnc/common/rdr/InStream.cxx deleted file mode 100644 index a413b6c1..00000000 --- a/src/vnc/common/rdr/InStream.cxx +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include -#include - -using namespace rdr; - -U32 InStream::maxStringLength = 65535; - -char* InStream::readString() -{ - U32 len = readU32(); - if (len > maxStringLength) - throw Exception("InStream max string length exceeded"); - char* str = new char[len+1]; - readBytes(str, len); - str[len] = 0; - return str; -} diff --git a/src/vnc/common/rdr/InStream.h b/src/vnc/common/rdr/InStream.h deleted file mode 100644 index 97648fb4..00000000 --- a/src/vnc/common/rdr/InStream.h +++ /dev/null @@ -1,153 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// rdr::InStream marshalls data from a buffer stored in RDR (RFB Data -// Representation). -// - -#ifndef __RDR_INSTREAM_H__ -#define __RDR_INSTREAM_H__ - -#include -#include // for memcpy - -namespace rdr { - - class InStream { - - public: - - virtual ~InStream() {} - - // check() ensures there is buffer data for at least one item of size - // itemSize bytes. Returns the number of items in the buffer (up to a - // maximum of nItems). If wait is false, then instead of blocking to wait - // for the bytes, zero is returned if the bytes are not immediately - // available. - - inline int check(int itemSize, int nItems=1, bool wait=true) - { - if (ptr + itemSize * nItems > end) { - if (ptr + itemSize > end) - return overrun(itemSize, nItems, wait); - - nItems = (end - ptr) / itemSize; - } - return nItems; - } - - // checkNoWait() tries to make sure that the given number of bytes can - // be read without blocking. It returns true if this is the case, false - // otherwise. The length must be "small" (less than the buffer size). - - inline bool checkNoWait(int length) { return check(length, 1, false)!=0; } - - // readU/SN() methods read unsigned and signed N-bit integers. - - inline U8 readU8() { check(1); return *ptr++; } - inline U16 readU16() { check(2); int b0 = *ptr++; int b1 = *ptr++; - return b0 << 8 | b1; } - inline U32 readU32() { check(4); int b0 = *ptr++; int b1 = *ptr++; - int b2 = *ptr++; int b3 = *ptr++; - return b0 << 24 | b1 << 16 | b2 << 8 | b3; } - - inline S8 readS8() { return (S8) readU8(); } - inline S16 readS16() { return (S16)readU16(); } - inline S32 readS32() { return (S32)readU32(); } - - // readString() reads a string - a U32 length followed by the data. - // Returns a null-terminated string - the caller should delete[] it - // afterwards. - - char* readString(); - - // maxStringLength protects against allocating a huge buffer. Set it - // higher if you need longer strings. - - static U32 maxStringLength; - - inline void skip(int bytes) { - while (bytes > 0) { - int n = check(1, bytes); - ptr += n; - bytes -= n; - } - } - - // readBytes() reads an exact number of bytes. - - virtual void readBytes(void* data, int length) { - U8* dataPtr = (U8*)data; - U8* dataEnd = dataPtr + length; - while (dataPtr < dataEnd) { - int n = check(1, dataEnd - dataPtr); - memcpy(dataPtr, ptr, n); - ptr += n; - dataPtr += n; - } - } - - // readOpaqueN() reads a quantity without byte-swapping. - - inline U8 readOpaque8() { return readU8(); } - inline U16 readOpaque16() { check(2); U16 r; ((U8*)&r)[0] = *ptr++; - ((U8*)&r)[1] = *ptr++; return r; } - inline U32 readOpaque32() { check(4); U32 r; ((U8*)&r)[0] = *ptr++; - ((U8*)&r)[1] = *ptr++; ((U8*)&r)[2] = *ptr++; - ((U8*)&r)[3] = *ptr++; return r; } - inline U32 readOpaque24A() { check(3); U32 r=0; ((U8*)&r)[0] = *ptr++; - ((U8*)&r)[1] = *ptr++; ((U8*)&r)[2] = *ptr++; - return r; } - inline U32 readOpaque24B() { check(3); U32 r=0; ((U8*)&r)[1] = *ptr++; - ((U8*)&r)[2] = *ptr++; ((U8*)&r)[3] = *ptr++; - return r; } - - // pos() returns the position in the stream. - - virtual int pos() = 0; - - // getptr(), getend() and setptr() are "dirty" methods which allow you to - // manipulate the buffer directly. This is useful for a stream which is a - // wrapper around an underlying stream. - - inline const U8* getptr() const { return ptr; } - inline const U8* getend() const { return end; } - inline void setptr(const U8* p) { ptr = p; } - - private: - - // overrun() is implemented by a derived class to cope with buffer overrun. - // It ensures there are at least itemSize bytes of buffer data. Returns - // the number of items in the buffer (up to a maximum of nItems). itemSize - // is supposed to be "small" (a few bytes). If wait is false, then - // instead of blocking to wait for the bytes, zero is returned if the bytes - // are not immediately available. - - virtual int overrun(int itemSize, int nItems, bool wait=true) = 0; - - protected: - - InStream() {} - const U8* ptr; - const U8* end; - }; - -} - -#endif diff --git a/src/vnc/common/rdr/Makefile.in b/src/vnc/common/rdr/Makefile.in deleted file mode 100644 index 09fa5544..00000000 --- a/src/vnc/common/rdr/Makefile.in +++ /dev/null @@ -1,19 +0,0 @@ - -SRCS = Exception.cxx FdInStream.cxx FdOutStream.cxx InStream.cxx \ - RandomStream.cxx ZlibInStream.cxx ZlibOutStream.cxx \ - HexInStream.cxx HexOutStream.cxx - -OBJS = $(SRCS:.cxx=.o) - -DIR_CPPFLAGS = -I$(top_srcdir) @ZLIB_INCLUDE@ - -library = librdr.a - -all:: $(library) - -$(library): $(OBJS) - rm -f $(library) - $(AR) $(library) $(OBJS) - $(RANLIB) $(library) - -# followed by boilerplate.mk diff --git a/src/vnc/common/rdr/MemInStream.h b/src/vnc/common/rdr/MemInStream.h deleted file mode 100644 index 77ca3f3a..00000000 --- a/src/vnc/common/rdr/MemInStream.h +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// rdr::MemInStream is an InStream which streams from a given memory buffer. -// If the deleteWhenDone parameter is true then the buffer will be delete[]d in -// the destructor. Note that it is delete[]d as a U8* - strictly speaking this -// means it ought to be new[]ed as a U8* as well, but on most platforms this -// doesn't matter. -// - -#ifndef __RDR_MEMINSTREAM_H__ -#define __RDR_MEMINSTREAM_H__ - -#include -#include - -namespace rdr { - - class MemInStream : public InStream { - - public: - - MemInStream(const void* data, int len, bool deleteWhenDone_=false) - : start((const U8*)data), deleteWhenDone(deleteWhenDone_) - { - ptr = start; - end = start + len; - } - - virtual ~MemInStream() { - if (deleteWhenDone) - delete [] (U8*)start; - } - - int pos() { return ptr - start; } - void reposition(int pos) { ptr = start + pos; } - - private: - - int overrun(int itemSize, int nItems, bool wait) { throw EndOfStream(); } - const U8* start; - bool deleteWhenDone; - }; - -} - -#endif diff --git a/src/vnc/common/rdr/MemOutStream.h b/src/vnc/common/rdr/MemOutStream.h deleted file mode 100644 index ee3e9500..00000000 --- a/src/vnc/common/rdr/MemOutStream.h +++ /dev/null @@ -1,83 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// A MemOutStream grows as needed when data is written to it. -// - -#ifndef __RDR_MEMOUTSTREAM_H__ -#define __RDR_MEMOUTSTREAM_H__ - -#include - -namespace rdr { - - class MemOutStream : public OutStream { - - public: - - MemOutStream(int len=1024) { - start = ptr = new U8[len]; - end = start + len; - } - - virtual ~MemOutStream() { - delete [] start; - } - - void writeBytes(const void* data, int length) { - check(length); - memcpy(ptr, data, length); - ptr += length; - } - - int length() { return ptr - start; } - void clear() { ptr = start; }; - void clearAndZero() { memset(start, 0, ptr-start); clear(); } - void reposition(int pos) { ptr = start + pos; } - - // data() returns a pointer to the buffer. - - const void* data() { return (const void*)start; } - - private: - - // overrun() either doubles the buffer or adds enough space for nItems of - // size itemSize bytes. - - int overrun(int itemSize, int nItems) { - int len = ptr - start + itemSize * nItems; - if (len < (end - start) * 2) - len = (end - start) * 2; - - U8* newStart = new U8[len]; - memcpy(newStart, start, ptr - start); - ptr = newStart + (ptr - start); - delete [] start; - start = newStart; - end = newStart + len; - - return nItems; - } - - U8* start; - }; - -} - -#endif diff --git a/src/vnc/common/rdr/OutStream.h b/src/vnc/common/rdr/OutStream.h deleted file mode 100644 index 35c699dc..00000000 --- a/src/vnc/common/rdr/OutStream.h +++ /dev/null @@ -1,152 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// rdr::OutStream marshalls data into a buffer stored in RDR (RFB Data -// Representation). -// - -#ifndef __RDR_OUTSTREAM_H__ -#define __RDR_OUTSTREAM_H__ - -#include -#include // for memcpy - -namespace rdr { - - class OutStream { - - protected: - - OutStream() {} - - public: - - virtual ~OutStream() {} - - // check() ensures there is buffer space for at least one item of size - // itemSize bytes. Returns the number of items which fit (up to a maximum - // of nItems). - - inline int check(int itemSize, int nItems=1) - { - if (ptr + itemSize * nItems > end) { - if (ptr + itemSize > end) - return overrun(itemSize, nItems); - - nItems = (end - ptr) / itemSize; - } - return nItems; - } - - // writeU/SN() methods write unsigned and signed N-bit integers. - - inline void writeU8( U8 u) { check(1); *ptr++ = u; } - inline void writeU16(U16 u) { check(2); *ptr++ = u >> 8; *ptr++ = (U8)u; } - inline void writeU32(U32 u) { check(4); *ptr++ = u >> 24; *ptr++ = u >> 16; - *ptr++ = u >> 8; *ptr++ = u; } - - inline void writeS8( S8 s) { writeU8((U8)s); } - inline void writeS16(S16 s) { writeU16((U16)s); } - inline void writeS32(S32 s) { writeU32((U32)s); } - - // writeString() writes a string - a U32 length followed by the data. The - // given string should be null-terminated (but the terminating null is not - // written to the stream). - - inline void writeString(const char* str) { - U32 len = strlen(str); - writeU32(len); - writeBytes(str, len); - } - - inline void pad(int bytes) { - while (bytes-- > 0) writeU8(0); - } - - inline void skip(int bytes) { - while (bytes > 0) { - int n = check(1, bytes); - ptr += n; - bytes -= n; - } - } - - // writeBytes() writes an exact number of bytes. - - virtual void writeBytes(const void* data, int length) { - const U8* dataPtr = (const U8*)data; - const U8* dataEnd = dataPtr + length; - while (dataPtr < dataEnd) { - int n = check(1, dataEnd - dataPtr); - memcpy(ptr, dataPtr, n); - ptr += n; - dataPtr += n; - } - } - - // writeOpaqueN() writes a quantity without byte-swapping. - - inline void writeOpaque8( U8 u) { writeU8(u); } - inline void writeOpaque16(U16 u) { check(2); *ptr++ = ((U8*)&u)[0]; - *ptr++ = ((U8*)&u)[1]; } - inline void writeOpaque32(U32 u) { check(4); *ptr++ = ((U8*)&u)[0]; - *ptr++ = ((U8*)&u)[1]; - *ptr++ = ((U8*)&u)[2]; - *ptr++ = ((U8*)&u)[3]; } - inline void writeOpaque24A(U32 u) { check(3); *ptr++ = ((U8*)&u)[0]; - *ptr++ = ((U8*)&u)[1]; - *ptr++ = ((U8*)&u)[2]; } - inline void writeOpaque24B(U32 u) { check(3); *ptr++ = ((U8*)&u)[1]; - *ptr++ = ((U8*)&u)[2]; - *ptr++ = ((U8*)&u)[3]; } - - // length() returns the length of the stream. - - virtual int length() = 0; - - // flush() requests that the stream be flushed. - - virtual void flush() {} - - // getptr(), getend() and setptr() are "dirty" methods which allow you to - // manipulate the buffer directly. This is useful for a stream which is a - // wrapper around an underlying stream. - - inline U8* getptr() { return ptr; } - inline U8* getend() { return end; } - inline void setptr(U8* p) { ptr = p; } - - private: - - // overrun() is implemented by a derived class to cope with buffer overrun. - // It ensures there are at least itemSize bytes of buffer space. Returns - // the number of items which fit (up to a maximum of nItems). itemSize is - // supposed to be "small" (a few bytes). - - virtual int overrun(int itemSize, int nItems) = 0; - - protected: - - U8* ptr; - U8* end; - }; - -} - -#endif diff --git a/src/vnc/common/rdr/RandomStream.cxx b/src/vnc/common/rdr/RandomStream.cxx deleted file mode 100644 index 7056c2cc..00000000 --- a/src/vnc/common/rdr/RandomStream.cxx +++ /dev/null @@ -1,130 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include -#include -#include -#include -#ifndef WIN32 -#include -#include -#else -#define getpid() GetCurrentProcessId() -#ifndef RFB_HAVE_WINCRYPT -#pragma message(" NOTE: Not building WinCrypt-based RandomStream") -#endif -#endif - -using namespace rdr; - -const int DEFAULT_BUF_LEN = 256; - -unsigned int RandomStream::seed; - -RandomStream::RandomStream() - : offset(0) -{ - ptr = end = start = new U8[DEFAULT_BUF_LEN]; - -#ifdef RFB_HAVE_WINCRYPT - provider = 0; - if (!CryptAcquireContext(&provider, 0, 0, PROV_RSA_FULL, 0)) { - if (GetLastError() == NTE_BAD_KEYSET) { - if (!CryptAcquireContext(&provider, 0, 0, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { - fprintf(stderr, "RandomStream: unable to create keyset\n"); - provider = 0; - } - } else { - fprintf(stderr, "RandomStream: unable to acquire context\n"); - provider = 0; - } - } - if (!provider) { -#else -#ifndef WIN32 - fp = fopen("/dev/urandom", "r"); - if (!fp) - fp = fopen("/dev/random", "r"); - if (!fp) { -#else - { -#endif -#endif - fprintf(stderr,"RandomStream: warning: no OS supplied random source - using rand()\n"); - seed += (unsigned int) time(0) + getpid() + getpid() * 987654 + rand(); - srand(seed); - } -} - -RandomStream::~RandomStream() { - delete [] start; - -#ifdef RFB_HAVE_WINCRYPT - if (provider) - CryptReleaseContext(provider, 0); -#endif -#ifndef WIN32 - if (fp) fclose(fp); -#endif -} - -int RandomStream::pos() { - return offset + ptr - start; -} - -int RandomStream::overrun(int itemSize, int nItems, bool wait) { - if (itemSize > DEFAULT_BUF_LEN) - throw Exception("RandomStream overrun: max itemSize exceeded"); - - if (end - ptr != 0) - memmove(start, ptr, end - ptr); - - end -= ptr - start; - offset += ptr - start; - ptr = start; - - int length = start + DEFAULT_BUF_LEN - end; - -#ifdef RFB_HAVE_WINCRYPT - if (provider) { - if (!CryptGenRandom(provider, length, (U8*)end)) - throw rdr::SystemException("unable to CryptGenRandom", GetLastError()); - end += length; - } else { -#else -#ifndef WIN32 - if (fp) { - int n = fread((U8*)end, length, 1, fp); - if (n != 1) - throw rdr::SystemException("reading /dev/urandom or /dev/random failed", - errno); - end += length; - } else { -#else - { -#endif -#endif - for (int i=0; i end - ptr) - nItems = (end - ptr) / itemSize; - - return nItems; -} diff --git a/src/vnc/common/rdr/RandomStream.h b/src/vnc/common/rdr/RandomStream.h deleted file mode 100644 index c33360d7..00000000 --- a/src/vnc/common/rdr/RandomStream.h +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#ifndef __RDR_RANDOMSTREAM_H__ -#define __RDR_RANDOMSTREAM_H__ - -#include -#include - -#ifdef WIN32 -#include -#include -#ifdef WINCRYPT32API -#define RFB_HAVE_WINCRYPT -#endif -#endif - -namespace rdr { - - class RandomStream : public InStream { - - public: - - RandomStream(); - virtual ~RandomStream(); - - int pos(); - - protected: - int overrun(int itemSize, int nItems, bool wait); - - private: - U8* start; - int offset; - - static unsigned int seed; -#ifdef RFB_HAVE_WINCRYPT - HCRYPTPROV provider; -#endif -#ifndef WIN32 - FILE* fp; -#endif - - }; - -} // end of namespace rdr - -#endif diff --git a/src/vnc/common/rdr/SubstitutingInStream.h b/src/vnc/common/rdr/SubstitutingInStream.h deleted file mode 100644 index 325b01c5..00000000 --- a/src/vnc/common/rdr/SubstitutingInStream.h +++ /dev/null @@ -1,102 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#ifndef __RDR_SUBSTITUTINGINSTREAM_H__ -#define __RDR_SUBSTITUTINGINSTREAM_H__ - -#include -#include - -namespace rdr { - - class Substitutor { - public: - virtual char* substitute(const char* varName) = 0; - }; - - class SubstitutingInStream : public InStream { - public: - SubstitutingInStream(InStream* underlying_, Substitutor* s, - int maxVarNameLen_) - : underlying(underlying_), dollar(0), substitutor(s), subst(0), - maxVarNameLen(maxVarNameLen_) - { - ptr = end = underlying->getptr(); - varName = new char[maxVarNameLen+1]; - } - ~SubstitutingInStream() { - delete underlying; - delete [] varName; - delete [] subst; - } - - int pos() { return underlying->pos(); } - - virtual int overrun(int itemSize, int nItems, bool wait=true) { - if (itemSize != 1) - throw new rdr::Exception("SubstitutingInStream: itemSize must be 1"); - - if (subst) { - delete [] subst; - subst = 0; - } else { - underlying->setptr(ptr); - } - - underlying->check(1); - ptr = underlying->getptr(); - end = underlying->getend(); - dollar = (const U8*)memchr(ptr, '$', end-ptr); - if (dollar) { - if (dollar == ptr) { - try { - int i = 0; - while (i < maxVarNameLen) { - varName[i++] = underlying->readS8(); - varName[i] = 0; - subst = substitutor->substitute(varName); - if (subst) { - ptr = (U8*)subst; - end = (U8*)subst + strlen(subst); - break; - } - } - } catch (EndOfStream&) { - } - - if (!subst) - dollar = (const U8*)memchr(ptr+1, '$', end-ptr-1); - } - if (!subst && dollar) end = dollar; - } - - if (itemSize * nItems > end - ptr) - nItems = (end - ptr) / itemSize; - - return nItems; - } - - InStream* underlying; - const U8* dollar; - Substitutor* substitutor; - char* varName; - char* subst; - int maxVarNameLen; - }; -} -#endif diff --git a/src/vnc/common/rdr/ZlibInStream.cxx b/src/vnc/common/rdr/ZlibInStream.cxx deleted file mode 100644 index 6f3a7d02..00000000 --- a/src/vnc/common/rdr/ZlibInStream.cxx +++ /dev/null @@ -1,125 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include -#include -#include - -using namespace rdr; - -enum { DEFAULT_BUF_SIZE = 16384 }; - -ZlibInStream::ZlibInStream(int bufSize_) - : underlying(0), bufSize(bufSize_ ? bufSize_ : DEFAULT_BUF_SIZE), offset(0), - bytesIn(0) -{ - zs = new z_stream; - zs->zalloc = Z_NULL; - zs->zfree = Z_NULL; - zs->opaque = Z_NULL; - zs->next_in = Z_NULL; - zs->avail_in = 0; - if (inflateInit(zs) != Z_OK) { - delete zs; - throw Exception("ZlibInStream: inflateInit failed"); - } - ptr = end = start = new U8[bufSize]; -} - -ZlibInStream::~ZlibInStream() -{ - delete [] start; - inflateEnd(zs); - delete zs; -} - -void ZlibInStream::setUnderlying(InStream* is, int bytesIn_) -{ - underlying = is; - bytesIn = bytesIn_; - ptr = end = start; -} - -int ZlibInStream::pos() -{ - return offset + ptr - start; -} - -void ZlibInStream::reset() -{ - ptr = end = start; - if (!underlying) return; - - while (bytesIn > 0) { - decompress(true); - end = start; // throw away any data - } - underlying = 0; -} - -int ZlibInStream::overrun(int itemSize, int nItems, bool wait) -{ - if (itemSize > bufSize) - throw Exception("ZlibInStream overrun: max itemSize exceeded"); - if (!underlying) - throw Exception("ZlibInStream overrun: no underlying stream"); - - if (end - ptr != 0) - memmove(start, ptr, end - ptr); - - offset += ptr - start; - end -= ptr - start; - ptr = start; - - while (end - ptr < itemSize) { - if (!decompress(wait)) - return 0; - } - - if (itemSize * nItems > end - ptr) - nItems = (end - ptr) / itemSize; - - return nItems; -} - -// decompress() calls the decompressor once. Note that this won't necessarily -// generate any output data - it may just consume some input data. Returns -// false if wait is false and we would block on the underlying stream. - -bool ZlibInStream::decompress(bool wait) -{ - zs->next_out = (U8*)end; - zs->avail_out = start + bufSize - end; - - int n = underlying->check(1, 1, wait); - if (n == 0) return false; - zs->next_in = (U8*)underlying->getptr(); - zs->avail_in = underlying->getend() - underlying->getptr(); - if ((int)zs->avail_in > bytesIn) - zs->avail_in = bytesIn; - - int rc = inflate(zs, Z_SYNC_FLUSH); - if (rc != Z_OK) { - throw Exception("ZlibInStream: inflate failed"); - } - - bytesIn -= zs->next_in - underlying->getptr(); - end = zs->next_out; - underlying->setptr(zs->next_in); - return true; -} diff --git a/src/vnc/common/rdr/ZlibInStream.h b/src/vnc/common/rdr/ZlibInStream.h deleted file mode 100644 index c26b6d63..00000000 --- a/src/vnc/common/rdr/ZlibInStream.h +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// ZlibInStream streams from a compressed data stream ("underlying"), -// decompressing with zlib on the fly. -// - -#ifndef __RDR_ZLIBINSTREAM_H__ -#define __RDR_ZLIBINSTREAM_H__ - -#include - -struct z_stream_s; - -namespace rdr { - - class ZlibInStream : public InStream { - - public: - - ZlibInStream(int bufSize=0); - virtual ~ZlibInStream(); - - void setUnderlying(InStream* is, int bytesIn); - void reset(); - int pos(); - - private: - - int overrun(int itemSize, int nItems, bool wait); - bool decompress(bool wait); - - InStream* underlying; - int bufSize; - int offset; - z_stream_s* zs; - int bytesIn; - U8* start; - }; - -} // end of namespace rdr - -#endif diff --git a/src/vnc/common/rdr/ZlibOutStream.cxx b/src/vnc/common/rdr/ZlibOutStream.cxx deleted file mode 100644 index 181e3567..00000000 --- a/src/vnc/common/rdr/ZlibOutStream.cxx +++ /dev/null @@ -1,140 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include -#include -#include - -using namespace rdr; - -enum { DEFAULT_BUF_SIZE = 16384 }; - -ZlibOutStream::ZlibOutStream(OutStream* os, int bufSize_, int compressLevel) - : underlying(os), bufSize(bufSize_ ? bufSize_ : DEFAULT_BUF_SIZE), offset(0) -{ - zs = new z_stream; - zs->zalloc = Z_NULL; - zs->zfree = Z_NULL; - zs->opaque = Z_NULL; - if (deflateInit(zs, compressLevel) != Z_OK) { - delete zs; - throw Exception("ZlibOutStream: deflateInit failed"); - } - ptr = start = new U8[bufSize]; - end = start + bufSize; -} - -ZlibOutStream::~ZlibOutStream() -{ - try { - flush(); - } catch (Exception&) { - } - delete [] start; - deflateEnd(zs); - delete zs; -} - -void ZlibOutStream::setUnderlying(OutStream* os) -{ - underlying = os; -} - -int ZlibOutStream::length() -{ - return offset + ptr - start; -} - -void ZlibOutStream::flush() -{ - zs->next_in = start; - zs->avail_in = ptr - start; - -// fprintf(stderr,"zos flush: avail_in %d\n",zs->avail_in); - - while (zs->avail_in != 0) { - - do { - underlying->check(1); - zs->next_out = underlying->getptr(); - zs->avail_out = underlying->getend() - underlying->getptr(); - -// fprintf(stderr,"zos flush: calling deflate, avail_in %d, avail_out %d\n", -// zs->avail_in,zs->avail_out); - int rc = deflate(zs, Z_SYNC_FLUSH); - if (rc != Z_OK) throw Exception("ZlibOutStream: deflate failed"); - -// fprintf(stderr,"zos flush: after deflate: %d bytes\n", -// zs->next_out-underlying->getptr()); - - underlying->setptr(zs->next_out); - } while (zs->avail_out == 0); - } - - offset += ptr - start; - ptr = start; -} - -int ZlibOutStream::overrun(int itemSize, int nItems) -{ -// fprintf(stderr,"ZlibOutStream overrun\n"); - - if (itemSize > bufSize) - throw Exception("ZlibOutStream overrun: max itemSize exceeded"); - - while (end - ptr < itemSize) { - zs->next_in = start; - zs->avail_in = ptr - start; - - do { - underlying->check(1); - zs->next_out = underlying->getptr(); - zs->avail_out = underlying->getend() - underlying->getptr(); - -// fprintf(stderr,"zos overrun: calling deflate, avail_in %d, avail_out %d\n", -// zs->avail_in,zs->avail_out); - - int rc = deflate(zs, 0); - if (rc != Z_OK) throw Exception("ZlibOutStream: deflate failed"); - -// fprintf(stderr,"zos overrun: after deflate: %d bytes\n", -// zs->next_out-underlying->getptr()); - - underlying->setptr(zs->next_out); - } while (zs->avail_out == 0); - - // output buffer not full - - if (zs->avail_in == 0) { - offset += ptr - start; - ptr = start; - } else { - // but didn't consume all the data? try shifting what's left to the - // start of the buffer. - fprintf(stderr,"z out buf not full, but in data not consumed\n"); - memmove(start, zs->next_in, ptr - zs->next_in); - offset += zs->next_in - start; - ptr -= zs->next_in - start; - } - } - - if (itemSize * nItems > end - ptr) - nItems = (end - ptr) / itemSize; - - return nItems; -} diff --git a/src/vnc/common/rdr/ZlibOutStream.h b/src/vnc/common/rdr/ZlibOutStream.h deleted file mode 100644 index 7d737c14..00000000 --- a/src/vnc/common/rdr/ZlibOutStream.h +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// ZlibOutStream streams to a compressed data stream (underlying), compressing -// with zlib on the fly. -// - -#ifndef __RDR_ZLIBOUTSTREAM_H__ -#define __RDR_ZLIBOUTSTREAM_H__ - -#include - -struct z_stream_s; - -namespace rdr { - - class ZlibOutStream : public OutStream { - - public: - - ZlibOutStream(OutStream* os=0, int bufSize=0, int compressionLevel=-1); - virtual ~ZlibOutStream(); - - void setUnderlying(OutStream* os); - void flush(); - int length(); - - private: - - int overrun(int itemSize, int nItems); - - OutStream* underlying; - int bufSize; - int offset; - z_stream_s* zs; - U8* start; - }; - -} // end of namespace rdr - -#endif diff --git a/src/vnc/common/rdr/types.h b/src/vnc/common/rdr/types.h deleted file mode 100644 index 6421b137..00000000 --- a/src/vnc/common/rdr/types.h +++ /dev/null @@ -1,66 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#ifndef __RDR_TYPES_H__ -#define __RDR_TYPES_H__ - -namespace rdr { - - typedef unsigned char U8; - typedef unsigned short U16; - typedef unsigned int U32; - typedef signed char S8; - typedef signed short S16; - typedef signed int S32; - - class U8Array { - public: - U8Array() : buf(0) {} - U8Array(U8* a) : buf(a) {} // note: assumes ownership - U8Array(int len) : buf(new U8[len]) {} - ~U8Array() { delete [] buf; } - - // Get the buffer pointer & clear it (i.e. caller takes ownership) - U8* takeBuf() { U8* tmp = buf; buf = 0; return tmp; } - - U8* buf; - }; - - class U16Array { - public: - U16Array() : buf(0) {} - U16Array(U16* a) : buf(a) {} // note: assumes ownership - U16Array(int len) : buf(new U16[len]) {} - ~U16Array() { delete [] buf; } - U16* takeBuf() { U16* tmp = buf; buf = 0; return tmp; } - U16* buf; - }; - - class U32Array { - public: - U32Array() : buf(0) {} - U32Array(U32* a) : buf(a) {} // note: assumes ownership - U32Array(int len) : buf(new U32[len]) {} - ~U32Array() { delete [] buf; } - U32* takeBuf() { U32* tmp = buf; buf = 0; return tmp; } - U32* buf; - }; - -} // end of namespace rdr - -#endif diff --git a/src/vnc/common/rfb/Blacklist.cxx b/src/vnc/common/rfb/Blacklist.cxx deleted file mode 100644 index 4590befe..00000000 --- a/src/vnc/common/rfb/Blacklist.cxx +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -#include -#include - -using namespace rfb; - -IntParameter Blacklist::threshold("BlacklistThreshold", - "The number of unauthenticated connection attempts allowed from any " - "individual host before that host is black-listed", - 5); -IntParameter Blacklist::initialTimeout("BlacklistTimeout", - "The initial timeout applied when a host is first black-listed. " - "The host cannot re-attempt a connection until the timeout expires.", - 10); - - -Blacklist::Blacklist() { -} - -Blacklist::~Blacklist() { - // Free the map keys - BlacklistMap::iterator i; - for (i=blm.begin(); i!=blm.end(); i++) { - strFree((char*)(*i).first); - } -} - -bool Blacklist::isBlackmarked(const char* name) { - BlacklistMap::iterator i = blm.find(name); - if (i == blm.end()) { - // Entry is not already black-marked. - // Create the entry unmarked, unblocked, - // with suitable defaults set. - BlacklistInfo bi; - bi.marks = 1; - bi.blockUntil = 0; - bi.blockTimeout = initialTimeout; - blm[strDup(name)] = bi; - i = blm.find(name); - } - - // Entry exists - has it reached the threshold yet? - if ((*i).second.marks >= threshold) { - // Yes - entry is blocked - has the timeout expired? - time_t now = time(0); - if (now >= (*i).second.blockUntil) { - // Timeout has expired. Reset timeout and allow - // a re-try. - (*i).second.blockUntil = now + (*i).second.blockTimeout; - (*i).second.blockTimeout = (*i).second.blockTimeout * 2; - return false; - } - // Blocked and timeout still in effect - reject! - return true; - } - - // We haven't reached the threshold yet. - // Increment the black-mark counter but allow - // the entry to pass. - (*i).second.marks++; - return false; -} - -void Blacklist::clearBlackmark(const char* name) { - BlacklistMap::iterator i = blm.find(name); - if (i != blm.end()) { - strFree((char*)(*i).first); - blm.erase(i); - } -} diff --git a/src/vnc/common/rfb/Blacklist.h b/src/vnc/common/rfb/Blacklist.h deleted file mode 100644 index 0eb38460..00000000 --- a/src/vnc/common/rfb/Blacklist.h +++ /dev/null @@ -1,91 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -// Blacklist.h - Handling of black-listed entities. -// Just keeps a table mapping strings to timing information, including -// how many times the entry has been black-listed and when to next -// put it on probation (e.g. allow a connection in from the host, and -// re-blacklist it if that fails). -// - -#ifndef __RFB_BLACKLIST_H__ -#define __RFB_BLACKLIST_H__ - -#include -#include -#include - -#include -#include - -namespace rfb { - - // - // -=- Blacklist handler - // - // Parameters include a threshold after which to blacklist the named - // host, and a timeout after which to re-consider them. - // - // Threshold means that isBlackmarked can be called that number of times - // before it will return true. - // - // Timeout means that after that many seconds, the next call to isBlackmarked - // will return false. At the same time, the timeout is doubled, so that the - // next calls will fail, until the timeout expires again or clearBlackmark is - // called. - // - // When clearBlackMark is called, the corresponding entry is completely - // removed, causing the next isBlackmarked call to return false. - - // KNOWN BUG: Client can keep making rejected requests, thus increasing - // their timeout. If client does this for 30 years, timeout may wrap round - // to a very small value again. - - // THIS CLASS IS NOT THREAD-SAFE! - - class Blacklist { - public: - Blacklist(); - ~Blacklist(); - - bool isBlackmarked(const char* name); - void clearBlackmark(const char* name); - - static IntParameter threshold; - static IntParameter initialTimeout; - - protected: - struct ltStr { - bool operator()(const char* s1, const char* s2) const { - return strcmp(s1, s2) < 0; - }; - }; - struct BlacklistInfo { - int marks; - time_t blockUntil; - unsigned int blockTimeout; - }; - typedef std::map BlacklistMap; - BlacklistMap blm; - }; - -} - -#endif - diff --git a/src/vnc/common/rfb/CConnection.cxx b/src/vnc/common/rfb/CConnection.cxx deleted file mode 100644 index 36778f02..00000000 --- a/src/vnc/common/rfb/CConnection.cxx +++ /dev/null @@ -1,276 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -using namespace rfb; - -static LogWriter vlog("CConnection"); - -CConnection::CConnection() - : is(0), os(0), reader_(0), writer_(0), - shared(false), security(0), nSecTypes(0), clientSecTypeOrder(false), - state_(RFBSTATE_UNINITIALISED), useProtocol3_3(false) -{ -} - -CConnection::~CConnection() -{ - if (security) security->destroy(); - deleteReaderAndWriter(); -} - -void CConnection::deleteReaderAndWriter() -{ - delete reader_; - reader_ = 0; - delete writer_; - writer_ = 0; -} - -void CConnection::setStreams(rdr::InStream* is_, rdr::OutStream* os_) -{ - is = is_; - os = os_; -} - -void CConnection::addSecType(rdr::U8 secType) -{ - if (nSecTypes == maxSecTypes) - throw Exception("too many security types"); - secTypes[nSecTypes++] = secType; -} - -void CConnection::setClientSecTypeOrder(bool clientOrder) { - clientSecTypeOrder = clientOrder; -} - -void CConnection::initialiseProtocol() -{ - state_ = RFBSTATE_PROTOCOL_VERSION; -} - -void CConnection::processMsg() -{ - switch (state_) { - - case RFBSTATE_PROTOCOL_VERSION: processVersionMsg(); break; - case RFBSTATE_SECURITY_TYPES: processSecurityTypesMsg(); break; - case RFBSTATE_SECURITY: processSecurityMsg(); break; - case RFBSTATE_SECURITY_RESULT: processSecurityResultMsg(); break; - case RFBSTATE_INITIALISATION: processInitMsg(); break; - case RFBSTATE_NORMAL: reader_->readMsg(); break; - case RFBSTATE_UNINITIALISED: - throw Exception("CConnection::processMsg: not initialised yet?"); - default: - throw Exception("CConnection::processMsg: invalid state"); - } -} - -void CConnection::processVersionMsg() -{ - vlog.debug("reading protocol version"); - bool done; - if (!cp.readVersion(is, &done)) { - state_ = RFBSTATE_INVALID; - throw Exception("reading version failed: not an RFB server?"); - } - if (!done) return; - - vlog.info("Server supports RFB protocol version %d.%d", - cp.majorVersion, cp.minorVersion); - - // The only official RFB protocol versions are currently 3.3, 3.7 and 3.8 - if (cp.beforeVersion(3,3)) { - char msg[256]; - sprintf(msg,"Server gave unsupported RFB protocol version %d.%d", - cp.majorVersion, cp.minorVersion); - vlog.error(msg); - state_ = RFBSTATE_INVALID; - throw Exception(msg); - } else if (useProtocol3_3 || cp.beforeVersion(3,7)) { - cp.setVersion(3,3); - } else if (cp.afterVersion(3,8)) { - cp.setVersion(3,8); - } - - cp.writeVersion(os); - state_ = RFBSTATE_SECURITY_TYPES; - - vlog.info("Using RFB protocol version %d.%d", - cp.majorVersion, cp.minorVersion); -} - - -void CConnection::processSecurityTypesMsg() -{ - vlog.debug("processing security types message"); - - int secType = secTypeInvalid; - - if (cp.isVersion(3,3)) { - - // legacy 3.3 server may only offer "vnc authentication" or "none" - - secType = is->readU32(); - if (secType == secTypeInvalid) { - throwConnFailedException(); - - } else if (secType == secTypeNone || secType == secTypeVncAuth) { - int j; - for (j = 0; j < nSecTypes; j++) - if (secTypes[j] == secType) break; - if (j == nSecTypes) - secType = secTypeInvalid; - } else { - vlog.error("Unknown 3.3 security type %d", secType); - throw Exception("Unknown 3.3 security type"); - } - - } else { - - // >=3.7 server will offer us a list - - int nServerSecTypes = is->readU8(); - if (nServerSecTypes == 0) - throwConnFailedException(); - - int secTypePos = nSecTypes; - for (int i = 0; i < nServerSecTypes; i++) { - rdr::U8 serverSecType = is->readU8(); - vlog.debug("Server offers security type %s(%d)", - secTypeName(serverSecType),serverSecType); - - // If we haven't already chosen a secType, try this one - // If we are using the client's preference for types, - // we keep trying types, to find the one that matches and - // which appears first in the client's list of supported types. - if (secType == secTypeInvalid || clientSecTypeOrder) { - for (int j = 0; j < nSecTypes; j++) { - if (secTypes[j] == serverSecType && j < secTypePos) { - secType = secTypes[j]; - secTypePos = j; - break; - } - } - // NB: Continue reading the remaining server secTypes, but ignore them - } - } - - // Inform the server of our decision - if (secType != secTypeInvalid) { - os->writeU8(secType); - os->flush(); - vlog.debug("Choosing security type %s(%d)",secTypeName(secType),secType); - } - } - - if (secType == secTypeInvalid) { - state_ = RFBSTATE_INVALID; - vlog.error("No matching security types"); - throw Exception("No matching security types"); - } - - state_ = RFBSTATE_SECURITY; - security = getCSecurity(secType); - processSecurityMsg(); -} - -void CConnection::processSecurityMsg() -{ - vlog.debug("processing security message"); - if (security->processMsg(this)) { - state_ = RFBSTATE_SECURITY_RESULT; - processSecurityResultMsg(); - } -} - -void CConnection::processSecurityResultMsg() -{ - vlog.debug("processing security result message"); - int result; - if (cp.beforeVersion(3,8) && security->getType() == secTypeNone) { - result = secResultOK; - } else { - if (!is->checkNoWait(1)) return; - result = is->readU32(); - } - switch (result) { - case secResultOK: - securityCompleted(); - return; - case secResultFailed: - vlog.debug("auth failed"); - break; - case secResultTooMany: - vlog.debug("auth failed - too many tries"); - break; - default: - throw Exception("Unknown security result from server"); - } - CharArray reason; - if (cp.beforeVersion(3,8)) - reason.buf = strDup("Authentication failure"); - else - reason.buf = is->readString(); - state_ = RFBSTATE_INVALID; - throw AuthFailureException(reason.buf); -} - -void CConnection::processInitMsg() -{ - vlog.debug("reading server initialisation"); - reader_->readServerInit(); -} - -void CConnection::throwConnFailedException() -{ - state_ = RFBSTATE_INVALID; - CharArray reason; - reason.buf = is->readString(); - throw ConnFailedException(reason.buf); -} - -void CConnection::securityCompleted() -{ - state_ = RFBSTATE_INITIALISATION; - reader_ = new CMsgReaderV3(this, is); - writer_ = new CMsgWriterV3(&cp, os); - vlog.debug("Authentication success!"); - authSuccess(); - writer_->writeClientInit(shared); -} - -void CConnection::authSuccess() -{ -} - -void CConnection::serverInit() -{ - state_ = RFBSTATE_NORMAL; - vlog.debug("initialisation done"); -} diff --git a/src/vnc/common/rfb/CConnection.h b/src/vnc/common/rfb/CConnection.h deleted file mode 100644 index 79110eb9..00000000 --- a/src/vnc/common/rfb/CConnection.h +++ /dev/null @@ -1,183 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -// -// CConnection - class on the client side representing a connection to a -// server. A derived class should override methods appropriately. -// - -#ifndef __RFB_CCONNECTION_H__ -#define __RFB_CCONNECTION_H__ - -#include -#include -#include -#include - -namespace rfb { - - class CMsgReader; - class CMsgWriter; - class CSecurity; - class IdentityVerifier; - - class CConnection : public CMsgHandler { - public: - - CConnection(); - virtual ~CConnection(); - - // Methods to initialise the connection - - // setServerName() is used to provide a unique(ish) name for the server to - // which we are connected. This might be the result of getPeerEndpoint on - // a TcpSocket, for example, or a host specified by DNS name & port. - // The serverName is used when verifying the Identity of a host (see RA2). - void setServerName(const char* name_) { serverName.replaceBuf(strDup(name_)); } - - // setStreams() sets the streams to be used for the connection. These must - // be set before initialiseProtocol() and processMsg() are called. The - // CSecurity object may call setStreams() again to provide alternative - // streams over which the RFB protocol is sent (i.e. encrypting/decrypting - // streams). Ownership of the streams remains with the caller - // (i.e. SConnection will not delete them). - void setStreams(rdr::InStream* is, rdr::OutStream* os); - - // addSecType() should be called once for each security type which the - // client supports. The order in which they're added is such that the - // first one is most preferred. - void addSecType(rdr::U8 secType); - - // setClientSecTypeOrder() determines whether the client should obey - // the server's security type preference, by picking the first server security - // type that the client supports, or whether it should pick the first type - // that the server supports, from the client-supported list of types. - void setClientSecTypeOrder(bool clientOrder); - - // setShared sets the value of the shared flag which will be sent to the - // server upon initialisation. - void setShared(bool s) { shared = s; } - - // setProtocol3_3 configures whether or not the CConnection should - // only ever support protocol version 3.3 - void setProtocol3_3(bool s) {useProtocol3_3 = s;} - - // initialiseProtocol() should be called once the streams and security - // types are set. Subsequently, processMsg() should be called whenever - // there is data to read on the InStream. - void initialiseProtocol(); - - // processMsg() should be called whenever there is either: - // - data available on the underlying network stream - // In this case, processMsg may return without processing an RFB message, - // if the available data does not result in an RFB message being ready - // to handle. e.g. if data is encrypted. - // NB: This makes it safe to call processMsg() in response to select() - // - data available on the CConnection's current InStream - // In this case, processMsg should always process the available RFB - // message before returning. - // NB: In either case, you must have called initialiseProtocol() first. - void processMsg(); - - - // Methods to be overridden in a derived class - - // getCSecurity() gets the CSecurity object for the given type. The type - // is guaranteed to be one of the secTypes passed in to addSecType(). The - // CSecurity object's destroy() method will be called by the CConnection - // from its destructor. - virtual CSecurity* getCSecurity(int secType)=0; - - // getCurrentCSecurity() gets the CSecurity instance used for this connection. - const CSecurity* getCurrentCSecurity() const {return security;} - - // getIdVerifier() returns the identity verifier associated with the connection. - // Ownership of the IdentityVerifier is retained by the CConnection instance. - virtual IdentityVerifier* getIdentityVerifier() {return 0;} - - // authSuccess() is called when authentication has succeeded. - virtual void authSuccess(); - - // serverInit() is called when the ServerInit message is received. The - // derived class must call on to CConnection::serverInit(). - virtual void serverInit(); - - - // Other methods - - // deleteReaderAndWriter() deletes the reader and writer associated with - // this connection. This may be useful if you want to delete the streams - // before deleting the SConnection to make sure that no attempt by the - // SConnection is made to read or write. - // XXX Do we really need this at all??? - void deleteReaderAndWriter(); - - CMsgReader* reader() { return reader_; } - CMsgWriter* writer() { return writer_; } - - rdr::InStream* getInStream() { return is; } - rdr::OutStream* getOutStream() { return os; } - - // Access method used by SSecurity implementations that can verify servers' - // Identities, to determine the unique(ish) name of the server. - const char* getServerName() const { return serverName.buf; } - - enum stateEnum { - RFBSTATE_UNINITIALISED, - RFBSTATE_PROTOCOL_VERSION, - RFBSTATE_SECURITY_TYPES, - RFBSTATE_SECURITY, - RFBSTATE_SECURITY_RESULT, - RFBSTATE_INITIALISATION, - RFBSTATE_NORMAL, - RFBSTATE_INVALID - }; - - stateEnum state() { return state_; } - - protected: - void setState(stateEnum s) { state_ = s; } - - private: - void processVersionMsg(); - void processSecurityTypesMsg(); - void processSecurityMsg(); - void processSecurityResultMsg(); - void processInitMsg(); - void throwAuthFailureException(); - void throwConnFailedException(); - void securityCompleted(); - - rdr::InStream* is; - rdr::OutStream* os; - CMsgReader* reader_; - CMsgWriter* writer_; - bool deleteStreamsWhenDone; - bool shared; - CSecurity* security; - enum { maxSecTypes = 8 }; - int nSecTypes; - rdr::U8 secTypes[maxSecTypes]; - bool clientSecTypeOrder; - stateEnum state_; - - CharArray serverName; - - bool useProtocol3_3; - }; -} -#endif diff --git a/src/vnc/common/rfb/CMakeLists.txt b/src/vnc/common/rfb/CMakeLists.txt deleted file mode 100644 index a5c83839..00000000 --- a/src/vnc/common/rfb/CMakeLists.txt +++ /dev/null @@ -1,162 +0,0 @@ -# synergy -- mouse and keyboard sharing utility -# Copyright (C) 2012 Nick Bolton -# -# This package is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# found in the file COPYING that should have accompanied this file. -# -# This package 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, see . - -set(inc - Blacklist.h - CConnection.h - CMsgHandler.h - CMsgReader.h - CMsgReaderV3.h - CMsgWriter.h - CMsgWriterV3.h - ColourCube.h - ColourMap.h - ComparingUpdateTracker.h - Configuration.h - ConnParams.h - CSecurity.h - CSecurityNone.h - CSecurityVncAuth.h - Cursor.h - d3des.h - Decoder.h - Encoder.h - encodings.h - Exception.h - hextileConstants.h - hextileDecode.h - HextileDecoder.h - hextileEncode.h - HextileEncoder.h - Hostname.h - HTTPServer.h - ImageGetter.h - InputHandler.h - KeyRemapper.h - keysymdef.h - Logger.h - Logger_file.h - Logger_stdio.h - LogWriter.h - msgTypes.h - Password.h - Pixel.h - PixelBuffer.h - PixelFormat.h - RawDecoder.h - RawEncoder.h - Rect.h - Region.h - rreDecode.h - RREDecoder.h - rreEncode.h - RREEncoder.h - SConnection.h - SDesktop.h - secTypes.h - ServerCore.h - SMsgHandler.h - SMsgReader.h - SMsgReaderV3.h - SMsgWriter.h - SMsgWriterV3.h - SSecurity.h - SSecurityFactoryStandard.h - SSecurityNone.h - SSecurityVncAuth.h - Threading.h - Timer.h - TransImageGetter.h - transInitTempl.h - transTempl.h - TrueColourMap.h - UpdateTracker.h - UserPasswdGetter.h - util.h - VNCSConnectionST.h - VNCServer.h - VNCServerST.h - zrleDecode.h - ZRLEDecoder.h - zrleEncode.h - ZRLEEncoder.h -) - -set(src - d3des.c - Blacklist.cxx - CConnection.cxx - CMsgHandler.cxx - CMsgReader.cxx - CMsgReaderV3.cxx - CMsgWriter.cxx - CMsgWriterV3.cxx - ComparingUpdateTracker.cxx - Configuration.cxx - ConnParams.cxx - CSecurityVncAuth.cxx - Cursor.cxx - Decoder.cxx - Encoder.cxx - encodings.cxx - HextileDecoder.cxx - HextileEncoder.cxx - HTTPServer.cxx - KeyRemapper.cxx - Logger.cxx - Logger_file.cxx - Logger_stdio.cxx - LogWriter.cxx - Password.cxx - PixelBuffer.cxx - PixelFormat.cxx - RawDecoder.cxx - RawEncoder.cxx - Region.cxx - RREDecoder.cxx - RREEncoder.cxx - SConnection.cxx - secTypes.cxx - ServerCore.cxx - SMsgHandler.cxx - SMsgReader.cxx - SMsgReaderV3.cxx - SMsgWriter.cxx - SMsgWriterV3.cxx - SSecurityFactoryStandard.cxx - SSecurityVncAuth.cxx - Timer.cxx - TransImageGetter.cxx - UpdateTracker.cxx - util.cxx - VNCSConnectionST.cxx - VNCServerST.cxx - ZRLEDecoder.cxx - ZRLEEncoder.cxx -) - -if (WIN32) - list(APPEND src ${inc}) -endif() - -set(inc - .. - ../../win -) - -include_directories(${inc}) -add_library(vnc_rfb STATIC ${src}) -target_link_libraries(vnc_rfb - vnc_Xregion) diff --git a/src/vnc/common/rfb/CMsgHandler.cxx b/src/vnc/common/rfb/CMsgHandler.cxx deleted file mode 100644 index 05dbf70f..00000000 --- a/src/vnc/common/rfb/CMsgHandler.cxx +++ /dev/null @@ -1,99 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -#include -#include - -using namespace rfb; - -CMsgHandler::CMsgHandler() -{ -} - -CMsgHandler::~CMsgHandler() -{ -} - -void CMsgHandler::setDesktopSize(int width, int height) -{ - cp.width = width; - cp.height = height; -} - -void CMsgHandler::setCursor(int w, int h, const Point& hotspot, void* data, void* mask) -{ -} - -void CMsgHandler::setPixelFormat(const PixelFormat& pf) -{ - cp.setPF(pf); -} - -void CMsgHandler::setName(const char* name) -{ - cp.setName(name); -} - -void CMsgHandler::serverInit() -{ - throw Exception("CMsgHandler::serverInit called"); -} - -void CMsgHandler::framebufferUpdateStart() -{ -} - -void CMsgHandler::framebufferUpdateEnd() -{ -} - -void CMsgHandler::beginRect(const Rect& r, unsigned int encoding) -{ -} - -void CMsgHandler::endRect(const Rect& r, unsigned int encoding) -{ -} - - -void CMsgHandler::setColourMapEntries(int firstColour, int nColours, - rdr::U16* rgbs) -{ - throw Exception("CMsgHandler::setColourMapEntries called"); -} - -void CMsgHandler::bell() -{ -} - -void CMsgHandler::serverCutText(const char* str, int len) -{ -} - -void CMsgHandler::fillRect(const Rect& r, Pixel pix) -{ -} - -void CMsgHandler::imageRect(const Rect& r, void* pixels) -{ -} - -void CMsgHandler::copyRect(const Rect& r, int srcX, int srcY) -{ -} - - diff --git a/src/vnc/common/rfb/CMsgHandler.h b/src/vnc/common/rfb/CMsgHandler.h deleted file mode 100644 index a9cafbfe..00000000 --- a/src/vnc/common/rfb/CMsgHandler.h +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -// -// CMsgHandler - class to handle incoming messages on the client side. -// - -#ifndef __RFB_CMSGHANDLER_H__ -#define __RFB_CMSGHANDLER_H__ - -#include -#include -#include -#include - -namespace rdr { class InStream; } - -namespace rfb { - - class CMsgHandler { - public: - CMsgHandler(); - virtual ~CMsgHandler(); - - // The following methods are called as corresponding messages are read. A - // derived class should override these methods as desired. Note that for - // the setDesktopSize(), setPixelFormat() and setName() methods, a derived - // class should call on to CMsgHandler's methods to set the members of cp - // appropriately. - - virtual void setDesktopSize(int w, int h); - virtual void setCursor(int width, int height, const Point& hotspot, - void* data, void* mask); - virtual void setPixelFormat(const PixelFormat& pf); - virtual void setName(const char* name); - virtual void serverInit(); - - virtual void framebufferUpdateStart(); - virtual void framebufferUpdateEnd(); - virtual void beginRect(const Rect& r, unsigned int encoding); - virtual void endRect(const Rect& r, unsigned int encoding); - - virtual void setColourMapEntries(int firstColour, int nColours, - rdr::U16* rgbs); - virtual void bell(); - virtual void serverCutText(const char* str, int len); - - virtual void fillRect(const Rect& r, Pixel pix); - virtual void imageRect(const Rect& r, void* pixels); - virtual void copyRect(const Rect& r, int srcX, int srcY); - - ConnParams cp; - }; -} -#endif diff --git a/src/vnc/common/rfb/CMsgReader.cxx b/src/vnc/common/rfb/CMsgReader.cxx deleted file mode 100644 index 49110070..00000000 --- a/src/vnc/common/rfb/CMsgReader.cxx +++ /dev/null @@ -1,160 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -#include -#include -#include -#include -#include -#include - -using namespace rfb; - -CMsgReader::CMsgReader(CMsgHandler* handler_, rdr::InStream* is_) - : imageBufIdealSize(0), handler(handler_), is(is_), - imageBuf(0), imageBufSize(0) -{ - for (unsigned int i = 0; i <= encodingMax; i++) { - decoders[i] = 0; - } -} - -CMsgReader::~CMsgReader() -{ - for (unsigned int i = 0; i <= encodingMax; i++) { - delete decoders[i]; - } - delete [] imageBuf; -} - -void CMsgReader::readSetColourMapEntries() -{ - is->skip(1); - int firstColour = is->readU16(); - int nColours = is->readU16(); - rdr::U16Array rgbs(nColours * 3); - for (int i = 0; i < nColours * 3; i++) - rgbs.buf[i] = is->readU16(); - handler->setColourMapEntries(firstColour, nColours, rgbs.buf); -} - -void CMsgReader::readBell() -{ - handler->bell(); -} - -void CMsgReader::readServerCutText() -{ - is->skip(3); - int len = is->readU32(); - if (len > 256*1024) { - is->skip(len); - fprintf(stderr,"cut text too long (%d bytes) - ignoring\n",len); - return; - } - CharArray ca(len+1); - ca.buf[len] = 0; - is->readBytes(ca.buf, len); - handler->serverCutText(ca.buf, len); -} - -void CMsgReader::readFramebufferUpdateStart() -{ - handler->framebufferUpdateStart(); -} - -void CMsgReader::readFramebufferUpdateEnd() -{ - handler->framebufferUpdateEnd(); -} - -void CMsgReader::readRect(const Rect& r, unsigned int encoding) -{ - if ((r.br.x > handler->cp.width) || (r.br.y > handler->cp.height)) { - fprintf(stderr, "Rect too big: %dx%d at %d,%d exceeds %dx%d\n", - r.width(), r.height(), r.tl.x, r.tl.y, - handler->cp.width, handler->cp.height); - throw Exception("Rect too big"); - } - - if (r.is_empty()) - fprintf(stderr, "Warning: zero size rect\n"); - - handler->beginRect(r, encoding); - - if (encoding == encodingCopyRect) { - readCopyRect(r); - } else { - if (encoding > encodingMax) - throw Exception("Unknown rect encoding"); - if (!decoders[encoding]) { - decoders[encoding] = Decoder::createDecoder(encoding, this); - if (!decoders[encoding]) { - fprintf(stderr, "Unknown rect encoding %d\n", encoding); - throw Exception("Unknown rect encoding"); - } - } - decoders[encoding]->readRect(r, handler); - } - - handler->endRect(r, encoding); -} - -void CMsgReader::readCopyRect(const Rect& r) -{ - int srcX = is->readU16(); - int srcY = is->readU16(); - handler->copyRect(r, srcX, srcY); -} - -void CMsgReader::readSetCursor(int width, int height, const Point& hotspot) -{ - int data_len = width * height * (handler->cp.pf().bpp/8); - int mask_len = ((width+7)/8) * height; - rdr::U8Array data(data_len); - rdr::U8Array mask(mask_len); - - is->readBytes(data.buf, data_len); - is->readBytes(mask.buf, mask_len); - - handler->setCursor(width, height, hotspot, data.buf, mask.buf); -} - -rdr::U8* CMsgReader::getImageBuf(int required, int requested, int* nPixels) -{ - int requiredBytes = required * (handler->cp.pf().bpp / 8); - int requestedBytes = requested * (handler->cp.pf().bpp / 8); - int size = requestedBytes; - if (size > imageBufIdealSize) size = imageBufIdealSize; - - if (size < requiredBytes) - size = requiredBytes; - - if (imageBufSize < size) { - imageBufSize = size; - delete [] imageBuf; - imageBuf = new rdr::U8[imageBufSize]; - } - if (nPixels) - *nPixels = imageBufSize / (handler->cp.pf().bpp / 8); - return imageBuf; -} - -int CMsgReader::bpp() -{ - return handler->cp.pf().bpp; -} diff --git a/src/vnc/common/rfb/CMsgReader.h b/src/vnc/common/rfb/CMsgReader.h deleted file mode 100644 index 7a611fc8..00000000 --- a/src/vnc/common/rfb/CMsgReader.h +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -// -// CMsgReader - class for reading RFB messages on the server side -// (i.e. messages from client to server). -// - -#ifndef __RFB_CMSGREADER_H__ -#define __RFB_CMSGREADER_H__ - -#include -#include -#include - -namespace rdr { class InStream; } - -namespace rfb { - class CMsgHandler; - struct Rect; - - class CMsgReader { - public: - virtual ~CMsgReader(); - - virtual void readServerInit()=0; - - // readMsg() reads a message, calling the handler as appropriate. - virtual void readMsg()=0; - - rdr::InStream* getInStream() { return is; } - rdr::U8* getImageBuf(int required, int requested=0, int* nPixels=0); - int bpp(); - - int imageBufIdealSize; - - protected: - virtual void readSetColourMapEntries(); - virtual void readBell(); - virtual void readServerCutText(); - - virtual void readFramebufferUpdateStart(); - virtual void readFramebufferUpdateEnd(); - virtual void readRect(const Rect& r, unsigned int encoding); - - virtual void readCopyRect(const Rect& r); - - virtual void readSetCursor(int width, int height, const Point& hotspot); - - CMsgReader(CMsgHandler* handler, rdr::InStream* is); - - CMsgHandler* handler; - rdr::InStream* is; - Decoder* decoders[encodingMax+1]; - rdr::U8* imageBuf; - int imageBufSize; - }; -} -#endif diff --git a/src/vnc/common/rfb/CMsgReaderV3.cxx b/src/vnc/common/rfb/CMsgReaderV3.cxx deleted file mode 100644 index 2f2c1655..00000000 --- a/src/vnc/common/rfb/CMsgReaderV3.cxx +++ /dev/null @@ -1,95 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -#include -#include -#include -#include -#include -#include -#include - -using namespace rfb; - -CMsgReaderV3::CMsgReaderV3(CMsgHandler* handler, rdr::InStream* is) - : CMsgReader(handler, is), nUpdateRectsLeft(0) -{ -} - -CMsgReaderV3::~CMsgReaderV3() -{ -} - -void CMsgReaderV3::readServerInit() -{ - int width = is->readU16(); - int height = is->readU16(); - handler->setDesktopSize(width, height); - PixelFormat pf; - pf.read(is); - handler->setPixelFormat(pf); - CharArray name(is->readString()); - handler->setName(name.buf); - handler->serverInit(); -} - -void CMsgReaderV3::readMsg() -{ - if (nUpdateRectsLeft == 0) { - - int type = is->readU8(); - switch (type) { - case msgTypeFramebufferUpdate: readFramebufferUpdate(); break; - case msgTypeSetColourMapEntries: readSetColourMapEntries(); break; - case msgTypeBell: readBell(); break; - case msgTypeServerCutText: readServerCutText(); break; - default: - fprintf(stderr, "unknown message type %d\n", type); - throw Exception("unknown message type"); - } - - } else { - - int x = is->readU16(); - int y = is->readU16(); - int w = is->readU16(); - int h = is->readU16(); - unsigned int encoding = is->readU32(); - - switch (encoding) { - case pseudoEncodingDesktopSize: - handler->setDesktopSize(w, h); - break; - case pseudoEncodingCursor: - readSetCursor(w, h, Point(x,y)); - break; - default: - readRect(Rect(x, y, x+w, y+h), encoding); - break; - }; - - nUpdateRectsLeft--; - if (nUpdateRectsLeft == 0) handler->framebufferUpdateEnd(); - } -} - -void CMsgReaderV3::readFramebufferUpdate() -{ - is->skip(1); - nUpdateRectsLeft = is->readU16(); - handler->framebufferUpdateStart(); -} diff --git a/src/vnc/common/rfb/CMsgReaderV3.h b/src/vnc/common/rfb/CMsgReaderV3.h deleted file mode 100644 index 689bb650..00000000 --- a/src/vnc/common/rfb/CMsgReaderV3.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -#ifndef __RFB_CMSGREADERV3_H__ -#define __RFB_CMSGREADERV3_H__ - -#include - -namespace rfb { - class CMsgReaderV3 : public CMsgReader { - public: - CMsgReaderV3(CMsgHandler* handler, rdr::InStream* is); - virtual ~CMsgReaderV3(); - virtual void readServerInit(); - virtual void readMsg(); - private: - void readFramebufferUpdate(); - int nUpdateRectsLeft; - }; -} -#endif diff --git a/src/vnc/common/rfb/CMsgWriter.cxx b/src/vnc/common/rfb/CMsgWriter.cxx deleted file mode 100644 index 42ae09ec..00000000 --- a/src/vnc/common/rfb/CMsgWriter.cxx +++ /dev/null @@ -1,126 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace rfb; - -CMsgWriter::CMsgWriter(ConnParams* cp_, rdr::OutStream* os_) - : cp(cp_), os(os_) -{ -} - -CMsgWriter::~CMsgWriter() -{ -} - -void CMsgWriter::writeSetPixelFormat(const PixelFormat& pf) -{ - startMsg(msgTypeSetPixelFormat); - os->pad(3); - pf.write(os); - endMsg(); -} - -void CMsgWriter::writeSetEncodings(int nEncodings, rdr::U32* encodings) -{ - startMsg(msgTypeSetEncodings); - os->skip(1); - os->writeU16(nEncodings); - for (int i = 0; i < nEncodings; i++) - os->writeU32(encodings[i]); - endMsg(); -} - -// Ask for encodings based on which decoders are supported. Assumes higher -// encoding numbers are more desirable. - -void CMsgWriter::writeSetEncodings(int preferredEncoding, bool useCopyRect) -{ - int nEncodings = 0; - rdr::U32 encodings[encodingMax+2]; - if (cp->supportsLocalCursor) - encodings[nEncodings++] = pseudoEncodingCursor; - if (cp->supportsDesktopResize) - encodings[nEncodings++] = pseudoEncodingDesktopSize; - if (Decoder::supported(preferredEncoding)) { - encodings[nEncodings++] = preferredEncoding; - } - if (useCopyRect) { - encodings[nEncodings++] = encodingCopyRect; - } - for (int i = encodingMax; i >= 0; i--) { - if (i != preferredEncoding && Decoder::supported(i)) { - encodings[nEncodings++] = i; - } - } - writeSetEncodings(nEncodings, encodings); -} - -void CMsgWriter::writeFramebufferUpdateRequest(const Rect& r, bool incremental) -{ - startMsg(msgTypeFramebufferUpdateRequest); - os->writeU8(incremental); - os->writeU16(r.tl.x); - os->writeU16(r.tl.y); - os->writeU16(r.width()); - os->writeU16(r.height()); - endMsg(); -} - - -void CMsgWriter::keyEvent(rdr::U32 key, bool down) -{ - startMsg(msgTypeKeyEvent); - os->writeU8(down); - os->pad(2); - os->writeU32(key); - endMsg(); -} - - -void CMsgWriter::pointerEvent(const Point& pos, int buttonMask) -{ - Point p(pos); - if (p.x < 0) p.x = 0; - if (p.y < 0) p.y = 0; - if (p.x >= cp->width) p.x = cp->width - 1; - if (p.y >= cp->height) p.y = cp->height - 1; - - startMsg(msgTypePointerEvent); - os->writeU8(buttonMask); - os->writeU16(p.x); - os->writeU16(p.y); - endMsg(); -} - - -void CMsgWriter::clientCutText(const char* str, int len) -{ - startMsg(msgTypeClientCutText); - os->pad(3); - os->writeU32(len); - os->writeBytes(str, len); - endMsg(); -} diff --git a/src/vnc/common/rfb/CMsgWriter.h b/src/vnc/common/rfb/CMsgWriter.h deleted file mode 100644 index 19be8df9..00000000 --- a/src/vnc/common/rfb/CMsgWriter.h +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -// -// CMsgWriter - class for writing RFB messages on the server side. -// - -#ifndef __RFB_CMSGWRITER_H__ -#define __RFB_CMSGWRITER_H__ - -#include - -namespace rdr { class OutStream; } - -namespace rfb { - - class PixelFormat; - class ConnParams; - struct Rect; - - class CMsgWriter : public InputHandler { - public: - virtual ~CMsgWriter(); - - // CMsgWriter abstract interface methods - virtual void writeClientInit(bool shared)=0; - virtual void startMsg(int type)=0; - virtual void endMsg()=0; - - // CMsgWriter implemented methods - virtual void writeSetPixelFormat(const PixelFormat& pf); - virtual void writeSetEncodings(int nEncodings, rdr::U32* encodings); - virtual void writeSetEncodings(int preferredEncoding, bool useCopyRect); - virtual void writeFramebufferUpdateRequest(const Rect& r,bool incremental); - - // InputHandler implementation - virtual void keyEvent(rdr::U32 key, bool down); - virtual void pointerEvent(const Point& pos, int buttonMask); - virtual void clientCutText(const char* str, int len); - - ConnParams* getConnParams() { return cp; } - rdr::OutStream* getOutStream() { return os; } - - protected: - CMsgWriter(ConnParams* cp, rdr::OutStream* os); - - ConnParams* cp; - rdr::OutStream* os; - }; -} -#endif diff --git a/src/vnc/common/rfb/CMsgWriterV3.cxx b/src/vnc/common/rfb/CMsgWriterV3.cxx deleted file mode 100644 index a9807952..00000000 --- a/src/vnc/common/rfb/CMsgWriterV3.cxx +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -#include -#include -#include -#include -#include - -using namespace rfb; - -CMsgWriterV3::CMsgWriterV3(ConnParams* cp, rdr::OutStream* os) - : CMsgWriter(cp, os) -{ -} - -CMsgWriterV3::~CMsgWriterV3() -{ -} - -void CMsgWriterV3::writeClientInit(bool shared) -{ - os->writeU8(shared); - endMsg(); -} - -void CMsgWriterV3::startMsg(int type) -{ - os->writeU8(type); -} - -void CMsgWriterV3::endMsg() -{ - os->flush(); -} diff --git a/src/vnc/common/rfb/CMsgWriterV3.h b/src/vnc/common/rfb/CMsgWriterV3.h deleted file mode 100644 index 0b2f9afe..00000000 --- a/src/vnc/common/rfb/CMsgWriterV3.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -#ifndef __RFB_CMSGWRITERV3_H__ -#define __RFB_CMSGWRITERV3_H__ - -#include - -namespace rfb { - class CMsgWriterV3 : public CMsgWriter { - public: - CMsgWriterV3(ConnParams* cp, rdr::OutStream* os); - virtual ~CMsgWriterV3(); - - virtual void writeClientInit(bool shared); - virtual void startMsg(int type); - virtual void endMsg(); - - }; -} -#endif diff --git a/src/vnc/common/rfb/CSecurity.h b/src/vnc/common/rfb/CSecurity.h deleted file mode 100644 index 90a01d70..00000000 --- a/src/vnc/common/rfb/CSecurity.h +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -// -// CSecurity - class on the client side for handling security handshaking. A -// derived class for a particular security type overrides the processMsg() -// method. - -// processMsg() is called first when the security type has been decided on, and -// will keep being called whenever there is data to read from the server. It -// should return false when it needs more data, or true when the security -// handshaking is over and we are now waiting for the SecurityResult message -// from the server. In the event of failure a suitable exception should be -// thrown. -// -// Note that the first time processMsg() is called, there is no guarantee that -// there is any data to read from the CConnection's InStream, but subsequent -// calls guarantee there is at least one byte which can be read without -// blocking. -// -// description is a string describing the level of encryption applied to the -// session, or null if no encryption will be used. - -#ifndef __RFB_CSECURITY_H__ -#define __RFB_CSECURITY_H__ - -namespace rfb { - class CConnection; - class CSecurity { - public: - virtual ~CSecurity() {} - virtual bool processMsg(CConnection* cc)=0; - virtual void destroy() { delete this; } - virtual int getType() const = 0; - virtual const char* description() const = 0; - }; -} -#endif diff --git a/src/vnc/common/rfb/CSecurityNone.h b/src/vnc/common/rfb/CSecurityNone.h deleted file mode 100644 index 54c10168..00000000 --- a/src/vnc/common/rfb/CSecurityNone.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -// -// CSecurityNone.h -// - -#ifndef __CSECURITYNONE_H__ -#define __CSECURITYNONE_H__ - -#include - -namespace rfb { - - class CSecurityNone : public CSecurity { - public: - virtual bool processMsg(CConnection* cc) { return true; } - virtual int getType() const {return secTypeNone;} - virtual const char* description() const {return "No Encryption";} - }; -} -#endif diff --git a/src/vnc/common/rfb/CSecurityVncAuth.cxx b/src/vnc/common/rfb/CSecurityVncAuth.cxx deleted file mode 100644 index 2d991701..00000000 --- a/src/vnc/common/rfb/CSecurityVncAuth.cxx +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -// -// CSecurityVncAuth -// -// XXX not thread-safe, because d3des isn't - do we need to worry about this? -// - -#include -#include -#include -#include -#include -#include -#include -extern "C" { -#include -} - - -using namespace rfb; - -static const int vncAuthChallengeSize = 16; - - -CSecurityVncAuth::CSecurityVncAuth(UserPasswdGetter* upg_) - : upg(upg_) -{ -} - -CSecurityVncAuth::~CSecurityVncAuth() -{ -} - -bool CSecurityVncAuth::processMsg(CConnection* cc) -{ - rdr::InStream* is = cc->getInStream(); - rdr::OutStream* os = cc->getOutStream(); - - // Read the challenge & obtain the user's password - rdr::U8 challenge[vncAuthChallengeSize]; - is->readBytes(challenge, vncAuthChallengeSize); - PlainPasswd passwd(strDup("test")); - //upg->getUserPasswd(0, &passwd.buf); - - // Calculate the correct response - rdr::U8 key[8]; - int pwdLen = strlen(passwd.buf); - for (int i=0; i<8; i++) - key[i] = iwriteBytes(challenge, vncAuthChallengeSize); - os->flush(); - return true; -} diff --git a/src/vnc/common/rfb/CSecurityVncAuth.h b/src/vnc/common/rfb/CSecurityVncAuth.h deleted file mode 100644 index 8d38d878..00000000 --- a/src/vnc/common/rfb/CSecurityVncAuth.h +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -#ifndef __RFB_CSECURITYVNCAUTH_H__ -#define __RFB_CSECURITYVNCAUTH_H__ - -#include -#include - -namespace rfb { - - class UserPasswdGetter; - - class CSecurityVncAuth : public CSecurity { - public: - CSecurityVncAuth(UserPasswdGetter* pg); - virtual ~CSecurityVncAuth(); - virtual bool processMsg(CConnection* cc); - virtual int getType() const {return secTypeVncAuth;}; - virtual const char* description() const {return "No Encryption";} - private: - UserPasswdGetter* upg; - }; -} -#endif diff --git a/src/vnc/common/rfb/ColourCube.h b/src/vnc/common/rfb/ColourCube.h deleted file mode 100644 index b83cbba8..00000000 --- a/src/vnc/common/rfb/ColourCube.h +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -// -// ColourCube - structure to represent a colour cube. The colour cube consists -// of its dimensions (nRed x nGreen x nBlue) and a table mapping an (r,g,b) -// triple to a pixel value. -// -// A colour cube is used in two cases. The first is internally in a viewer -// when it cannot use a trueColour format, nor can it have exclusive access to -// a writable colour map. This is most notably the case for an X viewer -// wishing to use a PseudoColor X server's default colormap. -// -// The second use is on the server side when a client has asked for a colour -// map and the server is trueColour. Instead of setting an uneven trueColour -// format like bgr233, it can set the client's colour map up with a 6x6x6 -// colour cube. For this use the colour cube table has a null mapping, which -// makes it easy to perform the reverse lookup operation from pixel value to -// r,g,b values. - -#ifndef __RFB_COLOURCUBE_H__ -#define __RFB_COLOURCUBE_H__ - -#include -#include - -namespace rfb { - - class ColourCube : public ColourMap { - public: - ColourCube(int nr, int ng, int nb, Pixel* table_=0) - : nRed(nr), nGreen(ng), nBlue(nb), table(table_), deleteTable(false) - { - if (!table) { - table = new Pixel[size()]; - deleteTable = true; - // set a null mapping by default - for (int i = 0; i < size(); i++) - table[i] = i; - } - } - - ColourCube() : deleteTable(false) {} - - virtual ~ColourCube() { - if (deleteTable) delete [] table; - } - - void set(int r, int g, int b, Pixel p) { - table[(r * nGreen + g) * nBlue + b] = p; - } - - Pixel lookup(int r, int g, int b) const { - return table[(r * nGreen + g) * nBlue + b]; - } - - int size() const { return nRed*nGreen*nBlue; } - int redMult() const { return nGreen*nBlue; } - int greenMult() const { return nBlue; } - int blueMult() const { return 1; } - - // ColourMap lookup() method. Note that this only works when the table has - // the default null mapping. - virtual void lookup(int i, int* r, int* g, int* b) { - if (i >= size()) return; - *b = i % nBlue; - i /= nBlue; - *g = i % nGreen; - *r = i / nGreen; - *r = (*r * 65535 + (nRed-1) / 2) / (nRed-1); - *g = (*g * 65535 + (nGreen-1) / 2) / (nGreen-1); - *b = (*b * 65535 + (nBlue-1) / 2) / (nBlue-1); - } - - int nRed; - int nGreen; - int nBlue; - Pixel* table; - bool deleteTable; - }; -} -#endif diff --git a/src/vnc/common/rfb/ColourMap.h b/src/vnc/common/rfb/ColourMap.h deleted file mode 100644 index 7868be05..00000000 --- a/src/vnc/common/rfb/ColourMap.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -#ifndef __RFB_COLOURMAP_H__ -#define __RFB_COLOURMAP_H__ -namespace rfb { - struct Colour { - Colour() : r(0), g(0), b(0) {} - Colour(int r_, int g_, int b_) : r(r_), g(g_), b(b_) {} - virtual ~Colour() {} - int r, g, b; - bool operator==(const Colour& c) const {return c.r == r && c.g == g && c.b == b;} - bool operator!=(const Colour& c) const {return !(c == *this);} - }; - - class ColourMap { - public: - virtual ~ColourMap() {} - virtual void lookup(int index, int* r, int* g, int* b)=0; - }; -} -#endif diff --git a/src/vnc/common/rfb/ComparingUpdateTracker.cxx b/src/vnc/common/rfb/ComparingUpdateTracker.cxx deleted file mode 100644 index ce3d68ae..00000000 --- a/src/vnc/common/rfb/ComparingUpdateTracker.cxx +++ /dev/null @@ -1,137 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -#include -#include -#include -#include -#include - -using namespace rfb; - -ComparingUpdateTracker::ComparingUpdateTracker(PixelBuffer* buffer) - : fb(buffer), oldFb(fb->getPF(), 0, 0), firstCompare(true) -{ - changed.assign_union(fb->getRect()); -} - -ComparingUpdateTracker::~ComparingUpdateTracker() -{ -} - - -#define BLOCK_SIZE 16 - -void ComparingUpdateTracker::compare() -{ - std::vector rects; - std::vector::iterator i; - - if (firstCompare) { - // NB: We leave the change region untouched on this iteration, - // since in effect the entire framebuffer has changed. - oldFb.setSize(fb->width(), fb->height()); - for (int y=0; yheight(); y+=BLOCK_SIZE) { - Rect pos(0, y, fb->width(), __rfbmin(fb->height(), y+BLOCK_SIZE)); - int srcStride; - const rdr::U8* srcData = fb->getPixelsR(pos, &srcStride); - oldFb.imageRect(pos, srcData, srcStride); - } - firstCompare = false; - } else { - copied.get_rects(&rects, copy_delta.x<=0, copy_delta.y<=0); - for (i = rects.begin(); i != rects.end(); i++) - oldFb.copyRect(*i, copy_delta); - - Region to_check = changed.union_(copied); - to_check.get_rects(&rects); - - Region newChanged; - for (i = rects.begin(); i != rects.end(); i++) - compareRect(*i, &newChanged); - - copied.assign_subtract(newChanged); - changed = newChanged; - } -} - -void ComparingUpdateTracker::compareRect(const Rect& r, Region* newChanged) -{ - if (!r.enclosed_by(fb->getRect())) { - fprintf(stderr,"ComparingUpdateTracker: rect outside fb (%d,%d-%d,%d)\n", r.tl.x, r.tl.y, r.br.x, r.br.y); - return; - } - - int bytesPerPixel = fb->getPF().bpp/8; - int oldStride; - rdr::U8* oldData = oldFb.getPixelsRW(r, &oldStride); - int oldStrideBytes = oldStride * bytesPerPixel; - - std::vector changedBlocks; - - for (int blockTop = r.tl.y; blockTop < r.br.y; blockTop += BLOCK_SIZE) - { - // Get a strip of the source buffer - Rect pos(r.tl.x, blockTop, r.br.x, __rfbmin(r.br.y, blockTop+BLOCK_SIZE)); - int fbStride; - const rdr::U8* newBlockPtr = fb->getPixelsR(pos, &fbStride); - int newStrideBytes = fbStride * bytesPerPixel; - - rdr::U8* oldBlockPtr = oldData; - int blockBottom = __rfbmin(blockTop+BLOCK_SIZE, r.br.y); - - for (int blockLeft = r.tl.x; blockLeft < r.br.x; blockLeft += BLOCK_SIZE) - { - const rdr::U8* newPtr = newBlockPtr; - rdr::U8* oldPtr = oldBlockPtr; - - int blockRight = __rfbmin(blockLeft+BLOCK_SIZE, r.br.x); - int blockWidthInBytes = (blockRight-blockLeft) * bytesPerPixel; - - for (int y = blockTop; y < blockBottom; y++) - { - if (memcmp(oldPtr, newPtr, blockWidthInBytes) != 0) - { - // A block has changed - copy the remainder to the oldFb - changedBlocks.push_back(Rect(blockLeft, blockTop, - blockRight, blockBottom)); - for (int y2 = y; y2 < blockBottom; y2++) - { - memcpy(oldPtr, newPtr, blockWidthInBytes); - newPtr += newStrideBytes; - oldPtr += oldStrideBytes; - } - break; - } - - newPtr += newStrideBytes; - oldPtr += oldStrideBytes; - } - - oldBlockPtr += blockWidthInBytes; - newBlockPtr += blockWidthInBytes; - } - - oldData += oldStrideBytes * BLOCK_SIZE; - } - - if (!changedBlocks.empty()) { - Region temp; - temp.setOrderedRects(changedBlocks); - newChanged->assign_union(temp); - } -} diff --git a/src/vnc/common/rfb/ComparingUpdateTracker.h b/src/vnc/common/rfb/ComparingUpdateTracker.h deleted file mode 100644 index 5d2e5edf..00000000 --- a/src/vnc/common/rfb/ComparingUpdateTracker.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#ifndef __RFB_COMPARINGUPDATETRACKER_H__ -#define __RFB_COMPARINGUPDATETRACKER_H__ - -#include - -namespace rfb { - - class ComparingUpdateTracker : public SimpleUpdateTracker { - public: - ComparingUpdateTracker(PixelBuffer* buffer); - ~ComparingUpdateTracker(); - - // compare() does the comparison and reduces its changed and copied regions - // as appropriate. - - virtual void compare(); - private: - void compareRect(const Rect& r, Region* newchanged); - PixelBuffer* fb; - ManagedPixelBuffer oldFb; - bool firstCompare; - }; - -} -#endif diff --git a/src/vnc/common/rfb/Configuration.cxx b/src/vnc/common/rfb/Configuration.cxx deleted file mode 100644 index f41e64f1..00000000 --- a/src/vnc/common/rfb/Configuration.cxx +++ /dev/null @@ -1,446 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- Configuration.cxx - -#include -#include -#include -#include -#ifdef WIN32 -#define strcasecmp _stricmp -#define strncasecmp _strnicmp -#endif - -#include -#include -#include -#include -#include - -#ifdef __RFB_THREADING_IMPL -// On platforms that support Threading, we use Locks to make getData safe -#define LOCK_CONFIG Lock l(*configLock()) -rfb::Mutex* configLock_ = 0; -static rfb::Mutex* configLock() { - if (!configLock_) - configLock_ = new rfb::Mutex; - return configLock_; -} -#else -#define LOCK_CONFIG -#endif - -#include -#include - -using namespace rfb; - -static LogWriter vlog("Config"); - - -// -=- The Global Configuration object -Configuration* Configuration::global_ = 0; -Configuration* Configuration::global() { - if (!global_) - global_ = new Configuration("Global"); - return global_; -} - - -// -=- Configuration implementation - -Configuration::Configuration(const char* name_, Configuration* attachToGroup) -: name(strDup(name_)), head(0), _next(0) { - if (attachToGroup) { - _next = attachToGroup->_next; - attachToGroup->_next = this; - } -} - -Configuration& Configuration::operator=(const Configuration& src) { - VoidParameter* current = head; - while (current) { - VoidParameter* srcParam = ((Configuration&)src).get(current->getName()); - if (srcParam) { - current->immutable = false; - CharArray value(srcParam->getValueStr()); - vlog.debug("operator=(%s, %s)", current->getName(), value.buf); - current->setParam(value.buf); - } - current = current->_next; - } - if (_next) - *_next=src; - return *this; -} - -bool Configuration::set(const char* n, const char* v, bool immutable) { - return set(n, strlen(n), v, immutable); -} - -bool Configuration::set(const char* name, int len, - const char* val, bool immutable) -{ - VoidParameter* current = head; - while (current) { - if ((int)strlen(current->getName()) == len && - strncasecmp(current->getName(), name, len) == 0) - { - bool b = current->setParam(val); - if (b && immutable) - current->setImmutable(); - return b; - } - current = current->_next; - } - return _next ? _next->set(name, len, val, immutable) : false; -} - -bool Configuration::set(const char* config, bool immutable) { - bool hyphen = false; - if (config[0] == '-') { - hyphen = true; - config++; - if (config[0] == '-') config++; // allow gnu-style --