guacamole-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jmuehl...@apache.org
Subject [3/8] incubator-guacamole-server git commit: GUACAMOLE-169: Move terminal headers to namespaced directory.
Date Tue, 28 Feb 2017 18:32:41 GMT
http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/blob/3f7ccb6b/src/terminal/terminal/scrollbar.h
----------------------------------------------------------------------
diff --git a/src/terminal/terminal/scrollbar.h b/src/terminal/terminal/scrollbar.h
new file mode 100644
index 0000000..bf0da87
--- /dev/null
+++ b/src/terminal/terminal/scrollbar.h
@@ -0,0 +1,357 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef GUAC_TERMINAL_SCROLLBAR_H
+#define GUAC_TERMINAL_SCROLLBAR_H
+
+#include "config.h"
+
+#include <guacamole/client.h>
+#include <guacamole/layer.h>
+
+/**
+ * The width of the scrollbar, in pixels.
+ */
+#define GUAC_TERMINAL_SCROLLBAR_WIDTH 16 
+
+/**
+ * The number of pixels between the draggable handle of the scrollbar and the
+ * boundary of the containing layer.
+ */
+#define GUAC_TERMINAL_SCROLLBAR_PADDING 2
+
+/**
+ * The minimum height of the draggable handle of the scrollbar, in pixels.
+ */
+#define GUAC_TERMINAL_SCROLLBAR_MIN_HEIGHT 64
+
+/**
+ * The state of all scrollbar components, describing all variable aspects of
+ * the scrollbar's appearance.
+ */
+typedef struct guac_terminal_scrollbar_render_state {
+
+    /**
+     * The current X-coordinate of the upper-left corner of the scrollbar's
+     * handle. This value will be relative to the scrollbar's containing layer.
+     */
+    int handle_x;
+
+    /**
+     * The current Y-coordinate of the upper-left corner of the scrollbar's
+     * handle. This value will be relative to the scrollbar's containing layer.
+     */
+    int handle_y;
+
+    /**
+     * The width of the scrollbar's handle.
+     */
+    int handle_width;
+
+    /**
+     * The height of the scrollbar's handle.
+     */
+    int handle_height;
+
+    /**
+     * The current X-coordinate of the upper-left corner of the scrollbar's
+     * containing layer.
+     */
+    int container_x;
+
+    /**
+     * The current Y-coordinate of the upper-left corner of the scrollbar's
+     * containing layer.
+     */
+    int container_y;
+
+    /**
+     * The width of the scrollbar's containing layer.
+     */
+    int container_width;
+
+    /**
+     * The height of the scrollbar's containing layer.
+     */
+    int container_height;
+
+} guac_terminal_scrollbar_render_state;
+
+typedef struct guac_terminal_scrollbar guac_terminal_scrollbar;
+
+/**
+ * Handler which is called whenever the scrollbar value changes outside a call
+ * to guac_terminal_scrollbar_set_value().
+ */
+typedef void guac_terminal_scrollbar_scroll_handler(
+        guac_terminal_scrollbar* scrollbar, int value);
+
+/**
+ * A scrollbar, made up of a containing layer and inner draggable handle. The
+ * position of the handle within the layer represents the value of the
+ * scrollbar.
+ */
+struct guac_terminal_scrollbar {
+
+    /**
+     * The client associated with this scrollbar.
+     */
+    guac_client* client;
+
+    /**
+     * The layer containing the scrollbar.
+     */
+    const guac_layer* parent;
+
+    /**
+     * The width of the parent layer, in pixels.
+     */
+    int parent_width;
+
+    /**
+     * The height of the parent layer, in pixels.
+     */
+    int parent_height;
+
+    /**
+     * The scrollbar itself.
+     */
+    guac_layer* container;
+
+    /**
+     * The draggable handle within the scrollbar, representing the current
+     * scroll value.
+     */
+    guac_layer* handle;
+
+    /**
+     * The minimum scroll value.
+     */
+    int min;
+
+    /**
+     * The maximum scroll value.
+     */
+    int max;
+
+    /**
+     * The size of the visible area, in the same units as min and max.
+     */
+    int visible_area;
+
+    /**
+     * The current scroll value.
+     */
+    int value;
+
+    /**
+     * The current state of all variable, visible parts of the scrollbar.
+     */
+    guac_terminal_scrollbar_render_state render_state;
+
+    /**
+     * Whether the scrollbar handle is currently being dragged.
+     */
+    int dragging_handle;
+
+    /**
+     * The offset of the Y location of the mouse pointer when the dragging
+     * began, relative to the top of the scrollbar handle. If dragging is not
+     * in progress, this value is undefined.
+     */
+    int drag_offset_y;
+
+    /**
+     * The current Y location of the mouse pointer if dragging is in progress.
+     * If dragging is not in progress, this value is undefined.
+     */
+    int drag_current_y;
+
+    /**
+     * The function to call when the scrollbar handle is being dragged, and
+     * the new scrollbar value needs to be handled and assigned.
+     */
+    guac_terminal_scrollbar_scroll_handler* scroll_handler;
+
+    /**
+     * Arbitrary reference to data related to this scrollbar.
+     */
+    void* data;
+
+};
+
+/**
+ * Allocates a new scrollbar, associating that scrollbar with the given client
+ * and parent layer. The dimensions of the parent layer dictate the initial
+ * position of the scrollbar. Currently, the scrollbar is always anchored to
+ * the right edge of the parent layer.
+ *
+ * This will cause instructions to be written to the client's socket, but the
+ * client's socket will not be automatically flushed.
+ *
+ * @param client
+ *     The client to associate with the new scrollbar.
+ *
+ * @param parent
+ *     The layer which will contain the newly-allocated scrollbar.
+ *
+ * @param parent_width
+ *     The width of the parent layer, in pixels.
+ *
+ * @param parent_height
+ *     The height of the parent layer, in pixels.
+ *
+ * @param visible_area
+ *     The amount of scrollable data that can be shown within the parent layer
+ *     at any given time. This value uses the same units as min, max, and the
+ *     current scroll value.
+ *
+ * @return
+ *     A newly allocated scrollbar.
+ */
+guac_terminal_scrollbar* guac_terminal_scrollbar_alloc(guac_client* client,
+        const guac_layer* parent, int parent_width, int parent_height,
+        int visible_area);
+
+/**
+ * Frees the given scrollbar.
+ *
+ * @param scrollbar
+ *     The scrollbar to free.
+ */
+void guac_terminal_scrollbar_free(guac_terminal_scrollbar* scrollbar);
+
+/**
+ * Flushes the render state of the given scrollbar, updating the remote display
+ * accordingly.
+ *
+ * This may cause instructions to be written to the client's socket, but the
+ * client's socket will not be automatically flushed.
+ *
+ * @param scrollbar
+ *     The scrollbar whose render state is to be flushed.
+ */
+void guac_terminal_scrollbar_flush(guac_terminal_scrollbar* scrollbar);
+
+/**
+ * Forces a complete redraw / resync of scrollbar state for the given user that
+ * has just joined the connection, sending the necessary instructions to
+ * completely recreate and redraw the scrollbar rendering over the given
+ * socket.
+ *
+ * @param scrollbar
+ *     The scrollbar to sync to the given user.
+ *
+ * @param user
+ *     The user that has just joined the connection.
+ *
+ * @param socket
+ *     The socket over which any necessary instructions should be sent.
+ */
+void guac_terminal_scrollbar_dup(guac_terminal_scrollbar* scrollbar,
+        guac_user* user, guac_socket* socket);
+
+/**
+ * Sets the minimum and maximum allowed scroll values of the given scrollbar
+ * to the given values. If necessary, the current value of the scrollbar will
+ * be adjusted to fit within the new bounds.
+ *
+ * This may cause instructions to be written to the client's socket, but the
+ * client's socket will not be automatically flushed.
+ *
+ * @param scrollbar
+ *     The scrollbar whose bounds are changing.
+ *
+ * @param min
+ *     The new minimum value of the scrollbar.
+ *
+ * @param max
+ *     The new maximum value of the scrollbar.
+ */
+void guac_terminal_scrollbar_set_bounds(guac_terminal_scrollbar* scrollbar,
+        int min, int max);
+
+/**
+ * Sets the current value of the given scrollbar. If the value specified does
+ * not fall within the scrollbar's defined minimum and maximum values, the
+ * value will be adjusted to fit.
+ *
+ * This may cause instructions to be written to the client's socket, but the
+ * client's socket will not be automatically flushed.
+ *
+ * @param scrollbar
+ *     The scrollbar whose value is changing.
+ *
+ * @param value
+ *     The value to assign to the scrollbar. If the value if out of bounds, it
+ *     will be automatically adjusted to fit.
+ */
+void guac_terminal_scrollbar_set_value(guac_terminal_scrollbar* scrollbar,
+        int value);
+
+/**
+ * Notifies the scrollbar that the parent layer has been resized, and that the
+ * scrollbar may need to be repositioned or resized accordingly.
+ *
+ * This may cause instructions to be written to the client's socket, but the
+ * client's socket will not be automatically flushed.
+ *
+ * @param scrollbar
+ *     The scrollbar whose parent layer has been resized.
+ *
+ * @param parent_width
+ *     The new width of the parent layer, in pixels.
+ *
+ * @param parent_height
+ *     The new height of the parent layer, in pixels.
+ *
+ * @param visible_area
+ *     The amount of scrollable data that can be shown within the parent layer
+ *     at any given time. This value uses the same units as min, max, and the
+ *     current scroll value.
+ */
+void guac_terminal_scrollbar_parent_resized(guac_terminal_scrollbar* scrollbar,
+        int parent_width, int parent_height, int visible_area);
+
+/**
+ * Notifies the scrollbar of the current mouse state, allowing it to update
+ * itself with respect to button state and dragging.
+ *
+ * @param scrollbar
+ *     The scrollbar to notify of the current mouse state.
+ *
+ * @param x
+ *     The X coordinate of the mouse pointer.
+ *
+ * @param y
+ *     The Y coordinate of the mouse pointer.
+ *
+ * @param mask
+ *     The button mask, where the Nth bit of the button mask represents the
+ *     pressed state of the Nth mouse button, where button 0 is the left
+ *     mouse button, button 1 is the middle button, etc.
+ *
+ * @return
+ *     Zero if the mouse event was not handled by the scrollbar, non-zero
+ *     otherwise.
+ */
+int guac_terminal_scrollbar_handle_mouse(guac_terminal_scrollbar* scrollbar,
+        int x, int y, int mask);
+
+#endif

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/blob/3f7ccb6b/src/terminal/terminal/terminal.h
----------------------------------------------------------------------
diff --git a/src/terminal/terminal/terminal.h b/src/terminal/terminal/terminal.h
new file mode 100644
index 0000000..f37e870
--- /dev/null
+++ b/src/terminal/terminal/terminal.h
@@ -0,0 +1,839 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+#ifndef _GUAC_TERMINAL_H
+#define _GUAC_TERMINAL_H
+
+#include "config.h"
+
+#include "buffer.h"
+#include "common/clipboard.h"
+#include "common/cursor.h"
+#include "display.h"
+#include "scrollbar.h"
+#include "types.h"
+#include "typescript.h"
+
+#include <pthread.h>
+#include <stdbool.h>
+
+#include <guacamole/client.h>
+#include <guacamole/stream.h>
+
+/**
+ * The maximum duration of a single frame, in milliseconds.
+ */
+#define GUAC_TERMINAL_FRAME_DURATION 40
+
+/**
+ * The maximum amount of time to wait for more data before declaring a frame
+ * complete, in milliseconds.
+ */
+#define GUAC_TERMINAL_FRAME_TIMEOUT 10
+
+/**
+ * The maximum number of custom tab stops.
+ */
+#define GUAC_TERMINAL_MAX_TABS       16
+
+/**
+ * The number of rows to scroll per scroll wheel event.
+ */
+#define GUAC_TERMINAL_WHEEL_SCROLL_AMOUNT 3
+
+/**
+ * The maximum number of bytes to allow within the clipboard.
+ */
+#define GUAC_TERMINAL_CLIPBOARD_MAX_LENGTH 262144
+
+/**
+ * The name of the color scheme having black foreground and white background.
+ */
+#define GUAC_TERMINAL_SCHEME_BLACK_WHITE "black-white"
+
+/**
+ * The name of the color scheme having gray foreground and black background.
+ */
+#define GUAC_TERMINAL_SCHEME_GRAY_BLACK "gray-black"
+
+/**
+ * The name of the color scheme having green foreground and black background.
+ */
+#define GUAC_TERMINAL_SCHEME_GREEN_BLACK "green-black"
+
+/**
+ * The name of the color scheme having white foreground and black background.
+ */
+#define GUAC_TERMINAL_SCHEME_WHITE_BLACK "white-black"
+
+typedef struct guac_terminal guac_terminal;
+
+/**
+ * All possible mouse cursors used by the terminal emulator.
+ */
+typedef enum guac_terminal_cursor_type {
+
+    /**
+     * A transparent (blank) cursor.
+     */
+    GUAC_TERMINAL_CURSOR_BLANK,
+
+    /**
+     * A standard I-bar cursor for selecting text, etc.
+     */
+    GUAC_TERMINAL_CURSOR_IBAR,
+
+    /**
+     * A standard triangular mouse pointer for manipulating non-text objects.
+     */
+    GUAC_TERMINAL_CURSOR_POINTER
+
+} guac_terminal_cursor_type;
+
+/**
+ * Handler for characters printed to the terminal. When a character is printed,
+ * the current char handler for the terminal is called and given that
+ * character.
+ */
+typedef int guac_terminal_char_handler(guac_terminal* term, unsigned char c);
+
+/**
+ * Handler for setting the destination path for file uploads.
+ */
+typedef void guac_terminal_upload_path_handler(guac_client* client, char* path);
+
+/**
+ * Handler for creating an outbound file download stream for a specified file.
+ */
+typedef guac_stream* guac_terminal_file_download_handler(guac_client* client, char* filename);
+
+/**
+ * Represents a terminal emulator which uses a given Guacamole client to
+ * render itself.
+ */
+struct guac_terminal {
+
+    /**
+     * The Guacamole client associated with this terminal emulator.
+     */
+    guac_client* client;
+
+    /**
+     * The terminal render thread.
+     */
+    pthread_t thread;
+
+    /**
+     * Called whenever the necessary terminal codes are sent to change
+     * the path for future file uploads.
+     */
+    guac_terminal_upload_path_handler* upload_path_handler;
+
+    /**
+     * Called whenever the necessary terminal codes are sent to initiate
+     * a download of a given remote file.
+     */
+    guac_terminal_file_download_handler* file_download_handler;
+
+    /**
+     * Lock which restricts simultaneous access to this terminal via the root
+     * guac_terminal_* functions.
+     */
+    pthread_mutex_t lock;
+
+    /**
+     * The mutex associated with the modified condition and flag, locked
+     * whenever a thread is waiting on the modified condition, the modified
+     * condition is being signalled, or the modified flag is being changed.
+     */
+    pthread_mutex_t modified_lock;
+
+    /**
+     * Flag set whenever an operation has affected the terminal in a way that
+     * will require a frame flush. When this flag is set, the modified_cond
+     * condition will be signalled. The modified_lock will always be
+     * acquired before this flag is altered.
+     */
+    int modified;
+
+    /**
+     * Condition which is signalled when the modified flag has been set
+     */
+    pthread_cond_t modified_cond;
+
+    /**
+     * Pipe which will be the source of user input. When a terminal code
+     * generates synthesized user input, that data will be written to
+     * this pipe.
+     */
+    int stdin_pipe_fd[2];
+
+    /**
+     * The currently-open pipe stream to which all terminal output should be
+     * written, if any. If no pipe stream is open, terminal output will be
+     * written to the terminal display, and this value will be NULL.
+     */
+    guac_stream* pipe_stream;
+
+    /**
+     * Buffer of data pending write to the pipe_stream. Data within this buffer
+     * will be flushed to the pipe_stream when either (1) the buffer is full
+     * and another character needs to be written or (2) the pipe_stream is
+     * closed.
+     */
+    char pipe_buffer[6048];
+
+    /**
+     * The number of bytes currently stored within the pipe_buffer.
+     */
+    int pipe_buffer_length;
+
+    /**
+     * The currently-active typescript recording all terminal output, or NULL
+     * if no typescript is being used for the terminal session.
+     */
+    guac_terminal_typescript* typescript;
+
+    /**
+     * Terminal-wide mouse cursor, synchronized across all users.
+     */
+    guac_common_cursor* cursor;
+
+    /**
+     * Graphical representation of the current scroll state.
+     */
+    guac_terminal_scrollbar* scrollbar;
+
+    /**
+     * The relative offset of the display. A positive value indicates that
+     * many rows have been scrolled into view, zero indicates that no
+     * scrolling has occurred. Negative values are illegal.
+     */
+    int scroll_offset;
+
+    /**
+     * The width of the terminal, in pixels.
+     */
+    int width;
+
+    /**
+     * The height of the terminal, in pixels.
+     */
+    int height;
+
+    /**
+     * The width of the terminal, in characters.
+     */
+    int term_width;
+
+    /**
+     * The height of the terminal, in characters.
+     */
+    int term_height;
+
+    /**
+     * The index of the first row in the scrolling region.
+     */
+    int scroll_start;
+
+    /**
+     * The index of the last row in the scrolling region.
+     */
+    int scroll_end;
+
+    /**
+     * The current row location of the cursor. Note that while most terminal
+     * operations will clip the cursor location within the bounds of the
+     * terminal, this is not guaranteed.
+     */
+    int cursor_row;
+
+    /**
+     * The current column location of the cursor. Note that while most
+     * terminal operations will clip the cursor location within the bounds
+     * of the terminal, this is not guaranteed. There are times when the
+     * cursor is legitimately outside the terminal bounds (such as when the
+     * end of a line is reached, but it is not yet necessary to scroll up).
+     */
+    int cursor_col;
+
+    /**
+     * The row of the rendered cursor.
+     */
+    int visible_cursor_row;
+
+    /**
+     * The column of the rendered cursor.
+     */
+    int visible_cursor_col;
+
+    /**
+     * The row of the saved cursor (ESC 7).
+     */
+    int saved_cursor_row;
+
+    /**
+     * The column of the saved cursor (ESC 7).
+     */
+    int saved_cursor_col;
+
+    /**
+     * The attributes which will be applied to future characters.
+     */
+    guac_terminal_attributes current_attributes;
+
+    /**
+     * The character whose attributes dictate the default attributes
+     * of all characters. When new screen space is allocated, this
+     * character fills the gaps.
+     */
+    guac_terminal_char default_char;
+
+    /**
+     * Handler which will receive all printed characters, updating the terminal
+     * accordingly.
+     */
+    guac_terminal_char_handler* char_handler;
+
+    /**
+     * The difference between the currently-rendered screen and the current
+     * state of the terminal.
+     */
+    guac_terminal_display* display;
+
+    /**
+     * Current terminal display state. All characters present on the screen
+     * are within this buffer. This has nothing to do with the display, which
+     * facilitates transfer of a set of changes to the remote display.
+     */
+    guac_terminal_buffer* buffer;
+
+    /**
+     * Automatically place a tabstop every N characters. If zero, then no
+     * tabstops exist automatically.
+     */
+    int tab_interval;
+
+    /**
+     * Array of all tabs set. Each entry is the column number of a tab + 1,
+     * or 0 if that tab cell is unset.
+     */
+    int custom_tabs[GUAC_TERMINAL_MAX_TABS];
+
+    /**
+     * Array of arrays of mapped characters, where the character N is located at the N-32
+     * position within the array. Each element in a contained array is the corresponding Unicode
+     * codepoint. If NULL, a direct mapping from Unicode is used. The entries of the main array
+     * correspond to the character set in use (G0, G1, etc.)
+     */
+    const int* char_mapping[2];
+
+    /**
+     * The active character set. For example, 0 for G0, 1 for G1, etc.
+     */
+    int active_char_set;
+
+    /**
+     * Whether text is being selected.
+     */
+    bool text_selected;
+
+    /**
+     * The row that the selection starts at.
+     */
+    int selection_start_row;
+
+    /**
+     * The column that the selection starts at.
+     */
+    int selection_start_column;
+
+    /**
+     * The width of the character at selection start.
+     */
+    int selection_start_width;
+
+    /**
+     * The row that the selection ends at.
+     */
+    int selection_end_row;
+
+    /**
+     * The column that the selection ends at.
+     */
+    int selection_end_column;
+
+    /**
+     * The width of the character at selection end.
+     */
+    int selection_end_width;
+
+    /**
+     * Whether the cursor (arrow) keys should send cursor sequences
+     * or application sequences (DECCKM).
+     */
+    bool application_cursor_keys;
+
+    /**
+     * Whether a CR should automatically follow a LF, VT, or FF.
+     */
+    bool automatic_carriage_return;
+
+    /**
+     * Whether insert mode is enabled (DECIM).
+     */
+    bool insert_mode;
+
+    /**
+     * Whether the alt key is currently being held down.
+     */
+    int mod_alt;
+
+    /**
+     * Whether the control key is currently being held down.
+     */
+    int mod_ctrl;
+
+    /**
+     * Whether the shift key is currently being held down.
+     */
+    int mod_shift;
+
+    /**
+     * The current mouse button state.
+     */
+    int mouse_mask;
+
+    /**
+     * The current mouse cursor, to avoid re-setting the cursor image.
+     */
+    guac_terminal_cursor_type current_cursor;
+
+    /**
+     * The current contents of the clipboard.
+     */
+    guac_common_clipboard* clipboard;
+
+};
+
+/**
+ * Creates a new guac_terminal, having the given width and height, and
+ * rendering to the given client.
+ *
+ * @param client
+ *     The client to which the terminal will be rendered.
+ *
+ * @param font_name
+ *     The name of the font to use when rendering glyphs.
+ *
+ * @param font_size
+ *     The size of each glyph, in points.
+ *
+ * @param dpi
+ *     The DPI of the display. The given font size will be adjusted to produce
+ *     glyphs at the given DPI.
+ *
+ * @param width
+ *     The width of the terminal, in pixels.
+ *
+ * @param height
+ *     The height of the terminal, in pixels.
+ *
+ * @param color_scheme
+ *     The name of the color scheme to use. This string must be one of the
+ *     names defined by the GUAC_TERMINAL_SCHEME_* constants. If blank or NULL,
+ *     the default scheme of GUAC_TERMINAL_SCHEME_GRAY_BLACK will be used. If
+ *     invalid, a warning will be logged, and the terminal will fall back on
+ *     GUAC_TERMINAL_SCHEME_GRAY_BLACK.
+ *
+ * @return
+ *     A new guac_terminal having the given font, dimensions, and attributes
+ *     which renders all text to the given client.
+ */
+guac_terminal* guac_terminal_create(guac_client* client,
+        const char* font_name, int font_size, int dpi,
+        int width, int height, const char* color_scheme);
+
+/**
+ * Frees all resources associated with the given terminal.
+ */
+void guac_terminal_free(guac_terminal* term);
+
+/**
+ * Renders a single frame of terminal data. If data is not yet available,
+ * this function will block until data is written.
+ */
+int guac_terminal_render_frame(guac_terminal* terminal);
+
+/**
+ * Reads from this terminal's STDIN. Input comes from key and mouse events
+ * supplied by calls to guac_terminal_send_key() and
+ * guac_terminal_send_mouse(). If input is not yet available, this function
+ * will block.
+ */
+int guac_terminal_read_stdin(guac_terminal* terminal, char* c, int size);
+
+/**
+ * Notifies the terminal that an event has occurred and the terminal should
+ * flush itself when reasonable.
+ *
+ * @param terminal
+ *     The terminal to notify.
+ */
+void guac_terminal_notify(guac_terminal* terminal);
+
+/**
+ * Reads a single line from this terminal's STDIN, storing the result in a
+ * newly-allocated string. Input is retrieved in the same manner as
+ * guac_terminal_read_stdin() and the same restrictions apply.
+ *
+ * @param terminal
+ *     The terminal to which the provided title should be output, and from
+ *     whose STDIN the single line of input should be read.
+ *
+ * @param title
+ *     The human-readable title to output to the terminal just prior to reading
+ *     from STDIN.
+ *
+ * @param echo
+ *     Non-zero if the characters read from STDIN should be echoed back as
+ *     terminal output, or zero if asterisks should be displayed instead.
+ *
+ * @return
+ *     A newly-allocated string containing a single line of input read from the
+ *     provided terminal's STDIN. This string must eventually be manually
+ *     freed with a call to free().
+ */
+char* guac_terminal_prompt(guac_terminal* terminal, const char* title,
+        bool echo);
+
+/**
+ * Writes the given format string and arguments to this terminal's STDOUT in
+ * the same manner as printf(). This function may block until space is
+ * freed in the output buffer by guac_terminal_render_frame().
+ */
+int guac_terminal_printf(guac_terminal* terminal, const char* format, ...);
+
+/**
+ * Handles the given key event, sending data, scrolling, pasting clipboard
+ * data, etc. as necessary.
+ */
+int guac_terminal_send_key(guac_terminal* term, int keysym, int pressed);
+
+/**
+ * Handles the given mouse event, sending data, scrolling, pasting clipboard
+ * data, etc. as necessary.
+ */
+int guac_terminal_send_mouse(guac_terminal* term, guac_user* user,
+        int x, int y, int mask);
+
+/**
+ * Handles a scroll event received from the scrollbar associated with a
+ * terminal.
+ *
+ * @param scrollbar
+ *     The scrollbar that has been scrolled.
+ *
+ * @param value
+ *     The new value that should be stored within the scrollbar, and
+ *     represented within the terminal display.
+ */
+void guac_terminal_scroll_handler(guac_terminal_scrollbar* scrollbar, int value);
+
+/**
+ * Clears the current clipboard contents and sets the mimetype for future
+ * contents.
+ */
+void guac_terminal_clipboard_reset(guac_terminal* term, const char* mimetype);
+
+/**
+ * Appends the given data to the current clipboard.
+ */
+void guac_terminal_clipboard_append(guac_terminal* term, const void* data, int length);
+
+/**
+ * Replicates the current display state to a user that has just joined the
+ * connection. All instructions necessary to replicate state are sent over the
+ * given socket.
+ *
+ * @param term
+ *     The terminal emulator associated with the connection being joined.
+ *
+ * @param user
+ *     The user joining the connection.
+ *
+ * @param socket
+ *     The guac_socket specific to the joining user and across which messages
+ *     synchronizing the current display state should be sent.
+ */
+void guac_terminal_dup(guac_terminal* term, guac_user* user,
+        guac_socket* socket);
+
+/* INTERNAL FUNCTIONS */
+
+
+/**
+ * Acquires exclusive access to the terminal. Note that enforcing this
+ * exclusive access requires that ALL users of the terminal call this
+ * function before making further calls to the terminal.
+ */
+void guac_terminal_lock(guac_terminal* terminal);
+
+/**
+ * Releases exclusive access to the terminal.
+ */
+void guac_terminal_unlock(guac_terminal* terminal);
+
+/**
+ * Resets the state of the given terminal, as if it were just allocated.
+ */
+void guac_terminal_reset(guac_terminal* term);
+
+/**
+ * Writes the given string of characters to the terminal.
+ */
+int guac_terminal_write(guac_terminal* term, const char* c, int size);
+
+/**
+ * Sets the character at the given row and column to the specified value.
+ */
+int guac_terminal_set(guac_terminal* term, int row, int col, int codepoint);
+
+/**
+ * Clears the given region within a single row.
+ */
+int guac_terminal_clear_columns(guac_terminal* term,
+        int row, int start_col, int end_col);
+
+/**
+ * Clears the given region from right-to-left, top-to-bottom, replacing
+ * all characters with the current background color and attributes.
+ */
+int guac_terminal_clear_range(guac_terminal* term,
+        int start_row, int start_col,
+        int end_row, int end_col);
+
+/**
+ * Scrolls the terminal's current scroll region up by one row.
+ */
+int guac_terminal_scroll_up(guac_terminal* term,
+        int start_row, int end_row, int amount);
+
+/**
+ * Scrolls the terminal's current scroll region down by one row.
+ */
+int guac_terminal_scroll_down(guac_terminal* term,
+        int start_row, int end_row, int amount);
+
+/**
+ * Commits the current cursor location, updating the visible cursor
+ * on the screen.
+ */
+void guac_terminal_commit_cursor(guac_terminal* term);
+
+/**
+ * Scroll down the display by the given amount, replacing the new space with
+ * data from the buffer. If not enough data is available, the maximum
+ * amount will be scrolled.
+ */
+void guac_terminal_scroll_display_down(guac_terminal* terminal, int amount);
+
+/**
+ * Scroll up the display by the given amount, replacing the new space with data
+ * from either the buffer or the terminal buffer.  If not enough data is
+ * available, the maximum amount will be scrolled.
+ */
+void guac_terminal_scroll_display_up(guac_terminal* terminal, int amount);
+
+/**
+ * Marks the start of text selection at the given row and column.
+ */
+void guac_terminal_select_start(guac_terminal* terminal, int row, int column);
+
+/**
+ * Updates the end of text selection at the given row and column.
+ */
+void guac_terminal_select_update(guac_terminal* terminal, int row, int column);
+
+/**
+ * Ends text selection, removing any highlight. Character data is stored in the
+ * string buffer provided.
+ */
+void guac_terminal_select_end(guac_terminal* terminal, char* string);
+
+
+/* LOW-LEVEL TERMINAL OPERATIONS */
+
+
+/**
+ * Copies the given range of columns to a new location, offset from
+ * the original by the given number of columns.
+ */
+void guac_terminal_copy_columns(guac_terminal* terminal, int row,
+        int start_column, int end_column, int offset);
+
+/**
+ * Copies the given range of rows to a new location, offset from the
+ * original by the given number of rows.
+ */
+void guac_terminal_copy_rows(guac_terminal* terminal,
+        int start_row, int end_row, int offset);
+
+/**
+ * Sets the given range of columns within the given row to the given
+ * character.
+ */
+void guac_terminal_set_columns(guac_terminal* terminal, int row,
+        int start_column, int end_column, guac_terminal_char* character);
+
+/**
+ * Resize the terminal to the given dimensions.
+ */
+int guac_terminal_resize(guac_terminal* term, int width, int height);
+
+/**
+ * Flushes all pending operations within the given guac_terminal.
+ */
+void guac_terminal_flush(guac_terminal* terminal);
+
+/**
+ * Sends the given string as if typed by the user. 
+ */
+int guac_terminal_send_data(guac_terminal* term, const char* data, int length);
+
+/**
+ * Sends the given string as if typed by the user. 
+ */
+int guac_terminal_send_string(guac_terminal* term, const char* data);
+
+/**
+ * Sends data through STDIN as if typed by the user, using the format
+ * string given and any args (similar to printf).
+ */
+int guac_terminal_sendf(guac_terminal* term, const char* format, ...);
+
+/**
+ * Sets a tabstop in the given column.
+ */
+void guac_terminal_set_tab(guac_terminal* term, int column);
+
+/**
+ * Removes the tabstop at the given column.
+ */
+void guac_terminal_unset_tab(guac_terminal* term, int column);
+
+/**
+ * Removes all tabstops.
+ */
+void guac_terminal_clear_tabs(guac_terminal* term);
+
+/**
+ * Given a column within the given terminal, returns the location of the
+ * next tabstop (or the rightmost character, if no more tabstops exist).
+ */
+int guac_terminal_next_tab(guac_terminal* term, int column);
+
+/**
+ * Opens a new pipe stream, redirecting all output from the given terminal to
+ * that pipe stream. If a pipe stream is already open, that pipe stream will
+ * be flushed and closed prior to opening the new pipe stream.
+ *
+ * @param term
+ *     The terminal which should redirect output to a new pipe stream having
+ *     the given name.
+ *
+ * @param name
+ *     The name of the pipe stream to open.
+ */
+void guac_terminal_pipe_stream_open(guac_terminal* term, const char* name);
+
+/**
+ * Writes a single byte of data to the pipe stream currently open and
+ * associated with the given terminal. The pipe stream must already have been
+ * opened via guac_terminal_pipe_stream_open(). If no pipe stream is currently
+ * open, this function has no effect. Data written through this function may
+ * be buffered.
+ *
+ * @param term
+ *     The terminal whose currently-open pipe stream should be written to.
+ *
+ * @param c
+ *     The byte of data to write to the pipe stream.
+ */
+void guac_terminal_pipe_stream_write(guac_terminal* term, char c);
+
+/**
+ * Flushes any data currently buffered for the currently-open pipe stream
+ * associated with the given terminal. The pipe stream must already have been
+ * opened via guac_terminal_pipe_stream_open(). If no pipe stream is currently
+ * open or no data is in the buffer, this function has no effect.
+ *
+ * @param term
+ *     The terminal whose pipe stream buffer should be flushed.
+ */
+void guac_terminal_pipe_stream_flush(guac_terminal* term);
+
+/**
+ * Closes the currently-open pipe stream associated with the given terminal,
+ * redirecting all output back to the terminal display.  Any data currently
+ * buffered for output to the pipe stream will be flushed prior to closure. The
+ * pipe stream must already have been opened via
+ * guac_terminal_pipe_stream_open(). If no pipe stream is currently open, this
+ * function has no effect.
+ *
+ * @param term
+ *     The terminal whose currently-open pipe stream should be closed.
+ */
+void guac_terminal_pipe_stream_close(guac_terminal* term);
+
+/**
+ * Requests that the terminal write all output to a new pair of typescript
+ * files within the given path and using the given base name. Terminal output
+ * will be written to these new files, along with timing information. If the
+ * create_path flag is non-zero, the given path will be created if it does not
+ * yet exist. If creation of the typescript files or path fails, error messages
+ * will automatically be logged, and no typescript will be written. The
+ * typescript will automatically be closed once the terminal is freed.
+ *
+ * @param term
+ *     The terminal whose output should be written to a typescript.
+ *
+ * @param path
+ *     The full absolute path to a directory in which the typescript files
+ *     should be created.
+ *
+ * @param name
+ *     The base name to use for the typescript files created within the
+ *     specified path.
+ *
+ * @param create_path
+ *     Zero if the specified path MUST exist for typescript files to be
+ *     written, or non-zero if the path should be created if it does not yet
+ *     exist.
+ *
+ * @return
+ *     Zero if the typescript files have been successfully created and a
+ *     typescript will be written, non-zero otherwise.
+ */
+int guac_terminal_create_typescript(guac_terminal* term, const char* path,
+        const char* name, int create_path);
+
+#endif
+

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/blob/3f7ccb6b/src/terminal/terminal/terminal_handlers.h
----------------------------------------------------------------------
diff --git a/src/terminal/terminal/terminal_handlers.h b/src/terminal/terminal/terminal_handlers.h
new file mode 100644
index 0000000..cc97686
--- /dev/null
+++ b/src/terminal/terminal/terminal_handlers.h
@@ -0,0 +1,165 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+#ifndef _GUAC_TERMINAL_HANDLERS
+#define _GUAC_TERMINAL_HANDLERS
+
+#include "config.h"
+
+#include "terminal.h"
+
+/**
+ * The default mode of the terminal. This character handler simply echoes
+ * received characters to the terminal display, entering other terminal modes
+ * if control characters are received.
+ *
+ * @param term
+ *     The terminal that received the given character of data.
+ *
+ * @param c
+ *     The character that was received by the given terminal.
+ */
+int guac_terminal_echo(guac_terminal* term, unsigned char c);
+
+/**
+ * Handles any characters which follow an ANSI ESC (0x1B) character.
+ *
+ * @param term
+ *     The terminal that received the given character of data.
+ *
+ * @param c
+ *     The character that was received by the given terminal.
+ */
+int guac_terminal_escape(guac_terminal* term, unsigned char c);
+
+/**
+ * Selects the G0 character mapping from the provided character mapping
+ * specifier (such as B, 0, U, or K).
+ *
+ * @param term
+ *     The terminal that received the given character of data.
+ *
+ * @param c
+ *     The character that was received by the given terminal.
+ */
+int guac_terminal_g0_charset(guac_terminal* term, unsigned char c);
+
+/**
+ * Selects the G1 character mapping from the provided character mapping
+ * specifier (such as B, 0, U, or K).
+ *
+ * @param term
+ *     The terminal that received the given character of data.
+ *
+ * @param c
+ *     The character that was received by the given terminal.
+ */
+int guac_terminal_g1_charset(guac_terminal* term, unsigned char c);
+
+/**
+ * Handles characters within a CSI sequence. CSI sequences are most often
+ * introduced with "ESC [".
+ *
+ * @param term
+ *     The terminal that received the given character of data.
+ *
+ * @param c
+ *     The character that was received by the given terminal.
+ */
+int guac_terminal_csi(guac_terminal* term, unsigned char c);
+
+/**
+ * Parses the remainder of the download initiation OSC specific to the
+ * Guacamole terminal emulator. A download will be initiated for the specified
+ * file once the OSC sequence is complete.
+ *
+ * @param term
+ *     The terminal that received the given character of data.
+ *
+ * @param c
+ *     The character that was received by the given terminal.
+ */
+int guac_terminal_download(guac_terminal* term, unsigned char c);
+
+/**
+ * Parses the remainder of the set directory OSC specific to the Guacamole
+ * terminal emulator. The upload directory will be set to the specified path
+ * once the OSC sequence is complete.
+ *
+ * @param term
+ *     The terminal that received the given character of data.
+ *
+ * @param c
+ *     The character that was received by the given terminal.
+ */
+int guac_terminal_set_directory(guac_terminal* term, unsigned char c);
+
+/**
+ * Parses the remainder of the open pipe OSC specific to the
+ * Guacamole terminal emulator. Terminal output will be redirected to a new
+ * named pipe having the given name once the OSC sequence is complete.
+ *
+ * @param term
+ *     The terminal that received the given character of data.
+ *
+ * @param c
+ *     The character that was received by the given terminal.
+ */
+int guac_terminal_open_pipe_stream(guac_terminal* term, unsigned char c);
+
+/**
+ * Parses the remainder of the close pipe OSC specific to the Guacamole
+ * terminal emulator. Terminal output will be redirected back to the terminal
+ * display and any open named pipe will be closed once the OSC sequence is
+ * complete.
+ *
+ * @param term
+ *     The terminal that received the given character of data.
+ *
+ * @param c
+ *     The character that was received by the given terminal.
+ */
+int guac_terminal_close_pipe_stream(guac_terminal* term, unsigned char c);
+
+/**
+ * Handles the remaining characters of an Operating System Code (OSC) sequence,
+ * typically initiated with "ESC ]".
+ *
+ * @param term
+ *     The terminal that received the given character of data.
+ *
+ * @param c
+ *     The character that was received by the given terminal.
+ */
+int guac_terminal_osc(guac_terminal* term, unsigned char c);
+
+/**
+ * Handles terminal control function sequences initiated with "ESC #".
+ *
+ * @param term
+ *     The terminal that received the given character of data.
+ *
+ * @param c
+ *     The character that was received by the given terminal.
+ */
+int guac_terminal_ctrl_func(guac_terminal* term, unsigned char c);
+
+#endif
+

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/blob/3f7ccb6b/src/terminal/terminal/types.h
----------------------------------------------------------------------
diff --git a/src/terminal/terminal/types.h b/src/terminal/terminal/types.h
new file mode 100644
index 0000000..ccb862f
--- /dev/null
+++ b/src/terminal/terminal/types.h
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+#ifndef _GUAC_TERMINAL_TYPES_H
+#define _GUAC_TERMINAL_TYPES_H
+
+#include "config.h"
+
+#include <stdbool.h>
+
+/**
+ * A character which is not truly a character, but rather part of an
+ * existing character which spans multiple columns. The original
+ * character will be somewhere earlier in the row, separated from
+ * this character by a contiguous string of zero of more
+ * GUAC_CHAR_CONTINUATION characters.
+ */
+#define GUAC_CHAR_CONTINUATION -1
+
+/**
+ * An RGB color, where each component ranges from 0 to 255.
+ */
+typedef struct guac_terminal_color {
+
+    /**
+     * The red component of this color.
+     */
+    int red;
+
+    /**
+     * The green component of this color.
+     */
+    int green;
+
+    /**
+     * The blue component of this color.
+     */
+    int blue;
+
+} guac_terminal_color;
+
+/**
+ * Terminal attributes, as can be applied to a single character.
+ */
+typedef struct guac_terminal_attributes {
+
+    /**
+     * Whether the character should be rendered bold.
+     */
+    bool bold;
+
+    /**
+     * Whether the character should be rendered with reversed colors
+     * (background becomes foreground and vice-versa).
+     */
+    bool reverse;
+
+    /**
+     * Whether the associated character is highlighted by the cursor.
+     */
+    bool cursor;
+
+    /**
+     * Whether to render the character with underscore.
+     */
+    bool underscore;
+
+    /**
+     * The foreground color of this character, as a palette index.
+     */
+    int foreground;
+
+    /**
+     * The background color of this character, as a palette index.
+     */
+    int background;
+
+} guac_terminal_attributes;
+
+/**
+ * Represents a single character for display in a terminal, including actual
+ * character value, foreground color, and background color.
+ */
+typedef struct guac_terminal_char {
+
+    /**
+     * The Unicode codepoint of the character to display, or
+     * GUAC_CHAR_CONTINUATION if this character is part of
+     * another character which spans multiple columns.
+     */
+    int value;
+
+    /**
+     * The attributes of the character to display.
+     */
+    guac_terminal_attributes attributes;
+
+    /**
+     * The number of columns this character occupies. If the character is
+     * GUAC_CHAR_CONTINUATION, this value is undefined and not applicable.
+     */
+    int width;
+
+} guac_terminal_char;
+
+#endif
+

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/blob/3f7ccb6b/src/terminal/terminal/typescript.h
----------------------------------------------------------------------
diff --git a/src/terminal/terminal/typescript.h b/src/terminal/terminal/typescript.h
new file mode 100644
index 0000000..9fce9e5
--- /dev/null
+++ b/src/terminal/terminal/typescript.h
@@ -0,0 +1,184 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+#ifndef GUAC_TERMINAL_TYPESCRIPT_H
+#define GUAC_TERMINAL_TYPESCRIPT_H
+
+#include "config.h"
+
+#include <guacamole/timestamp.h>
+
+/**
+ * A NULL-terminated string of raw bytes which should be written at the
+ * beginning of any typescript.
+ */
+#define GUAC_TERMINAL_TYPESCRIPT_HEADER "[BEGIN TYPESCRIPT]\n"
+
+/**
+ * A NULL-terminated string of raw bytes which should be written at the
+ * end of any typescript.
+ */
+#define GUAC_TERMINAL_TYPESCRIPT_FOOTER "\n[END TYPESCRIPT]\n"
+
+/**
+ * The maximum amount of time to allow for a particular timing entry, in
+ * milliseconds. Any timing entries exceeding this value will be written as
+ * exactly this value instead.
+ */
+#define GUAC_TERMINAL_TYPESCRIPT_MAX_DELAY 86400000
+
+/**
+ * The maximum numeric value allowed for the .1, .2, .3, etc. suffix appended
+ * to the end of the typescript filename if a typescript having the requested
+ * name already exists.
+ */
+#define GUAC_TERMINAL_TYPESCRIPT_MAX_SUFFIX 255
+
+/**
+ * The maximum length of the string containing a sequential numeric suffix
+ * between 1 and GUAC_TERMINAL_TYPESCRIPT_MAX_SUFFIX inclusive, in bytes,
+ * including NULL terminator.
+ */
+#define GUAC_TERMINAL_TYPESCRIPT_MAX_SUFFIX_LENGTH 4
+
+/**
+ * The maximum overall length of the full path to the typescript file,
+ * including any additional suffix and NULL terminator, in bytes.
+ */
+#define GUAC_TERMINAL_TYPESCRIPT_MAX_NAME_LENGTH 2048
+
+/**
+ * The suffix which will be appended to the typescript data file's name to
+ * produce the name of the timing file.
+ */
+#define GUAC_TERMINAL_TYPESCRIPT_TIMING_SUFFIX "timing"
+
+/**
+ * An active typescript, consisting of a data file (raw terminal output) and
+ * timing file (related timestamps and byte counts).
+ */
+typedef struct guac_terminal_typescript {
+
+    /**
+     * Buffer of raw terminal output which has not yet been written to the
+     * data file.
+     */
+    char buffer[4096];
+
+    /**
+     * The number of bytes currently stored in the buffer.
+     */
+    int length;
+
+    /**
+     * The full path to the file which will contain the raw terminal output for
+     * this typescript.
+     */
+    char data_filename[GUAC_TERMINAL_TYPESCRIPT_MAX_NAME_LENGTH];
+
+    /**
+     * The full path to the file which will contain the timing information for
+     * this typescript.
+     */
+    char timing_filename[GUAC_TERMINAL_TYPESCRIPT_MAX_NAME_LENGTH];
+
+    /**
+     * The file descriptor of the file into which raw terminal output should be
+     * written.
+     */
+    int data_fd;
+
+    /**
+     * The file descriptor of the file into which timing information
+     * (timestamps and byte counts) related to the raw terminal output in the
+     * data file should be written.
+     */
+    int timing_fd;
+
+    /**
+     * The last time that this typescript was flushed. If this typescript was
+     * never flushed, this will be the time the typescripe was created.
+     */
+    guac_timestamp last_flush;
+
+} guac_terminal_typescript;
+
+/**
+ * Creates a new pair of typescript files within the given path and using the
+ * given base name, returning an abstraction which represents those files.
+ * Terminal output will be written to these new files, along with timing
+ * information. If the create_path flag is non-zero, the given path will be
+ * created if it does not yet exist.
+ *
+ * @param path
+ *     The full absolute path to a directory in which the typescript files
+ *     should be created.
+ *
+ * @param name
+ *     The base name to use for the typescript files created within the
+ *     specified path.
+ *
+ * @param create_path
+ *     Zero if the specified path MUST exist for typescript files to be
+ *     written, or non-zero if the path should be created if it does not yet
+ *     exist.
+ *
+ * @return
+ *     A new guac_terminal_typescript representing the typescript files
+ *     requested, or NULL if creation of the typescript files failed.
+ */
+guac_terminal_typescript* guac_terminal_typescript_alloc(const char* path,
+        const char* name, int create_path);
+
+/**
+ * Writes a single byte of terminal data to the typescript, flushing and
+ * writing a new timestamp if necessary.
+ *
+ * @param typescript
+ *     The typescript that the given byte of raw terminal data should be
+ *     written to.
+ *
+ * @param c
+ *     The single byte of raw terminal data to write to the typescript.
+ */
+void guac_terminal_typescript_write(guac_terminal_typescript* typescript,
+        char c);
+
+/**
+ * Flushes any pending data to the typescript, writing a new timestamp to the
+ * timing file if any data was flushed.
+ *
+ * @param typescript
+ *     The typescript which should be flushed.
+ */
+void guac_terminal_typescript_flush(guac_terminal_typescript* typescript);
+
+/**
+ * Frees all resources associated with the given typescript, flushing and
+ * closing the data and timing files and freeing all related memory. If the
+ * provided typescript is NULL, this function has no effect.
+ *
+ * @param typescript
+ *     The typescript to free.
+ */
+void guac_terminal_typescript_free(guac_terminal_typescript* typescript);
+
+#endif
+

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/blob/3f7ccb6b/src/terminal/terminal_handlers.c
----------------------------------------------------------------------
diff --git a/src/terminal/terminal_handlers.c b/src/terminal/terminal_handlers.c
index 2bae0f2..328400c 100644
--- a/src/terminal/terminal_handlers.c
+++ b/src/terminal/terminal_handlers.c
@@ -19,10 +19,10 @@
 
 #include "config.h"
 
-#include "char_mappings.h"
-#include "terminal.h"
-#include "terminal_handlers.h"
-#include "types.h"
+#include "terminal/char_mappings.h"
+#include "terminal/terminal.h"
+#include "terminal/terminal_handlers.h"
+#include "terminal/types.h"
 
 #include <guacamole/client.h>
 #include <guacamole/protocol.h>

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/blob/3f7ccb6b/src/terminal/terminal_handlers.h
----------------------------------------------------------------------
diff --git a/src/terminal/terminal_handlers.h b/src/terminal/terminal_handlers.h
deleted file mode 100644
index cc97686..0000000
--- a/src/terminal/terminal_handlers.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-#ifndef _GUAC_TERMINAL_HANDLERS
-#define _GUAC_TERMINAL_HANDLERS
-
-#include "config.h"
-
-#include "terminal.h"
-
-/**
- * The default mode of the terminal. This character handler simply echoes
- * received characters to the terminal display, entering other terminal modes
- * if control characters are received.
- *
- * @param term
- *     The terminal that received the given character of data.
- *
- * @param c
- *     The character that was received by the given terminal.
- */
-int guac_terminal_echo(guac_terminal* term, unsigned char c);
-
-/**
- * Handles any characters which follow an ANSI ESC (0x1B) character.
- *
- * @param term
- *     The terminal that received the given character of data.
- *
- * @param c
- *     The character that was received by the given terminal.
- */
-int guac_terminal_escape(guac_terminal* term, unsigned char c);
-
-/**
- * Selects the G0 character mapping from the provided character mapping
- * specifier (such as B, 0, U, or K).
- *
- * @param term
- *     The terminal that received the given character of data.
- *
- * @param c
- *     The character that was received by the given terminal.
- */
-int guac_terminal_g0_charset(guac_terminal* term, unsigned char c);
-
-/**
- * Selects the G1 character mapping from the provided character mapping
- * specifier (such as B, 0, U, or K).
- *
- * @param term
- *     The terminal that received the given character of data.
- *
- * @param c
- *     The character that was received by the given terminal.
- */
-int guac_terminal_g1_charset(guac_terminal* term, unsigned char c);
-
-/**
- * Handles characters within a CSI sequence. CSI sequences are most often
- * introduced with "ESC [".
- *
- * @param term
- *     The terminal that received the given character of data.
- *
- * @param c
- *     The character that was received by the given terminal.
- */
-int guac_terminal_csi(guac_terminal* term, unsigned char c);
-
-/**
- * Parses the remainder of the download initiation OSC specific to the
- * Guacamole terminal emulator. A download will be initiated for the specified
- * file once the OSC sequence is complete.
- *
- * @param term
- *     The terminal that received the given character of data.
- *
- * @param c
- *     The character that was received by the given terminal.
- */
-int guac_terminal_download(guac_terminal* term, unsigned char c);
-
-/**
- * Parses the remainder of the set directory OSC specific to the Guacamole
- * terminal emulator. The upload directory will be set to the specified path
- * once the OSC sequence is complete.
- *
- * @param term
- *     The terminal that received the given character of data.
- *
- * @param c
- *     The character that was received by the given terminal.
- */
-int guac_terminal_set_directory(guac_terminal* term, unsigned char c);
-
-/**
- * Parses the remainder of the open pipe OSC specific to the
- * Guacamole terminal emulator. Terminal output will be redirected to a new
- * named pipe having the given name once the OSC sequence is complete.
- *
- * @param term
- *     The terminal that received the given character of data.
- *
- * @param c
- *     The character that was received by the given terminal.
- */
-int guac_terminal_open_pipe_stream(guac_terminal* term, unsigned char c);
-
-/**
- * Parses the remainder of the close pipe OSC specific to the Guacamole
- * terminal emulator. Terminal output will be redirected back to the terminal
- * display and any open named pipe will be closed once the OSC sequence is
- * complete.
- *
- * @param term
- *     The terminal that received the given character of data.
- *
- * @param c
- *     The character that was received by the given terminal.
- */
-int guac_terminal_close_pipe_stream(guac_terminal* term, unsigned char c);
-
-/**
- * Handles the remaining characters of an Operating System Code (OSC) sequence,
- * typically initiated with "ESC ]".
- *
- * @param term
- *     The terminal that received the given character of data.
- *
- * @param c
- *     The character that was received by the given terminal.
- */
-int guac_terminal_osc(guac_terminal* term, unsigned char c);
-
-/**
- * Handles terminal control function sequences initiated with "ESC #".
- *
- * @param term
- *     The terminal that received the given character of data.
- *
- * @param c
- *     The character that was received by the given terminal.
- */
-int guac_terminal_ctrl_func(guac_terminal* term, unsigned char c);
-
-#endif
-

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/blob/3f7ccb6b/src/terminal/types.h
----------------------------------------------------------------------
diff --git a/src/terminal/types.h b/src/terminal/types.h
deleted file mode 100644
index ccb862f..0000000
--- a/src/terminal/types.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-#ifndef _GUAC_TERMINAL_TYPES_H
-#define _GUAC_TERMINAL_TYPES_H
-
-#include "config.h"
-
-#include <stdbool.h>
-
-/**
- * A character which is not truly a character, but rather part of an
- * existing character which spans multiple columns. The original
- * character will be somewhere earlier in the row, separated from
- * this character by a contiguous string of zero of more
- * GUAC_CHAR_CONTINUATION characters.
- */
-#define GUAC_CHAR_CONTINUATION -1
-
-/**
- * An RGB color, where each component ranges from 0 to 255.
- */
-typedef struct guac_terminal_color {
-
-    /**
-     * The red component of this color.
-     */
-    int red;
-
-    /**
-     * The green component of this color.
-     */
-    int green;
-
-    /**
-     * The blue component of this color.
-     */
-    int blue;
-
-} guac_terminal_color;
-
-/**
- * Terminal attributes, as can be applied to a single character.
- */
-typedef struct guac_terminal_attributes {
-
-    /**
-     * Whether the character should be rendered bold.
-     */
-    bool bold;
-
-    /**
-     * Whether the character should be rendered with reversed colors
-     * (background becomes foreground and vice-versa).
-     */
-    bool reverse;
-
-    /**
-     * Whether the associated character is highlighted by the cursor.
-     */
-    bool cursor;
-
-    /**
-     * Whether to render the character with underscore.
-     */
-    bool underscore;
-
-    /**
-     * The foreground color of this character, as a palette index.
-     */
-    int foreground;
-
-    /**
-     * The background color of this character, as a palette index.
-     */
-    int background;
-
-} guac_terminal_attributes;
-
-/**
- * Represents a single character for display in a terminal, including actual
- * character value, foreground color, and background color.
- */
-typedef struct guac_terminal_char {
-
-    /**
-     * The Unicode codepoint of the character to display, or
-     * GUAC_CHAR_CONTINUATION if this character is part of
-     * another character which spans multiple columns.
-     */
-    int value;
-
-    /**
-     * The attributes of the character to display.
-     */
-    guac_terminal_attributes attributes;
-
-    /**
-     * The number of columns this character occupies. If the character is
-     * GUAC_CHAR_CONTINUATION, this value is undefined and not applicable.
-     */
-    int width;
-
-} guac_terminal_char;
-
-#endif
-

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/blob/3f7ccb6b/src/terminal/typescript.c
----------------------------------------------------------------------
diff --git a/src/terminal/typescript.c b/src/terminal/typescript.c
index aa922f0..69c8a1d 100644
--- a/src/terminal/typescript.c
+++ b/src/terminal/typescript.c
@@ -19,7 +19,7 @@
 
 #include "config.h"
 #include "common/io.h"
-#include "typescript.h"
+#include "terminal/typescript.h"
 
 #include <guacamole/timestamp.h>
 

http://git-wip-us.apache.org/repos/asf/incubator-guacamole-server/blob/3f7ccb6b/src/terminal/typescript.h
----------------------------------------------------------------------
diff --git a/src/terminal/typescript.h b/src/terminal/typescript.h
deleted file mode 100644
index 9fce9e5..0000000
--- a/src/terminal/typescript.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-#ifndef GUAC_TERMINAL_TYPESCRIPT_H
-#define GUAC_TERMINAL_TYPESCRIPT_H
-
-#include "config.h"
-
-#include <guacamole/timestamp.h>
-
-/**
- * A NULL-terminated string of raw bytes which should be written at the
- * beginning of any typescript.
- */
-#define GUAC_TERMINAL_TYPESCRIPT_HEADER "[BEGIN TYPESCRIPT]\n"
-
-/**
- * A NULL-terminated string of raw bytes which should be written at the
- * end of any typescript.
- */
-#define GUAC_TERMINAL_TYPESCRIPT_FOOTER "\n[END TYPESCRIPT]\n"
-
-/**
- * The maximum amount of time to allow for a particular timing entry, in
- * milliseconds. Any timing entries exceeding this value will be written as
- * exactly this value instead.
- */
-#define GUAC_TERMINAL_TYPESCRIPT_MAX_DELAY 86400000
-
-/**
- * The maximum numeric value allowed for the .1, .2, .3, etc. suffix appended
- * to the end of the typescript filename if a typescript having the requested
- * name already exists.
- */
-#define GUAC_TERMINAL_TYPESCRIPT_MAX_SUFFIX 255
-
-/**
- * The maximum length of the string containing a sequential numeric suffix
- * between 1 and GUAC_TERMINAL_TYPESCRIPT_MAX_SUFFIX inclusive, in bytes,
- * including NULL terminator.
- */
-#define GUAC_TERMINAL_TYPESCRIPT_MAX_SUFFIX_LENGTH 4
-
-/**
- * The maximum overall length of the full path to the typescript file,
- * including any additional suffix and NULL terminator, in bytes.
- */
-#define GUAC_TERMINAL_TYPESCRIPT_MAX_NAME_LENGTH 2048
-
-/**
- * The suffix which will be appended to the typescript data file's name to
- * produce the name of the timing file.
- */
-#define GUAC_TERMINAL_TYPESCRIPT_TIMING_SUFFIX "timing"
-
-/**
- * An active typescript, consisting of a data file (raw terminal output) and
- * timing file (related timestamps and byte counts).
- */
-typedef struct guac_terminal_typescript {
-
-    /**
-     * Buffer of raw terminal output which has not yet been written to the
-     * data file.
-     */
-    char buffer[4096];
-
-    /**
-     * The number of bytes currently stored in the buffer.
-     */
-    int length;
-
-    /**
-     * The full path to the file which will contain the raw terminal output for
-     * this typescript.
-     */
-    char data_filename[GUAC_TERMINAL_TYPESCRIPT_MAX_NAME_LENGTH];
-
-    /**
-     * The full path to the file which will contain the timing information for
-     * this typescript.
-     */
-    char timing_filename[GUAC_TERMINAL_TYPESCRIPT_MAX_NAME_LENGTH];
-
-    /**
-     * The file descriptor of the file into which raw terminal output should be
-     * written.
-     */
-    int data_fd;
-
-    /**
-     * The file descriptor of the file into which timing information
-     * (timestamps and byte counts) related to the raw terminal output in the
-     * data file should be written.
-     */
-    int timing_fd;
-
-    /**
-     * The last time that this typescript was flushed. If this typescript was
-     * never flushed, this will be the time the typescripe was created.
-     */
-    guac_timestamp last_flush;
-
-} guac_terminal_typescript;
-
-/**
- * Creates a new pair of typescript files within the given path and using the
- * given base name, returning an abstraction which represents those files.
- * Terminal output will be written to these new files, along with timing
- * information. If the create_path flag is non-zero, the given path will be
- * created if it does not yet exist.
- *
- * @param path
- *     The full absolute path to a directory in which the typescript files
- *     should be created.
- *
- * @param name
- *     The base name to use for the typescript files created within the
- *     specified path.
- *
- * @param create_path
- *     Zero if the specified path MUST exist for typescript files to be
- *     written, or non-zero if the path should be created if it does not yet
- *     exist.
- *
- * @return
- *     A new guac_terminal_typescript representing the typescript files
- *     requested, or NULL if creation of the typescript files failed.
- */
-guac_terminal_typescript* guac_terminal_typescript_alloc(const char* path,
-        const char* name, int create_path);
-
-/**
- * Writes a single byte of terminal data to the typescript, flushing and
- * writing a new timestamp if necessary.
- *
- * @param typescript
- *     The typescript that the given byte of raw terminal data should be
- *     written to.
- *
- * @param c
- *     The single byte of raw terminal data to write to the typescript.
- */
-void guac_terminal_typescript_write(guac_terminal_typescript* typescript,
-        char c);
-
-/**
- * Flushes any pending data to the typescript, writing a new timestamp to the
- * timing file if any data was flushed.
- *
- * @param typescript
- *     The typescript which should be flushed.
- */
-void guac_terminal_typescript_flush(guac_terminal_typescript* typescript);
-
-/**
- * Frees all resources associated with the given typescript, flushing and
- * closing the data and timing files and freeing all related memory. If the
- * provided typescript is NULL, this function has no effect.
- *
- * @param typescript
- *     The typescript to free.
- */
-void guac_terminal_typescript_free(guac_terminal_typescript* typescript);
-
-#endif
-


Mime
View raw message