@@ -21,312 +21,16 @@ namespace ofxLibwebsockets {
2121 class Client ;
2222 class Server ;
2323
24- static string getCallbackReason ( int reason );
25- static void dump_handshake_info (struct lws_tokens *lwst);
26-
2724 // CLIENT CALLBACK
2825
29- static int lws_client_callback (struct libwebsocket_context * context, struct libwebsocket *ws, enum libwebsocket_callback_reasons reason, void *user, void *data, size_t len){
30- const struct libwebsocket_protocols * lws_protocol = (ws == NULL ? NULL : libwebsockets_get_protocol (ws));
31- int idx = lws_protocol? lws_protocol->protocol_index : 0 ;
32-
33- Connection* conn;
34-
35- Reactor* reactor = NULL ;
36- Protocol* protocol;
37-
38- for (int i=0 ; i<(int )reactors.size (); i++){
39- if (reactors[i]->getContext () == context){
40- reactor = reactors[i];
41- protocol = reactor->protocol (idx);
42- conn = ((Client*) reactor)->getConnection ();
43- if (conn){
44- conn->context = context;
45- }
46- break ;
47- } else {
48- }
49- }
50-
51- ofLog ( OF_LOG_VERBOSE, " [ofxLibwebsockets] " + getCallbackReason (reason) );
52-
53- if (reason == LWS_CALLBACK_CLIENT_ESTABLISHED ){
54- libwebsocket_callback_on_writable (context, ws);
55- } else if (reason == LWS_CALLBACK_CLOSED){
56- }
57-
58- switch (reason)
59- {
60- // cases we may use in the future
61- case LWS_CALLBACK_CONFIRM_EXTENSION_OKAY:
62- case LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED:
63- case LWS_CALLBACK_PROTOCOL_INIT: // this may be useful, says we're OK to allocate protocol data
64- case LWS_CALLBACK_WSI_CREATE:
65-
66- case LWS_CALLBACK_HTTP_BODY_COMPLETION:
67- case LWS_CALLBACK_HTTP_FILE_COMPLETION:
68- case LWS_CALLBACK_HTTP_WRITEABLE:
69-
70- case LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION:
71- return 0 ;
72-
73- // check if we allow this connection (default is always yes)
74- case LWS_CALLBACK_FILTER_HTTP_CONNECTION:
75- case LWS_CALLBACK_FILTER_NETWORK_CONNECTION:
76- if (protocol != NULL ){
77- return reactor->_allow (ws, protocol, (int )(long )user)? 0 : 1 ;
78- } else {
79- return 0 ;
80- }
81-
82- // need to serve up an HTTP file
83- case LWS_CALLBACK_HTTP:
84- if ( reactor != NULL ){
85- return reactor->_http (ws, (char *)data);
86- } else {
87- return 0 ;
88- }
89-
90- // we're not really worried about these at the moment
91- case LWS_CALLBACK_CLOSED_HTTP:
92- case LWS_CALLBACK_ADD_POLL_FD:
93- case LWS_CALLBACK_DEL_POLL_FD:
94- case LWS_CALLBACK_CHANGE_MODE_POLL_FD:
95- case LWS_CALLBACK_LOCK_POLL:
96- case LWS_CALLBACK_UNLOCK_POLL:
97- case LWS_CALLBACK_GET_THREAD_ID:
98- case LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH:
99- case LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER:
100- return 1 ;
101-
102- // catch-all for most important events:
103- // LWS_CALLBACK_CLIENT_CONNECTION_ERROR
104- // LWS_CALLBACK_CLIENT_ESTABLISHED
105- // LWS_CALLBACK_RECEIVE
106- // LWS_CALLBACK_CLIENT_RECEIVE
107- // LWS_CALLBACK_CLIENT_RECEIVE_PONG
108- // LWS_CALLBACK_CLIENT_WRITEABLE
109- default :
110- if ( reactor != NULL ){
111- // conn = *(Connection**)user;
112- if (conn && conn->ws != ws && ws != NULL ){
113- conn->ws = ws;
114- conn->context = context;
115- }
116- return reactor->_notify (conn, reason, (char *)data, len);
117- } else {
118- return 0 ;
119- }
120- }
121-
122- return 1 ; // FAIL (e.g. unhandled case/break in switch)
123- }
26+ extern int lws_client_callback (struct libwebsocket_context * context, struct libwebsocket *ws, enum libwebsocket_callback_reasons reason, void *user, void *data, size_t len);
12427
12528 // SERVER CALLBACK
12629
127- static int lws_callback (struct libwebsocket_context * context, struct libwebsocket *ws,
128- enum libwebsocket_callback_reasons reason, void *user, void *data, size_t len)
129- {
130- const struct libwebsocket_protocols * lws_protocol = (ws == NULL ? NULL : libwebsockets_get_protocol (ws));
131- int idx = lws_protocol? lws_protocol->protocol_index : 0 ;
132-
133- // valid connection w/o a protocol
134- if ( ws != NULL && lws_protocol == NULL ){
135- // OK for now, returning 0 above
136- }
137-
138- // bool bAllowAllProtocls = (ws != NULL ? lws_protocol == NULL : false);
139-
140- Connection* conn;
141- Connection** conn_ptr = (Connection**)user;
142- Server* reactor = NULL ;
143- Protocol* protocol = NULL ;
144-
145- for (int i=0 ; i<(int )reactors.size (); i++){
146- if (reactors[i]->getContext () == context){
147- reactor = (Server*) reactors[i];
148- protocol = reactor->protocol ( (idx > 0 ? idx : 0 ) );
149- break ;
150- } else {
151- }
152- }
153-
154- ofLog ( OF_LOG_VERBOSE, " [ofxLibwebsockets] " + getCallbackReason (reason) );
155-
156- if (reason == LWS_CALLBACK_ESTABLISHED){
157- // server completed handshake, need to ask for next "writable" callback
158- libwebsocket_callback_on_writable (context, ws);
159-
160- // now is when you can set the "user" data,
161- // which we use to instantiate / refer to the ofxLibwebsockets::Connection
162- if ( reactor != NULL ){
163- *conn_ptr = new Connection (reactor, protocol);
164- }
165- } else if (reason == LWS_CALLBACK_CLOSED){
166- // if (*conn_ptr != NULL)
167- // delete *conn_ptr;
168- }
30+ extern int lws_callback (struct libwebsocket_context * context, struct libwebsocket *ws,
31+ enum libwebsocket_callback_reasons reason, void *user, void *data, size_t len);
16932
170- switch (reason)
171- {
172- // we may use these in the future!
173- case LWS_CALLBACK_WSI_CREATE:
174- case LWS_CALLBACK_WSI_DESTROY:
175-
176- case LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION:
177-
178- case LWS_CALLBACK_HTTP_BODY_COMPLETION:
179- case LWS_CALLBACK_HTTP_FILE_COMPLETION:
180- case LWS_CALLBACK_HTTP_WRITEABLE:
181- case LWS_CALLBACK_CLOSED_HTTP:
182-
183- case LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED:
184-
185- case LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED:
186- case LWS_CALLBACK_FILTER_NETWORK_CONNECTION:
187- return 0 ;
188-
189- case LWS_CALLBACK_FILTER_HTTP_CONNECTION:
190- if (protocol != NULL ){
191- // return 0 == allow, 1 == block
192- return reactor->_allow (ws, protocol, (int )(long )data) ? 0 : 1 ;
193- } else {
194- return 0 ;
195- }
196-
197- case LWS_CALLBACK_PROTOCOL_INIT:
198- return 0 ;
199-
200- case LWS_CALLBACK_HTTP:
201- return reactor->_http (ws, (char *)data);
202-
203- // we're not really worried about this at the moment
204- case LWS_CALLBACK_ADD_POLL_FD:
205- case LWS_CALLBACK_DEL_POLL_FD:
206- case LWS_CALLBACK_LOCK_POLL:
207- case LWS_CALLBACK_UNLOCK_POLL:
208- case LWS_CALLBACK_CHANGE_MODE_POLL_FD:
209- case LWS_CALLBACK_PROTOCOL_DESTROY:
210- case LWS_CALLBACK_GET_THREAD_ID:
211- case LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH:
212- return 0 ;
213-
214- case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:
215- case LWS_CALLBACK_ESTABLISHED:
216- case LWS_CALLBACK_CLIENT_ESTABLISHED:
217- case LWS_CALLBACK_CLOSED:
218- case LWS_CALLBACK_SERVER_WRITEABLE:
219- case LWS_CALLBACK_CLIENT_WRITEABLE:
220- case LWS_CALLBACK_RECEIVE: // server receive
221- case LWS_CALLBACK_CLIENT_RECEIVE: // client receive
222- case LWS_CALLBACK_CLIENT_RECEIVE_PONG:
223- if ( user != NULL ){
224- conn = *(Connection**)user;
225- }
226- if (conn != NULL && (conn->ws != ws || conn->ws == NULL ) ){
227- conn->context = context;
228- conn->ws = ws;
229- conn->setupAddress ();
230- }
231- if (reactor){
232- return reactor->_notify (conn, reason, (char *)data, len);
233- } else {
234- return 0 ;
235- }
236-
237- default :
238- break ;
239- }
240-
241- return 0 ;
242- }
243-
244- static void dump_handshake_info (struct lws_tokens *lwst)
245- {
246- int n;
247- static const char *token_names[WSI_TOKEN_COUNT] = {
248- " GET URI" ,
249- " Host" ,
250- " Connection" ,
251- " key 1" ,
252- " key 2" ,
253- " Protocol" ,
254- " Upgrade" ,
255- " Origin" ,
256- " Draft" ,
257- " Challenge" ,
258-
259- /* new for 04 */
260- " Key" ,
261- " Version" ,
262- " Sworigin" ,
263-
264- /* new for 05 */
265- " Extensions" ,
266-
267- /* client receives these */
268- " Accept" ,
269- " Nonce" ,
270- " Http" ,
271- " MuxURL" ,
272- };
273-
274- for (n = 0 ; n < WSI_TOKEN_COUNT; n++) {
275- if (lwst[n].token == NULL )
276- continue ;
277-
278- fprintf (stderr, " %s = %s\n " , token_names[n], lwst[n].token );
279- }
280- }
33+ extern void dump_handshake_info (struct lws_tokens *lwst);
28134
282- static string getCallbackReason ( int reason ){
283- switch (reason){
284- case LWS_CALLBACK_ESTABLISHED : return " LWS_CALLBACK_ESTABLISHED" ;
285- case LWS_CALLBACK_CLIENT_CONNECTION_ERROR : return " LWS_CALLBACK_CLIENT_CONNECTION_ERROR" ;
286- case LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH : return " LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH" ;
287- case LWS_CALLBACK_CLIENT_ESTABLISHED : return " LWS_CALLBACK_CLIENT_ESTABLISHED" ;
288- case LWS_CALLBACK_CLOSED : return " LWS_CALLBACK_CLOSED" ;
289- case LWS_CALLBACK_CLOSED_HTTP : return " LWS_CALLBACK_CLOSED_HTTP" ;
290- case LWS_CALLBACK_RECEIVE : return " LWS_CALLBACK_RECEIVE" ;
291- case LWS_CALLBACK_CLIENT_RECEIVE : return " LWS_CALLBACK_CLIENT_RECEIVE" ;
292- case LWS_CALLBACK_CLIENT_RECEIVE_PONG : return " LWS_CALLBACK_CLIENT_RECEIVE_PONG" ;
293- case LWS_CALLBACK_CLIENT_WRITEABLE : return " LWS_CALLBACK_CLIENT_WRITEABLE" ;
294- case LWS_CALLBACK_SERVER_WRITEABLE : return " LWS_CALLBACK_SERVER_WRITEABLE" ;
295- case LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED: return " LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED" ;
296-
297- case LWS_CALLBACK_HTTP : return " LWS_CALLBACK_HTTP" ;
298- case LWS_CALLBACK_HTTP_BODY: return " LWS_CALLBACK_HTTP_BODY" ;
299- case LWS_CALLBACK_HTTP_BODY_COMPLETION: return " LWS_CALLBACK_HTTP_BODY_COMPLETION" ;
300- case LWS_CALLBACK_HTTP_FILE_COMPLETION : return " LWS_CALLBACK_HTTP_FILE_COMPLETION" ;
301- case LWS_CALLBACK_HTTP_WRITEABLE : return " LWS_CALLBACK_HTTP_WRITEABLE" ;
302- case LWS_CALLBACK_FILTER_NETWORK_CONNECTION : return " LWS_CALLBACK_FILTER_NETWORK_CONNECTION" ;
303- case LWS_CALLBACK_FILTER_HTTP_CONNECTION: return " LWS_CALLBACK_FILTER_HTTP_CONNECTION" ;
304- case LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION : return " LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION" ;
305- case LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS : return " LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS" ;
306- case LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS : return " LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS" ;
307- case LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION : return " LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION" ;
308- case LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER : return " LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER" ;
309- case LWS_CALLBACK_CONFIRM_EXTENSION_OKAY : return " LWS_CALLBACK_CONFIRM_EXTENSION_OKAY" ;
310-
311- case LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED : return " LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED" ;
312- case LWS_CALLBACK_PROTOCOL_INIT : return " LWS_CALLBACK_PROTOCOL_INIT" ;
313- case LWS_CALLBACK_PROTOCOL_DESTROY : return " LWS_CALLBACK_PROTOCOL_DESTROY" ;
314- case LWS_CALLBACK_WSI_CREATE: return " LWS_CALLBACK_WSI_CREATE" ;
315- case LWS_CALLBACK_WSI_DESTROY: return " LWS_CALLBACK_WSI_DESTROY" ;
316- case LWS_CALLBACK_GET_THREAD_ID: return " LWS_CALLBACK_GET_THREAD_ID" ;
317-
318- case LWS_CALLBACK_ADD_POLL_FD : return " LWS_CALLBACK_ADD_POLL_FD" ;
319- case LWS_CALLBACK_DEL_POLL_FD : return " LWS_CALLBACK_DEL_POLL_FD" ;
320- case LWS_CALLBACK_CHANGE_MODE_POLL_FD : return " LWS_CALLBACK_CHANGE_MODE_POLL_FD" ;
321- case LWS_CALLBACK_LOCK_POLL: return " LWS_CALLBACK_LOCK_POLL" ;
322- case LWS_CALLBACK_UNLOCK_POLL: return " LWS_CALLBACK_UNLOCK_POLL" ;
323-
324- case LWS_CALLBACK_USER: return " LWS_CALLBACK_USER" ;
325-
326- default :
327- std::stringstream r;
328- r << " Unknown callback reason id: " << reason;
329- return r.str ();
330- }
331- }
35+ extern string getCallbackReason ( int reason );
33236}
0 commit comments