From 138325b91d0d427410a06d477d3506f48798db2b Mon Sep 17 00:00:00 2001 From: Trumeet Date: Fri, 22 Jul 2022 19:15:48 -0700 Subject: feat(libacron): more customized ac_connection_parameters API:CHANGE Signed-off-by: Trumeet --- client/libacron/CMakeLists.txt | 2 +- client/libacron/README.md | 6 ++- client/libacron/acronc/main.c | 6 ++- client/libacron/include/net.h | 11 +++--- client/libacron/net.c | 73 +++++++++++++++++++++++++++++++----- client/libacron/private/connection.h | 1 + 6 files changed, 80 insertions(+), 19 deletions(-) diff --git a/client/libacron/CMakeLists.txt b/client/libacron/CMakeLists.txt index d683416..f3d6c27 100644 --- a/client/libacron/CMakeLists.txt +++ b/client/libacron/CMakeLists.txt @@ -80,7 +80,7 @@ if(WIN32) endif() find_package(json-c CONFIG) -set(LIBAC_DEPS ${LIBAC_DEPS} json-c::json-c) +set(LIBAC_DEPS ${LIBAC_DEPS} json-c::json-c m) target_include_directories(ac PUBLIC ${LIBAC_INCLUDES}) target_link_libraries(ac ${LIBAC_DEPS}) diff --git a/client/libacron/README.md b/client/libacron/README.md index 240d671..e5ed81b 100644 --- a/client/libacron/README.md +++ b/client/libacron/README.md @@ -168,7 +168,11 @@ Every thread can have multiple connections simultaneously. void *connection = NULL; int r; ac_connection_parameters_t args = { - .url = "ws://localhost:25575/ws?id=1&token=123" + .host = "127.0.0.1", + .port = 25575, + .version = 0, + .id = "1", + .token = "123" }; if ((r = ac_connect(args, &connection))) { return r; diff --git a/client/libacron/acronc/main.c b/client/libacron/acronc/main.c index 21958fd..ff19f39 100644 --- a/client/libacron/acronc/main.c +++ b/client/libacron/acronc/main.c @@ -148,7 +148,11 @@ int main(int argc, char **argv) { if ((r = ac_init(&config))) return r; void *connection; ac_connection_parameters_t parameters = { - .url = "ws://localhost:25575/ws?id=1&token=123" + .host = "localhost", + .port = 25575, + .id = "1", + .token = "123", + .version = 0 }; if ((r = ac_connect(parameters, &connection))) { ac_free(); diff --git a/client/libacron/include/net.h b/client/libacron/include/net.h index 6d8d9e7..398450d 100644 --- a/client/libacron/include/net.h +++ b/client/libacron/include/net.h @@ -13,12 +13,11 @@ /* Connection */ typedef struct ac_connection_parameters { - /** - * ws://host:port/ws?id=id&token=token - * Currently wss is not supported. - * Port must be supplied, or libac will connect to port zero. - */ - char *url; + char *host; + uint16_t port; + unsigned int version; + char *id; + char *token; } ac_connection_parameters_t; /** diff --git a/client/libacron/net.c b/client/libacron/net.c index a0e8659..aeff5e8 100644 --- a/client/libacron/net.c +++ b/client/libacron/net.c @@ -18,6 +18,7 @@ #include #include #include +#include #ifdef WIN32 #include @@ -28,6 +29,14 @@ #include #endif +static void conn_free(struct ac_connection *conn) { + if (conn->url) free(conn->url); + if (conn->parameters.id) free(conn->parameters.id); + if (conn->parameters.host) free(conn->parameters.host); + if (conn->parameters.token) free(conn->parameters.token); + free(conn); +} + static void on_open_handler(struct wic_inst *inst) { struct ac_connection *conn = wic_get_app(inst); conn->established = true; @@ -112,12 +121,56 @@ static bool on_message_handler(struct wic_inst *inst, int ac_connect(ac_connection_parameters_t parameters, void **out) { AC_CHECK_INIT; + + if (!parameters.id || + !parameters.host || + !parameters.token) { + LOGE("Required parameters are missing."); + return AC_E_INVALID_REQUEST; + } + struct ac_connection *conn; int r; if ((r = SALLOC(struct ac_connection, &conn))) { return r; } - memcpy(&conn->parameters, ¶meters, sizeof(ac_connection_parameters_t)); + /* Do not use memcpy() here because we want to keep track of copied and not-copied strings. */ + conn->parameters.port = parameters.port; + if ((r = strdup2(parameters.token, &conn->parameters.token)) || + (r = strdup2(parameters.host, &conn->parameters.host)) || + (r = strdup2(parameters.id, &conn->parameters.id))) { + conn_free(conn); + return r; + } + + if ((r = alloc(NULL, + 5 /* ws:// */ + + strlen(parameters.host) + + 1 /* : */ + + /* Without the () the result seems to be strange. */ + (parameters.port ? ((int) floor(log10(parameters.port)) + 1) : 1) + + 3 /* /ws */ + + 4 /* ?id= */ + + strlen(parameters.id) + + 7 /* &token = */ + + strlen(parameters.token) + + 9 /* &version= */ + + /* Without the () the result seems to be strange. */ + (parameters.version ? ((int) floor(log10(parameters.version)) + 1) : 1) + + 1 /* NULL */, + sizeof(char), + false, + (void **) &conn->url))) { + conn_free(conn); + return r; + } + sprintf(conn->url, "ws://%s:%u/ws?id=%s&token=%s&version=%u", + parameters.host, + parameters.port, + parameters.id, + parameters.token, + parameters.version); + static uint8_t rx[1000]; struct wic_inst *inst = &conn->inst; struct wic_init_arg arg = {0}; @@ -131,12 +184,12 @@ int ac_connect(ac_connection_parameters_t parameters, void **out) { arg.on_buffer = on_buffer_handler; arg.app = conn; - arg.url = parameters.url; + arg.url = conn->url; arg.role = WIC_ROLE_CLIENT; if (!wic_init(inst, &arg)) { LOGE("wic_init"); - free(conn); + conn_free(conn); return AC_E_INTERNAL; } @@ -153,11 +206,11 @@ int ac_connect(ac_connection_parameters_t parameters, void **out) { break; case WIC_SCHEMA_WSS: LOGE("WSS is not supported yet."); - free(conn); + conn_free(conn); return AC_E_INVALID_REQUEST; default: LOGE("Unsupported protocol. The URL must be ws://"); - free(conn); + conn_free(conn); return AC_E_INVALID_REQUEST; } @@ -169,7 +222,7 @@ int ac_connect(ac_connection_parameters_t parameters, void **out) { LOGEV("Resolve host: %s.", gai_strerror(r)); #endif r = AC_E_NET; - free(conn); + conn_free(conn); return r; } @@ -180,7 +233,7 @@ int ac_connect(ac_connection_parameters_t parameters, void **out) { strerror2(e), e); freeaddrinfo(res); - free(conn); + conn_free(conn); return AC_E_NET; } if (connect(fd, res->ai_addr, res->ai_addrlen) < 0) { @@ -196,7 +249,7 @@ int ac_connect(ac_connection_parameters_t parameters, void **out) { #endif closesocket(fd); freeaddrinfo(res); - free(conn); + conn_free(conn); return AC_E_NET; } freeaddrinfo(res); @@ -205,7 +258,7 @@ int ac_connect(ac_connection_parameters_t parameters, void **out) { if (wic_start(inst) != WIC_STATUS_SUCCESS) { LOGE("Cannot start the WIC client."); closesocket(fd); - free(conn); + conn_free(conn); return AC_E_NET; } @@ -236,7 +289,7 @@ int ac_disconnect(void *connection) { LOGD("Disconnecting..."); wic_close(&conn->inst); closesocket(conn->fd); - free(conn); + conn_free(conn); return AC_E_OK; } diff --git a/client/libacron/private/connection.h b/client/libacron/private/connection.h index 04d7639..a76fada 100644 --- a/client/libacron/private/connection.h +++ b/client/libacron/private/connection.h @@ -29,6 +29,7 @@ struct ac_result { struct ac_connection { ac_connection_parameters_t parameters; struct wic_inst inst; + char *url; SOCKET fd; bool established; /* Result from message handler. -- cgit v1.2.3