blob: b0278f0184a2f8e7de222accd54b8b62dd46260b [file] [log] [blame]
/*
* 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_COMMON_RECORDING_H
#define GUAC_COMMON_RECORDING_H
#include <guacamole/client.h>
/**
* The maximum numeric value allowed for the .1, .2, .3, etc. suffix appended
* to the end of the session recording filename if a recording having the
* requested name already exists.
*/
#define GUAC_COMMON_RECORDING_MAX_SUFFIX 255
/**
* The maximum length of the string containing a sequential numeric suffix
* between 1 and GUAC_COMMON_RECORDING_MAX_SUFFIX inclusive, in bytes,
* including NULL terminator.
*/
#define GUAC_COMMON_RECORDING_MAX_SUFFIX_LENGTH 4
/**
* The maximum overall length of the full path to the session recording file,
* including any additional suffix and NULL terminator, in bytes.
*/
#define GUAC_COMMON_RECORDING_MAX_NAME_LENGTH 2048
/**
* An in-progress session recording, attached to a guac_client instance such
* that output Guacamole instructions may be dynamically intercepted and
* written to a file.
*/
typedef struct guac_common_recording {
/**
* The guac_socket which writes directly to the recording file, rather than
* to any particular user.
*/
guac_socket* socket;
/**
* Non-zero if output which is broadcast to each connected client
* (graphics, streams, etc.) should be included in the session recording,
* zero otherwise. Including output is necessary for any recording which
* must later be viewable as video.
*/
int include_output;
/**
* Non-zero if changes to mouse state, such as position and buttons pressed
* or released, should be included in the session recording, zero
* otherwise. Including mouse state is necessary for the mouse cursor to be
* rendered in any resulting video.
*/
int include_mouse;
/**
* Non-zero if keys pressed and released should be included in the session
* recording, zero otherwise. Including key events within the recording may
* be necessary in certain auditing contexts, but should only be done with
* caution. Key events can easily contain sensitive information, such as
* passwords, credit card numbers, etc.
*/
int include_keys;
} guac_common_recording;
/**
* Replaces the socket of the given client such that all further Guacamole
* protocol output will be copied into a file within the given path and having
* the given name. If the create_path flag is non-zero, the given path will be
* created if it does not yet exist. If creation of the recording file or path
* fails, error messages will automatically be logged, and no recording will be
* written. The recording will automatically be closed once the client is
* freed.
*
* @param client
* The client whose output should be copied to a recording file.
*
* @param path
* The full absolute path to a directory in which the recording file should
* be created.
*
* @param name
* The base name to use for the recording file created within the specified
* path.
*
* @param create_path
* Zero if the specified path MUST exist for the recording file to be
* written, or non-zero if the path should be created if it does not yet
* exist.
*
* @param include_output
* Non-zero if output which is broadcast to each connected client
* (graphics, streams, etc.) should be included in the session recording,
* zero otherwise. Including output is necessary for any recording which
* must later be viewable as video.
*
* @param include_mouse
* Non-zero if changes to mouse state, such as position and buttons pressed
* or released, should be included in the session recording, zero
* otherwise. Including mouse state is necessary for the mouse cursor to be
* rendered in any resulting video.
*
* @param include_keys
* Non-zero if keys pressed and released should be included in the session
* recording, zero otherwise. Including key events within the recording may
* be necessary in certain auditing contexts, but should only be done with
* caution. Key events can easily contain sensitive information, such as
* passwords, credit card numbers, etc.
*
* @return
* A new guac_common_recording structure representing the in-progress
* recording if the recording file has been successfully created and a
* recording will be written, NULL otherwise.
*/
guac_common_recording* guac_common_recording_create(guac_client* client,
const char* path, const char* name, int create_path,
int include_output, int include_mouse, int include_keys);
/**
* Frees the resources associated with the given in-progress recording. Note
* that, due to the manner that recordings are attached to the guac_client, the
* underlying guac_socket is not freed. The guac_socket will be automatically
* freed when the guac_client is freed.
*
* @param recording
* The guac_common_recording to free.
*/
void guac_common_recording_free(guac_common_recording* recording);
/**
* Reports the current mouse position and button state within the recording.
*
* @param recording
* The guac_common_recording associated with the mouse that has moved.
*
* @param x
* The new X coordinate of the mouse cursor, in pixels.
*
* @param y
* The new Y coordinate of the mouse cursor, in pixels.
*
* @param button_mask
* An integer value representing the current state of each button, where
* the Nth bit within the integer is set to 1 if and only if the Nth mouse
* button is currently pressed. The lowest-order bit is the left mouse
* button, followed by the middle button, right button, and finally the up
* and down buttons of the scroll wheel.
*
* @see GUAC_CLIENT_MOUSE_LEFT
* @see GUAC_CLIENT_MOUSE_MIDDLE
* @see GUAC_CLIENT_MOUSE_RIGHT
* @see GUAC_CLIENT_MOUSE_SCROLL_UP
* @see GUAC_CLIENT_MOUSE_SCROLL_DOWN
*/
void guac_common_recording_report_mouse(guac_common_recording* recording,
int x, int y, int button_mask);
/**
* Reports a change in the state of an individual key within the recording.
*
* @param recording
* The guac_common_recording associated with the key that was pressed or
* released.
*
* @param keysym
* The X11 keysym of the key that was pressed or released.
*
* @param pressed
* Non-zero if the key represented by the given keysym is currently
* pressed, zero if it is released.
*/
void guac_common_recording_report_key(guac_common_recording* recording,
int keysym, int pressed);
#endif