Fixes to UTF-8 handling in file paths
This commit is contained in:
parent
049859e5b1
commit
989ec5cf4d
@ -234,6 +234,11 @@ sub encode_path {
|
|||||||
return encode('locale_fs', $filename);
|
return encode('locale_fs', $filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub decode_path {
|
||||||
|
my ($filename) = @_;
|
||||||
|
return decode('locale_fs', $filename);
|
||||||
|
}
|
||||||
|
|
||||||
sub open {
|
sub open {
|
||||||
my ($fh, $mode, $filename) = @_;
|
my ($fh, $mode, $filename) = @_;
|
||||||
return CORE::open $$fh, $mode, encode_path($filename);
|
return CORE::open $$fh, $mode, encode_path($filename);
|
||||||
|
@ -380,7 +380,8 @@ sub read_ini {
|
|||||||
my ($file) = @_;
|
my ($file) = @_;
|
||||||
|
|
||||||
local $/ = "\n";
|
local $/ = "\n";
|
||||||
Slic3r::open(\my $fh, '<', $file);
|
Slic3r::open(\my $fh, '<', $file)
|
||||||
|
or die "Unable to open $file: $!\n";
|
||||||
binmode $fh, ':utf8';
|
binmode $fh, ':utf8';
|
||||||
|
|
||||||
my $ini = { _ => {} };
|
my $ini = { _ => {} };
|
||||||
|
@ -75,20 +75,20 @@ sub OnInit {
|
|||||||
|
|
||||||
# locate or create data directory
|
# locate or create data directory
|
||||||
$datadir ||= Wx::StandardPaths::Get->GetUserDataDir;
|
$datadir ||= Wx::StandardPaths::Get->GetUserDataDir;
|
||||||
$datadir = Slic3r::encode_path($datadir);
|
my $enc_datadir = Slic3r::encode_path($datadir);
|
||||||
Slic3r::debugf "Data directory: %s\n", $datadir;
|
Slic3r::debugf "Data directory: %s\n", $datadir;
|
||||||
|
|
||||||
# just checking for existence of $datadir is not enough: it may be an empty directory
|
# just checking for existence of $datadir is not enough: it may be an empty directory
|
||||||
# supplied as argument to --datadir; in that case we should still run the wizard
|
# supplied as argument to --datadir; in that case we should still run the wizard
|
||||||
my $run_wizard = (-d $datadir && -e "$datadir/slic3r.ini") ? 0 : 1;
|
my $run_wizard = (-d $enc_datadir && -e "$enc_datadir/slic3r.ini") ? 0 : 1;
|
||||||
for ($datadir, "$datadir/print", "$datadir/filament", "$datadir/printer") {
|
for ($enc_datadir, "$enc_datadir/print", "$enc_datadir/filament", "$enc_datadir/printer") {
|
||||||
mkdir or $self->fatal_error("Slic3r was unable to create its data directory at $_ (errno: $!).")
|
mkdir or $self->fatal_error("Slic3r was unable to create its data directory at $_ (errno: $!).")
|
||||||
unless -d $_;
|
unless -d $_;
|
||||||
}
|
}
|
||||||
|
|
||||||
# load settings
|
# load settings
|
||||||
my $last_version;
|
my $last_version;
|
||||||
if (-f "$datadir/slic3r.ini") {
|
if (-f "$enc_datadir/slic3r.ini") {
|
||||||
my $ini = eval { Slic3r::Config->read_ini("$datadir/slic3r.ini") };
|
my $ini = eval { Slic3r::Config->read_ini("$datadir/slic3r.ini") };
|
||||||
$Settings = $ini if $ini;
|
$Settings = $ini if $ini;
|
||||||
$last_version = $Settings->{_}{version};
|
$last_version = $Settings->{_}{version};
|
||||||
@ -212,7 +212,8 @@ sub presets {
|
|||||||
my ($self, $section) = @_;
|
my ($self, $section) = @_;
|
||||||
|
|
||||||
my %presets = ();
|
my %presets = ();
|
||||||
opendir my $dh, "$Slic3r::GUI::datadir/$section" or die "Failed to read directory $Slic3r::GUI::datadir/$section (errno: $!)\n";
|
opendir my $dh, Slic3r::encode_path("$Slic3r::GUI::datadir/$section")
|
||||||
|
or die "Failed to read directory $Slic3r::GUI::datadir/$section (errno: $!)\n";
|
||||||
foreach my $file (grep /\.ini$/i, readdir $dh) {
|
foreach my $file (grep /\.ini$/i, readdir $dh) {
|
||||||
my $name = basename($file);
|
my $name = basename($file);
|
||||||
$name =~ s/\.ini$//;
|
$name =~ s/\.ini$//;
|
||||||
|
@ -77,7 +77,7 @@ sub _init_tabpanel {
|
|||||||
my $simple_config;
|
my $simple_config;
|
||||||
if ($self->{mode} eq 'simple') {
|
if ($self->{mode} eq 'simple') {
|
||||||
$simple_config = Slic3r::Config->load("$Slic3r::GUI::datadir/simple.ini")
|
$simple_config = Slic3r::Config->load("$Slic3r::GUI::datadir/simple.ini")
|
||||||
if -e "$Slic3r::GUI::datadir/simple.ini";
|
if -e Slic3r::encode_path("$Slic3r::GUI::datadir/simple.ini");
|
||||||
}
|
}
|
||||||
|
|
||||||
my $class_prefix = $self->{mode} eq 'simple' ? "Slic3r::GUI::SimpleTab::" : "Slic3r::GUI::Tab::";
|
my $class_prefix = $self->{mode} eq 'simple' ? "Slic3r::GUI::SimpleTab::" : "Slic3r::GUI::Tab::";
|
||||||
|
@ -60,6 +60,7 @@ my %cli_options = ();
|
|||||||
my @external_configs = ();
|
my @external_configs = ();
|
||||||
if ($opt{load}) {
|
if ($opt{load}) {
|
||||||
foreach my $configfile (@{$opt{load}}) {
|
foreach my $configfile (@{$opt{load}}) {
|
||||||
|
$configfile = Slic3r::decode_path($configfile);
|
||||||
if (-e $configfile) {
|
if (-e $configfile) {
|
||||||
push @external_configs, Slic3r::Config->load($configfile);
|
push @external_configs, Slic3r::Config->load($configfile);
|
||||||
} elsif (-e "$FindBin::Bin/$configfile") {
|
} elsif (-e "$FindBin::Bin/$configfile") {
|
||||||
@ -92,7 +93,7 @@ my $gui;
|
|||||||
if (!@ARGV && !$opt{save} && eval "require Slic3r::GUI; 1") {
|
if (!@ARGV && !$opt{save} && eval "require Slic3r::GUI; 1") {
|
||||||
{
|
{
|
||||||
no warnings 'once';
|
no warnings 'once';
|
||||||
$Slic3r::GUI::datadir = $opt{datadir};
|
$Slic3r::GUI::datadir = Slic3r::decode_path($opt{datadir});
|
||||||
$Slic3r::GUI::no_plater = $opt{no_plater};
|
$Slic3r::GUI::no_plater = $opt{no_plater};
|
||||||
$Slic3r::GUI::mode = $opt{gui_mode};
|
$Slic3r::GUI::mode = $opt{gui_mode};
|
||||||
$Slic3r::GUI::autosave = $opt{autosave};
|
$Slic3r::GUI::autosave = $opt{autosave};
|
||||||
@ -111,6 +112,7 @@ if (@ARGV) { # slicing from command line
|
|||||||
|
|
||||||
if ($opt{repair}) {
|
if ($opt{repair}) {
|
||||||
foreach my $file (@ARGV) {
|
foreach my $file (@ARGV) {
|
||||||
|
$file = Slic3r::decode_path($file);
|
||||||
die "Repair is currently supported only on STL files\n"
|
die "Repair is currently supported only on STL files\n"
|
||||||
if $file !~ /\.stl$/i;
|
if $file !~ /\.stl$/i;
|
||||||
|
|
||||||
@ -126,6 +128,7 @@ if (@ARGV) { # slicing from command line
|
|||||||
|
|
||||||
if ($opt{cut}) {
|
if ($opt{cut}) {
|
||||||
foreach my $file (@ARGV) {
|
foreach my $file (@ARGV) {
|
||||||
|
$file = Slic3r::decode_path($file);
|
||||||
my $model = Slic3r::Model->read_from_file($file);
|
my $model = Slic3r::Model->read_from_file($file);
|
||||||
$model->add_default_instances;
|
$model->add_default_instances;
|
||||||
my $mesh = $model->mesh;
|
my $mesh = $model->mesh;
|
||||||
@ -145,6 +148,7 @@ if (@ARGV) { # slicing from command line
|
|||||||
|
|
||||||
if ($opt{split}) {
|
if ($opt{split}) {
|
||||||
foreach my $file (@ARGV) {
|
foreach my $file (@ARGV) {
|
||||||
|
$file = Slic3r::decode_path($file);
|
||||||
my $model = Slic3r::Model->read_from_file($file);
|
my $model = Slic3r::Model->read_from_file($file);
|
||||||
$model->add_default_instances;
|
$model->add_default_instances;
|
||||||
my $mesh = $model->mesh;
|
my $mesh = $model->mesh;
|
||||||
@ -161,6 +165,7 @@ if (@ARGV) { # slicing from command line
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (my $input_file = shift @ARGV) {
|
while (my $input_file = shift @ARGV) {
|
||||||
|
$input_file = Slic3r::decode_path($input_file);
|
||||||
my $model;
|
my $model;
|
||||||
if ($opt{merge}) {
|
if ($opt{merge}) {
|
||||||
my @models = map Slic3r::Model->read_from_file($_), $input_file, (splice @ARGV, 0);
|
my @models = map Slic3r::Model->read_from_file($_), $input_file, (splice @ARGV, 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user