1d4afb5ceSopenharmony_ci/*
2d4afb5ceSopenharmony_ci * lws-minimal-secure-streams-server
3d4afb5ceSopenharmony_ci *
4d4afb5ceSopenharmony_ci * Written in 2010-2020 by Andy Green <andy@warmcat.com>
5d4afb5ceSopenharmony_ci *
6d4afb5ceSopenharmony_ci * This file is made available under the Creative Commons CC0 1.0
7d4afb5ceSopenharmony_ci * Universal Public Domain Dedication.
8d4afb5ceSopenharmony_ci */
9d4afb5ceSopenharmony_ci
10d4afb5ceSopenharmony_ci#include <libwebsockets.h>
11d4afb5ceSopenharmony_ci#include <assert.h>
12d4afb5ceSopenharmony_ci
13d4afb5ceSopenharmony_ciextern int interrupted, bad;
14d4afb5ceSopenharmony_ci
15d4afb5ceSopenharmony_citypedef struct myss {
16d4afb5ceSopenharmony_ci	struct lws_ss_handle 		*ss;
17d4afb5ceSopenharmony_ci	void				*opaque_data;
18d4afb5ceSopenharmony_ci	/* ... application specific state ... */
19d4afb5ceSopenharmony_ci
20d4afb5ceSopenharmony_ci	lws_sorted_usec_list_t		sul;
21d4afb5ceSopenharmony_ci	int				count;
22d4afb5ceSopenharmony_ci	char				upgraded;
23d4afb5ceSopenharmony_ci
24d4afb5ceSopenharmony_ci} myss_srv_t;
25d4afb5ceSopenharmony_ci
26d4afb5ceSopenharmony_ci/*
27d4afb5ceSopenharmony_ci * This is the Secure Streams Server RX and TX
28d4afb5ceSopenharmony_ci */
29d4afb5ceSopenharmony_ci
30d4afb5ceSopenharmony_cistatic lws_ss_state_return_t
31d4afb5ceSopenharmony_cimyss_raw_rx(void *userobj, const uint8_t *buf, size_t len, int flags)
32d4afb5ceSopenharmony_ci{
33d4afb5ceSopenharmony_ci//	myss_srv_t *m = (myss_srv_t *)userobj;
34d4afb5ceSopenharmony_ci
35d4afb5ceSopenharmony_ci	lwsl_user("%s: len %d, flags: %d\n", __func__, (int)len, flags);
36d4afb5ceSopenharmony_ci	lwsl_hexdump_info(buf, len);
37d4afb5ceSopenharmony_ci
38d4afb5ceSopenharmony_ci	/*
39d4afb5ceSopenharmony_ci	 * If we received the whole message, for our example it means
40d4afb5ceSopenharmony_ci	 * we are done.
41d4afb5ceSopenharmony_ci	 */
42d4afb5ceSopenharmony_ci	if (flags & LWSSS_FLAG_EOM) {
43d4afb5ceSopenharmony_ci		bad = 0;
44d4afb5ceSopenharmony_ci		interrupted = 1;
45d4afb5ceSopenharmony_ci	}
46d4afb5ceSopenharmony_ci
47d4afb5ceSopenharmony_ci	return 0;
48d4afb5ceSopenharmony_ci}
49d4afb5ceSopenharmony_ci
50d4afb5ceSopenharmony_ci/* this is the callback that mediates sending the incrementing number */
51d4afb5ceSopenharmony_ci
52d4afb5ceSopenharmony_cistatic void
53d4afb5ceSopenharmony_cispam_sul_cb(struct lws_sorted_usec_list *sul)
54d4afb5ceSopenharmony_ci{
55d4afb5ceSopenharmony_ci	myss_srv_t *m = lws_container_of(sul, myss_srv_t, sul);
56d4afb5ceSopenharmony_ci
57d4afb5ceSopenharmony_ci	if (!lws_ss_request_tx(m->ss))
58d4afb5ceSopenharmony_ci		lws_sul_schedule(lws_ss_get_context(m->ss), 0, &m->sul, spam_sul_cb,
59d4afb5ceSopenharmony_ci			 100 * LWS_US_PER_MS);
60d4afb5ceSopenharmony_ci}
61d4afb5ceSopenharmony_ci
62d4afb5ceSopenharmony_cistatic lws_ss_state_return_t
63d4afb5ceSopenharmony_cimyss_raw_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len,
64d4afb5ceSopenharmony_ci	int *flags)
65d4afb5ceSopenharmony_ci{
66d4afb5ceSopenharmony_ci	myss_srv_t *m = (myss_srv_t *)userobj;
67d4afb5ceSopenharmony_ci
68d4afb5ceSopenharmony_ci	*flags = LWSSS_FLAG_SOM | LWSSS_FLAG_EOM;
69d4afb5ceSopenharmony_ci
70d4afb5ceSopenharmony_ci	*len = (unsigned int)lws_snprintf((char *)buf, *len, "hello from raw %d\n", m->count++);
71d4afb5ceSopenharmony_ci
72d4afb5ceSopenharmony_ci	lws_sul_schedule(lws_ss_get_context(m->ss), 0, &m->sul, spam_sul_cb,
73d4afb5ceSopenharmony_ci			 100 * LWS_US_PER_MS);
74d4afb5ceSopenharmony_ci
75d4afb5ceSopenharmony_ci	return 0;
76d4afb5ceSopenharmony_ci}
77d4afb5ceSopenharmony_ci
78d4afb5ceSopenharmony_cistatic lws_ss_state_return_t
79d4afb5ceSopenharmony_cimyss_raw_state(void *userobj, void *sh, lws_ss_constate_t state,
80d4afb5ceSopenharmony_ci	   lws_ss_tx_ordinal_t ack)
81d4afb5ceSopenharmony_ci{
82d4afb5ceSopenharmony_ci	myss_srv_t *m = (myss_srv_t *)userobj;
83d4afb5ceSopenharmony_ci
84d4afb5ceSopenharmony_ci	lwsl_user("%s: %p %s, ord 0x%x\n", __func__, m->ss,
85d4afb5ceSopenharmony_ci		  lws_ss_state_name((int)state), (unsigned int)ack);
86d4afb5ceSopenharmony_ci
87d4afb5ceSopenharmony_ci	switch (state) {
88d4afb5ceSopenharmony_ci	case LWSSSCS_DISCONNECTED:
89d4afb5ceSopenharmony_ci		lws_sul_cancel(&m->sul);
90d4afb5ceSopenharmony_ci		break;
91d4afb5ceSopenharmony_ci	case LWSSSCS_CONNECTED:
92d4afb5ceSopenharmony_ci		return lws_ss_request_tx(m->ss);
93d4afb5ceSopenharmony_ci
94d4afb5ceSopenharmony_ci	default:
95d4afb5ceSopenharmony_ci		break;
96d4afb5ceSopenharmony_ci	}
97d4afb5ceSopenharmony_ci
98d4afb5ceSopenharmony_ci	return 0;
99d4afb5ceSopenharmony_ci}
100d4afb5ceSopenharmony_ci
101d4afb5ceSopenharmony_ciconst lws_ss_info_t ssi_server = {
102d4afb5ceSopenharmony_ci	.handle_offset			= offsetof(myss_srv_t, ss),
103d4afb5ceSopenharmony_ci	.opaque_user_data_offset	= offsetof(myss_srv_t, opaque_data),
104d4afb5ceSopenharmony_ci	.streamtype			= "myrawserver",
105d4afb5ceSopenharmony_ci	.rx				= myss_raw_rx,
106d4afb5ceSopenharmony_ci	.tx				= myss_raw_tx,
107d4afb5ceSopenharmony_ci	.state				= myss_raw_state,
108d4afb5ceSopenharmony_ci	.user_alloc			= sizeof(myss_srv_t),
109d4afb5ceSopenharmony_ci};
110