void read_server_msg(Client* client) { int valread = read(client->maintainer_fd, client->server_msg.buffer+client->server_msg.offset, BUFFER_SIZE-client->server_msg.offset); if(valread == 0) exit(1); client->server_msg.offset += valread; if(client->server_msg.offset == client->server_msg.total_len) { if(ENCRYPTION_ENABLED) decrypt_msg(client->server_msg.buffer, client->keypair); client->server_msg.offset=0; logger("<Client><read_server_msg>got message from server\n"); process_server_msg(client); } }
void qq_proc_server_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *rcved, gint rcved_len) { qq_data *qd; guint8 *data; gint data_len; g_return_if_fail (gc != NULL && gc->proto_data != NULL); qd = (qq_data *) gc->proto_data; data = g_newa(guint8, rcved_len); data_len = qq_decrypt(data, rcved, rcved_len, qd->session_key); if (data_len < 0) { purple_debug_warning("QQ", "Can not decrypt server cmd by session key, [%05d], 0x%04X %s, len %d\n", seq, cmd, qq_get_cmd_desc(cmd), rcved_len); qq_show_packet("Can not decrypted", rcved, rcved_len); return; } if (data_len <= 0) { purple_debug_warning("QQ", "Server cmd decrypted is empty, [%05d], 0x%04X %s, len %d\n", seq, cmd, qq_get_cmd_desc(cmd), rcved_len); return; } /* now process the packet */ switch (cmd) { case QQ_CMD_RECV_IM_CE: case QQ_CMD_RECV_IM: process_private_msg(data, data_len, cmd, seq, gc); break; case QQ_CMD_RECV_MSG_SYS: process_server_msg(gc, data, data_len, seq); break; case QQ_CMD_BUDDY_CHANGE_STATUS: qq_process_buddy_change_status(data, data_len, gc); break; default: process_unknown_cmd(gc, _("Unknown SERVER CMD"), data, data_len, cmd, seq); break; } }
int Message_Unit::process_server_buffer(Block_Buffer &buf) { msg_tick_ = Time_Value::gettimeofday(); int cid = 0; uint32_t len = 0; uint32_t msg_id = 0; if (buf.read_int32(cid) || buf.read_uint32(len) || buf.read_uint32(msg_id)) { LOG_USER("deserialize error, cid:%d len:%d msg_id:%d", len, msg_id); return -1; } process_server_msg(msg_id, cid, buf); count_process_time(msg_id); return 0; }