Advertisement
Guest User

Untitled

a guest
Jul 16th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.06 KB | None | 0 0
  1. impl ServerState for PatchServerState {
  2.     type Packet = PatchPacket;
  3.     type PacketError = PatchError;
  4.  
  5.     fn on_connect(&mut self) -> Vec<OnConnect> {
  6.         let mut rng = rand::thread_rng();
  7.         let key_in: u32 = rng.gen();
  8.         let key_out: u32 = rng.gen();
  9.        
  10.         vec![OnConnect::Packet(Box::new(PatchWelcome::new(key_out, key_in))),
  11.              OnConnect::Cipher((Box::new(PSOPCCipher::new(key_in)), Box::new(PSOPCCipher::new(key_out))))
  12.         ]
  13.     }
  14.    
  15.     fn handle(&mut self, pkt: &PatchPacket) -> Box<dyn Iterator<Item = Box<dyn PSOPacket>>> {
  16.         match pkt {
  17.             PatchPacket::PatchWelcomeReply(_pkt) => {
  18.                 let p: Vec<Box<dyn PSOPacket>> = vec![Box::new(RequestLogin {})];
  19.                 Box::new(p.into_iter())
  20.             },
  21.             PatchPacket::LoginReply(_pkt) => {
  22.                 let mut p: Vec<Box<dyn PSOPacket>> = vec![Box::new(Message::new("hello player".to_string()))];
  23.                 p.append(&mut get_file_list_packets(&self.patch_file_tree));
  24.                 p.push(Box::new(PatchEndList {}));
  25.                 Box::new(p.into_iter())
  26.             },
  27.             PatchPacket::FileInfoReply(pkt) => {
  28.                 self.patch_file_info.push(pkt.clone());
  29.                 Box::new(None.into_iter())
  30.             },
  31.             PatchPacket::FileInfoListEnd(_pkt) => {
  32.                 let need_update = self.patch_file_info.iter()
  33.                     .filter(|file_info| does_file_need_updating(file_info, &self.patch_file_lookup))
  34.                     .collect::<Vec<_>>();
  35.                
  36.                 let total_size = need_update.iter().fold(0, |a, file_info| a + file_info.size);
  37.                 let total_files = need_update.len() as u32;
  38.                
  39.                 let p: Vec<Box<dyn PSOPacket>> = vec![Box::new(FilesToPatchMetadata::new(total_size, total_files)),
  40.                                                       Box::new(PatchStartList {}),
  41.                 ];
  42.                 Box::new(p.into_iter().chain(SendFileIterator::new(&self)))
  43.             }
  44.         }
  45.     }
  46. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement