chore(process manager): Converted launch_process function for games to use game_id

This commit is contained in:
quexeky
2025-01-13 21:36:22 +11:00
parent 09ecc4216a
commit c2e8952452
6 changed files with 66 additions and 66 deletions

View File

@@ -176,7 +176,7 @@ pub fn set_game_status<F: FnOnce(&mut RwLockWriteGuard<'_, Database>, &Downloada
let status = GameStatusManager::fetch_state(&meta.id);
push_game_update(app_handle, &meta, status);
push_game_update(app_handle, &meta.id, status);
}
// TODO: Make the error relelvant rather than just assume that it's a Deserialize error
fn handle_invalid_database(

View File

@@ -102,7 +102,7 @@ impl GameDownloadAgent {
let timer = Instant::now();
push_game_update(
app_handle,
&self.metadata(),
&self.metadata().id,
(
None,
Some(ApplicationTransientStatus::Downloading {

View File

@@ -227,7 +227,7 @@ pub fn uninstall_game_logic(meta: DownloadableMetadata, app_handle: &AppHandle)
push_game_update(
app_handle,
&meta,
&meta.id,
(None, Some(ApplicationTransientStatus::Uninstalling {})),
);
@@ -275,7 +275,7 @@ pub fn uninstall_game_logic(meta: DownloadableMetadata, app_handle: &AppHandle)
push_game_update(
&app_handle,
&meta,
&meta.id,
(Some(GameDownloadStatus::Remote {}), None),
);
}
@@ -368,16 +368,12 @@ pub fn on_game_complete(
Ok(())
}
pub fn push_game_update(
app_handle: &AppHandle,
meta: &DownloadableMetadata,
status: GameStatusWithTransient,
) {
pub fn push_game_update(app_handle: &AppHandle, game_id: &String, status: GameStatusWithTransient) {
app_handle
.emit(
&format!("update_game/{}", meta.id),
&format!("update_game/{}", game_id),
GameUpdateEvent {
game_id: meta.id.clone(),
game_id: game_id.clone(),
status,
},
)

View File

@@ -133,7 +133,8 @@ fn setup(handle: AppHandle) -> AppState<'static> {
debug!("Database is set up");
let (app_status, user) = auth::setup();
// TODO: Account for possible failure
let (app_status, user) = auth::setup().unwrap();
let db_handle = DB.borrow_data().unwrap();
let mut missing_games = Vec::new();

View File

@@ -1,10 +1,7 @@
use std::sync::Mutex;
use crate::{
database::db::GameDownloadStatus,
download_manager::downloadable_metadata::{DownloadType, DownloadableMetadata},
error::{process_error::ProcessError, user_error::UserValue},
games::library::get_current_meta,
AppState, DB,
};
@@ -16,28 +13,13 @@ pub fn launch_game(
let state_lock = state.lock().unwrap();
let mut process_manager_lock = state_lock.process_manager.lock().unwrap();
let version = match DB
.borrow_data()
.unwrap()
.applications
.game_statuses
.get(&id)
.cloned()
{
Some(GameDownloadStatus::Installed { version_name, .. }) => version_name,
Some(GameDownloadStatus::SetupRequired { .. }) => {
return Err(ProcessError::SetupRequired).into()
}
_ => return Err(ProcessError::NotInstalled).into(),
};
//let meta = DownloadableMetadata {
// id,
// version: Some(version),
// download_type: DownloadType::Game,
//};
let meta = DownloadableMetadata {
id,
version: Some(version),
download_type: DownloadType::Game,
};
match process_manager_lock.launch_process(meta) {
match process_manager_lock.launch_process(id) {
Ok(_) => {}
Err(e) => return UserValue::Err(e),
};
@@ -53,11 +35,10 @@ pub fn kill_game(
game_id: String,
state: tauri::State<'_, Mutex<AppState>>,
) -> UserValue<(), ProcessError> {
let meta = get_current_meta(&game_id).ok_or(ProcessError::NotInstalled)?;
let state_lock = state.lock().unwrap();
let mut process_manager_lock = state_lock.process_manager.lock().unwrap();
process_manager_lock
.kill_game(meta)
.kill_game(game_id)
.map_err(ProcessError::IOError)
.into()
}

View File

@@ -16,7 +16,7 @@ use umu_wrapper_lib::command_builder::UmuCommandBuilder;
use crate::{
database::db::{ApplicationTransientStatus, GameDownloadStatus, DATA_ROOT_DIR},
download_manager::downloadable_metadata::DownloadableMetadata,
download_manager::downloadable_metadata::{DownloadType, DownloadableMetadata},
error::process_error::ProcessError,
games::{library::push_game_update, state::GameStatusManager},
AppState, DB,
@@ -25,7 +25,7 @@ use crate::{
pub struct ProcessManager<'a> {
current_platform: Platform,
log_output_dir: PathBuf,
processes: HashMap<DownloadableMetadata, Arc<SharedChild>>,
processes: HashMap<String, Arc<SharedChild>>,
app_handle: AppHandle,
game_launchers: HashMap<(Platform, Platform), &'a (dyn ProcessHandler + Sync + Send + 'static)>,
}
@@ -82,8 +82,8 @@ impl ProcessManager<'_> {
*/
(absolute_exe, Vec::new())
}
pub fn kill_game(&mut self, meta: DownloadableMetadata) -> Result<(), io::Error> {
return match self.processes.get(&meta) {
pub fn kill_game(&mut self, game_id: String) -> Result<(), io::Error> {
return match self.processes.get(&game_id) {
Some(child) => {
child.kill()?;
child.wait()?;
@@ -96,24 +96,26 @@ impl ProcessManager<'_> {
};
}
fn on_process_finish(
&mut self,
meta: DownloadableMetadata,
result: Result<ExitStatus, std::io::Error>,
) {
if !self.processes.contains_key(&meta) {
fn on_process_finish(&mut self, game_id: String, result: Result<ExitStatus, std::io::Error>) {
if !self.processes.contains_key(&game_id) {
warn!("process on_finish was called, but game_id is no longer valid. finished with result: {:?}", result);
return;
}
debug!("process for {:?} exited with {:?}", meta, result);
debug!("process for {:?} exited with {:?}", &game_id, result);
self.processes.remove(&meta);
self.processes.remove(&game_id);
let mut db_handle = DB.borrow_data_mut().unwrap();
let meta = db_handle
.applications
.installed_game_version
.get(&game_id)
.cloned()
.unwrap();
db_handle.applications.transient_statuses.remove(&meta);
let current_state = db_handle.applications.game_statuses.get(&meta.id).cloned();
let current_state = db_handle.applications.game_statuses.get(&game_id).cloned();
if let Some(saved_state) = current_state {
if let GameDownloadStatus::SetupRequired {
version_name,
@@ -123,7 +125,7 @@ impl ProcessManager<'_> {
if let Ok(exit_code) = result {
if exit_code.success() {
db_handle.applications.game_statuses.insert(
meta.id.clone(),
game_id.clone(),
GameDownloadStatus::Installed {
version_name: version_name.to_string(),
install_dir: install_dir.to_string(),
@@ -135,9 +137,9 @@ impl ProcessManager<'_> {
}
drop(db_handle);
let status = GameStatusManager::fetch_state(&meta.id);
let status = GameStatusManager::fetch_state(&game_id);
push_game_update(&self.app_handle, &meta, status);
push_game_update(&self.app_handle, &game_id, status);
// TODO better management
}
@@ -149,21 +151,41 @@ impl ProcessManager<'_> {
.contains_key(&(current.clone(), platform.clone())))
}
pub fn launch_process(&mut self, meta: DownloadableMetadata) -> Result<(), ProcessError> {
if self.processes.contains_key(&meta) {
pub fn launch_process(&mut self, game_id: String) -> Result<(), ProcessError> {
if self.processes.contains_key(&game_id) {
return Err(ProcessError::AlreadyRunning);
}
let version = match DB
.borrow_data()
.unwrap()
.applications
.game_statuses
.get(&game_id)
.cloned()
{
Some(GameDownloadStatus::Installed { version_name, .. }) => version_name,
Some(GameDownloadStatus::SetupRequired { .. }) => {
return Err(ProcessError::SetupRequired).into()
}
_ => return Err(ProcessError::NotInstalled).into(),
};
let meta = DownloadableMetadata {
id: game_id.clone(),
version: Some(version.clone()),
download_type: DownloadType::Game,
};
let mut db_lock = DB.borrow_data_mut().unwrap();
debug!(
"Launching process {:?} with games {:?}",
meta, db_lock.applications.game_versions
&game_id, db_lock.applications.game_versions
);
let game_status = db_lock
.applications
.game_statuses
.get(&meta.id)
.get(&game_id)
.ok_or(ProcessError::NotInstalled)?;
let status_metadata: Option<(&String, &String)> = match game_status {
@@ -187,7 +209,7 @@ impl ProcessManager<'_> {
let game_version = db_lock
.applications
.game_versions
.get(&meta.id)
.get(&game_id)
.ok_or(ProcessError::InvalidID)?
.get(version_name)
.ok_or(ProcessError::InvalidVersion)?;
@@ -222,8 +244,8 @@ impl ProcessManager<'_> {
.create(true)
.open(self.log_output_dir.join(format!(
"{}-{}-{}.log",
meta.id.clone(),
meta.version.clone().unwrap_or_default(),
&game_id,
&version,
current_time.timestamp()
)))
.map_err(ProcessError::IOError)?;
@@ -235,8 +257,8 @@ impl ProcessManager<'_> {
.create(true)
.open(self.log_output_dir.join(format!(
"{}-{}-{}-error.log",
meta.id.clone(),
meta.version.clone().unwrap_or_default(),
&game_id,
&version,
current_time.timestamp()
)))
.map_err(ProcessError::IOError)?;
@@ -270,7 +292,7 @@ impl ProcessManager<'_> {
push_game_update(
&self.app_handle,
&meta,
&meta.id,
(None, Some(ApplicationTransientStatus::Running {})),
);
@@ -285,7 +307,7 @@ impl ProcessManager<'_> {
let app_state_handle = app_state.lock().unwrap();
let mut process_manager_handle = app_state_handle.process_manager.lock().unwrap();
process_manager_handle.on_process_finish(wait_thread_game_id, result);
process_manager_handle.on_process_finish(wait_thread_game_id.id, result);
// As everything goes out of scope, they should get dropped
// But just to explicit about it
@@ -293,7 +315,7 @@ impl ProcessManager<'_> {
drop(app_state_handle);
});
self.processes.insert(meta, wait_thread_handle);
self.processes.insert(meta.id, wait_thread_handle);
info!("finished spawning process");