diff --git a/src/netplay.rs b/src/netplay.rs index e14fa02..163252e 100644 --- a/src/netplay.rs +++ b/src/netplay.rs @@ -11,12 +11,13 @@ const UDP_SYNC_DATA: u8 = 4; //TCP packet formats const TCP_SEND_SAVE: u8 = 1; -const TCP_RECEIVE_SAVE: u8 = 2; +//const TCP_RECEIVE_SAVE: u8 = 2; //const TCP_SEND_SETTINGS: u8 = 3; //const TCP_RECEIVE_SETTINGS: u8 = 4; const TCP_REGISTER_PLAYER: u8 = 5; const TCP_GET_REGISTRATION: u8 = 6; const TCP_DISCONNECT_NOTICE: u8 = 7; +const TCP_RECEIVE_SAVE_WITH_SIZE: u8 = 8; const CS4: u32 = 32; @@ -57,19 +58,21 @@ pub fn send_save(netplay: &mut Netplay, save_type: &str, save_data: &[u8], size: request.push(0); // null terminate string request.extend_from_slice(&(size as u32).to_be_bytes()); - let mut send_data = save_data.to_owned(); - send_data.resize(size, 0); // pad with zeros if needed - request.extend(send_data); + if size > 0 { + request.extend(save_data.to_owned()); + } netplay.tcp_stream.write_all(&request).unwrap(); } -pub fn receive_save(netplay: &mut Netplay, save_type: &str, save_data: &mut Vec, size: usize) { - let mut request: Vec = [TCP_RECEIVE_SAVE].to_vec(); +pub fn receive_save(netplay: &mut Netplay, save_type: &str, save_data: &mut Vec) { + let mut request: Vec = [TCP_RECEIVE_SAVE_WITH_SIZE].to_vec(); request.extend_from_slice(save_type.as_bytes()); request.push(0); // null terminate string netplay.tcp_stream.write_all(&request).unwrap(); - let mut response: Vec = vec![0; size]; + let mut size: [u8; 4] = [0; 4]; + netplay.tcp_stream.read_exact(&mut size).unwrap(); + let mut response: Vec = vec![0; u32::from_be_bytes(size) as usize]; netplay.tcp_stream.read_exact(&mut response).unwrap(); *save_data = response; } diff --git a/src/ui/storage.rs b/src/ui/storage.rs index 8015726..ad8dc86 100644 --- a/src/ui/storage.rs +++ b/src/ui/storage.rs @@ -1,4 +1,3 @@ -use crate::device; use crate::netplay; use crate::ui; @@ -138,12 +137,9 @@ pub fn load_saves(ui: &mut ui::Ui, netplay: &mut Option) { if mempak.is_ok() { ui.saves.mempak.0 = mempak.unwrap(); } - if netplay.is_none() { - // can't do romsaves with the current netplay implementation - let romsave = std::fs::read(&mut ui.paths.romsave_file_path); - if romsave.is_ok() { - ui.saves.romsave.0 = postcard::from_bytes(romsave.unwrap().as_ref()).unwrap(); - } + let romsave = std::fs::read(&mut ui.paths.romsave_file_path); + if romsave.is_ok() { + ui.saves.romsave.0 = postcard::from_bytes(romsave.unwrap().as_ref()).unwrap(); } } @@ -153,51 +149,46 @@ pub fn load_saves(ui: &mut ui::Ui, netplay: &mut Option) { netplay.as_mut().unwrap(), "eep", &ui.saves.eeprom.0, - device::cart::EEPROM_MAX_SIZE, + ui.saves.eeprom.0.len(), ); netplay::send_save( netplay.as_mut().unwrap(), "sra", &ui.saves.sram.0, - device::sram::SRAM_SIZE, + ui.saves.sram.0.len(), ); netplay::send_save( netplay.as_mut().unwrap(), "fla", &ui.saves.flash.0, - device::sram::FLASHRAM_SIZE, + ui.saves.flash.0.len(), ); netplay::send_save( netplay.as_mut().unwrap(), "mpk", &ui.saves.mempak.0, - device::controller::mempak::MEMPAK_SIZE * 4, + ui.saves.mempak.0.len(), + ); + let mut romsave_bytes: Vec = vec![]; + if !ui.saves.romsave.0.is_empty() { + romsave_bytes = postcard::to_stdvec(&ui.saves.romsave.0).unwrap(); + } + netplay::send_save( + netplay.as_mut().unwrap(), + "rom", + &romsave_bytes, + romsave_bytes.len(), ); } else { - netplay::receive_save( - netplay.as_mut().unwrap(), - "eep", - &mut ui.saves.eeprom.0, - device::cart::EEPROM_MAX_SIZE, - ); - netplay::receive_save( - netplay.as_mut().unwrap(), - "sra", - &mut ui.saves.sram.0, - device::sram::SRAM_SIZE, - ); - netplay::receive_save( - netplay.as_mut().unwrap(), - "fla", - &mut ui.saves.flash.0, - device::sram::FLASHRAM_SIZE, - ); - netplay::receive_save( - netplay.as_mut().unwrap(), - "mpk", - &mut ui.saves.mempak.0, - device::controller::mempak::MEMPAK_SIZE * 4, - ); + netplay::receive_save(netplay.as_mut().unwrap(), "eep", &mut ui.saves.eeprom.0); + netplay::receive_save(netplay.as_mut().unwrap(), "sra", &mut ui.saves.sram.0); + netplay::receive_save(netplay.as_mut().unwrap(), "fla", &mut ui.saves.flash.0); + netplay::receive_save(netplay.as_mut().unwrap(), "mpk", &mut ui.saves.mempak.0); + let mut romsave_bytes: Vec = vec![]; + netplay::receive_save(netplay.as_mut().unwrap(), "rom", &mut romsave_bytes); + if !romsave_bytes.is_empty() { + ui.saves.romsave.0 = postcard::from_bytes(&romsave_bytes).unwrap(); + } } } } @@ -221,7 +212,7 @@ pub fn write_saves(ui: &ui::Ui, netplay: &Option) { if ui.saves.mempak.1 { write_save(ui, SaveTypes::Mempak) } - if ui.saves.romsave.1 && netplay.is_none() { + if ui.saves.romsave.1 { write_save(ui, SaveTypes::Romsave) } }