gecko-dev/cmd/dialup/mac/as_launch/start.c
1999-11-02 07:16:31 +00:00

217 lines
6.6 KiB
C

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (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.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#include "startIncludes.h"
void
main(void)
{
AEAddressDesc editorAddr={typeNull,NULL};
AEDesc launchDesc={typeNull,NULL};
AEDescList fileList={typeNull,NULL};
AliasHandle docAliasH,theAliasH=NULL;
AppleEvent theAEEvent={typeNull,NULL};
Boolean appRunningFlag,createdMagicFile=FALSE;
EventRecord theEvent;
FInfo fndrInfo;
FSSpec theAppFSSpec,theDocFSSpec;
Handle h;
OSErr err;
ProcessInfoRec theProcInfo;
ProcessSerialNumber thePSN;
Str255 theName;
short foundVRefNum,refNum,saveResFile;
long foundDirID,theTick;
MaxApplZone();
InitGraf(&qd.thePort);
InitFonts();
InitMenus();
InitWindows();
TEInit();
InitDialogs(0L);
InitCursor();
// if Netscape process is running, and its version 4.x or later, then quit it, then relaunch it
theProcInfo.processInfoLength = sizeof(theProcInfo);
theProcInfo.processName = theName;
theProcInfo.processLocation = NULL;
theProcInfo.processAppSpec = &theAppFSSpec;
if (isAppRunning(NETSCAPE_SIGNATURE,&thePSN,&theProcInfo) == TRUE) {
if (checkVERS(&theAppFSSpec)==FALSE) {
showError(NETSCAPE_VERS_TOO_OLD_ERR);
ExitToShell();
}
err=QuitApp(&thePSN);
// wait for up to "TIME_TO_DIE" seconds for Netscape to die
theTick=TickCount() + TIME_TO_DIE;
while (theTick > TickCount()) {
WaitNextEvent(everyEvent,&theEvent,TIME_TO_PAUSE,NULL);
if (!(appRunningFlag=isAppRunning(NETSCAPE_SIGNATURE,&thePSN,NULL))) {
break;
}
}
if (appRunningFlag) {
// Netscape didn't quit within "TIME_TO_DIE"... display an error maybe? Or just give up.
ExitToShell();
}
}
else {
// search desktop database, find Netscape 4.x or later
if (err=FindApp(NETSCAPE_SIGNATURE,&theAppFSSpec)) {
if (err != userCanceledErr) {
showError(UNABLE_TO_LOCATE_NETSCAPE_APP_ERR);
}
ExitToShell();
}
}
err=FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder, &foundVRefNum, &foundDirID);
if (err) {
showError(UNABLE_TO_LOCATE_PREFS_FOLDER_ERR);
ExitToShell();
}
#if ACCOUNT_SETUP_BUILD
// get alias to start.htm (Installer placed it in our binary)
if (!(theAliasH=(AliasHandle)Get1IndResource(rAliasType,1))) {
showError(UNABLE_TO_LOCATE_ACCOUNT_SETUP_ERR);
ExitToShell();
}
DetachResource((Handle)theAliasH);
// create/find Account Setup file (with magic filetype)
#ifdef ACCOUNT_SETUP_B3_HACK
err=FSMakeFSSpec(theAppFSSpec.vRefNum, theAppFSSpec.parID, START_ACCTSETUP_NAME_B3, &theDocFSSpec);
if (err==fnfErr) {
(void)FSpCreate(&theDocFSSpec, NETSCAPE_SIGNATURE, MAGIC_ACCTSETUP_SIGNATURE, smSystemScript);
FSpCreateResFile(&theDocFSSpec, NETSCAPE_SIGNATURE, MAGIC_ACCTSETUP_SIGNATURE, smSystemScript);
createdMagicFile=TRUE;
// for B3 hack, make the magic file invisible if we created it
if (err==fnfErr) {
if (!(err=FSpGetFInfo(&theDocFSSpec,&fndrInfo))) {
fndrInfo.fdFlags |= fInvisible;
err=FSpSetFInfo(&theDocFSSpec,&fndrInfo);
}
}
}
#else
err=FSMakeFSSpec(foundVRefNum, foundDirID, START_ACCTSETUP_NAME, &theDocFSSpec);
if (err==fnfErr) {
err=FSpCreate(&theDocFSSpec, NETSCAPE_SIGNATURE, MAGIC_ACCTSETUP_SIGNATURE, smSystemScript);
FSpCreateResFile(&theDocFSSpec, NETSCAPE_SIGNATURE, MAGIC_ACCTSETUP_SIGNATURE, smSystemScript);
}
#endif
// add alias to start.htm into magic file (Netscape will use it)
saveResFile = CurResFile();
if ((refNum=FSpOpenResFile(&theDocFSSpec, fsRdWrPerm)) == kResFileNotOpened) {
// XXX display an error? Or just give up.
ExitToShell();
}
UseResFile(refNum);
if (h=Get1Resource(rAliasType, 1)) { // if already exists, delete old before adding new
RemoveResource(h);
UpdateResFile(refNum);
}
AddResource((Handle)theAliasH, rAliasType, 1, "\p");
WriteResource((Handle)theAliasH);
CloseResFile(refNum);
UseResFile(saveResFile);
// hack to set default Component Dock pref to docked-state
modifyComponentDockPref(&theAppFSSpec);
#elif PROFILE_MANAGER_BUILD
// create/find {Preferences}:Netscape Profiles Temp file (with magic filetype)
err=FSMakeFSSpec(foundVRefNum, foundDirID, START_PROFILE_NAME, &theDocFSSpec);
if (err==fnfErr) {
err=FSpCreate(&theDocFSSpec, NETSCAPE_SIGNATURE, MAGIC_PROFILE_SIGNATURE, smSystemScript);
FSpCreateResFile(&theDocFSSpec, NETSCAPE_SIGNATURE, MAGIC_PROFILE_SIGNATURE, smSystemScript);
}
#else
#error Is this an Account Setup or Profile Manager build?
#endif
if (err) {
ExitToShell();
}
// create AppleEvent and launch app
if (err=AECreateDesc(typeApplSignature,&fndrInfo.fdCreator,sizeof(OSType),&editorAddr)) {}
else if (err=AECreateList(NULL,0L,FALSE,&fileList)) {} // create list of aliases to file(s)
else if (err=NewAlias(NULL,&theDocFSSpec,&docAliasH)) {}
else HLock((Handle)docAliasH);
if (err) {}
else if (err=AEPutPtr(&fileList, 1L, typeAlias, *docAliasH, GetHandleSize((Handle)docAliasH))) {}
else if (err=AECreateAppleEvent(kCoreEventClass,kAEOpenDocuments,&editorAddr,kAutoGenerateReturnID,kAnyTransactionID,&theAEEvent)) {}
else if (err=AEPutParamDesc(&theAEEvent,keyDirectObject,&fileList)) {}
else if (err=AECoerceDesc(&theAEEvent,typeAppParameters,&launchDesc)) {} // coerce event to launch parameter
else if (err=LaunchApp(&theAppFSSpec, &launchDesc)) {}
#ifdef ACCOUNT_SETUP_B3_HACK
// if created magic file, wait for up to "TIME_TO_STARTUP" seconds for Netscape to start and use it, then try to delete it
else if (createdMagicFile==TRUE) {
theTick=TickCount() + TIME_TO_STARTUP;
while (theTick > TickCount()) {
WaitNextEvent(everyEvent,&theEvent,TIME_TO_PAUSE,NULL);
}
(void)FSpDelete(&theDocFSSpec);
}
#endif
}
void
showError(short errStrIndex)
{
Str255 appToLaunchNameString={0},errorString={0};
GetIndString(errorString, ERROR_STR_RESID, errStrIndex);
GetIndString(appToLaunchNameString, APP_NAME_STR_RESID, APP_NAME_STR_ID);
ParamText(errorString, appToLaunchNameString, "\p", "\p");
StopAlert(ERROR_DIALOG_RESID, NULL);
}