diff options
Diffstat (limited to 'dialoguer/dialoguer.r')
-rw-r--r-- | dialoguer/dialoguer.r | 80 |
1 files changed, 64 insertions, 16 deletions
diff --git a/dialoguer/dialoguer.r b/dialoguer/dialoguer.r index dbfa8e0..461358f 100644 --- a/dialoguer/dialoguer.r +++ b/dialoguer/dialoguer.r @@ -23,37 +23,84 @@ dialoguer.display_msg <- function(...) { ) } +dialoguer.sub_send <- function(conn, data) { + writeBin(data, conn) +} + # may not need to pass connection if it will only be 1 per dialogue -dialoguer.send <- function(conn, data, send_data_type = FALSE) { +dialoguer.send <- function(conn, data, send_data_type = FALSE, send_length = FALSE, send_element_names = FALSE) { if (send_data_type) { data_type_name <- typeof(data) - writeBin(data_type_name, conn) - recv_chk <- dialoguer.recv(conn, set_data_type = 'logical') + dialoguer.sub_send(conn, data_type_name) + recv_chk <- dialoguer.sub_recv(conn, 'logical') } - writeBin(data, conn) + if (send_length) { + data_length <- length(data) + dialoguer.sub_send(conn, data_length) + recv_chk <- dialoguer.sub_recv(conn, 'logical') + } + if (send_element_names) { + data_names_length <- length(names(data)) + dialoguer.sub_send(conn, data_names_length) + recv_chk <- dialoguer.sub_recv(conn, 'logical') + if (data_names_length) { + for (elem_name in names(data)) { + dialoguer.sub_send(conn, elem_name) + recv_chk <- dialoguer.sub_recv(conn, 'logical') + } + } + } + for (elem in data) { + dialoguer.sub_send(conn, elem) + recv_chk <- dialoguer.sub_recv(conn, 'logical') + } +} + +dialoguer.sub_recv <- function(conn, data_type = "character") { + suppressWarnings(data <- readBin(conn, "raw", dialoguer.HEADER)) + while (length(data) == 0) { + suppressWarnings(data <- readBin(conn, "raw", dialoguer.HEADER)) + } + data <- readBin(data, data_type) + return(data) } # may not need to pass connection if it will only be 1 per dialogue # I still want to consolidate the recv_data_type and set_data_type args -dialoguer.recv <- function(conn, recv_data_type = FALSE, set_data_type = "character") { +dialoguer.recv <- function(conn, recv_data_type = FALSE, set_data_type = "character", recv_length = FALSE, recv_element_names = FALSE) { if (recv_data_type) { - suppressWarnings(data_type <- readBin(conn, "raw", dialoguer.HEADER)) - while (length(data_type) == 0) { - suppressWarnings(data_type <- readBin(conn, "raw", dialoguer.HEADER)) - } - data_type <- readBin(data_type, "character") + data_type <- dialoguer.sub_recv(conn) + dialoguer.sub_send(conn, TRUE) data_type <- dialoguer.data_type_vect[data_type] - dialoguer.send(conn, TRUE) } else { data_type <- set_data_type } - suppressWarnings(data <- readBin(conn, "raw", dialoguer.HEADER)) - while (length(data) == 0) { - suppressWarnings(data <- readBin(conn, "raw", dialoguer.HEADER)) + if (recv_length) { + data_length <- dialoguer.sub_recv(conn, "integer") + dialoguer.sub_send(conn, TRUE) + } else { + data_length <- 1 } - data <- readBin(data, data_type) + data <- c() + for (i in 1:data_length) { + elem <- dialoguer.sub_recv(conn, data_type) + dialoguer.sub_send(conn, TRUE) + data <- c(data, elem) + } + + if (recv_element_names) { + data_names_length <- dialoguer.sub_recv(conn, "integer") + dialoguer.sub_send(conn, TRUE) + elem_names <- c() + for (i in 1:data_names_length) { + elem_name <- dialoguer.sub_recv(conn) + dialoguer.sub_send(conn, TRUE) + elem_names <- c(elem_names, elem_name) + } + names(data) <- elem_names + } return(data) } @@ -69,6 +116,7 @@ dialoguer.find_connection <- function() { ) dialoguer.send(conn, dialoguer.UUID) + dialoguer.sub_send(conn, TRUE) uuid_chk <- dialoguer.recv(conn) connected <- (dialoguer.UUID == uuid_chk) if (!connected) { @@ -81,7 +129,7 @@ dialoguer.find_connection <- function() { dialoguer.import_variable <- function() { var_name <- dialoguer.recv(dialoguer.con, FALSE, "character") var_val <- get(var_name) - dialoguer.send(dialoguer.con, var_val, TRUE) + dialoguer.send(dialoguer.con, var_val, TRUE, TRUE, TRUE) } dialoguer.assign_variable <- function() { |