mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-28 01:29:20 +00:00
5b0f0cc134
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included. The Tools directory, containing mostly junk, is also excluded.
296 lines
8.8 KiB
OpenEdge ABL
296 lines
8.8 KiB
OpenEdge ABL
{
|
|
File: dpInit.inc.p
|
|
|
|
Written by: Nick Kledzik
|
|
|
|
Copyright: © 1989-1990 by Apple Computer, Inc., all rights reserved.
|
|
|
|
This file is used in these builds: BigBang
|
|
|
|
Change History (most recent first):
|
|
|
|
<14> 4/5/91 ngk MM, #86190: remove unlock from end of QuitPack. This was a
|
|
remnant from the days before the package dispatcher. Now
|
|
the package dispatcher will unlock and respect the lock
|
|
count it keeps.
|
|
<13> 11/26/90 ngk <DFH> Use dpSetCurrentAppRefNum.
|
|
<12> 7/2/90 ngk Use NewPtrSysClear to save code.
|
|
<11> 5/31/90 ngk Moved last edition used to preference folder. Install and
|
|
remove a volume notification proc.
|
|
<10> 5/3/90 ngk Changed GetLastEditionContainerUsed to use same folder as last
|
|
edition if it can.
|
|
<9> 4/7/90 ngk Use new failure mechanism.
|
|
<8> 3/25/90 ngk Script now in EditionContainerSpec
|
|
<7> 3/10/90 ngk Moved locking and unlocking of package to dispatcher. Removed
|
|
dialogCodeH.
|
|
<6> 2/25/90 ngk Use GetAppSignature instead of GetCurrentAppSignature.
|
|
<5> 1/26/90 ngk Changed Alias calls to new non-pointer style
|
|
<4> 1/22/90 ngk Used symbolic names for default opener. Fixed
|
|
dpRetreivedSavedLastContainer to not mount servers.
|
|
<3> 1/8/90 ngk Renamed dp_GetCurrentAppRefNum.
|
|
<2> 1/6/90 ngk Added GetEditionOpenerProc & SetEditionOpenerProc. Moved all
|
|
once-only init code into here. Moved saving and restoring of
|
|
last container to here.
|
|
<1.8> 12/1/89 ngk Fixed a bug in dp_QuitEditionPack of unassigned return value.
|
|
<1.7> 11/13/89 ngk InitDP & dp_QuitEditionPack now allow pack11 to be relocated.
|
|
<1.6> 11/4/89 ngk Remove globals when no apps using pack.
|
|
<1.5> 10/13/89 ngk Added caching of dialogCodeH (dialog code resource)
|
|
<1.4> 10/2/89 ngk Now call DialogsOnceOnlyQuit
|
|
<1.3> 8/29/89 ngk Now get apps signature at InitDPpack time. Restore old
|
|
ExitToShell trap in dp_QuitEditionPackpack.
|
|
<1.2> 8/8/89 ngk Changed Quit to return an OSErr. Added
|
|
PubControlBlockOnceOnlyInit call
|
|
<1.1> 5/29/89 ngk Changed InitDP to check package version instead of the glue
|
|
patched _ExitToShell to call dp_QuitEditionPack to clean up after app
|
|
<1.0> 5/19/89 ngk Submitted for first time
|
|
|
|
To Do:
|
|
}
|
|
|
|
|
|
{========================== low level ============================}
|
|
|
|
CONST
|
|
kPack11Handle = $BD4;
|
|
|
|
|
|
|
|
{------------- dpOnceOnlyInit -------------}
|
|
FUNCTION dpOnceOnlyInit: OSErr;
|
|
VAR
|
|
emGlobalsLoc: EdtnMgrGlobalsPtrPtr;
|
|
emGlobals: EdtnMgrGlobalsPtr;
|
|
theErr: OSErr;
|
|
ignore: OSErr;
|
|
BEGIN
|
|
{ allocate space for dp system globals in system heap }
|
|
emGlobals := EdtnMgrGlobalsPtr(NewPtrSysClear(SizeOf(EdtnMgrGlobals)));
|
|
theErr := MemError;
|
|
IF theErr = noErr THEN
|
|
BEGIN
|
|
{ stuff handle to globals in special location }
|
|
emGlobalsLoc := dpGetGlobalsLocation;
|
|
emGlobalsLoc^ := emGlobals;
|
|
|
|
WITH emGlobals^ DO
|
|
BEGIN
|
|
{ initialize list of PubCB's }
|
|
pubCBlinks.nextPubCB := PubCBLinkHandle(emGlobalsLoc);
|
|
pubCBlinks.prevPubCB := PubCBLinkHandle(emGlobalsLoc);
|
|
|
|
{ initialize list of applications }
|
|
{perAppListHead := NIL;}
|
|
|
|
{ initialize poll timer }
|
|
nextPollTime := TickCount+ kPollPeriod;
|
|
|
|
{ initialize no goto happening }
|
|
{gotoHere := NIL;}
|
|
|
|
{ initialize no failure handler }
|
|
{failureHandler := NIL;}
|
|
|
|
{ initialize last edition file used }
|
|
{lastEditionUsed := NIL;}
|
|
|
|
{ initialize volume notification glue code }
|
|
volumeNotifyCode[1] := $303C; { move.w #02F4,d0 }
|
|
volumeNotifyCode[2] := $02F4;
|
|
volumeNotifyCode[3] := $AC2D; { _EditionMgrVolumeNotifier,AutoPop }
|
|
|
|
{ tell process manger to call me anytime volumes change }
|
|
ignore := BeginSystemMode;
|
|
{$IFC qCatchFailures}
|
|
IF ignore <> noErr
|
|
THEN DebugStr('dpOnceOnlyInit: BeginSystemMode failed');
|
|
{$ENDC}
|
|
ignore := RequestVolumeNotification(VNProcPtr(@volumeNotifyCode[1]),{refCon}0);
|
|
{$IFC qCatchFailures}
|
|
IF ignore <> noErr
|
|
THEN DebugStr('dpOnceOnlyInit: RequestVolumeNotification failed');
|
|
{$ENDC}
|
|
ignore := EndSystemMode;
|
|
{$IFC qCatchFailures}
|
|
IF ignore <> noErr
|
|
THEN DebugStr('dpOnceOnlyInit: EndSystemMode failed');
|
|
{$ENDC}
|
|
END; {with}
|
|
|
|
END; {if}
|
|
|
|
dpOnceOnlyInit := theErr;
|
|
END; { dpOnceOnlyInit }
|
|
|
|
|
|
|
|
|
|
{------------- dp_InitEditionPack -------------}
|
|
FUNCTION dp_InitEditionPack(versionAppKnows:INTEGER): OSErr; { called once by each app at start }
|
|
TYPE
|
|
phPackHeader= ^hPackHeader;
|
|
hPackHeader = ^pPackHeader;
|
|
pPackHeader = ^PackHeader;
|
|
PackHeader = RECORD
|
|
bra: INTEGER;
|
|
pack: ResType;
|
|
number: INTEGER;
|
|
version: INTEGER;
|
|
END;
|
|
VAR
|
|
package: hPackHeader;
|
|
emGlobals: EdtnMgrGlobalsPtr;
|
|
appsGlobals: PerAppGlobalsHandle;
|
|
fi: FailInfo;
|
|
anErr: OSErr;
|
|
BEGIN
|
|
appsGlobals := NIL;
|
|
|
|
{ make sure was caller know right routines }
|
|
package := phPackHeader(kPack11Handle)^;
|
|
IF (package^^.version <> versionAppKnows) & (versionAppKnows <> 16) THEN { 16 is emulated }
|
|
BEGIN
|
|
dp_InitEditionPack := editionMgrInitErr;
|
|
EXIT(dp_InitEditionPack);
|
|
END; {if}
|
|
|
|
{ make sure we are not purgable down }
|
|
HNoPurge(Handle(package));
|
|
|
|
emGlobals := dpGetGlobalsLocation^;
|
|
IF emGlobals = NIL THEN
|
|
BEGIN
|
|
anErr := dpOnceOnlyInit;
|
|
IF anErr <> noErr THEN
|
|
BEGIN
|
|
dp_InitEditionPack := anErr;
|
|
EXIT(dp_InitEditionPack);
|
|
END; {if}
|
|
END; {if}
|
|
|
|
{ set up failure handling, now that globals are around }
|
|
IF isFailure(fi, dp_InitEditionPack) THEN
|
|
BEGIN
|
|
IF appsGlobals <> NIL
|
|
THEN DisposHandle(Handle(appsGlobals));
|
|
EXIT(dp_InitEditionPack);
|
|
END; {if}
|
|
|
|
{ allocate space for apps dp globals in system heap }
|
|
appsGlobals := PerAppGlobalsHandle(NewHandleSys(SizeOf(PerAppGlobals)));
|
|
FailOSErr(MemError);
|
|
|
|
{ initialize the globals }
|
|
HLock(Handle(appsGlobals));
|
|
WITH appsGlobals^^ DO
|
|
BEGIN
|
|
FailOSErr(GetCurrentProcess(appPSN));
|
|
FailOSErr(GetAppSignature(appPSN, signature));
|
|
|
|
sectionHandleListHead := SectionHandle(kNoMoreSections);
|
|
emulator := EditionOpenerProcPtr(kStandardOpenerProcPtr);
|
|
|
|
initVersion := versionAppKnows;
|
|
|
|
{$IFC qUseAppName}
|
|
BlockMove(Ptr($910), @appName, 31);
|
|
{$ENDC}
|
|
|
|
{ insert in list of app globals }
|
|
emGlobals := dpGetGlobalsLocation^;
|
|
nextApp := emGlobals^.perAppListHead;
|
|
emGlobals^.perAppListHead := appsGlobals;
|
|
END; {with}
|
|
HUnLock(Handle(appsGlobals));
|
|
|
|
{ remember this app's globals in switched low-mem }
|
|
dpSetCurrentAppRefNum(appsGlobals);
|
|
|
|
Success(fi);
|
|
END; { dp_InitEditionPack }
|
|
|
|
|
|
|
|
{------------- dp_GetEditionOpenerProc -------------}
|
|
FUNCTION dp_GetEditionOpenerProc(VAR appsEmulator: EditionOpenerProcPtr): OSErr;
|
|
VAR
|
|
anErr: OSErr;
|
|
thisApp: AppRefNum;
|
|
BEGIN
|
|
anErr := dp_GetCurrentAppRefNum(thisApp);
|
|
|
|
IF anErr = noErr
|
|
THEN appsEmulator := thisApp^^.emulator;
|
|
|
|
dp_GetEditionOpenerProc := anErr;
|
|
END; { dp_GetEditionOpenerProc }
|
|
|
|
|
|
{------------- dp_SetEditionOpenerProc -------------}
|
|
FUNCTION dp_SetEditionOpenerProc(appsEmulator: EditionOpenerProcPtr): OSErr;
|
|
VAR
|
|
anErr: OSErr;
|
|
thisApp: AppRefNum;
|
|
BEGIN
|
|
anErr := dp_GetCurrentAppRefNum(thisApp);
|
|
|
|
IF anErr = noErr
|
|
THEN thisApp^^.emulator := appsEmulator;
|
|
|
|
dp_SetEditionOpenerProc := anErr;
|
|
END; { dp_SetEditionOpenerProc }
|
|
|
|
|
|
|
|
{------------- dp_QuitEditionPack -------------}
|
|
FUNCTION dp_QuitEditionPack: OSErr;
|
|
VAR
|
|
thisApp: AppRefNum;
|
|
pack: Handle;
|
|
appsGlobals: PerAppGlobalsHandle;
|
|
emGlobalsLoc: EdtnMgrGlobalsPtrPtr;
|
|
ignore: OSErr;
|
|
BEGIN
|
|
dp_QuitEditionPack := noErr;
|
|
|
|
IF dp_GetCurrentAppRefNum(thisApp) = noErr THEN
|
|
BEGIN
|
|
{ decrement UseCount in proper PupCBs, then remove if needed }
|
|
dpRemoveAppsPubCBs(thisApp);
|
|
|
|
{ remove Apps globals from list }
|
|
RemoveAppsGlobals(thisApp);
|
|
|
|
{ If no more Apps using this PACK then mark it purgeable }
|
|
IF dpGetGlobalsLocation^^.perAppListHead = NIL THEN
|
|
BEGIN
|
|
emGlobalsLoc := dpGetGlobalsLocation;
|
|
|
|
{ tell process manger to not call me anytime volumes change }
|
|
ignore := DeclineVolumeNotification(VNProcPtr(@emGlobalsLoc^^.volumeNotifyCode[1]),{refCon}0);
|
|
{$IFC qCatchFailures}
|
|
IF ignore <> noErr
|
|
THEN DebugStr('dp_QuitEditionPack: DeclineVolumeNotification failed');
|
|
{$ENDC}
|
|
|
|
{ remove globals }
|
|
DisposPtr(Ptr(emGlobalsLoc^));
|
|
emGlobalsLoc^ := NIL;
|
|
|
|
{ mark this pack purgable }
|
|
pack := pHandle(kPack11Handle)^;
|
|
HPurge(pack);
|
|
{ <MM, #86190> }
|
|
{ ### we really should check the lockCount kept by the package dispatcher }
|
|
{ and force it to 1. If we don't force it to 1, the lock count will }
|
|
{ stay at that level and this pack will never get unlocked. }
|
|
{ One condition that could corrupt the lock count is }
|
|
{ if an ExitToShell happens while in an EditionMgr routine. }
|
|
END; {if}
|
|
END; {if}
|
|
|
|
END; { dp_QuitEditionPack }
|
|
|
|
|
|
|
|
|
|
|