#!/usr/bin/perl -w
# *************************************************************
#  
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#  
#    http://www.apache.org/licenses/LICENSE-2.0
#  
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
#  
# *************************************************************

use File::Copy;

my $output_format = 'u';
my $aoo32OnWin64 = 0;


sub reg_get_value($)
{
    # it is believed that the registry moves keys around
    # depending on OS version, this will de-mangle that
    my $key = shift;
    my $fhandle;
    my $value;

    open ($fhandle, "/proc/registry/$key") || return;
    # reg keys have 0x00 0x5c at the end
    $value = (split /\0/, <$fhandle>)[0];
    close ($fhandle);

    if ( defined $value ) {
        chomp ($value);
        $value =~ s|\r\n||;
#    print "Value '$value' at '$key'\n";
    }

    return $value;
}

sub reg_find_key($)
{
    # it is believed that the registry moves keys around
    # depending on OS version, this will de-mangle that
    my $key = shift;
    $key =~ s| |\\ |;
    $key = `cd /proc/registry/ ; ls $key`;

    return $key;
}

sub print_syntax()
{
    print "oowintool [option] ...\n";
    print " encoding options\n";  
    print "   -w   - windows form\n";
    print "   -u   - unix form (default)\n";
    print " commands:\n";
    print "   --msvc-ver              - dump version of MSVC eg. 6.0\n";
    print "   --msvc-copy-dlls <dest> - copy msvc[pr]??.dlls into <dest>/msvcp??/\n";
    print "   --msvc-productdir       - dump productdir\n";
    print "   --msvs-productdir       - dump productdir\n";
    print "   --dotnetsdk-dir         - dump .Net SDK path\n";
    print "   --csc-compilerdir       - dump .Net SDK compiler path\n";
    print "   --psdk-home             - dump psdk install dir\n";
    print "   --jdk-home              - dump the jdk install dir\n";
    print "   --nsis-dir              - dump NSIS path\n";
    print "   --help                  - this message\n";
}

sub cygpath($$$)
{
    my ($path, $input_format, $format) = @_;

    return $path if ( ! defined $path );
    # Strip trailing path separators
    if ($input_format eq 'u') {
	$path =~ s|/*\s*$||;
    } else {
	$path =~ s|\\*\s*$||;
    }

    # 'Unterminated quoted string errors' from 'ash' when 
    # forking cygpath  so - reimplement cygpath in perl [ gack ]
    if ($format eq 'u' && $input_format eq 'w') {
	$path =~ s|\\|/|g;
	$path =~ s|([a-zA-Z]):/|/cygdrive/$1/|g;
    }
    elsif ($format eq 'w' && $input_format eq 'u') {
	$path =~ s|/cygdrive/([a-zA-Z])/|/$1/|g;
	$path =~ s|/|\\|g;
    }

    return $path;
}

sub print_path($$)
{
    my ($path, $unix) = @_;

    $path = cygpath ($path, $unix, $output_format);
    
    print $path;
}

sub print_psdk_home()
{
    my ($value, $key);
    $value = reg_get_value ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SDKs/Windows/v6.1/InstallationFolder');
    if (!defined $value)
    {
        $value = reg_get_value ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SDKs/Windows/CurrentInstallFolder');
    }
    if (!defined $value)
    {
	    $value = reg_get_value ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MicrosoftSDK/Directories/Install Dir');
    }
    if (!defined $value)
    {
	    $key = reg_find_key ('HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MicrosoftSDK/InstalledSDKs/*/Install Dir');
	    $value = reg_get_value ($key);
    }
    if (!defined $value)
    {
        my $dir = cygpath (find_msvc()->{'product_dir'}, 'w', $output_format);
		$value = `/bin/find "$dir" -iname platformsdk | head -n 1`;
    }

    defined $value || die "psdk not found";

    print cygpath ($value, 'w', $output_format);
}

my %msvc_net_2003 = (
    'ver' => '7.1',
    'key' => 'Microsoft/VisualStudio/7.1/Setup/VC/ProductDir',
    'dll_path' => '../Visual Studio .NET Professional 2003 - English',
    'dll_suffix' => '71'
);
my %msvs_net_2003 = (
    'ver' => '7.1',
    'key' => 'Microsoft/VisualStudio/7.1/Setup/VS/ProductDir',
    'dll_path' => 'Visual Studio .NET Professional 2003 - English',
    'dll_suffix' => '71'
);
my %msvs_net_2003_ea = (
    'ver' => '7.1',
    'key' => 'Microsoft/VisualStudio/7.1/Setup/VS/ProductDir',
    'dll_path' => 'Visual Studio .NET Enterprise Architect 2003 - English', # testme ...
    'dll_suffix' => '71'
);
my %msvs_express_2005 = (
    'ver' => '8.0',
    'key' => 'Microsoft/VCExpress/8.0/Setup/VS/ProductDir',
    'dll_path' => '../SDK/v2.0/Bin',
    'dll_suffix' => '80'
);
my %msvc_express_2005 = (
    'ver' => '8.0',
    'key' => 'Microsoft/VCExpress/8.0/Setup/VC/ProductDir',
    'dll_path' => '../SDK/v2.0/Bin',
    'dll_suffix' => '80'
);
my %msvs_2005 = (
    'ver' => '8.0',
    'key' => 'Microsoft/VisualStudio/8.0/Setup/VS/ProductDir',
    'dll_path' => 'Visual Studio .NET Professional 2005 - English',
    'dll_suffix' => '80'
);
my %msvc_2005 = (
    'ver' => '8.0',
    'key' => 'Microsoft/VisualStudio/8.0/Setup/VC/ProductDir',
    'dll_path' => '../SDK/v2.0/Bin',
    'dll_suffix' => '80'
);
my %msvs_2008 = (
    'ver' => '9.0',
    'key' => 'Microsoft/VisualStudio/9.0/Setup/VS/ProductDir',
    'dll_path' => 'VC/redist/x86/Microsoft.VC90.CRT',
    'dll_suffix' => '90'
);
my %msvc_2008 = (
    'ver' => '9.0',
    'key' => 'Microsoft/VisualStudio/9.0/Setup/VC/ProductDir',
    'dll_path' => 'redist/x86/Microsoft.VC90.CRT',
    'dll_suffix' => '90'
);
my %msvs_express_2008 = (
    'ver' => '9.0',
    'key' => 'Microsoft/VCExpress/9.0/Setup/VS/ProductDir',
    'dll_path' => 'VC/redist/x86/Microsoft.VC90.CRT',
    'dll_suffix' => '90'
);
my %msvc_express_2008 = (
    'ver' => '9.0',
    'key' => 'Microsoft/VCExpress/9.0/Setup/VC/ProductDir',
    'dll_path' => 'redist/x86/Microsoft.VC90.CRT',
    'dll_suffix' => '90'
);

sub find_msvs()
{
    my @ms_versions = ( \%msvs_2008, \%msvs_express_2008, \%msvs_2005, \%msvs_express_2005, \%msvs_net_2003_ea, \%msvs_net_2003 );

    for $ver (@ms_versions)
    {
	my $install = reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/" . $ver->{'key'});
	if (defined $install && $install ne '') {
	    $ver->{'product_dir'} = $install;
	    return $ver;
	}
	$install = reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/" . $ver->{'key'});
	if (defined $install && $install ne '') {
	    $ver->{'product_dir'} = $install;
	    return $ver;
	}
    }
    die "Can't find MS Visual Studio / VC++";
}

sub find_msvc()
{
    my @ms_versions = ( \%msvc_2008, \%msvc_express_2008, \%msvc_2005, \%msvc_express_2005, \%msvc_net_2003 );

    for $ver (@ms_versions)
    {
	my $install = reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/" . $ver->{'key'});
	if (defined $install && $install ne '') {
	    $ver->{'product_dir'} = $install;
	    return $ver;
	}
	$install = reg_get_value("HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/" . $ver->{'key'});
	if (defined $install && $install ne '') {
	    $ver->{'product_dir'} = $install;
	    return $ver;
	}
    }
    die "Can't find MS Visual Studio / VC++";
}

sub print_msvc_ver()
{
    my $ver = find_msvc();
    print $ver->{'ver'};
}

sub print_msvc_product_dir()
{
    my $ver = find_msvc();
    print cygpath ($ver->{'product_dir'}, 'w', $output_format);
}

sub print_msvs_productdir()
{
    my $ver = find_msvs();
    print cygpath ($ver->{'product_dir'}, 'w', $output_format);
}

sub print_csc_compiler_dir()
{
    my $dir = cygpath (reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/InstallRoot"), 'w', $output_format);
    my $csc_exe = `/bin/find "$dir" -iname csc.exe | grep "v2\." | head -n 1`;
    print `dirname $csc_exe`;
}

sub print_dotnetsdk_dir()
{
    my $dir = 
          reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/sdkInstallRootv1.1") ||
          reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/sdkInstallRootv2.0");
    defined $dir || exit 1;
    print cygpath ($dir, 'w', $output_format);
}

sub print_jdk_dir()
{
    my $softwareKey;
    if ($aoo32OnWin64) {
        $softwareKey = "HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/";
    }  else {
        $softwareKey = "HKEY_LOCAL_MACHINE/SOFTWARE/";
    }
    # Java 1.9 had to be different:
    my $currentVersion = reg_get_value ($softwareKey . "JavaSoft/JDK/CurrentVersion");
    if (defined $currentVersion) {
        my $newDir = reg_get_value ($softwareKey . "JavaSoft/JDK/" . $currentVersion . "/JavaHome");
        if (defined $newDir) {
            print cygpath($newDir, 'w', $output_format);
            return;
        }
    }
    my $dir =
	  reg_get_value ($softwareKey . "JavaSoft/Java\ Development\ Kit/1.8/JavaHome") ||
	  reg_get_value ($softwareKey . "JavaSoft/Java\ Development\ Kit/1.7/JavaHome") ||
	  reg_get_value ($softwareKey . "JavaSoft/Java\ Development\ Kit/1.6/JavaHome") ||
	  reg_get_value ($softwareKey . "JavaSoft/Java\ Development\ Kit/1.5/JavaHome") ||
	  reg_get_value ($softwareKey . "JavaSoft/Java\ Development\ Kit/1.4/JavaHome") ||
	  reg_get_value ($softwareKey . "JavaSoft/Java\ Development\ Kit/1.3/JavaHome");
    defined $dir || exit 1;
    print cygpath($dir, 'w', $output_format);
}

sub print_nsis_dir()
{
    my $dir = reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/NSIS/@");
    print cygpath ($dir, 'w', $output_format) if defined $dir;
}

sub copy_dll($$$)
{
    my ($src, $fname, $dest) = @_;

    -f "$src/$fname" || die "can't find $src";
    -d $dest || die "no directory $dest";

	print STDERR "Copying $src/$fname to $dest\n";
    copy ("$src/$fname", $dest) || die "copy failed: $!";
    chmod (0755, "$dest/$fname") || die "failed to set dll executable: $!";
}

sub msvc_find_version($)
{
    my $checkpath = shift;
    my $ver = find_msvc();
    my $srcdir = (cygpath ($ver->{'product_dir'}, 'w', 'u') . '/' . 
		  $ver->{$checkpath});
    -d $srcdir && return $ver;
    $ver = find_msvs();
    $srcdir = (cygpath ($ver->{'product_dir'}, 'w', 'u') . '/' . 
		  $ver->{$checkpath});
    -d $srcdir && return $ver;
    return undef;
}

sub msvc_copy_dlls($)
{
    my $dest = shift;
    my $ver = msvc_find_version('dll_path');
    defined $ver || return;
    my $srcdir = (cygpath ($ver->{'product_dir'}, 'w', 'u') . '/' . 
		  $ver->{'dll_path'});

    copy_dll ($srcdir, "msvcp" . $ver->{'dll_suffix'} . ".dll",
	      $dest . $ver->{'dll_suffix'});
    copy_dll ($srcdir, "msvcr" . $ver->{'dll_suffix'} . ".dll",
	      $dest . $ver->{'dll_suffix'});
    if ($ver->{'dll_suffix'} >= 90) {
        copy_dll ($srcdir, "msvcm" . $ver->{'dll_suffix'} . ".dll",
                  $dest . $ver->{'dll_suffix'});
        copy_dll ($srcdir, "Microsoft.VC90.CRT.manifest", $dest . $ver->{'dll_suffix'});
    }
}

if (!@ARGV) {
    print_syntax();
    exit 1;
}

my @commands = ();
my $opt;
while (@ARGV) {
    $opt = shift @ARGV;
    
    if ($opt eq '-w' || $opt eq '-u') {
	$output_format = substr($opt, 1, 1);
    } else {
	push @commands, $opt;
    }
}

while (@commands) {
    $opt = shift @commands;

    if ($opt eq '--aoo32-on-win64') {
	$aoo32OnWin64 = 1;
    } elsif ($opt eq '--msvc-ver') {
	print_msvc_ver();
    } elsif ($opt eq '--msvc-copy-dlls') {
	my $dest = shift @commands;
	defined $dest || die "copy-dlls requires a destination directory";
	msvc_copy_dlls( $dest );
    } elsif ($opt eq '--msvs-productdir') {
	print_msvs_productdir();
    } elsif ($opt eq '--msvc-productdir') {
	print_msvc_product_dir();
    } elsif ($opt eq '--dotnetsdk-dir') {
	print_dotnetsdk_dir();
    } elsif ($opt eq '--csc-compilerdir') {
	print_csc_compiler_dir();
    } elsif ($opt eq '--psdk-home') {
	print_psdk_home();
    } elsif ($opt eq '--jdk-home') {
	print_jdk_dir();
    } elsif ($opt eq '--nsis-dir') {
	print_nsis_dir();
    } elsif ($opt eq '--help' || $opt eq '/?') {
	print_syntax();
    } else {
	print "Unknown option '$opt'\n";
	print_syntax();
	exit 1;
    }
}

