You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@guacamole.apache.org by jm...@apache.org on 2017/02/28 18:32:41 UTC
[3/8] incubator-guacamole-server git commit: GUACAMOLE-169: Move
terminal headers to namespaced directory.
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
-