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

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;
	}
    }
    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;
	}
    }
    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");
    print cygpath ($dir, 'w', $output_format);
}

sub print_jdk_dir()
{
    my $dir =
	  reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.7/JavaHome") ||
	  reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.6/JavaHome") ||
	  reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.5/JavaHome") ||
	  reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.4/JavaHome") ||
	  reg_get_value ("HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java\ Development\ Kit/1.3/JavaHome");
    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 (0) {
    } 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;
    }
}

