aboutsummaryrefslogtreecommitdiff
path: root/dialoguer/dialoguer.r
diff options
context:
space:
mode:
Diffstat (limited to 'dialoguer/dialoguer.r')
-rw-r--r--dialoguer/dialoguer.r80
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() {