⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 install.tcl

📁 windml3.0.3
💻 TCL
📖 第 1 页 / 共 4 页
字号:

proc uninstFileClose {} {
    global setupVals

    if {"$setupVals(uninstFileOpen)" == "opened"} {
        catch { close $setupVals(fInstallFile) } err
        catch { close $setupVals(fInstallInfo) } err
        catch { close $setupVals(fInstallBackup) } err
        catch { close $setupVals(fInstallResource) } err
        catch { close $setupVals(fInstallCDnumber) } err
        puts $setupVals(fSetupLog) ""
        catch { close $setupVals(fSetupLog) } err
        set setupVals(uninstFileOpen) closed
    }
}

##############################################################################
#
# uninstFileOpen - opens files for recording uninstall info.
#
# This procedure opens disk files for writing the temporary uninstall records.
# These files will be closed by calling uninstFileClose()
#
# SYNOPSIS
# uninstFileOpen
#
# PARAMETERS: N/A
#
# RETURNS: N/A
#
# ERRORS: N/A
#

set setupVals(uninstFileOpen) ""

proc uninstFileOpen {} {
    global setupVals

    if {"$setupVals(uninstFileOpen)" != "opened"} {
        set setupLog [tempDirGet]/setup.log.tmp
        set uninstFile [tempDirGet]/installFile.tmp
        set uninstResource [tempDirGet]/installResource.tmp
        set uninstCDnumber [tempDirGet]/installCDnumber.tmp
        set uninstBackup [tempDirGet]/installBackup.tmp
        set uninstInfo [tempDirGet]/installInfo.tmp

        set setupVals(fSetupLog) [open $setupLog "w"]
        set setupVals(fInstallFile) [open $uninstFile "w"]
        set setupVals(fInstallInfo) [open $uninstInfo "w"]
        set setupVals(fInstallBackup) [open $uninstBackup "w"]
        set setupVals(fInstallResource) [open $uninstResource "w"]
        set setupVals(fInstallCDnumber) [open $uninstCDnumber "w"]

        set setupVals(uninstFileOpen) opened
    }
}

##############################################################################
#
# uninstBinCopy - copies uninstall agent
#
# This procedure copies neccessary files from CDROM to the destination
# directory for the uninstall program to work.  No-op if patch installation
# is detected.
#
# SYNOPSIS
# uninstBinCopy
#
# PARAMETERS:  N/A
#
# RETURNS: N/A
#
# ERRORS: N/A
#

proc uninstBinCopy {} {
    global env

    if {[instTypeGet] == "patch"} {
        return

    } elseif {[windHostTypeGet] == "x86-win32"} {
        # all the required binary files are copied by setupCopy
        fileDup [file join [cdromRootDirGet] RESOURCE BITMAPS UNINST.BMP] \
                [file join [uninstHomeDirGet] UNINST.BMP] update
        fileDup [file join [cdromRootDirGet] RESOURCE TCL UNINST.TCL] \
                [file join [uninstHomeDirGet] UNINST.TCL] update
        fileDup [file join [cdromRootDirGet] RESOURCE TCL INCLUDE.TCL] \
                [file join [uninstHomeDirGet] INCLUDE.TCL] update
    } else {
        # Other shared libraries are copied by the UNINST shell script
        # because those are untarred from MWUITCL.TAR

        set usrBinDir [file join [destDirGet] host [windHostTypeGet] bin]
        set usrSetupDir [file join [destDirGet] SETUP]
        set env(PATH) $usrBinDir:$env(PATH)

        fileDup [file join [cdromRootDirGet] RESOURCE TCL UNINST.TCL] \
                [file join [uninstHomeDirGet] UNINST.TCL] update
        fileDup [file join [cdromRootDirGet] RESOURCE TCL INCLUDE.TCL] \
                [file join [uninstHomeDirGet] INCLUDE.TCL] update
        fileDup [file join [cdromRootDirGet] RESOURCE BITMAPS/UNINST.BMP] \
                [file join [uninstHomeDirGet] UNINST.BMP] update
        fileDup [file join [cdromRootDirGet] UNINST] \
                [file join $usrBinDir UNINST] update
        fileDup [file join [cdromRootDirGet] SETUP] \
                [file join $usrSetupDir SETUP] update
        fileDup [file join [cdromBinDirGet] ZIP] \
                [file join $usrBinDir ZIP] update
        fileDup [file join [cdromBinDirGet] SETUPTCL[string toupper \
                                           [info sharedlibextension]]] \
                [file join $usrBinDir setuptcl[info sharedlibextension]] update
    }
}

##############################################################################
#
# uninstStop - wraps up the uninstall process.
#
# This procedure copies uninstall agent, executes all queued commands, closes
# all tempfiles, saves the temporary uninstall records into a zip file.
#
# SYNOPSIS
# uninstStop
#
# PARAMETERS:
#       prodName - Product Name e.g. Tornado
#       prodVer - Product Version e.g. 3.0
#
# RETURNS: N/A
#
# ERRORS: N/A
#

proc uninstStop {prodName prodVer} {
    global setupVals

    if {"$setupVals(uninstLog)" > "0"} {
        uninstBinCopy

        if {[windHostTypeGet] == "x86-win32"} {

            # For Windows hosts, create registry entries and uninstall icon
            # uninstallInitWin32 was previously called uninstallSetup

            uninstallInitWin32 $prodName $prodVer
            queueExecute
        } else {
            queueExecute
        }

        uninstFileClose

        if [file exists $setupVals(uninstFile)] {
            catch {setupUnzip -o -qq $setupVals(uninstFile) \
                  -d [tempDirGet] "install*"}
        }

        fileAppend [file join [tempDirGet] installFile.tmp] \
                [file join [tempDirGet] installFile]
        fileAppend [file join [tempDirGet] installResource.tmp] \
                [file join [tempDirGet] installResource]
        fileAppend [file join [tempDirGet] installCDnumber.tmp] \
                [file join [tempDirGet] installCDnumber]
        fileAppend [file join [tempDirGet] installBackup.tmp] \
                [file join [tempDirGet] installBackup]
        fileAppend [file join [tempDirGet] installInfo.tmp] \
                [file join [tempDirGet] installInfo]
        fileAppend [file join [tempDirGet] setup.log.tmp] \
                [file join [destDirGet] setup.log]

        cd [tempDirGet]

        if [catch {exec [cdromBinDirGet]/ZIP $setupVals(uninstFile) -g -q -1 -m \
                            "installFile" "installInfo" "installBackup"\
                            "installResource" "installCDnumber"} error] {
             puts "$error"
        }

        cd [cdromRootDirGet]

    } else {
        uninstFileClose
    }
}

##############################################################################
#
# fileAppend - appends the content of the source to the destination file.
#
# This procedure takes the content of the source file and appends it to the
# destination file.
#
# SYNOPSIS
# fileAppend <srcFilePath> <destFilePath>
#
# PARAMETERS:
#    srcFilePath : a path to the source filename
#    destFilePath : a path to the destination filename
#
# RETURNS: N/A
#
# ERRORS: N/A
#

proc fileAppend {srcFilePath destFilePath} {

    set ftmp [open $srcFilePath "r"]
    set f [open $destFilePath "a+"]

    while {[gets $ftmp line] != "-1"} {
        puts $f $line
    }

    catch { close $ftmp } err
    catch { close $f } err
}

##############################################################################
#
# uninstLog - stores the specified string into the appropriate disk file.
#
# SYNOPSIS
# uninstLog <key> <string>
#
# PARAMETERS:
#    key : a string that long enough to differentiate between disk filenames,
#          <r>esource, <b>ackup, <f>ileNew, <i>nfo, <s>etupLog, <c>dNumber
#    string : string to be stored.
#
# RETURNS: N/A
#
# ERRORS: N/A
#

proc uninstLog {key string} {
     global setupVals
     set exitSetup 0

     uninstFileOpen

     if [catch { switch -glob $key {
                     c* {
                         puts $setupVals(fInstallCDnumber) $string
                     }
                     r* {
                         puts $setupVals(fInstallResource) $string
                         incr setupVals(uninstLog)
                     }
                     b* {
                         puts $setupVals(fInstallBackup) $string
                         incr setupVals(uninstLog)
                     }
                     f* {
                         puts $setupVals(fInstallFile) $string
                         incr setupVals(uninstLog)
                     }
                     i* {
                         puts $setupVals(fInstallInfo) $string
                     }
                     s* {
                         puts $setupVals(fSetupLog) "[installDate]\t$string"
                         if {[destDirGet] != ""} {

                             if [catch {flush $setupVals(fSetupLog)} result] {
                                 set msg "SETUP detected error\(s\)\n$result\
                                          \n\n[strTableGet TEMP_DISK_FULL_WARN]"
                                 dialog ok_with_title "ERROR: Installation" $msg
                                 set exitSetup 1
                             }
                                  
                             catch {file copy -force \
                                         [tempDirGet]/setup.log.tmp \
                                         [destDirGet]/setup.log.abort}
                         }
                     }
                     default {
                         puts "uninstLog error: $key does not exist"
                     }
                 }
             } error] {

         puts "cannot record \"$string\": $error"
     }

     if { $exitSetup } {
         set setupVals(cancel) 1
         applicationExit
         dialog ok_with_title "Setup" "Setup will terminate now"
         return 0
     }
}

##############################################################################
#
# installDate - forms a simple date string
#
# SYNOPSIS
# installDate
#
# PARAMETERS: N/A
#
# RETURNS: a date string (i.e, 08-Apr-97.18:30)
#
# ERRORS: N/A
#

proc installDate {} {
    return [clock format [clock second] -format "%d-%b-%y.%H:%M"]
}

##############################################################################
#
# fileDup - copies a file
#
# This routine copies srcFile to destFile.  The default option flag is 'none'
# which means doing nothing if destFile exists, update: if srcFile is newer,
# backup destFile then copies, overwrite: backup then copies.  In case of
# failure, a message will be displayed, and user has a chance to decide next
# action.  All successful copied filename will be logged for later uninstall.
#
# SYNOPSIS
# fileDup <srcFile> <destFile> [option]
#
# PARAMETERS:
#    <srcFile> : an absolute path filename
#    <destFile> : an absolute path filename
#    [option] : none | update | overwrite
#
# RETURNS: True or False bases on success or failure.
#
# ERRORS: N/A
#

proc fileDup {sourceFilePath destFilePath {option none}} {
    global ctrlVals setupVals

    if ![file exists $sourceFilePath] {
        dbgputs "$sourceFilePath not found"
        return 0
    }

    regsub -all {\\} $destFilePath {/} destFilePathUnixStyle
    regsub -all {\\} [destDirGet] {/} destDir
    regsub "$destDir/" $destFilePathUnixStyle "" relDestFilePathUnix

    switch $option {
        none {
            if [file exists $destFilePath] {return 1}
        }
        checkVersion {
            # this option is mainly used for checking version of DLLs in
            # the Windows System directory; we don't backup the file and
            # we don't keep track of the file for uninstall purpose

            if [catch {setupFileVersionInfoGet $sourceFilePath} wrsVersion] {
                dbgputs "Cannot get file version of $sourceFilePath: $wrsVersion"
            }
            if {[file exists $destFilePath] &&
               [catch {setupFileVersionInfoGet $destFilePath} userVersion]} {
               dbgputs "Cannot get file version of $destFilePath: $userVersion"
            }
            if {[file exists $destFilePath] && $wrsVersion < $userVersion} {
                return 1
            }
            # if we reach this, we need to overwrite the old file
            # no backup here because we'd like to keep the new version
            set noLog 1
        }
        update {
            if {[file exists $destFilePath] &&
                [file mtime $sourceFilePath] <= [file mtime $destFilePath]} {
                return 1
            } elseif {[file exists $destFilePath]} {
                backup $relDestFilePathUnix
            }
        }
        overwrite {
            if {[file exists $destFilePath]} {
                backup $relDestFilePathUnix
            }
        }
        default {
            puts "fileDup $sourceFilePath $destFilePath $option"
            puts "unknown option: $option"
        }
    }

    set destDir [file dirname $destFilePath]

    if {![file isdirectory $destDir] && [catch {file mkdir $destDir} error]} {
        puts "$error"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -