annotate flashii.c @ 0:aa723e3948a4 default tip

*: initial commit awesome
author Paper <paper@tflc.us>
date Tue, 09 Sep 2025 00:29:57 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
1 /*
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
2 * wcc -- a shitty sockchat client
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
3 *
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
4 * Copyright (c) 2025 Paper
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
5 *
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
7 * of this software and associated documentation files (the "Software"), to deal
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
8 * in the Software without restriction, including without limitation the rights
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
10 * copies of the Software, and to permit persons to whom the Software is
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
11 * furnished to do so, subject to the following conditions:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
12 *
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
13 * The above copyright notice and this permission notice shall be included in all
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
14 * copies or substantial portions of the Software.
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
15 *
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
22 * SOFTWARE.
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
23 */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
24
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
25 #include "flashii.h"
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
26
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
27 #include <libwebsockets.h>
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
28 #include <assert.h>
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
29
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
30 #define HEARTBEAT_SECONDS (30)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
31
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
32 /* internal linked list of messages to send */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
33 struct flashii_internal_msgbuf {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
34 struct flashii_internal_msgbuf *next;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
35
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
36 char msg[]; /* meat */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
37 };
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
38
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
39 struct flashii {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
40 struct lws_context *ctx;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
41 struct lws *lws;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
42
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
43 struct flashii_internal_msgbuf *msgbuf;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
44
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
45 flashii_msg_recv_spec msg_recv;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
46 flashii_user_recv_spec user_recv;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
47
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
48 /* user ID, retrieved after auth success */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
49 char *id;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
50 /* username */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
51 char *username;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
52 /* color */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
53 /* char *color; -- don't care */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
54
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
55 /* permissions
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
56 * odd, they can be separated by \f or ' ',
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
57 * so if we want to save them we'll have to write mempbrk */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
58
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
59 /* maybe save channel name too? */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
60
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
61 /* maximum message length in unicode characters */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
62 int32_t max_msg_length;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
63
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
64 time_t last_heartbeat;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
65 int need_heartbeat;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
66 };
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
67
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
68 static char *memduptostr(const char *in, size_t len)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
69 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
70 char *q = malloc(len + 1);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
71 if (!q)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
72 return NULL;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
73
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
74 memcpy(q, in, len);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
75 q[len] = 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
76
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
77 return q;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
78 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
79
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
80 /* converts a string-like thing to i64 */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
81 static int memtoi64(const char *mem, size_t len, int64_t *pr)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
82 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
83 size_t i;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
84 int64_t r;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
85 int neg;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
86
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
87 if (len <= 0)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
88 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
89
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
90 if (!(mem[0] == '-' || (mem[0] >= '0' && mem[0] <= '9')))
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
91 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
92
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
93 r = 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
94
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
95 neg = (mem[0] == '-');
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
96
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
97 for (i = (neg ? 1 : 0); i < len; i++) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
98 /* FIXME this does absolutely no checking for overflow etc */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
99 if (!(mem[i] >= '0' && mem[i] <= '9'))
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
100 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
101
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
102 r *= 10;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
103 r += (mem[i] - '0');
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
104 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
105
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
106 if (mem[0] == '-')
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
107 r = -r;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
108
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
109 *pr = r;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
110
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
111 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
112 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
113
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
114 /* converts a string-like thing to i32 */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
115 static int memtoi32(const char *mem, size_t len, int32_t *pr)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
116 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
117 int64_t r;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
118 if (memtoi64(mem, len, &r) < 0)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
119 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
120
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
121 if (r > INT32_MAX || r < INT32_MIN)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
122 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
123
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
124 *pr = r;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
125 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
126 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
127
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
128 /* converts a binary string to u32
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
129 *
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
130 * e.x.:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
131 * '10010' -> 0x09 */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
132 static int memtou32flags(const char *mem, size_t len, uint32_t *pflags)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
133 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
134 size_t i;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
135 uint32_t u;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
136
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
137 if (len >= 32)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
138 return -1; /* totally funtastic! */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
139
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
140 u = 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
141
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
142 for (i = 0; i < len; i++) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
143 switch (mem[i]) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
144 case '0':
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
145 break;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
146 case '1':
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
147 u |= (UINT32_C(1) << i);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
148 break;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
149 default:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
150 /* invalid input */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
151 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
152 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
153 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
154
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
155 *pflags = u;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
156
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
157 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
158 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
159
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
160 /* ------------------------------------------------------------------------ */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
161 /* packet receiving and parsing.
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
162 *
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
163 * packets are generally received as
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
164 * [type] (optional subtype) (data)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
165 * hence I've put together a simple filter thing to be able to handle
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
166 * types and subtypes without duplicating a shit ton of code */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
167
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
168 struct flashii_receive_packet_filter {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
169 const char *prefix;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
170 size_t len;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
171 int (*func)(struct flashii *fls, const char *in, size_t len);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
172 };
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
173
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
174 #define FLASHII_RECEIVE_PACKET_FILTER(prefix, func) \
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
175 { (prefix "\t"), sizeof(prefix), (func) }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
176
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
177 static int flashii_receive_packet_filter(struct flashii *fls, const char *in,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
178 size_t len, struct flashii_receive_packet_filter *filters)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
179 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
180 struct flashii_receive_packet_filter *f;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
181
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
182 for (f = filters; f->prefix; f++) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
183 if (f->len > len || memcmp(in, f->prefix, f->len))
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
184 continue; /* nope */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
185
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
186 return f->func(fls, in + f->len, len - f->len);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
187 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
188
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
189 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
190 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
191
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
192 /* ------------------------------------------------------------------------ */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
193 /* enumerate over parts of a packet
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
194 * note that whatever returned to the callback is not guaranteed to be
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
195 * NUL terminated; you should treat it simply as a memory buffer */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
196
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
197 /* XXX needs to take in delim */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
198 static int flashii_receive_packet_enum(struct flashii *fls, const char *in,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
199 size_t len,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
200 int (*cb)(struct flashii *fls,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
201 const char *in, size_t len, size_t index, void *userdata),
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
202 void *userdata)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
203 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
204 size_t index;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
205
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
206 for (index = 0; /* none */; index++) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
207 size_t ilen;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
208
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
209 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
210 const char *x;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
211 x = memchr(in, '\t', len);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
212 ilen = x ? (x - in) : len;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
213 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
214
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
215 //printf("%d: %.*s\n", (int)index, (int)ilen, in);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
216
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
217 if (cb(fls, in, ilen, index, userdata) < 0)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
218 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
219
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
220 /* hopefully this is right */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
221 if (ilen + 1 >= len)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
222 break;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
223
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
224 in = in + ilen + 1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
225 len -= ilen + 1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
226 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
227
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
228 return index;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
229 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
230
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
231 /* ------------------------------------------------------------------------ */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
232 /* 0: pong */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
233
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
234 static int flashii_receive_packet_pong(struct flashii *fls, const char *in,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
235 size_t len)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
236 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
237 /* nothing to do */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
238 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
239 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
240
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
241 /* ------------------------------------------------------------------------ */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
242 /* 1: auth */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
243
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
244 static int flashii_receive_auth_cb(struct flashii *fls, const char *in,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
245 size_t len, size_t index, void *userdata)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
246 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
247 switch (index) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
248 case 1:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
249 case 2:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
250 case 3:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
251 case 4:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
252 return 0; /* nothing */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
253 case 0:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
254 fls->id = memduptostr(in, len);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
255 /* user ID */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
256 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
257 case 5:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
258 if (memtoi32(in, len, &fls->max_msg_length) < 0)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
259 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
260
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
261 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
262 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
263
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
264 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
265
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
266 (void)userdata;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
267 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
268
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
269 static int flashii_receive_packet_auth_success(struct flashii *fls,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
270 const char *in, size_t len)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
271 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
272 return (flashii_receive_packet_enum(fls, in, len, flashii_receive_auth_cb, NULL) != 5) ? -1 : 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
273 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
274
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
275 static int flashii_receive_packet_auth(struct flashii *fls, const char *in,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
276 size_t len)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
277 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
278 struct flashii_receive_packet_filter f[] = {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
279 FLASHII_RECEIVE_PACKET_FILTER("y", flashii_receive_packet_auth_success),
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
280 /* FLASHII_RECEIVE_PACKET_FILTER("n", flashii_receive_packet_auth_failure), */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
281 /* FLASHII_RECEIVE_PACKET_FILTER("#", flashii_receive_packet_user_add), */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
282 /* terminate */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
283 { 0 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
284 };
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
285
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
286 return flashii_receive_packet_filter(fls, in, len, f);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
287 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
288
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
289 /* ------------------------------------------------------------------------ */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
290 /* 2: message add */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
291
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
292 static int flashii_receive_packet_msg_cb(struct flashii *fls, const char *in,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
293 size_t len, size_t index, void *userdata)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
294 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
295 struct flashii_msg *msg = userdata;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
296
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
297 switch (index) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
298 case 0:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
299 /* UNIX timestamp */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
300 if (memtoi64(in, len, &msg->timestamp) < 0)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
301 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
302 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
303 case 1:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
304 msg->id = memduptostr(in, len);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
305 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
306 case 2:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
307 msg->body = memduptostr(in, len);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
308 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
309 case 3:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
310 msg->msg_id = memduptostr(in, len);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
311 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
312 case 4:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
313 if (memtou32flags(in, len, &msg->flags) < 0)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
314 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
315 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
316 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
317
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
318 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
319 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
320
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
321 static int flashii_receive_packet_msg(struct flashii *fls, const char *in,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
322 size_t len)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
323 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
324 struct flashii_msg msg;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
325
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
326 if (flashii_receive_packet_enum(fls, in, len, flashii_receive_packet_msg_cb, &msg) != 4)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
327 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
328
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
329 fls->msg_recv(fls, &msg);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
330 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
331 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
332
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
333 /* ------------------------------------------------------------------------ */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
334 /* 7: context */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
335
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
336 static int flashii_receive_packet_context_user_list_cb(struct flashii *fls,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
337 const char *in, size_t len, size_t index, void *userdata)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
338 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
339 struct flashii_user *user = userdata;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
340
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
341 if (!index)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
342 return 0; /* ignored */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
343
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
344 switch ((index - 1) % 5) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
345 case 0:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
346 /* user ID */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
347 user->id = memduptostr(in, len);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
348 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
349 case 1:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
350 /* user name */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
351 user->name = memduptostr(in, len);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
352 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
353 case 2:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
354 /* color */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
355 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
356 case 3:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
357 /* perms */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
358 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
359 case 4:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
360 /* visiblility */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
361 if (memtoi32(in, len, &user->visible) < 0)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
362 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
363 fls->user_recv(fls, user);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
364 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
365 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
366
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
367 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
368 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
369
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
370 static int flashii_receive_packet_context_user_list(struct flashii *fls,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
371 const char *in, size_t len)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
372 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
373 struct flashii_user user;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
374
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
375 if (flashii_receive_packet_enum(fls, in, len, flashii_receive_packet_context_user_list_cb, &user) < 0)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
376 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
377
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
378 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
379 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
380
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
381 static int flashii_receive_packet_context_msg_add_cb(struct flashii *fls,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
382 const char *in, size_t len, size_t index, void *userdata)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
383 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
384 struct flashii_msg *msg = userdata;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
385
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
386 switch (index) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
387 case 0:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
388 /* UNIX timestamp */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
389 if (memtoi64(in, len, &msg->timestamp) < 0)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
390 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
391 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
392 case 1:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
393 msg->id = memduptostr(in, len);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
394 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
395 case 2:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
396 /* "user name" wtf */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
397 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
398 case 3:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
399 /* color */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
400 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
401 case 4:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
402 /* user permissions */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
403 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
404 case 5:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
405 msg->body = memduptostr(in, len);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
406 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
407 case 6:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
408 msg->msg_id = memduptostr(in, len);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
409 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
410 case 7:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
411 /* notifications */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
412 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
413 case 8:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
414 #if 0
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
415 if (memtou32flags(in, len, &msg->flags) < 0)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
416 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
417 #endif
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
418 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
419 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
420
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
421 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
422 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
423
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
424 static int flashii_receive_packet_context_message_add(struct flashii *fls,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
425 const char *in, size_t len)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
426 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
427 struct flashii_msg msg;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
428
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
429 if (flashii_receive_packet_enum(fls, in, len, flashii_receive_packet_context_msg_add_cb, &msg) < 0)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
430 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
431
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
432 fls->msg_recv(fls, &msg);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
433 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
434 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
435
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
436 static int flashii_receive_packet_context(struct flashii *fls, const char *in,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
437 size_t len)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
438 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
439 struct flashii_receive_packet_filter f[] = {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
440 FLASHII_RECEIVE_PACKET_FILTER("0", flashii_receive_packet_context_user_list),
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
441 FLASHII_RECEIVE_PACKET_FILTER("1", flashii_receive_packet_context_message_add),
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
442 /* FLASHII_RECEIVE_PACKET_FILTER("2", ...), */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
443 /* terminate */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
444 { 0 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
445 };
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
446
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
447 return flashii_receive_packet_filter(fls, in, len, f);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
448 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
449
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
450 /* ------------------------------------------------------------------------ */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
451
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
452 static int flashii_receive_packet(struct flashii *fls, const char *in,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
453 size_t len)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
454 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
455 struct flashii_receive_packet_filter f[] = {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
456 FLASHII_RECEIVE_PACKET_FILTER("0", flashii_receive_packet_pong),
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
457 FLASHII_RECEIVE_PACKET_FILTER("1", flashii_receive_packet_auth),
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
458 FLASHII_RECEIVE_PACKET_FILTER("2", flashii_receive_packet_msg),
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
459 FLASHII_RECEIVE_PACKET_FILTER("7", flashii_receive_packet_context),
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
460 /* terminate */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
461 { 0 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
462 };
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
463
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
464 return flashii_receive_packet_filter(fls, in, len, f);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
465 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
466
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
467 /* ------------------------------------------------------------------------ */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
468
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
469 static int flashii_send_vpacket(struct flashii *fls, const char *fmt, va_list ap)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
470 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
471 /* this uses vsnprintf to assemble the packet and sends it off */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
472 int r;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
473 char *s;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
474 va_list ap2;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
475
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
476 va_copy(ap2, ap);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
477
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
478 r = vsnprintf(NULL, 0, fmt, ap);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
479
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
480 if (r < 0) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
481 va_end(ap2);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
482 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
483 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
484
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
485 s = malloc(LWS_PRE + r + 1);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
486 if (!s) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
487 va_end(ap2);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
488 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
489 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
490
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
491 r = vsnprintf(s + LWS_PRE, r + 1, fmt, ap2);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
492
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
493 va_end(ap2);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
494
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
495 if (r < 0)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
496 return -1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
497
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
498 lws_write(fls->lws, s + LWS_PRE, r, LWS_WRITE_TEXT);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
499 free(s);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
500
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
501 return 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
502 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
503
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
504 static int flashii_send_packet(struct flashii *fls, const char *fmt, ...)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
505 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
506 va_list ap;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
507 int r;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
508
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
509 va_start(ap, fmt);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
510 r = flashii_send_vpacket(fls, fmt, ap);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
511 va_end(ap);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
512
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
513 return r;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
514 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
515
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
516 static int flashii_send_ping(struct flashii *fls, const char *id)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
517 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
518 assert(id);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
519 return flashii_send_packet(fls, "0\t%s", id);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
520 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
521
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
522 static int flashii_send_auth(struct flashii *fls, const char *scheme, const char *args)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
523 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
524 assert(scheme);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
525 assert(args);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
526 return flashii_send_packet(fls, "1\t%s\t%s", scheme, args);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
527 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
528
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
529 static int flashii_send_msg(struct flashii *fls, const char *id, const char *msg)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
530 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
531 assert(id);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
532 assert(msg);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
533 return flashii_send_packet(fls, "2\t%s\t%s", id, msg);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
534 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
535
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
536 static int flashii_process_msgbuf(struct flashii *fls)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
537 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
538 while (fls->msgbuf) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
539 struct flashii_internal_msgbuf *tmp;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
540
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
541 tmp = fls->msgbuf;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
542 flashii_send_msg(fls, fls->id, tmp->msg);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
543 fls->msgbuf = tmp->next;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
544 free(tmp);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
545 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
546 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
547
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
548 /* libwebsockets calls us back here */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
549 static int flashii_cb(struct lws *wsi, enum lws_callback_reasons reason,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
550 void *userdata, void *in, size_t len)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
551 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
552 struct flashii *fls = (struct flashii *)userdata;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
553 static const unsigned char token[] = {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
554 #embed "token.txt"
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
555 , 0
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
556 };
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
557
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
558 switch (reason) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
559 case LWS_CALLBACK_CLIENT_ESTABLISHED:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
560 lws_callback_on_writable(wsi);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
561 break;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
562 case LWS_CALLBACK_CLIENT_RECEIVE:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
563 /* incoming message -- print it out
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
564 * we should handle it based on the type */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
565 flashii_receive_packet(fls, in, len);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
566 break;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
567 case LWS_CALLBACK_CLIENT_WRITEABLE:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
568 if (fls->need_heartbeat) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
569 flashii_send_ping(fls, fls->id);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
570 fls->need_heartbeat = 0;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
571 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
572
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
573 /* process the buffer of messages, if any */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
574 flashii_process_msgbuf(fls);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
575
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
576 flashii_send_auth(fls, "Misuzu", token);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
577 /* send message here using lws_write */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
578 break;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
579 case LWS_CALLBACK_CLIENT_CLOSED:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
580 case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
581 break;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
582 #if 0
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
583 default:
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
584 printf("UNKNOWN REASON: %d\n", reason);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
585 break;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
586 #endif
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
587 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
588
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
589 return lws_callback_http_dummy(wsi, reason, userdata, in, len);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
590 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
591
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
592 static const struct lws_protocols protocols[] = {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
593 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
594 "sockchat",
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
595 flashii_cb,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
596 sizeof(struct flashii),
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
597 0,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
598 },
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
599 { 0 } /* terminator */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
600 };
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
601
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
602 /* ------------------------------------------------------------------------ */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
603
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
604 struct flashii *flashii_init(const char *protocol, const char *address,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
605 uint16_t port, flashii_msg_recv_spec msg_recv,
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
606 flashii_user_recv_spec user_recv)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
607 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
608 struct lws_context_creation_info info;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
609 struct lws_client_connect_info ccinfo;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
610 struct flashii *fls;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
611
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
612 fls = calloc(1, sizeof(*fls));
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
613 if (!fls)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
614 return NULL;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
615
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
616 fls->msg_recv = msg_recv;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
617 fls->user_recv = user_recv;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
618
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
619 lws_context_info_defaults(&info, NULL);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
620 info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
621 info.port = CONTEXT_PORT_NO_LISTEN; /* we do not run any server */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
622 info.protocols = protocols;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
623
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
624 fls->ctx = lws_create_context(&info);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
625 if (!fls->ctx) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
626 lwsl_err("lws init failed\n");
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
627 free(fls);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
628 return NULL;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
629 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
630
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
631 /* konekuto */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
632 memset(&ccinfo, 0, sizeof(ccinfo));
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
633
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
634 ccinfo.context = fls->ctx;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
635 ccinfo.address = address;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
636 ccinfo.port = port;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
637 ccinfo.path = "/";
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
638 ccinfo.host = address;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
639 ccinfo.origin = address;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
640 ccinfo.protocol = "sockchat";
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
641 ccinfo.ssl_connection = LCCSCF_USE_SSL;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
642 ccinfo.userdata = fls;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
643
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
644 fls->lws = lws_client_connect_via_info(&ccinfo);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
645 if (!fls->lws) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
646 lwsl_cx_err(fls->ctx, "lws connect failed\n");
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
647 lws_context_destroy(fls->ctx);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
648 free(fls);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
649 return NULL;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
650 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
651
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
652 return fls;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
653 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
654
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
655 /* worker
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
656 *
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
657 * this should be called in an event loop, on the same thread that
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
658 * initialized the structure.
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
659 *
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
660 * `noblock` is a boolean saying... whether we should block :) */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
661 void flashii_work(struct flashii *fls, int noblock)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
662 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
663 time_t thetime;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
664
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
665 time(&thetime);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
666
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
667 if (fls->id) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
668 if (difftime(thetime, fls->last_heartbeat) >= 30.0) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
669 fls->need_heartbeat = 1;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
670 fls->last_heartbeat = thetime;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
671 lws_callback_on_writable(fls->lws);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
672 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
673 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
674
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
675 lws_service(fls->ctx, (noblock) ? -1 : 0);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
676 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
677
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
678 int flashii_send_message(struct flashii *fls, const char *msg)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
679 {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
680 /* append to the internal linked list of messages */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
681 size_t len = strlen(msg);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
682
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
683 struct flashii_internal_msgbuf *msgbuf = malloc(sizeof(*msgbuf) + len + 1);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
684 if (!msgbuf)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
685 return -1; /* WHAT */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
686
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
687 msgbuf->next = NULL;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
688
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
689 /* copy it allll in (includes NUL terminator) */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
690 memcpy(msgbuf->msg, msg, len + 1);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
691
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
692 if (fls->msgbuf) {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
693 struct flashii_internal_msgbuf *tail = fls->msgbuf;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
694 while (tail->next)
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
695 tail = tail->next;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
696 tail->next = msgbuf;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
697 } else {
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
698 fls->msgbuf = msgbuf;
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
699 }
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
700
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
701 lws_callback_on_writable(fls->lws);
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
702
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
703 return 0; /* yay */
aa723e3948a4 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
704 }