# *************************************************************
#  
#  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;
