#!/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;
    }
}

