Merge libguac project.
This commit is contained in:
commit
801338b06b
48
libguac/.gitignore
vendored
Normal file
48
libguac/.gitignore
vendored
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
|
||||||
|
# Object code
|
||||||
|
*.o
|
||||||
|
*.so
|
||||||
|
*.lo
|
||||||
|
*.la
|
||||||
|
|
||||||
|
# Test binaries
|
||||||
|
tests/test_*
|
||||||
|
!tests/test_*.[ch]
|
||||||
|
|
||||||
|
# gcov files
|
||||||
|
*.gcda
|
||||||
|
*.gcov
|
||||||
|
*.gcno
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# Generated docs
|
||||||
|
doc/doxygen-output
|
||||||
|
|
1
libguac/AUTHORS
Normal file
1
libguac/AUTHORS
Normal file
@ -0,0 +1 @@
|
|||||||
|
Michael Jumper <zhangmaike@users.sourceforge.net>
|
55
libguac/ChangeLog
Normal file
55
libguac/ChangeLog
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
2012-10-25 Michael Jumper <zhangmzike@users.sourceforge.net>
|
||||||
|
|
||||||
|
* Implement video instruction
|
||||||
|
* Implement chunked write versions of audio/video functions
|
||||||
|
|
||||||
|
2012-10-24 Michael Jumper <zhangmzike@users.sourceforge.net>
|
||||||
|
|
||||||
|
* Implement audio instruction
|
||||||
|
|
||||||
|
2012-10-22 Michael Jumper <zhangmzike@users.sourceforge.net>
|
||||||
|
|
||||||
|
* Implement protocol nesting (via "nest" instruction)
|
||||||
|
* Add size events
|
||||||
|
* Add guac_client_info structure to be populated during handshake
|
||||||
|
|
||||||
|
2012-07-23 Michael Jumper <zhangmaike@users.sourceforge.net>
|
||||||
|
|
||||||
|
* Add unit tests for Unicode in protocol
|
||||||
|
* Fix handling of Unicode (UTF-8) characters in protocol
|
||||||
|
|
||||||
|
2012-05-23 David Pham-Van <d.pham-van@ulteo.com>
|
||||||
|
|
||||||
|
* Corrected padding in base64 encoding
|
||||||
|
|
||||||
|
2012-05-04 Michael Jumper <zhangmaike@users.sourceforge.net>
|
||||||
|
|
||||||
|
* Buffer/layer allocation and pooling fixes
|
||||||
|
* Automatic PNG palletization
|
||||||
|
* Fix error reporting
|
||||||
|
* Add log handlers for guac_client_plugin_get_client()
|
||||||
|
* Add layer and drawing instructions
|
||||||
|
* Reorganized source
|
||||||
|
* Raster operations
|
||||||
|
* Cacheable cursors
|
||||||
|
|
||||||
|
2011-12-11 Michael Jumper <zhangmaike@users.sourceforge.net>
|
||||||
|
|
||||||
|
* Added functions for alloc/free of layers and buffers
|
||||||
|
* Added "clip" instruction
|
||||||
|
* New, more efficient instruction format
|
||||||
|
* Fixed guac_write_base64 to match docs
|
||||||
|
* Added guac_error for error reporting and logging
|
||||||
|
* Consistent naming conventions
|
||||||
|
* Migrated daemon-specific functionality to guacd
|
||||||
|
* Made private members of structs private (using double-underscore prefix)
|
||||||
|
|
||||||
|
2011-03-14 Michael Jumper <zhangmaike@users.sourceforge.net>
|
||||||
|
|
||||||
|
* Lag control ("sync" message)
|
||||||
|
* Automatic message handle frequency limiting
|
||||||
|
|
||||||
|
2011-02-28 Michael Jumper <zhangmaike@users.sourceforge.net>
|
||||||
|
|
||||||
|
* Initial release
|
||||||
|
|
470
libguac/LICENSE
Normal file
470
libguac/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.]
|
||||||
|
|
43
libguac/Makefile.am
Normal file
43
libguac/Makefile.am
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# ***** 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.
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
|
||||||
|
SUBDIRS = src . tests
|
||||||
|
|
||||||
|
EXTRA_DIST = LICENSE doc/Doxyfile
|
||||||
|
|
79
libguac/README
Normal file
79
libguac/README
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
|
||||||
|
------------------------------------------------------------
|
||||||
|
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?
|
||||||
|
------------------------------------------------------------
|
||||||
|
|
||||||
|
libguac is the core library for guacd (the Guacamole proxy) and any protocol
|
||||||
|
support plugins for guacd.
|
||||||
|
|
||||||
|
libguac provides efficient buffered I/O of text and base64 data, as well as
|
||||||
|
somewhat abstracted functions for sending Guacamole instructions.
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------
|
||||||
|
Compiling and installing libguac
|
||||||
|
------------------------------------------------------------
|
||||||
|
|
||||||
|
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 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 will now compile.
|
||||||
|
|
||||||
|
3) Install (as root)
|
||||||
|
|
||||||
|
# make install
|
||||||
|
|
||||||
|
libguac will install to your /usr/local/lib directory by default. You can
|
||||||
|
change the install location by using the --prefix option for configure.
|
||||||
|
|
||||||
|
Several header files will also be installed to
|
||||||
|
/usr/local/include/guacamole.
|
||||||
|
|
||||||
|
You will need to run ldconfig (as root) so that the library can be found
|
||||||
|
when guacd is run:
|
||||||
|
|
||||||
|
# ldconfig
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------------------------------
|
||||||
|
Reporting problems
|
||||||
|
------------------------------------------------------------
|
||||||
|
|
||||||
|
Please report any bugs encountered by opening a new ticket at the Trac system
|
||||||
|
hosted at:
|
||||||
|
|
||||||
|
http://guac-dev.org/trac/
|
||||||
|
|
79
libguac/configure.in
Normal file
79
libguac/configure.in
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
# ***** 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.
|
||||||
|
#
|
||||||
|
# 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, 0.7.0)
|
||||||
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
|
||||||
|
# Checks for programs.
|
||||||
|
AC_PROG_CC
|
||||||
|
AC_PROG_CC_C99
|
||||||
|
AC_PROG_LIBTOOL
|
||||||
|
|
||||||
|
# POSIX
|
||||||
|
AC_DEFINE(_POSIX_C_SOURCE, 199309L)
|
||||||
|
|
||||||
|
# BSD
|
||||||
|
AC_DEFINE(_BSD_SOURCE)
|
||||||
|
|
||||||
|
# Checks for libraries.
|
||||||
|
AC_CHECK_LIB([dl], [dlopen],, AC_MSG_ERROR("libdl is required for loading client plugins"))
|
||||||
|
AC_CHECK_LIB([png], [png_write_png],, AC_MSG_ERROR("libpng is required for writing png messages"))
|
||||||
|
AC_CHECK_LIB([cairo], [cairo_create],, AC_MSG_ERROR("cairo is required for drawing instructions"))
|
||||||
|
AC_CHECK_LIB([pthread], [pthread_create])
|
||||||
|
AC_CHECK_LIB([wsock32], [main])
|
||||||
|
|
||||||
|
# Checks for header files.
|
||||||
|
AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/socket.h time.h sys/time.h syslog.h unistd.h cairo/cairo.h pngstruct.h])
|
||||||
|
|
||||||
|
# Checks for typedefs, structures, and compiler characteristics.
|
||||||
|
AC_TYPE_SIZE_T
|
||||||
|
AC_TYPE_SSIZE_T
|
||||||
|
|
||||||
|
# Checks for library functions.
|
||||||
|
AC_FUNC_MALLOC
|
||||||
|
AC_FUNC_REALLOC
|
||||||
|
AC_CHECK_FUNCS([clock_gettime gettimeofday memmove memset select strdup png_get_io_ptr nanosleep])
|
||||||
|
|
||||||
|
# Check for unit testing library
|
||||||
|
AC_CHECK_LIB([cunit], [CU_run_test], [CUNIT_LIBS=-lcunit])
|
||||||
|
AC_SUBST(CUNIT_LIBS)
|
||||||
|
|
||||||
|
AC_CONFIG_FILES([Makefile
|
||||||
|
src/Makefile
|
||||||
|
tests/Makefile])
|
||||||
|
|
||||||
|
AC_OUTPUT
|
1551
libguac/doc/Doxyfile
Normal file
1551
libguac/doc/Doxyfile
Normal file
File diff suppressed because it is too large
Load Diff
125
libguac/include/client-handlers.h
Normal file
125
libguac/include/client-handlers.h
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_CLIENT_HANDLERS__H
|
||||||
|
#define _GUAC_CLIENT_HANDLERS__H
|
||||||
|
|
||||||
|
#include "client.h"
|
||||||
|
#include "instruction.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides initial handler functions and a lookup structure for automatically
|
||||||
|
* handling client instructions. This is used only internally within libguac,
|
||||||
|
* and is not installed along with the library.
|
||||||
|
*
|
||||||
|
* @file client-handlers.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal handler for Guacamole instructions.
|
||||||
|
*/
|
||||||
|
typedef int __guac_instruction_handler(guac_client* client, guac_instruction* copied);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure mapping an instruction opcode to an instruction handler.
|
||||||
|
*/
|
||||||
|
typedef struct __guac_instruction_handler_mapping {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The instruction opcode which maps to a specific handler.
|
||||||
|
*/
|
||||||
|
char* opcode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The handler which maps to a specific opcode.
|
||||||
|
*/
|
||||||
|
__guac_instruction_handler* handler;
|
||||||
|
|
||||||
|
} __guac_instruction_handler_mapping;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal initial handler for the sync instruction. When a sync instruction
|
||||||
|
* is received, this handler will be called. Sync instructions are automatically
|
||||||
|
* handled, thus there is no client handler for sync instruction.
|
||||||
|
*/
|
||||||
|
int __guac_handle_sync(guac_client* client, guac_instruction* instruction);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal initial handler for the mouse instruction. When a mouse instruction
|
||||||
|
* is received, this handler will be called. The client's mouse handler will
|
||||||
|
* be invoked if defined.
|
||||||
|
*/
|
||||||
|
int __guac_handle_mouse(guac_client* client, guac_instruction* instruction);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal initial handler for the key instruction. When a key instruction
|
||||||
|
* is received, this handler will be called. The client's key handler will
|
||||||
|
* be invoked if defined.
|
||||||
|
*/
|
||||||
|
int __guac_handle_key(guac_client* client, guac_instruction* instruction);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal initial handler for the clipboard instruction. When a clipboard instruction
|
||||||
|
* is received, this handler will be called. The client's clipboard handler will
|
||||||
|
* be invoked if defined.
|
||||||
|
*/
|
||||||
|
int __guac_handle_clipboard(guac_client* client, guac_instruction* instruction);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal initial handler for the size instruction. When a size instruction
|
||||||
|
* is received, this handler will be called. The client's size handler will
|
||||||
|
* be invoked if defined.
|
||||||
|
*/
|
||||||
|
int __guac_handle_size(guac_client* client, guac_instruction* instruction);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal initial handler for the disconnect instruction. When a disconnect instruction
|
||||||
|
* is received, this handler will be called. Disconnect instructions are automatically
|
||||||
|
* handled, thus there is no client handler for disconnect instruction.
|
||||||
|
*/
|
||||||
|
int __guac_handle_disconnect(guac_client* client, guac_instruction* instruction);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instruction handler mapping table. This is a NULL-terminated array of
|
||||||
|
* __guac_instruction_handler_mapping structures, each mapping an opcode
|
||||||
|
* to a __guac_instruction_handler. The end of the array must be marked
|
||||||
|
* with a __guac_instruction_handler_mapping with the opcode set to
|
||||||
|
* NULL (the NULL terminator).
|
||||||
|
*/
|
||||||
|
extern __guac_instruction_handler_mapping __guac_instruction_handler_map[];
|
||||||
|
|
||||||
|
#endif
|
597
libguac/include/client.h
Normal file
597
libguac/include/client.h
Normal file
@ -0,0 +1,597 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_CLIENT_H
|
||||||
|
#define _GUAC_CLIENT_H
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "instruction.h"
|
||||||
|
#include "layer.h"
|
||||||
|
#include "pool.h"
|
||||||
|
#include "socket.h"
|
||||||
|
#include "stream.h"
|
||||||
|
#include "timestamp.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides functions and structures required for defining (and handling) a proxy client.
|
||||||
|
*
|
||||||
|
* @file client.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct guac_client guac_client;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for server messages (where "server" refers to the server that
|
||||||
|
* the proxy client is connected to).
|
||||||
|
*/
|
||||||
|
typedef int guac_client_handle_messages(guac_client* client);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for Guacamole mouse events.
|
||||||
|
*/
|
||||||
|
typedef int guac_client_mouse_handler(guac_client* client, int x, int y, int button_mask);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for Guacamole key events.
|
||||||
|
*/
|
||||||
|
typedef int guac_client_key_handler(guac_client* client, int keysym, int pressed);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for Guacamole clipboard events.
|
||||||
|
*/
|
||||||
|
typedef int guac_client_clipboard_handler(guac_client* client, char* copied);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for Guacamole screen size events.
|
||||||
|
*/
|
||||||
|
typedef int guac_client_size_handler(guac_client* client,
|
||||||
|
int width, int height);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for Guacamole audio format events.
|
||||||
|
*/
|
||||||
|
typedef int guac_client_audio_handler(guac_client* client, char* mimetype);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for Guacamole video format events.
|
||||||
|
*/
|
||||||
|
typedef int guac_client_video_handler(guac_client* client, char* mimetype);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for freeing up any extra data allocated by the client
|
||||||
|
* implementation.
|
||||||
|
*/
|
||||||
|
typedef int guac_client_free_handler(guac_client* client);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for logging messages
|
||||||
|
*/
|
||||||
|
typedef void guac_client_log_handler(guac_client* client, const char* format, va_list args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler which should initialize the given guac_client.
|
||||||
|
*/
|
||||||
|
typedef int guac_client_init_handler(guac_client* client, int argc, char** argv);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The flag set in the mouse button mask when the left mouse button is down.
|
||||||
|
*/
|
||||||
|
#define GUAC_CLIENT_MOUSE_LEFT 0x01
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The flag set in the mouse button mask when the middle mouse button is down.
|
||||||
|
*/
|
||||||
|
#define GUAC_CLIENT_MOUSE_MIDDLE 0x02
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The flag set in the mouse button mask when the right mouse button is down.
|
||||||
|
*/
|
||||||
|
#define GUAC_CLIENT_MOUSE_RIGHT 0x04
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The flag set in the mouse button mask when the mouse scrollwheel is scrolled
|
||||||
|
* up. Note that mouse scrollwheels are actually sets of two buttons. One
|
||||||
|
* button is pressed and released for an upward scroll, and the other is
|
||||||
|
* pressed and released for a downward scroll. Some mice may actually implement
|
||||||
|
* these as separate buttons, not a wheel.
|
||||||
|
*/
|
||||||
|
#define GUAC_CLIENT_MOUSE_SCROLL_UP 0x08
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The flag set in the mouse button mask when the mouse scrollwheel is scrolled
|
||||||
|
* down. Note that mouse scrollwheels are actually sets of two buttons. One
|
||||||
|
* button is pressed and released for an upward scroll, and the other is
|
||||||
|
* pressed and released for a downward scroll. Some mice may actually implement
|
||||||
|
* these as separate buttons, not a wheel.
|
||||||
|
*/
|
||||||
|
#define GUAC_CLIENT_MOUSE_SCROLL_DOWN 0x10
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The minimum number of buffers to create before allowing free'd buffers to
|
||||||
|
* be reclaimed. In the case a protocol rapidly creates, uses, and destroys
|
||||||
|
* buffers, this can prevent unnecessary reuse of the same buffer (which
|
||||||
|
* would make draw operations unnecessarily synchronous).
|
||||||
|
*/
|
||||||
|
#define GUAC_BUFFER_POOL_INITIAL_SIZE 1024
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Possible current states of the Guacamole client. Currently, the only
|
||||||
|
* two states are GUAC_CLIENT_RUNNING and GUAC_CLIENT_STOPPING.
|
||||||
|
*/
|
||||||
|
typedef enum guac_client_state {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The state of the client from when it has been allocated by the main
|
||||||
|
* daemon until it is killed or disconnected.
|
||||||
|
*/
|
||||||
|
GUAC_CLIENT_RUNNING,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The state of the client when a stop has been requested, signalling the
|
||||||
|
* I/O threads to shutdown.
|
||||||
|
*/
|
||||||
|
GUAC_CLIENT_STOPPING
|
||||||
|
|
||||||
|
} guac_client_state;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Information exposed by the remote client during the connection handshake
|
||||||
|
* which can be used by a client plugin.
|
||||||
|
*/
|
||||||
|
typedef struct guac_client_info {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of pixels the remote client requests for the display width.
|
||||||
|
* This need not be honored by a client plugin implementation, but if the
|
||||||
|
* underlying protocol of the client plugin supports dynamic sizing of the
|
||||||
|
* screen, honoring the display size request is recommended.
|
||||||
|
*/
|
||||||
|
int optimal_width;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of pixels the remote client requests for the display height.
|
||||||
|
* This need not be honored by a client plugin implementation, but if the
|
||||||
|
* underlying protocol of the client plugin supports dynamic sizing of the
|
||||||
|
* screen, honoring the display size request is recommended.
|
||||||
|
*/
|
||||||
|
int optimal_height;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NULL-terminated array of client-supported audio mimetypes. If the client
|
||||||
|
* does not support audio at all, this will be NULL.
|
||||||
|
*/
|
||||||
|
const char** audio_mimetypes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NULL-terminated array of client-supported video mimetypes. If the client
|
||||||
|
* does not support video at all, this will be NULL.
|
||||||
|
*/
|
||||||
|
const char** video_mimetypes;
|
||||||
|
|
||||||
|
} guac_client_info;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Guacamole proxy client.
|
||||||
|
*
|
||||||
|
* Represents a Guacamole proxy client (the client which communicates to
|
||||||
|
* a server on behalf of Guacamole, on behalf of the web-client).
|
||||||
|
*/
|
||||||
|
struct guac_client {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The guac_socket structure to be used to communicate with the web-client.
|
||||||
|
* It is expected that the implementor of any Guacamole proxy client will
|
||||||
|
* provide their own mechanism of I/O for their protocol. The guac_socket
|
||||||
|
* structure is used only to communicate conveniently with the Guacamole
|
||||||
|
* web-client.
|
||||||
|
*/
|
||||||
|
guac_socket* socket;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current state of the client. When the client is first allocated,
|
||||||
|
* this will be initialized to GUAC_CLIENT_RUNNING. It will remain at
|
||||||
|
* GUAC_CLIENT_RUNNING until an event occurs which requires the client to
|
||||||
|
* shutdown, at which point the state becomes GUAC_CLIENT_STOPPING.
|
||||||
|
*/
|
||||||
|
guac_client_state state;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The time (in milliseconds) of receipt of the last sync message from
|
||||||
|
* the client.
|
||||||
|
*/
|
||||||
|
guac_timestamp last_received_timestamp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The time (in milliseconds) that the last sync message was sent to the
|
||||||
|
* client.
|
||||||
|
*/
|
||||||
|
guac_timestamp last_sent_timestamp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Information structure containing properties exposed by the remote
|
||||||
|
* client during the initial handshake process.
|
||||||
|
*/
|
||||||
|
guac_client_info info;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Arbitrary reference to proxy client-specific data. Implementors of a
|
||||||
|
* Guacamole proxy client can store any data they want here, which can then
|
||||||
|
* be retrieved as necessary in the message handlers.
|
||||||
|
*/
|
||||||
|
void* data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for server messages. If set, this function will be called
|
||||||
|
* occasionally by the Guacamole proxy to give the client a chance to
|
||||||
|
* handle messages from whichever server it is connected to.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* @code
|
||||||
|
* int handle_messages(guac_client* client);
|
||||||
|
*
|
||||||
|
* int guac_client_init(guac_client* client, int argc, char** argv) {
|
||||||
|
* client->handle_messages = handle_messages;
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
guac_client_handle_messages* handle_messages;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for mouse events sent by the Gaucamole web-client.
|
||||||
|
*
|
||||||
|
* The handler takes the integer mouse X and Y coordinates, as well as
|
||||||
|
* a button mask containing the bitwise OR of all button values currently
|
||||||
|
* being pressed. Those values are:
|
||||||
|
*
|
||||||
|
* <table>
|
||||||
|
* <tr><th>Button</th> <th>Value</th></tr>
|
||||||
|
* <tr><td>Left</td> <td>1</td></tr>
|
||||||
|
* <tr><td>Middle</td> <td>2</td></tr>
|
||||||
|
* <tr><td>Right</td> <td>4</td></tr>
|
||||||
|
* <tr><td>Scrollwheel Up</td> <td>8</td></tr>
|
||||||
|
* <tr><td>Scrollwheel Down</td><td>16</td></tr>
|
||||||
|
* </table>
|
||||||
|
|
||||||
|
* Example:
|
||||||
|
* @code
|
||||||
|
* int mouse_handler(guac_client* client, int x, int y, int button_mask);
|
||||||
|
*
|
||||||
|
* int guac_client_init(guac_client* client, int argc, char** argv) {
|
||||||
|
* client->mouse_handler = mouse_handler;
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
guac_client_mouse_handler* mouse_handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for key events sent by the Guacamole web-client.
|
||||||
|
*
|
||||||
|
* The handler takes the integer X11 keysym associated with the key
|
||||||
|
* being pressed/released, and an integer representing whether the key
|
||||||
|
* is being pressed (1) or released (0).
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* @code
|
||||||
|
* int key_handler(guac_client* client, int keysym, int pressed);
|
||||||
|
*
|
||||||
|
* int guac_client_init(guac_client* client, int argc, char** argv) {
|
||||||
|
* client->key_handler = key_handler;
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
guac_client_key_handler* key_handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for clipboard events sent by the Guacamole web-client. This
|
||||||
|
* handler will be called whenever the web-client sets the data of the
|
||||||
|
* clipboard.
|
||||||
|
*
|
||||||
|
* This handler takes a single string which contains the text which
|
||||||
|
* has been set in the clipboard. This text is already unescaped from
|
||||||
|
* the Guacamole escaped version sent within the clipboard message
|
||||||
|
* in the protocol.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* @code
|
||||||
|
* int clipboard_handler(guac_client* client, char* copied);
|
||||||
|
*
|
||||||
|
* int guac_client_init(guac_client* client, int argc, char** argv) {
|
||||||
|
* client->clipboard_handler = clipboard_handler;
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
guac_client_clipboard_handler* clipboard_handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for size events sent by the Guacamole web-client.
|
||||||
|
*
|
||||||
|
* The handler takes an integer width and integer height, representing
|
||||||
|
* the current visible screen area of the client.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* @code
|
||||||
|
* int size_handler(guac_client* client, int width, int height);
|
||||||
|
*
|
||||||
|
* int guac_client_init(guac_client* client, int argc, char** argv) {
|
||||||
|
* client->size_handler = size_handler;
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
guac_client_size_handler* size_handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for freeing data when the client is being unloaded.
|
||||||
|
*
|
||||||
|
* This handler will be called when the client needs to be unloaded
|
||||||
|
* by the proxy, and any data allocated by the proxy client should be
|
||||||
|
* freed.
|
||||||
|
*
|
||||||
|
* Note that this handler will NOT be called if the client's
|
||||||
|
* guac_client_init() function fails.
|
||||||
|
*
|
||||||
|
* Implement this handler if you store data inside the client.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* @code
|
||||||
|
* int free_handler(guac_client* client);
|
||||||
|
*
|
||||||
|
* int guac_client_init(guac_client* client, int argc, char** argv) {
|
||||||
|
* client->free_handler = free_handler;
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
guac_client_free_handler* free_handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for logging informational messages. This handler will be called
|
||||||
|
* via guac_client_log_info() when the client needs to log information.
|
||||||
|
*
|
||||||
|
* In general, only programs loading the client should implement this
|
||||||
|
* handler, as those are the programs that would provide the logging
|
||||||
|
* facilities.
|
||||||
|
*
|
||||||
|
* Client implementations should expect these handlers to already be
|
||||||
|
* set.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* @code
|
||||||
|
* void log_handler(guac_client* client, const char* format, va_list args);
|
||||||
|
*
|
||||||
|
* void function_of_daemon() {
|
||||||
|
*
|
||||||
|
* guac_client* client = [pass log_handler to guac_client_plugin_get_client()];
|
||||||
|
*
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
guac_client_log_handler* log_info_handler;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for logging error messages. This handler will be called
|
||||||
|
* via guac_client_log_error() when the client needs to log an error.
|
||||||
|
*
|
||||||
|
* In general, only programs loading the client should implement this
|
||||||
|
* handler, as those are the programs that would provide the logging
|
||||||
|
* facilities.
|
||||||
|
*
|
||||||
|
* Client implementations should expect these handlers to already be
|
||||||
|
* set.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* @code
|
||||||
|
* void log_handler(guac_client* client, const char* format, va_list args);
|
||||||
|
*
|
||||||
|
* void function_of_daemon() {
|
||||||
|
*
|
||||||
|
* guac_client* client = [pass log_handler to guac_client_plugin_get_client()];
|
||||||
|
*
|
||||||
|
* }
|
||||||
|
* @endcode
|
||||||
|
*/
|
||||||
|
guac_client_log_handler* log_error_handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pool of buffer indices. Buffers are simply layers with negative indices.
|
||||||
|
* Note that because guac_pool always gives non-negative indices starting
|
||||||
|
* at 0, the output of this guac_pool will be adjusted.
|
||||||
|
*/
|
||||||
|
guac_pool* __buffer_pool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pool of layer indices. Note that because guac_pool always gives
|
||||||
|
* non-negative indices starting at 0, the output of this guac_pool will
|
||||||
|
* be adjusted.
|
||||||
|
*/
|
||||||
|
guac_pool* __layer_pool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pool of stream indices.
|
||||||
|
*/
|
||||||
|
guac_pool* __stream_pool;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new, barebones guac_client. This new guac_client has no handlers
|
||||||
|
* set, but is otherwise usable.
|
||||||
|
*
|
||||||
|
* @return A pointer to the new client.
|
||||||
|
*/
|
||||||
|
guac_client* guac_client_alloc();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free all resources associated with the given client.
|
||||||
|
*
|
||||||
|
* @param client The proxy client to free all reasources of.
|
||||||
|
*/
|
||||||
|
void guac_client_free(guac_client* client);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Call the appropriate handler defined by the given client for the given
|
||||||
|
* instruction. A comparison is made between the instruction opcode and the
|
||||||
|
* initial handler lookup table defined in client-handlers.c. The intial
|
||||||
|
* handlers will in turn call the client's handler (if defined).
|
||||||
|
*
|
||||||
|
* @param client The proxy client whose handlers should be called.
|
||||||
|
* @param instruction The instruction to pass to the proxy client via the
|
||||||
|
* appropriate handler.
|
||||||
|
*/
|
||||||
|
int guac_client_handle_instruction(guac_client* client, guac_instruction* instruction);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logs an informational message in the log used by the given client. The
|
||||||
|
* logger used will normally be defined by guacd (or whichever program loads
|
||||||
|
* the proxy client) by setting the logging handlers of the client when it is
|
||||||
|
* loaded.
|
||||||
|
*
|
||||||
|
* @param client The proxy client to log an informational message for.
|
||||||
|
* @param format A printf-style format string to log.
|
||||||
|
* @param ... Arguments to use when filling the format string for printing.
|
||||||
|
*/
|
||||||
|
void guac_client_log_info(guac_client* client, const char* format, ...);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logs an error message in the log used by the given client. The logger
|
||||||
|
* used will normally be defined by guacd (or whichever program loads the
|
||||||
|
* proxy client) by setting the logging handlers of the client when it is
|
||||||
|
* loaded.
|
||||||
|
*
|
||||||
|
* @param client The proxy client to log an error for.
|
||||||
|
* @param format A printf-style format string to log.
|
||||||
|
* @param ... Arguments to use when filling the format string for printing.
|
||||||
|
*/
|
||||||
|
void guac_client_log_error(guac_client* client, const char* format, ...);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logs an informational message in the log used by the given client. The
|
||||||
|
* logger used will normally be defined by guacd (or whichever program loads
|
||||||
|
* the proxy client) by setting the logging handlers of the client when it is
|
||||||
|
* loaded.
|
||||||
|
*
|
||||||
|
* @param client The proxy client to log an informational message for.
|
||||||
|
* @param format A printf-style format string to log.
|
||||||
|
* @param ap The va_list containing the arguments to be used when filling the
|
||||||
|
* format string for printing.
|
||||||
|
*/
|
||||||
|
void vguac_client_log_info(guac_client* client, const char* format, va_list ap);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Logs an error message in the log used by the given client. The logger
|
||||||
|
* used will normally be defined by guacd (or whichever program loads the
|
||||||
|
* proxy client) by setting the logging handlers of the client when it is
|
||||||
|
* loaded.
|
||||||
|
*
|
||||||
|
* @param client The proxy client to log an error for.
|
||||||
|
* @param format A printf-style format string to log.
|
||||||
|
* @param ap The va_list containing the arguments to be used when filling the
|
||||||
|
* format string for printing.
|
||||||
|
*/
|
||||||
|
void vguac_client_log_error(guac_client* client, const char* format, va_list ap);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signals the given client to stop gracefully. This is a completely
|
||||||
|
* cooperative signal, and can be ignored by the client or the hosting
|
||||||
|
* daemon.
|
||||||
|
*
|
||||||
|
* @param client The proxy client to signal to stop.
|
||||||
|
*/
|
||||||
|
void guac_client_stop(guac_client* client);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new buffer (invisible layer). An arbitrary index is
|
||||||
|
* automatically assigned if no existing buffer is available for use.
|
||||||
|
*
|
||||||
|
* @param client The proxy client to allocate the buffer for.
|
||||||
|
* @return The next available buffer, or a newly allocated buffer.
|
||||||
|
*/
|
||||||
|
guac_layer* guac_client_alloc_buffer(guac_client* client);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new layer. An arbitrary index is automatically assigned
|
||||||
|
* if no existing layer is available for use.
|
||||||
|
*
|
||||||
|
* @param client The proxy client to allocate the layer buffer for.
|
||||||
|
* @return The next available layer, or a newly allocated layer.
|
||||||
|
*/
|
||||||
|
guac_layer* guac_client_alloc_layer(guac_client* client);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the given buffer to the pool of available buffers, such that it
|
||||||
|
* can be reused by any subsequent call to guac_client_allow_buffer().
|
||||||
|
*
|
||||||
|
* @param client The proxy client to return the buffer to.
|
||||||
|
* @param layer The buffer to return to the pool of available buffers.
|
||||||
|
*/
|
||||||
|
void guac_client_free_buffer(guac_client* client, guac_layer* layer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the given layer to the pool of available layers, such that it
|
||||||
|
* can be reused by any subsequent call to guac_client_allow_layer().
|
||||||
|
*
|
||||||
|
* @param client The proxy client to return the layer to.
|
||||||
|
* @param layer The buffer to return to the pool of available layer.
|
||||||
|
*/
|
||||||
|
void guac_client_free_layer(guac_client* client, guac_layer* layer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new stream. An arbitrary index is automatically assigned
|
||||||
|
* if no previously-allocated stream is available for use.
|
||||||
|
*
|
||||||
|
* @param client The proxy client to allocate the layer buffer for.
|
||||||
|
* @return The next available stream, or a newly allocated stream.
|
||||||
|
*/
|
||||||
|
guac_stream* guac_client_alloc_stream(guac_client* client);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the given stream to the pool of available streams, such that it
|
||||||
|
* can be reused by any subsequent call to guac_client_alloc_stream().
|
||||||
|
*
|
||||||
|
* @param client The proxy client to return the buffer to.
|
||||||
|
* @param stream The stream to return to the pool of available stream.
|
||||||
|
*/
|
||||||
|
void guac_client_free_stream(guac_client* client, guac_stream* stream);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default Guacamole client layer, layer 0.
|
||||||
|
*/
|
||||||
|
extern const guac_layer* GUAC_DEFAULT_LAYER;
|
||||||
|
|
||||||
|
#endif
|
132
libguac/include/error.h
Normal file
132
libguac/include/error.h
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_ERROR_H
|
||||||
|
#define _GUAC_ERROR_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides functions and structures required for handling return values and
|
||||||
|
* errors.
|
||||||
|
*
|
||||||
|
* @file error.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return codes shared by all Guacamole functions which can fail.
|
||||||
|
*/
|
||||||
|
typedef enum guac_status {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* No errors occurred and the operation was successful.
|
||||||
|
*/
|
||||||
|
GUAC_STATUS_SUCCESS = 0,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Insufficient memory to complete the operation.
|
||||||
|
*/
|
||||||
|
GUAC_STATUS_NO_MEMORY,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The end of the input stream associated with the operation
|
||||||
|
* has been reached.
|
||||||
|
*/
|
||||||
|
GUAC_STATUS_NO_INPUT,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A timeout occurred while reading from the input stream associated
|
||||||
|
* with the operation.
|
||||||
|
*/
|
||||||
|
GUAC_STATUS_INPUT_TIMEOUT,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An error occurred, and further information about the error is already
|
||||||
|
* stored in errno.
|
||||||
|
*/
|
||||||
|
GUAC_STATUS_SEE_ERRNO,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An error prevented the operation from writing to its associated
|
||||||
|
* output stream.
|
||||||
|
*/
|
||||||
|
GUAC_STATUS_OUTPUT_ERROR,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The operation could not be performed because an invalid argument was
|
||||||
|
* given.
|
||||||
|
*/
|
||||||
|
GUAC_STATUS_BAD_ARGUMENT,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The state of the associated system prevents an operation from being
|
||||||
|
* performed which would otherwise be allowed.
|
||||||
|
*/
|
||||||
|
GUAC_STATUS_BAD_STATE
|
||||||
|
|
||||||
|
} guac_status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a human-readable explanation of the status code given.
|
||||||
|
*/
|
||||||
|
const char* guac_status_string(guac_status status);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the status code associated with the error which occurred during the
|
||||||
|
* last function call. This value will only be set by functions documented to
|
||||||
|
* use it (most libguac functions), and is undefined if no error occurred.
|
||||||
|
*
|
||||||
|
* The storage of this value is thread-local. Assignment of a status code to
|
||||||
|
* guac_error in one thread will not affect its value in another thread.
|
||||||
|
*/
|
||||||
|
#define guac_error (*__guac_error())
|
||||||
|
|
||||||
|
guac_status* __guac_error();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a message describing the error which occurred during the last
|
||||||
|
* function call. If an error occurred, but no message is associated with it,
|
||||||
|
* NULL is returned. This value is undefined if no error occurred.
|
||||||
|
*
|
||||||
|
* The storage of this value is thread-local. Assignment of a message to
|
||||||
|
* guac_error_message in one thread will not affect its value in another
|
||||||
|
* thread.
|
||||||
|
*/
|
||||||
|
#define guac_error_message (*__guac_error_message())
|
||||||
|
|
||||||
|
const char** __guac_error_message();
|
||||||
|
|
||||||
|
#endif
|
76
libguac/include/hash.h
Normal file
76
libguac/include/hash.h
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_HASH_H
|
||||||
|
#define _GUAC_HASH_H
|
||||||
|
|
||||||
|
#include <cairo/cairo.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides functions and structures for producing likely-to-be-unique hash
|
||||||
|
* values for images.
|
||||||
|
*
|
||||||
|
* @file hash.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Produces a 24-bit hash value from all pixels of the given surface. The
|
||||||
|
* surface provided must be RGB or ARGB with each pixel stored in 32 bits.
|
||||||
|
* The hashing algorithm used is a variant of the cyclic polynomial rolling
|
||||||
|
* hash.
|
||||||
|
*
|
||||||
|
* @param surface The Cairo surface to hash.
|
||||||
|
* @return An arbitrary 24-bit unsigned integer value intended to be well
|
||||||
|
* distributed across different images.
|
||||||
|
*/
|
||||||
|
unsigned int guac_hash_surface(cairo_surface_t* surface);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given two Cairo surfaces, returns zero if the data contained within each
|
||||||
|
* is identical, and a positive or negative value if the value of the first
|
||||||
|
* is found to be lexically greater or less than the second respectively.
|
||||||
|
*
|
||||||
|
* @param a The first Cairo surface to compare.
|
||||||
|
* @param b The Cairo surface to compare the first surface against.
|
||||||
|
* @return Zero if the data contained within each is identical, and a positive
|
||||||
|
* or negative value if the value of the first is found to be lexically
|
||||||
|
* greater or less than the second respectively.
|
||||||
|
*/
|
||||||
|
int guac_surface_cmp(cairo_surface_t* a, cairo_surface_t* b);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
133
libguac/include/instruction.h
Normal file
133
libguac/include/instruction.h
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_INSTRUCTION_H
|
||||||
|
#define _GUAC_INSTRUCTION_H
|
||||||
|
|
||||||
|
#include "socket.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides functions and structures for reading, writing, and manipulating
|
||||||
|
* Guacamole instructions.
|
||||||
|
*
|
||||||
|
* @file instruction.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a single instruction within the Guacamole protocol.
|
||||||
|
*/
|
||||||
|
typedef struct guac_instruction {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The opcode of the instruction.
|
||||||
|
*/
|
||||||
|
char* opcode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of arguments passed to this instruction.
|
||||||
|
*/
|
||||||
|
int argc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of all arguments passed to this instruction.
|
||||||
|
*/
|
||||||
|
char** argv;
|
||||||
|
|
||||||
|
} guac_instruction;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frees all memory allocated to the given instruction.
|
||||||
|
*
|
||||||
|
* @param instruction The instruction to free.
|
||||||
|
*/
|
||||||
|
void guac_instruction_free(guac_instruction* instruction);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether new instruction data is available on the given guac_socket
|
||||||
|
* connection for parsing.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param usec_timeout The maximum number of microseconds to wait before
|
||||||
|
* giving up.
|
||||||
|
* @return A positive value if data is available, negative on error, or
|
||||||
|
* zero if no data is currently available.
|
||||||
|
*/
|
||||||
|
int guac_instruction_waiting(guac_socket* socket, int usec_timeout);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a single instruction from the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs reading the instruction, NULL is returned,
|
||||||
|
* and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param usec_timeout The maximum number of microseconds to wait before
|
||||||
|
* giving up.
|
||||||
|
* @return A new instruction if data was successfully read, NULL on
|
||||||
|
* error or if the instruction could not be read completely
|
||||||
|
* because the timeout elapsed, in which case guac_error will be
|
||||||
|
* set to GUAC_STATUS_INPUT_TIMEOUT and subsequent calls to
|
||||||
|
* guac_protocol_read_instruction() will return the parsed instruction
|
||||||
|
* once enough data is available.
|
||||||
|
*/
|
||||||
|
guac_instruction* guac_instruction_read(guac_socket* socket, int usec_timeout);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a single instruction with the given opcode from the given guac_socket
|
||||||
|
* connection.
|
||||||
|
*
|
||||||
|
* If an error occurs reading the instruction, NULL is returned,
|
||||||
|
* and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* If the instruction read is not the expected instruction, NULL is returned,
|
||||||
|
* and guac_error is set to GUAC_STATUS_BAD_STATE.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param usec_timeout The maximum number of microseconds to wait before
|
||||||
|
* giving up.
|
||||||
|
* @param opcode The opcode of the instruction to read.
|
||||||
|
* @return A new instruction if an instruction with the given opcode was read,
|
||||||
|
* NULL otherwise. If an instruction was read, but the instruction had
|
||||||
|
* a different opcode, NULL is returned and guac_error is set to
|
||||||
|
* GUAC_STATUS_BAD_STATE.
|
||||||
|
*/
|
||||||
|
guac_instruction* guac_instruction_expect(guac_socket* socket,
|
||||||
|
int usec_timeout, const char* opcode);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
62
libguac/include/layer.h
Normal file
62
libguac/include/layer.h
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_LAYER_H
|
||||||
|
#define _GUAC_LAYER_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides functions and structures required for allocating and using layers.
|
||||||
|
*
|
||||||
|
* @file layer.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct guac_layer guac_layer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a single layer within the Guacamole protocol.
|
||||||
|
*/
|
||||||
|
struct guac_layer {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The index of this layer.
|
||||||
|
*/
|
||||||
|
int index;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
65
libguac/include/palette.h
Normal file
65
libguac/include/palette.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_PALETTE_H
|
||||||
|
#define __GUAC_PALETTE_H
|
||||||
|
|
||||||
|
#include <png.h>
|
||||||
|
#include <cairo/cairo.h>
|
||||||
|
|
||||||
|
typedef struct guac_palette_entry {
|
||||||
|
|
||||||
|
int index;
|
||||||
|
int color;
|
||||||
|
|
||||||
|
} guac_palette_entry;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct guac_palette {
|
||||||
|
|
||||||
|
guac_palette_entry entries[0x1000];
|
||||||
|
png_color colors[256];
|
||||||
|
int size;
|
||||||
|
|
||||||
|
} guac_palette;
|
||||||
|
|
||||||
|
guac_palette* guac_palette_alloc(cairo_surface_t* surface);
|
||||||
|
int guac_palette_find(guac_palette* palette, int color);
|
||||||
|
void guac_palette_free(guac_palette* palette);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
144
libguac/include/plugin.h
Normal file
144
libguac/include/plugin.h
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_PLUGIN_H
|
||||||
|
#define _GUAC_PLUGIN_H
|
||||||
|
|
||||||
|
#include "client.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides functions and structures required for handling a client plugin.
|
||||||
|
*
|
||||||
|
* @file plugin.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* String prefix which begins the library filename of all client plugins.
|
||||||
|
*/
|
||||||
|
#define GUAC_PROTOCOL_LIBRARY_PREFIX "libguac-client-"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* String suffix which ends the library filename of all client plugins.
|
||||||
|
*/
|
||||||
|
#define GUAC_PROTOCOL_LIBRARY_SUFFIX ".so"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum number of characters (COUNTING NULL TERMINATOR) to allow
|
||||||
|
* for protocol names within the library filename of client plugins.
|
||||||
|
*/
|
||||||
|
#define GUAC_PROTOCOL_NAME_LIMIT 256
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The maximum number of characters (INCLUDING NULL TERMINATOR) that a
|
||||||
|
* character array containing the concatenation of the library prefix,
|
||||||
|
* protocol name, and suffix can contain, assuming the protocol name is
|
||||||
|
* limited to GUAC_PROTOCOL_NAME_LIMIT characters.
|
||||||
|
*/
|
||||||
|
#define GUAC_PROTOCOL_LIBRARY_LIMIT ( \
|
||||||
|
\
|
||||||
|
sizeof(GUAC_PROTOCOL_LIBRARY_PREFIX) - 1 /* "libguac-client-" */ \
|
||||||
|
+ GUAC_PROTOCOL_NAME_LIMIT - 1 /* [up to 256 chars] */ \
|
||||||
|
+ sizeof(GUAC_PROTOCOL_LIBRARY_SUFFIX) - 1 /* ".so" */ \
|
||||||
|
+ 1 /* NULL terminator */ \
|
||||||
|
\
|
||||||
|
)
|
||||||
|
|
||||||
|
typedef struct guac_client_plugin guac_client_plugin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A handle to a client plugin, containing enough information about the
|
||||||
|
* plugin to complete the initial protocol handshake and instantiate a new
|
||||||
|
* client supporting the protocol provided by the client plugin.
|
||||||
|
*/
|
||||||
|
struct guac_client_plugin {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reference to dlopen'd client plugin.
|
||||||
|
*/
|
||||||
|
void* __client_plugin_handle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reference to the init handler of this client plugin. This
|
||||||
|
* function will be called when the client plugin is started.
|
||||||
|
*/
|
||||||
|
guac_client_init_handler* init_handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NULL-terminated array of all arguments accepted by this client
|
||||||
|
* plugin, in order. The values of these arguments will be passed
|
||||||
|
* to the init_handler if the client plugin is started.
|
||||||
|
*/
|
||||||
|
const char** args;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open the plugin which provides support for the given protocol, if it
|
||||||
|
* exists.
|
||||||
|
*
|
||||||
|
* @param protocol The name of the protocol to retrieve the client plugin
|
||||||
|
* for.
|
||||||
|
* @return The client plugin supporting the given protocol, or NULL if
|
||||||
|
* an error occurs or no such plugin exists.
|
||||||
|
*/
|
||||||
|
guac_client_plugin* guac_client_plugin_open(const char* protocol);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close the given plugin, releasing all associated resources. This function
|
||||||
|
* must be called after use of a client plugin is finished.
|
||||||
|
*
|
||||||
|
* @param plugin The client plugin to close.
|
||||||
|
* @return Zero on success, non-zero if an error occurred while releasing
|
||||||
|
* the resources associated with the plugin.
|
||||||
|
*/
|
||||||
|
int guac_client_plugin_close(guac_client_plugin* plugin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the given guac_client using the initialization routine provided
|
||||||
|
* by the given guac_client_plugin.
|
||||||
|
*
|
||||||
|
* @param plugin The client plugin to use to initialize the new client.
|
||||||
|
* @param client The guac_client to initialize.
|
||||||
|
* @param argc The number of arguments being passed to the client.
|
||||||
|
* @param argv All arguments to be passed to the client.
|
||||||
|
* @return Zero if initialization was successful, non-zero otherwise.
|
||||||
|
*/
|
||||||
|
int guac_client_plugin_init_client(guac_client_plugin* plugin,
|
||||||
|
guac_client* client, int argc, char** argv);
|
||||||
|
|
||||||
|
#endif
|
140
libguac/include/pool.h
Normal file
140
libguac/include/pool.h
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_POOL_H
|
||||||
|
#define _GUAC_POOL_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides functions and structures for maintaining dynamically allocated and
|
||||||
|
* freed pools of integers.
|
||||||
|
*
|
||||||
|
* @file pool.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct guac_pool_int guac_pool_int;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A pool of integers. Integers can be removed from and later free'd back
|
||||||
|
* into the pool. New integers are returned when the pool is exhausted,
|
||||||
|
* or when the pool has not met some minimum size. Old, free'd integers
|
||||||
|
* are returned otherwise.
|
||||||
|
*/
|
||||||
|
typedef struct guac_pool {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The minimum number of integers which must have been returned by
|
||||||
|
* guac_pool_next_int before previously-used and freed integers are
|
||||||
|
* allowed to be returned.
|
||||||
|
*/
|
||||||
|
int min_size;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The next integer to be released (after no more integers remain in the
|
||||||
|
* pool.
|
||||||
|
*/
|
||||||
|
int __next_value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The first integer in the pool, if any.
|
||||||
|
*/
|
||||||
|
guac_pool_int* __head;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The last integer in the pool, if any.
|
||||||
|
*/
|
||||||
|
guac_pool_int* __tail;
|
||||||
|
|
||||||
|
} guac_pool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a single integer within a larger pool of integers.
|
||||||
|
*/
|
||||||
|
struct guac_pool_int {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The integer value of this pool entry.
|
||||||
|
*/
|
||||||
|
int value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The next available (unused) guac_pool_int in the list of
|
||||||
|
* allocated but free'd ints.
|
||||||
|
*/
|
||||||
|
guac_pool_int* __next;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new guac_pool having the given minimum size.
|
||||||
|
*
|
||||||
|
* @param size The minimum number of integers which must have been returned by
|
||||||
|
* guac_pool_next_int before freed integers (previously used integers)
|
||||||
|
* are allowed to be returned.
|
||||||
|
* @return A new, empty guac_pool, having the given minimum size.
|
||||||
|
*/
|
||||||
|
guac_pool* guac_pool_alloc(int size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frees the given guac_pool.
|
||||||
|
*
|
||||||
|
* @param pool The guac_pool to free.
|
||||||
|
*/
|
||||||
|
void guac_pool_free(guac_pool* pool);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the next available integer from the given guac_pool. All integers returned are
|
||||||
|
* non-negative, and are returned in sequences, starting from 0.
|
||||||
|
*
|
||||||
|
* @param pool The guac_pool to retrieve an integer from.
|
||||||
|
* @return The next available integer, which may be either an integer not yet returned
|
||||||
|
* by a call to guac_pool_next_int, or an integer which was previosly returned,
|
||||||
|
* but has since been freed.
|
||||||
|
*/
|
||||||
|
int guac_pool_next_int(guac_pool* pool);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frees the given integer back into the given guac_pool. The integer given will be
|
||||||
|
* available for future calls to guac_pool_next_int.
|
||||||
|
*
|
||||||
|
* @param pool The guac_pool to free the given integer into.
|
||||||
|
* @param value The integer which should be readded to the given pool, such that it can
|
||||||
|
* be received by a future call to guac_pool_next_int.
|
||||||
|
*/
|
||||||
|
void guac_pool_free_int(guac_pool* pool, int value);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
953
libguac/include/protocol.h
Normal file
953
libguac/include/protocol.h
Normal file
@ -0,0 +1,953 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_PROTOCOL_H
|
||||||
|
#define _GUAC_PROTOCOL_H
|
||||||
|
|
||||||
|
#include <cairo/cairo.h>
|
||||||
|
|
||||||
|
#include "layer.h"
|
||||||
|
#include "socket.h"
|
||||||
|
#include "timestamp.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides functions and structures required for communicating using the
|
||||||
|
* Guacamole protocol over a guac_socket connection, such as that provided by
|
||||||
|
* guac_client objects.
|
||||||
|
*
|
||||||
|
* @file protocol.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Composite modes used by Guacamole draw instructions. Each
|
||||||
|
* composite mode maps to a unique channel mask integer.
|
||||||
|
*/
|
||||||
|
typedef enum guac_composite_mode {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A: Source where destination transparent = S n D'
|
||||||
|
* B: Source where destination opaque = S n D
|
||||||
|
* C: Destination where source transparent = D n S'
|
||||||
|
* D: Destination where source opaque = D n S
|
||||||
|
*
|
||||||
|
* 0 = Active, 1 = Inactive
|
||||||
|
*/
|
||||||
|
/* ABCD */
|
||||||
|
GUAC_COMP_ROUT = 0x2, /* 0010 - Clears destination where source opaque */
|
||||||
|
GUAC_COMP_ATOP = 0x6, /* 0110 - Fill where destination opaque only */
|
||||||
|
GUAC_COMP_XOR = 0xA, /* 1010 - XOR */
|
||||||
|
GUAC_COMP_ROVER = 0xB, /* 1011 - Fill where destination transparent only */
|
||||||
|
GUAC_COMP_OVER = 0xE, /* 1110 - Draw normally */
|
||||||
|
GUAC_COMP_PLUS = 0xF, /* 1111 - Add */
|
||||||
|
|
||||||
|
/* Unimplemented in client: */
|
||||||
|
/* NOT IMPLEMENTED: 0000 - Clear */
|
||||||
|
/* NOT IMPLEMENTED: 0011 - No operation */
|
||||||
|
/* NOT IMPLEMENTED: 0101 - Additive IN */
|
||||||
|
/* NOT IMPLEMENTED: 0111 - Additive ATOP */
|
||||||
|
/* NOT IMPLEMENTED: 1101 - Additive RATOP */
|
||||||
|
|
||||||
|
/* Buggy in webkit browsers, as they keep channel C on in all cases: */
|
||||||
|
GUAC_COMP_RIN = 0x1, /* 0001 */
|
||||||
|
GUAC_COMP_IN = 0x4, /* 0100 */
|
||||||
|
GUAC_COMP_OUT = 0x8, /* 1000 */
|
||||||
|
GUAC_COMP_RATOP = 0x9, /* 1001 */
|
||||||
|
GUAC_COMP_SRC = 0xC /* 1100 */
|
||||||
|
|
||||||
|
/* Bitwise composite operations (binary) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A: S' & D'
|
||||||
|
* B: S' & D
|
||||||
|
* C: S & D'
|
||||||
|
* D: S & D
|
||||||
|
*
|
||||||
|
* 0 = Active, 1 = Inactive
|
||||||
|
*/
|
||||||
|
|
||||||
|
} guac_composite_mode;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default transfer functions. There is no current facility in the
|
||||||
|
* Guacamole protocol to define custom transfer functions.
|
||||||
|
*/
|
||||||
|
typedef enum guac_transfer_function {
|
||||||
|
|
||||||
|
/* Constant functions */ /* ABCD */
|
||||||
|
GUAC_TRANSFER_BINARY_BLACK = 0x0, /* 0000 */
|
||||||
|
GUAC_TRANSFER_BINARY_WHITE = 0xF, /* 1111 */
|
||||||
|
|
||||||
|
/* Copy functions */
|
||||||
|
GUAC_TRANSFER_BINARY_SRC = 0x3, /* 0011 */
|
||||||
|
GUAC_TRANSFER_BINARY_DEST = 0x5, /* 0101 */
|
||||||
|
GUAC_TRANSFER_BINARY_NSRC = 0xC, /* 1100 */
|
||||||
|
GUAC_TRANSFER_BINARY_NDEST = 0xA, /* 1010 */
|
||||||
|
|
||||||
|
/* AND / NAND */
|
||||||
|
GUAC_TRANSFER_BINARY_AND = 0x1, /* 0001 */
|
||||||
|
GUAC_TRANSFER_BINARY_NAND = 0xE, /* 1110 */
|
||||||
|
|
||||||
|
/* OR / NOR */
|
||||||
|
GUAC_TRANSFER_BINARY_OR = 0x7, /* 0111 */
|
||||||
|
GUAC_TRANSFER_BINARY_NOR = 0x8, /* 1000 */
|
||||||
|
|
||||||
|
/* XOR / XNOR */
|
||||||
|
GUAC_TRANSFER_BINARY_XOR = 0x6, /* 0110 */
|
||||||
|
GUAC_TRANSFER_BINARY_XNOR = 0x9, /* 1001 */
|
||||||
|
|
||||||
|
/* AND / NAND with inverted source */
|
||||||
|
GUAC_TRANSFER_BINARY_NSRC_AND = 0x4, /* 0100 */
|
||||||
|
GUAC_TRANSFER_BINARY_NSRC_NAND = 0xB, /* 1011 */
|
||||||
|
|
||||||
|
/* OR / NOR with inverted source */
|
||||||
|
GUAC_TRANSFER_BINARY_NSRC_OR = 0xD, /* 1101 */
|
||||||
|
GUAC_TRANSFER_BINARY_NSRC_NOR = 0x2, /* 0010 */
|
||||||
|
|
||||||
|
/* AND / NAND with inverted destination */
|
||||||
|
GUAC_TRANSFER_BINARY_NDEST_AND = 0x2, /* 0010 */
|
||||||
|
GUAC_TRANSFER_BINARY_NDEST_NAND = 0xD, /* 1101 */
|
||||||
|
|
||||||
|
/* OR / NOR with inverted destination */
|
||||||
|
GUAC_TRANSFER_BINARY_NDEST_OR = 0xB, /* 1011 */
|
||||||
|
GUAC_TRANSFER_BINARY_NDEST_NOR = 0x4 /* 0100 */
|
||||||
|
|
||||||
|
} guac_transfer_function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Supported line cap styles
|
||||||
|
*/
|
||||||
|
typedef enum guac_line_cap_style {
|
||||||
|
GUAC_LINE_CAP_BUTT = 0x0,
|
||||||
|
GUAC_LINE_CAP_ROUND = 0x1,
|
||||||
|
GUAC_LINE_CAP_SQUARE = 0x2
|
||||||
|
} guac_line_cap_style;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Supported line join styles
|
||||||
|
*/
|
||||||
|
typedef enum guac_line_join_style {
|
||||||
|
GUAC_LINE_JOIN_BEVEL = 0x0,
|
||||||
|
GUAC_LINE_JOIN_MITER = 0x1,
|
||||||
|
GUAC_LINE_JOIN_ROUND = 0x2
|
||||||
|
} guac_line_join_style;
|
||||||
|
|
||||||
|
/* CONTROL INSTRUCTIONS */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends an args instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param args The NULL-terminated array of argument names (strings).
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_args(guac_socket* socket, const char** args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a connect instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param args The NULL-terminated array of argument values (strings).
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_connect(guac_socket* socket, const char** args);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a disconnect instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_disconnect(guac_socket* socket);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends an error instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param error The description associated with the error.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_error(guac_socket* socket, const char* error);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a nest instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param index The integer index of the stram to send the protocol
|
||||||
|
* data over.
|
||||||
|
* @param data A string containing protocol data, which must be UTF-8
|
||||||
|
* encoded and null-terminated.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_nest(guac_socket* socket, int index,
|
||||||
|
const char* data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a set instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The layer to set the parameter of.
|
||||||
|
* @param name The name of the parameter to set.
|
||||||
|
* @param value The value to set the parameter to.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_set(guac_socket* socket, const guac_layer* layer,
|
||||||
|
const char* name, const char* value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a select instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param protocol The protocol to request.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_select(guac_socket* socket, const char* protocol);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a sync instruction over the given guac_socket connection. The
|
||||||
|
* current time in milliseconds should be passed in as the timestamp.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param timestamp The current timestamp (in milliseconds).
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_sync(guac_socket* socket, guac_timestamp timestamp);
|
||||||
|
|
||||||
|
/* MEDIA INSTRUCTIONS */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends an audio instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param channel The index of the audio channel the sound should play on.
|
||||||
|
* @param mimetype The mimetype of the data being sent.
|
||||||
|
* @param duration The duration of the sound being sent, in milliseconds.
|
||||||
|
* @param data The audio data to be sent.
|
||||||
|
* @param size The number of bytes of audio data to send.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_audio(guac_socket* socket, int channel,
|
||||||
|
const char* mimetype, double duration, void* data, int size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begins a audio instruction over the given guac_socket connection. Only the
|
||||||
|
* initial non-data part of the instruction and the length of the data part
|
||||||
|
* of the instruction are sent. The actual contents of the data must be
|
||||||
|
* sent with guac_protocol_send_audio_data(), and the instruction must be
|
||||||
|
* completed with guac_protocol_send_audio_end().
|
||||||
|
*
|
||||||
|
* Note that the size of the audio to be sent MUST be known ahead of time,
|
||||||
|
* even though the data of the audio may be sent in chunks.
|
||||||
|
*
|
||||||
|
* No further instruction data may be sent along the givven guac_socket
|
||||||
|
* except via guac_protocol_send_audio_data() until the audio instruction
|
||||||
|
* is completed with guac_protocol_send_audio_end().
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param channel The index of the audio channel the sound should play on.
|
||||||
|
* @param mimetype The mimetype of the data being sent.
|
||||||
|
* @param duration The duration of the audio being sent, in milliseconds.
|
||||||
|
* @param size The number of bytes of audio data to send.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_audio_header(guac_socket* socket,
|
||||||
|
int channel, const char* mimetype, double duration, int size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a block of audio data to the currently in-progress audio instruction
|
||||||
|
* which was started with guac_protocol_send_audio_header(). Exactly the
|
||||||
|
* number of requested bytes are written unless an error occurs. This function
|
||||||
|
* may be called multiple times per audio instruction for each chunk of audio
|
||||||
|
* data being written, allowing the potentially huge audio instruction to be
|
||||||
|
* split across multiple writes.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param data The audio data to write.
|
||||||
|
* @param count The number of bytes within the given buffer of audio data
|
||||||
|
* that must be written.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_audio_data(guac_socket* socket, void* data, int count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Completes the audio instruction which was started with
|
||||||
|
* guac_protocol_send_audio_header(), and whose data has been written with
|
||||||
|
* guac_protocol_send_audio_data().
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_audio_end(guac_socket* socket);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a file instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param name A name describing the file being sent.
|
||||||
|
* @param mimetype The mimetype of the data being sent.
|
||||||
|
* @param data The file data to be sent.
|
||||||
|
* @param size The number of bytes of file data to send.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_file(guac_socket* socket, const char* name,
|
||||||
|
const char* mimetype, void* data, int size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begins a file instruction over the given guac_socket connection. Only the
|
||||||
|
* initial non-data part of the instruction and the length of the data part
|
||||||
|
* of the instruction are sent. The actual contents of the data must be
|
||||||
|
* sent with guac_protocol_send_file_data(), and the instruction must be
|
||||||
|
* completed with guac_protocol_send_file_end().
|
||||||
|
*
|
||||||
|
* Note that the size of the file to be sent MUST be known ahead of time,
|
||||||
|
* even though the data of the file may be sent in chunks.
|
||||||
|
*
|
||||||
|
* No further instruction data may be sent along the givven guac_socket
|
||||||
|
* except via guac_protocol_send_file_data() until the file instruction
|
||||||
|
* is completed with guac_protocol_send_file_end().
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param name A name describing the file being sent.
|
||||||
|
* @param mimetype The mimetype of the data being sent.
|
||||||
|
* @param size The number of bytes of file data to send.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_file_header(guac_socket* socket, const char* name,
|
||||||
|
const char* mimetype, int size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a block of file data to the currently in-progress file instruction
|
||||||
|
* which was started with guac_protocol_send_file_header(). Exactly the
|
||||||
|
* number of requested bytes are written unless an error occurs. This function
|
||||||
|
* may be called multiple times per file instruction for each chunk of file
|
||||||
|
* data being written, allowing the potentially huge file instruction to be
|
||||||
|
* split across multiple writes.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param data The file data to write.
|
||||||
|
* @param count The number of bytes within the given buffer of file data
|
||||||
|
* that must be written.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_file_data(guac_socket* socket, void* data, int count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Completes the file instruction which was started with
|
||||||
|
* guac_protocol_send_file_header(), and whose data has been written with
|
||||||
|
* guac_protocol_send_file_data().
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_file_end(guac_socket* socket);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a video instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The destination layer.
|
||||||
|
* @param mimetype The mimetype of the data being sent.
|
||||||
|
* @param duration The duration of the video being sent, in milliseconds.
|
||||||
|
* @param data The video data to be sent.
|
||||||
|
* @param size The number of bytes of video data to send.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_video(guac_socket* socket, const guac_layer* layer,
|
||||||
|
const char* mimetype, double duration, void* data, int size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Begins a video instruction over the given guac_socket connection. Only the
|
||||||
|
* initial non-data part of the instruction and the length of the data part
|
||||||
|
* of the instruction are sent. The actual contents of the data must be
|
||||||
|
* sent with guac_protocol_send_video_data(), and the instruction must be
|
||||||
|
* completed with guac_protocol_send_video_end().
|
||||||
|
*
|
||||||
|
* Note that the size of the video to be sent MUST be known ahead of time,
|
||||||
|
* even though the data of the video may be sent in chunks.
|
||||||
|
*
|
||||||
|
* No further instruction data may be sent along the givven guac_socket
|
||||||
|
* except via guac_protocol_send_video_data() until the video instruction
|
||||||
|
* is completed with guac_protocol_send_video_end().
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The destination layer.
|
||||||
|
* @param mimetype The mimetype of the data being sent.
|
||||||
|
* @param duration The duration of the video being sent, in milliseconds.
|
||||||
|
* @param size The number of bytes of video data to send.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_video_header(guac_socket* socket,
|
||||||
|
const guac_layer* layer, const char* mimetype, double duration, int size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a block of video data to the currently in-progress video instruction
|
||||||
|
* which was started with guac_protocol_send_video_header(). Exactly the
|
||||||
|
* number of requested bytes are written unless an error occurs. This function
|
||||||
|
* may be called multiple times per video instruction for each chunk of video
|
||||||
|
* data being written, allowing the potentially huge video instruction to be
|
||||||
|
* split across multiple writes.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param data The video data to write.
|
||||||
|
* @param count The number of bytes within the given buffer of video data
|
||||||
|
* that must be written.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_video_data(guac_socket* socket, void* data, int count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Completes the video instruction which was started with
|
||||||
|
* guac_protocol_send_video_header(), and whose data has been written with
|
||||||
|
* guac_protocol_send_video_data().
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_video_end(guac_socket* socket);
|
||||||
|
|
||||||
|
/* DRAWING INSTRUCTIONS */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends an arc instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The destination layer.
|
||||||
|
* @param x The X coordinate of the center of the circle containing the arc.
|
||||||
|
* @param y The Y coordinate of the center of the circle containing the arc.
|
||||||
|
* @param radius The radius of the circle containing the arc.
|
||||||
|
* @param startAngle The starting angle, in radians.
|
||||||
|
* @param endAngle The ending angle, in radians.
|
||||||
|
* @param negative Zero if the arc should be drawn in order of increasing
|
||||||
|
* angle, non-zero otherwise.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_arc(guac_socket* socket, const guac_layer* layer,
|
||||||
|
int x, int y, int radius, double startAngle, double endAngle,
|
||||||
|
int negative);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a cfill instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param mode The composite mode to use.
|
||||||
|
* @param layer The destination layer.
|
||||||
|
* @param r The red component of the color of the rectangle.
|
||||||
|
* @param g The green component of the color of the rectangle.
|
||||||
|
* @param b The blue component of the color of the rectangle.
|
||||||
|
* @param a The alpha (transparency) component of the color of the rectangle.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_cfill(guac_socket* socket,
|
||||||
|
guac_composite_mode mode, const guac_layer* layer,
|
||||||
|
int r, int g, int b, int a);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a clip instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The layer to set the clipping region of.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_clip(guac_socket* socket, const guac_layer* layer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a close instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The destination layer.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_close(guac_socket* socket, const guac_layer* layer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a copy instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param srcl The source layer.
|
||||||
|
* @param srcx The X coordinate of the source rectangle.
|
||||||
|
* @param srcy The Y coordinate of the source rectangle.
|
||||||
|
* @param w The width of the source rectangle.
|
||||||
|
* @param h The height of the source rectangle.
|
||||||
|
* @param mode The composite mode to use.
|
||||||
|
* @param dstl The destination layer.
|
||||||
|
* @param dstx The X coordinate of the destination, where the source rectangle
|
||||||
|
* should be copied.
|
||||||
|
* @param dsty The Y coordinate of the destination, where the source rectangle
|
||||||
|
* should be copied.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_copy(guac_socket* socket,
|
||||||
|
const guac_layer* srcl, int srcx, int srcy, int w, int h,
|
||||||
|
guac_composite_mode mode, const guac_layer* dstl, int dstx, int dsty);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a cstroke instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param mode The composite mode to use.
|
||||||
|
* @param layer The destination layer.
|
||||||
|
* @param cap The style of line cap to use when drawing the stroke.
|
||||||
|
* @param join The style of line join to use when drawing the stroke.
|
||||||
|
* @param thickness The thickness of the stroke in pixels.
|
||||||
|
* @param r The red component of the color of the rectangle.
|
||||||
|
* @param g The green component of the color of the rectangle.
|
||||||
|
* @param b The blue component of the color of the rectangle.
|
||||||
|
* @param a The alpha (transparency) component of the color of the rectangle.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_cstroke(guac_socket* socket,
|
||||||
|
guac_composite_mode mode, const guac_layer* layer,
|
||||||
|
guac_line_cap_style cap, guac_line_join_style join, int thickness,
|
||||||
|
int r, int g, int b, int a);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a cursor instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param x The X coordinate of the cursor hotspot.
|
||||||
|
* @param y The Y coordinate of the cursor hotspot.
|
||||||
|
* @param srcl The source layer.
|
||||||
|
* @param srcx The X coordinate of the source rectangle.
|
||||||
|
* @param srcy The Y coordinate of the source rectangle.
|
||||||
|
* @param w The width of the source rectangle.
|
||||||
|
* @param h The height of the source rectangle.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_cursor(guac_socket* socket, int x, int y,
|
||||||
|
const guac_layer* srcl, int srcx, int srcy, int w, int h);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a curve instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The destination layer.
|
||||||
|
* @param cp1x The X coordinate of the first control point.
|
||||||
|
* @param cp1y The Y coordinate of the first control point.
|
||||||
|
* @param cp2x The X coordinate of the second control point.
|
||||||
|
* @param cp2y The Y coordinate of the second control point.
|
||||||
|
* @param x The X coordinate of the endpoint of the curve.
|
||||||
|
* @param y The Y coordinate of the endpoint of the curve.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_curve(guac_socket* socket, const guac_layer* layer,
|
||||||
|
int cp1x, int cp1y, int cp2x, int cp2y, int x, int y);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends an identity instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The destination layer.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_identity(guac_socket* socket, const guac_layer* layer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends an lfill instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param mode The composite mode to use.
|
||||||
|
* @param layer The destination layer.
|
||||||
|
* @param srcl The source layer.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_lfill(guac_socket* socket,
|
||||||
|
guac_composite_mode mode, const guac_layer* layer,
|
||||||
|
const guac_layer* srcl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a line instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The destination layer.
|
||||||
|
* @param x The X coordinate of the endpoint of the line.
|
||||||
|
* @param y The Y coordinate of the endpoint of the line.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_line(guac_socket* socket, const guac_layer* layer,
|
||||||
|
int x, int y);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends an lstroke instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param mode The composite mode to use.
|
||||||
|
* @param layer The destination layer.
|
||||||
|
* @param cap The style of line cap to use when drawing the stroke.
|
||||||
|
* @param join The style of line join to use when drawing the stroke.
|
||||||
|
* @param thickness The thickness of the stroke in pixels.
|
||||||
|
* @param srcl The source layer.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_lstroke(guac_socket* socket,
|
||||||
|
guac_composite_mode mode, const guac_layer* layer,
|
||||||
|
guac_line_cap_style cap, guac_line_join_style join, int thickness,
|
||||||
|
const guac_layer* srcl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a png instruction over the given guac_socket connection. The PNG image
|
||||||
|
* data given will be automatically base64-encoded for transmission.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param mode The composite mode to use.
|
||||||
|
* @param layer The destination layer.
|
||||||
|
* @param x The destination X coordinate.
|
||||||
|
* @param y The destination Y coordinate.
|
||||||
|
* @param surface A cairo surface containing the image data to send.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_png(guac_socket* socket, guac_composite_mode mode,
|
||||||
|
const guac_layer* layer, int x, int y, cairo_surface_t* surface);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a pop instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The layer to set the clipping region of.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_pop(guac_socket* socket, const guac_layer* layer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a push instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The layer to set the clipping region of.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_push(guac_socket* socket, const guac_layer* layer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a rect instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The destination layer.
|
||||||
|
* @param x The X coordinate of the rectangle.
|
||||||
|
* @param y The Y coordinate of the rectangle.
|
||||||
|
* @param width The width of the rectangle.
|
||||||
|
* @param height The height of the rectangle.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_rect(guac_socket* socket, const guac_layer* layer,
|
||||||
|
int x, int y, int width, int height);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a reset instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The layer to set the clipping region of.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_reset(guac_socket* socket, const guac_layer* layer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a start instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The destination layer.
|
||||||
|
* @param x The X coordinate of the first point of the subpath.
|
||||||
|
* @param y The Y coordinate of the first point of the subpath.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_start(guac_socket* socket, const guac_layer* layer,
|
||||||
|
int x, int y);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a transfer instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param srcl The source layer.
|
||||||
|
* @param srcx The X coordinate of the source rectangle.
|
||||||
|
* @param srcy The Y coordinate of the source rectangle.
|
||||||
|
* @param w The width of the source rectangle.
|
||||||
|
* @param h The height of the source rectangle.
|
||||||
|
* @param fn The transfer function to use.
|
||||||
|
* @param dstl The destination layer.
|
||||||
|
* @param dstx The X coordinate of the destination, where the source rectangle
|
||||||
|
* should be copied.
|
||||||
|
* @param dsty The Y coordinate of the destination, where the source rectangle
|
||||||
|
* should be copied.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_transfer(guac_socket* socket,
|
||||||
|
const guac_layer* srcl, int srcx, int srcy, int w, int h,
|
||||||
|
guac_transfer_function fn, const guac_layer* dstl, int dstx, int dsty);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a transform instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The layer to apply the given transform matrix to.
|
||||||
|
* @param a The first value of the affine transform matrix.
|
||||||
|
* @param b The second value of the affine transform matrix.
|
||||||
|
* @param c The third value of the affine transform matrix.
|
||||||
|
* @param d The fourth value of the affine transform matrix.
|
||||||
|
* @param e The fifth value of the affine transform matrix.
|
||||||
|
* @param f The sixth value of the affine transform matrix.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_transform(guac_socket* socket,
|
||||||
|
const guac_layer* layer,
|
||||||
|
double a, double b, double c,
|
||||||
|
double d, double e, double f);
|
||||||
|
|
||||||
|
/* LAYER INSTRUCTIONS */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a dispose instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The layer to dispose.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_dispose(guac_socket* socket, const guac_layer* layer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a distort instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The layer to distort with the given transform matrix.
|
||||||
|
* @param a The first value of the affine transform matrix.
|
||||||
|
* @param b The second value of the affine transform matrix.
|
||||||
|
* @param c The third value of the affine transform matrix.
|
||||||
|
* @param d The fourth value of the affine transform matrix.
|
||||||
|
* @param e The fifth value of the affine transform matrix.
|
||||||
|
* @param f The sixth value of the affine transform matrix.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_distort(guac_socket* socket,
|
||||||
|
const guac_layer* layer,
|
||||||
|
double a, double b, double c,
|
||||||
|
double d, double e, double f);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a move instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The layer to move.
|
||||||
|
* @param parent The parent layer the specified layer will be positioned
|
||||||
|
* relative to.
|
||||||
|
* @param x The X coordinate of the layer.
|
||||||
|
* @param y The Y coordinate of the layer.
|
||||||
|
* @param z The Z index of the layer, relative to other layers in its parent.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_move(guac_socket* socket, const guac_layer* layer,
|
||||||
|
const guac_layer* parent, int x, int y, int z);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a shade instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The layer to shade.
|
||||||
|
* @param a The alpha value of the layer.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_shade(guac_socket* socket, const guac_layer* layer,
|
||||||
|
int a);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a size instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param layer The layer to resize.
|
||||||
|
* @param w The new width of the layer.
|
||||||
|
* @param h The new height of the layer.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_size(guac_socket* socket, const guac_layer* layer,
|
||||||
|
int w, int h);
|
||||||
|
|
||||||
|
/* TEXT INSTRUCTIONS */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a clipboard instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* If an error occurs sending the instruction, a non-zero value is
|
||||||
|
* returned, and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param data The clipboard data to send.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_clipboard(guac_socket* socket, const char* data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a name instruction over the given guac_socket connection.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket connection to use.
|
||||||
|
* @param name The name to send within the name instruction.
|
||||||
|
* @return Zero on success, non-zero on error.
|
||||||
|
*/
|
||||||
|
int guac_protocol_send_name(guac_socket* socket, const char* name);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
357
libguac/include/socket.h
Normal file
357
libguac/include/socket.h
Normal file
@ -0,0 +1,357 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_SOCKET_H
|
||||||
|
#define _GUAC_SOCKET_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the guac_socket object and functionss for using and manipulating it.
|
||||||
|
*
|
||||||
|
* @file socket.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct guac_socket guac_socket;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generic read handler for socket read operations, modeled after the standard
|
||||||
|
* POSIX read() function. When set within a guac_socket, a handler of this type
|
||||||
|
* will be called when data needs to be read into the socket.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket being read from.
|
||||||
|
* @param buf The arbitrary buffer we must populate with data.
|
||||||
|
* @param count The maximum number of bytes to read into the buffer.
|
||||||
|
* @return The number of bytes read, or -1 if an error occurs.
|
||||||
|
*/
|
||||||
|
typedef ssize_t guac_socket_read_handler(guac_socket* socket,
|
||||||
|
void* buf, size_t count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generic write handler for socket write operations, modeled after the standard
|
||||||
|
* POSIX write() function. When set within a guac_socket, a handler of this type
|
||||||
|
* will be called when data needs to be write into the socket.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket being written to.
|
||||||
|
* @param buf The arbitrary buffer containing data to be written.
|
||||||
|
* @param count The maximum number of bytes to write from the buffer.
|
||||||
|
* @return The number of bytes written, or -1 if an error occurs.
|
||||||
|
*/
|
||||||
|
typedef ssize_t guac_socket_write_handler(guac_socket* socket,
|
||||||
|
void* buf, size_t count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generic handler for socket select operations, similar to the POSIX select()
|
||||||
|
* function. When guac_socket_select() is called on a guac_socket, its
|
||||||
|
* guac_socket_select_handler will be invoked, if defined.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket being selected.
|
||||||
|
* @param usec_timeout The maximum number of microseconds to wait for data, or
|
||||||
|
* -1 to potentially wait forever.
|
||||||
|
* @return Positive on success, zero if the timeout elapsed and no data is
|
||||||
|
* available, negative on error.
|
||||||
|
*/
|
||||||
|
typedef int guac_socket_select_handler(guac_socket* socket, int usec_timeout);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generic handler for the closing of a socket, modeled after the standard
|
||||||
|
* POSIX close() function. When set within a guac_socket, a handler of this type
|
||||||
|
* will be called when the socket is closed.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket being closed.
|
||||||
|
* @return Zero on success, or -1 if an error occurs.
|
||||||
|
*/
|
||||||
|
typedef int guac_socket_free_handler(guac_socket* socket);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The core I/O object of Guacamole. guac_socket provides buffered input and
|
||||||
|
* output as well as convenience methods for efficiently writing base64 data.
|
||||||
|
*/
|
||||||
|
struct guac_socket {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Arbitrary socket-specific data.
|
||||||
|
*/
|
||||||
|
void* data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler which will be called when data needs to be read from the socket.
|
||||||
|
*/
|
||||||
|
guac_socket_read_handler* read_handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler which will be called whenever data is written to this socket.
|
||||||
|
* Note that because guac_socket automatically buffers written data, this
|
||||||
|
* handler might only get called when the socket is flushed.
|
||||||
|
*/
|
||||||
|
guac_socket_write_handler* write_handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler which will be called whenever guac_socket_select is invoked
|
||||||
|
* on this socket.
|
||||||
|
*/
|
||||||
|
guac_socket_select_handler* select_handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler which will be called when the socket is free'd (closed).
|
||||||
|
*/
|
||||||
|
guac_socket_free_handler* free_handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of bytes present in the base64 "ready" buffer.
|
||||||
|
*/
|
||||||
|
int __ready;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base64 "ready" buffer. Once this buffer is filled, base64 data is
|
||||||
|
* flushed to the main write buffer.
|
||||||
|
*/
|
||||||
|
int __ready_buf[3];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of bytes currently in the main write buffer.
|
||||||
|
*/
|
||||||
|
int __written;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The main write buffer. Bytes written go here before being flushed
|
||||||
|
* to the open file descriptor.
|
||||||
|
*/
|
||||||
|
char __out_buf[8192];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current location of parsing within the instruction buffer.
|
||||||
|
*/
|
||||||
|
int __instructionbuf_parse_start;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current size of the instruction buffer.
|
||||||
|
*/
|
||||||
|
int __instructionbuf_size;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of bytes currently in the instruction buffer.
|
||||||
|
*/
|
||||||
|
int __instructionbuf_used_length;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The instruction buffer. This is essentially the input buffer,
|
||||||
|
* provided as a convenience to be used to buffer instructions until
|
||||||
|
* those instructions are complete and ready to be parsed.
|
||||||
|
*/
|
||||||
|
char* __instructionbuf;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of elements parsed so far.
|
||||||
|
*/
|
||||||
|
int __instructionbuf_elementc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of pointers into the instruction buffer, where each pointer
|
||||||
|
* points to the start of the corresponding element.
|
||||||
|
*/
|
||||||
|
char* __instructionbuf_elementv[64];
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates a new, completely blank guac_socket. This guac_socket will do
|
||||||
|
* absolutely nothing when used unless its handlers are defined.
|
||||||
|
*
|
||||||
|
* @returns A newly-allocated guac_socket, or NULL if the guac_socket could
|
||||||
|
* not be allocated.
|
||||||
|
*/
|
||||||
|
guac_socket* guac_socket_alloc();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frees the given guac_socket and all associated resources.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket to free.
|
||||||
|
*/
|
||||||
|
void guac_socket_free(guac_socket* socket);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates and initializes a new guac_socket object with the given open
|
||||||
|
* file descriptor.
|
||||||
|
*
|
||||||
|
* If an error occurs while allocating the guac_socket object, NULL is returned,
|
||||||
|
* and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param fd An open file descriptor that this guac_socket object should manage.
|
||||||
|
* @return A newly allocated guac_socket object associated with the given
|
||||||
|
* file descriptor, or NULL if an error occurs while allocating
|
||||||
|
* the guac_socket object.
|
||||||
|
*/
|
||||||
|
guac_socket* guac_socket_open(int fd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allocates and initializes a new guac_socket which writes all data via
|
||||||
|
* nest instructions to the given existing, open guac_socket.
|
||||||
|
*
|
||||||
|
* If an error occurs while allocating the guac_socket object, NULL is returned,
|
||||||
|
* and guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param parent The guac_socket this new guac_socket should write nest
|
||||||
|
* instructions to.
|
||||||
|
* @param index The stream index to use for the written nest instructions.
|
||||||
|
* @return A newly allocated guac_socket object associated with the given
|
||||||
|
* guac_socket and stream index, or NULL if an error occurs while
|
||||||
|
* allocating the guac_socket object.
|
||||||
|
*/
|
||||||
|
guac_socket* guac_socket_nest(guac_socket* parent, int index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the given unsigned int to the given guac_socket object. The data
|
||||||
|
* written may be buffered until the buffer is flushed automatically or
|
||||||
|
* manually.
|
||||||
|
*
|
||||||
|
* If an error occurs while writing, a non-zero value is returned, and
|
||||||
|
* guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket object to write to.
|
||||||
|
* @param i The unsigned int to write.
|
||||||
|
* @return Zero on success, or non-zero if an error occurs while writing.
|
||||||
|
*/
|
||||||
|
ssize_t guac_socket_write_int(guac_socket* socket, int64_t i);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the given string to the given guac_socket object. The data
|
||||||
|
* written may be buffered until the buffer is flushed automatically or
|
||||||
|
* manually. Note that if the string can contain characters used
|
||||||
|
* internally by the Guacamole protocol (commas, semicolons, or
|
||||||
|
* backslashes) it will need to be escaped.
|
||||||
|
*
|
||||||
|
* If an error occurs while writing, a non-zero value is returned, and
|
||||||
|
* guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket object to write to.
|
||||||
|
* @param str The string to write.
|
||||||
|
* @return Zero on success, or non-zero if an error occurs while writing.
|
||||||
|
*/
|
||||||
|
ssize_t guac_socket_write_string(guac_socket* socket, const char* str);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the given binary data to the given guac_socket object as base64-
|
||||||
|
* encoded data. The data written may be buffered until the buffer is flushed
|
||||||
|
* automatically or manually. Beware that because base64 data is buffered
|
||||||
|
* on top of the write buffer already used, a call to guac_socket_flush_base64()
|
||||||
|
* must be made before non-base64 writes (or writes of an independent block of
|
||||||
|
* base64 data) can be made.
|
||||||
|
*
|
||||||
|
* If an error occurs while writing, a non-zero value is returned, and
|
||||||
|
* guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket object to write to.
|
||||||
|
* @param buf A buffer containing the data to write.
|
||||||
|
* @param count The number of bytes to write.
|
||||||
|
* @return Zero on success, or non-zero if an error occurs while writing.
|
||||||
|
*/
|
||||||
|
ssize_t guac_socket_write_base64(guac_socket* socket, const void* buf, size_t count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes the given data to the specified socket. The data written may be
|
||||||
|
* buffered until the buffer is flushed automatically or manually.
|
||||||
|
*
|
||||||
|
* If an error occurs while writing, a non-zero value is returned, and
|
||||||
|
* guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket object to write to.
|
||||||
|
* @param buf A buffer containing the data to write.
|
||||||
|
* @param count The number of bytes to write.
|
||||||
|
* @return Zero on success, or non-zero if an error occurs while writing.
|
||||||
|
*/
|
||||||
|
ssize_t guac_socket_write(guac_socket* socket, const void* buf, size_t count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to read data from the socket, filling up to the specified number
|
||||||
|
* of bytes in the given buffer.
|
||||||
|
*
|
||||||
|
* If an error occurs while writing, a non-zero value is returned, and
|
||||||
|
* guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket to read from.
|
||||||
|
* @param buf The buffer to read bytes into.
|
||||||
|
* @param count The maximum number of bytes to read.
|
||||||
|
* @return The number of bytes read, or non-zero if an error occurs while
|
||||||
|
* reading.
|
||||||
|
*/
|
||||||
|
ssize_t guac_socket_read(guac_socket* socket, void* buf, size_t count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flushes the base64 buffer, writing padding characters as necessary.
|
||||||
|
*
|
||||||
|
* If an error occurs while writing, a non-zero value is returned, and
|
||||||
|
* guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket object to flush
|
||||||
|
* @return Zero on success, or non-zero if an error occurs during flush.
|
||||||
|
*/
|
||||||
|
ssize_t guac_socket_flush_base64(guac_socket* socket);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flushes the write buffer.
|
||||||
|
*
|
||||||
|
* If an error occurs while writing, a non-zero value is returned, and
|
||||||
|
* guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket object to flush
|
||||||
|
* @return Zero on success, or non-zero if an error occurs during flush.
|
||||||
|
*/
|
||||||
|
ssize_t guac_socket_flush(guac_socket* socket);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Waits for input to be available on the given guac_socket object until the
|
||||||
|
* specified timeout elapses.
|
||||||
|
*
|
||||||
|
* If an error occurs while waiting, a negative value is returned, and
|
||||||
|
* guac_error is set appropriately.
|
||||||
|
*
|
||||||
|
* If a timeout occurs while waiting, zero value is returned, and
|
||||||
|
* guac_error is set to GUAC_STATUS_INPUT_TIMEOUT.
|
||||||
|
*
|
||||||
|
* @param socket The guac_socket object to wait for.
|
||||||
|
* @param usec_timeout The maximum number of microseconds to wait for data, or
|
||||||
|
* -1 to potentially wait forever.
|
||||||
|
* @return Positive on success, zero if the timeout elapsed and no data is
|
||||||
|
* available, negative on error.
|
||||||
|
*/
|
||||||
|
int guac_socket_select(guac_socket* socket, int usec_timeout);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
68
libguac/include/stream.h
Normal file
68
libguac/include/stream.h
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_STREAM_H
|
||||||
|
#define _GUAC_STREAM_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides functions and structures required for allocating and using nested
|
||||||
|
* streams.
|
||||||
|
*
|
||||||
|
* @file stream.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct guac_stream guac_stream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a single nested stream within the Guacamole protocol.
|
||||||
|
*/
|
||||||
|
struct guac_stream {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The index of this layer.
|
||||||
|
*/
|
||||||
|
int index;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A guac_socket which writes to this stream.
|
||||||
|
*/
|
||||||
|
guac_socket* socket;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
65
libguac/include/timestamp.h
Normal file
65
libguac/include/timestamp.h
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_TIME_H
|
||||||
|
#define _GUAC_TIME_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides functions and structures for creating timestamps.
|
||||||
|
*
|
||||||
|
* @file timestamp.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An arbitrary timestamp denoting a relative time value in milliseconds.
|
||||||
|
*/
|
||||||
|
typedef int64_t guac_timestamp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an arbitrary timestamp. The difference between return values of any
|
||||||
|
* two calls is equal to the amount of time in milliseconds between those
|
||||||
|
* calls. The return value from a single call will not have any useful
|
||||||
|
* (or defined) meaning.
|
||||||
|
*
|
||||||
|
* @return An arbitrary millisecond timestamp.
|
||||||
|
*/
|
||||||
|
guac_timestamp guac_timestamp_current();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
68
libguac/include/unicode.h
Normal file
68
libguac/include/unicode.h
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_UNICODE_H
|
||||||
|
#define _GUAC_UNICODE_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides functions for manipulating Unicode strings.
|
||||||
|
*
|
||||||
|
* @file unicode.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given the initial byte of a single UTF-8 character, returns the overall
|
||||||
|
* byte size of the entire character.
|
||||||
|
*
|
||||||
|
* @param c The initial byte of the character to check.
|
||||||
|
* @return The number of bytes in the given character overall.
|
||||||
|
*/
|
||||||
|
size_t guac_utf8_charsize(unsigned char c);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a UTF-8-encoded string, returns the length of the string in characters
|
||||||
|
* (not bytes).
|
||||||
|
*
|
||||||
|
* @param str The UTF-8 string to calculate the length of.
|
||||||
|
* @return The length in characters of the given UTF-8 string.
|
||||||
|
*/
|
||||||
|
size_t guac_utf8_strlen(const char* str);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
12
libguac/m4/README
Normal file
12
libguac/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.
|
78
libguac/src/Makefile.am
Normal file
78
libguac/src/Makefile.am
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
# ***** 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.
|
||||||
|
#
|
||||||
|
# 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 -I../include
|
||||||
|
|
||||||
|
libguacincdir = $(includedir)/guacamole
|
||||||
|
libguacinc_HEADERS = \
|
||||||
|
../include/client.h \
|
||||||
|
../include/error.h \
|
||||||
|
../include/hash.h \
|
||||||
|
../include/instruction.h \
|
||||||
|
../include/layer.h \
|
||||||
|
../include/plugin.h \
|
||||||
|
../include/pool.h \
|
||||||
|
../include/protocol.h \
|
||||||
|
../include/socket.h \
|
||||||
|
../include/stream.h \
|
||||||
|
../include/timestamp.h
|
||||||
|
|
||||||
|
noinst_HEADERS = \
|
||||||
|
../include/client-handlers.h \
|
||||||
|
../include/palette.h \
|
||||||
|
../include/unicode.h
|
||||||
|
|
||||||
|
libguac_la_SOURCES = \
|
||||||
|
client.c \
|
||||||
|
client-handlers.c \
|
||||||
|
error.c \
|
||||||
|
hash.c \
|
||||||
|
instruction.c \
|
||||||
|
palette.c \
|
||||||
|
plugin.c \
|
||||||
|
pool.c \
|
||||||
|
protocol.c \
|
||||||
|
socket.c \
|
||||||
|
socket-fd.c \
|
||||||
|
socket-nest.c \
|
||||||
|
timestamp.c \
|
||||||
|
unicode.c
|
||||||
|
|
||||||
|
lib_LTLIBRARIES = libguac.la
|
||||||
|
libguac_la_LDFLAGS = -version-info 4:0:0
|
||||||
|
|
133
libguac/src/client-handlers.c
Normal file
133
libguac/src/client-handlers.c
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <stdio.h>
|
||||||
|
|
||||||
|
#include "client.h"
|
||||||
|
#include "protocol.h"
|
||||||
|
#include "client-handlers.h"
|
||||||
|
|
||||||
|
/* Guacamole instruction handler map */
|
||||||
|
|
||||||
|
__guac_instruction_handler_mapping __guac_instruction_handler_map[] = {
|
||||||
|
{"sync", __guac_handle_sync},
|
||||||
|
{"mouse", __guac_handle_mouse},
|
||||||
|
{"key", __guac_handle_key},
|
||||||
|
{"clipboard", __guac_handle_clipboard},
|
||||||
|
{"disconnect", __guac_handle_disconnect},
|
||||||
|
{"size", __guac_handle_size},
|
||||||
|
{NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
int64_t __guac_parse_int(const char* str) {
|
||||||
|
|
||||||
|
int sign = 1;
|
||||||
|
int64_t num = 0;
|
||||||
|
|
||||||
|
for (; *str != '\0'; str++) {
|
||||||
|
|
||||||
|
if (*str == '-')
|
||||||
|
sign = -sign;
|
||||||
|
else
|
||||||
|
num = num * 10 + (*str - '0');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return num * sign;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Guacamole instruction handlers */
|
||||||
|
|
||||||
|
int __guac_handle_sync(guac_client* client, guac_instruction* instruction) {
|
||||||
|
guac_timestamp timestamp = __guac_parse_int(instruction->argv[0]);
|
||||||
|
|
||||||
|
/* Error if timestamp is in future */
|
||||||
|
if (timestamp > client->last_sent_timestamp)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
client->last_received_timestamp = timestamp;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int __guac_handle_mouse(guac_client* client, guac_instruction* instruction) {
|
||||||
|
if (client->mouse_handler)
|
||||||
|
return client->mouse_handler(
|
||||||
|
client,
|
||||||
|
atoi(instruction->argv[0]), /* x */
|
||||||
|
atoi(instruction->argv[1]), /* y */
|
||||||
|
atoi(instruction->argv[2]) /* mask */
|
||||||
|
);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int __guac_handle_key(guac_client* client, guac_instruction* instruction) {
|
||||||
|
if (client->key_handler)
|
||||||
|
return client->key_handler(
|
||||||
|
client,
|
||||||
|
atoi(instruction->argv[0]), /* keysym */
|
||||||
|
atoi(instruction->argv[1]) /* pressed */
|
||||||
|
);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int __guac_handle_clipboard(guac_client* client, guac_instruction* instruction) {
|
||||||
|
if (client->clipboard_handler)
|
||||||
|
return client->clipboard_handler(
|
||||||
|
client,
|
||||||
|
instruction->argv[0] /* data */
|
||||||
|
);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int __guac_handle_size(guac_client* client, guac_instruction* instruction) {
|
||||||
|
if (client->size_handler)
|
||||||
|
return client->size_handler(
|
||||||
|
client,
|
||||||
|
atoi(instruction->argv[0]), /* width */
|
||||||
|
atoi(instruction->argv[1]) /* height */
|
||||||
|
);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int __guac_handle_disconnect(guac_client* client, guac_instruction* instruction) {
|
||||||
|
/* Return error code to force disconnect */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
236
libguac/src/client.c
Normal file
236
libguac/src/client.c
Normal file
@ -0,0 +1,236 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "client.h"
|
||||||
|
#include "client-handlers.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "layer.h"
|
||||||
|
#include "plugin.h"
|
||||||
|
#include "pool.h"
|
||||||
|
#include "protocol.h"
|
||||||
|
#include "socket.h"
|
||||||
|
#include "time.h"
|
||||||
|
|
||||||
|
guac_layer __GUAC_DEFAULT_LAYER = {
|
||||||
|
.index = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
const guac_layer* GUAC_DEFAULT_LAYER = &__GUAC_DEFAULT_LAYER;
|
||||||
|
|
||||||
|
guac_layer* guac_client_alloc_layer(guac_client* client) {
|
||||||
|
|
||||||
|
/* Init new layer */
|
||||||
|
guac_layer* allocd_layer = malloc(sizeof(guac_layer));
|
||||||
|
allocd_layer->index = guac_pool_next_int(client->__layer_pool)+1;
|
||||||
|
|
||||||
|
return allocd_layer;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
guac_layer* guac_client_alloc_buffer(guac_client* client) {
|
||||||
|
|
||||||
|
/* Init new layer */
|
||||||
|
guac_layer* allocd_layer = malloc(sizeof(guac_layer));
|
||||||
|
allocd_layer->index = -guac_pool_next_int(client->__buffer_pool) - 1;
|
||||||
|
|
||||||
|
return allocd_layer;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void guac_client_free_buffer(guac_client* client, guac_layer* layer) {
|
||||||
|
|
||||||
|
/* Release index to pool */
|
||||||
|
guac_pool_free_int(client->__buffer_pool, -layer->index - 1);
|
||||||
|
|
||||||
|
/* Free layer */
|
||||||
|
free(layer);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void guac_client_free_layer(guac_client* client, guac_layer* layer) {
|
||||||
|
|
||||||
|
/* Release index to pool */
|
||||||
|
guac_pool_free_int(client->__layer_pool, layer->index);
|
||||||
|
|
||||||
|
/* Free layer */
|
||||||
|
free(layer);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
guac_stream* guac_client_alloc_stream(guac_client* client) {
|
||||||
|
|
||||||
|
/* Init new stream */
|
||||||
|
guac_stream* allocd_stream = malloc(sizeof(guac_stream));
|
||||||
|
allocd_stream->index = guac_pool_next_int(client->__stream_pool);
|
||||||
|
|
||||||
|
/* Nest socket */
|
||||||
|
allocd_stream->socket = guac_socket_nest(
|
||||||
|
client->socket,
|
||||||
|
allocd_stream->index
|
||||||
|
);
|
||||||
|
|
||||||
|
return allocd_stream;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void guac_client_free_stream(guac_client* client, guac_stream* stream) {
|
||||||
|
|
||||||
|
/* Release index to pool */
|
||||||
|
guac_pool_free_int(client->__stream_pool, stream->index - 1);
|
||||||
|
|
||||||
|
/* Release socket */
|
||||||
|
guac_socket_free(stream->socket);
|
||||||
|
|
||||||
|
/* Free stream */
|
||||||
|
free(stream);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
guac_client* guac_client_alloc() {
|
||||||
|
|
||||||
|
/* Allocate new client */
|
||||||
|
guac_client* client = malloc(sizeof(guac_client));
|
||||||
|
if (client == NULL) {
|
||||||
|
guac_error = GUAC_STATUS_NO_MEMORY;
|
||||||
|
guac_error_message = "Could not allocate memory for client";
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Init new client */
|
||||||
|
memset(client, 0, sizeof(guac_client));
|
||||||
|
|
||||||
|
client->last_received_timestamp =
|
||||||
|
client->last_sent_timestamp = guac_timestamp_current();
|
||||||
|
|
||||||
|
client->state = GUAC_CLIENT_RUNNING;
|
||||||
|
|
||||||
|
/* Allocate buffer and layer pools */
|
||||||
|
client->__buffer_pool = guac_pool_alloc(GUAC_BUFFER_POOL_INITIAL_SIZE);
|
||||||
|
client->__layer_pool = guac_pool_alloc(GUAC_BUFFER_POOL_INITIAL_SIZE);
|
||||||
|
|
||||||
|
/* Allocate stream pool */
|
||||||
|
client->__stream_pool = guac_pool_alloc(0);
|
||||||
|
|
||||||
|
return client;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void guac_client_free(guac_client* client) {
|
||||||
|
|
||||||
|
if (client->free_handler) {
|
||||||
|
|
||||||
|
/* FIXME: Errors currently ignored... */
|
||||||
|
client->free_handler(client);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free layer pools */
|
||||||
|
guac_pool_free(client->__buffer_pool);
|
||||||
|
guac_pool_free(client->__layer_pool);
|
||||||
|
|
||||||
|
/* Free stream pool */
|
||||||
|
guac_pool_free(client->__stream_pool);
|
||||||
|
|
||||||
|
free(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
int guac_client_handle_instruction(guac_client* client, guac_instruction* instruction) {
|
||||||
|
|
||||||
|
/* For each defined instruction */
|
||||||
|
__guac_instruction_handler_mapping* current = __guac_instruction_handler_map;
|
||||||
|
while (current->opcode != NULL) {
|
||||||
|
|
||||||
|
/* If recognized, call handler */
|
||||||
|
if (strcmp(instruction->opcode, current->opcode) == 0)
|
||||||
|
return current->handler(client, instruction);
|
||||||
|
|
||||||
|
current++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If unrecognized, ignore */
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void vguac_client_log_info(guac_client* client, const char* format,
|
||||||
|
va_list ap) {
|
||||||
|
|
||||||
|
/* Call handler if defined */
|
||||||
|
if (client->log_info_handler != NULL)
|
||||||
|
client->log_info_handler(client, format, ap);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void vguac_client_log_error(guac_client* client, const char* format,
|
||||||
|
va_list ap) {
|
||||||
|
|
||||||
|
/* Call handler if defined */
|
||||||
|
if (client->log_error_handler != NULL)
|
||||||
|
client->log_error_handler(client, format, ap);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void guac_client_log_info(guac_client* client, const char* format, ...) {
|
||||||
|
|
||||||
|
va_list args;
|
||||||
|
va_start(args, format);
|
||||||
|
|
||||||
|
vguac_client_log_info(client, format, args);
|
||||||
|
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void guac_client_log_error(guac_client* client, const char* format, ...) {
|
||||||
|
|
||||||
|
va_list args;
|
||||||
|
va_start(args, format);
|
||||||
|
|
||||||
|
vguac_client_log_error(client, format, args);
|
||||||
|
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void guac_client_stop(guac_client* client) {
|
||||||
|
client->state = GUAC_CLIENT_STOPPING;
|
||||||
|
}
|
||||||
|
|
197
libguac/src/error.c
Normal file
197
libguac/src/error.c
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBPTHREAD
|
||||||
|
#include <pthread.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "error.h"
|
||||||
|
|
||||||
|
/* Error strings */
|
||||||
|
|
||||||
|
const char* __GUAC_STATUS_SUCCESS_STR = "Success";
|
||||||
|
const char* __GUAC_STATUS_NO_MEMORY_STR = "Insufficient memory";
|
||||||
|
const char* __GUAC_STATUS_NO_INPUT_STR = "End of input stream";
|
||||||
|
const char* __GUAC_STATUS_INPUT_TIMEOUT_STR = "Read timeout";
|
||||||
|
const char* __GUAC_STATUS_OUTPUT_ERROR_STR = "Output error";
|
||||||
|
const char* __GUAC_STATUS_BAD_ARGUMENT_STR = "Invalid argument";
|
||||||
|
const char* __GUAC_STATUS_BAD_STATE_STR = "Illegal state";
|
||||||
|
const char* __GUAC_STATUS_INVALID_STATUS_STR = "UNKNOWN STATUS CODE";
|
||||||
|
|
||||||
|
|
||||||
|
const char* guac_status_string(guac_status status) {
|
||||||
|
|
||||||
|
switch (status) {
|
||||||
|
|
||||||
|
/* No error */
|
||||||
|
case GUAC_STATUS_SUCCESS:
|
||||||
|
return __GUAC_STATUS_SUCCESS_STR;
|
||||||
|
|
||||||
|
/* Out of memory */
|
||||||
|
case GUAC_STATUS_NO_MEMORY:
|
||||||
|
return __GUAC_STATUS_NO_MEMORY_STR;
|
||||||
|
|
||||||
|
/* End of input */
|
||||||
|
case GUAC_STATUS_NO_INPUT:
|
||||||
|
return __GUAC_STATUS_NO_INPUT_STR;
|
||||||
|
|
||||||
|
/* Input timeout */
|
||||||
|
case GUAC_STATUS_INPUT_TIMEOUT:
|
||||||
|
return __GUAC_STATUS_INPUT_TIMEOUT_STR;
|
||||||
|
|
||||||
|
/* Further information in errno */
|
||||||
|
case GUAC_STATUS_SEE_ERRNO:
|
||||||
|
return strerror(errno);
|
||||||
|
|
||||||
|
/* Output error */
|
||||||
|
case GUAC_STATUS_OUTPUT_ERROR:
|
||||||
|
return __GUAC_STATUS_OUTPUT_ERROR_STR;
|
||||||
|
|
||||||
|
/* Invalid argument */
|
||||||
|
case GUAC_STATUS_BAD_ARGUMENT:
|
||||||
|
return __GUAC_STATUS_BAD_ARGUMENT_STR;
|
||||||
|
|
||||||
|
/* Illegal state */
|
||||||
|
case GUAC_STATUS_BAD_STATE:
|
||||||
|
return __GUAC_STATUS_BAD_STATE_STR;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return __GUAC_STATUS_INVALID_STATUS_STR;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBPTHREAD
|
||||||
|
|
||||||
|
/* PThread implementation of __guac_error */
|
||||||
|
|
||||||
|
static pthread_key_t __guac_error_key;
|
||||||
|
static pthread_once_t __guac_error_key_init = PTHREAD_ONCE_INIT;
|
||||||
|
|
||||||
|
static pthread_key_t __guac_error_message_key;
|
||||||
|
static pthread_once_t __guac_error_message_key_init = PTHREAD_ONCE_INIT;
|
||||||
|
|
||||||
|
static void __guac_free_pointer(void* pointer) {
|
||||||
|
|
||||||
|
/* Free memory allocated to status variable */
|
||||||
|
free(pointer);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __guac_alloc_error_key() {
|
||||||
|
|
||||||
|
/* Create key, destroy any allocated variable on thread exit */
|
||||||
|
pthread_key_create(&__guac_error_key, __guac_free_pointer);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __guac_alloc_error_message_key() {
|
||||||
|
|
||||||
|
/* Create key, destroy any allocated variable on thread exit */
|
||||||
|
pthread_key_create(&__guac_error_message_key, __guac_free_pointer);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
guac_status* __guac_error() {
|
||||||
|
|
||||||
|
/* Pointer for thread-local data */
|
||||||
|
guac_status* status;
|
||||||
|
|
||||||
|
/* Init error key, if not already initialized */
|
||||||
|
pthread_once(&__guac_error_key_init, __guac_alloc_error_key);
|
||||||
|
|
||||||
|
/* Retrieve thread-local status variable */
|
||||||
|
status = (guac_status*) pthread_getspecific(__guac_error_key);
|
||||||
|
|
||||||
|
/* Allocate thread-local status variable if not already allocated */
|
||||||
|
if (status == NULL) {
|
||||||
|
status = malloc(sizeof(guac_status));
|
||||||
|
pthread_setspecific(__guac_error_key, status);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const char** __guac_error_message() {
|
||||||
|
|
||||||
|
/* Pointer for thread-local data */
|
||||||
|
const char** message;
|
||||||
|
|
||||||
|
/* Init error message key, if not already initialized */
|
||||||
|
pthread_once(
|
||||||
|
&__guac_error_message_key_init,
|
||||||
|
__guac_alloc_error_message_key
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Retrieve thread-local message variable */
|
||||||
|
message = (const char**) pthread_getspecific(__guac_error_message_key);
|
||||||
|
|
||||||
|
/* Allocate thread-local message variable if not already allocated */
|
||||||
|
if (message == NULL) {
|
||||||
|
message = malloc(sizeof(const char*));
|
||||||
|
pthread_setspecific(__guac_error_message_key, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
return message;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Default (not-threadsafe) implementation */
|
||||||
|
static guac_status __guac_error_unsafe_storage;
|
||||||
|
static const char** __guac_error_message_unsafe_storage;
|
||||||
|
|
||||||
|
guac_status* __guac_error() {
|
||||||
|
return &__guac_error_unsafe_storage;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char** __guac_error_message() {
|
||||||
|
return &__guac_error_message_unsafe_storage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Warn about threadsafety */
|
||||||
|
#warn No threadsafe implementation of __guac_error exists for your platform, so a default non-threadsafe implementation has been used instead. This may lead to incorrect status codes being reported for failures. Please consider adding support for your platform, or filing a bug report with the Guacamole project.
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
151
libguac/src/hash.c
Normal file
151
libguac/src/hash.c
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <cairo/cairo.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Arbitrary hash function whhich maps ALL 32-bit numbers onto 24-bit numbers
|
||||||
|
* evenly, while guaranteeing that all 24-bit numbers are mapped onto
|
||||||
|
* themselves.
|
||||||
|
*/
|
||||||
|
unsigned int _guac_hash_32to24(unsigned int value) {
|
||||||
|
|
||||||
|
/* Grab highest-order byte */
|
||||||
|
unsigned int upper = value & 0xFF000000;
|
||||||
|
|
||||||
|
/* XOR upper with lower three bytes, truncate to 24-bit */
|
||||||
|
return
|
||||||
|
(value & 0xFFFFFF)
|
||||||
|
^ (upper >> 8)
|
||||||
|
^ (upper >> 16)
|
||||||
|
^ (upper >> 24);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rotates a given 32-bit integer by N bits.
|
||||||
|
*
|
||||||
|
* NOTE: We probably should check for available bitops.h macros first.
|
||||||
|
*/
|
||||||
|
unsigned int _guac_rotate(unsigned int value, int amount) {
|
||||||
|
|
||||||
|
/* amount = amount % 32 */
|
||||||
|
amount &= 0x1F;
|
||||||
|
|
||||||
|
/* Return rotated amount */
|
||||||
|
return (value >> amount) | (value << (32 - amount));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int guac_hash_surface(cairo_surface_t* surface) {
|
||||||
|
|
||||||
|
/* Init to zero */
|
||||||
|
unsigned int hash_value = 0;
|
||||||
|
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
/* Get image data and metrics */
|
||||||
|
unsigned char* data = cairo_image_surface_get_data(surface);
|
||||||
|
int width = cairo_image_surface_get_width(surface);
|
||||||
|
int height = cairo_image_surface_get_height(surface);
|
||||||
|
int stride = cairo_image_surface_get_stride(surface);
|
||||||
|
|
||||||
|
for (y=0; y<height; y++) {
|
||||||
|
|
||||||
|
/* Get current row */
|
||||||
|
uint32_t* row = (uint32_t*) data;
|
||||||
|
data += stride;
|
||||||
|
|
||||||
|
for (x=0; x<width; x++) {
|
||||||
|
|
||||||
|
/* Get color at current pixel */
|
||||||
|
unsigned int color = *row;
|
||||||
|
row++;
|
||||||
|
|
||||||
|
/* Compute next hash */
|
||||||
|
hash_value =
|
||||||
|
_guac_rotate(hash_value, 1) ^ color ^ 0x1B872E69;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end for each row */
|
||||||
|
|
||||||
|
/* Done */
|
||||||
|
return _guac_hash_32to24(hash_value);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int guac_surface_cmp(cairo_surface_t* a, cairo_surface_t* b) {
|
||||||
|
|
||||||
|
/* Surface A metrics */
|
||||||
|
unsigned char* data_a = cairo_image_surface_get_data(a);
|
||||||
|
int width_a = cairo_image_surface_get_width(a);
|
||||||
|
int height_a = cairo_image_surface_get_height(a);
|
||||||
|
int stride_a = cairo_image_surface_get_stride(a);
|
||||||
|
|
||||||
|
/* Surface B metrics */
|
||||||
|
unsigned char* data_b = cairo_image_surface_get_data(b);
|
||||||
|
int width_b = cairo_image_surface_get_width(b);
|
||||||
|
int height_b = cairo_image_surface_get_height(b);
|
||||||
|
int stride_b = cairo_image_surface_get_stride(b);
|
||||||
|
|
||||||
|
int y;
|
||||||
|
|
||||||
|
/* If core dimensions differ, just compare those. Done. */
|
||||||
|
if (width_a != width_b) return width_a - width_b;
|
||||||
|
if (height_a != height_b) return height_a - height_b;
|
||||||
|
|
||||||
|
for (y=0; y<height_a; y++) {
|
||||||
|
|
||||||
|
/* Compare row. If different, use that result. */
|
||||||
|
int cmp_result = memcmp(data_a, data_b, width_a * 4);
|
||||||
|
if (cmp_result != 0)
|
||||||
|
return cmp_result;
|
||||||
|
|
||||||
|
/* Next row */
|
||||||
|
data_a += stride_a;
|
||||||
|
data_b += stride_b;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Otherwise, same. */
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
334
libguac/src/instruction.c
Normal file
334
libguac/src/instruction.c
Normal file
@ -0,0 +1,334 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "error.h"
|
||||||
|
#include "instruction.h"
|
||||||
|
#include "protocol.h"
|
||||||
|
#include "socket.h"
|
||||||
|
#include "unicode.h"
|
||||||
|
|
||||||
|
int __guac_fill_instructionbuf(guac_socket* socket) {
|
||||||
|
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
/* Attempt to fill buffer */
|
||||||
|
retval = guac_socket_read(
|
||||||
|
socket,
|
||||||
|
socket->__instructionbuf + socket->__instructionbuf_used_length,
|
||||||
|
socket->__instructionbuf_size - socket->__instructionbuf_used_length
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Set guac_error if recv() unsuccessful */
|
||||||
|
if (retval < 0) {
|
||||||
|
guac_error = GUAC_STATUS_SEE_ERRNO;
|
||||||
|
guac_error_message = "Error filling instruction buffer";
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
socket->__instructionbuf_used_length += retval;
|
||||||
|
|
||||||
|
/* Expand buffer if necessary */
|
||||||
|
if (socket->__instructionbuf_used_length >
|
||||||
|
socket->__instructionbuf_size / 2) {
|
||||||
|
|
||||||
|
socket->__instructionbuf_size *= 2;
|
||||||
|
socket->__instructionbuf = realloc(socket->__instructionbuf,
|
||||||
|
socket->__instructionbuf_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Returns new instruction if one exists, or NULL if no more instructions. */
|
||||||
|
guac_instruction* guac_instruction_read(guac_socket* socket,
|
||||||
|
int usec_timeout) {
|
||||||
|
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
/* Loop until a instruction is read */
|
||||||
|
for (;;) {
|
||||||
|
|
||||||
|
/* Length of element, in Unicode characters */
|
||||||
|
int element_length = 0;
|
||||||
|
|
||||||
|
/* Length of element, in bytes */
|
||||||
|
int element_byte_length = 0;
|
||||||
|
|
||||||
|
/* Current position within the element, in Unicode characters */
|
||||||
|
int current_unicode_length = 0;
|
||||||
|
|
||||||
|
/* Position within buffer */
|
||||||
|
int i = socket->__instructionbuf_parse_start;
|
||||||
|
|
||||||
|
/* Parse instruction in buffer */
|
||||||
|
while (i < socket->__instructionbuf_used_length) {
|
||||||
|
|
||||||
|
/* Read character from buffer */
|
||||||
|
char c = socket->__instructionbuf[i++];
|
||||||
|
|
||||||
|
/* If digit, calculate element length */
|
||||||
|
if (c >= '0' && c <= '9')
|
||||||
|
element_length = element_length * 10 + c - '0';
|
||||||
|
|
||||||
|
/* Otherwise, if end of length */
|
||||||
|
else if (c == '.') {
|
||||||
|
|
||||||
|
/* Calculate element byte length by walking buffer */
|
||||||
|
while (i + element_byte_length <
|
||||||
|
socket->__instructionbuf_used_length
|
||||||
|
&& current_unicode_length < element_length) {
|
||||||
|
|
||||||
|
/* Get next byte */
|
||||||
|
c = socket->__instructionbuf[i + element_byte_length];
|
||||||
|
|
||||||
|
/* Update byte and character lengths */
|
||||||
|
element_byte_length += guac_utf8_charsize((unsigned) c);
|
||||||
|
current_unicode_length++;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Verify element is fully read */
|
||||||
|
if (current_unicode_length == element_length) {
|
||||||
|
|
||||||
|
/* Get element value */
|
||||||
|
char* elementv = &(socket->__instructionbuf[i]);
|
||||||
|
|
||||||
|
/* Get terminator, set null terminator of elementv */
|
||||||
|
char terminator = elementv[element_byte_length];
|
||||||
|
elementv[element_byte_length] = '\0';
|
||||||
|
|
||||||
|
/* Move to char after terminator of element */
|
||||||
|
i += element_byte_length+1;
|
||||||
|
|
||||||
|
/* Reset element length */
|
||||||
|
element_length =
|
||||||
|
element_byte_length =
|
||||||
|
current_unicode_length = 0;
|
||||||
|
|
||||||
|
/* As element has been read successfully, update
|
||||||
|
* parse start */
|
||||||
|
socket->__instructionbuf_parse_start = i;
|
||||||
|
|
||||||
|
/* Save element */
|
||||||
|
socket->__instructionbuf_elementv[socket->__instructionbuf_elementc++] = elementv;
|
||||||
|
|
||||||
|
/* Finish parse if terminator is a semicolon */
|
||||||
|
if (terminator == ';') {
|
||||||
|
|
||||||
|
guac_instruction* parsed_instruction;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
/* Allocate instruction */
|
||||||
|
parsed_instruction = malloc(sizeof(guac_instruction));
|
||||||
|
if (parsed_instruction == NULL) {
|
||||||
|
guac_error = GUAC_STATUS_NO_MEMORY;
|
||||||
|
guac_error_message = "Could not allocate memory for parsed instruction";
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Init parsed instruction */
|
||||||
|
parsed_instruction->argc = socket->__instructionbuf_elementc - 1;
|
||||||
|
parsed_instruction->argv = malloc(sizeof(char*) * parsed_instruction->argc);
|
||||||
|
|
||||||
|
/* Fail if memory could not be alloc'd for argv */
|
||||||
|
if (parsed_instruction->argv == NULL) {
|
||||||
|
guac_error = GUAC_STATUS_NO_MEMORY;
|
||||||
|
guac_error_message = "Could not allocate memory for arguments of parsed instruction";
|
||||||
|
free(parsed_instruction);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set opcode */
|
||||||
|
parsed_instruction->opcode = strdup(socket->__instructionbuf_elementv[0]);
|
||||||
|
|
||||||
|
/* Fail if memory could not be alloc'd for opcode */
|
||||||
|
if (parsed_instruction->opcode == NULL) {
|
||||||
|
guac_error = GUAC_STATUS_NO_MEMORY;
|
||||||
|
guac_error_message = "Could not allocate memory for opcode of parsed instruction";
|
||||||
|
free(parsed_instruction->argv);
|
||||||
|
free(parsed_instruction);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Copy element values to parsed instruction */
|
||||||
|
for (j=0; j<parsed_instruction->argc; j++) {
|
||||||
|
parsed_instruction->argv[j] = strdup(socket->__instructionbuf_elementv[j+1]);
|
||||||
|
|
||||||
|
/* Free memory and fail if out of mem */
|
||||||
|
if (parsed_instruction->argv[j] == NULL) {
|
||||||
|
guac_error = GUAC_STATUS_NO_MEMORY;
|
||||||
|
guac_error_message = "Could not allocate memory for single argument of parsed instruction";
|
||||||
|
|
||||||
|
/* Free all alloc'd argv values */
|
||||||
|
while (--j >= 0)
|
||||||
|
free(parsed_instruction->argv[j]);
|
||||||
|
|
||||||
|
free(parsed_instruction->opcode);
|
||||||
|
free(parsed_instruction->argv);
|
||||||
|
free(parsed_instruction);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reset buffer */
|
||||||
|
memmove(socket->__instructionbuf, socket->__instructionbuf + i, socket->__instructionbuf_used_length - i);
|
||||||
|
socket->__instructionbuf_used_length -= i;
|
||||||
|
socket->__instructionbuf_parse_start = 0;
|
||||||
|
socket->__instructionbuf_elementc = 0;
|
||||||
|
|
||||||
|
/* Done */
|
||||||
|
return parsed_instruction;
|
||||||
|
|
||||||
|
} /* end if terminator */
|
||||||
|
|
||||||
|
/* Error if expected comma is not present */
|
||||||
|
else if (terminator != ',') {
|
||||||
|
guac_error = GUAC_STATUS_BAD_ARGUMENT;
|
||||||
|
guac_error_message = "Element terminator of instruction was not ';' nor ','";
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end if element fully read */
|
||||||
|
|
||||||
|
/* Otherwise, read more data */
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Error if length is non-numeric or does not end in a period */
|
||||||
|
else {
|
||||||
|
guac_error = GUAC_STATUS_BAD_ARGUMENT;
|
||||||
|
guac_error_message = "Non-numeric character in element length";
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* No instruction yet? Get more data ... */
|
||||||
|
retval = guac_socket_select(socket, usec_timeout);
|
||||||
|
if (retval <= 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* If more data is available, fill into buffer */
|
||||||
|
retval = __guac_fill_instructionbuf(socket);
|
||||||
|
|
||||||
|
/* Error, guac_error already set */
|
||||||
|
if (retval < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* EOF */
|
||||||
|
if (retval == 0) {
|
||||||
|
guac_error = GUAC_STATUS_NO_INPUT;
|
||||||
|
guac_error_message = "End of stream reached while reading instruction";
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
guac_instruction* guac_instruction_expect(guac_socket* socket, int usec_timeout,
|
||||||
|
const char* opcode) {
|
||||||
|
|
||||||
|
guac_instruction* instruction;
|
||||||
|
|
||||||
|
/* Wait for data until timeout */
|
||||||
|
if (guac_instruction_waiting(socket, usec_timeout) <= 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Read available instruction */
|
||||||
|
instruction = guac_instruction_read(socket, usec_timeout);
|
||||||
|
if (instruction == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Validate instruction */
|
||||||
|
if (strcmp(instruction->opcode, opcode) != 0) {
|
||||||
|
guac_error = GUAC_STATUS_BAD_STATE;
|
||||||
|
guac_error_message = "Instruction read did not have expected opcode";
|
||||||
|
guac_instruction_free(instruction);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return instruction if valid */
|
||||||
|
return instruction;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void guac_instruction_free(guac_instruction* instruction) {
|
||||||
|
|
||||||
|
int argc = instruction->argc;
|
||||||
|
|
||||||
|
/* Free opcode */
|
||||||
|
free(instruction->opcode);
|
||||||
|
|
||||||
|
/* Free argv if set (may be NULL of argc is 0) */
|
||||||
|
if (instruction->argv) {
|
||||||
|
|
||||||
|
/* All argument values */
|
||||||
|
while (argc > 0)
|
||||||
|
free(instruction->argv[--argc]);
|
||||||
|
|
||||||
|
/* Free actual array */
|
||||||
|
free(instruction->argv);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free instruction */
|
||||||
|
free(instruction);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int guac_instruction_waiting(guac_socket* socket, int usec_timeout) {
|
||||||
|
|
||||||
|
if (socket->__instructionbuf_used_length > 0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return guac_socket_select(socket, usec_timeout);
|
||||||
|
}
|
||||||
|
|
153
libguac/src/palette.c
Normal file
153
libguac/src/palette.c
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
#include <cairo/cairo.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include "palette.h"
|
||||||
|
|
||||||
|
guac_palette* guac_palette_alloc(cairo_surface_t* surface) {
|
||||||
|
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
int width = cairo_image_surface_get_width(surface);
|
||||||
|
int height = cairo_image_surface_get_height(surface);
|
||||||
|
int stride = cairo_image_surface_get_stride(surface);
|
||||||
|
unsigned char* data = cairo_image_surface_get_data(surface);
|
||||||
|
|
||||||
|
/* Allocate palette */
|
||||||
|
guac_palette* palette = (guac_palette*) malloc(sizeof(guac_palette));
|
||||||
|
memset(palette, 0, sizeof(guac_palette));
|
||||||
|
|
||||||
|
for (y=0; y<height; y++) {
|
||||||
|
for (x=0; x<width; x++) {
|
||||||
|
|
||||||
|
/* Get pixel color */
|
||||||
|
int color = ((uint32_t*) data)[x] & 0xFFFFFF;
|
||||||
|
|
||||||
|
/* Calculate hash code */
|
||||||
|
int hash = ((color & 0xFFF000) >> 12) ^ (color & 0xFFF);
|
||||||
|
|
||||||
|
guac_palette_entry* entry;
|
||||||
|
|
||||||
|
/* Search for open palette entry */
|
||||||
|
for (;;) {
|
||||||
|
|
||||||
|
entry = &(palette->entries[hash]);
|
||||||
|
|
||||||
|
/* If we've found a free space, use it */
|
||||||
|
if (entry->index == 0) {
|
||||||
|
|
||||||
|
png_color* c;
|
||||||
|
|
||||||
|
/* Stop if already at capacity */
|
||||||
|
if (palette->size == 256) {
|
||||||
|
guac_palette_free(palette);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Store in palette */
|
||||||
|
c = &(palette->colors[palette->size]);
|
||||||
|
c->blue = (color ) & 0xFF;
|
||||||
|
c->green = (color >> 8 ) & 0xFF;
|
||||||
|
c->red = (color >> 16) & 0xFF;
|
||||||
|
|
||||||
|
/* Add color to map */
|
||||||
|
entry->index = ++palette->size;
|
||||||
|
entry->color = color;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Otherwise, if already stored here, done */
|
||||||
|
if (entry->color == color)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Otherwise, collision. Move on to another bucket */
|
||||||
|
hash = (hash+1) & 0xFFF;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Advance to next data row */
|
||||||
|
data += stride;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return palette;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int guac_palette_find(guac_palette* palette, int color) {
|
||||||
|
|
||||||
|
/* Calculate hash code */
|
||||||
|
int hash = ((color & 0xFFF000) >> 12) ^ (color & 0xFFF);
|
||||||
|
|
||||||
|
guac_palette_entry* entry;
|
||||||
|
|
||||||
|
/* Search for palette entry */
|
||||||
|
for (;;) {
|
||||||
|
|
||||||
|
entry = &(palette->entries[hash]);
|
||||||
|
|
||||||
|
/* If we've found a free space, color not stored. */
|
||||||
|
if (entry->index == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* Otherwise, if color indeed stored here, done */
|
||||||
|
if (entry->color == color)
|
||||||
|
return entry->index - 1;
|
||||||
|
|
||||||
|
/* Otherwise, collision. Move on to another bucket */
|
||||||
|
hash = (hash+1) & 0xFFF;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void guac_palette_free(guac_palette* palette) {
|
||||||
|
free(palette);
|
||||||
|
}
|
||||||
|
|
141
libguac/src/plugin.c
Normal file
141
libguac/src/plugin.c
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <dlfcn.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "client.h"
|
||||||
|
#include "client-handlers.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "plugin.h"
|
||||||
|
#include "protocol.h"
|
||||||
|
#include "socket.h"
|
||||||
|
#include "time.h"
|
||||||
|
|
||||||
|
guac_client_plugin* guac_client_plugin_open(const char* protocol) {
|
||||||
|
|
||||||
|
guac_client_plugin* plugin;
|
||||||
|
|
||||||
|
/* Reference to dlopen()'d plugin */
|
||||||
|
void* client_plugin_handle;
|
||||||
|
|
||||||
|
/* Client args description */
|
||||||
|
const char** client_args;
|
||||||
|
|
||||||
|
/* Pluggable client */
|
||||||
|
char protocol_lib[GUAC_PROTOCOL_LIBRARY_LIMIT] =
|
||||||
|
GUAC_PROTOCOL_LIBRARY_PREFIX;
|
||||||
|
|
||||||
|
union {
|
||||||
|
guac_client_init_handler* client_init;
|
||||||
|
void* obj;
|
||||||
|
} alias;
|
||||||
|
|
||||||
|
/* Add protocol and .so suffix to protocol_lib */
|
||||||
|
strncat(protocol_lib, protocol, GUAC_PROTOCOL_NAME_LIMIT-1);
|
||||||
|
strcat(protocol_lib, GUAC_PROTOCOL_LIBRARY_SUFFIX);
|
||||||
|
|
||||||
|
/* Load client plugin */
|
||||||
|
client_plugin_handle = dlopen(protocol_lib, RTLD_LAZY);
|
||||||
|
if (!client_plugin_handle) {
|
||||||
|
guac_error = GUAC_STATUS_BAD_ARGUMENT;
|
||||||
|
guac_error_message = dlerror();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
dlerror(); /* Clear errors */
|
||||||
|
|
||||||
|
/* Get init function */
|
||||||
|
alias.obj = dlsym(client_plugin_handle, "guac_client_init");
|
||||||
|
|
||||||
|
/* Fail if cannot find guac_client_init */
|
||||||
|
if (dlerror() != NULL) {
|
||||||
|
guac_error = GUAC_STATUS_BAD_ARGUMENT;
|
||||||
|
guac_error_message = dlerror();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get usage strig */
|
||||||
|
client_args = (const char**) dlsym(client_plugin_handle, "GUAC_CLIENT_ARGS");
|
||||||
|
|
||||||
|
/* Fail if cannot find GUAC_CLIENT_ARGS */
|
||||||
|
if (dlerror() != NULL) {
|
||||||
|
guac_error = GUAC_STATUS_BAD_ARGUMENT;
|
||||||
|
guac_error_message = dlerror();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate plugin */
|
||||||
|
plugin = malloc(sizeof(guac_client_plugin));
|
||||||
|
if (plugin == NULL) {
|
||||||
|
guac_error = GUAC_STATUS_NO_MEMORY;
|
||||||
|
guac_error_message = "Could not allocate memory for client plugin";
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Init and return plugin */
|
||||||
|
plugin->__client_plugin_handle = client_plugin_handle;
|
||||||
|
plugin->init_handler = alias.client_init;
|
||||||
|
plugin->args = client_args;
|
||||||
|
return plugin;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int guac_client_plugin_close(guac_client_plugin* plugin) {
|
||||||
|
|
||||||
|
/* Unload client plugin */
|
||||||
|
if (dlclose(plugin->__client_plugin_handle)) {
|
||||||
|
guac_error = GUAC_STATUS_BAD_STATE;
|
||||||
|
guac_error_message = dlerror();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free plugin handle */
|
||||||
|
free(plugin);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int guac_client_plugin_init_client(guac_client_plugin* plugin,
|
||||||
|
guac_client* client, int argc, char** argv) {
|
||||||
|
|
||||||
|
return plugin->init_handler(client, argc, argv);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
125
libguac/src/pool.c
Normal file
125
libguac/src/pool.c
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 "pool.h"
|
||||||
|
|
||||||
|
guac_pool* guac_pool_alloc(int size) {
|
||||||
|
|
||||||
|
guac_pool* pool = malloc(sizeof(guac_pool));
|
||||||
|
|
||||||
|
/* If unable to allocate, just return NULL. */
|
||||||
|
if (pool == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Initialize empty pool */
|
||||||
|
pool->min_size = size;
|
||||||
|
pool->__next_value = 0;
|
||||||
|
pool->__head = NULL;
|
||||||
|
pool->__tail = NULL;
|
||||||
|
|
||||||
|
return pool;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void guac_pool_free(guac_pool* pool) {
|
||||||
|
|
||||||
|
/* Free all ints in pool */
|
||||||
|
guac_pool_int* current = pool->__head;
|
||||||
|
while (current != NULL) {
|
||||||
|
|
||||||
|
guac_pool_int* old = current;
|
||||||
|
current = current->__next;
|
||||||
|
|
||||||
|
free(old);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free pool */
|
||||||
|
free(pool);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int guac_pool_next_int(guac_pool* pool) {
|
||||||
|
|
||||||
|
int value;
|
||||||
|
|
||||||
|
/* If more integers are needed, or we are out of integers, return a new one. */
|
||||||
|
if (pool->__head == NULL || pool->__next_value < pool->min_size)
|
||||||
|
return pool->__next_value++;
|
||||||
|
|
||||||
|
/* Otherwise, remove first integer. */
|
||||||
|
value = pool->__head->value;
|
||||||
|
|
||||||
|
/* If only one element exists, reset pool to empty. */
|
||||||
|
if (pool->__tail == pool->__head) {
|
||||||
|
free(pool->__head);
|
||||||
|
pool->__head = NULL;
|
||||||
|
pool->__tail = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Otherwise, advance head. */
|
||||||
|
else {
|
||||||
|
guac_pool_int* old_head = pool->__head;
|
||||||
|
pool->__head = old_head->__next;
|
||||||
|
free(old_head);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return retrieved value. */
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void guac_pool_free_int(guac_pool* pool, int value) {
|
||||||
|
|
||||||
|
/* Allocate and initialize new returned value */
|
||||||
|
guac_pool_int* pool_int = malloc(sizeof(guac_pool_int));
|
||||||
|
pool_int->value = value;
|
||||||
|
pool_int->__next = NULL;
|
||||||
|
|
||||||
|
/* If pool empty, store as sole entry. */
|
||||||
|
if (pool->__tail == NULL)
|
||||||
|
pool->__head = pool->__tail = pool_int;
|
||||||
|
|
||||||
|
/* Otherwise, append to end of pool. */
|
||||||
|
else {
|
||||||
|
pool->__tail->__next = pool_int;
|
||||||
|
pool->__tail = pool_int;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
1053
libguac/src/protocol.c
Normal file
1053
libguac/src/protocol.c
Normal file
File diff suppressed because it is too large
Load Diff
163
libguac/src/socket-fd.c
Normal file
163
libguac/src/socket-fd.c
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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):
|
||||||
|
* David PHAM-VAN <d.pham-van@ulteo.com> Ulteo SAS - http://www.ulteo.com
|
||||||
|
*
|
||||||
|
* 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 <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
#include <winsock2.h>
|
||||||
|
#else
|
||||||
|
#include <sys/select.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include "socket.h"
|
||||||
|
#include "error.h"
|
||||||
|
|
||||||
|
typedef struct __guac_socket_fd_data {
|
||||||
|
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
} __guac_socket_fd_data;
|
||||||
|
|
||||||
|
ssize_t __guac_socket_fd_read_handler(guac_socket* socket,
|
||||||
|
void* buf, size_t count) {
|
||||||
|
|
||||||
|
__guac_socket_fd_data* data = (__guac_socket_fd_data*) socket->data;
|
||||||
|
|
||||||
|
/* Read from socket */
|
||||||
|
int retval = read(data->fd, buf, count);
|
||||||
|
|
||||||
|
/* Record errors in guac_error */
|
||||||
|
if (retval < 0) {
|
||||||
|
guac_error = GUAC_STATUS_SEE_ERRNO;
|
||||||
|
guac_error_message = "Error reading data from socket";
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t __guac_socket_fd_write_handler(guac_socket* socket,
|
||||||
|
void* buf, size_t count) {
|
||||||
|
|
||||||
|
__guac_socket_fd_data* data = (__guac_socket_fd_data*) socket->data;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
/* MINGW32 WINSOCK only works with send() */
|
||||||
|
retval = send(data->fd, buf, count, 0);
|
||||||
|
#else
|
||||||
|
/* Use write() for all other platforms */
|
||||||
|
retval = write(data->fd, buf, count);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Record errors in guac_error */
|
||||||
|
if (retval < 0) {
|
||||||
|
guac_error = GUAC_STATUS_SEE_ERRNO;
|
||||||
|
guac_error_message = "Error writing data to socket";
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int __guac_socket_fd_select_handler(guac_socket* socket, int usec_timeout) {
|
||||||
|
|
||||||
|
__guac_socket_fd_data* data = (__guac_socket_fd_data*) socket->data;
|
||||||
|
|
||||||
|
fd_set fds;
|
||||||
|
struct timeval timeout;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
/* No timeout if usec_timeout is negative */
|
||||||
|
if (usec_timeout < 0)
|
||||||
|
retval = select(data->fd + 1, &fds, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
/* Handle timeout if specified */
|
||||||
|
else {
|
||||||
|
timeout.tv_sec = usec_timeout/1000000;
|
||||||
|
timeout.tv_usec = usec_timeout%1000000;
|
||||||
|
|
||||||
|
FD_ZERO(&fds);
|
||||||
|
FD_SET(data->fd, &fds);
|
||||||
|
|
||||||
|
retval = select(data->fd + 1, &fds, NULL, NULL, &timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Properly set guac_error */
|
||||||
|
if (retval < 0) {
|
||||||
|
guac_error = GUAC_STATUS_SEE_ERRNO;
|
||||||
|
guac_error_message = "Error while waiting for data on socket";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (retval == 0) {
|
||||||
|
guac_error = GUAC_STATUS_INPUT_TIMEOUT;
|
||||||
|
guac_error_message = "Timeout while waiting for data on socket";
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
guac_socket* guac_socket_open(int fd) {
|
||||||
|
|
||||||
|
/* Allocate socket and associated data */
|
||||||
|
guac_socket* socket = guac_socket_alloc();
|
||||||
|
__guac_socket_fd_data* data = malloc(sizeof(__guac_socket_fd_data));
|
||||||
|
|
||||||
|
/* Store file descriptor as socket data */
|
||||||
|
data->fd = fd;
|
||||||
|
socket->data = data;
|
||||||
|
|
||||||
|
/* Set read/write handlers */
|
||||||
|
socket->read_handler = __guac_socket_fd_read_handler;
|
||||||
|
socket->write_handler = __guac_socket_fd_write_handler;
|
||||||
|
socket->select_handler = __guac_socket_fd_select_handler;
|
||||||
|
|
||||||
|
return socket;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
152
libguac/src/socket-nest.c
Normal file
152
libguac/src/socket-nest.c
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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):
|
||||||
|
* David PHAM-VAN <d.pham-van@ulteo.com> Ulteo SAS - http://www.ulteo.com
|
||||||
|
*
|
||||||
|
* 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 <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
#include <winsock2.h>
|
||||||
|
#else
|
||||||
|
#include <sys/select.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include "socket.h"
|
||||||
|
#include "protocol.h"
|
||||||
|
#include "error.h"
|
||||||
|
#include "unicode.h"
|
||||||
|
|
||||||
|
#define GUAC_SOCKET_NEST_BUFFER_SIZE 8192
|
||||||
|
|
||||||
|
typedef struct __guac_socket_nest_data {
|
||||||
|
|
||||||
|
guac_socket* parent;
|
||||||
|
char buffer[GUAC_SOCKET_NEST_BUFFER_SIZE];
|
||||||
|
int index;
|
||||||
|
|
||||||
|
} __guac_socket_nest_data;
|
||||||
|
|
||||||
|
ssize_t __guac_socket_nest_write_handler(guac_socket* socket,
|
||||||
|
void* buf, size_t count) {
|
||||||
|
|
||||||
|
__guac_socket_nest_data* data = (__guac_socket_nest_data*) socket->data;
|
||||||
|
unsigned char* source = (unsigned char*) buf;
|
||||||
|
|
||||||
|
/* Current location in destination buffer during copy */
|
||||||
|
char* current = data->buffer;
|
||||||
|
|
||||||
|
/* Number of bytes remaining in source buffer */
|
||||||
|
int remaining = count;
|
||||||
|
|
||||||
|
/* If we can't actually store that many bytes, reduce number of bytes
|
||||||
|
* expected to be written */
|
||||||
|
if (remaining > GUAC_SOCKET_NEST_BUFFER_SIZE)
|
||||||
|
remaining = GUAC_SOCKET_NEST_BUFFER_SIZE;
|
||||||
|
|
||||||
|
/* Current offset within destination buffer */
|
||||||
|
int offset;
|
||||||
|
|
||||||
|
/* Number of characters before start of next character */
|
||||||
|
int skip = 0;
|
||||||
|
|
||||||
|
/* Copy UTF-8 characters into buffer */
|
||||||
|
for (offset = 0; offset < GUAC_SOCKET_NEST_BUFFER_SIZE; offset++) {
|
||||||
|
|
||||||
|
/* Get next byte */
|
||||||
|
unsigned char c = *source;
|
||||||
|
remaining--;
|
||||||
|
|
||||||
|
/* If skipping, then skip */
|
||||||
|
if (skip > 0) skip--;
|
||||||
|
|
||||||
|
/* Otherwise, determine next skip value, and increment length */
|
||||||
|
else {
|
||||||
|
|
||||||
|
/* Determine skip value (size in bytes of rest of character) */
|
||||||
|
skip = guac_utf8_charsize(c) - 1;
|
||||||
|
|
||||||
|
/* If not enough bytes to complete character, break */
|
||||||
|
if (skip > remaining)
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Store byte */
|
||||||
|
*current = c;
|
||||||
|
|
||||||
|
/* Advance to next character */
|
||||||
|
source++;
|
||||||
|
current++;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Append null-terminator */
|
||||||
|
*current = 0;
|
||||||
|
|
||||||
|
/* Send nest instruction containing read UTF-8 segment */
|
||||||
|
guac_protocol_send_nest(data->parent, data->index, data->buffer);
|
||||||
|
|
||||||
|
/* Return number of bytes actually written */
|
||||||
|
return offset;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
guac_socket* guac_socket_nest(guac_socket* parent, int index) {
|
||||||
|
|
||||||
|
/* Allocate socket and associated data */
|
||||||
|
guac_socket* socket = guac_socket_alloc();
|
||||||
|
__guac_socket_nest_data* data = malloc(sizeof(__guac_socket_nest_data));
|
||||||
|
|
||||||
|
/* Store file descriptor as socket data */
|
||||||
|
data->parent = parent;
|
||||||
|
socket->data = data;
|
||||||
|
|
||||||
|
/* Set write handler */
|
||||||
|
socket->write_handler = __guac_socket_nest_write_handler;
|
||||||
|
|
||||||
|
return socket;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
312
libguac/src/socket.c
Normal file
312
libguac/src/socket.c
Normal file
@ -0,0 +1,312 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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):
|
||||||
|
* David PHAM-VAN <d.pham-van@ulteo.com> Ulteo SAS - http://www.ulteo.com
|
||||||
|
*
|
||||||
|
* 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 <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
#include <winsock2.h>
|
||||||
|
#else
|
||||||
|
#include <sys/select.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#include "socket.h"
|
||||||
|
#include "error.h"
|
||||||
|
|
||||||
|
char __guac_socket_BASE64_CHARACTERS[64] = {
|
||||||
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
|
||||||
|
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
|
||||||
|
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
|
||||||
|
't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
|
||||||
|
'8', '9', '+', '/'
|
||||||
|
};
|
||||||
|
|
||||||
|
ssize_t __guac_socket_write(guac_socket* socket,
|
||||||
|
void* buf, size_t count) {
|
||||||
|
|
||||||
|
/* If handler defined, call it. */
|
||||||
|
if (socket->write_handler)
|
||||||
|
return socket->write_handler(socket, buf, count);
|
||||||
|
|
||||||
|
/* Otherwise, pretend everything was written. */
|
||||||
|
return count;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: Implement guac_socket_write (buffered write) */
|
||||||
|
|
||||||
|
ssize_t guac_socket_read(guac_socket* socket, void* buf, size_t count) {
|
||||||
|
|
||||||
|
/* If handler defined, call it. */
|
||||||
|
if (socket->read_handler)
|
||||||
|
return socket->read_handler(socket, buf, count);
|
||||||
|
|
||||||
|
/* Otherwise, pretend nothing was read. */
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int guac_socket_select(guac_socket* socket, int usec_timeout) {
|
||||||
|
|
||||||
|
/* Call select handler if defined */
|
||||||
|
if (socket->select_handler)
|
||||||
|
return socket->select_handler(socket, usec_timeout);
|
||||||
|
|
||||||
|
/* Otherwise, assume ready. */
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
guac_socket* guac_socket_alloc() {
|
||||||
|
|
||||||
|
guac_socket* socket = malloc(sizeof(guac_socket));
|
||||||
|
|
||||||
|
/* If no memory available, return with error */
|
||||||
|
if (socket == NULL) {
|
||||||
|
guac_error = GUAC_STATUS_NO_MEMORY;
|
||||||
|
guac_error_message = "Could not allocate memory for socket";
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
socket->__ready = 0;
|
||||||
|
socket->__written = 0;
|
||||||
|
socket->data = NULL;
|
||||||
|
|
||||||
|
/* Allocate instruction buffer */
|
||||||
|
socket->__instructionbuf_size = 1024;
|
||||||
|
socket->__instructionbuf = malloc(socket->__instructionbuf_size);
|
||||||
|
|
||||||
|
/* If no memory available, return with error */
|
||||||
|
if (socket->__instructionbuf == NULL) {
|
||||||
|
guac_error = GUAC_STATUS_NO_MEMORY;
|
||||||
|
guac_error_message = "Could not allocate memory for instruction buffer";
|
||||||
|
free(socket);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Init members */
|
||||||
|
socket->__instructionbuf_used_length = 0;
|
||||||
|
socket->__instructionbuf_parse_start = 0;
|
||||||
|
socket->__instructionbuf_elementc = 0;
|
||||||
|
|
||||||
|
/* No handlers yet */
|
||||||
|
socket->read_handler = NULL;
|
||||||
|
socket->write_handler = NULL;
|
||||||
|
socket->select_handler = NULL;
|
||||||
|
socket->free_handler = NULL;
|
||||||
|
|
||||||
|
return socket;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void guac_socket_free(guac_socket* socket) {
|
||||||
|
|
||||||
|
/* Call free handler if defined */
|
||||||
|
if (socket->free_handler)
|
||||||
|
socket->free_handler(socket);
|
||||||
|
|
||||||
|
guac_socket_flush(socket);
|
||||||
|
free(socket->__instructionbuf);
|
||||||
|
free(socket);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t guac_socket_write_int(guac_socket* socket, int64_t i) {
|
||||||
|
|
||||||
|
char buffer[128];
|
||||||
|
snprintf(buffer, sizeof(buffer), "%"PRIi64, i);
|
||||||
|
return guac_socket_write_string(socket, buffer);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t guac_socket_write_string(guac_socket* socket, const char* str) {
|
||||||
|
|
||||||
|
char* __out_buf = socket->__out_buf;
|
||||||
|
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
for (; *str != '\0'; str++) {
|
||||||
|
|
||||||
|
__out_buf[socket->__written++] = *str;
|
||||||
|
|
||||||
|
/* Flush when necessary, return on error */
|
||||||
|
if (socket->__written > 8188 /* sizeof(__out_buf) - 4 */) {
|
||||||
|
|
||||||
|
retval = __guac_socket_write(socket, __out_buf, socket->__written);
|
||||||
|
|
||||||
|
if (retval < 0)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
socket->__written = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t __guac_socket_write_base64_triplet(guac_socket* socket, int a, int b, int c) {
|
||||||
|
|
||||||
|
char* __out_buf = socket->__out_buf;
|
||||||
|
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
/* Byte 1 */
|
||||||
|
__out_buf[socket->__written++] = __guac_socket_BASE64_CHARACTERS[(a & 0xFC) >> 2]; /* [AAAAAA]AABBBB BBBBCC CCCCCC */
|
||||||
|
|
||||||
|
if (b >= 0) {
|
||||||
|
__out_buf[socket->__written++] = __guac_socket_BASE64_CHARACTERS[((a & 0x03) << 4) | ((b & 0xF0) >> 4)]; /* AAAAAA[AABBBB]BBBBCC CCCCCC */
|
||||||
|
|
||||||
|
if (c >= 0) {
|
||||||
|
__out_buf[socket->__written++] = __guac_socket_BASE64_CHARACTERS[((b & 0x0F) << 2) | ((c & 0xC0) >> 6)]; /* AAAAAA AABBBB[BBBBCC]CCCCCC */
|
||||||
|
__out_buf[socket->__written++] = __guac_socket_BASE64_CHARACTERS[c & 0x3F]; /* AAAAAA AABBBB BBBBCC[CCCCCC] */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
__out_buf[socket->__written++] = __guac_socket_BASE64_CHARACTERS[((b & 0x0F) << 2)]; /* AAAAAA AABBBB[BBBB--]------ */
|
||||||
|
__out_buf[socket->__written++] = '='; /* AAAAAA AABBBB BBBB--[------] */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
__out_buf[socket->__written++] = __guac_socket_BASE64_CHARACTERS[((a & 0x03) << 4)]; /* AAAAAA[AA----]------ ------ */
|
||||||
|
__out_buf[socket->__written++] = '='; /* AAAAAA AA----[------]------ */
|
||||||
|
__out_buf[socket->__written++] = '='; /* AAAAAA AA---- ------[------] */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* At this point, 4 bytes have been socket->__written */
|
||||||
|
|
||||||
|
/* Flush when necessary, return on error */
|
||||||
|
if (socket->__written > 8188 /* sizeof(__out_buf) - 4 */) {
|
||||||
|
retval = __guac_socket_write(socket, __out_buf, socket->__written);
|
||||||
|
if (retval < 0)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
socket->__written = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (b < 0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (c < 0)
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
return 3;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t __guac_socket_write_base64_byte(guac_socket* socket, int buf) {
|
||||||
|
|
||||||
|
int* __ready_buf = socket->__ready_buf;
|
||||||
|
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
__ready_buf[socket->__ready++] = buf;
|
||||||
|
|
||||||
|
/* Flush triplet */
|
||||||
|
if (socket->__ready == 3) {
|
||||||
|
retval = __guac_socket_write_base64_triplet(socket, __ready_buf[0], __ready_buf[1], __ready_buf[2]);
|
||||||
|
if (retval < 0)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
socket->__ready = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t guac_socket_write_base64(guac_socket* socket, const void* buf, size_t count) {
|
||||||
|
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
const unsigned char* char_buf = (const unsigned char*) buf;
|
||||||
|
const unsigned char* end = char_buf + count;
|
||||||
|
|
||||||
|
while (char_buf < end) {
|
||||||
|
|
||||||
|
retval = __guac_socket_write_base64_byte(socket, *(char_buf++));
|
||||||
|
if (retval < 0)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t guac_socket_flush(guac_socket* socket) {
|
||||||
|
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
/* Flush remaining bytes in buffer */
|
||||||
|
if (socket->__written > 0) {
|
||||||
|
retval = __guac_socket_write(socket,
|
||||||
|
socket->__out_buf, socket->__written);
|
||||||
|
if (retval < 0)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
socket->__written = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t guac_socket_flush_base64(guac_socket* socket) {
|
||||||
|
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
/* Flush triplet to output buffer */
|
||||||
|
while (socket->__ready > 0) {
|
||||||
|
retval = __guac_socket_write_base64_byte(socket, -1);
|
||||||
|
if (retval < 0)
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
73
libguac/src/timestamp.c
Normal file
73
libguac/src/timestamp.c
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 ***** */
|
||||||
|
|
||||||
|
#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_NANOSLEEP)
|
||||||
|
#include <time.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef HAVE_CLOCK_GETTIME
|
||||||
|
#include <sys/time.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "timestamp.h"
|
||||||
|
|
||||||
|
guac_timestamp guac_timestamp_current() {
|
||||||
|
|
||||||
|
#ifdef HAVE_CLOCK_GETTIME
|
||||||
|
|
||||||
|
struct timespec current;
|
||||||
|
|
||||||
|
/* Get current time */
|
||||||
|
clock_gettime(CLOCK_REALTIME, ¤t);
|
||||||
|
|
||||||
|
/* Calculate milliseconds */
|
||||||
|
return (guac_timestamp) current.tv_sec * 1000 + current.tv_nsec / 1000000;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
struct timeval current;
|
||||||
|
|
||||||
|
/* Get current time */
|
||||||
|
gettimeofday(¤t, NULL);
|
||||||
|
|
||||||
|
/* Calculate milliseconds */
|
||||||
|
return (guac_timestamp) current.tv_sec * 1000 + current.tv_usec / 1000;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
87
libguac/src/unicode.c
Normal file
87
libguac/src/unicode.c
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <stddef.h>
|
||||||
|
|
||||||
|
#include "unicode.h"
|
||||||
|
|
||||||
|
size_t guac_utf8_charsize(unsigned char c) {
|
||||||
|
|
||||||
|
/* Determine size in bytes of character */
|
||||||
|
if ((c >>= 1) == 0x7E) return 6;
|
||||||
|
if ((c >>= 1) == 0x3E) return 5;
|
||||||
|
if ((c >>= 1) == 0x1E) return 4;
|
||||||
|
if ((c >>= 1) == 0x0E) return 3;
|
||||||
|
if ((c >>= 1) == 0x06) return 2;
|
||||||
|
|
||||||
|
/* Default to one character */
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t guac_utf8_strlen(const char* str) {
|
||||||
|
|
||||||
|
/* The current length of the string */
|
||||||
|
int length = 0;
|
||||||
|
|
||||||
|
/* Number of characters before start of next character */
|
||||||
|
int skip = 0;
|
||||||
|
|
||||||
|
while (*str != 0) {
|
||||||
|
|
||||||
|
/* If skipping, then skip */
|
||||||
|
if (skip > 0) skip--;
|
||||||
|
|
||||||
|
/* Otherwise, determine next skip value, and increment length */
|
||||||
|
else {
|
||||||
|
|
||||||
|
/* Get next character */
|
||||||
|
unsigned char c = (unsigned char) *str;
|
||||||
|
|
||||||
|
/* Determine skip value (size in bytes of rest of character) */
|
||||||
|
skip = guac_utf8_charsize(c) - 1;
|
||||||
|
|
||||||
|
length++;
|
||||||
|
}
|
||||||
|
|
||||||
|
str++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return length;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
62
libguac/tests/Makefile.am
Normal file
62
libguac/tests/Makefile.am
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
# ***** 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.
|
||||||
|
#
|
||||||
|
# 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 -I../include
|
||||||
|
|
||||||
|
TESTS = test_libguac
|
||||||
|
check_PROGRAMS = test_libguac
|
||||||
|
|
||||||
|
noinst_HEADERS = \
|
||||||
|
client/client_suite.h \
|
||||||
|
protocol/suite.h \
|
||||||
|
util/util_suite.h
|
||||||
|
|
||||||
|
test_libguac_SOURCES = \
|
||||||
|
test_libguac.c \
|
||||||
|
client/client_suite.c \
|
||||||
|
client/buffer_pool.c \
|
||||||
|
client/layer_pool.c \
|
||||||
|
protocol/suite.c \
|
||||||
|
protocol/instruction_read.c \
|
||||||
|
protocol/instruction_write.c \
|
||||||
|
protocol/nest_write.c \
|
||||||
|
util/util_suite.c \
|
||||||
|
util/guac_pool.c
|
||||||
|
|
||||||
|
test_libguac_LDADD = $(top_builddir)/src/libguac.la @CUNIT_LIBS@
|
||||||
|
|
88
libguac/tests/client/buffer_pool.c
Normal file
88
libguac/tests/client/buffer_pool.c
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <CUnit/Basic.h>
|
||||||
|
|
||||||
|
#include "client.h"
|
||||||
|
#include "client_suite.h"
|
||||||
|
|
||||||
|
void test_buffer_pool() {
|
||||||
|
|
||||||
|
guac_client* client;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
int seen[GUAC_BUFFER_POOL_INITIAL_SIZE] = {0};
|
||||||
|
|
||||||
|
guac_layer* layer;
|
||||||
|
|
||||||
|
/* Get client */
|
||||||
|
client = guac_client_alloc();
|
||||||
|
CU_ASSERT_PTR_NOT_NULL_FATAL(client);
|
||||||
|
|
||||||
|
/* Fill pool */
|
||||||
|
for (i=0; i<GUAC_BUFFER_POOL_INITIAL_SIZE; i++) {
|
||||||
|
|
||||||
|
/* Allocate and throw away a layer (should not disturb buffer alloc) */
|
||||||
|
CU_ASSERT_PTR_NOT_NULL_FATAL(guac_client_alloc_layer(client));
|
||||||
|
|
||||||
|
layer = guac_client_alloc_buffer(client);
|
||||||
|
|
||||||
|
/* Index should be within pool size */
|
||||||
|
CU_ASSERT_PTR_NOT_NULL_FATAL(layer);
|
||||||
|
CU_ASSERT_FATAL(layer->index < 0);
|
||||||
|
CU_ASSERT_FATAL(layer->index >= -GUAC_BUFFER_POOL_INITIAL_SIZE);
|
||||||
|
|
||||||
|
/* This should be a layer we have not seen yet */
|
||||||
|
CU_ASSERT_FALSE(seen[-layer->index - 1]);
|
||||||
|
seen[-layer->index - 1] = 1;
|
||||||
|
|
||||||
|
guac_client_free_buffer(client, layer);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now that pool is filled, we should get a previously seen layer */
|
||||||
|
layer = guac_client_alloc_buffer(client);
|
||||||
|
|
||||||
|
CU_ASSERT_FATAL(layer->index < 0);
|
||||||
|
CU_ASSERT_FATAL(layer->index >= -GUAC_BUFFER_POOL_INITIAL_SIZE);
|
||||||
|
CU_ASSERT_TRUE(seen[-layer->index - 1]);
|
||||||
|
|
||||||
|
/* Free client */
|
||||||
|
guac_client_free(client);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
72
libguac/tests/client/client_suite.c
Normal file
72
libguac/tests/client/client_suite.c
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <CUnit/Basic.h>
|
||||||
|
|
||||||
|
#include "client_suite.h"
|
||||||
|
|
||||||
|
int client_suite_init() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int client_suite_cleanup() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int register_client_suite() {
|
||||||
|
|
||||||
|
/* Add client test suite */
|
||||||
|
CU_pSuite suite = CU_add_suite("client",
|
||||||
|
client_suite_init, client_suite_cleanup);
|
||||||
|
if (suite == NULL) {
|
||||||
|
CU_cleanup_registry();
|
||||||
|
return CU_get_error();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add tests */
|
||||||
|
if (
|
||||||
|
CU_add_test(suite, "layer-pool", test_layer_pool) == NULL
|
||||||
|
|| CU_add_test(suite, "buffer-pool", test_buffer_pool) == NULL
|
||||||
|
) {
|
||||||
|
CU_cleanup_registry();
|
||||||
|
return CU_get_error();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
47
libguac/tests/client/client_suite.h
Normal file
47
libguac/tests/client/client_suite.h
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_TEST_CLIENT_SUITE_H
|
||||||
|
#define _GUAC_TEST_CLIENT_SUITE_H
|
||||||
|
|
||||||
|
int register_client_suite();
|
||||||
|
|
||||||
|
void test_layer_pool();
|
||||||
|
void test_buffer_pool();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
88
libguac/tests/client/layer_pool.c
Normal file
88
libguac/tests/client/layer_pool.c
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <CUnit/Basic.h>
|
||||||
|
|
||||||
|
#include "client.h"
|
||||||
|
#include "client_suite.h"
|
||||||
|
|
||||||
|
void test_layer_pool() {
|
||||||
|
|
||||||
|
guac_client* client;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
int seen[GUAC_BUFFER_POOL_INITIAL_SIZE] = {0};
|
||||||
|
|
||||||
|
guac_layer* layer;
|
||||||
|
|
||||||
|
/* Get client */
|
||||||
|
client = guac_client_alloc();
|
||||||
|
CU_ASSERT_PTR_NOT_NULL_FATAL(client);
|
||||||
|
|
||||||
|
/* Fill pool */
|
||||||
|
for (i=0; i<GUAC_BUFFER_POOL_INITIAL_SIZE; i++) {
|
||||||
|
|
||||||
|
/* Allocate and throw away a buffer (should not disturb layer alloc) */
|
||||||
|
CU_ASSERT_PTR_NOT_NULL_FATAL(guac_client_alloc_buffer(client));
|
||||||
|
|
||||||
|
layer = guac_client_alloc_layer(client);
|
||||||
|
|
||||||
|
/* Index should be within pool size */
|
||||||
|
CU_ASSERT_PTR_NOT_NULL_FATAL(layer);
|
||||||
|
CU_ASSERT_FATAL(layer->index > 0);
|
||||||
|
CU_ASSERT_FATAL(layer->index <= GUAC_BUFFER_POOL_INITIAL_SIZE);
|
||||||
|
|
||||||
|
/* This should be a layer we have not seen yet */
|
||||||
|
CU_ASSERT_FALSE(seen[layer->index - 1]);
|
||||||
|
seen[layer->index - 1] = 1;
|
||||||
|
|
||||||
|
guac_client_free_layer(client, layer);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now that pool is filled, we should get a previously seen layer */
|
||||||
|
layer = guac_client_alloc_layer(client);
|
||||||
|
|
||||||
|
CU_ASSERT_FATAL(layer->index > 0);
|
||||||
|
CU_ASSERT_FATAL(layer->index <= GUAC_BUFFER_POOL_INITIAL_SIZE);
|
||||||
|
CU_ASSERT_TRUE(seen[layer->index - 1]);
|
||||||
|
|
||||||
|
/* Free client */
|
||||||
|
guac_client_free(client);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
122
libguac/tests/protocol/instruction_read.c
Normal file
122
libguac/tests/protocol/instruction_read.c
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <CUnit/Basic.h>
|
||||||
|
|
||||||
|
#include "error.h"
|
||||||
|
#include "instruction.h"
|
||||||
|
#include "protocol.h"
|
||||||
|
#include "socket.h"
|
||||||
|
|
||||||
|
#include "suite.h"
|
||||||
|
|
||||||
|
void test_instruction_read() {
|
||||||
|
|
||||||
|
int rfd, wfd;
|
||||||
|
int fd[2], childpid;
|
||||||
|
|
||||||
|
char test_string[] = "4.test,6.a" UTF8_4 "b,"
|
||||||
|
"5.12345,10.a" UTF8_8 "c;"
|
||||||
|
"5.test2,10.hellohello,15.worldworldworld;";
|
||||||
|
|
||||||
|
/* Create pipe */
|
||||||
|
CU_ASSERT_EQUAL_FATAL(pipe(fd), 0);
|
||||||
|
|
||||||
|
/* File descriptors */
|
||||||
|
rfd = fd[0];
|
||||||
|
wfd = fd[1];
|
||||||
|
|
||||||
|
/* Fork */
|
||||||
|
if ((childpid = fork()) == -1) {
|
||||||
|
/* ERROR */
|
||||||
|
perror("fork");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Child (pipe writer) */
|
||||||
|
if (childpid != 0) {
|
||||||
|
close(rfd);
|
||||||
|
CU_ASSERT_EQUAL(
|
||||||
|
write(wfd, test_string, sizeof(test_string)),
|
||||||
|
sizeof(test_string)
|
||||||
|
);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parent (unit test) */
|
||||||
|
else {
|
||||||
|
|
||||||
|
guac_socket* socket;
|
||||||
|
guac_instruction* instruction;
|
||||||
|
|
||||||
|
close(wfd);
|
||||||
|
|
||||||
|
/* Open guac socket */
|
||||||
|
socket = guac_socket_open(rfd);
|
||||||
|
CU_ASSERT_PTR_NOT_NULL_FATAL(socket);
|
||||||
|
|
||||||
|
/* Read instruction */
|
||||||
|
instruction = guac_instruction_read(socket, 1000000);
|
||||||
|
CU_ASSERT_PTR_NOT_NULL_FATAL(instruction);
|
||||||
|
|
||||||
|
/* Validate contents */
|
||||||
|
CU_ASSERT_STRING_EQUAL(instruction->opcode, "test");
|
||||||
|
CU_ASSERT_EQUAL_FATAL(instruction->argc, 3);
|
||||||
|
CU_ASSERT_STRING_EQUAL(instruction->argv[0], "a" UTF8_4 "b");
|
||||||
|
CU_ASSERT_STRING_EQUAL(instruction->argv[1], "12345");
|
||||||
|
CU_ASSERT_STRING_EQUAL(instruction->argv[2], "a" UTF8_8 "c");
|
||||||
|
|
||||||
|
/* Read another instruction */
|
||||||
|
guac_instruction_free(instruction);
|
||||||
|
instruction = guac_instruction_read(socket, 1000000);
|
||||||
|
|
||||||
|
/* Validate contents */
|
||||||
|
CU_ASSERT_STRING_EQUAL(instruction->opcode, "test2");
|
||||||
|
CU_ASSERT_EQUAL_FATAL(instruction->argc, 2);
|
||||||
|
CU_ASSERT_STRING_EQUAL(instruction->argv[0], "hellohello");
|
||||||
|
CU_ASSERT_STRING_EQUAL(instruction->argv[1], "worldworldworld");
|
||||||
|
|
||||||
|
guac_instruction_free(instruction);
|
||||||
|
guac_socket_free(socket);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
118
libguac/tests/protocol/instruction_write.c
Normal file
118
libguac/tests/protocol/instruction_write.c
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <CUnit/Basic.h>
|
||||||
|
|
||||||
|
#include "error.h"
|
||||||
|
#include "instruction.h"
|
||||||
|
#include "protocol.h"
|
||||||
|
#include "socket.h"
|
||||||
|
|
||||||
|
#include "suite.h"
|
||||||
|
|
||||||
|
void test_instruction_write() {
|
||||||
|
|
||||||
|
int rfd, wfd;
|
||||||
|
int fd[2], childpid;
|
||||||
|
|
||||||
|
/* Create pipe */
|
||||||
|
CU_ASSERT_EQUAL_FATAL(pipe(fd), 0);
|
||||||
|
|
||||||
|
/* File descriptors */
|
||||||
|
rfd = fd[0];
|
||||||
|
wfd = fd[1];
|
||||||
|
|
||||||
|
/* Fork */
|
||||||
|
if ((childpid = fork()) == -1) {
|
||||||
|
/* ERROR */
|
||||||
|
perror("fork");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Child (pipe writer) */
|
||||||
|
if (childpid != 0) {
|
||||||
|
|
||||||
|
guac_socket* socket;
|
||||||
|
|
||||||
|
close(rfd);
|
||||||
|
|
||||||
|
/* Open guac socket */
|
||||||
|
socket = guac_socket_open(wfd);
|
||||||
|
|
||||||
|
/* Write instruction */
|
||||||
|
guac_protocol_send_clipboard(socket, "a" UTF8_4 "b" UTF8_4 "c");
|
||||||
|
guac_protocol_send_sync(socket, 12345);
|
||||||
|
guac_socket_flush(socket);
|
||||||
|
|
||||||
|
guac_socket_free(socket);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parent (unit test) */
|
||||||
|
else {
|
||||||
|
|
||||||
|
char expected[] =
|
||||||
|
"9.clipboard,11.a" UTF8_4 "b" UTF8_4 "c;"
|
||||||
|
"4.sync,5.12345;";
|
||||||
|
|
||||||
|
int numread;
|
||||||
|
char buffer[1024];
|
||||||
|
int offset = 0;
|
||||||
|
|
||||||
|
close(wfd);
|
||||||
|
|
||||||
|
/* Read everything available into buffer */
|
||||||
|
while ((numread =
|
||||||
|
read(rfd,
|
||||||
|
&(buffer[offset]),
|
||||||
|
sizeof(buffer)-offset)) != 0) {
|
||||||
|
offset += numread;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add NULL terminator */
|
||||||
|
buffer[offset] = '\0';
|
||||||
|
|
||||||
|
/* Read value should be equal to expected value */
|
||||||
|
CU_ASSERT_STRING_EQUAL(buffer, expected);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
126
libguac/tests/protocol/nest_write.c
Normal file
126
libguac/tests/protocol/nest_write.c
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <CUnit/Basic.h>
|
||||||
|
|
||||||
|
#include "error.h"
|
||||||
|
#include "instruction.h"
|
||||||
|
#include "protocol.h"
|
||||||
|
#include "socket.h"
|
||||||
|
|
||||||
|
#include "suite.h"
|
||||||
|
|
||||||
|
void test_nest_write() {
|
||||||
|
|
||||||
|
int rfd, wfd;
|
||||||
|
int fd[2], childpid;
|
||||||
|
|
||||||
|
/* Create pipe */
|
||||||
|
CU_ASSERT_EQUAL_FATAL(pipe(fd), 0);
|
||||||
|
|
||||||
|
/* File descriptors */
|
||||||
|
rfd = fd[0];
|
||||||
|
wfd = fd[1];
|
||||||
|
|
||||||
|
/* Fork */
|
||||||
|
if ((childpid = fork()) == -1) {
|
||||||
|
/* ERROR */
|
||||||
|
perror("fork");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Child (pipe writer) */
|
||||||
|
if (childpid != 0) {
|
||||||
|
|
||||||
|
guac_socket* nested_socket;
|
||||||
|
guac_socket* socket;
|
||||||
|
|
||||||
|
close(rfd);
|
||||||
|
|
||||||
|
/* Open guac socket */
|
||||||
|
socket = guac_socket_open(wfd);
|
||||||
|
|
||||||
|
/* Nest socket */
|
||||||
|
nested_socket = guac_socket_nest(socket, 0);
|
||||||
|
|
||||||
|
/* Write instruction */
|
||||||
|
guac_protocol_send_clipboard(nested_socket, "a" UTF8_4 "b" UTF8_4 "c");
|
||||||
|
guac_protocol_send_sync(nested_socket, 12345);
|
||||||
|
guac_socket_flush(nested_socket);
|
||||||
|
guac_socket_flush(socket);
|
||||||
|
|
||||||
|
guac_socket_free(nested_socket);
|
||||||
|
guac_socket_free(socket);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parent (unit test) */
|
||||||
|
else {
|
||||||
|
|
||||||
|
char expected[] =
|
||||||
|
"4.nest,1.0,42."
|
||||||
|
"9.clipboard,11.a" UTF8_4 "b" UTF8_4 "c;"
|
||||||
|
"4.sync,5.12345;"
|
||||||
|
";";
|
||||||
|
|
||||||
|
int numread;
|
||||||
|
char buffer[1024];
|
||||||
|
int offset = 0;
|
||||||
|
|
||||||
|
close(wfd);
|
||||||
|
|
||||||
|
/* Read everything available into buffer */
|
||||||
|
while ((numread =
|
||||||
|
read(rfd,
|
||||||
|
&(buffer[offset]),
|
||||||
|
sizeof(buffer)-offset)) != 0) {
|
||||||
|
offset += numread;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add NULL terminator */
|
||||||
|
buffer[offset] = '\0';
|
||||||
|
|
||||||
|
/* Read value should be equal to expected value */
|
||||||
|
CU_ASSERT_STRING_EQUAL(buffer, expected);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
73
libguac/tests/protocol/suite.c
Normal file
73
libguac/tests/protocol/suite.c
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <CUnit/Basic.h>
|
||||||
|
|
||||||
|
#include "suite.h"
|
||||||
|
|
||||||
|
int protocol_suite_init() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int protocol_suite_cleanup() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int register_protocol_suite() {
|
||||||
|
|
||||||
|
/* Add protocol test suite */
|
||||||
|
CU_pSuite suite = CU_add_suite("protocol",
|
||||||
|
protocol_suite_init, protocol_suite_cleanup);
|
||||||
|
if (suite == NULL) {
|
||||||
|
CU_cleanup_registry();
|
||||||
|
return CU_get_error();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add tests */
|
||||||
|
if (
|
||||||
|
CU_add_test(suite, "instruction-read", test_instruction_read) == NULL
|
||||||
|
|| CU_add_test(suite, "instruction-write", test_instruction_write) == NULL
|
||||||
|
|| CU_add_test(suite, "nest-write", test_nest_write) == NULL
|
||||||
|
) {
|
||||||
|
CU_cleanup_registry();
|
||||||
|
return CU_get_error();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
56
libguac/tests/protocol/suite.h
Normal file
56
libguac/tests/protocol/suite.h
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_TEST_PROTOCOL_SUITE_H
|
||||||
|
#define _GUAC_TEST_PROTOCOL_SUITE_H
|
||||||
|
|
||||||
|
/* Unicode (UTF-8) strings */
|
||||||
|
|
||||||
|
#define UTF8_1 "\xe7\x8a\xac" /* One character */
|
||||||
|
#define UTF8_2 UTF8_1 "\xf0\x90\xac\x80" /* Two characters */
|
||||||
|
#define UTF8_3 UTF8_2 "z" /* Three characters */
|
||||||
|
#define UTF8_4 UTF8_3 "\xc3\xa1" /* Four characters */
|
||||||
|
#define UTF8_8 UTF8_4 UTF8_4 /* Eight characters */
|
||||||
|
|
||||||
|
int register_protocol_suite();
|
||||||
|
|
||||||
|
void test_instruction_read();
|
||||||
|
void test_instruction_write();
|
||||||
|
void test_nest_write();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
62
libguac/tests/test_libguac.c
Normal file
62
libguac/tests/test_libguac.c
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <CUnit/Basic.h>
|
||||||
|
|
||||||
|
#include "protocol/suite.h"
|
||||||
|
#include "client/client_suite.h"
|
||||||
|
#include "util/util_suite.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
/* Init registry */
|
||||||
|
if (CU_initialize_registry() != CUE_SUCCESS)
|
||||||
|
return CU_get_error();
|
||||||
|
|
||||||
|
/* Register suites */
|
||||||
|
register_protocol_suite();
|
||||||
|
register_client_suite();
|
||||||
|
register_util_suite();
|
||||||
|
|
||||||
|
/* Run tests */
|
||||||
|
CU_basic_set_mode(CU_BRM_VERBOSE);
|
||||||
|
CU_basic_run_tests();
|
||||||
|
CU_cleanup_registry();
|
||||||
|
return CU_get_error();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
105
libguac/tests/util/guac_pool.c
Normal file
105
libguac/tests/util/guac_pool.c
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <CUnit/Basic.h>
|
||||||
|
|
||||||
|
#include "pool.h"
|
||||||
|
#include "util_suite.h"
|
||||||
|
|
||||||
|
#define UNSEEN 0
|
||||||
|
#define SEEN_PHASE_1 1
|
||||||
|
#define SEEN_PHASE_2 2
|
||||||
|
|
||||||
|
#define POOL_SIZE 128
|
||||||
|
|
||||||
|
void test_guac_pool() {
|
||||||
|
|
||||||
|
guac_pool* pool;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
int seen[POOL_SIZE] = {0};
|
||||||
|
int value;
|
||||||
|
|
||||||
|
/* Get pool */
|
||||||
|
pool = guac_pool_alloc(POOL_SIZE);
|
||||||
|
CU_ASSERT_PTR_NOT_NULL_FATAL(pool);
|
||||||
|
|
||||||
|
/* Fill pool */
|
||||||
|
for (i=0; i<POOL_SIZE; i++) {
|
||||||
|
|
||||||
|
/* Get value from pool */
|
||||||
|
value = guac_pool_next_int(pool);
|
||||||
|
|
||||||
|
/* Value should be within pool size */
|
||||||
|
CU_ASSERT_FATAL(value >= 0);
|
||||||
|
CU_ASSERT_FATAL(value < POOL_SIZE);
|
||||||
|
|
||||||
|
/* This should be an integer we have not seen yet */
|
||||||
|
CU_ASSERT_EQUAL(UNSEEN, seen[value]);
|
||||||
|
seen[value] = SEEN_PHASE_1;
|
||||||
|
|
||||||
|
/* Return value to pool */
|
||||||
|
guac_pool_free_int(pool, value);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now that pool is filled, we should get ONLY previously seen integers */
|
||||||
|
for (i=0; i<POOL_SIZE; i++) {
|
||||||
|
|
||||||
|
/* Get value from pool */
|
||||||
|
value = guac_pool_next_int(pool);
|
||||||
|
|
||||||
|
/* Value should be within pool size */
|
||||||
|
CU_ASSERT_FATAL(value >= 0);
|
||||||
|
CU_ASSERT_FATAL(value < POOL_SIZE);
|
||||||
|
|
||||||
|
/* This should be an integer we have seen already */
|
||||||
|
CU_ASSERT_EQUAL(SEEN_PHASE_1, seen[value]);
|
||||||
|
seen[value] = SEEN_PHASE_2;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Pool is filled to minimum now. Next value should be equal to size. */
|
||||||
|
value = guac_pool_next_int(pool);
|
||||||
|
|
||||||
|
CU_ASSERT_EQUAL(POOL_SIZE, value);
|
||||||
|
|
||||||
|
/* Free pool */
|
||||||
|
guac_pool_free(pool);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
71
libguac/tests/util/util_suite.c
Normal file
71
libguac/tests/util/util_suite.c
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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 <CUnit/Basic.h>
|
||||||
|
|
||||||
|
#include "util_suite.h"
|
||||||
|
|
||||||
|
int util_suite_init() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int util_suite_cleanup() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int register_util_suite() {
|
||||||
|
|
||||||
|
/* Add util test suite */
|
||||||
|
CU_pSuite suite = CU_add_suite("util",
|
||||||
|
util_suite_init, util_suite_cleanup);
|
||||||
|
if (suite == NULL) {
|
||||||
|
CU_cleanup_registry();
|
||||||
|
return CU_get_error();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add tests */
|
||||||
|
if (
|
||||||
|
CU_add_test(suite, "guac-pool", test_guac_pool) == NULL
|
||||||
|
) {
|
||||||
|
CU_cleanup_registry();
|
||||||
|
return CU_get_error();
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
46
libguac/tests/util/util_suite.h
Normal file
46
libguac/tests/util/util_suite.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
/* ***** 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.
|
||||||
|
*
|
||||||
|
* 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_TEST_UTIL_SUITE_H
|
||||||
|
#define _GUAC_TEST_UTIL_SUITE_H
|
||||||
|
|
||||||
|
int register_util_suite();
|
||||||
|
|
||||||
|
void test_guac_pool();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue
Block a user