From 23af2d30412f80672510470b4c913b106ca19ecb Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Fri, 26 Feb 2016 23:25:10 -0800 Subject: [PATCH] GUAC-236: Handle sync instruction. --- src/guacenc/Makefile.am | 1 + src/guacenc/instruction-sync.c | 82 ++++++++++++++++++++++++++++++++++ src/guacenc/instructions.c | 1 + src/guacenc/instructions.h | 5 +++ 4 files changed, 89 insertions(+) create mode 100644 src/guacenc/instruction-sync.c diff --git a/src/guacenc/Makefile.am b/src/guacenc/Makefile.am index 102d579d..7824cf14 100644 --- a/src/guacenc/Makefile.am +++ b/src/guacenc/Makefile.am @@ -44,6 +44,7 @@ guacenc_SOURCES = \ instruction-rect.c \ instruction-shade.c \ instruction-size.c \ + instruction-sync.c \ instruction-transfer.c \ log.c diff --git a/src/guacenc/instruction-sync.c b/src/guacenc/instruction-sync.c new file mode 100644 index 00000000..5f818743 --- /dev/null +++ b/src/guacenc/instruction-sync.c @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2016 Glyptodon, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "config.h" +#include "log.h" + +#include +#include + +#include +#include + +/** + * Parses a guac_timestamp from the given string. The string is assumed to + * consist solely of decimal digits with an optional leading minus sign. If the + * given string contains other characters, the behavior of this function is + * undefined. + * + * @param str + * The string to parse, which must contain only decimal digits and an + * optional leading minus sign. + * + * @return + * A guac_timestamp having the same value as the provided string. + */ +static guac_timestamp guacenc_parse_timestamp(const char* str) { + + int sign = 1; + int64_t num = 0; + + for (; *str != '\0'; str++) { + + /* Flip sign for each '-' encountered */ + if (*str == '-') + sign = -sign; + + /* If not '-', assume the character is a digit */ + else + num = num * 10 + (*str - '0'); + + } + + return (guac_timestamp) (num * sign); + +} + +int guacenc_handle_sync(int argc, char** argv) { + + /* Verify argument count */ + if (argc < 1) { + guacenc_log(GUAC_LOG_DEBUG, "\"sync\" instruction incomplete"); + return 1; + } + + /* Parse arguments */ + guac_timestamp timestamp = guacenc_parse_timestamp(argv[0]); + + /* STUB */ + guacenc_log(GUAC_LOG_DEBUG, "sync: timestamp=%" PRId64, timestamp); + return 0; + +} + diff --git a/src/guacenc/instructions.c b/src/guacenc/instructions.c index 81329cf2..d2324096 100644 --- a/src/guacenc/instructions.c +++ b/src/guacenc/instructions.c @@ -32,6 +32,7 @@ guacenc_instruction_handler_mapping guacenc_instruction_handler_map[] = { {"blob", guacenc_handle_blob}, {"img", guacenc_handle_img}, {"end", guacenc_handle_end}, + {"sync", guacenc_handle_sync}, {"cursor", guacenc_handle_cursor}, {"copy", guacenc_handle_copy}, {"transfer", guacenc_handle_transfer}, diff --git a/src/guacenc/instructions.h b/src/guacenc/instructions.h index 5f8d6728..0139ddb4 100644 --- a/src/guacenc/instructions.h +++ b/src/guacenc/instructions.h @@ -108,6 +108,11 @@ guacenc_instruction_handler guacenc_handle_img; */ guacenc_instruction_handler guacenc_handle_end; +/** + * Handler for the Guacamole "sync" instruction. + */ +guacenc_instruction_handler guacenc_handle_sync; + /** * Handler for the Guacamole "cursor" instruction. */