Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- impl ServerState for PatchServerState {
- type Packet = PatchPacket;
- type PacketError = PatchError;
- fn on_connect(&mut self) -> Vec<OnConnect> {
- let mut rng = rand::thread_rng();
- let key_in: u32 = rng.gen();
- let key_out: u32 = rng.gen();
- vec![OnConnect::Packet(Box::new(PatchWelcome::new(key_out, key_in))),
- OnConnect::Cipher((Box::new(PSOPCCipher::new(key_in)), Box::new(PSOPCCipher::new(key_out))))
- ]
- }
- fn handle(&mut self, pkt: &PatchPacket) -> Box<dyn Iterator<Item = Box<dyn PSOPacket>>> {
- match pkt {
- PatchPacket::PatchWelcomeReply(_pkt) => {
- let p: Vec<Box<dyn PSOPacket>> = vec![Box::new(RequestLogin {})];
- Box::new(p.into_iter())
- },
- PatchPacket::LoginReply(_pkt) => {
- let mut p: Vec<Box<dyn PSOPacket>> = vec![Box::new(Message::new("hello player".to_string()))];
- p.append(&mut get_file_list_packets(&self.patch_file_tree));
- p.push(Box::new(PatchEndList {}));
- Box::new(p.into_iter())
- },
- PatchPacket::FileInfoReply(pkt) => {
- self.patch_file_info.push(pkt.clone());
- Box::new(None.into_iter())
- },
- PatchPacket::FileInfoListEnd(_pkt) => {
- let need_update = self.patch_file_info.iter()
- .filter(|file_info| does_file_need_updating(file_info, &self.patch_file_lookup))
- .collect::<Vec<_>>();
- let total_size = need_update.iter().fold(0, |a, file_info| a + file_info.size);
- let total_files = need_update.len() as u32;
- let p: Vec<Box<dyn PSOPacket>> = vec![Box::new(FilesToPatchMetadata::new(total_size, total_files)),
- Box::new(PatchStartList {}),
- ];
- Box::new(p.into_iter().chain(SendFileIterator::new(&self)))
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement