Merge libguac-client-vnc.
This commit is contained in:
commit
2c8aa7f8d1
36
protocols/vnc/.gitignore
vendored
Normal file
36
protocols/vnc/.gitignore
vendored
Normal file
@ -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
|
||||||
|
|
3
protocols/vnc/AUTHORS
Normal file
3
protocols/vnc/AUTHORS
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Michael Jumper <zhangmaike@users.sourceforge.net>
|
||||||
|
James Muehlner <james.muehlner@guac-dev.org>
|
||||||
|
Saul Gio Perez <gio.perez@sv.cmu.edu>
|
31
protocols/vnc/ChangeLog
Normal file
31
protocols/vnc/ChangeLog
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
2013-05-23 James Muehlner <james.muehlner@guac-dev.org>
|
||||||
|
|
||||||
|
* convert() should return NULL only on malloc failure (fixes #313)
|
||||||
|
|
||||||
|
2013-02-07 Saul Gio Perez <gio.perez@sv.cmu.edu>
|
||||||
|
|
||||||
|
* Implement color-depth parameter (fixes #272)
|
||||||
|
|
||||||
|
2012-10-15 Michael Jumper <zhangmaike@users.sourceforge.net>
|
||||||
|
|
||||||
|
* Fix m4/ autoreconf error
|
||||||
|
|
||||||
|
2011-05-04 Michael Jumper <zhangmaike@users.sourceforge.net>
|
||||||
|
|
||||||
|
* 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 <zhangmaike@users.sourceforge.net>
|
||||||
|
|
||||||
|
* Migrated to 0.5.0 version of libguac API
|
||||||
|
|
||||||
|
2011-03-13 Michael Jumper <zhangmaike@users.sourceforge.net>
|
||||||
|
|
||||||
|
* Support for framebuffer resizing
|
||||||
|
* "encodings" argument
|
||||||
|
|
||||||
|
2011-02-28 Michael Jumper <zhangmaike@users.sourceforge.net>
|
||||||
|
|
||||||
|
* Initial release
|
||||||
|
|
470
protocols/vnc/LICENSE
Normal file
470
protocols/vnc/LICENSE
Normal file
@ -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.]
|
||||||
|
|
50
protocols/vnc/Makefile.am
Normal file
50
protocols/vnc/Makefile.am
Normal file
@ -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
|
||||||
|
|
75
protocols/vnc/README
Normal file
75
protocols/vnc/README
Normal file
@ -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/
|
||||||
|
|
57
protocols/vnc/configure.in
Normal file
57
protocols/vnc/configure.in
Normal file
@ -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
|
60
protocols/vnc/include/client.h
Normal file
60
protocols/vnc/include/client.h
Normal file
@ -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 <rfb/rfbclient.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
53
protocols/vnc/include/convert.h
Normal file
53
protocols/vnc/include/convert.h
Normal file
@ -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 <iconv.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
|
50
protocols/vnc/include/guac_handlers.h
Normal file
50
protocols/vnc/include/guac_handlers.h
Normal file
@ -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 <guacamole/client.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
54
protocols/vnc/include/vnc_handlers.h
Normal file
54
protocols/vnc/include/vnc_handlers.h
Normal file
@ -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 <rfb/rfbclient.h>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
12
protocols/vnc/m4/README
Normal file
12
protocols/vnc/m4/README
Normal file
@ -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.
|
172
protocols/vnc/src/client.c
Normal file
172
protocols/vnc/src/client.c
Normal file
@ -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 <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <rfb/rfbclient.h>
|
||||||
|
|
||||||
|
#include <guacamole/socket.h>
|
||||||
|
#include <guacamole/protocol.h>
|
||||||
|
#include <guacamole/client.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
116
protocols/vnc/src/convert.c
Normal file
116
protocols/vnc/src/convert.c
Normal file
@ -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 <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <iconv.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
145
protocols/vnc/src/guac_handlers.c
Normal file
145
protocols/vnc/src/guac_handlers.c
Normal file
@ -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 <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <iconv.h>
|
||||||
|
|
||||||
|
#include <rfb/rfbclient.h>
|
||||||
|
|
||||||
|
#include <guacamole/client.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
|
342
protocols/vnc/src/vnc_handlers.c
Normal file
342
protocols/vnc/src/vnc_handlers.c
Normal file
@ -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 <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
#include <iconv.h>
|
||||||
|
|
||||||
|
#include <cairo/cairo.h>
|
||||||
|
|
||||||
|
#include <rfb/rfbclient.h>
|
||||||
|
|
||||||
|
#include <guacamole/socket.h>
|
||||||
|
#include <guacamole/protocol.h>
|
||||||
|
#include <guacamole/client.h>
|
||||||
|
|
||||||
|
#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<h; dy++) {
|
||||||
|
|
||||||
|
unsigned int* buffer_current;
|
||||||
|
unsigned char* fb_current;
|
||||||
|
|
||||||
|
/* Get current buffer row, advance to next */
|
||||||
|
buffer_current = (unsigned int*) buffer_row_current;
|
||||||
|
buffer_row_current += stride;
|
||||||
|
|
||||||
|
/* Get current framebuffer row, advance to next */
|
||||||
|
fb_current = fb_row_current;
|
||||||
|
fb_row_current += fb_stride;
|
||||||
|
|
||||||
|
for (dx = 0; dx<w; dx++) {
|
||||||
|
|
||||||
|
unsigned char alpha, red, green, blue;
|
||||||
|
unsigned int v;
|
||||||
|
|
||||||
|
/* Read current pixel value */
|
||||||
|
switch (bpp) {
|
||||||
|
case 4:
|
||||||
|
v = *((unsigned int*) fb_current);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
v = *((unsigned short*) fb_current);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
v = *((unsigned char*) fb_current);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Translate mask to alpha */
|
||||||
|
if (*(fb_mask++)) alpha = 0xFF;
|
||||||
|
else alpha = 0x00;
|
||||||
|
|
||||||
|
/* Translate value to RGB */
|
||||||
|
red = (v >> 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<y+h; dy++) {
|
||||||
|
|
||||||
|
unsigned int* buffer_current;
|
||||||
|
unsigned char* fb_current;
|
||||||
|
|
||||||
|
/* Get current buffer row, advance to next */
|
||||||
|
buffer_current = (unsigned int*) buffer_row_current;
|
||||||
|
buffer_row_current += stride;
|
||||||
|
|
||||||
|
/* Get current framebuffer row, advance to next */
|
||||||
|
fb_current = fb_row_current;
|
||||||
|
fb_row_current += fb_stride;
|
||||||
|
|
||||||
|
for (dx = x; dx<x+w; dx++) {
|
||||||
|
|
||||||
|
unsigned char red, green, blue;
|
||||||
|
unsigned int v;
|
||||||
|
|
||||||
|
switch (bpp) {
|
||||||
|
case 4:
|
||||||
|
v = *((unsigned int*) fb_current);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
v = *((unsigned short*) fb_current);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
v = *((unsigned char*) fb_current);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Translate value to RGB */
|
||||||
|
red = (v >> 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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user