# *************************************************************
#
#  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.
#
# *************************************************************
package ConvwatchHelper;

use English;
use warnings;
use strict;
use Cwd;
use Cwd 'chdir';

use CallExternals;
use stringhelper;
use filehelper;
use oshelper;
use loghelper;

BEGIN {
    use Exporter   ();
    our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);

    $VERSION     = 1.00;
    # if using RCS/CVS, this may be preferred
    $VERSION = do { my @r = (q$Revision: 1.39 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; # must be all one line, for MakeMaker
    @ISA         = qw(Exporter);
    @EXPORT      = qw(&getQADEVToolsPath &setProjectRoot &getProjectRoot &checkForStop &getSofficeExe &setINPATH);
    %EXPORT_TAGS = ( );     # eg: TAG => [ qw!name1 name2! ],
    # your exported package globals go here,
    # as well as any optionally exported functions
    @EXPORT_OK   = ( ); # qw($Var1 %Hashit &func3);
}

# ------------------------------------------------------------------------------
our $tempprefix;

# sub getTempDir()
# {
#     my $sTempDir;
#     if (! $tempprefix)
#     {
#         if ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
#         {
#             # $tempdir = "C:/gfxcmp/temp";
#             $tempprefix = "//so-gfxcmp-lin/gfxcmp-data/wntmsci/temp";
#         }
#         elsif ($OSNAME eq "linux")
#         {
#             $tempprefix = "/net/so-gfxcmp-lin/export/gfxcmp/data/unxlngi/temp";
#         }
#         elsif ($OSNAME eq "solaris")
#         {
#             # $tempdir = "/space/gfxcmp/temp";
#             $tempprefix = "/net/so-gfxcmp-lin/export/gfxcmp/data/unxsoli/temp";
#         }
#         else
#         {
#             print "Error: This environment isn't supported yet.\n";
#             exit(1);
#         }
#     }
#     $sTempDir = $tempprefix;
#     return $sTempDir;
# }
# ------------------------------------------------------------------------------
# in filehelper
# our $programprefix;
#
# sub getProgramPrefix($)
# {
#     my $sDBDistinct = shift;
#
#     my $sProgramPrefix;
#     if (! $programprefix)
#     {
#         if ($OSNAME eq "MSWin32")
#         {
#             # $programprefix = "C:/gfxcmp/programs";
#             $programprefix = "C:/gp";
#         }
#         elsif ($OSNAME eq "linux")
#         {
#             $programprefix = "/space/gfxcmp/programs";
#         }
#         elsif ($OSNAME eq "solaris")
#         {
#             $programprefix = "/space/gfxcmp/programs";
#         }
#         else
#         {
#             print "Error: This environment isn't supported yet.\n";
#             exit(1);
#         }
#     }
#     $sProgramPrefix = appendPath($programprefix, substr($sDBDistinct, 0, 19));
#     return $sProgramPrefix;
# }
# ------------------------------------------------------------------------------
sub getQADEVToolsPath()
{
    my $sNewPath = appendPath(getToolsPrefix(), "qadev");
    $sNewPath = appendPath($sNewPath, "scripts");
    $sNewPath = appendPath($sNewPath, "gfxcmp_ui");
    return $sNewPath;
}

# in filehelper
# our $toolsprefix;
#
# sub getToolsPrefix()
# {
#     my $sToolsPrefix;
#     if (! $toolsprefix)
#     {
#         if ($OSNAME eq "MSWin32")
#         {
#             $toolsprefix = "C:/gfxcmp/tools";
#         }
#         elsif ($OSNAME eq "linux")
#         {
#             $toolsprefix = "/space/gfxcmp/tools";
#         }
#         elsif ($OSNAME eq "solaris")
#         {
#             $toolsprefix = "/space/gfxcmp/tools";
#         }
#         else
#         {
#             print "Error: This environment isn't supported yet.\n";
#             exit(1);
#         }
#     }
#     $sToolsPrefix = $toolsprefix;
#     return $sToolsPrefix;
# }
# ------------------------------------------------------------------------------
our $sProjectRoot;
sub setProjectRoot($)
{
    $sProjectRoot = shift;
    log_print "\$sProjectRoot := $sProjectRoot\n";
}
sub getProjectRoot()
{
    if ($sProjectRoot)
    {
        return $sProjectRoot;
    }
    die "setProjectRoot(PATH) not set.\n";
}

our $sINPATH;
sub setINPATH($)
{
    $sINPATH = shift;
}
sub getINPATH()
{
    if ($sINPATH)
    {
        return $sINPATH;
    }
    die "setINPATH(PATH) not set.\n";
}
our $dataprefix;

# sub getDataPrefix()
# {
#     my $sDataPrefix;
#     if (! $dataprefix)
#     {
#         if ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
#         {
#             # $dataprefix = "C:/gfxcmp/data";
#             # $dataprefix = "//so-gfxcmp-lin/gfxcmp-data/wntmsci";
#             $dataprefix = getProjectRoot();
#         }
#         elsif ($OSNAME eq "linux")
#         {
#             # $dataprefix = "/space/gfxcmp/data";
#             # $dataprefix = "/net/so-gfxcmp-lin/export/gfxcmp/data/unxlngi";
#             $dataprefix = getProjectRoot();
#         }
#         elsif ($OSNAME eq "solaris")
#         {
#             # $dataprefix = "/space/gfxcmp/data";
#             # $dataprefix = "/net/so-gfxcmp-lin/export/gfxcmp/data/unxsoli";
#             $dataprefix = getProjectRoot();
#         }
#         else
#         {
#             print "Error: This environment isn't supported yet.\n";
#             exit(1);
#         }
#         $dataprefix = appendPath(getProjectRoot(), getINPATH());
#         $dataprefix = appendPath($dataprefix, "data");
#     }
#     $sDataPrefix = $dataprefix;
#     return $sDataPrefix;
# }

# ------------------------------------------------------------------------------

# sub _shortsleep($)
# {
# #    sleep 1;
#     select(undef, undef, undef, 0.333);
# }
#
# sub _waitInSeconds($)
# {
#     my $nLength = shift;
#     my $i;
#     my $j;
#
#     for ($j=0;$j<$nLength;$j++)
#     {
#         for ($i=0;$i<$j;$i++)
#         {
#             print ".";
#         }
#         for ($i=$j;$i<$nLength;$i++)
#         {
#             print " ";
#         }
#         _shortsleep( 1 );
#         print "\r";
#     }
#
#     for ($j=0;$j<=$nLength;$j++)
#     {
#         for ($i=0;$i<$j;$i++)
#         {
#             print " ";
#         }
#         for ($i=$j;$i<$nLength;$i++)
#         {
#             print ".";
#         }
#         _shortsleep( 1 );
#         print "\r";
#     }
# }
#
# sub wait30seconds()
# {
#     _waitInSeconds(20);
#     _waitInSeconds(20);
# }

sub checkForStop($)
{
    my $sStopFilename = shift;
    my $sStopFilePath;
    if ($OSNAME eq "MSWin32")
    {
        $sStopFilePath = "C:/temp/";
    }
    else
    {
        $sStopFilePath = "/tmp/";
    }
    my $sStopFile = $sStopFilePath . $sStopFilename;
    if ( -e "$sStopFile" )
    {
        print "Stop of Convwatch tool forced!\n";
        unlink($sStopFile);
        exit(2);
    }
}

# ----------------------------------------------------------------------------------------
sub readdirectory($$$);

sub readdirectory($$$)
{
    my $startdir = shift;
    my $sUserParameter  = shift;
    my $hook     = shift;

    my $myfile;

    local *DIR;
    chdir $startdir;
    cwd();

    my $nCountFiles = 0;
    if (opendir (DIR, $startdir))           # Directory oeffnen
    {
        while ($myfile = readdir(DIR))
        {                                  # ein filename holen
            #if (! -l $myfile)              # not a link
            #{
            if (-d $myfile ) # is a directory
            {
                if ( -l $myfile)
                {
                    next;
                }
                # if ( $myfile eq "help" ||
                #      $myfile eq "presets" ||
                #      $myfile eq "registry" ||
                #      $myfile eq "uno_packages" ||
                #      $myfile eq "lib" ||
                #      $myfile eq "user_tree" )
                # {
                #     next;
                # }

                if ($myfile ne "." && $myfile ne "..")
                {
                    my $sNewStartDir = appendPath($startdir, $myfile);    # neuen Directorystring erstellen
                    # if ($sNewStartDir =~ "^\/proc" ||
                    #     $sNewStartDir =~ "^\/dev" ||
                    #     $sNewStartDir =~ "^\/udev" ||
                    #     $sNewStartDir =~ "lost+found" )
                    # {
                    #     next;
                    # }
                    # my $sNewSUserParameter  = $sUserParameter . $myfile ."/";
                    # do a recursive call
                    # $nCountFiles++;
                    my $nFileCount = readdirectory($sNewStartDir, $sUserParameter, $hook);
                    # workOnDir($sNewDir, $nFileCount);
                    $nCountFiles += $nFileCount;

                    chdir ($startdir);                      # zurueckwechseln.
                    cwd();
                }
            }
            else
            {
                # File must exist, be a regular file and must not be the $onlyOnFile
                if (-f $myfile)
                {
                    # print STDERR " $startdir" . "$myfile\n";
                    $nCountFiles++;
                    # workOnFile($startdir, $myfile, $destdir);
                    $hook->($startdir, $myfile, $sUserParameter);
                }
            }
            #}
            #else
            #{
            #    print STDERR "linked file: $dir/$myfile\n";
            #}
        }
        closedir(DIR);
    }
    else
    {
        print STDERR "could not open $startdir\n";
    }
    return $nCountFiles;
}

our $lcl_sSofficeBinPath;
our $lcl_sSofficeBinName;

sub searchSofficeBin($$$)
{
    my $currentDir = shift;
    my $currentFile = shift;
    my $sUserParameter = shift;

    if ($currentFile eq $sUserParameter)
    {
        my $sSourceFilename;
        $sSourceFilename = appendPath($currentDir, $currentFile);

        if ( -e "$sSourceFilename" )
        {
            $lcl_sSofficeBinPath = $currentDir;
            $lcl_sSofficeBinName = $currentFile;
        }
    }
}

# our $lcl_sUnoPkgPath;
#
# sub searchUnoPkgBin($$$)
# {
#     my $currentDir = shift;
#     my $currentFile = shift;
#     my $sUserParameter = shift;
#
#     if ($currentFile eq $sUserParameter)
#     {
#         my $sSourceFilename;
#         $sSourceFilename = appendPath($currentDir, $currentFile);
#         if ( -e "$sSourceFilename" )
#         {
#             $lcl_sUnoPkgPath = $currentDir;
#         }
#     }
# }

# our $lcl_sJARPath;

# sub searchJARFile($$$)
# {
#     my $currentDir = shift;
#     my $currentFile = shift;
#     my $sUserParameter = shift;
#
#     if ($currentFile eq $sUserParameter)
#     {
#         my $sSourceFilename;
#         $sSourceFilename = appendPath($currentDir, $currentFile);
#         if ( -e "$sSourceFilename" )
#         {
#             $lcl_sJARPath = $currentDir;
#         }
#     }
# }

# return the PATH, where the file was found
# sub searchForJAR($$)
# {
#     my $sPathToInstallOffice = shift;
#     my $sJARFileName = shift;
#
#     my $sCurrentPath = cwd();
#
#     $lcl_sJARPath = "";
#     readdirectory(${sPathToInstallOffice}, ${sJARFileName}, \&searchJARFile);
#
#     chdir $sCurrentPath;
#     cwd();
#
#     return $lcl_sJARPath;
# }

# sub getUnoPkg($)
# {
#     my $sPathToInstallOffice = shift;
#
#     my $sUnoPkgName = "unopkg.bin";
#     if (isWindowsEnvironment())
#     {
#         $sUnoPkgName = "unopkg.exe";
#     }
#
#     my $sCurrentPath = cwd();
#
#     $lcl_sUnoPkgPath = "";
#     readdirectory(${sPathToInstallOffice}, ${sUnoPkgName}, \&searchUnoPkgBin);
#
#     chdir $sCurrentPath;
#     cwd();
#
#     return ($lcl_sUnoPkgPath, $sUnoPkgName);
# }

sub getSofficeExe($)
{
    my $sPathToOffice = shift;

    my $sSofficeExeName = "soffice";
    if (isWindowsEnvironment())
    {
        $sSofficeExeName = "soffice.exe";
    }

    my $sCurrentPath = cwd();

    $lcl_sSofficeBinPath = "";
    $lcl_sSofficeBinName = "";
    readdirectory(${sPathToOffice}, ${sSofficeExeName}, \&searchSofficeBin);

    chdir $sCurrentPath;
    cwd();

    return ($lcl_sSofficeBinPath, $lcl_sSofficeBinName);
}

# sub checkOfficeAlreadyInstalled($)
# {
#     my $sOfficePath = shift;
#
#     my $sCurrentPath = cwd();
#
#     $lcl_sSofficeBinPath = "";
#     my $sOldOfficePath = appendPath($sOfficePath, "program");
#     if ( -d "$sOldOfficePath" )
#     {
#         $sOldOfficePath = appendPath($sOldOfficePath, "soffice.bin");
#         if ( -e $sOldOfficePath )
#         {
#             return 1;
#         }
#     }
#     else
#     {
#         if (isWindowsEnvironment())
#         {
#             my $sThreeLayerOffice = appendPath($sOfficePath, "Sun");
#             $sThreeLayerOffice = appendPath($sThreeLayerOffice, "StarOffice 9");
#             $sThreeLayerOffice = appendPath($sThreeLayerOffice, "program");
#             $sThreeLayerOffice = appendPath($sThreeLayerOffice, "soffice.bin");
#
#             if ( -e "$sThreeLayerOffice" )
#             {
#                 return 1;
#             }
#         }
#         else
#         {
#             my $sThreeLayerOffice = appendPath($sOfficePath, "staroffice9");
#             $sThreeLayerOffice = appendPath($sThreeLayerOffice, "program");
#             $sThreeLayerOffice = appendPath($sThreeLayerOffice, "soffice.bin");
#             if ( -e "$sThreeLayerOffice" )
#             {
#                 return 1;
#             }
#         }
#     }
#
#     # soffice.bin not found in fast path
#     readdirectory($sOfficePath, "soffice.bin", \&searchSofficeBin);
#     chdir $sCurrentPath;
#     cwd();
#
#     if ( $lcl_sSofficeBinPath ne "" )
#     {
#         return 1;
#     }
#     return 0;
#     # this is the old check
#     # my $sOfficePathCheck = appendPath(${sPathToInstallOffice}, "program");
#     # $sOfficePathCheck = appendPath($sOfficePathCheck, "soffice.bin");
#     # if ( -e $sOfficePathCheck )
#     # {
#     #     return 1;
#     # }
#     #
#     # # check path system of tree layer office
#     # if ( isWindowsEnvironment() )
#     # {
#     #     $sOfficePathCheck = appendPath(${sPathToInstallOffice}, "Sun");
#     #     if ( ! -e $sOfficePathCheck)
#     #     {
#     #         # could be an OpenOffice.org
#     #         return 0;
#     #     }
#     #     else
#     #     {
#     #
#     #         $sOfficePathCheck = appendPath($sOfficePathCheck, "StarOffice 9");
#     #         $sOfficePathCheck = appendPath($sOfficePathCheck, "program");
#     #         $sOfficePathCheck = appendPath($sOfficePathCheck, "soffice.bin");
#     #         if ( -e $sOfficePathCheck )
#     #         {
#     #             return 1;
#     #         }
#     #         print "Error: There exist no Office, maybe an unsupported version?\n";
#     #     }
#     # }
#     # elsif ( isUnixEnvironment() )
#     # {
#     #     $sOfficePathCheck = appendPath(${sPathToInstallOffice}, "staroffice9");
#     #     $sOfficePathCheck = appendPath($sOfficePathCheck, "staroffice9");
#     #     $sOfficePathCheck = appendPath($sOfficePathCheck, "program");
#     #     $sOfficePathCheck = appendPath($sOfficePathCheck, "soffice.bin");
#     #     if ( -e $sOfficePathCheck )
#     #     {
#     #         return 1;
#     #     }
#     #     print "Error: There exist no Office, maybe an unsupported version?\n";
#     # }
#     # else
#     # {
#     #     print "Error: There exist no Office, maybe an unsupported version?\n";
#     # }
#     # return 0;
# }

1;
