diff --git a/mozilla/xpinstall/wizard/mac/rsrc/MacInstallWizard.rsrc b/mozilla/xpinstall/wizard/mac/rsrc/MacInstallWizard.rsrc index 0857212259c..f4772597423 100644 Binary files a/mozilla/xpinstall/wizard/mac/rsrc/MacInstallWizard.rsrc and b/mozilla/xpinstall/wizard/mac/rsrc/MacInstallWizard.rsrc differ diff --git a/mozilla/xpinstall/wizard/mac/src/ComponentsWin.c b/mozilla/xpinstall/wizard/mac/src/ComponentsWin.c index c49c6d33d64..8dac1f79308 100644 --- a/mozilla/xpinstall/wizard/mac/src/ComponentsWin.c +++ b/mozilla/xpinstall/wizard/mac/src/ComponentsWin.c @@ -33,6 +33,9 @@ LMSetHiliteMode(hiliteVal); \ InvertRect(_rectPtr); +static int rowToComp[kMaxComponents]; +static int numRows = 0; + void ShowComponentsWin(void) { @@ -40,10 +43,12 @@ ShowComponentsWin(void) Str255 compDescTitle; StringPtr selCompMsg; Handle listBoxRect; - Rect dataBounds, listBoxFrame, viewRect; + Rect dataBounds, listBoxFrame, viewRect, firstCellRect; short reserr; int totalRows = 0, i, instChoice; Point cSize; + Cell firstCell; + UInt8 hiliteVal; Boolean bCellSelected; GrafPtr oldPort; GetPort(&oldPort); @@ -134,19 +139,19 @@ ShowComponentsWin(void) FrameRect(&listBoxFrame); ShowNavButtons( back, next); if (bCellSelected) - SetOptInfo(); + SetOptInfo(NULL); else DrawDiskSpaceMsgs( gControls->opt->vRefNum ); + // default highlight first row + InitRowHighlight(0); + //if (selCompMsg) // DisposePtr((Ptr) selCompMsg); SetPort(oldPort); } -static int rowToComp[kMaxComponents]; -static int numRows = 0; - Boolean PopulateCompInfo(void) { @@ -183,6 +188,7 @@ UpdateCompWin(void) { Rect r; Cell c; + int i; GrafPtr oldPort; GetPort(&oldPort); @@ -192,8 +198,7 @@ UpdateCompWin(void) HLock(gControls->cfg->selCompMsg); DrawString( CToPascal(*gControls->cfg->selCompMsg)); HUnlock(gControls->cfg->selCompMsg); - LUpdate( (*gControls->cw->compList)->port->visRgn, - gControls->cw->compList); + LUpdate( (*gControls->cw->compList)->port->visRgn, gControls->cw->compList); FrameRect(&gControls->cw->compListBox); SetPt(&c, 0, 0); @@ -210,6 +215,15 @@ UpdateCompWin(void) DrawDiskSpaceMsgs( gControls->opt->vRefNum ); + for (i = 0; i < numRows; i++) + { + if (gControls->cfg->comp[rowToComp[i]].highlighted) + { + InitRowHighlight(i); + break; + } + } + SetPort(oldPort); } @@ -243,10 +257,11 @@ InComponentsContent(EventRecord* evt, WindowPtr wCurrPtr) SetRect(&checkbox, currCellRect.left+4, currCellRect.top+2, currCellRect.left+16, currCellRect.top+14); INVERT_HIGHLIGHT(&checkbox); + break; } } - SetOptInfo(); + SetOptInfo(evt); } HLock((Handle)gControls->backB); @@ -255,7 +270,7 @@ InComponentsContent(EventRecord* evt, WindowPtr wCurrPtr) if (PtInRect( localPt, &r)) { /* reset all rows to be not highlighted */ - for (i=0; icfg->comp[rowToComp[i]].highlighted = false; part = TrackControl(gControls->backB, evt->where, NULL); @@ -302,10 +317,6 @@ void MouseMovedInComponentsWin(EventRecord *evt) { Point localPt; - Rect currCellRect, oldCellRect, checkbox; - int i, j; - Cell currCell, oldCell; - UInt8 hiliteVal; GrafPtr oldPort; GetPort(&oldPort); @@ -318,36 +329,119 @@ MouseMovedInComponentsWin(EventRecord *evt) /* if within list box rect */ if (PtInRect( localPt, &((*gControls->cw->compList)->rView) )) { - for (i=0; icw->compList); + UpdateRowHighlight(localPt); + } + + SetPort(oldPort); +} + +void +InitRowHighlight(int row) +{ + Cell hlCell; + Rect hlCellRect; + UInt8 hiliteVal; + int i = 0; + + /* reset all highlighted markers */ + for (i=0; icfg->comp[rowToComp[i]].highlighted = false; + } + + /* highlight and set marker for row to init */ + SetPt(&hlCell, 0, row); + LRect(&hlCellRect, hlCell, gControls->cw->compList); + INVERT_HIGHLIGHT(&hlCellRect); + UpdateLongDesc(row); + gControls->cfg->comp[rowToComp[row]].highlighted = true; +} + +void +UpdateRowHighlight(Point localPt) +{ + int i, j; + Rect currCellRect, oldCellRect; + Cell currCell, oldCell; + UInt8 hiliteVal; + + for (i=0; icw->compList); - /* mouse move landed over this cell */ - if (PtInRect( localPt, &currCellRect )) - { - if (!gControls->cfg->comp[rowToComp[i]].highlighted) - { - /* highlight this cell */ - INVERT_HIGHLIGHT(&currCellRect); - UpdateLongDesc(i); + /* mouse move landed over this cell */ + if (PtInRect( localPt, &currCellRect )) + { + if (!gControls->cfg->comp[rowToComp[i]].highlighted) + { + /* highlight this cell */ + INVERT_HIGHLIGHT(&currCellRect); + UpdateLongDesc(i); - /* unhighlight old one */ - for (j=0; jcfg->comp[rowToComp[j]].highlighted) { - if (gControls->cfg->comp[rowToComp[j]].highlighted) - { - SetPt(&oldCell, 0, j); - LRect(&oldCellRect, oldCell, gControls->cw->compList); + SetPt(&oldCell, 0, j); + LRect(&oldCellRect, oldCell, gControls->cw->compList); - INVERT_HIGHLIGHT(&oldCellRect); - gControls->cfg->comp[rowToComp[j]].highlighted = false; - } + INVERT_HIGHLIGHT(&oldCellRect); + gControls->cfg->comp[rowToComp[j]].highlighted = false; + } + } + + /* mark this row highlighted to prevent incorrect inversion */ + gControls->cfg->comp[rowToComp[i]].highlighted = true; + } + } + } +} + +void +UpdateDependencies(int row, EventRecord* evt) +{ + int i; + short currRow; + Cell currCell; + Rect currCellRect; + Point currCellPt; + GrafPtr oldPort; + + GetPort(&oldPort); + if (gWPtr) + SetPort(gWPtr); + + // if row is selected + if (gControls->cfg->comp[rowToComp[row]].selected) + { + // loop through all components numComps + for (i=0; icfg->numComps; i++) + { + // if kDependencyOn for curr dep component --> comp[rowToComp[row]].dep[i] + if (gControls->cfg->comp[rowToComp[row]].dep[i] == kDependencyOn) + { + // if curr dep component isn't on + if (gControls->cfg->comp[i].selected == kNotSelected) + { + // set curr dep comp to kSelected + gControls->cfg->comp[i].selected = kSelected; + + // if curr dep comp is in currently displayed comps + currRow = GetCompRow(i); + if (currRow != kInvalidCompIdx) + { + // LClick the row to check curr dep comp's checkbox + SetPt(&currCell, 0, currRow); + LRect(&currCellRect, currCell, gControls->cw->compList); + SetPt(&currCellPt, currCellRect.left+1, currCellRect.top+1); + LClick(currCellPt, evt->modifiers, gControls->cw->compList); } - /* mark this row highlighted to prevent incorrect inversion */ - gControls->cfg->comp[rowToComp[i]].highlighted = true; + // resolve its dependencies + UpdateDependencies(currRow, evt); } } } @@ -356,26 +450,26 @@ MouseMovedInComponentsWin(EventRecord *evt) SetPort(oldPort); } +short +GetCompRow(int compIdx) +{ + short i = kInvalidCompIdx; + + for (i=0; icw->compDescBox); - SetRect(&viewRect, (*gControls->cw->compDescBox)->contrlRect.left, - (*gControls->cw->compDescBox)->contrlRect.top, - (*gControls->cw->compDescBox)->contrlRect.right, - (*gControls->cw->compDescBox)->contrlRect.bottom); - HUnlock((Handle)gControls->cw->compDescBox); - viewRect.top += kInterWidgetPad; - SetRect(&viewRect, viewRect.left + kTxtRectPad, - viewRect.top + kTxtRectPad, - viewRect.right - kTxtRectPad, - viewRect.bottom - kTxtRectPad); - EraseRect(&viewRect); for(i=0; icfg->comp[rowToComp[i]].selected = true; gControls->opt->numCompSelected++; + + if (evt) + UpdateDependencies(i, evt); } if (!gControls->cw->compDescBox) @@ -434,9 +531,9 @@ UpdateLongDesc(int row) void EnableComponentsWin(void) -{ +{ EnableNavButtons(); - + // TO DO } diff --git a/mozilla/xpinstall/wizard/mac/src/Deflation.c b/mozilla/xpinstall/wizard/mac/src/Deflation.c index b9157834a12..3d1d695a8e0 100644 --- a/mozilla/xpinstall/wizard/mac/src/Deflation.c +++ b/mozilla/xpinstall/wizard/mac/src/Deflation.c @@ -58,7 +58,6 @@ ExtractCoreFile(short tgtVRefNum, long tgtDirID) Ptr fullPathStr = 0; PRInt32 rv = 0; void *hZip = 0, *hFind = 0; - /* if there's a core file... */ HLock(gControls->cfg->coreFile); @@ -89,14 +88,11 @@ ExtractCoreFile(short tgtVRefNum, long tgtDirID) rv = ZIP_OpenArchive( fullPathStr, &hZip ); - /* dispose mem used so we can reuse the ptr and handle */ HUnlock(fullPathH); - if (fullPathH) - DisposeHandle(fullPathH); if (rv!=ZIP_OK) return rv; /* initialize the search */ - hFind = ZIP_FindInit( hZip, NULL ); /* NULL to match all files in archive */ + hFind = ZIP_FindInit( hZip, 0 ); /* null to match all files in archive */ /* --- i n f l a t e a l l f i l e s --- */ @@ -109,8 +105,8 @@ ExtractCoreFile(short tgtVRefNum, long tgtDirID) /* --- c l o s e a r c h i v e --- */ cleanup: - if (hFind) - rv = ZIP_FindFree( hFind ); + //if (hFind) + // rv = ZIP_FindFree( hFind ); #ifdef MIW_DEBUG if (rv!=ZIP_OK) SysBeep(10); #endif @@ -121,6 +117,8 @@ cleanup: #endif if (coreFile) DisposePtr((Ptr)coreFile); + if (fullPathH) + DisposeHandle(fullPathH); if (fullPathStr) DisposePtr(fullPathStr); @@ -233,22 +231,15 @@ OSErr AppleSingleDecode(FSSpecPtr fd, FSSpecPtr outfd) { OSErr err = noErr; - nsAppleSingleDecoder *decoder; // if file is AppleSingled if (nsAppleSingleDecoder::IsAppleSingleFile(fd)) { // decode it - decoder = new nsAppleSingleDecoder(fd, outfd); - if (!decoder) - return memFullErr; + nsAppleSingleDecoder decoder(fd, outfd); - ERR_CHECK_RET(decoder->Decode(), err); + ERR_CHECK_RET(decoder.Decode(), err); } - - if (decoder) - delete decoder; - return err; } @@ -357,11 +348,12 @@ CleanupExtractedFiles(short tgtVRefNum, long tgtDirID) if (err == noErr) { err = FSpDelete( &coreDirFSp ); - return err; } - else - return err; - } + + HUnlock(gControls->cfg->coreDir); + return err; + } + HUnlock(gControls->cfg->coreDir); // otherwise iterate through coreFileList deleteing each individually diff --git a/mozilla/xpinstall/wizard/mac/src/InstAction.c b/mozilla/xpinstall/wizard/mac/src/InstAction.c index 5e26fb6a5c9..c91b8c87d18 100644 --- a/mozilla/xpinstall/wizard/mac/src/InstAction.c +++ b/mozilla/xpinstall/wizard/mac/src/InstAction.c @@ -163,10 +163,13 @@ pascal void* Install(void* unused) if (err!=noErr) SysBeep(10); #endif } - + if (coreFile) DisposePtr((Ptr)coreFile); } + + /* launch the downloaded apps who had the LAUNCHAPP attr set */ + LaunchApps(vRefNum, dirID); /* wind down app */ gDone = true; @@ -231,6 +234,8 @@ GenerateIDIFromOpt(Str255 idiName, long dirID, short vRefNum, FSSpec *idiSpec) pcurrArchive = CToPascal(*gControls->cfg->comp[i].archive); HUnlock(gControls->cfg->comp[i].archive); err = FSMakeFSSpec(vRefNum, dirID, pcurrArchive, &fsExists); + + // if file doesn't exist if (err == fnfErr) { // get file number from STR# resource @@ -375,6 +380,67 @@ AddKeyToIDI(short key, Handle val, char *ostream) DisposePtr(keybuf); } +void +LaunchApps(short vRefNum, long dirID) +{ + int compsDone = 0, i; + int instChoice = gControls->opt->instChoice-1; + FSSpec fsCurrArchive, fsCurrApp; + OSErr err = noErr; + StringPtr pArchiveName; + LaunchParamBlockRec launchPB; + + // loop through 0 to kMaxComponents + for(i=0; icfg->st[instChoice].comp[i] == kInSetupType) && + (compsDone < gControls->cfg->st[instChoice].numComps) ) + { + // if custom and selected, or not custom setup type + // add file to buffer + if ( ((instChoice == gControls->cfg->numSetupTypes-1) && + (gControls->cfg->comp[i].selected == true)) || + (instChoice < gControls->cfg->numSetupTypes-1) ) + { + // if the LAUNCHAPP attr was set + if (gControls->cfg->comp[i].launchapp) + { + // AppleSingle decode the app + HLock(gControls->cfg->comp[i].archive); + pArchiveName = CToPascal(*gControls->cfg->comp[i].archive); + HUnlock(gControls->cfg->comp[i].archive); + + err = FSMakeFSSpec(vRefNum, dirID, pArchiveName, &fsCurrArchive); + if (err == noErr) /* archive exists */ + { + err = AppleSingleDecode(&fsCurrArchive, &fsCurrApp); + if (err == noErr) /* AppleSingle decoded successfully */ + { + // launch the decoded app + launchPB.launchAppSpec = & fsCurrApp; + launchPB.launchAppParameters = NULL; + launchPB.launchBlockID = extendedBlock; + launchPB.launchEPBLength = extendedBlockLen; + launchPB.launchFileFlags = NULL; + launchPB.launchControlFlags = launchContinue + launchNoFileFlags + launchUseMinimum; + launchPB.launchControlFlags += launchDontSwitch; + + err = LaunchApplication( &launchPB ); +#ifdef MIW_DEBUG + if (err!=noErr) SysBeep(10); +#endif + + } + } + } + } + } + + compsDone++; + } +} + void InitProgressBar(void) { diff --git a/mozilla/xpinstall/wizard/mac/src/MacInstallWizard.h b/mozilla/xpinstall/wizard/mac/src/MacInstallWizard.h index 8f1514e1cc6..20f892c476b 100644 --- a/mozilla/xpinstall/wizard/mac/src/MacInstallWizard.h +++ b/mozilla/xpinstall/wizard/mac/src/MacInstallWizard.h @@ -54,7 +54,7 @@ typedef Boolean (*EventProc)(const EventRecord*); #define SDINST_IS_DLL 1 /* if on, load SDInstLib as code fragment */ #define MOZILLA 0 /* if on, draws the Mozilla logo, not NS, and doesn't use sdinst.dll */ -#define PRE_BETA_HACKERY 1 /* if on, extracts core to selected folder +#define PRE_BETA_HACKERY 0 /* if on, extracts core to selected folder instead of Temporary Items */ /*-----------------------------------------------------------* @@ -127,6 +127,9 @@ if (err) \ #define kSelected 1 #define kNotInSetupType 0 #define kInSetupType 1 +#define kDependencyOff 0 +#define kDependencyOn 1 +#define kInvalidCompIdx -999 #define kMaxCoreFiles 256 #define kMaxProgUnits 100.0 /* end constants */ @@ -252,6 +255,7 @@ if (err) \ #define sInstSize 24 #define sAttributes 25 #define sURL 26 +#define sDependency 31 #define sTermDlg 27 @@ -281,6 +285,12 @@ typedef struct InstComp { /* attributes */ Boolean selected; Boolean invisible; + Boolean launchapp; + + /* dependencies */ + Handle depName[kMaxComponents]; + short dep[kMaxComponents]; + short numDeps; /* UI highlighting */ Boolean highlighted; @@ -441,6 +451,8 @@ OSErr PopulateSetupTypeWinKeys(char *); OSErr PopulateCompWinKeys(char *); OSErr PopulateTermWinKeys(char *); OSErr PopulateIDIKeys(char *); +OSErr MapDependencies(void); +short GetComponentIndex(Handle); Boolean FillKeyValueForIDIKey(short, Handle, char *); Boolean FillKeyValueUsingResID(short, short, Handle, char *); Boolean FillKeyValueUsingSLID(short, short, short, Handle, char *); @@ -515,8 +527,12 @@ Boolean PopulateCompInfo(void); void UpdateCompWin(void); void InComponentsContent(EventRecord*, WindowPtr); void MouseMovedInComponentsWin(EventRecord *); -void SetOptInfo(void); +short GetCompRow(int); +void SetOptInfo(EventRecord* evt); +void InitRowHighlight(int); +void UpdateRowHighlight(Point); void UpdateLongDesc(int); +void UpdateDependencies(int, EventRecord*); void EnableComponentsWin(void); void DisableComponentsWin(void); @@ -536,6 +552,7 @@ void DisableTerminalWin(void); pascal void *Install(void*); Boolean GenerateIDIFromOpt(Str255, long, short, FSSpec *); void AddKeyToIDI(short, Handle, char *); +void LaunchApps(short, long); void InitProgressBar(void); Boolean InitSDLib(void); Boolean LoadSDLib(FSSpec, SDI_NETINSTALL *, EventProc *, CFragConnectionID *); diff --git a/mozilla/xpinstall/wizard/mac/src/Parser.c b/mozilla/xpinstall/wizard/mac/src/Parser.c index 852e6cee60d..bb2670a87ab 100644 --- a/mozilla/xpinstall/wizard/mac/src/Parser.c +++ b/mozilla/xpinstall/wizard/mac/src/Parser.c @@ -79,6 +79,8 @@ ParseConfig(void) ERR_CHECK(PopulateTermWinKeys(cfgText)); ERR_CHECK(PopulateIDIKeys(cfgText)); + ERR_CHECK(MapDependencies()); + if (cfgText) DisposePtr(cfgText); } @@ -127,6 +129,8 @@ ReadConfigFile(char **text) return bSuccess; } +#pragma mark - + OSErr PopulateLicWinKeys(char *cfgText) { @@ -200,6 +204,7 @@ PopulateCompWinKeys(char *cfgText) Ptr currSNameBuf, currSName, currKeyBuf, currKey, idxCh; Str255 pSName, pkey, pidx; char eof[1]; + char *currDepNum; eof[0] = 0; @@ -280,7 +285,7 @@ PopulateCompWinKeys(char *cfgText) DisposeHandle(sizeH); DisposePtr(currKey); - /* attributes (SELECTED|INVISIBLE) */ + /* attributes (SELECTED|INVISIBLE|LAUNCHAPP) */ GetIndString(pkey, rParseKeys, sAttributes); currKey = PascalToC(pkey); Handle attrValH = NewHandleClear(255); @@ -306,7 +311,16 @@ PopulateCompWinKeys(char *cfgText) gControls->cfg->comp[i].invisible = false; if (attrType) DisposePtr(attrType); - + + GetIndString(pkey, rParseKeys, sLAUNCHAPP); + attrType = PascalToC(pkey); + if (NULL != strstr(*attrValH, attrType)) + gControls->cfg->comp[i].launchapp = true; + else + gControls->cfg->comp[i].launchapp = false; + if (attrType) + DisposePtr(attrType); + HUnlock(attrValH); } if (attrValH) @@ -337,8 +351,42 @@ PopulateCompWinKeys(char *cfgText) break; } gControls->cfg->comp[i].numURLs++; - DisposePtr(currKey); + if (currKey) + DisposePtr(currKey); + if (currKeyBuf) + DisposePtr(currKeyBuf); } + + /* dependencies on other components */ + gControls->cfg->comp[i].numDeps = 0; + GetIndString(pkey, rParseKeys, sDependency); + currKeyBuf = PascalToC(pkey); + for (j=0; jcfg->comp[i].depName[j] = NewHandleClear(kValueMaxLen); + if (!FillKeyValueUsingName(currSName, currKey, gControls->cfg->comp[i].depName[j], cfgText)) + { + if (currKey) + DisposePtr(currKey); + if (currDepNum) + free(currDepNum); + break; + } + + gControls->cfg->comp[i].numDeps++; + if (currKey) + DisposePtr(currKey); + if (currDepNum) + free(currDepNum); + } + if (currKeyBuf) + DisposePtr(currKeyBuf); } gControls->cfg->numComps = i; @@ -503,6 +551,61 @@ PopulateIDIKeys(char *cfgText) return err; } + +OSErr +MapDependencies() +{ + OSErr err = noErr; + int i, j, compIdx; + + for (i=0; icfg->numComps; i++) + { + for (j=0; jcfg->comp[i].dep[j] = kDependencyOff; + } + + for(j=0; jcfg->comp[i].numDeps; j++) + { + compIdx = GetComponentIndex(gControls->cfg->comp[i].depName[j]); + if (compIdx != kInvalidCompIdx) + { + gControls->cfg->comp[i].dep[compIdx] = kDependencyOn; + + // turn on dependencies + if (gControls->cfg->comp[i].selected == kSelected) + gControls->cfg->comp[compIdx].selected = kSelected; + } + } + } + + return err; +} + +short +GetComponentIndex(Handle compName) +{ + int i; + short compIdx = kInvalidCompIdx; + + HLock(compName); + for (i=0; icfg->numComps; i++) + { + HLock(gControls->cfg->comp[i].shortDesc); + if (0==strncmp(*gControls->cfg->comp[i].shortDesc, *compName, strlen(*gControls->cfg->comp[i].shortDesc))) + { + compIdx = i; + HUnlock(gControls->cfg->comp[i].shortDesc); + break; + } + HUnlock(gControls->cfg->comp[i].shortDesc); + } + HUnlock(compName); + + return compIdx; +} + +#pragma mark - Boolean FillKeyValueUsingResID(short dlgID, short keyID, Handle dest, char *cfgText) @@ -574,6 +677,8 @@ FillKeyValueUsingName(char *sectionName, char *keyName, Handle dest, char *cfgTe return bFound; } +#pragma mark - + Boolean FindKeyValue(const char *cfg, const char *inSectionName, const char *inKey, char *outValue) { @@ -600,7 +705,7 @@ FindKeyValue(const char *cfg, const char *inSectionName, const char *inKey, char /* find next key [sectionPtr moved past next key per iteration] */ while(GetNextKeyVal(sectionPtr, key, outValue)) { - if (strncmp(key, inKey, strlen(key)) == 0) + if (0cfg->comp[i].selected == true)) || (instChoice < gControls->cfg->numSetupTypes-1) ) { + // if LAUNCHAPP attr wasn't set + if (!gControls->cfg->comp[i].launchapp) HLock(gControls->cfg->comp[i].archive); pcurrArchive = CToPascal(*gControls->cfg->comp[i].archive); HUnlock(gControls->cfg->comp[i].archive);