DIRECTORY FanoutStream, PropList, SF, SharedCell, SlatePrivateTypes, Slate; SlateInstantiationImpl: CEDAR MONITOR IMPORTS FanoutStream, PropList, SharedCell, Slate EXPORTS Slate ~ BEGIN OPEN Slate; SessionPrivateRec: PUBLIC TYPE = SlatePrivateTypes.SessionPrivateRec; InstancePrivateRec: PUBLIC TYPE = SlatePrivateTypes.InstancePrivateRec; NewSession: PUBLIC PROC [] RETURNS [session: Session] = { session ¬ NEW[SessionRec ¬ [ activePage: NIL, debugLog: FanoutStream.Create[forwardClose: FALSE], properties: PropList.NewPropList[], nameCell: SharedCell.Create[], private: NEW[SessionPrivateRec ¬ [ instanceList: PropList.NewPropList[], pageList: NIL ]] ]]; CallGlobalEvent[instance: NIL, session: session, event: $NewSession]; }; NewInstance: PUBLIC PROC [session: Session] RETURNS [instance: Instance] = { instance ¬ NEW[InstanceRec ¬ [ session: session, log: FanoutStream.Create[forwardClose: TRUE], properties: PropList.NewPropList[], private: NEW[InstancePrivateRec ¬ []] ]]; IF session#NIL THEN { sessionPrivate: REF SessionPrivateRec ¬ session.private; PropList.TrustedAddNewProp[sessionPrivate.instanceList, instance, instance]; }; CallGlobalEvent[instance: instance, session: session, event: $NewInstance]; }; DestroyInstance: PUBLIC PROC [instance: Instance] = { session: Session ¬ instance.session; IF session#NIL THEN { sessionPrivate: REF SessionPrivateRec ¬ session.private; instanceList: PropList.List ~ sessionPrivate.instanceList; didit: BOOL ¬ FALSE; Monitored: ENTRY PROC [] = INLINE { didit ¬ instance.session#NIL; instance.session ¬ NIL; [] ¬ PropList.RemProp[instanceList, instance]; }; IF instanceList=NIL THEN ERROR; Monitored[]; IF didit THEN CallGlobalEvent[instance: instance, session: session, event: $InstanceDestroyed]; }; }; CountInstances: PUBLIC PROC [session: Session] RETURNS [n: INT ¬ 0] = { EachProp: PropList.EachPropProc = {n ¬ n+1}; sessionPrivate: REF SessionPrivateRec ¬ session.private; [] ¬ PropList.Enumerate[sessionPrivate.instanceList, EachProp]; }; EnumerateInstances: PUBLIC PROC [session: Session, eachInstance: InstanceProc, clientData: REF ¬ NIL] RETURNS [quit: BOOL ¬ FALSE] = { EachProp: PropList.EachPropProc = { quit ¬ eachInstance[instance: NARROW[key], clientData: clientData].quit }; sessionPrivate: REF SessionPrivateRec ¬ session.private; quit ¬ PropList.Enumerate[sessionPrivate.instanceList, EachProp, clientData].quit }; CallSessionForAllInstancesOfSession: PUBLIC PROC [session: Session ¬ NIL, event: REF, callData: REF ¬ NIL] = { EachInstance: InstanceProc = { CallSessionEvent[instance, session, event, callData] }; [] ¬ EnumerateInstances[session, EachInstance, callData] }; CallGlobalForAllInstancesOfSession: PUBLIC PROC [session: Session ¬ NIL, event: REF, callData: REF ¬ NIL] = { EachInstance: InstanceProc = { CallGlobalEvent[instance, session, event, callData] }; [] ¬ EnumerateInstances[session, EachInstance, callData] }; END. ϊ SlateInstantiationImpl.mesa Copyright Σ 1992, 1993 by Xerox Corporation. All rights reserved. Created by Christian Jacobi, November 2, 1990 1:04:32 pm PST Christian Jacobi, July 3, 1993 9:59 am PDT Theimer, December 17, 1992 1:29 pm PST ΚL•NewlineDelimiter ™™J™BIcodešœ=™=J™*J™&J™—šΟk ˜ K˜ K˜ K˜K˜ K˜K˜—J˜šΟnœœ˜%Jšœ*˜1Jšœ˜—Kšœœ˜K˜Kšœœœ'˜EKšœœœ(˜GK˜šž œœœœ˜9šœ œ˜Kšœ œ˜Kšœ,œ˜3K˜#K˜šœ œ˜"K˜%Kšœ ˜ K˜—K˜—Kšœœ(˜EK˜K˜—šž œœœœ˜Lšœ œ˜K˜Kšœ'œ˜-K˜#Kšœ œ˜%K˜—šœ œœ˜Kšœœ%˜8K˜LK˜—K˜KK˜K˜—šžœœœ˜5K˜$šœ œœ˜Kšœœ%˜8K˜:Kšœœœ˜šž œœœœ˜#Kšœœ˜Kšœœ˜K˜.K˜—Jšœœœœ˜ J˜ šœœ˜K˜Q—J˜—K˜—K˜š žœœœœœ ˜GKšžœ$˜,Kšœœ%˜8K˜?K˜K˜—šžœœœ<œœœœœ˜†šžœ˜#Kšœœ#˜GK˜—Kšœœ%˜8K˜QK˜K˜—šž#œœœœ œ œœ˜nšž œ˜K˜5K˜—K˜8K˜K™—šž"œœœœ œ œœ˜mšž œ˜K˜4K˜—K˜8K˜K™—Kšœ˜K˜K˜—…— f¬