#!perl -w
##############################################################################
use strict;
use Win32::Registry;
##############################################################################

my $usage = '
usage:
  shortcuts.pl [on|off] [{lnk|pif|cmd|url|doc|shs}[ {}...]]
';

my %Sh =
( lnkfile                => { x => 'lnk', a => 'l'  , b => 'link' }
, piffile                => { x => 'pif', a => 'p'                }
, SHCmdFile              => { x => 'scf', a => 'cmd'              }
, InternetShortcut       => { x => 'url', a => 'web', b => 'www'  }
, DocShortcut            => { x => 'shb', a => 'doc'              }
, ShellScrap             => { x => 'shs', a => 'shl', b => 'shell'}
, WSHFile                => { x => 'WSH'                          }
, ConferenceLink         => { x => 'cnf'                          }
,'Application.Reference' => { x => 'appref-ms'                    }
);

my ($op, $all, $o, $s, $p, $v) = ("show", 1);

##############################################################################

for $o ( @ARGV )
{
   if    ( $o =~ m!^-?on$!io             ) { $op = "on" ; }
   elsif ( $o eq '+'                     ) { $op = "on" ; }
   elsif ( $o =~ m!^-?off$!io            ) { $op = "off"; }
   elsif ( $o eq '-'                     ) { $op = "off"; }
   else
   {
      $o = lc($o);
      while ( $o =~ m!^[-.]!o ) { $o = substr($o,1); }
      die $usage unless $o;
      for my $s ( keys %Sh )
      {
         my ($x, $a, $b) = ( $Sh{$s}->{x}, $Sh{$s}->{a}, $Sh{$s}->{b} ); 
         if ( lc($s) eq $o || lc($x) eq $o || lc($a) eq $o || lc($b) eq $o )
         {
            $o = undef; $all = 0; $Sh{$s}->{o} = 1; last;
         }
      }
      die $usage if $o;
   }
}

##############################################################################

print "shortcut arrows:\n";

for $s ( sort {lc($a) cmp lc($b) } keys %Sh )
{
   next if ( !$all && !$Sh{$s}->{o} );

   $::HKEY_CLASSES_ROOT->Open($s, $p) || next;
   print sprintf("  .%-9s %-22s ", $Sh{$s}->{x}, $s);

   if ( $op eq "show" ) {
      $v = undef;
      $p->QueryValueEx("IsShortcut", ::REG_SZ, $v);
      print "= ", defined($v) ? "on" : "off";
   }
   elsif ( $op eq "off" ) {
      $p->DeleteValue("IsShortcut");
      print "- ok";
   }
   elsif ( $op eq "on" ) {
      $v = $p->SetValueEx("IsShortcut", "", ::REG_SZ, "");
      print "+ ", $v ? "ok" : "failed";
   }

   print "\n";
   $p->Close();
}

##############################################################################
1;
