From 79364908545806a2e80af2e511bb9982df9c7306 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Sun, 5 Jul 2009 01:06:47 +0000 Subject: postaction fileassocs: we work now in three modes depending on the setting of option("fileassocs"): - == 0 : do not fiddle with fileassocs (but still add/remove filetype!) - == 1 : do only add/remove if it is the one we created - == 2 : always recreate the the fileassocs TLConfig.pm: chnage the type of the fileassoc parameter to n:0..2 git-svn-id: svn://tug.org/texlive/trunk@14103 c570f23f-e606-0410-a88d-b1316a301751 --- Master/tlpkg/TeXLive/TLConfig.pm | 2 +- Master/tlpkg/TeXLive/TLUtils.pm | 10 ++-- Master/tlpkg/TeXLive/TLWinGoo.pm | 116 +++++++++++++++++++++++++++++++++------ 3 files changed, 104 insertions(+), 24 deletions(-) (limited to 'Master') diff --git a/Master/tlpkg/TeXLive/TLConfig.pm b/Master/tlpkg/TeXLive/TLConfig.pm index 536cbc33a50..8afef78ce5b 100644 --- a/Master/tlpkg/TeXLive/TLConfig.pm +++ b/Master/tlpkg/TeXLive/TLConfig.pm @@ -135,7 +135,7 @@ our %TLPDBOptionType = ( "location" => "u", "create_formats" => "b", "desktop_integration" => "b", - "file_assocs" => "b", + "file_assocs" => "n:0..2", "post_code" => "b", "sys_bin" => "p", "sys_info" => "p", diff --git a/Master/tlpkg/TeXLive/TLUtils.pm b/Master/tlpkg/TeXLive/TLUtils.pm index d39dd00c682..54650559440 100644 --- a/Master/tlpkg/TeXLive/TLUtils.pm +++ b/Master/tlpkg/TeXLive/TLUtils.pm @@ -1400,8 +1400,8 @@ sub do_postaction { next unless $do_fileassocs; $ret &&= _do_postaction_filetype($how, $tlpobj, $1); } elsif ($pa =~ m/\s*fileassoc\s+(.*)\s*$/) { - next unless $do_fileassocs; - $ret &&= _do_postaction_fileassoc($how, $tlpobj, $1); + $ret &&= _do_postaction_fileassoc($how, $do_fileassocs, $tlpobj, $1); + next; } elsif ($pa =~ m/\s*script\s+(.*)\s*$/) { next unless $do_script; $ret &&= _do_postaction_script($how, $tlpobj, $1); @@ -1415,7 +1415,7 @@ sub do_postaction { } sub _do_postaction_fileassoc { - my ($how, $tlpobj, $pa) = @_; + my ($how, $mode, $tlpobj, $pa) = @_; return 1 unless win32(); my ($errors, %keyval) = parse_into_keywords($pa, qw/extension filetype/); @@ -1442,9 +1442,9 @@ sub _do_postaction_fileassoc { &log("postaction $how fileassoc for " . $tlpobj->name . ": $extension, $filetype\n"); if ($how eq "install") { - TeXLive::TLWinGoo::register_extension($extension, $filetype); + TeXLive::TLWinGoo::register_extension($mode, $extension, $filetype); } elsif ($how eq "remove") { - TeXLive::TLWinGoo::unregister_extension($extension); + TeXLive::TLWinGoo::unregister_extension($mode, $extension, $filetype); } else { tlwarn("Unknown mode $how\n"); return 0; diff --git a/Master/tlpkg/TeXLive/TLWinGoo.pm b/Master/tlpkg/TeXLive/TLWinGoo.pm index 580df89c8e9..1bb81135496 100644 --- a/Master/tlpkg/TeXLive/TLWinGoo.pm +++ b/Master/tlpkg/TeXLive/TLWinGoo.pm @@ -539,17 +539,25 @@ sub reg_delete_recurse { =pod -=item C +=item C Add registry entry to associate $extension with $file_type. Slashes are flipped where necessary. +If $mode is 0, nothing is actually done. If $mode is 1, only not-present +keys of keys that are matching the given key are (re)created. If $mode +is 2 then keys are (re)created in any case. + =cut sub register_extension { + my $mode = shift; + return if ($mode == 0); + my $extension = shift; $extension = '.'.$extension unless $extension =~ /^\./; # ensure leading dot $extension = uc($extension); + my $file_type = shift; debug("Linking $extension to $file_type\n"); my ($classes_key, $k); @@ -558,50 +566,115 @@ sub register_extension { if ($is_admin) { $classes_key = $Registry -> Open("LMachine/Software/Classes/", {Access => KEY_ALL_ACCESS()}) or die "Cannot open classpath"; - $k = $classes_key->CreateKey($extension); - $k -> ArrayValues(0); - $k -> {"/"} = $file_type; - # delete possibly conflicting value from HKCU/software - $classes_key = $Registry -> Open("CUser/Software/Classes/", - {Access => KEY_ALL_ACCESS()}); - delete $classes_key -> {$extension}; } else { $classes_key = $Registry -> Open("CUser/Software/Classes/", {Access => KEY_ALL_ACCESS()}); + } + + + my $do_create_key = 0; + + if ($mode == 1) { + if (defined($classes_key->{$extension})) { + if (defined($classes_key->{$extension}->{'/'})) { + if ($classes_key->{$extension}->{'/'} eq $file_type) { + debug("register_extension: already same key $extension $file_type present, recreate it\n"); + $do_create_key = 1; + } else { + debug("register_extension: old foreign key" . $classes_key->{$extension}->{'/'} . " found, not changing\n"); + } + } + } else { + debug("register_extension: old key $extension not found, recreating it\n"); + $do_create_key = 1; + } + } elsif ($mode == 2) { + $do_create_key = 1; + } else { + die "Unknown mode $mode for register_extension"; + } + + if ($do_create_key) { $k = $classes_key->CreateKey($extension); $k -> ArrayValues(0); $k -> {"/"} = $file_type; + if (admin()) { + # delete possibly conflicting value from HKCU/software + $classes_key = $Registry -> Open("CUser/Software/Classes/", + {Access => KEY_ALL_ACCESS()}); + delete $classes_key -> {$extension}; + } } } =pod -=item C +=item C Reversal of register_extension. =cut sub unregister_extension { + my $mode = shift; + return if ($mode == 0); + # we don't error check; we just do the best we can. my $extension = shift; + my $filetype = shift; $extension = '.'.$extension unless $extension =~ /^\./; # ensure leading dot $extension = uc($extension); debug("unregistering $extension\n"); - my $classes_key = $Registry -> Open("CUser/Software/Classes/", + + my $classes_key; + + my $HKLMclasses_key = $Registry -> Open("LMachine/Software/Classes/", {Access => KEY_ALL_ACCESS()}); - if ($classes_key) { - reg_delete_recurse ($classes_key, $extension."/"); + my $HKCUclasses_key = $Registry -> Open("CUser/Software/Classes/", + {Access => KEY_ALL_ACCESS()}); + if (admin()) { + $classes_key = $HKLMclasses_key; } else { - debug("Cannot open HKCU classes for write\n"); + $classes_key = $HKCUclasses_key; } - if ($is_admin) { - $classes_key = $Registry -> Open("LMachine/Software/Classes/", - {Access => KEY_ALL_ACCESS()}); - if ($classes_key) { + if ($classes_key) { + my $do_remove_key = 0; + if ($mode == 1) { + if (defined($classes_key->{$extension})) { + if (defined($classes_key->{$extension}->{'/'})) { + if ($classes_key->{$extension}->{'/'} eq $filetype) { + debug("unregister_extension: correct key/value $extension/$filetype found, removing\n"); + $do_remove_key = 1; + } else { + debug("unregister_extension: foreign value for $extension found, keeping it\n"); + } + } else { + $do_remove_key = 1; + } + } else { + # nothing necessary, this key wasn't found + } + } elsif ($mode == 2) { + $do_remove_key = 1; + } else { + die "Unknown mode $mode for unregister_extension"; + } + + if ($do_remove_key) { reg_delete_recurse ($classes_key, $extension."/"); + if (admin()) { + if ($HKCUclasses_key) { + reg_delete_recurse ($HKCUclasses_key, $extension."/"); + } else { + debug("Cannot open HKCU classes for write\n"); + } + } + } + } else { + if (admin()) { + debug("Cannot open HKLM classes for write\n"); } else { - debug("Cannot open HKLM classes for write\n"); + debug("Cannot open HKCU classes for write\n"); } } } @@ -1016,3 +1089,10 @@ sub unregister_uninstaller { # needs a terminal 1 for require to succeed! 1; + +### Local Variables: +### perl-indent-level: 2 +### tab-width: 2 +### indent-tabs-mode: nil +### End: +# vim:set tabstop=2 expandtab: # -- cgit v1.2.3