diff --git a/protocols/vnc/.gitignore b/protocols/vnc/.gitignore new file mode 100644 index 00000000..3f725332 --- /dev/null +++ b/protocols/vnc/.gitignore @@ -0,0 +1,36 @@ + +# Object code +*.o +*.so +*.lo +*.la + +# Backup files +*~ + +# Release files +*.tar.gz + +# Files currently being edited by vim or vi +*.swp + +# automake/autoconf +.deps/ +.libs/ +Makefile +Makefile.in +aclocal.m4 +autom4te.cache/ +m4/* +!README +config.guess +config.log +config.status +config.sub +configure +depcomp +install-sh +libtool +ltmain.sh +missing + diff --git a/protocols/vnc/AUTHORS b/protocols/vnc/AUTHORS new file mode 100644 index 00000000..9a0f2591 --- /dev/null +++ b/protocols/vnc/AUTHORS @@ -0,0 +1,3 @@ +Michael Jumper +James Muehlner +Saul Gio Perez diff --git a/protocols/vnc/ChangeLog b/protocols/vnc/ChangeLog new file mode 100644 index 00000000..920258f1 --- /dev/null +++ b/protocols/vnc/ChangeLog @@ -0,0 +1,31 @@ +2013-05-23 James Muehlner + + * convert() should return NULL only on malloc failure (fixes #313) + +2013-02-07 Saul Gio Perez + + * Implement color-depth parameter (fixes #272) + +2012-10-15 Michael Jumper + + * Fix m4/ autoreconf error + +2011-05-04 Michael Jumper + + * Migrated to 0.6.0 version of libguac API + * Ensure LICENSE is included in source .tar.gz + * Add swap-red-blue parameter + +2011-12-11 Michael Jumper + + * Migrated to 0.5.0 version of libguac API + +2011-03-13 Michael Jumper + + * Support for framebuffer resizing + * "encodings" argument + +2011-02-28 Michael Jumper + + * Initial release + diff --git a/protocols/vnc/LICENSE b/protocols/vnc/LICENSE new file mode 100644 index 00000000..7714141d --- /dev/null +++ b/protocols/vnc/LICENSE @@ -0,0 +1,470 @@ + MOZILLA PUBLIC LICENSE + Version 1.1 + + --------------- + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source + Code. + + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. + + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or + previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. + + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Application of this License. + + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) + +7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] + diff --git a/protocols/vnc/Makefile.am b/protocols/vnc/Makefile.am new file mode 100644 index 00000000..9180cc13 --- /dev/null +++ b/protocols/vnc/Makefile.am @@ -0,0 +1,50 @@ +# ***** BEGIN LICENSE BLOCK ***** +# Version: MPL 1.1/GPL 2.0/LGPL 2.1 +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is libguac-client-vnc. +# +# The Initial Developer of the Original Code is +# Michael Jumper. +# Portions created by the Initial Developer are Copyright (C) 2010 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# +# Alternatively, the contents of this file may be used under the terms of +# either the GNU General Public License Version 2 or later (the "GPL"), or +# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** + +AUTOMAKE_OPTIONS = foreign + +ACLOCAL_AMFLAGS = -I m4 +AM_CFLAGS = -Werror -Wall -pedantic -Iinclude + +lib_LTLIBRARIES = libguac-client-vnc.la + +libguac_client_vnc_la_SOURCES = src/client.c src/vnc_handlers.c src/guac_handlers.c src/convert.c +noinst_HEADERS = include/client.h include/vnc_handlers.h include/guac_handlers.h include/convert.h + +libguac_client_vnc_la_LDFLAGS = -version-info 0:0:0 + +EXTRA_DIST = LICENSE + diff --git a/protocols/vnc/README b/protocols/vnc/README new file mode 100644 index 00000000..bc664b7d --- /dev/null +++ b/protocols/vnc/README @@ -0,0 +1,75 @@ + +------------------------------------------------------------ + About this README +------------------------------------------------------------ + +This README is intended to provide quick and to-the-point documentation for +technical users intending to compile parts of Guacamole themselves. + +Distribution-specific packages are available from the files section of the main +project page: + + http://sourceforge.net/projects/guacamole/files/ + +Distribution-specific documentation is provided on the Guacamole wiki: + + http://guac-dev.org/ + + +------------------------------------------------------------ + What is libguac-client-vnc? +------------------------------------------------------------ + +libguac-client-vnc is a protocol support plugin for the Guacamole proxy (guacd) +which provides support for VNC via the libvncclient library (part of +libvncserver). + + +------------------------------------------------------------ + Compiling and installing libguac-client-vnc +------------------------------------------------------------ + +Please note that distribution-specific pre-compiled packages are available from +the files section of the main project site: + + http://sourceforge.net/projects/guacamole/files/ + +libguac-client-vnc is built using the popular GNU Automake, and thus provides +the standard configure script. + +1) Run configure + + $ ./configure + + Assuming all dependencies have been installed, this should succeed without + errors. + +2) Run make + + $ make + + libguac-client-vnc will now compile. + +3) Install (as root) + + # make install + + libguac-client-vnc will install to your /usr/local/lib directory by default. + You can change the install location by using the --prefix option for + configure. + + You will need to run ldconfig (as root) so that guacd can find the library + when needed: + + # ldconfig + + +------------------------------------------------------------ + Reporting problems +------------------------------------------------------------ + +Please report any bugs encountered by opening a new ticket at the Trac system +hosted at: + + http://guac-dev.org/trac/ + diff --git a/protocols/vnc/configure.in b/protocols/vnc/configure.in new file mode 100644 index 00000000..eb3b005c --- /dev/null +++ b/protocols/vnc/configure.in @@ -0,0 +1,57 @@ +# ***** BEGIN LICENSE BLOCK ***** +# Version: MPL 1.1/GPL 2.0/LGPL 2.1 +# +# The contents of this file are subject to the Mozilla Public License Version +# 1.1 (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# The Original Code is libguac-client-vnc. +# +# The Initial Developer of the Original Code is +# Michael Jumper. +# Portions created by the Initial Developer are Copyright (C) 2010 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# +# Alternatively, the contents of this file may be used under the terms of +# either the GNU General Public License Version 2 or later (the "GPL"), or +# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +# in which case the provisions of the GPL or the LGPL are applicable instead +# of those above. If you wish to allow use of your version of this file only +# under the terms of either the GPL or the LGPL, and not to allow others to +# use your version of this file under the terms of the MPL, indicate your +# decision by deleting the provisions above and replace them with the notice +# and other provisions required by the GPL or the LGPL. If you do not delete +# the provisions above, a recipient may use your version of this file under +# the terms of any one of the MPL, the GPL or the LGPL. +# +# ***** END LICENSE BLOCK ***** + +AC_INIT(src/client.c) +AM_INIT_AUTOMAKE([libguac-client-vnc], 0.7.2) +AC_CONFIG_MACRO_DIR([m4]) + +# Checks for programs. +AC_PROG_CC +AC_PROG_LIBTOOL + +# Checks for libraries. +AC_CHECK_LIB([guac], [guac_client_plugin_open],, AC_MSG_ERROR("libguac must be installed first")) +AC_CHECK_LIB([cairo], [cairo_create],, AC_MSG_ERROR("cairo is required for drawing instructions")) +AC_CHECK_LIB([vncclient], [rfbInitClient],, AC_MSG_ERROR("libvncclient is required")) + +# Checks for header files. +AC_CHECK_HEADERS([stdlib.h string.h syslog.h guacamole/client.h guacamole/socket.h guacamole/protocol.h iconv.h]) + +# Checks for library functions. +AC_FUNC_MALLOC + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/protocols/vnc/include/client.h b/protocols/vnc/include/client.h new file mode 100644 index 00000000..62c60ee2 --- /dev/null +++ b/protocols/vnc/include/client.h @@ -0,0 +1,60 @@ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is libguac-client-vnc. + * + * The Initial Developer of the Original Code is + * Michael Jumper. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef __GUAC_VNC_CLIENT_H +#define __GUAC_VNC_CLIENT_H + +#include + +extern char* __GUAC_CLIENT; + +typedef struct vnc_guac_client_data { + + rfbClient* rfb_client; + MallocFrameBufferProc rfb_MallocFrameBuffer; + + int copy_rect_used; + char* password; + char* encodings; + int swap_red_blue; + + guac_layer* cursor; + +} vnc_guac_client_data; + +#endif + diff --git a/protocols/vnc/include/convert.h b/protocols/vnc/include/convert.h new file mode 100644 index 00000000..8b373227 --- /dev/null +++ b/protocols/vnc/include/convert.h @@ -0,0 +1,53 @@ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is libguac-client-vnc. + * + * The Initial Developer of the Original Code is + * James Muehlner. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef __GUAC_VNC_VNC_CONVERT_H +#define __GUAC_VNC_VNC_CONVERT_H + +#include + +/** + * Converts a string from one charset to another. Returns a newly allocated string. + * @param from_charset The string representing the character set to convert from. + * @param to_charset The string representing the character set to convert to. + * @return A newly allocated string that is the result of the conversion, or NULL + * if an error has occured. + */ +char* convert (const char* from_charset, const char* to_charset, const char* input); + +#endif + diff --git a/protocols/vnc/include/guac_handlers.h b/protocols/vnc/include/guac_handlers.h new file mode 100644 index 00000000..766d9d64 --- /dev/null +++ b/protocols/vnc/include/guac_handlers.h @@ -0,0 +1,50 @@ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is libguac-client-vnc. + * + * The Initial Developer of the Original Code is + * Michael Jumper. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef __GUAC_VNC_GUAC_HANDLERS_H +#define __GUAC_VNC_GUAC_HANDLERS_H + +#include + +int vnc_guac_client_handle_messages(guac_client* client); +int vnc_guac_client_mouse_handler(guac_client* client, int x, int y, int mask); +int vnc_guac_client_key_handler(guac_client* client, int keysym, int pressed); +int vnc_guac_client_clipboard_handler(guac_client* client, char* data); +int vnc_guac_client_free_handler(guac_client* client); + +#endif + diff --git a/protocols/vnc/include/vnc_handlers.h b/protocols/vnc/include/vnc_handlers.h new file mode 100644 index 00000000..92730db3 --- /dev/null +++ b/protocols/vnc/include/vnc_handlers.h @@ -0,0 +1,54 @@ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is libguac-client-vnc. + * + * The Initial Developer of the Original Code is + * Michael Jumper. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef __GUAC_VNC_VNC_HANDLERS_H +#define __GUAC_VNC_VNC_HANDLERS_H + +#include + +void guac_vnc_cursor(rfbClient* client, int x, int y, int w, int h, int bpp); +void guac_vnc_update(rfbClient* client, int x, int y, int w, int h); +void guac_vnc_copyrect(rfbClient* client, int src_x, int src_y, int w, int h, int dest_x, int dest_y); +char* guac_vnc_get_password(rfbClient* client); +rfbBool guac_vnc_malloc_framebuffer(rfbClient* rfb_client); +void guac_vnc_cut_text(rfbClient* client, const char* text, int textlen); +void guac_vnc_client_log_info(const char* format, ...); +void guac_vnc_client_log_error(const char* format, ...); +void guac_vnc_set_pixel_format(rfbClient* client, int color_depth); + +#endif + diff --git a/protocols/vnc/m4/README b/protocols/vnc/m4/README new file mode 100644 index 00000000..c9c9cbc4 --- /dev/null +++ b/protocols/vnc/m4/README @@ -0,0 +1,12 @@ +This file exists such that the m4/ directory will be created when cloning the +git repository. + +The m4/ directory is not directly used by this project, but libtoolize +populates this directory with files, recommending that the directory be +included in the macro search path for aclocal. + +Because autoreconf runs aclocal before libtoolize, this directory will not +exist when autoreconf is run, triggering an error from aclocal. + +Creating this directory (and keeping this file in it as a placeholder) +prevents this error. diff --git a/protocols/vnc/src/client.c b/protocols/vnc/src/client.c new file mode 100644 index 00000000..d2219b9a --- /dev/null +++ b/protocols/vnc/src/client.c @@ -0,0 +1,172 @@ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is libguac-client-vnc. + * + * The Initial Developer of the Original Code is + * Michael Jumper. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include +#include + +#include + +#include +#include +#include + +#include "client.h" +#include "vnc_handlers.h" +#include "guac_handlers.h" + +/* Client plugin arguments */ +const char* GUAC_CLIENT_ARGS[] = { + "hostname", + "port", + "read-only", + "encodings", + "password", + "swap-red-blue", + "color-depth", + NULL +}; + +char* __GUAC_CLIENT = "GUAC_CLIENT"; + +int guac_client_init(guac_client* client, int argc, char** argv) { + + rfbClient* rfb_client; + + vnc_guac_client_data* guac_client_data; + + int read_only; + + /* Set up libvncclient logging */ + rfbClientLog = guac_vnc_client_log_info; + rfbClientErr = guac_vnc_client_log_error; + + /*** PARSE ARGUMENTS ***/ + + if (argc < 7) { + guac_protocol_send_error(client->socket, "Wrong argument count received."); + guac_socket_flush(client->socket); + return 1; + } + + /* Alloc client data */ + guac_client_data = malloc(sizeof(vnc_guac_client_data)); + client->data = guac_client_data; + + /* Set read-only flag */ + read_only = (strcmp(argv[2], "true") == 0); + + /* Set red/blue swap flag */ + guac_client_data->swap_red_blue = (strcmp(argv[5], "true") == 0); + + /* Freed after use by libvncclient */ + guac_client_data->password = strdup(argv[4]); + + /*** INIT RFB CLIENT ***/ + + rfb_client = rfbGetClient(8, 3, 4); /* 32-bpp client */ + + /* Store Guac client in rfb client */ + rfbClientSetClientData(rfb_client, __GUAC_CLIENT, client); + + /* Framebuffer update handler */ + rfb_client->GotFrameBufferUpdate = guac_vnc_update; + rfb_client->GotCopyRect = guac_vnc_copyrect; + + /* Do not handle clipboard and local cursor if read-only */ + if (read_only == 0) { + /* Enable client-side cursor */ + rfb_client->GotCursorShape = guac_vnc_cursor; + rfb_client->appData.useRemoteCursor = TRUE; + + /* Clipboard */ + rfb_client->GotXCutText = guac_vnc_cut_text; + } + + /* Password */ + rfb_client->GetPassword = guac_vnc_get_password; + + /* Depth */ + guac_vnc_set_pixel_format(rfb_client, atoi(argv[6])); + + /* Hook into allocation so we can handle resize. */ + guac_client_data->rfb_MallocFrameBuffer = rfb_client->MallocFrameBuffer; + rfb_client->MallocFrameBuffer = guac_vnc_malloc_framebuffer; + rfb_client->canHandleNewFBSize = 1; + + /* Set hostname and port */ + rfb_client->serverHost = strdup(argv[0]); + rfb_client->serverPort = atoi(argv[1]); + + /* Set encodings if specified */ + if (argv[3][0] != '\0') + rfb_client->appData.encodingsString = guac_client_data->encodings = strdup(argv[3]); + else + guac_client_data->encodings = NULL; + + /* Connect */ + if (!rfbInitClient(rfb_client, NULL, NULL)) { + guac_protocol_send_error(client->socket, "Error initializing VNC client"); + guac_socket_flush(client->socket); + return 1; + } + + /* Set remaining client data */ + guac_client_data->rfb_client = rfb_client; + guac_client_data->copy_rect_used = 0; + guac_client_data->cursor = guac_client_alloc_buffer(client); + + /* Set handlers */ + client->handle_messages = vnc_guac_client_handle_messages; + client->free_handler = vnc_guac_client_free_handler; + if (read_only == 0) { + /* Do not handle mouse/keyboard/clipboard if read-only */ + client->mouse_handler = vnc_guac_client_mouse_handler; + client->key_handler = vnc_guac_client_key_handler; + client->clipboard_handler = vnc_guac_client_clipboard_handler; + } + + /* Send name */ + guac_protocol_send_name(client->socket, rfb_client->desktopName); + + /* Send size */ + guac_protocol_send_size(client->socket, + GUAC_DEFAULT_LAYER, rfb_client->width, rfb_client->height); + + return 0; + +} + diff --git a/protocols/vnc/src/convert.c b/protocols/vnc/src/convert.c new file mode 100644 index 00000000..8bc9e8d0 --- /dev/null +++ b/protocols/vnc/src/convert.c @@ -0,0 +1,116 @@ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is libguac-client-vnc. + * + * The Initial Developer of the Original Code is + * James Muehlner. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include +#include +#include +#include + +char* convert(const char* from_charset, const char* to_charset, const char* input) { + size_t input_remaining; + size_t output_remaining; + size_t bytes_converted = 0; + char* output; + char* output_buffer; + char* new_buffer; + char* input_buffer; + size_t output_length; + iconv_t cd; + + cd = iconv_open(to_charset, from_charset); + + if(cd == (iconv_t) -1) + /* Cannot convert due to invalid character set */ + return NULL; + + input_remaining = strlen(input); + input_buffer = (char*) input; + + /* Start the output buffer the same size as the input buffer */ + output_length = input_remaining; + + /* Leave some space at the end for NULL terminator */ + if (!(output = (char*) malloc(output_length + 4))) { + /* Cannot convert due to memory allocation error */ + iconv_close(cd); + return NULL; + } + + do { + output_buffer = output + bytes_converted; + output_remaining = output_length - bytes_converted; + + bytes_converted = iconv(cd, &input_buffer, + &input_remaining, &output_buffer, &output_remaining); + + if(bytes_converted == -1) { + if(errno == E2BIG) { + /* The output buffer is too small, so allocate more space */ + bytes_converted = output_buffer - output; + output_length += input_remaining * 2 + 8; + + if (!(new_buffer = (char*) realloc(output, output_length + 4))) { + /* Cannot convert due to memory allocation error */ + iconv_close(cd); + free(output); + return NULL; + } + + output = new_buffer; + output_buffer = output + bytes_converted; + } + else if (errno == EILSEQ) { + /* Invalid sequence detected, return what's been converted so far */ + break; + } + else if (errno == EINVAL) { + /* Incomplete sequence detected, can be ignored */ + break; + } + } + } while (input_remaining); + + /* Flush the iconv conversion */ + iconv(cd, NULL, NULL, &output_buffer, &output_remaining); + iconv_close(cd); + + /* Add the NULL terminator */ + memset(output_buffer, 0, 4); + + return output; +} + diff --git a/protocols/vnc/src/guac_handlers.c b/protocols/vnc/src/guac_handlers.c new file mode 100644 index 00000000..f3b2fd49 --- /dev/null +++ b/protocols/vnc/src/guac_handlers.c @@ -0,0 +1,145 @@ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is libguac-client-vnc. + * + * The Initial Developer of the Original Code is + * Michael Jumper. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include +#include +#include +#include + +#include + +#include + +#include "client.h" +#include "convert.h" + +int vnc_guac_client_handle_messages(guac_client* client) { + + int wait_result; + rfbClient* rfb_client = ((vnc_guac_client_data*) client->data)->rfb_client; + + wait_result = WaitForMessage(rfb_client, 1000000); + if (wait_result < 0) { + guac_client_log_error(client, "Error waiting for VNC server message\n"); + return 1; + } + + if (wait_result > 0) { + + if (!HandleRFBServerMessage(rfb_client)) { + guac_client_log_error(client, "Error handling VNC server message\n"); + return 1; + } + + } + + return 0; + +} + + +int vnc_guac_client_mouse_handler(guac_client* client, int x, int y, int mask) { + + rfbClient* rfb_client = ((vnc_guac_client_data*) client->data)->rfb_client; + + SendPointerEvent(rfb_client, x, y, mask); + + return 0; +} + +int vnc_guac_client_key_handler(guac_client* client, int keysym, int pressed) { + + rfbClient* rfb_client = ((vnc_guac_client_data*) client->data)->rfb_client; + + SendKeyEvent(rfb_client, keysym, pressed); + + return 0; +} + +int vnc_guac_client_clipboard_handler(guac_client* client, char* data) { + + rfbClient* rfb_client = ((vnc_guac_client_data*) client->data)->rfb_client; + + /* Convert UTF-8 character data to ISO_8859-1 */ + # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 || _LIBICONV_VERSION >= 0x0105 + char* iso_8559_1_data = convert("UTF-8", "ISO_8859-1//TRANSLIT", data); + #else + char* iso_8559_1_data = convert("UTF-8", "ISO_8859-1", data); + #endif + + /* If the conversion was successful, send the converted character data. */ + if(iso_8559_1_data) { + SendClientCutText(rfb_client, iso_8559_1_data, strlen(iso_8559_1_data)); + free(iso_8559_1_data); + /* Otherwise, just send an empty string. */ + } + else + SendClientCutText(rfb_client, "", 0); + + return 0; +} + +int vnc_guac_client_free_handler(guac_client* client) { + + vnc_guac_client_data* guac_client_data = (vnc_guac_client_data*) client->data; + rfbClient* rfb_client = guac_client_data->rfb_client; + + /* Free encodings string, if used */ + if (guac_client_data->encodings != NULL) + free(guac_client_data->encodings); + + /* Free generic data struct */ + free(client->data); + + /* Free memory not free'd by libvncclient's rfbClientCleanup() */ + if (rfb_client->frameBuffer != NULL) free(rfb_client->frameBuffer); + if (rfb_client->raw_buffer != NULL) free(rfb_client->raw_buffer); + if (rfb_client->rcSource != NULL) free(rfb_client->rcSource); + + /* Free VNC rfbClientData linked list (not free'd by rfbClientCleanup()) */ + while (rfb_client->clientData != NULL) { + rfbClientData* next = rfb_client->clientData->next; + free(rfb_client->clientData); + rfb_client->clientData = next; + } + + /* Clean up VNC client*/ + rfbClientCleanup(rfb_client); + + return 0; +} + diff --git a/protocols/vnc/src/vnc_handlers.c b/protocols/vnc/src/vnc_handlers.c new file mode 100644 index 00000000..6b593bd1 --- /dev/null +++ b/protocols/vnc/src/vnc_handlers.c @@ -0,0 +1,342 @@ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is libguac-client-vnc. + * + * The Initial Developer of the Original Code is + * Michael Jumper. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include + +#include "client.h" +#include "convert.h" + +void guac_vnc_cursor(rfbClient* client, int x, int y, int w, int h, int bpp) { + + guac_client* gc = rfbClientGetClientData(client, __GUAC_CLIENT); + guac_socket* socket = gc->socket; + vnc_guac_client_data* guac_client_data = (vnc_guac_client_data*) gc->data; + const guac_layer* cursor_layer = guac_client_data->cursor; + + /* Cairo image buffer */ + int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, w); + unsigned char* buffer = malloc(h*stride); + unsigned char* buffer_row_current = buffer; + cairo_surface_t* surface; + + /* VNC image buffer */ + unsigned int fb_stride = bpp * w; + unsigned char* fb_row_current = client->rcSource; + unsigned char* fb_mask = client->rcMask; + + int dx, dy; + + /* Copy image data from VNC client to RGBA buffer */ + for (dy = 0; dy> client->format.redShift) * 0x100 / (client->format.redMax + 1); + green = (v >> client->format.greenShift) * 0x100 / (client->format.greenMax+ 1); + blue = (v >> client->format.blueShift) * 0x100 / (client->format.blueMax + 1); + + /* Output ARGB */ + if (guac_client_data->swap_red_blue) + *(buffer_current++) = (alpha << 24) | (blue << 16) | (green << 8) | red; + else + *(buffer_current++) = (alpha << 24) | (red << 16) | (green << 8) | blue; + + /* Next VNC pixel */ + fb_current += bpp; + + } + } + + /* Send cursor data*/ + surface = cairo_image_surface_create_for_data(buffer, CAIRO_FORMAT_ARGB32, w, h, stride); + guac_protocol_send_png(socket, + GUAC_COMP_SRC, cursor_layer, 0, 0, surface); + + /* Update cursor */ + guac_protocol_send_cursor(socket, x, y, cursor_layer, 0, 0, w, h); + + /* Free surface */ + cairo_surface_destroy(surface); + free(buffer); + + /* libvncclient does not free rcMask as it does rcSource */ + free(client->rcMask); +} + + +void guac_vnc_update(rfbClient* client, int x, int y, int w, int h) { + + guac_client* gc = rfbClientGetClientData(client, __GUAC_CLIENT); + vnc_guac_client_data* guac_client_data = (vnc_guac_client_data*) gc->data; + guac_socket* socket = gc->socket; + + int dx, dy; + + /* Cairo image buffer */ + int stride; + unsigned char* buffer; + unsigned char* buffer_row_current; + cairo_surface_t* surface; + + /* VNC framebuffer */ + unsigned int bpp; + unsigned int fb_stride; + unsigned char* fb_row_current; + + /* Ignore extra update if already handled by copyrect */ + if (guac_client_data->copy_rect_used) { + guac_client_data->copy_rect_used = 0; + return; + } + + /* Init Cairo buffer */ + stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, w); + buffer = malloc(h*stride); + buffer_row_current = buffer; + + bpp = client->format.bitsPerPixel/8; + fb_stride = bpp * client->width; + fb_row_current = client->frameBuffer + (y * fb_stride) + (x * bpp); + + /* Copy image data from VNC client to PNG */ + for (dy = y; dy> client->format.redShift) * 0x100 / (client->format.redMax + 1); + green = (v >> client->format.greenShift) * 0x100 / (client->format.greenMax+ 1); + blue = (v >> client->format.blueShift) * 0x100 / (client->format.blueMax + 1); + + /* Output RGB */ + if (guac_client_data->swap_red_blue) + *(buffer_current++) = (blue << 16) | (green << 8) | red; + else + *(buffer_current++) = (red << 16) | (green << 8) | blue; + + fb_current += bpp; + + } + } + + /* For now, only use default layer */ + surface = cairo_image_surface_create_for_data(buffer, CAIRO_FORMAT_RGB24, w, h, stride); + guac_protocol_send_png(socket, GUAC_COMP_OVER, GUAC_DEFAULT_LAYER, x, y, surface); + + /* Free surface */ + cairo_surface_destroy(surface); + free(buffer); + +} + +void guac_vnc_copyrect(rfbClient* client, int src_x, int src_y, int w, int h, int dest_x, int dest_y) { + + guac_client* gc = rfbClientGetClientData(client, __GUAC_CLIENT); + guac_socket* socket = gc->socket; + + /* For now, only use default layer */ + guac_protocol_send_copy(socket, + GUAC_DEFAULT_LAYER, src_x, src_y, w, h, + GUAC_COMP_OVER, GUAC_DEFAULT_LAYER, dest_x, dest_y); + + ((vnc_guac_client_data*) gc->data)->copy_rect_used = 1; + +} + +char* guac_vnc_get_password(rfbClient* client) { + guac_client* gc = rfbClientGetClientData(client, __GUAC_CLIENT); + return ((vnc_guac_client_data*) gc->data)->password; +} + +void guac_vnc_set_pixel_format(rfbClient* client, int color_depth) { + switch(color_depth) { + case 8: + client->format.depth = 8; + client->format.bitsPerPixel = 8; + client->format.blueShift = 6; + client->format.redShift = 0; + client->format.greenShift = 3; + client->format.blueMax = 3; + client->format.redMax = 7; + client->format.greenMax = 7; + break; + + case 16: + client->format.depth = 16; + client->format.bitsPerPixel = 16; + client->format.blueShift = 0; + client->format.redShift = 11; + client->format.greenShift = 5; + client->format.blueMax = 0x1f; + client->format.redMax = 0x1f; + client->format.greenMax = 0x3f; + break; + + case 24: + case 32: + default: + client->format.depth = 24; + client->format.bitsPerPixel = 32; + client->format.blueShift = 0; + client->format.redShift = 16; + client->format.greenShift = 8; + client->format.blueMax = 0xff; + client->format.redMax = 0xff; + client->format.greenMax = 0xff; + } +} + +rfbBool guac_vnc_malloc_framebuffer(rfbClient* rfb_client) { + + guac_client* gc = rfbClientGetClientData(rfb_client, __GUAC_CLIENT); + vnc_guac_client_data* guac_client_data = (vnc_guac_client_data*) gc->data; + + /* Send new size */ + guac_protocol_send_size(gc->socket, + GUAC_DEFAULT_LAYER, rfb_client->width, rfb_client->height); + + /* Use original, wrapped proc */ + return guac_client_data->rfb_MallocFrameBuffer(rfb_client); +} + +void guac_vnc_cut_text(rfbClient* client, const char* text, int textlen) { + + guac_client* gc = rfbClientGetClientData(client, __GUAC_CLIENT); + guac_socket* socket = gc->socket; + + /* Convert ASCII character data to UTF-8 */ + char* utf8_text = convert("ISO_8859-1", "UTF-8", text); + + guac_protocol_send_clipboard(socket, utf8_text); + + free(utf8_text); + +} + +void guac_vnc_client_log_info(const char* format, ...) { + + va_list args; + va_start(args, format); + + vsyslog(LOG_INFO, format, args); + + va_end(args); + +} + +void guac_vnc_client_log_error(const char* format, ...) { + + va_list args; + va_start(args, format); + + vsyslog(LOG_ERR, format, args); + + va_end(args); + +} +