📄 install.tcl
字号:
cd [tempDirGet] if [catch {exec 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 } close $ftmp close $f}################################################################################ 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 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] != ""} { flush $setupVals(fSetupLog) 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" } }################################################################################ 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" return 0 } if [catch {file copy -force $sourceFilePath $destFilePath} error] { set msg [strTableGet 1370_FILE_ACCESS_ERROR $destFilePath $error] switch [dialog re_ig_cancel "Setup" $msg question 0] { 0 {return [fileDup $sourceFilePath $destFilePath $option]} 1 { set msg "\tcannot create $destFilePath: $error" lastErrorSet $msg uninstLog setup $msg return 0 } default {quitCallback} } } if {[info exists setupVals(fileMode)] && [windHostTypeGet] != "x86-win32"} { catch {exec chmod $setupVals(fileMode) $destFilePath} } # logging for later uninstall if ![info exists noLog] { uninstLog file "wind_base\t$relDestFilePathUnix" } return 1}################################################################################ pageRemove - removes an installation step## This routine removes an element from the pageList which control the flow of# the setup script. Once an element is removed from the list, their associate# functions, pageCreate() and pageProcess() will be skipped.## SYNOPSIS# pageRemove <pageName>## PARAMETERS: # <pageName> : an element in the pageList## RETURNS: N/A## ERRORS: N/A#proc pageRemove {page} { global ctrlVals if {[lsearch $ctrlVals(pageList) $page] == "-1"} { dbgputs "cannot find page $page to remove" } else { set tempList "" foreach p $ctrlVals(pageList) { if {"$p" != "$page"} { lappend tempList $p } } set ctrlVals(pageList) $tempList }}################################################################################ cdInfoGet - returns the requested information## Following is the list of available commands:# # Command Meaning# ------- -------# number the name of the CDROM# size the total size of unlocked products# totalFile the total files of unlocked products# stateInfo the global selection information# featureIdList the feature list of unlocked products# productIndexList the index list of unlocked products# selectedProdIndexList the selected products index list# selectedProdNameList the selected products name list# installedFeatureIdList the selected feature id list## SYNOPSIS# cdInfoGet <command>## PARAMETERS: # <command> : one of the above commands## RETURNS: the requested information## ERRORS: N/A#proc cdInfoGet {info} { global cdObj switch $info { number { return $cdObj(number) } productIndexList { return $cdObj(productIndexList) } selectedProdIndexList { set retVal {} foreach prodIndex $cdObj(productIndexList) { if {[productInfoGet instFlag $prodIndex]} { lappend retVal $prodIndex } } return $retVal } selectedProdNameList { set retVal {} foreach prodIndex [cdInfoGet selectedProdIndexList] { set prodName [productInfoGet name $prodIndex] if {[lsearch $retVal "$prodName"] == "-1"} { lappend retVal $prodName } } return $retVal } size { set retVal 0 foreach selProdIndex [cdInfoGet selectedProdIndexList] { incr retVal [productInfoGet size $selProdIndex] } return $retVal } totalFile { set retVal 0 foreach selProdIndex [cdInfoGet selectedProdIndexList] { incr retVal [productInfoGet totalFile $selProdIndex] } return $retVal } installedFeatureIdList { set retVal {} foreach selProdIndex [cdInfoGet selectedProdIndexList] { set fId [productInfoGet featureId $selProdIndex] if {($fId > 0) && ([lsearch $retVal $fId] == -1)} { lappend retVal $fId } } return $retVal } featureIdList { set retVal {} foreach prodIndex [cdInfoGet productIndexList] { set fId [productInfoGet featureId $prodIndex] if {($fId > 0) && ([lsearch $retVal $fId] == -1)} { lappend retVal $fId } } return $retVal } stateInfo { set totalPrev 0 set totalCurr 0 set state "unchanged" foreach prodIndex [cdInfoGet productIndexList] { set prev [productInfoGet prevInstFlag $prodIndex] set curr [productInfoGet instFlag $prodIndex] incr totalPrev $prev incr totalCurr $curr if {"$prev" != "$curr"} { set state "changed" } } return [stateInfoHelper $state $totalCurr $totalPrev] } default { puts "cdInfoGet: unknown command: $info" } }}################################################################################ featureDescGet - returns the feature name given the feature id## SYNOPSIS# featureDescGet <featureId>## PARAMETERS: # <featureId> : an integer## RETURNS: the associated feature description or unknown if not exists.## ERRORS: N/A#proc featureDescGet {featureId} { global featureObj if [info exists featureObj($featureId)] { return $featureObj($featureId) } else { return "unknown" }}################################################################################ productInfoGet - returns the requested info of a product.## Attribute Meaning# --------- -------# partIndexList a list of integer indentifies parts# number a string that represents a product, sale perpective# name a string that represents a product, mfg perpective# desc a string that describes a product
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -