home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Pascal / Utilities / Toxic Waste 1.8 / Toxic Recieve Code / TRecieve < prev   
Encoding:
Text File  |  1994-01-08  |  16.3 KB  |  754 lines  |  [TEXT/PJMM]

  1. program ToxicRecieve;
  2.  
  3. {TOXIC RECIEVER version 1.8}
  4. {By David Peck: PeckSoftware@his.com}
  5.  
  6. {Toxic Waste's system extension to actually DO what the Toxic Sender wants...}
  7. {This program operates quite invisibly in the target computer's background, until}
  8. {the Toxic Sender wants it to do something... }
  9.  
  10.     uses
  11.         Script, AppleEvents, disks, ShutDown, sound;
  12.  
  13.     const
  14.         sleepyTime = $FFFFFFFF;
  15.         wakeUp = 0;
  16.  
  17.     type
  18.         SessStat = (sessNotBegun, sessOpenPend, sessOpenDone, sessInformPend, sessInformDone, sessReadPend, sessReadDone, sessRespPend, sessRespDone, sessEndPend, sessEndDone);
  19.         AlertStat = (alertNotSent, alertSent);
  20.  
  21.     const
  22. {What kinds of things can you do?}
  23.         MeltScreen = 1;
  24.         BlankScreen = 2;
  25.         InvertScreen = 3;
  26.         RandomIcons = 4;
  27.  
  28.         Beep = 6;
  29.         RandomBeep = 7;
  30.  
  31.         EjectDisks = 9;
  32.         StartEject = 10;
  33.         EndEject = 11;
  34.  
  35.         Restart = 13;
  36.         PowerDown = 14;
  37.  
  38.         Message = 16;
  39.  
  40.     type
  41.  
  42.         delayMethod = (timeDelay, mouseDelay, activeMouseDelay);
  43.  
  44.         ElementInfo = record
  45.                 when: longint;
  46.                 method: delayMethod;
  47.                 what: integer;
  48.                 numTimes: integer;
  49.                 mess: Str255;
  50.             end;
  51.         ElementInfoArray = array[1..6] of ElementInfo;
  52.         QInfo = record
  53.                 num: integer;
  54.                 els: ElementInfoArray;
  55.             end;
  56.  
  57.         DataRecord = record
  58. {Items for a message being SENT by Toxic Sender.}
  59.                 what: integer;            {What I actually want you to do}
  60.                 mess: Str255;
  61.                 numTimes: integer;    {For "Beep" and "Random Icons" message}
  62.                 isDelayed: boolean;    {Is this event a delayed event?}
  63.                 dMethod: delayMethod;    {Method of delaying the event}
  64.                 numSecs: longint;        {If it is delayed, how many seconds long?}
  65.                 usageCheck: boolean;    {TRUE if user wants to know if the Mac is being used}
  66.  
  67. {Items for a message being RECIEVED from Toxic Reciever.}
  68.                 notMovedSince: longint;{How long has it been since the user moved the mouse?}
  69.                 notQ: boolean;                {TRUE if the Toxic Reciever's Queue was full}
  70.                 QCheck: QInfo;                {Returned if user selected usageCheck to view Q data}
  71.                                                             {THIS IS NOT A COMPLETE Q. If it was, there would be}
  72.                                                             {an infinitely recursive data structure...}
  73.             end;
  74.  
  75.         PDataHdl = ^PDataPtr;
  76.         PDataPtr = ^PDataRec;
  77.         PDataRec = record
  78.                 pblock: PPCParamBlockRec;
  79.                 port: PPCPortRec;
  80.                 location: LocationNameRec;
  81.                 user: Str32;
  82.                 portRef: integer;
  83.                 sessionRef: integer;
  84.                 buffer: DataRecord;
  85.                 err: OSErr;
  86.                 errMessage: Str255;
  87.                 sessionStatus: SessStat;
  88.                 alertStatus: AlertStat;
  89.             end;
  90.  
  91.     var
  92.         pdata: PDataPtr;
  93.         pd: PDataPtr;
  94.         g_quit: boolean;
  95.         g_psn: ProcessSerialNumber;
  96.         g_sleepTicks: longint;
  97.         err: OSErr;
  98.         tr: rect;
  99.         gEjects: boolean;
  100.         gFontBloat: boolean;
  101.  
  102.     procedure _______G_______;
  103.     begin
  104.     end;
  105.  
  106.     type
  107.         Element = record
  108.                 when: longint;
  109.                 method: delayMethod;
  110.                 event: DataRecord;
  111.             end;
  112.         ElementArray = array[1..6] of Element;
  113.         QType = record
  114.                 num: integer;
  115.                 els: ElementArray;
  116.             end;
  117. {Globals}
  118.     var
  119.         gLastMoved: longint;        {How long since mouse moved?}
  120.         gLastPos: point;
  121.         gQError: boolean;            {Was there a previous Q Error?}
  122.         gQ: QType;                    {The event Queue}
  123.  
  124.     function AEOpenHandler (var messageIn: AppleEvent; var reply: AppleEvent; refIn: longint): OSErr;
  125.     begin
  126.         AEOpenHandler := errAEEventNotHandled;
  127.     end;
  128.  
  129.     function AEOpenDocHandler (var messageIn: AppleEvent; var reply: AppleEvent; refIn: longint): OSErr;
  130.     begin
  131.         AEOpenDocHandler := errAEEventNotHandled;
  132.     end;
  133.  
  134.     function AEQuitHandler (var messageIn: AppleEvent; var reply: AppleEvent; refIn: longint): OSErr;
  135.         var
  136.             err: OSErr;
  137.     begin
  138.         g_Quit := true;
  139.         err := WakeUpProcess(g_PSN);
  140.         AEQuitHandler := noErr;
  141.     end;
  142.  
  143.     function AEPrintHandler (var messageIn: AppleEvent; var reply: AppleEvent; refIn: longint): OSErr;
  144.     begin
  145.         AEPrintHandler := errAEEventNotHandled;
  146.     end;
  147.  
  148.     procedure InitAEStuff;
  149.         var
  150.             e: OSErr;
  151.     begin
  152.         e := AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, @AEOpenHandler, 0, false);
  153.         e := AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, @AEOpenDocHandler, 0, false);
  154.         e := AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, @AEQuitHandler, 0, false);
  155.         e := AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, @AEPrintHandler, 0, false);
  156.     end;
  157.  
  158.     procedure Quit;
  159.         var
  160.             err: OSErr;
  161.             pd: PDataPtr;
  162.             pr: PPCParamBlockPtr;
  163.  
  164.     begin
  165.         pd := pdata;
  166.         pr := PPCParamBlockPtr(pdata);
  167.  
  168.         if (pd^.sessionRef <> 0) then
  169.             begin
  170.                 pr^.endParam.ioCompletion := nil;
  171.                 err := PPCEnd(@pr^.endParam, true);
  172.             end;
  173.         if (pd^.portRef <> 0) then
  174.             begin
  175.                 pr^.closeParam.ioCompletion := nil;
  176.                 pr^.closeParam.portRefNum := pd^.portRef;
  177.                 err := PPCClose(@pr^.closeParam, false);
  178.             end;
  179.     end;
  180.  
  181.     procedure EndDone (pb: PPCParamBlockPtr);
  182.     begin
  183.         PDataPtr(pb)^.sessionStatus := sessEndDone;
  184.     end;
  185.  
  186.     procedure DoEnd (pd: PDataPtr);
  187.         var
  188.             pb: PPCParamBlockPtr;
  189.             err: OSErr;
  190.     begin
  191.         pb := @pd^.pblock;
  192.  
  193.         pd^.sessionStatus := sessEndPend;
  194.         pb^.endParam.ioCompletion := @EndDone;
  195.  
  196.         err := PPCEnd(PPCEndPBPtr(pb), true);
  197.     end;
  198.  
  199.     procedure RespondDone (pb: PPCParamBlockPtr);
  200.     begin
  201.         PDataPtr(pb)^.sessionStatus := sessRespDone;
  202.  
  203.         PDataPtr(pb)^.err := pb^.writeParam.ioResult;
  204.     end;
  205.  
  206.     procedure PutQData (pd: PDataPtr);
  207.         var
  208.             count: integer;
  209.     begin
  210.         pd^.buffer.QCheck.num := gQ.num;
  211.         for count := 1 to gQ.num do
  212.             with pd^.buffer.QCheck.els[count] do
  213.                 begin
  214.                     when := gQ.els[count].when;
  215.                     method := gQ.els[count].method;
  216.                     what := gQ.els[count].event.what;
  217.                     numTimes := gQ.els[count].event.numTimes;
  218.                     mess := gq.els[count].event.mess;
  219.                 end;
  220.     end;
  221.  
  222.     procedure DoRespond (pd: PDataPtr);
  223.         var
  224.             pb: PPCParamBlockPtr;
  225.             tim: longint;
  226.     begin
  227.         pb := @pd^.pblock;
  228.  
  229.         pd^.sessionStatus := sessRespPend;
  230.  
  231.         pb^.writeParam.ioCompletion := @RespondDone;
  232.         pb^.writeParam.bufferLength := SizeOf(pd^.buffer);
  233.         pb^.writeParam.bufferPtr := @pd^.buffer;
  234.         pb^.writeParam.more := false;
  235.         pb^.writeParam.userData := 0;
  236.         pb^.writeParam.blockCreator := 'BIOZ';
  237.         pb^.writeParam.blockType := 'RESP';
  238.  
  239.         GetDateTime(tim);
  240.         pd^.buffer.notMovedSince := tim - gLastMoved;
  241.         pd^.buffer.notQ := gQError;
  242.         gQError := false;
  243.         if pd^.buffer.usageCheck then
  244.             PutQData(pd);
  245.  
  246.         pd^.err := PPCWrite(PPCWritePBPtr(pb), true);
  247.     end;
  248.  
  249.     function aRandom (upperBound: Integer): Integer;
  250.         var
  251.             rand: Integer;
  252.     begin
  253.         if upperBound > 0 then
  254.             rand := abs(random) mod upperBound + 1
  255.         else
  256.             rand := 1;
  257.         aRandom := rand;
  258.     end;
  259.  
  260.     procedure Swap (var a, b: integer);
  261.         var
  262.             t: integer;
  263.     begin
  264.         t := a;
  265.         a := b;
  266.         b := t;
  267.     end;
  268.  
  269.     procedure Melt;
  270.         var
  271.             m: Point;
  272.             gp: GrafPtr;
  273.             theEvent: EventRecord;
  274.             mine: boolean;
  275.             ar, br: rect;
  276.             drawingPort: GrafPtr;
  277.             count: integer;
  278.  
  279.     begin
  280.         GetPort(gp);
  281.         SetRect(ar, 0, 0, 150, 150);
  282.         drawingPort := GrafPtr(NewPtr(sizeof(GrafPort)));
  283.         OpenPort(drawingPort);
  284.         SetPort(drawingPort);
  285.         SetPortBits(screenbits);
  286.  
  287.         for count := 1 to 750 do
  288.             begin
  289.                 SetRect(ar, ARandom(screenBits.bounds.right), ARandom(screenBits.bounds.bottom), ARandom(screenBits.bounds.right), ARandom(screenBits.bounds.bottom));
  290.                 if (ar.top > ar.bottom) then
  291.                     Swap(ar.top, ar.bottom);
  292.                 if (ar.left > ar.right) then
  293.                     Swap(ar.left, ar.right);
  294.                 br := ar;
  295.                 OffsetRect(br, ARandom(10) - 5, ARandom(6));
  296.                 CopyBits(drawingPort^.portBits, drawingPort^.portBits, ar, br, srcCopy, nil);
  297.             end;
  298.  
  299.         SetPort(gp);
  300.     end;
  301.  
  302.     procedure IScreen;
  303.         var
  304.             m: Point;
  305.             gp: GrafPtr;
  306.             theEvent: EventRecord;
  307.             mine: boolean;
  308.             ar, br: rect;
  309.             drawingPort: GrafPtr;
  310.             count: integer;
  311.  
  312.     begin
  313.         GetPort(gp);
  314.         SetRect(ar, 0, 0, 150, 150);
  315.         drawingPort := GrafPtr(NewPtr(sizeof(GrafPort)));
  316.         OpenPort(drawingPort);
  317.         SetPort(drawingPort);
  318.         SetPortBits(screenbits);
  319.         InvertRect(screenBits.bounds);
  320.         SetPort(gp);
  321.     end;
  322.  
  323.     procedure BScreen;
  324.         var
  325.             m: Point;
  326.             gp: GrafPtr;
  327.             theEvent: EventRecord;
  328.             mine: boolean;
  329.             ar, br: rect;
  330.             drawingPort: GrafPtr;
  331.             count: integer;
  332.  
  333.     begin
  334.         GetPort(gp);
  335.         SetRect(ar, 0, 0, 150, 150);
  336.         drawingPort := GrafPtr(NewPtr(sizeof(GrafPort)));
  337.         OpenPort(drawingPort);
  338.         SetPort(drawingPort);
  339.         SetPortBits(screenbits);
  340.         FillRect(screenBits.bounds, black);
  341.         SetPort(gp);
  342.     end;
  343.  
  344.     function POffsetRect (r: rect; a, b: integer): rect;
  345.     begin
  346.         OffsetRect(r, a, b);
  347.         POffsetRect := r;
  348.     end;
  349.  
  350.     procedure RIcons (rep: integer);
  351.         var
  352.             m: Point;
  353.             gp: GrafPtr;
  354.             mine: boolean;
  355.             ar, br: rect;
  356.             drawingPort: GrafPtr;
  357.             count: integer;
  358.         const
  359.             maxNum = 15;
  360.         var
  361.             endThis: boolean;
  362.             theEvent: EventRecord;
  363.             sRec, oLC: rect;
  364.             numIcons: integer;
  365.             icn: Handle;
  366.             loc: Rect;
  367.             c: integer;
  368.             actNum: integer;
  369.  
  370.     begin
  371.         GetPort(gp);
  372.         SetRect(ar, 0, 0, 150, 150);
  373.         drawingPort := GrafPtr(NewPtr(sizeof(GrafPort)));
  374.         OpenPort(drawingPort);
  375.         SetPort(drawingPort);
  376.         SetPortBits(screenbits);
  377.  
  378.         numIcons := CountResources('ICON');
  379.         actNum := NumIcons;
  380.         if numIcons > maxNum then
  381.             numIcons := maxNum;
  382.         SetRect(sRec, 0, 0, 32, 32);
  383.  
  384.         for c := 1 to rep do
  385.             begin
  386.                 icn := GetIndResource('ICON', ARandom(actNum));
  387.                 loc := POffsetRect(sRec, ARandom(screenBits.bounds.right - 33), ARandom(screenBits.bounds.bottom - 33));
  388.                 PlotIcon(loc, icn);
  389.                 InvertRect(loc);
  390.             end;
  391.  
  392.         SetPort(gp);
  393.     end;
  394.  
  395.     procedure RBeep (rep: integer);
  396.         var
  397.             numSnds: integer;
  398.             theSound: Handle;
  399.             err: OSErr;
  400.             count: integer;
  401.     begin
  402.         numSnds := CountResources('snd ');
  403.  
  404.         for count := 1 to rep do
  405.             begin
  406.                 theSound := GetIndResource('snd ', ARandom(numSnds));
  407.                 err := SndPlay(nil, theSound, FALSE);
  408.             end;
  409.     end;
  410.  
  411.     procedure ShowMessage (me: Str255);
  412.         var
  413.             m: Point;
  414.             gp: GrafPtr;
  415.             mine: boolean;
  416.             ar, br: rect;
  417.             drawingPort: GrafPtr;
  418.             count: integer;
  419.         const
  420.             maxNum = 15;
  421.         var
  422.             endThis: boolean;
  423.             theEvent: EventRecord;
  424.             sRec, oLC: rect;
  425.             numIcons: integer;
  426.             icn: Handle;
  427.             loc: Rect;
  428.             c: integer;
  429.             actNum: integer;
  430.             testSize: integer;
  431.  
  432.     begin
  433.         GetPort(gp);
  434.         SetRect(ar, 0, 0, 150, 150);
  435.         drawingPort := GrafPtr(NewPtr(sizeof(GrafPort)));
  436.         OpenPort(drawingPort);
  437.         SetPort(drawingPort);
  438.         SetPortBits(screenbits);
  439.  
  440.         testSize := 128;
  441.         TextMode(srcCopy);
  442.         TextFace([Bold]);
  443.         TextSize(72);        {PICK BIG TEXT SIZE}
  444.         while (testSize > 10) and (StringWidth(me) > (screenBits.bounds.right - 20)) do
  445.             begin            {TRY AND FIT THE TEXT ON THE SCREEN}
  446.                 testSize := testSize - 4;
  447.                 TextSize(testSize);
  448.             end;
  449.  
  450.         MoveTo((screenBits.bounds.right div 2) - (StringWidth(me) div 2), screenBits.bounds.bottom div 2);
  451.         DrawString(me);
  452.  
  453.         SetPort(gp);
  454.     end;
  455.  
  456.     procedure DoChoice (what, rep: integer; m: Str255);
  457.         var
  458.             err: OSErr;
  459.             count: integer;
  460.     begin
  461.         case what of
  462.             MeltScreen: 
  463.                 Melt;
  464.             Beep: 
  465.                 for count := 1 to rep do
  466.                     SysBeep(10);
  467.             RandomBeep: 
  468.                 RBeep(rep);
  469.             Restart: 
  470.                 ShutDwnStart;
  471.             InvertScreen: 
  472.                 IScreen;
  473.             BlankScreen: 
  474.                 BScreen;
  475.             EjectDisks: 
  476.                 begin
  477.                     err := DiskEject(1);
  478.                     err := DiskEject(2);
  479.                 end;
  480.             StartEject: 
  481.                 gEjects := true;
  482.             EndEject: 
  483.                 gEjects := false;
  484.             RandomIcons: 
  485.                 RIcons(rep);
  486.             PowerDown: 
  487.                 ShutDwnPower;
  488.             Message: 
  489.                 ShowMessage(m);
  490.             otherwise
  491.                 begin
  492.                 end;
  493.         end;
  494.     end;
  495.  
  496.     procedure AddQ (rec: DataRecord);
  497.         var
  498.             tim: longint;
  499.     begin
  500.         gQError := false;
  501.         if gQ.num = 6 then
  502.             gQError := true
  503.         else
  504.             begin
  505.                 gQ.num := gQ.num + 1;
  506.                 gQ.els[gQ.num].event := rec;
  507.                 GetDateTime(tim);
  508.                 gQ.els[gQ.num].when := tim + rec.numSecs;
  509.                 gQ.els[gQ.num].method := rec.dMethod;
  510.             end;
  511.     end;
  512.  
  513.     procedure DoAlert (pd: PDataPtr);
  514.         var
  515.             pb: PPCParamBlockPtr;
  516.             err: OSErr;
  517.             str: Ptr;
  518.  
  519.     begin
  520.         if not pd^.buffer.usageCheck then
  521.             if not pd^.buffer.isDelayed then
  522.                 DoChoice(pd^.buffer.what, pd^.buffer.numTimes, pd^.buffer.mess)
  523.             else
  524.                 AddQ(pd^.buffer);
  525.         pd^.alertStatus := alertSent;
  526.     end;
  527.  
  528.     procedure ReadDone (pb: PPCParamBlockPtr);
  529.     begin
  530.         PDataPtr(pb)^.sessionStatus := sessReadDone;
  531.         PDataPtr(pb)^.err := pb^.readParam.ioResult;
  532.     end;
  533.  
  534.     procedure DoRead (pd: PDataPtr);
  535.         var
  536.             pb: PPCParamBlockPtr;
  537.     begin
  538.         pb := @pd^.pblock;
  539.  
  540.         pd^.sessionStatus := sessReadPend;
  541.  
  542.         pb^.readParam.ioCompletion := @ReadDone;
  543.         pb^.readParam.bufferLength := SizeOf(DataRecord);
  544.         pb^.readParam.bufferPtr := @pd^.buffer;
  545.  
  546.         pd^.err := PPCRead(PPCReadPBPtr(pb), true);
  547.     end;
  548.  
  549.     procedure InformDone (pb: PPCParamBlockPtr);
  550.         var
  551.             err: OSErr;
  552.     begin
  553.         g_sleepTicks := wakeUp;        {Time to do some work!}
  554.  
  555.         PDataPtr(pb)^.sessionStatus := sessInformDone;
  556.         PDataPtr(pb)^.err := pb^.informParam.ioResult;
  557.  
  558.         err := WakeUpProcess(g_PSN);        {Hello, world!}
  559.     end;
  560.  
  561.     procedure DoInform (pd: PDataPtr);
  562.         var
  563.             pb: PPCParamBlockPtr;
  564.     begin
  565.         pb := @pd^.pblock;
  566.  
  567.         pd^.sessionRef := 0;
  568.         pd^.buffer.what := 0;
  569.         pd^.buffer.numTimes := 0;
  570.         pd^.err := noErr;
  571.         pd^.errMessage := '';
  572.         pd^.alertStatus := alertNotSent;
  573.  
  574.         pb^.informParam.ioCompletion := @InformDone;
  575.         pb^.informParam.portRefNum := pd^.portRef;
  576.         pb^.informParam.autoAccept := true;
  577.         pb^.informParam.portName := @pd^.port;
  578.         pb^.informParam.locationName := @pd^.location;
  579.         pb^.informParam.userName := @pd^.user;
  580.  
  581.         pd^.sessionStatus := sessInformPend;
  582.         pd^.err := PPCInform(PPCInformPBPtr(pb), true);
  583.  
  584.         g_sleepTicks := 10;
  585.     end;
  586.  
  587.     procedure OpenDone (pb: PPCParamBlockPtr);
  588.     begin
  589.         PDataPtr(pb)^.sessionStatus := sessOpenDone;
  590.         PDataPtr(pb)^.err := pb^.openParam.ioResult;
  591.         PDataPtr(pb)^.portRef := PDataPtr(pb)^.pBlock.openParam.portRefNum;
  592.     end;
  593.  
  594.     procedure DoOpen (pd: PDataPtr);
  595.         var
  596.             pb: PPCParamBlockPtr;
  597.     begin
  598.         pb := @pd^.pBlock;
  599.  
  600.         pd^.port.nameScript := smRoman;
  601.         pd^.port.name := 'Message Reciever';
  602.         pd^.port.portKindSelector := ppcByCreatorAndType;
  603.         pd^.port.portCreator := 'CHAT';
  604.         pd^.port.portType := 'RECV';
  605.  
  606.         pd^.location.locationKindSelector := ppcNBPTypeLocation;
  607.         pd^.location.nbpType := 'Message Reciever';
  608.  
  609.         pb^.openParam.ioCompletion := @OpenDone;
  610.         pb^.openParam.serviceType := ppcServiceRealTime;
  611.         pb^.openParam.resFlag := 0;
  612.         pb^.openParam.portName := @pd^.port;
  613.         pb^.openParam.locationName := @pd^.location;
  614.         pb^.openParam.networkVisible := true;
  615.  
  616.         pd^.sessionStatus := sessOpenPend;
  617.         pd^.err := PPCOpen(PPCOpenPBPtr(pb), true);
  618.     end;
  619.  
  620.     procedure InitPData (var pd: PDataPtr);
  621.     begin
  622.         pd := PDataPtr(NewPtrClear(sizeOf(PDataRec)));
  623.         pd^.user := '';
  624.         pd^.portRef := 0;
  625.         pd^.sessionRef := 0;
  626.         pd^.buffer.what := 0;
  627.         pd^.buffer.numTimes := 0;
  628.         pd^.buffer.mess := '';
  629.         pd^.err := noErr;
  630.         pd^.errMessage := '';
  631.         pd^.sessionStatus := sessNotBegun;
  632.         pd^.alertStatus := alertNotSent;
  633.     end;
  634.  
  635.     procedure QCheck;
  636.         var
  637.             tim: longint;
  638.             c, e: integer;
  639.     begin
  640.         c := 0;
  641.         while c < gQ.num do
  642.             begin
  643.                 c := c + 1;
  644.  
  645.                 if (gQ.els[c].method = timeDelay) or (gQ.els[c].method = activeMouseDelay) then
  646.                     begin
  647.                         GetDateTime(tim);
  648.                         if tim - gQ.els[c].when > 1 then
  649.                             begin
  650.                                 DoChoice(gQ.els[c].event.what, gQ.els[c].event.numTimes, gQ.els[c].event.mess);
  651.                                 for e := c to gQ.num - 1 do
  652.                                     gQ.els[e] := gQ.els[e + 1];
  653.                                 gQ.num := gQ.num - 1;
  654.                             end;
  655.                     end
  656.                 else                    {Mouse Delay!}
  657.                     begin
  658.                         GetDateTime(tim);
  659.                         if tim - gLastMoved < 10 then
  660.                             begin            {Mouse moved within 10 seconds ago; O.K. to start.}
  661.                                 gQ.els[c].method := activeMouseDelay;
  662.                                 gQ.els[c].when := tim + gQ.els[c].event.numSecs;
  663.                             end;
  664.                     end;
  665.  
  666.             end;
  667.     end;
  668.  
  669.     procedure EventLoop;
  670.         var
  671.             evt: EventRecord;
  672.             err: OSErr;
  673.             pd: PDataPtr;
  674.             str: Str255;
  675.             i: integer;
  676.             mine: boolean;
  677.             mLoc: Point;
  678.  
  679.     begin
  680.         pd := pdata;
  681.  
  682.         while not g_quit do
  683.             begin
  684.  
  685.                 mine := WaitNextEvent(everyEvent, evt, g_sleepTicks, nil);
  686.                 GetMouse(mLoc);
  687.                 if (mLoc.h <> gLastPos.h) or (mLoc.v <> gLastPos.v) then
  688.                     begin
  689.                         GetDateTime(gLastMoved);
  690.                         gLastPos := mLoc;
  691.                     end;
  692.                 if (g_quit) then
  693.                     exit(EventLoop);
  694.                 if gEjects then
  695.                     begin
  696.                         err := DiskEject(1);
  697.                         err := DiskEject(2);
  698.                     end;
  699.                 QCheck;
  700.  
  701.                 if (pd^.sessionStatus = sessInformDone) then
  702.                     DoRead(pd)
  703.                 else if ((pd^.sessionStatus = sessReadDone) and (pd^.alertStatus = alertNotSent)) then
  704.                     begin
  705.                         DoAlert(pd);
  706.                         DoRespond(pd);
  707.                     end
  708.                 else if pd^.sessionStatus = sessRespDone then
  709.                     DoEnd(pd)
  710.                 else if (pd^.sessionStatus = sessOpenDone) or (pd^.sessionStatus = sessEndDone) then
  711.                     DoInform(pd);
  712.                 if evt.what = kHighLevelEvent then
  713.                     err := AEProcessAppleEvent(evt);
  714.  
  715.             end;
  716.     end;
  717.  
  718.     procedure Initialize;
  719.     begin
  720.         InitGraf(@thePort);
  721.         InitFonts;
  722.         InitMenus;
  723.         TEInit;
  724.         InitDialogs(nil);
  725.     end;
  726.  
  727.     procedure InitGlobs;
  728.     begin
  729.         gQ.num := 0;
  730.         gQError := false;
  731.         GetDateTime(gLastMoved);
  732.         GetMouse(gLastPos);
  733.     end;
  734.  
  735. {$I-}
  736. begin
  737.     Initialize;
  738.     InitGlobs;
  739.     gEjects := false;
  740.     gFontBloat := false;
  741.     g_sleepTicks := WakeUp;
  742.     g_quit := false;
  743.  
  744.     InitAEStuff;
  745.     err := PPCInit;
  746.     InitPData(pdata);
  747.     pd := pdata;
  748.     err := GetCurrentProcess(g_psn);
  749.  
  750.     DoOpen(pd);
  751.  
  752.     EventLoop;
  753.     Quit;
  754. end.