示例#1
0
/**
 * 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);
  }
}
示例#2
0
文件: client.c 项目: mashx/libpomelo
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);
}
示例#3
0
文件: client.c 项目: 559210/libpomelo
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);
  }
}
示例#4
0
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;
}