/** * New Pomelo package arrived callback. * * @param type Pomelo package type * @param data package body * @param len package body length * @param attach attach pointer pass to pc_pkg_parser_t */ void pc__pkg_cb(pc_pkg_type type, const char *data, size_t len, void *attach) { pc_client_t *client = (pc_client_t *)attach; int status = 0; switch(type) { case PC_PKG_HANDSHAKE: status = pc__handshake_resp(client, data, len); break; case PC_PKG_HEARBEAT: status = pc__heartbeat(client); break; case PC_PKG_DATA: status = pc__data(client, data, len); break; case PC_PKG_KICK: pc_emit_event(client, PC_EVENT_KICK, NULL); break; default: fprintf(stderr, "Unknown Pomelo package type: %d.\n", type); status = -1; break; } if(status == -1) { pc_client_stop(client); } }
static void pc__client_connect3_cb(pc_connect_t* req, int status) { if(status == -1) { pc_client_stop(req->client); pc_connect_req_destroy(req); return; } pc_emit_event(req->client, PC_EVENT_RECONNECT, req->client); pc_connect_req_destroy(req); }
void pc__client_reconnected_cb(pc_connect_t* conn_req, int status) { pc_client_t* client = conn_req->client; client->reconnecting = 0; uv_timer_stop(&client->reconnect_timer); if (status == 0) { client->reconnects = 0; pc_emit_event(client, PC_EVENT_RECONNECT, client); } else { pc_client_stop(client); } }
static int pc__data(pc_client_t *client, const char *data, size_t len) { pc_msg_t *msg = client->parse_msg(client, data, len); if(msg == NULL) { return -1; } if(msg->id > 0) { pc__process_response(client, msg); } else { // server push message pc_emit_event(client, msg->route, msg->msg); } client->parse_msg_done(client, msg); return 0; }