guacamole-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
Subject [05/51] [abbrv] [partial] incubator-guacamole-website git commit: Deploy first version of the Apache Guacamole website (reworded and restyled from the old
Date Thu, 05 May 2016 23:36:40 GMT
diff --git a/content/doc/0.8.3/gug/guacamole-protocol.html b/content/doc/0.8.3/gug/guacamole-protocol.html
new file mode 100644
index 0000000..db4cb5c
--- /dev/null
+++ b/content/doc/0.8.3/gug/guacamole-protocol.html
@@ -0,0 +1,298 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">
+<html xmlns=""><head><meta http-equiv="Content-Type"
content="text/html; charset=UTF-8" /><title>Chapter 9. The Guacamole protocol</title><link
rel="stylesheet" type="text/css" href="gug.css" /><meta name="generator" content="DocBook
XSL Stylesheets V1.76.1" /><link rel="home" href="index.html" title="Guacamole Manual"
/><link rel="up" href="developers-guide.html" title="Part II. Developer's Guide" /><link
rel="prev" href="developers-guide.html" title="Part II. Developer's Guide" /><link
rel="next" href="libguac.html" title="Chapter 10. libguac" />
+            <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,
minimum-scale=1.0, user-scalable=no, target-densitydpi=device-dpi"/>
+        </head><body>
+            <!-- CONTENT -->
+            <div id="page"><div id="content">
+        <div class="navheader"><table width="100%" summary="Navigation header"><tr><th
colspan="3" align="center">Chapter 9. The Guacamole protocol</th></tr><tr><td
width="20%" align="left"><a accesskey="p" href="developers-guide.html">Prev</a> </td><th
width="60%" align="center">Part II. Developer's Guide</th><td width="20%" align="right"> <a
accesskey="n" href="libguac.html">Next</a></td></tr></table><hr
/></div><div xml:lang="en" class="chapter" title="Chapter 9. The Guacamole protocol"
lang="en"><div class="titlepage"><div><div><h2 class="title"><a
id="guacamole-protocol"></a>Chapter 9. The Guacamole protocol</h2></div></div></div><div
class="toc"><p><strong>Table of Contents</strong></p><dl><dt><span
class="section"><a href="guacamole-protocol.html#guacamole-protocol-design">Design</a></span></dt><dt><span
class="section"><a href="guacamole-protocol.html#guacamole-protocol-handshake">Handshake
phase</a></span></dt><dt><span class="section"><a href="guacamole-protocol.
 html#guacamole-protocol-nesting">Nesting and interleaving</a></span></dt><dt><span
class="section"><a href="guacamole-protocol.html#guacamole-protocol-drawing">Drawing</a></span></dt><dd><dl><dt><span
class="section"><a href="guacamole-protocol.html#guacamole-protocol-compositing">Compositing</a></span></dt><dt><span
class="section"><a href="guacamole-protocol.html#guacamole-protocol-images">Image
data</a></span></dt><dt><span class="section"><a href="guacamole-protocol.html#guacamole-protocol-copying-images">Copying
image data between layers</a></span></dt><dt><span class="section"><a
href="guacamole-protocol.html#guacamole-graphical-primitives">Graphical primitives</a></span></dt><dt><span
class="section"><a href="guacamole-protocol.html#guacamole-protocol-layers">Buffers
and layers</a></span></dt></dl></dd><dt><span class="section"><a
href="guacamole-protocol.html#guacamole-audio-video">Audio and video</a></span></dt><dt><span
class="section"><a href="guacamole-protocol.html#guac
 amole-protocol-events">Events</a></span></dt><dt><span class="section"><a
+    <a id="idm2845424" class="indexterm"></a>
+    <p>This chapter is an overview of the Guacamole protocol, describing its design
and general
+        use. While a few instructions and their syntax will be described here, this is not
+        exhaustive list of all available instructions. The intent is only to list the general
+        and usage. If you are looking for the syntax or purpose of a specific instruction,
+        the protocol reference included with the appendices.</p>
+    <div class="section" title="Design"><div class="titlepage"><div><div><h2
class="title" style="clear: both"><a id="guacamole-protocol-design"></a>Design</h2></div></div></div>
+        <p>The Guacamole protocol consists of instructions. Each instruction is a comma-delimited
+            list followed by a terminating semicolon, where the first element of the list
is the
+            instruction opcode, and all following elements are the arguments for that
+            instruction:</p>
+        <div class="informalexample">
+            <pre class="programlisting"><em class="replaceable"><code>OPCODE</code></em>,<em
class="replaceable"><code>ARG1</code></em>,<em class="replaceable"><code>ARG2</code></em>,<em
class="replaceable"><code>ARG3</code></em>,<em class="replaceable"><code>...</code></em>;</pre>
+        </div>
+        <p>Each element of the list has a positive decimal integer length prefix separated
by the
+            value of the element by a period. This length denotes the number of Unicode characters
+            in the value of the element, which is encoded in UTF-8:</p>
+        <div class="informalexample">
+            <pre class="programlisting"><em class="replaceable"><code>LENGTH</code></em>.<em
+        </div>
+        <p>Any number of complete instructions make up a message which is sent from
client to
+            server or from server to client. Client to server instructions are generally
+            instructions (for connecting or disconnecting) and events (mouse and keyboard).
+            to client instructions are generally drawing instructions (caching, clipping,
+            images), using the client as a remote display.</p>
+        <p>For example, a complete and valid instruction for setting the display size
to 1024x768
+            would be:</p>
+        <div class="informalexample">
+            <pre class="programlisting">4.size,1.0,4.1024,3.768;</pre>
+        </div>
+        <p>Here, the instruction would be decoded into four elements: "size", the opcode
of the
+            size instruction, "0", the index of the default layer, "1024", the desired width
+            pixels, and "768", the desired height in pixels.</p>
+        <p>The structure of the Guacamole protocol is important as it allows the protocol
to be
+            streamed while also being easily parsable by JavaScript. JavaScript does have
+            support for conceptually-similar structures like XML or JSON, but neither of
+            formats is natively supported in a way that can be streamed; JavaScript requires
+            entirety of the XML or JSON message to be available at the time of decoding.
+            Guacamole protocol, on the other hand, can be parsed as it is received, and the
+            of length prefixes within each instruction element means that the parser can
+            skip around from instruction to instruction without having to iterate over every
+            character.</p>
+    </div>
+    <div class="section" title="Handshake phase"><div class="titlepage"><div><div><h2
class="title" style="clear: both"><a id="guacamole-protocol-handshake"></a>Handshake
+        <p>The handshake phase is the phase of the protocol entered immediately upon
+            It begins with a "select" instruction sent by the client which tells the server
+            protocol will be loaded:</p>
+        <div class="informalexample">
+            <pre class="programlisting">,3.vnc;</pre>
+        </div>
+        <p>After receiving the "select" instruction, the server will load the associated
+            support and respond with a list of accepted parameter names using an "args"
+            instruction:</p>
+        <div class="informalexample">
+            <pre class="programlisting">4.args,8.hostname,4.port,8.password,13.swap-red-blue,;</pre>
+        </div>
+        <p>After receiving the list of arguments, the client is required to respond
with the list
+            of supported audio and video mimetypes, the optimal display size, and the values
for all
+            arguments available, even if blank. If any of these requirements are left out,
+            connection will close:</p>
+        <div class="informalexample">
+            <pre class="programlisting">4.size,4.1024,3.768;,;;
+        </div>
+        <p>For clarity, we've put each instruction on its own line, but in the real
protocol, no
+            newlines exist between instructions. In fact, if there is anything after an instruction
+            other than the start of a new instruction, the connection is closed.</p>
+        <p>Here, the client is specifying that the optimal display size is 1024x768
and it
+            supports Ogg Vorbis audio, but no video. It wants to connect to localhost at
port 5900,
+            and is leaving the three other parameters blank.</p>
+        <p>Once these instructions have been sent by the client, the actual interactive
+            begins, and drawing and event instructions pass back and forth until the connection
+            closed.</p>
+    </div>
+    <div class="section" title="Nesting and interleaving"><div class="titlepage"><div><div><h2
class="title" style="clear: both"><a id="guacamole-protocol-nesting"></a>Nesting
and interleaving</h2></div></div></div>
+        <p>The Guacamole protocol can be nested within itself, such that long instructions
+            independent streams of multiple instructions need not block each other; they
can be
+            multiplexed into the same stream. Nesting is accomplished with the "nest"
+            instruction.</p>
+        <p>A nest instruction has only two parameters: an arbitrary integer index denoting
+            stream the data is associated with, and the instruction data itself. The integer
+            is important as it defines how the instruction will be reassembled. The data
from nest
+            instructions with the same stream index is reassembled by the client in the order
+            received, and instructions within that data are executed immediately once
+            completed.</p>
+        <p>This is particularly important when transferring large amounts of data,
such as a
+            video stream or a file, since doing so would normally cause all other instructions
+            wait. As instructions in the Guacamole protocol are atomic and sent in a single
+            if you wish to transfer (for example) 100 megabytes of data, future instructions
+            have to wait for that single, gigantic 100 megabyte instruction to finish being
+            If this instruction were sent via nest instructions instead, it could be broken
up into
+            smaller chunks (say, around 4 or 8 kilobytes) which would not disturb the responsiveness
+            of the connection, and the delay before other instructions can be sent becomes
+            negligible.</p>
+    </div>
+    <div class="section" title="Drawing"><div class="titlepage"><div><div><h2
class="title" style="clear: both"><a id="guacamole-protocol-drawing"></a>Drawing</h2></div></div></div>
+        <div class="section" title="Compositing"><div class="titlepage"><div><div><h3
class="title"><a id="guacamole-protocol-compositing"></a>Compositing</h3></div></div></div>
+            <p>The Guacamole protocol provides compositing operations through the use
of "channel
+                masks". The term "channel mask" is simply a description of the mechanism
used while
+                designing the protocol to conceptualize and fully enumerate all possible
+                operations based on four different sources of image data: source image data
+                the destination is opaque, source image data where the destination is transparent,
+                destination image data where the source is opaque, and destination image
data where
+                the source is transparent. Assigning a binary value to each of these "channels"
+                creates a unique integer ID for every possible compositing operation, where
+                operations parallel the operations described by Porter and Duff in their
paper. As
+                the HTML5 canvas tag also uses Porter/Duff to describe their compositing
+                (as do other graphical APIs), the Guacamole protocol is conveniently similar
to the
+                compositing support already present in web browsers, with some operations
not yet
+                supported. The following operations are all implemented and known to work
+                in all browsers:</p>
+            <div class="variablelist"><dl><dt><span class="term">B
out A (0x02)</span></dt><dd>
+                        <p>Clears the destination where the source is opaque, but otherwise
+                            nothing. This is useful for masking.</p>
+                    </dd><dt><span class="term">A atop B (0x06)</span></dt><dd>
+                        <p>Fills with the source where the destination is opaque only.</p>
+                    </dd><dt><span class="term">A xor B (0x0A)</span></dt><dd>
+                        <p>As with logical XOR. Note that this is a compositing operation,
not a
+                            bitwise operation. It draws the source where the destination
+                            transparent, and draws the destination where the source is
+                            transparent.</p>
+                    </dd><dt><span class="term">B over A (0x0B)</span></dt><dd>
+                        <p>What you would typically expect when drawing, but reversed.
The source
+                            appears only where the destination is transparent, as if you
+                            attempting to draw the destination over the source, rather than
+                            source over the destination.</p>
+                    </dd><dt><span class="term">A over B (0x0E)</span></dt><dd>
+                        <p>The most common and sensible compositing operation, this
draws the
+                            source everywhere, but includes the destination where the source
+                            transparent.</p>
+                    </dd><dt><span class="term">A + B (0x0F)</span></dt><dd>
+                        <p>Simply adds the components of the source image to the destination
+                            image, capping the result at pure white.</p>
+                    </dd></dl></div>
+            <p>The following operations are all implemented, but may work incorrectly
in WebKit
+                browsers which always include the destination image where the source is
+                transparent:</p>
+            <div class="variablelist"><dl><dt><span class="term">B
in A (0x01)</span></dt><dd>
+                        <p>Draws the destination only where the source is opaque, clearing
+                            anywhere the source or destination are transparent.</p>
+                    </dd><dt><span class="term">A in B (0x04)</span></dt><dd>
+                        <p>Draws the source only where the destination is opaque, clearing
+                            anywhere the source or destination are transparent.</p>
+                    </dd><dt><span class="term">A out B (0x08)</span></dt><dd>
+                        <p>Draws the source only where the destination is transparent,
+                            anywhere the source or destination are opaque.</p>
+                    </dd><dt><span class="term">B atop A (0x09)</span></dt><dd>
+                        <p>Fills with the destination where the source is opaque only.</p>
+                    </dd><dt><span class="term">A (0x0C)</span></dt><dd>
+                        <p>Fills with the source, ignoring the destination entirely.</p>
+                    </dd></dl></div>
+            <p>The following operations are defined, but not implemented, and do not
exist as
+                operations within the HTML5 canvas:</p>
+            <div class="variablelist"><dl><dt><span class="term">Clear
+                        <p>Clears all existing image data in the destination.</p>
+                    </dd><dt><span class="term">B (0x03)</span></dt><dd>
+                        <p>Does nothing.</p>
+                    </dd><dt><span class="term">A xnor B (0x05)</span></dt><dd>
+                        <p>Adds the source to the destination where the destination
or source are
+                            opaque, clearing anywhere the source or destination are transparent.
+                            This is similar to A + B except the aspect of transparency is
+                            additive.</p>
+                    </dd><dt><span class="term">(A + B) atop B (0x07)</span></dt><dd>
+                        <p>Adds the source to the destination where the destination
is opaque,
+                            preserving the destination otherwise.</p>
+                    </dd><dt><span class="term">(A + B) atop A (0x0D)</span></dt><dd>
+                        <p>Adds the destination to the source where the source is opaque,
+                            the source otherwise.</p>
+                    </dd></dl></div>
+        </div>
+        <div class="section" title="Image data"><div class="titlepage"><div><div><h3
class="title"><a id="guacamole-protocol-images"></a>Image data</h3></div></div></div>
+            <p>The Guacamole protocol, like many remote desktop protocols, provides
a method of
+                sending an arbitrary rectangle of image data and placing it either within
a buffer
+                or in a visible rectangle of the screen. Raw image data in the Guacamole
protocol is
+                sent within PNG chunks using the "png" instruction, and thus provides the
same level
+                of image compression and color representation. Image updates sent in this
way can be
+                RGB or RGBA (alpha transparency) and are automatically palettized if sent
+                libguac.</p>
+            <p>Image data in the Guacamole protocol is sent base64-encoded, as the
+                protocol is entirely text-based. This works out well, because all browsers
+                native support for base64, and are required to at least support PNG, thus
+                Guacamole "png" instruction is one of the more efficient ways to stream image
+                to a browser.</p>
+            <p>Each chunk of image data can be sent to any specified rectangle within
a layer or
+                buffer. Sending the data to a layer means that the image becomes immediately
+                visible, while sending the data to a buffer allows that data to be reused
+                later.</p>
+        </div>
+        <div class="section" title="Copying image data between layers"><div class="titlepage"><div><div><h3
class="title"><a id="guacamole-protocol-copying-images"></a>Copying image data
between layers</h3></div></div></div>
+            <p>Image data can be copied from one layer or buffer into another layer
or buffer.
+                This is often used for scrolling (where most of the result of the graphical
+                is identical to the previous state) or for caching parts of an image.</p>
+            <p>Both VNC and RDP provide a means of copying a region of screen data
and placing it
+                somewhere else within the same screen. RDP provides an additional means of
+                data to a cache, or recalling data from that cache and placing it on the
+                Guacamole takes this concept and reduces it further, as both on-screen and
+                off-screen image storage is the same. The Guacamole "copy" instruction allows
you to
+                copy a rectangle of image data, and place it within another layer, whether
+                layer is the same as the source layer, a different visible layer, or an off-screen
+                buffer.</p>
+        </div>
+        <div class="section" title="Graphical primitives"><div class="titlepage"><div><div><h3
class="title"><a id="guacamole-graphical-primitives"></a>Graphical primitives</h3></div></div></div>
+            <p>The Guacamole protocol provides basic graphics operations similar to
those of
+                Cairo or the HTML5 canvas. In many cases, these primitives are useful for
+                drawing, and desirable in that they take up less bandwidth than sending
+                corresponding PNG images. Beware that excessive use of primitives leads to
+                increase in client-side processing, which may reduce the performance of a
+                client, especially if that client is on a lower-performance machine like
a mobile
+                phone or tablet.</p>
+        </div>
+        <div class="section" title="Buffers and layers"><div class="titlepage"><div><div><h3
class="title"><a id="guacamole-protocol-layers"></a>Buffers and layers</h3></div></div></div>
+            <p>All drawing operations in the Guacamole protocol affect a layer, and
each layer
+                has an integer index which identifies it. When this integer is negative,
the layer
+                is not visible, and can be used for storage or caching of image data. In
this case,
+                the layer is referred to within the code and within documentation as a "buffer".
+                Layers are created automatically when they are first referenced in an
+                instruction.</p>
+            <p>There is one main layer which is always present called the "default
layer". This
+                layer has an index of 0. Resizing this layer resizes the entire remote display.
+                Other layers default to the size of the default layer upon creation, while
+                are always created with a size of 0x0, automatically resizing themselves
to fit
+                their contents.</p>
+            <p>Non-buffer layers can be moved and nested within each other. In this
way, layers
+                provide a simple means of hardware-accelerated compositing. If you need a
window to
+                appear above others, or you have some object which will be moving or you
need the
+                data beneath it automatically preserved, a layer is a good way of accomplishing
+                this. If a layer is nested within another layer, its position is relative
to that of
+                its parent. When the parent is moved or reordered, the child moves with it.
If the
+                child extends beyond the parents bounds, it will be clipped.</p>
+        </div>
+    </div>
+    <div class="section" title="Audio and video"><div class="titlepage"><div><div><h2
class="title" style="clear: both"><a id="guacamole-audio-video"></a>Audio and
+        <p>As of the 0.7.0 release, Guacamole supports transfer of both audio and video
data. By
+            the nature of the Guacamole protocol, you must know the size and duration of
the audio
+            or video data before it is sent. Because of this, audio and video data is usually
+            in chunks, where variance in chunk size gives a trade-off between responsiveness
+            stability. Sending large audio or video chunks is one of the main uses of protocol
+            nesting.</p>
+    </div>
+    <div class="section" title="Events"><div class="titlepage"><div><div><h2
class="title" style="clear: both"><a id="guacamole-protocol-events"></a>Events</h2></div></div></div>
+        <p>When something changes on either side, client or server, such as a key being
+            the mouse moving, or clipboard data changing, an instruction describing the event
+            sent.</p>
+    </div>
+    <div class="section" title="Disconnecting"><div class="titlepage"><div><div><h2
class="title" style="clear: both"><a id="guacamole-protocol-disconnecting"></a>Disconnecting</h2></div></div></div>
+        <p>The server and client can end the connection at any time. There is no requirement
+            the server or the client to communicate that the connection needs to terminate.
When the
+            client or server wish to end the connection, and the reason is known, they can
use the
+            "disconnect" or "error" instructions.</p>
+        <p>The disconnect instruction is sent by the client when it is disconnecting.
This is
+            largely out of politeness, and the server must be written knowing that the disconnect
+            instruction may not always be sent in time (guacd is written this way).</p>
+        <p>If the client does something wrong, or the server detects a problem with
the client
+            plugin, the server sends an error instruction, including a description of the
problem in
+            the parameters. This informs the client that the connection is being closed.</p>
+    </div>
+</div><div class="navfooter"><hr /><table width="100%" summary="Navigation
footer"><tr><td width="40%" align="left"><a accesskey="p" href="developers-guide.html">Prev</a> </td><td
width="20%" align="center"><a accesskey="u" href="developers-guide.html">Up</a></td><td
width="40%" align="right"> <a accesskey="n" href="libguac.html">Next</a></td></tr><tr><td
width="40%" align="left" valign="top">Part II. Developer's Guide </td><td width="20%"
align="center"><a accesskey="h" href="index.html">Home</a></td><td
width="40%" align="right" valign="top"> Chapter 10. libguac</td></tr></table></div>
+            </div></div>
+<!-- Google Analytics -->
+<script type="text/javascript">
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//','ga');
+  ga('create', 'UA-75289145-1', 'auto');
+  ga('send', 'pageview');
+<!-- End Google Analytics -->
+        </body></html>
diff --git a/content/doc/0.8.3/gug/gug.css b/content/doc/0.8.3/gug/gug.css
new file mode 100644
index 0000000..b146466
--- /dev/null
+++ b/content/doc/0.8.3/gug/gug.css
@@ -0,0 +1,81 @@
+body {
+    color: black;
+    background: white;
+    font-family: 'FreeSans', 'Liberation Sans', 'Arial', 'Helvetica', sans-serif;
+    font-size: 10pt;
+    text-align: justify;
+    text-rendering: optimizeLegibility;
+    margin: 0;
+    padding: 0;
+/* Green links */
+a[href]         { color: #080; }
+a[href]:visited { color: #884; }
+div#content {
+    margin-top: 0;
+    margin-bottom: 0;
+    margin-left: auto;
+    margin-right: auto;
+    max-width: 25cm;
+    padding: 1em;
+/* DOCBOOK */
+.navheader hr, .navfooter hr {
+    border: 0;
+    border-bottom: 1px solid black;
+.programlisting, .screen {
+    background: black;
+    color: silver;
+    padding: 1em;
+    border-radius: 0.5em;
+    -moz-border-radius: 0.5em;
+    -webkit-border-radius: 0.5em;
+ .titlepage {
+    text-align: center;
+    padding: 2em;
+.titlepage hr {
+    display: none;
+.mediaobject {
+    text-align: center;
+    float: none;
+    margin: 1em;
+.caption {
+    font-size: 0.8em;
+    font-style: italic;
+.navfooter, .section {
+    clear: both;
+.table-contents table {
+    border: 1px solid black;
+    border-collapse: collapse;
+.table-contents td, .table-contents th {
+    padding: 0.5em;
diff --git a/content/doc/0.8.3/gug/index.html b/content/doc/0.8.3/gug/index.html
new file mode 100644
index 0000000..d7d1c26
--- /dev/null
+++ b/content/doc/0.8.3/gug/index.html
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">
+<html xmlns=""><head><meta http-equiv="Content-Type"
content="text/html; charset=UTF-8" /><title>Guacamole Manual</title><link
rel="stylesheet" type="text/css" href="gug.css" /><meta name="generator" content="DocBook
XSL Stylesheets V1.76.1" /><link rel="home" href="index.html" title="Guacamole Manual"
/><link rel="next" href="preface.html" title="Introduction" />
+            <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,
minimum-scale=1.0, user-scalable=no, target-densitydpi=device-dpi"/>
+        </head><body>
+            <!-- CONTENT -->
+            <div id="page"><div id="content">
+        <div class="navheader"><table width="100%" summary="Navigation header"><tr><th
colspan="3" align="center">Guacamole Manual</th></tr><tr><td width="20%"
align="left"> </td><th width="60%" align="center"> </th><td width="20%"
align="right"> <a accesskey="n" href="preface.html">Next</a></td></tr></table><hr
/></div><div xml:lang="en" class="book" title="Guacamole Manual" lang="en"><div
class="titlepage"><div><div><h1 class="title"><a id="idp10800"></a>Guacamole
Manual</h1></div><div><div class="author"><h3 class="author"><span
class="firstname">Michael</span> <span class="surname">Jumper</span></h3><code
class="email">&lt;<a class="email" href=""></a>&gt;</code></div></div></div><hr
/></div><div class="toc"><p><strong>Table of Contents</strong></p><dl><dt><span
class="preface"><a href="preface.html">Introduction</a></span></dt><dt><span
class="part"><a href="users-guide.html">I. User's Guide</a></span></dt><dd><dl><dt><s
 pan class="chapter"><a href="guacamole-architecture.html">1. Implementation and
architecture</a></span></dt><dt><span class="chapter"><a
href="installing-guacamole.html">2. Installing Guacamole</a></span></dt><dt><span
class="chapter"><a href="configuring-guacamole.html">3. Configuring Guacamole</a></span></dt><dt><span
class="chapter"><a href="mysql-auth.html">4. MySQL authentication</a></span></dt><dt><span
class="chapter"><a href="ldap-auth.html">5. LDAP authentication</a></span></dt><dt><span
class="chapter"><a href="noauth.html">6. Disabling authentication</a></span></dt><dt><span
class="chapter"><a href="using-guacamole.html">7. Using Guacamole</a></span></dt><dt><span
class="chapter"><a href="troubleshooting.html">8. Troubleshooting</a></span></dt></dl></dd><dt><span
class="part"><a href="developers-guide.html">II. Developer's Guide</a></span></dt><dd><dl><dt><span
class="chapter"><a href="guacamole-protocol.html">9. The Guacamole protocol</a></span></dt><dt><span
 ter"><a href="libguac.html">10. libguac</a></span></dt><dt><span
class="chapter"><a href="guacamole-common.html">11. <span class="package">guacamole-common</span></a></span></dt><dt><span
class="chapter"><a href="guacamole-common-js.html">12. guacamole-common-js</a></span></dt><dt><span
class="chapter"><a href="guacamole-ext.html">13. guacamole-ext</a></span></dt><dt><span
class="chapter"><a href="custom-protocols.html">14. Adding new protocols</a></span></dt><dt><span
class="chapter"><a href="custom-authentication.html">15. Custom authentication</a></span></dt><dt><span
class="chapter"><a href="writing-you-own-guacamole-app.html">16. Writing your own
Guacamole application</a></span></dt></dl></dd><dt><span
class="part"><a href="appendices.html">III. Appendices</a></span></dt><dd><dl><dt><span
class="appendix"><a href="faq.html">A. FAQ</a></span></dt><dt><span
class="appendix"><a href="protocol-reference.html">B. Guacamole protocol reference</a></span></dt><dt><span
+</div><div class="navfooter"><hr /><table width="100%" summary="Navigation
footer"><tr><td width="40%" align="left"> </td><td width="20%" align="center"> </td><td
width="40%" align="right"> <a accesskey="n" href="preface.html">Next</a></td></tr><tr><td
width="40%" align="left" valign="top"> </td><td width="20%" align="center"> </td><td
width="40%" align="right" valign="top"> Introduction</td></tr></table></div>
+            </div></div>
+<!-- Google Analytics -->
+<script type="text/javascript">
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//','ga');
+  ga('create', 'UA-75289145-1', 'auto');
+  ga('send', 'pageview');
+<!-- End Google Analytics -->
+        </body></html>

View raw message