mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-27 04:35:34 +08:00
208 lines
5.3 KiB
C
208 lines
5.3 KiB
C
/**
|
|
* Copyright (c) 2020 Paul-Louis Ageneau
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
*/
|
|
|
|
#include "juice.h"
|
|
#include "addr.h"
|
|
#include "agent.h"
|
|
#include "ice.h"
|
|
|
|
#ifndef NO_SERVER
|
|
#include "server.h"
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
|
|
JUICE_EXPORT juice_agent_t *juice_create(const juice_config_t *config) {
|
|
if (!config)
|
|
return NULL;
|
|
|
|
return agent_create(config);
|
|
}
|
|
|
|
JUICE_EXPORT void juice_destroy(juice_agent_t *agent) {
|
|
if (agent)
|
|
agent_destroy(agent);
|
|
}
|
|
|
|
JUICE_EXPORT int juice_gather_candidates(juice_agent_t *agent) {
|
|
if (!agent)
|
|
return JUICE_ERR_INVALID;
|
|
|
|
if (agent_gather_candidates(agent) < 0)
|
|
return JUICE_ERR_FAILED;
|
|
|
|
return JUICE_ERR_SUCCESS;
|
|
}
|
|
|
|
JUICE_EXPORT int juice_get_local_description(juice_agent_t *agent, char *buffer, size_t size) {
|
|
if (!agent || (!buffer && size))
|
|
return JUICE_ERR_INVALID;
|
|
|
|
if (agent_get_local_description(agent, buffer, size) < 0)
|
|
return JUICE_ERR_FAILED;
|
|
|
|
return JUICE_ERR_SUCCESS;
|
|
}
|
|
|
|
JUICE_EXPORT int juice_set_remote_description(juice_agent_t *agent, const char *sdp) {
|
|
if (!agent || !sdp)
|
|
return JUICE_ERR_INVALID;
|
|
|
|
if (agent_set_remote_description(agent, sdp) < 0)
|
|
return JUICE_ERR_FAILED;
|
|
|
|
return JUICE_ERR_SUCCESS;
|
|
}
|
|
|
|
JUICE_EXPORT int juice_add_remote_candidate(juice_agent_t *agent, const char *sdp) {
|
|
if (!agent || !sdp)
|
|
return JUICE_ERR_INVALID;
|
|
|
|
if (agent_add_remote_candidate(agent, sdp) < 0)
|
|
return JUICE_ERR_FAILED;
|
|
|
|
return JUICE_ERR_SUCCESS;
|
|
}
|
|
|
|
JUICE_EXPORT int juice_set_remote_gathering_done(juice_agent_t *agent) {
|
|
if (!agent)
|
|
return JUICE_ERR_INVALID;
|
|
|
|
if (agent_set_remote_gathering_done(agent) < 0)
|
|
return JUICE_ERR_FAILED;
|
|
|
|
return JUICE_ERR_SUCCESS;
|
|
}
|
|
|
|
JUICE_EXPORT int juice_send(juice_agent_t *agent, const char *data, size_t size) {
|
|
if (!agent || (!data && size))
|
|
return JUICE_ERR_INVALID;
|
|
|
|
if (agent_send(agent, data, size, 0) < 0)
|
|
return JUICE_ERR_FAILED;
|
|
|
|
return JUICE_ERR_SUCCESS;
|
|
}
|
|
|
|
JUICE_EXPORT int juice_send_diffserv(juice_agent_t *agent, const char *data, size_t size, int ds) {
|
|
if (!agent || (!data && size))
|
|
return JUICE_ERR_INVALID;
|
|
|
|
if (agent_send(agent, data, size, ds) < 0)
|
|
return JUICE_ERR_FAILED;
|
|
|
|
return JUICE_ERR_SUCCESS;
|
|
}
|
|
|
|
JUICE_EXPORT juice_state_t juice_get_state(juice_agent_t *agent) { return agent_get_state(agent); }
|
|
|
|
JUICE_EXPORT int juice_get_selected_candidates(juice_agent_t *agent, char *local, size_t local_size,
|
|
char *remote, size_t remote_size) {
|
|
if (!agent || (!local && local_size) || (!remote && remote_size))
|
|
return JUICE_ERR_INVALID;
|
|
|
|
ice_candidate_t local_cand, remote_cand;
|
|
if (agent_get_selected_candidate_pair(agent, &local_cand, &remote_cand))
|
|
return JUICE_ERR_NOT_AVAIL;
|
|
|
|
if (local_size && ice_generate_candidate_sdp(&local_cand, local, local_size) < 0)
|
|
return JUICE_ERR_FAILED;
|
|
|
|
if (remote_size && ice_generate_candidate_sdp(&remote_cand, remote, remote_size) < 0)
|
|
return JUICE_ERR_FAILED;
|
|
|
|
return JUICE_ERR_SUCCESS;
|
|
}
|
|
|
|
JUICE_EXPORT int juice_get_selected_addresses(juice_agent_t *agent, char *local, size_t local_size,
|
|
char *remote, size_t remote_size) {
|
|
if (!agent || (!local && local_size) || (!remote && remote_size))
|
|
return JUICE_ERR_INVALID;
|
|
|
|
ice_candidate_t local_cand, remote_cand;
|
|
if (agent_get_selected_candidate_pair(agent, &local_cand, &remote_cand))
|
|
return JUICE_ERR_NOT_AVAIL;
|
|
|
|
if (local_size && addr_record_to_string(&local_cand.resolved, local, local_size) < 0)
|
|
return JUICE_ERR_FAILED;
|
|
|
|
if (remote_size && addr_record_to_string(&remote_cand.resolved, remote, remote_size) < 0)
|
|
return JUICE_ERR_FAILED;
|
|
|
|
return JUICE_ERR_SUCCESS;
|
|
}
|
|
|
|
JUICE_EXPORT const char *juice_state_to_string(juice_state_t state) {
|
|
switch (state) {
|
|
case JUICE_STATE_DISCONNECTED:
|
|
return "disconnected";
|
|
case JUICE_STATE_GATHERING:
|
|
return "gathering";
|
|
case JUICE_STATE_CONNECTING:
|
|
return "connecting";
|
|
case JUICE_STATE_CONNECTED:
|
|
return "connected";
|
|
case JUICE_STATE_COMPLETED:
|
|
return "completed";
|
|
case JUICE_STATE_FAILED:
|
|
return "failed";
|
|
default:
|
|
return "unknown";
|
|
}
|
|
}
|
|
|
|
JUICE_EXPORT juice_server_t *juice_server_create(const juice_server_config_t *config) {
|
|
#ifndef NO_SERVER
|
|
if (!config)
|
|
return NULL;
|
|
|
|
return server_create(config);
|
|
#else
|
|
(void)config;
|
|
JLOG_FATAL("The library was compiled without server support");
|
|
return NULL;
|
|
#endif
|
|
}
|
|
|
|
JUICE_EXPORT void juice_server_destroy(juice_server_t *server) {
|
|
#ifndef NO_SERVER
|
|
if (server)
|
|
server_destroy(server);
|
|
#else
|
|
(void)server;
|
|
#endif
|
|
}
|
|
|
|
JUICE_EXPORT uint16_t juice_server_get_port(juice_server_t *server) {
|
|
#ifndef NO_SERVER
|
|
return server ? server_get_port(server) : 0;
|
|
#else
|
|
(void)server;
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
JUICE_EXPORT int juice_server_add_credentials(juice_server_t *server,
|
|
const juice_server_credentials_t *credentials,
|
|
unsigned long lifetime_ms) {
|
|
#ifndef NO_SERVER
|
|
if (!server || !credentials)
|
|
return JUICE_ERR_INVALID;
|
|
|
|
if (server_add_credentials(server, credentials, (timediff_t)lifetime_ms) < 0)
|
|
return JUICE_ERR_FAILED;
|
|
|
|
return JUICE_ERR_SUCCESS;
|
|
#else
|
|
(void)server;
|
|
(void)credentials;
|
|
(void)lifetime_ms;
|
|
return JUICE_ERR_INVALID;
|
|
#endif
|
|
}
|