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 std::fs;
use std::fs::File;
@ -10,23 +9,18 @@ pub struct DiskStorageBackend {
}
impl DiskStorageBackend {
pub fn new() -> Result<Self, Error> {
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");
pub fn new(shared_objects_path: PathBuf) -> Self {
// Create a base dir if one doesn't exist yet
if !shared_objects_path.exists() {
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);
}
}
Ok(DiskStorageBackend {
DiskStorageBackend {
shared_objects_path,
})
}
}
/// 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 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)]
#[clap(
name = "Ruffle",
@ -82,6 +89,10 @@ pub struct Opt {
#[cfg(feature = "render_trace")]
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.
#[clap(long)]
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::descriptors::Descriptors;
use std::collections::{HashMap, HashSet};
use std::path::PathBuf;
use std::rc::Rc;
use std::sync::{Arc, Mutex, MutexGuard};
use std::time::Duration;
@ -46,6 +47,7 @@ pub struct PlayerOptions {
pub upgrade_to_https: bool,
pub fullscreen: bool,
pub load_behavior: LoadBehavior,
pub save_directory: PathBuf,
pub letterbox: Letterbox,
pub spoof_url: Option<Url>,
pub player_version: u8,
@ -72,6 +74,7 @@ impl From<&Opt> for PlayerOptions {
upgrade_to_https: value.upgrade_to_https,
fullscreen: value.fullscreen,
load_behavior: value.load_behavior,
save_directory: value.save_directory.clone(),
letterbox: value.letterbox,
spoof_url: value.spoof_url.clone(),
player_version: value.player_version.unwrap_or(32),
@ -154,7 +157,7 @@ impl ActivePlayer {
builder = builder
.with_navigator(navigator)
.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 {
event_loop: event_loop.clone(),
window: window.clone(),