desktop: Add --save-directory

This commit is contained in:
Nathan Adams 2024-02-26 23:32:17 +01:00
parent 145275af86
commit 6136d14179
3 changed files with 19 additions and 11 deletions

View File

@ -1,4 +1,3 @@
use anyhow::{Context, Error};
use ruffle_core::backend::storage::StorageBackend; use ruffle_core::backend::storage::StorageBackend;
use std::fs; use std::fs;
use std::fs::File; use std::fs::File;
@ -10,23 +9,18 @@ pub struct DiskStorageBackend {
} }
impl DiskStorageBackend { impl DiskStorageBackend {
pub fn new() -> Result<Self, Error> { pub fn new(shared_objects_path: PathBuf) -> Self {
let base_path = dirs::data_local_dir()
.context("Couldn't find a valid data_local dir")?
.join("ruffle");
let shared_objects_path = base_path.join("SharedObjects");
// Create a base dir if one doesn't exist yet // Create a base dir if one doesn't exist yet
if !shared_objects_path.exists() { if !shared_objects_path.exists() {
tracing::info!("Creating storage dir"); tracing::info!("Creating storage dir");
if let Err(r) = fs::create_dir_all(&base_path) { if let Err(r) = fs::create_dir_all(&shared_objects_path) {
tracing::warn!("Unable to create storage dir {}", r); tracing::warn!("Unable to create storage dir {}", r);
} }
} }
Ok(DiskStorageBackend { DiskStorageBackend {
shared_objects_path, shared_objects_path,
}) }
} }
/// Verifies that the path contains no `..` components to prevent accessing files outside of the Ruffle directory. /// Verifies that the path contains no `..` components to prevent accessing files outside of the Ruffle directory.

View File

@ -10,6 +10,13 @@ use ruffle_render_wgpu::clap::{GraphicsBackend, PowerPreference};
use std::path::Path; use std::path::Path;
use url::Url; use url::Url;
fn get_default_save_directory() -> std::path::PathBuf {
dirs::data_local_dir()
.expect("Couldn't find a valid data_local dir")
.join("ruffle")
.join("SharedObjects")
}
#[derive(Parser, Debug)] #[derive(Parser, Debug)]
#[clap( #[clap(
name = "Ruffle", name = "Ruffle",
@ -82,6 +89,10 @@ pub struct Opt {
#[cfg(feature = "render_trace")] #[cfg(feature = "render_trace")]
trace_path: Option<std::path::PathBuf>, trace_path: Option<std::path::PathBuf>,
/// Location to store save data for games.
#[clap(long, default_value_os_t=get_default_save_directory())]
pub save_directory: std::path::PathBuf,
/// Proxy to use when loading movies via URL. /// Proxy to use when loading movies via URL.
#[clap(long)] #[clap(long)]
pub proxy: Option<Url>, pub proxy: Option<Url>,

View File

@ -20,6 +20,7 @@ use ruffle_render::quality::StageQuality;
use ruffle_render_wgpu::backend::WgpuRenderBackend; use ruffle_render_wgpu::backend::WgpuRenderBackend;
use ruffle_render_wgpu::descriptors::Descriptors; use ruffle_render_wgpu::descriptors::Descriptors;
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use std::path::PathBuf;
use std::rc::Rc; use std::rc::Rc;
use std::sync::{Arc, Mutex, MutexGuard}; use std::sync::{Arc, Mutex, MutexGuard};
use std::time::Duration; use std::time::Duration;
@ -46,6 +47,7 @@ pub struct PlayerOptions {
pub upgrade_to_https: bool, pub upgrade_to_https: bool,
pub fullscreen: bool, pub fullscreen: bool,
pub load_behavior: LoadBehavior, pub load_behavior: LoadBehavior,
pub save_directory: PathBuf,
pub letterbox: Letterbox, pub letterbox: Letterbox,
pub spoof_url: Option<Url>, pub spoof_url: Option<Url>,
pub player_version: u8, pub player_version: u8,
@ -72,6 +74,7 @@ impl From<&Opt> for PlayerOptions {
upgrade_to_https: value.upgrade_to_https, upgrade_to_https: value.upgrade_to_https,
fullscreen: value.fullscreen, fullscreen: value.fullscreen,
load_behavior: value.load_behavior, load_behavior: value.load_behavior,
save_directory: value.save_directory.clone(),
letterbox: value.letterbox, letterbox: value.letterbox,
spoof_url: value.spoof_url.clone(), spoof_url: value.spoof_url.clone(),
player_version: value.player_version.unwrap_or(32), player_version: value.player_version.unwrap_or(32),
@ -154,7 +157,7 @@ impl ActivePlayer {
builder = builder builder = builder
.with_navigator(navigator) .with_navigator(navigator)
.with_renderer(renderer) .with_renderer(renderer)
.with_storage(DiskStorageBackend::new().expect("Couldn't create storage backend")) .with_storage(DiskStorageBackend::new(opt.save_directory.clone()))
.with_fs_commands(Box::new(DesktopFSCommandProvider { .with_fs_commands(Box::new(DesktopFSCommandProvider {
event_loop: event_loop.clone(), event_loop: event_loop.clone(),
window: window.clone(), window: window.clone(),