From c4f6bd31e95477e76d40dc4bf2bd3665be8a9e3d Mon Sep 17 00:00:00 2001 From: "sgehani%netscape.com" Date: Sun, 20 May 2001 00:15:29 +0000 Subject: [PATCH] Add pause/resume to mac installer download. (b=77979; r=ssu; sr=mscott) git-svn-id: svn://10.0.0.236/trunk@95550 18797224-902f-48f8-a5cc-f745e15eee43 --- .../macbuild/Installer Modules/installer.ini | 2 +- .../wizard/mac/macbuild/installer.ini | 2 +- .../xpinstall/wizard/mac/src/EvtHandlers.c | 21 +- mozilla/xpinstall/wizard/mac/src/InstAction.c | 366 ++++++++++++++++-- .../wizard/mac/src/MacInstallWizard.c | 2 + .../wizard/mac/src/MacInstallWizard.h | 37 +- .../xpinstall/wizard/mac/src/SetupTypeWin.c | 8 +- .../xpinstall/wizard/mac/src/TerminalWin.c | 187 +++++++-- 8 files changed, 536 insertions(+), 89 deletions(-) diff --git a/mozilla/xpinstall/wizard/mac/macbuild/Installer Modules/installer.ini b/mozilla/xpinstall/wizard/mac/macbuild/Installer Modules/installer.ini index efa28e87f36..f345318f080 100644 --- a/mozilla/xpinstall/wizard/mac/macbuild/Installer Modules/installer.ini +++ b/mozilla/xpinstall/wizard/mac/macbuild/Installer Modules/installer.ini @@ -34,7 +34,7 @@ instStrSelectSite=Select a download site: instStrDownloading=Downloading: instStrFrom= From: instStrTo= To: -instStrRate= Rate: +instStrRate= Status: instStrTimeLeft= Time left: instStrDownloadKB= %d1 KB of %d2 KB (%.2f KB/sec) instBtnDelete=Delete diff --git a/mozilla/xpinstall/wizard/mac/macbuild/installer.ini b/mozilla/xpinstall/wizard/mac/macbuild/installer.ini index efa28e87f36..f345318f080 100644 --- a/mozilla/xpinstall/wizard/mac/macbuild/installer.ini +++ b/mozilla/xpinstall/wizard/mac/macbuild/installer.ini @@ -34,7 +34,7 @@ instStrSelectSite=Select a download site: instStrDownloading=Downloading: instStrFrom= From: instStrTo= To: -instStrRate= Rate: +instStrRate= Status: instStrTimeLeft= Time left: instStrDownloadKB= %d1 KB of %d2 KB (%.2f KB/sec) instBtnDelete=Delete diff --git a/mozilla/xpinstall/wizard/mac/src/EvtHandlers.c b/mozilla/xpinstall/wizard/mac/src/EvtHandlers.c index 548a69ffaf3..ef28c133afc 100644 --- a/mozilla/xpinstall/wizard/mac/src/EvtHandlers.c +++ b/mozilla/xpinstall/wizard/mac/src/EvtHandlers.c @@ -104,7 +104,6 @@ void HandleMouseDown(EventRecord* evt) void HandleKeyDown(EventRecord* evt) { char keyPressed; - ThreadID tid; unsigned long finalTicks; keyPressed = evt->message & charCodeMask; @@ -162,10 +161,7 @@ void HandleKeyDown(EventRecord* evt) case kTerminalID: if (!gInstallStarted) { - DisableNavButtons(); - ClearDownloadSettings(); - gInstallStarted = true; - SpawnSDThread(Install, &tid); + BeginInstall(); } return; default: @@ -393,12 +389,15 @@ DidUserCancel(EventRecord *evt) HUnlock((Handle)gControls->cancelB); if (PtInRect(localPt, &r)) { - part = TrackControl(gControls->cancelB, evt->where, NULL); - if (part) - { - gDone = true; - bUserCancelled = true; - } + if (gControls->state == eInstallNotStarted) + { + part = TrackControl(gControls->cancelB, evt->where, NULL); + if (part) + { + gDone = true; + bUserCancelled = true; + } + } } SetPort(oldPort); diff --git a/mozilla/xpinstall/wizard/mac/src/InstAction.c b/mozilla/xpinstall/wizard/mac/src/InstAction.c index a6637a3bda1..f11c9beaf5a 100644 --- a/mozilla/xpinstall/wizard/mac/src/InstAction.c +++ b/mozilla/xpinstall/wizard/mac/src/InstAction.c @@ -39,6 +39,8 @@ static int sCurrFullPathLen = 0; static char *sCurrURL = 0; static time_t sCurrStartTime; /* start of download of current file */ +ConstStr255Param kDLMarker = "\pCurrent Download"; + pascal void* Install(void* unused) { short vRefNum, srcVRefNum; @@ -120,16 +122,22 @@ pascal void* Install(void* unused) HUnlock(gControls->cfg->globalURL); HUnlock(gControls->cfg->site[siteIndex].domain); } - - InitDLProgControls(); + + if (gControls->state != eResuming) + InitDLProgControls(); dlErr = DownloadXPIs(srcVRefNum, srcDirID); + if (dlErr == nsFTPConn::E_USER_CANCEL) + { + return (void *) nil; + } if (dlErr != 0) { ErrorHandler(dlErr); return (void*) nil; } ClearDLProgControls(); - + DisableNavButtons(); + SetPort(oldPort); if (gWPtr) @@ -149,9 +157,9 @@ pascal void* Install(void* unused) } else bCoreExists = true; - /* otherwise core exists in cwd:InstallerModules, different from extraction location */ + /* otherwise core exists in cwd:Installer Modules, different from extraction location */ + - /* check if coreFile was downloaded */ HLock(gControls->cfg->coreFile); if (*gControls->cfg->coreFile != NULL) @@ -230,6 +238,7 @@ ComputeTotalDLSize(void) (gControls->cfg->comp[i].selected == true)) || (instChoice < gControls->cfg->numSetupTypes-1) ) { + // XXX should this change to look at archive size instead? totalDLSize += gControls->cfg->comp[i].size; compsDone++; @@ -248,15 +257,17 @@ DownloadXPIs(short destVRefNum, long destDirID) short rv = 0; Handle dlPath; short dlPathLen = 0; - int i, compsDone, instChoice; - - GetFullPath(destVRefNum, destDirID, "\p", &dlPathLen, &dlPath); + int i, compsDone = 0, instChoice = gControls->opt->instChoice-1, resPos = 0; + Boolean bResuming = false; + int markedIndex = 0; + + GetFullPath(destVRefNum, destDirID, "\p", &dlPathLen, &dlPath); + DLMarkerGetCurrent(&markedIndex, &compsDone); + if (markedIndex >= 0) + resPos = GetResPos(&gControls->cfg->comp[markedIndex]); - compsDone = 0; - instChoice = gControls->opt->instChoice-1; - // loop through 0 to kMaxComponents - for(i=0; icfg->st[instChoice].comp[i] == kInSetupType) && @@ -267,25 +278,47 @@ DownloadXPIs(short destVRefNum, long destDirID) (gControls->cfg->comp[i].selected == true)) || (instChoice < gControls->cfg->numSetupTypes-1) ) { + // stat file even if index is less than markedIndex + // and download file if it isn't locally there; + // this can happen if a new setup type was selected + if (i < markedIndex) + { + if (noErr == ExistsXPI(i)) + continue; + } + // set up vars for dl callback to use sCurrComp = i; sCurrFullPath = dlPath; sCurrFullPathLen = dlPathLen; // download given full path and archive name - rv = DownloadFile(dlPath, dlPathLen, gControls->cfg->comp[i].archive); + if (i == markedIndex && resPos > 0) + { + gControls->resPos = resPos; + gControls->state = eResuming; + } + rv = DownloadFile(dlPath, dlPathLen, gControls->cfg->comp[i].archive, resPos); + if (rv == nsFTPConn::E_USER_CANCEL) + { + break; + } if (rv != 0) { ErrorHandler(rv); break; } - + resPos = 0; // reset after first file was resumed in the middle + gControls->state = eDownloading; compsDone++; } } else if (compsDone >= gControls->cfg->st[instChoice].numComps) break; } + + if (rv == 0) + DLMarkerDelete(); return rv; } @@ -294,15 +327,17 @@ const char kHTTP[8] = "http://"; const char kFTP[7] = "ftp://"; short -DownloadFile(Handle destFolder, long destFolderLen, Handle archive) +DownloadFile(Handle destFolder, long destFolderLen, Handle archive, int resPos) { short rv = 0; char *URL = 0, *proxyServerURL = 0, *destFile = 0, *destFolderCopy = 0; int globalURLLen, archiveLen, proxyServerURLLen; char *ftpHost = 0, *ftpPath = 0; + Boolean bGetTried = false; // make URL using globalURL HLock(archive); + DLMarkerSetCurrent(*archive); HLock(gControls->cfg->globalURL); globalURLLen = strlen(*gControls->cfg->globalURL); archiveLen = strlen(*archive); @@ -348,7 +383,8 @@ DownloadFile(Handle destFolder, long destFolderLen, Handle archive) if (rv == nsHTTPConn::OK) { sCurrStartTime = time(NULL); - rv = conn->Get(DLProgressCB, destFile); + bGetTried = true; + rv = conn->Get(DLProgressCB, destFile, resPos); conn->Close(); } } @@ -363,7 +399,8 @@ DownloadFile(Handle destFolder, long destFolderLen, Handle archive) if (rv == nsHTTPConn::OK) { sCurrStartTime = time(NULL); - rv = conn->Get(DLProgressCB, destFile); + bGetTried = true; + rv = conn->Get(DLProgressCB, destFile, resPos); conn->Close(); } } @@ -385,7 +422,8 @@ DownloadFile(Handle destFolder, long destFolderLen, Handle archive) if (rv == nsFTPConn::OK) { sCurrStartTime = time(NULL); - rv = conn->Get(ftpPath, destFile, nsFTPConn::BINARY, 1, DLProgressCB); + bGetTried = true; + rv = conn->Get(ftpPath, destFile, nsFTPConn::BINARY, resPos, 1, DLProgressCB); conn->Close(); } } @@ -398,10 +436,239 @@ DownloadFile(Handle destFolder, long destFolderLen, Handle archive) // else not supported so report an error else rv = nsHTTPConn::E_MALFORMED_URL; - + + if (bGetTried && rv != 0) + { + /* the get failed before completing; simulate pause */ + SetPausedState(); + rv = nsFTPConn::E_USER_CANCEL; + } + return rv; } +OSErr +DLMarkerSetCurrent(char *aXPIName) +{ + OSErr err = noErr; + short vRefNum = 0; + long dirID = 0; + FSSpec fsMarker; + short markerRefNum; + long count = 0; + + if (!aXPIName) + return paramErr; + + err = GetInstallerModules(&vRefNum, &dirID); + if (err != noErr) + return err; + + // check if marker file exists + err = FSMakeFSSpec(vRefNum, dirID, kDLMarker, &fsMarker); + + // delete old marker and recreate it so we truncate to 0 + if (err == noErr) + FSpDelete(&fsMarker); + + err = FSpCreate(&fsMarker, 'ttxt', 'TEXT', smSystemScript); + if (err != noErr) + return err; + + // open data fork + err = FSpOpenDF(&fsMarker, fsWrPerm, &markerRefNum); + if (err != noErr) + goto BAIL; + + // write xpi name into marker's data fork at offset 0 + count = strlen(aXPIName); + err = FSWrite(markerRefNum, &count, (void *) aXPIName); + +BAIL: + // close marker file + FSClose(markerRefNum); + + return err; +} + +OSErr +DLMarkerGetCurrent(int *aMarkedIndex, int *aCompsDone) +{ + OSErr err = noErr; + char xpiName[255]; + short vRefNum = 0; + long dirID = 0; + long count = 0; + FSSpec fsMarker; + short markerRefNum; + + if (!aMarkedIndex || !aCompsDone) + return paramErr; + + err = GetInstallerModules(&vRefNum, &dirID); + if (err != noErr) + return err; + + // check if marker file exists + err = FSMakeFSSpec(vRefNum, dirID, kDLMarker, &fsMarker); + if (err == noErr) + { + // open for reading + err = FSpOpenDF(&fsMarker, fsRdPerm, &markerRefNum); + if (err != noErr) + goto CLOSE_FILE; + + // get file size + err = GetEOF(markerRefNum, &count); + if (err != noErr) + goto CLOSE_FILE; + + // read file contents + err = FSRead(markerRefNum, &count, (void *) xpiName); + if (err == noErr) + { + if (count <= 0) + err = readErr; + else + { + xpiName[count] = 0; // ensure only reading 'count' bytes + err = GetIndexFromName(xpiName, aMarkedIndex, aCompsDone); + } + } + +CLOSE_FILE: + // close file + FSClose(markerRefNum); + } + + return err; +} + +OSErr +DLMarkerDelete(void) +{ + OSErr err; + short vRefNum = 0; + long dirID = 0; + FSSpec fsMarker; + + err = GetInstallerModules(&vRefNum, &dirID); + if (err == noErr) + { + err = FSMakeFSSpec(vRefNum, dirID, kDLMarker, &fsMarker); + if (err == noErr) + FSpDelete(&fsMarker); + } + + return noErr; +} + +OSErr +GetIndexFromName(char *aXPIName, int *aIndex, int *aCompsDone) +{ + OSErr err = noErr; + int i, compsDone = 0, instChoice = gControls->opt->instChoice - 1; + + if (!aXPIName || !aIndex || !aCompsDone) + return paramErr; + + // loop through 0 to kMaxComponents + for(i = 0; i < kMaxComponents; i++) + { + // general test: if component in setup type + if ( (gControls->cfg->st[instChoice].comp[i] == kInSetupType) && + (compsDone < gControls->cfg->st[instChoice].numComps) ) + { + // if custom and selected -or- not custom setup type + if ( ((instChoice == gControls->cfg->numSetupTypes-1) && + (gControls->cfg->comp[i].selected == true)) || + (instChoice < gControls->cfg->numSetupTypes-1) ) + { + HLock(gControls->cfg->comp[i].archive); + if (strncmp(aXPIName, (*(gControls->cfg->comp[i].archive)), strlen(aXPIName)) == 0) + { + HUnlock(gControls->cfg->comp[i].archive); + *aIndex = i; + *aCompsDone = compsDone; + break; + } + else + HUnlock(gControls->cfg->comp[i].archive); + compsDone++; + } + } + else if (compsDone >= gControls->cfg->st[instChoice].numComps) + { + err = userDataItemNotFound; + break; + } + } + return err; +} + +int +GetResPos(InstComp *aComp) +{ + OSErr err = noErr; + int resPos = 0; + short vRefNum = 0; + long dirID = 0; + Str255 pArchiveName; + long dataSize = 0, rsrcSize = 0; + + if (!aComp) + return 0; + + err = GetInstallerModules(&vRefNum, &dirID); + if (err == noErr) + { + HLock(aComp->archive); + my_c2pstrcpy(*(aComp->archive), pArchiveName); + HUnlock(aComp->archive); + + err = GetFileSize(vRefNum, dirID, pArchiveName, &dataSize, &rsrcSize); + if (err == noErr && dataSize > 0) + resPos = dataSize; + } + + return resPos; +} + +OSErr +GetInstallerModules(short *aVRefNum, long *aDirID) +{ + short cwdVRefNum = 0; + long cwdDirID = 0, imDirID = 0; + OSErr err; + Boolean isDir = false; + Str255 pIMFolder; // "Installer Modules" fodler + + if (!aVRefNum || !aDirID) + return paramErr; + + *aVRefNum = 0; + *aDirID = 0; + + err = GetCWD(&cwdDirID, &cwdVRefNum); + if (err != noErr) + return err; + + GetIndString(pIMFolder, rStringList, sInstModules); + err = GetDirectoryID(cwdVRefNum, cwdDirID, pIMFolder, &imDirID, &isDir); + if (err != noErr) + return err; + + if (isDir) + { + *aVRefNum = cwdVRefNum; + *aDirID = imDirID; + } + else + return dirNFErr; + + return err; +} + int ParseFTPURL(char *aURL, char **aHost, char **aPath) { @@ -481,6 +748,14 @@ CompressToFit(char *origStr, char *outStr, int outStrLen) halfOutStrLen = outStrLen/2; lastPart = origStr + origStrLen - halfOutStrLen; + // don't truncate if already less than acceptable max len + if (origStrLen < outStrLen) + { + strcpy(outStr, origStr); + *(outStr + strlen(origStr)) = 0; + return; + } + strncpy(outStr, origStr, halfOutStrLen); *(outStr + halfOutStrLen) = 0; strcat(outStr, "É"); @@ -500,11 +775,12 @@ ComputeRate(int bytes, time_t startTime, time_t endTime) } #define kProgMsgLen 51 +#define kLowRateThreshold ((float)20) int DLProgressCB(int aBytesSoFar, int aTotalFinalSize) { - static int yielder = 0, yieldFrequency = 64; + static int yielder = 0, yieldFrequency = 8; int len; char compressedStr[kProgMsgLen + 1]; // add one for NULL termination char *fullPathCopy = 0; // GetFullPath doesn't null terminate @@ -514,6 +790,11 @@ DLProgressCB(int aBytesSoFar, int aTotalFinalSize) Str255 dlStr; char tmp[kKeyMaxLen]; + if (gControls->state == ePaused) + { + return nsFTPConn::E_USER_CANCEL; + } + if (aTotalFinalSize != sCurrTotalDLSize) { sCurrTotalDLSize = aTotalFinalSize; @@ -578,25 +859,28 @@ DLProgressCB(int aBytesSoFar, int aTotalFinalSize) } if (gControls->tw->dlProgressBar) - { - if (++yielder == yieldFrequency) + { + // update rate info + now = time(NULL); + rate = ComputeRate(aBytesSoFar, sCurrStartTime, now); + + if ((rate < kLowRateThreshold) || ((++yielder) == yieldFrequency)) { - SetControlValue(gControls->tw->dlProgressBar, (aBytesSoFar/1024)); - - // update rate info - now = time(NULL); - rate = ComputeRate(aBytesSoFar, sCurrStartTime, now); + int adjustedBytesSoFar = aBytesSoFar; + if (gControls->state == eResuming) + adjustedBytesSoFar += gControls->resPos; + SetControlValue(gControls->tw->dlProgressBar, (adjustedBytesSoFar/1024)); // create processing string "%d KB of %d KB (%.2f KB/sec)" GetResourcedString(dlStr, rInstList, sDownloadKB); strcpy(compressedStr, PascalToC(dlStr)); - sprintf(tmp, "%d", aBytesSoFar/1024); + sprintf(tmp, "%d", adjustedBytesSoFar/1024); strtran(compressedStr, "%d1", tmp); sprintf(tmp, "%d", aTotalFinalSize/1024); strtran(compressedStr, "%d2", tmp); sprintf(tmp, "%.2f", rate); strtran(compressedStr, "%.2f", tmp); - + HLock((Handle)gControls->tw->dlProgressMsgs[3]); teRect = (**(gControls->tw->dlProgressMsgs[3])).viewRect; HUnlock((Handle)gControls->tw->dlProgressMsgs[3]); @@ -854,6 +1138,30 @@ ExistArchives(short vRefNum, long dirID) return bAllExist; } +OSErr +ExistsXPI(int aIndex) +{ + OSErr err = noErr; + FSSpec fsComp; + short vRefNum = 0; + long dirID = 0; + Str255 pArchive; + + if (aIndex < 0) + return paramErr; + + err = GetInstallerModules(&vRefNum, &dirID); + if (err == noErr) + { + HLock(gControls->cfg->comp[aIndex].archive); + my_c2pstrcpy(*(gControls->cfg->comp[aIndex].archive), pArchive); + HUnlock(gControls->cfg->comp[aIndex].archive); + err = FSMakeFSSpec(vRefNum, dirID, pArchive, &fsComp); + } + + return err; +} + void LaunchApps(short vRefNum, long dirID) { diff --git a/mozilla/xpinstall/wizard/mac/src/MacInstallWizard.c b/mozilla/xpinstall/wizard/mac/src/MacInstallWizard.c index 824f18e9c46..ffa87494ad1 100644 --- a/mozilla/xpinstall/wizard/mac/src/MacInstallWizard.c +++ b/mozilla/xpinstall/wizard/mac/src/MacInstallWizard.c @@ -201,6 +201,8 @@ InitControlsObject(void) ErrorHandler(eMem); } + gControls->state = eInstallNotStarted; + return; } diff --git a/mozilla/xpinstall/wizard/mac/src/MacInstallWizard.h b/mozilla/xpinstall/wizard/mac/src/MacInstallWizard.h index 4a68833cd5f..da742bd40e4 100644 --- a/mozilla/xpinstall/wizard/mac/src/MacInstallWizard.h +++ b/mozilla/xpinstall/wizard/mac/src/MacInstallWizard.h @@ -211,14 +211,12 @@ if (err) \ #define rAboutBox 128 - #define rStringList 140 // common strings #define sConfigFName 1 #define sInstallFName 2 #define sTempIDIName 3 #define sConfigIDIName 4 #define sInstModules 5 -#define eInstRead 6 //install.ini read failed #define rTitleStrList 170 #define sNSInstTitle 1 @@ -316,6 +314,7 @@ if (err) \ #define eMenuHdl 11 #define eCfgRead 12 #define eDownload 13 +#define eInstRead 6 // installer.ini read failed #define instErrsNum 13 /* number of the install.ini errors */ @@ -365,8 +364,10 @@ if (err) \ #define sSpaceMsg1 43 #define sSpaceMsg2 44 #define sSpaceMsg3 45 +#define sPauseBtn 46 +#define sResumeBtn 47 -#define instKeysNum 45 /* number of the install.ini keys */ +#define instKeysNum 47 /* number of installer.ini keys */ #define rInstMenuList 146 #define sMenuGeneral 1 @@ -534,6 +535,7 @@ typedef struct Options { char *proxyPort; char *proxyUsername; char *proxyPassword; + } Options; typedef struct LicWin { @@ -587,6 +589,15 @@ typedef struct TermWin { ControlHandle proxySettingsBtn; } TermWin; +typedef enum { + eInstallNotStarted = 0, + eDownloading, + ePaused, + eResuming, + eExtracting, + eInstalling +} InstallState; + typedef struct InstWiz { /* config.ini options parsed */ @@ -607,6 +618,10 @@ typedef struct InstWiz { ControlHandle backB; ControlHandle nextB; ControlHandle cancelB; + + InstallState state; + int resPos; + } InstWiz; typedef struct InstINIRes { @@ -728,7 +743,7 @@ static OSErr FindAppOnVolume (OSType, short, FSSpec *); OSErr GetSysVolume (short *); OSErr GetIndVolume (short, short *); OSErr GetLastModDateTime(const FSSpec *, unsigned long *); -void InitNewMenu(); +void InitNewMenu(void); /*-----------------------------------------------------------* * SetupTypeWin @@ -792,6 +807,7 @@ void DisableAdditionsWin(void); *-----------------------------------------------------------*/ void ShowTerminalWin(void); short GetRectFromRes(Rect *, short); +void BeginInstall(void); void my_c2pstrcpy(const char *, Str255); void InTerminalContent(EventRecord*, WindowPtr); void UpdateTerminalWin(void); @@ -801,6 +817,10 @@ void ClearDownloadSettings(void); void ClearSaveBitsMsg(void); void EnableTerminalWin(void); void DisableTerminalWin(void); +void SetupPauseResumeButtons(void); +void SetPausedState(void); +void SetResumedState(void); + /*-----------------------------------------------------------* * InstAction @@ -808,7 +828,13 @@ void DisableTerminalWin(void); pascal void *Install(void*); long ComputeTotalDLSize(void); short DownloadXPIs(short, long); -short DownloadFile(Handle, long, Handle); +short DownloadFile(Handle, long, Handle, int); +OSErr DLMarkerSetCurrent(char *); +OSErr DLMarkerGetCurrent(int *, int*); +OSErr DLMarkerDelete(void); +int GetResPos(InstComp *); +OSErr GetInstallerModules(short *, long *); +OSErr GetIndexFromName(char *, int *, int *); int ParseFTPURL(char *, char **, char **); void CompressToFit(char *, char *, int); float ComputeRate(int, time_t, time_t); @@ -817,6 +843,7 @@ void IfRemoveOldCore(short, long); Boolean GenerateIDIFromOpt(Str255, long, short, FSSpec *); void AddKeyToIDI(short, Handle, char *); Boolean ExistArchives(short, long); +OSErr ExistsXPI(int); void LaunchApps(short, long); void RunApps(void); void DeleteXPIs(short, long); diff --git a/mozilla/xpinstall/wizard/mac/src/SetupTypeWin.c b/mozilla/xpinstall/wizard/mac/src/SetupTypeWin.c index 70a5d2a36d1..dd2c9cf924c 100644 --- a/mozilla/xpinstall/wizard/mac/src/SetupTypeWin.c +++ b/mozilla/xpinstall/wizard/mac/src/SetupTypeWin.c @@ -1040,11 +1040,11 @@ VerifyDiskSpace(void) sprintf(dsAvailStr, "%d", sDSAvailK); GetResourcedString(pMessage, rInstList, sSpaceMsg1); - pstrcat(pMessage, CToPascal(dsNeededStr)); - pstrcat(pMessage, CToPascal("KB. \r")); + pstrcat(pMessage, CToPascal(dsAvailStr)); + pstrcat(pMessage, CToPascal("KB \r")); GetResourcedString(pStr, rInstList, sSpaceMsg2); - pstrcat(pStr, CToPascal(dsAvailStr)); - pstrcat(pStr, CToPascal("KB. \r\r")); + pstrcat(pStr, CToPascal(dsNeededStr)); + pstrcat(pStr, CToPascal("KB \r\r")); pstrcat(pMessage, pStr); GetResourcedString(pStr, rInstList, sSpaceMsg3); pstrcat(pMessage, pStr); diff --git a/mozilla/xpinstall/wizard/mac/src/TerminalWin.c b/mozilla/xpinstall/wizard/mac/src/TerminalWin.c index 2884fdec998..f547a29fdc8 100644 --- a/mozilla/xpinstall/wizard/mac/src/TerminalWin.c +++ b/mozilla/xpinstall/wizard/mac/src/TerminalWin.c @@ -284,7 +284,6 @@ InTerminalContent(EventRecord* evt, WindowPtr wCurrPtr) ControlPartCode part; ControlHandle currCntl; short checkboxVal; - ThreadID tid; GrafPtr oldPort; GetPort(&oldPort); @@ -350,30 +349,40 @@ InTerminalContent(EventRecord* evt, WindowPtr wCurrPtr) part = TrackControl(gControls->backB, evt->where, NULL); if (part) { - KillControls(gWPtr); - if (&gControls->tw->startMsgBox) - { - EraseRect(&gControls->tw->startMsgBox); - InvalRect(&gControls->tw->startMsgBox); - } - else - { - ErrorHandler(eParam); - return; - } - ClearSaveBitsMsg(); - - /* treat last setup type selection as custom */ - if (gControls->opt->instChoice == gControls->cfg->numSetupTypes) - { - if (gControls->cfg->bAdditionsExist) - ShowAdditionsWin(); - else - ShowComponentsWin(); - } - else - ShowSetupTypeWin(); - return; + /* before install has started */ + if (gControls->state == eInstallNotStarted) + { + KillControls(gWPtr); + if (&gControls->tw->startMsgBox) + { + EraseRect(&gControls->tw->startMsgBox); + InvalRect(&gControls->tw->startMsgBox); + } + else + { + ErrorHandler(eParam); + return; + } + ClearSaveBitsMsg(); + + /* treat last setup type selection as custom */ + if (gControls->opt->instChoice == gControls->cfg->numSetupTypes) + { + if (gControls->cfg->bAdditionsExist) + ShowAdditionsWin(); + else + ShowComponentsWin(); + } + else + ShowSetupTypeWin(); + return; + } + + /* pause button pressed */ + else if (gControls->state == eDownloading || gControls->state == eResuming) + { + SetPausedState(); + } } } @@ -388,16 +397,34 @@ InTerminalContent(EventRecord* evt, WindowPtr wCurrPtr) part = TrackControl(gControls->nextB, evt->where, NULL); if (part) { - DisableNavButtons(); - ClearDownloadSettings(); - gInstallStarted = true; - SpawnSDThread(Install, &tid); - return; + BeginInstall(); } } + SetPort(oldPort); } +void +BeginInstall(void) +{ + ThreadID tid; + + /* starting download first time or resume download */ + if (gControls->state == eInstallNotStarted || gControls->state == ePaused) + { + if (gControls->state == eInstallNotStarted) + { + SetupPauseResumeButtons(); + ClearDownloadSettings(); + gInstallStarted = true; + } + else if (gControls->state == ePaused) + SetResumedState(); + + SpawnSDThread(Install, &tid); + } +} + void my_c2pstrcpy(const char *aCStr, Str255 aPStr) { @@ -632,14 +659,35 @@ ClearSaveBitsMsg(void) void EnableTerminalWin(void) { - EnableNavButtons(); - - if (gControls->tw->siteSelector) - HiliteControl(gControls->tw->siteSelector, kEnableControl); - if (gControls->tw->saveBitsCheckbox) - HiliteControl(gControls->tw->saveBitsCheckbox, kEnableControl); - if (gControls->tw->proxySettingsBtn) - HiliteControl(gControls->tw->proxySettingsBtn, kEnableControl); + if (gControls->state == eInstallNotStarted) + { + EnableNavButtons(); + + if (gControls->tw->siteSelector) + HiliteControl(gControls->tw->siteSelector, kEnableControl); + if (gControls->tw->saveBitsCheckbox) + HiliteControl(gControls->tw->saveBitsCheckbox, kEnableControl); + if (gControls->tw->proxySettingsBtn) + HiliteControl(gControls->tw->proxySettingsBtn, kEnableControl); + } + else if (gControls->state == eDownloading || gControls->state == eResuming) + { + if (gControls->nextB) + HiliteControl(gControls->nextB, kDisableControl); + if (gControls->backB) + HiliteControl(gControls->backB, kEnableControl); + if (gControls->cancelB) + HiliteControl(gControls->cancelB, kDisableControl); + } + else if (gControls->state == ePaused) + { + if (gControls->nextB) + HiliteControl(gControls->nextB, kEnableControl); + if (gControls->backB) + HiliteControl(gControls->backB, kDisableControl); + if (gControls->cancelB) + HiliteControl(gControls->cancelB, kDisableControl); + } } void @@ -654,3 +702,66 @@ DisableTerminalWin(void) if (gControls->tw->proxySettingsBtn) HiliteControl(gControls->tw->proxySettingsBtn, kDisableControl); } + +void +SetupPauseResumeButtons(void) +{ + Str255 pPauseLabel, pResumeLabel; + + /* rename labels to pause/resume */ + if (gControls->backB) + { + GetResourcedString(pPauseLabel, rInstList, sPauseBtn); + SetControlTitle(gControls->backB, pPauseLabel); + ShowControl(gControls->backB); + } + + if (gControls->nextB) + { + GetResourcedString(pResumeLabel, rInstList, sResumeBtn); + SetControlTitle(gControls->nextB, pResumeLabel); + ShowControl(gControls->nextB); + } + + /* disable cancel button */ + if (gControls->cancelB) + HiliteControl(gControls->cancelB, kDisableControl); + + /* disable pause button */ + if (gControls->nextB) + HiliteControl(gControls->nextB, kDisableControl); + + /* enable resume button */ + if (gControls->backB) + HiliteControl(gControls->backB, kEnableControl); + + gControls->state = eDownloading; +} + +void +SetPausedState(void) +{ + /* disable resume button */ + if (gControls->backB) + HiliteControl(gControls->backB, kDisableControl); + + /* enable pause button */ + if (gControls->nextB) + HiliteControl(gControls->nextB, kEnableControl); + + gControls->state = ePaused; +} + +void +SetResumedState(void) +{ + /* disable pause button */ + if (gControls->nextB) + HiliteControl(gControls->nextB, kDisableControl); + + /* enable resume button */ + if (gControls->backB) + HiliteControl(gControls->backB, kEnableControl); + + gControls->state = eResuming; +} \ No newline at end of file