void WorldServer::Process(){ WorldConnection::Process(); if (!Connected()) return; ServerPacket *pack = nullptr; while((pack = tcpc.PopPacket())){ Log.Out(Logs::General, Logs::Netcode, "Received Opcode: %4X", pack->opcode); //DumpPacket(pack); switch(pack->opcode) { case 0: { break; } case ServerOP_KeepAlive: { break; } case ServerOP_WIRemoteCallResponse: { char *id = nullptr; char *session_id = nullptr; char *error = nullptr; id = new char[pack->ReadUInt32() + 1]; pack->ReadString(id); session_id = new char[pack->ReadUInt32() + 1]; pack->ReadString(session_id); error = new char[pack->ReadUInt32() + 1]; pack->ReadString(error); uint32 param_count = pack->ReadUInt32(); std::map<std::string, std::string> params; for(uint32 i = 0; i < param_count; ++i) { char *first = new char[pack->ReadUInt32() + 1]; pack->ReadString(first); char *second = new char[pack->ReadUInt32() + 1]; pack->ReadString(second); params[first] = second; safe_delete_array(first); safe_delete_array(second); } //send the response to client... rapidjson::StringBuffer s; rapidjson::Writer<rapidjson::StringBuffer> writer(s); writer.StartObject(); writer.String("id"); if(strlen(id) == 0) { writer.Null(); } else { writer.String(id); } if(strlen(error) != 0) { writer.String("error"); writer.Bool(true); writer.String("result"); writer.String(error); } else { writer.String("error"); writer.Null(); writer.String("result"); writer.StartObject(); auto iter = params.begin(); while(iter != params.end()) { writer.String(iter->first.c_str()); writer.String(iter->second.c_str()); ++iter; } writer.EndObject(); } writer.EndObject(); if(sessions.count(session_id) != 0) { per_session_data_eqemu *session = sessions[session_id]; session->send_queue->push_back(s.GetString()); } safe_delete_array(id); safe_delete_array(session_id); safe_delete_array(error); break; } case ServerOP_WIRemoteCallToClient: { char *session_id = nullptr; char *method = nullptr; session_id = new char[pack->ReadUInt32() + 1]; pack->ReadString(session_id); method = new char[pack->ReadUInt32() + 1]; pack->ReadString(method); uint32 param_count = pack->ReadUInt32(); std::vector<std::string> params(param_count); for(uint32 i = 0; i < param_count; ++i) { char *p = new char[pack->ReadUInt32() + 1]; pack->ReadString(p); params[i] = p; safe_delete_array(p); } rapidjson::StringBuffer s; rapidjson::Writer<rapidjson::StringBuffer> writer(s); writer.StartObject(); writer.String("id"); writer.Null(); writer.String("method"); writer.String(method); writer.String("params"); writer.StartArray(); for(uint32 i = 0; i < param_count; ++i) { writer.String(params[i].c_str()); } writer.EndArray(); writer.EndObject(); if(sessions.count(session_id) != 0) { per_session_data_eqemu *session = sessions[session_id]; session->send_queue->push_back(s.GetString()); } safe_delete_array(session_id); safe_delete_array(method); break; } case ServerOP_WIRemoteOpcodeToClient: { char *session_id = nullptr; session_id = new char[pack->ReadUInt32() + 1]; pack->ReadString(session_id); char *method = nullptr; method = new char[pack->ReadUInt32() + 1]; pack->ReadString(method); uint32 zone_id = pack->ReadUInt32(); uint32 instance_id = pack->ReadUInt32(); uint32 opcode = pack->ReadUInt32(); uint32 datasize = pack->ReadUInt32(); char *p = new char[datasize]; pack->ReadData(p, datasize); rapidjson::StringBuffer s; rapidjson::Writer<rapidjson::StringBuffer> writer(s); writer.StartObject(); writer.String("id"); writer.Null(); writer.String("method"); writer.String(method); writer.String("zoneid"); writer.Uint(zone_id); writer.String("instance_id"); writer.Uint(instance_id); writer.String("opcode"); writer.Uint(opcode); writer.String("datasize"); writer.Uint(datasize); std::string enc; Base64::encode(p, datasize, enc, false); writer.String("data"); writer.String(enc.c_str()); writer.EndObject(); if(sessions.count(session_id) != 0) { per_session_data_eqemu *session = sessions[session_id]; session->send_queue->push_back(s.GetString()); } safe_delete_array(session_id); safe_delete_array(method); safe_delete_array(p); break; } } } safe_delete(pack); return; }