xref: /aosp_15_r20/external/libwebsockets/plugin-standalone/protocol_example_standalone.c (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker  * ws protocol handler plugin for "dumb increment"
3*1c60b9acSAndroid Build Coastguard Worker  *
4*1c60b9acSAndroid Build Coastguard Worker  * Written in 2010-2019 by Andy Green <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker  *
6*1c60b9acSAndroid Build Coastguard Worker  * This file is made available under the Creative Commons CC0 1.0
7*1c60b9acSAndroid Build Coastguard Worker  * Universal Public Domain Dedication.
8*1c60b9acSAndroid Build Coastguard Worker  *
9*1c60b9acSAndroid Build Coastguard Worker  * The person who associated a work with this deed has dedicated
10*1c60b9acSAndroid Build Coastguard Worker  * the work to the public domain by waiving all of his or her rights
11*1c60b9acSAndroid Build Coastguard Worker  * to the work worldwide under copyright law, including all related
12*1c60b9acSAndroid Build Coastguard Worker  * and neighboring rights, to the extent allowed by law. You can copy,
13*1c60b9acSAndroid Build Coastguard Worker  * modify, distribute and perform the work, even for commercial purposes,
14*1c60b9acSAndroid Build Coastguard Worker  * all without asking permission.
15*1c60b9acSAndroid Build Coastguard Worker  *
16*1c60b9acSAndroid Build Coastguard Worker  * These test plugins are intended to be adapted for use in your code, which
17*1c60b9acSAndroid Build Coastguard Worker  * may be proprietary.  So unlike the library itself, they are licensed
18*1c60b9acSAndroid Build Coastguard Worker  * Public Domain.
19*1c60b9acSAndroid Build Coastguard Worker  *
20*1c60b9acSAndroid Build Coastguard Worker  * This is a copy of dumb_increment adapted slightly to serve as the
21*1c60b9acSAndroid Build Coastguard Worker  * "example-standalone-protocol", to show how to build protocol plugins
22*1c60b9acSAndroid Build Coastguard Worker  * outside the library easily.
23*1c60b9acSAndroid Build Coastguard Worker  */
24*1c60b9acSAndroid Build Coastguard Worker 
25*1c60b9acSAndroid Build Coastguard Worker #if !defined (LWS_PLUGIN_STATIC)
26*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_DLL)
27*1c60b9acSAndroid Build Coastguard Worker #define LWS_DLL
28*1c60b9acSAndroid Build Coastguard Worker #endif
29*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_INTERNAL)
30*1c60b9acSAndroid Build Coastguard Worker #define LWS_INTERNAL
31*1c60b9acSAndroid Build Coastguard Worker #endif
32*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.h>
33*1c60b9acSAndroid Build Coastguard Worker #endif
34*1c60b9acSAndroid Build Coastguard Worker 
35*1c60b9acSAndroid Build Coastguard Worker #include <string.h>
36*1c60b9acSAndroid Build Coastguard Worker 
37*1c60b9acSAndroid Build Coastguard Worker struct per_vhost_data__dumb_increment {
38*1c60b9acSAndroid Build Coastguard Worker 	uv_timer_t timeout_watcher;
39*1c60b9acSAndroid Build Coastguard Worker 	struct lws_context *context;
40*1c60b9acSAndroid Build Coastguard Worker 	struct lws_vhost *vhost;
41*1c60b9acSAndroid Build Coastguard Worker 	const struct lws_protocols *protocol;
42*1c60b9acSAndroid Build Coastguard Worker };
43*1c60b9acSAndroid Build Coastguard Worker 
44*1c60b9acSAndroid Build Coastguard Worker struct per_session_data__dumb_increment {
45*1c60b9acSAndroid Build Coastguard Worker 	int number;
46*1c60b9acSAndroid Build Coastguard Worker };
47*1c60b9acSAndroid Build Coastguard Worker 
48*1c60b9acSAndroid Build Coastguard Worker static void
uv_timeout_cb_dumb_increment(uv_timer_t * w,int status)49*1c60b9acSAndroid Build Coastguard Worker uv_timeout_cb_dumb_increment(uv_timer_t *w
50*1c60b9acSAndroid Build Coastguard Worker #if UV_VERSION_MAJOR == 0
51*1c60b9acSAndroid Build Coastguard Worker 		, int status
52*1c60b9acSAndroid Build Coastguard Worker #endif
53*1c60b9acSAndroid Build Coastguard Worker )
54*1c60b9acSAndroid Build Coastguard Worker {
55*1c60b9acSAndroid Build Coastguard Worker 	struct per_vhost_data__dumb_increment *vhd = lws_container_of(w,
56*1c60b9acSAndroid Build Coastguard Worker 			struct per_vhost_data__dumb_increment, timeout_watcher);
57*1c60b9acSAndroid Build Coastguard Worker 	lws_callback_on_writable_all_protocol_vhost(vhd->vhost, vhd->protocol);
58*1c60b9acSAndroid Build Coastguard Worker }
59*1c60b9acSAndroid Build Coastguard Worker 
60*1c60b9acSAndroid Build Coastguard Worker static int
callback_dumb_increment(struct lws * wsi,enum lws_callback_reasons reason,void * user,void * in,size_t len)61*1c60b9acSAndroid Build Coastguard Worker callback_dumb_increment(struct lws *wsi, enum lws_callback_reasons reason,
62*1c60b9acSAndroid Build Coastguard Worker 			void *user, void *in, size_t len)
63*1c60b9acSAndroid Build Coastguard Worker {
64*1c60b9acSAndroid Build Coastguard Worker 	struct per_session_data__dumb_increment *pss =
65*1c60b9acSAndroid Build Coastguard Worker 			(struct per_session_data__dumb_increment *)user;
66*1c60b9acSAndroid Build Coastguard Worker 	struct per_vhost_data__dumb_increment *vhd =
67*1c60b9acSAndroid Build Coastguard Worker 			(struct per_vhost_data__dumb_increment *)
68*1c60b9acSAndroid Build Coastguard Worker 			lws_protocol_vh_priv_get(lws_get_vhost(wsi),
69*1c60b9acSAndroid Build Coastguard Worker 					lws_get_protocol(wsi));
70*1c60b9acSAndroid Build Coastguard Worker 	unsigned char buf[LWS_PRE + 512];
71*1c60b9acSAndroid Build Coastguard Worker 	unsigned char *p = &buf[LWS_PRE];
72*1c60b9acSAndroid Build Coastguard Worker 	int n, m;
73*1c60b9acSAndroid Build Coastguard Worker 
74*1c60b9acSAndroid Build Coastguard Worker 	switch (reason) {
75*1c60b9acSAndroid Build Coastguard Worker 	case LWS_CALLBACK_PROTOCOL_INIT:
76*1c60b9acSAndroid Build Coastguard Worker 		vhd = lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),
77*1c60b9acSAndroid Build Coastguard Worker 				lws_get_protocol(wsi),
78*1c60b9acSAndroid Build Coastguard Worker 				sizeof(struct per_vhost_data__dumb_increment));
79*1c60b9acSAndroid Build Coastguard Worker 		vhd->context = lws_get_context(wsi);
80*1c60b9acSAndroid Build Coastguard Worker 		vhd->protocol = lws_get_protocol(wsi);
81*1c60b9acSAndroid Build Coastguard Worker 		vhd->vhost = lws_get_vhost(wsi);
82*1c60b9acSAndroid Build Coastguard Worker 		uv_timer_init(lws_uv_getloop(vhd->context, 0),
83*1c60b9acSAndroid Build Coastguard Worker 			      &vhd->timeout_watcher);
84*1c60b9acSAndroid Build Coastguard Worker 		uv_timer_start(&vhd->timeout_watcher,
85*1c60b9acSAndroid Build Coastguard Worker 			       uv_timeout_cb_dumb_increment, 50, 50);
86*1c60b9acSAndroid Build Coastguard Worker 		break;
87*1c60b9acSAndroid Build Coastguard Worker 
88*1c60b9acSAndroid Build Coastguard Worker 	case LWS_CALLBACK_PROTOCOL_DESTROY:
89*1c60b9acSAndroid Build Coastguard Worker 		if (!vhd)
90*1c60b9acSAndroid Build Coastguard Worker 			break;
91*1c60b9acSAndroid Build Coastguard Worker 		uv_timer_stop(&vhd->timeout_watcher);
92*1c60b9acSAndroid Build Coastguard Worker 		break;
93*1c60b9acSAndroid Build Coastguard Worker 
94*1c60b9acSAndroid Build Coastguard Worker 	case LWS_CALLBACK_ESTABLISHED:
95*1c60b9acSAndroid Build Coastguard Worker 		pss->number = 0;
96*1c60b9acSAndroid Build Coastguard Worker 		break;
97*1c60b9acSAndroid Build Coastguard Worker 
98*1c60b9acSAndroid Build Coastguard Worker 	case LWS_CALLBACK_SERVER_WRITEABLE:
99*1c60b9acSAndroid Build Coastguard Worker 		n = sprintf((char *)p, "%d", pss->number++);
100*1c60b9acSAndroid Build Coastguard Worker 		m = lws_write(wsi, p, n, LWS_WRITE_TEXT);
101*1c60b9acSAndroid Build Coastguard Worker 		if (m < n) {
102*1c60b9acSAndroid Build Coastguard Worker 			lwsl_err("ERROR %d writing to di socket\n", n);
103*1c60b9acSAndroid Build Coastguard Worker 			return -1;
104*1c60b9acSAndroid Build Coastguard Worker 		}
105*1c60b9acSAndroid Build Coastguard Worker 		break;
106*1c60b9acSAndroid Build Coastguard Worker 
107*1c60b9acSAndroid Build Coastguard Worker 	case LWS_CALLBACK_RECEIVE:
108*1c60b9acSAndroid Build Coastguard Worker 		if (len < 6)
109*1c60b9acSAndroid Build Coastguard Worker 			break;
110*1c60b9acSAndroid Build Coastguard Worker 		if (strcmp((const char *)in, "reset\n") == 0)
111*1c60b9acSAndroid Build Coastguard Worker 			pss->number = 0;
112*1c60b9acSAndroid Build Coastguard Worker 		if (strcmp((const char *)in, "closeme\n") == 0) {
113*1c60b9acSAndroid Build Coastguard Worker 			lwsl_notice("dumb_inc: closing as requested\n");
114*1c60b9acSAndroid Build Coastguard Worker 			lws_close_reason(wsi, LWS_CLOSE_STATUS_GOINGAWAY,
115*1c60b9acSAndroid Build Coastguard Worker 					 (unsigned char *)"seeya", 5);
116*1c60b9acSAndroid Build Coastguard Worker 			return -1;
117*1c60b9acSAndroid Build Coastguard Worker 		}
118*1c60b9acSAndroid Build Coastguard Worker 		break;
119*1c60b9acSAndroid Build Coastguard Worker 
120*1c60b9acSAndroid Build Coastguard Worker 	default:
121*1c60b9acSAndroid Build Coastguard Worker 		break;
122*1c60b9acSAndroid Build Coastguard Worker 	}
123*1c60b9acSAndroid Build Coastguard Worker 
124*1c60b9acSAndroid Build Coastguard Worker 	return 0;
125*1c60b9acSAndroid Build Coastguard Worker }
126*1c60b9acSAndroid Build Coastguard Worker 
127*1c60b9acSAndroid Build Coastguard Worker static const struct lws_protocols protocols[] = {
128*1c60b9acSAndroid Build Coastguard Worker 	{
129*1c60b9acSAndroid Build Coastguard Worker 		"example-standalone-protocol",
130*1c60b9acSAndroid Build Coastguard Worker 		callback_dumb_increment,
131*1c60b9acSAndroid Build Coastguard Worker 		sizeof(struct per_session_data__dumb_increment),
132*1c60b9acSAndroid Build Coastguard Worker 		10, /* rx buf size must be >= permessage-deflate rx size */
133*1c60b9acSAndroid Build Coastguard Worker 	},
134*1c60b9acSAndroid Build Coastguard Worker };
135*1c60b9acSAndroid Build Coastguard Worker 
136*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE const lws_plugin_protocol_t protocol_example_standalone = {
137*1c60b9acSAndroid Build Coastguard Worker 	.hdr = {
138*1c60b9acSAndroid Build Coastguard Worker 		"standalone",
139*1c60b9acSAndroid Build Coastguard Worker 		"lws_protocol_plugin",
140*1c60b9acSAndroid Build Coastguard Worker 		LWS_BUILD_HASH,
141*1c60b9acSAndroid Build Coastguard Worker 		LWS_PLUGIN_API_MAGIC
142*1c60b9acSAndroid Build Coastguard Worker 	},
143*1c60b9acSAndroid Build Coastguard Worker 
144*1c60b9acSAndroid Build Coastguard Worker 	.protocols = protocols,
145*1c60b9acSAndroid Build Coastguard Worker 	.count_protocols = LWS_ARRAY_SIZE(protocols),
146*1c60b9acSAndroid Build Coastguard Worker 	.extensions = NULL,
147*1c60b9acSAndroid Build Coastguard Worker 	.count_extensions = 0,
148*1c60b9acSAndroid Build Coastguard Worker };
149