void clubby_proto_handler(struct mg_connection *nc, int ev, void *ev_data) { struct clubby_event evt; switch (ev) { case MG_EV_CONNECT: { evt.ev = CLUBBY_NET_CONNECT; evt.net_connect.success = (*(int *) ev_data == 0); LOG(LL_DEBUG, ("CONNECT (%d)", evt.net_connect.success)); s_clubby_cb(&evt); if (evt.net_connect.success) { char *proto = NULL; (void) asprintf( &proto, "Sec-WebSocket-Protocol: %s\r\n" "Sec-WebSocket-Extensions: %s-encoding; in=json; out=ubjson\r\n", WS_PROTOCOL, WS_PROTOCOL); mg_send_websocket_handshake(nc, "/", proto); free(proto); } break; } case MG_EV_WEBSOCKET_HANDSHAKE_DONE: { LOG(LL_DEBUG, ("HANDSHAKE DONE")); nc->flags |= MG_F_CLUBBY_CONNECTED; evt.ev = CLUBBY_CONNECT; s_clubby_cb(&evt); break; } case MG_EV_WEBSOCKET_FRAME: { struct websocket_message *wm = (struct websocket_message *) ev_data; LOG(LL_DEBUG, ("GOT FRAME (%d): %.*s", (int) wm->size, (int) wm->size, wm->data)); evt.frame.data.p = (char *) wm->data; /* * Mostly debug event, CLUBBY_REQUEST_RECEIVED and * CLUBY_RESPONSE_RECEIVED will be send as well */ evt.frame.data.len = wm->size; evt.ev = CLUBBY_FRAME; s_clubby_cb(&evt); clubby_proto_handle_frame(evt.frame.data); break; } case MG_EV_CLOSE: LOG(LL_DEBUG, ("CLOSE")); nc->flags &= ~MG_F_CLUBBY_CONNECTED; s_clubby_conn = NULL; evt.ev = CLUBBY_DISCONNECT; s_clubby_cb(&evt); break; } }
static void clubby_proto_handler(struct mg_connection *nc, int ev, void *ev_data) { struct clubby_event evt; switch (ev) { case MG_EV_CONNECT: { evt.ev = CLUBBY_NET_CONNECT; evt.net_connect.success = (*(int *) ev_data == 0); evt.context = nc->user_data; LOG(LL_DEBUG, ("CONNECT (%d)", evt.net_connect.success)); s_clubby_cb(&evt); break; } case MG_EV_WEBSOCKET_HANDSHAKE_DONE: { LOG(LL_DEBUG, ("HANDSHAKE DONE")); nc->flags |= MG_F_CLUBBY_CONNECTED; evt.ev = CLUBBY_CONNECT; evt.context = nc->user_data; s_clubby_cb(&evt); break; } case MG_EV_WEBSOCKET_FRAME: { struct websocket_message *wm = (struct websocket_message *) ev_data; LOG(LL_DEBUG, ("GOT FRAME (%d): %.*s", (int) wm->size, (int) wm->size, wm->data)); clubby_proto_handle_frame((char *) wm->data, wm->size, nc->user_data); break; } case MG_EV_CLOSE: LOG(LL_DEBUG, ("CLOSE")); nc->flags &= ~MG_F_CLUBBY_CONNECTED; evt.ev = CLUBBY_DISCONNECT; evt.context = nc->user_data; s_clubby_cb(&evt); break; } }