home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Snippets / PNL Libraries / MyProcesses.p < prev    next >
Encoding:
Text File  |  1997-02-07  |  12.5 KB  |  427 lines  |  [TEXT/CWIE]

  1. unit MyProcesses;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Types, Files, Memory, Processes;
  7.  
  8.     const
  9.         application = 'APPL';
  10.         kApplicationToFront = true;
  11.         kApplicationInBackground = false;
  12.  
  13.     function FindApplication (creator: OSType; var fs: FSSpec): OSErr;
  14.     function FindProcess (creator, typ: OSType; var process: ProcessSerialNumber; var fs: FSSpec): boolean;
  15.     function FindAppWithHint(vrn:integer; dirID:longint; creator, typ: OSType; var app:FSSpec; var psn: ProcessSerialNumber; var isrunning:Boolean):OSErr;
  16.     function FindControlPanel (fcreator: OSType; var fs: FSSpec): OSErr;
  17.     function FindInFolder(vrn:integer; dirID:longint; fcreator, ftype: OSType; var fs:FSSpec):OSErr;
  18.  
  19.     function IsRunning (creator, typ: OSType): boolean;
  20.  
  21.     function LaunchWithDocument (creator, typ: OSType; fs: FSSpec; tofront: boolean):OSErr;
  22.     function LaunchApp (creator, typ: OSType; tofront: boolean):OSErr;
  23.     function LaunchAppWithHint(vrn:integer; dirID:longint; creator, typ: OSType; tofront: boolean):OSErr;
  24.     function LaunchFSSpec (var fs: FSSpec; tofront: boolean):OSErr;
  25.  
  26.     function SendQuitToApplication(process: ProcessSerialNumber):OSErr;
  27.     procedure QuitApplication (creator, typ: OSType);
  28.  
  29.     function OpenControlPanel (fcreator: OSType): boolean;
  30.     function TellFinderToLaunch (fs: FSSpec; tofront: boolean): boolean;
  31.     
  32. implementation
  33.  
  34.     uses
  35.         AppleEvents, Aliases, Folders, GestaltEqu, Finder, Errors, 
  36.         MyTypes, MySystemGlobals, MyFileSystemUtils, MyUtils, MyAEUtils, MyMemory;
  37.  
  38.     procedure AddFSSToAEList (var list: AEDescList; row: integer; var fs: FSSpec);
  39.         var
  40.             fileAlias: AliasHandle;
  41.             err: OSErr;
  42.     begin
  43.         err := NewAlias(nil, fs, fileAlias);
  44.         if err = noErr then begin
  45.             HLock(Handle(fileAlias));
  46.             err := AEPutPtr(list, row, typeAlias, Ptr(fileAlias^), fileAlias^^.aliasSize);
  47.             MDisposeHandle( fileAlias );
  48.         end;
  49.     end;
  50.  
  51.     function FindInFolder(vrn:integer; dirID:longint; fcreator, ftype: OSType; var fs:FSSpec):OSErr;
  52.         var
  53.             err:OSErr;
  54.             pb: HParamBlockRec;
  55.             i: integer;
  56.     begin
  57.         fs.vRefNum := vrn;
  58.         fs.parID := dirID;
  59.         i := 1;
  60.         repeat
  61.             pb.ioNamePtr := @fs.name;
  62.             pb.ioVRefNum := vrn;
  63.             pb.ioDirID := dirID;
  64.             pb.ioFDirIndex := i;
  65.             i := i + 1;
  66.             err := PBHGetFInfoSync(@pb);
  67.             if err = noErr then begin
  68.                 if (pb.ioFlFndrInfo.fdCreator = fcreator) & (pb.ioFlFndrInfo.fdType = ftype) then begin
  69.                     leave;
  70.                 end;
  71.             end;
  72.         until (err <> noErr);
  73.         FindInFolder := err;
  74.     end;
  75.  
  76.     function FindControlPanel (fcreator: OSType; var fs: FSSpec): OSErr;
  77.         var
  78.             err: OSErr;
  79.     begin
  80.         err := FindFolder(kOnSystemDisk, kControlPanelFolderType, false, fs.vRefNum, fs.parID);
  81.         if err = noErr then begin
  82.             err := FindInFolder(fs.vRefNum, fs.parID, fcreator, 'cdev', fs);
  83.         end;
  84.         FindControlPanel := err;
  85.     end;
  86.  
  87.     function TellFinderToLaunch (fs: FSSpec; tofront: boolean): boolean;
  88.         var
  89.             process: ProcessSerialNumber;
  90.             err, junk: OSErr;
  91.             targetAddress: AEDesc;
  92.             fileList: AEDescList;
  93.             theEvent, theReply: AppleEvent;
  94.             sendmode: AESendMode;
  95.             gv: longint;
  96.             finder_fs: FSSpec;
  97.     begin
  98.         err := -1;
  99.         if (Gestalt(gestaltFinderAttr, gv) = noErr) & btst(gv, gestaltOSLCompliantFinder) then begin
  100.             if FindProcess('MACS', 'FNDR', process, finder_fs) then begin
  101.                 AECreate(theEvent);
  102.                 AECreate(theReply);
  103.                 AECreate(fileList);
  104.                 AECreate(targetAddress);
  105.                 err := CreateProcessSerialNumberDesc(process, targetAddress);
  106.                 if err = noErr then begin
  107.                     err := AECreateAppleEvent(kCoreEventClass, kAEOpenDocuments, targetAddress, kAutoGenerateReturnID, kAnyTransactionID, theEvent);
  108.                 end;
  109.                 AEDestroy(targetAddress);
  110.                 if err = noErr then begin
  111.                     err := AECreateList(nil, 0, false, fileList);
  112.                 end;
  113.                 if err = noErr then begin
  114.                     AddFSSToAEList(fileList, 1, fs);
  115.                 end;
  116.                 if err = noErr then begin
  117.                     err := AEPutParamDesc(theEvent, keyDirectObject, fileList);
  118.                 end;
  119.                 if err = noErr then begin
  120.                     sendmode := kAENoReply;
  121.                     if not tofront then begin
  122.                         sendmode := sendmode + kAENeverInteract;
  123.                     end;
  124.                     err := AESend(theEvent, theReply, sendmode, kAEHighPriority, kNoTimeOut, nil, nil);
  125.                 end;
  126.                 AEDestroy(theEvent);
  127.                 AEDestroy(theReply);
  128.                 AEDestroy(fileList);
  129.                 if (err = noErr) & tofront then begin
  130.                     junk := SetFrontProcess(process);
  131.                 end;
  132.             end;
  133.         end;
  134.         TellFinderToLaunch := err = noErr;
  135.     end;
  136.  
  137.     function OpenControlPanel (fcreator: OSType): boolean;
  138.         var
  139.             fs: FSSpec;
  140.     begin
  141.         OpenControlPanel := false;
  142.         if FindControlPanel(fcreator, fs) = noErr then begin
  143.             OpenControlPanel := TellFinderToLaunch(fs, true);
  144.         end;
  145.     end;
  146.  
  147.     function ConfirmApplicationExists (creator: OSType; var fs: FSSpec): OSErr;
  148.         var
  149.             err: OSErr;
  150.             info: FInfo;
  151.     begin
  152.         err := HGetFInfo(fs.vRefNum, fs.parID, fs.name, info);
  153.         if err = noErr then begin
  154.             if (info.fdType <> application) or (info.fdCreator <> creator) then begin
  155.                 err := afpItemNotFound;
  156.             end; (* if *)
  157.         end; (* if *)
  158.         ConfirmApplicationExists := err;
  159.     end;
  160.  
  161.     function FindApplication (creator: OSType; var fs: FSSpec): OSErr;
  162.         var
  163.             i: integer;
  164.             pbdt: DTPBRec;
  165.             crdate: longint;
  166.             oe: OSErr;
  167.             found: boolean;
  168.     begin
  169.         found := false;
  170.         if system7 then begin
  171.             i := 1;
  172.             repeat
  173.                 fs.vRefNum := 0;
  174.                 oe := GetVolInfo(fs.name, fs.vRefNum, i, crdate);
  175.                 i := i + 1;
  176.                 if oe = noErr then begin
  177.                     with pbdt do begin
  178.                         fs.name := '';
  179.                         ioNamePtr := @fs.name;
  180.                         ioVRefNum := fs.vRefNum;
  181.                         oe := PBDTGetPath(@pbdt);
  182.                         if oe = noErr then begin
  183.                             ioIndex := 0;
  184.                             ioFileCreator := creator;
  185.                             oe := PBDTGetAPPLSync(@pbdt);
  186.                             if oe = noErr then begin
  187.                                 fs.parID := pbdt.ioAPPLParID;
  188.                                 found := ConfirmApplicationExists(creator,fs)=noErr;
  189.                             end;
  190.                         end;
  191.                     end;
  192.                     oe := noErr;
  193.                 end;
  194.             until found or (oe <> noErr);
  195.         end;
  196.         if found then begin
  197.             oe := noErr;
  198.         end else begin
  199.             oe := afpItemNotFound;
  200.             fs.vRefNum := 0;
  201.             fs.parID := 2;
  202.             fs.name := '';
  203.         end;
  204.         FindApplication := oe;
  205.     end;
  206.  
  207.     function FindProcess (creator, typ: OSType; var process: ProcessSerialNumber; var fs: FSSpec): boolean;
  208.         var
  209.             info: ProcessInfoRec;
  210.     begin
  211.         FindProcess := false;
  212.         if has_LaunchControl then begin
  213.             process.highLongOfPSN := 0;
  214.             process.lowLongOfPSN := kNoProcess;
  215.             info.processInfoLength := sizeof(ProcessInfoRec);
  216.             info.processName := nil;
  217.             info.processAppSpec := @fs;
  218.             while GetNextProcess(process) = noErr do begin
  219.                 if GetProcessInformation(process, info) = noErr then begin
  220.                     if (info.processType = longint(typ)) and (info.processSignature = creator) then begin
  221.                         FindProcess := true;
  222.                         leave;
  223.                     end;
  224.                 end;
  225.             end;
  226.         end;
  227.     end;
  228.  
  229.     function IsRunning (creator, typ: OSType): boolean;
  230.         var
  231.             process: ProcessSerialNumber;
  232.             fs: FSSpec;
  233.     begin
  234.         IsRunning := FindProcess(creator, typ, process, fs);
  235.     end;
  236.     
  237.     procedure PrepareToLaunch (var theEvent: AppleEvent; tofront: boolean; var launchThis: LaunchParamBlockRec);
  238.         var
  239.             oe: OSErr;
  240.             launchDesc: AEDesc;
  241.     begin
  242.         oe := AECoerceDesc(theEvent, typeAppParameters, launchDesc);
  243.         HLock(Handle(launchDesc.dataHandle));
  244.         launchThis.launchAppParameters := AppParametersPtr(launchDesc.dataHandle^);
  245.         launchThis.launchBlockID := extendedBlock;
  246.         launchThis.launchEPBLength := extendedBlockLen;
  247.         launchThis.launchFileFlags := 0;
  248.         launchThis.launchControlFlags := launchContinue + launchNoFileFlags;
  249.         if not tofront then begin
  250.             launchThis.launchControlFlags := launchThis.launchControlFlags + launchDontSwitch;
  251.         end;
  252.     end;
  253.  
  254.     function LaunchApplicationOptionallyMinimum(var launchThis: LaunchParamBlockRec):OSErr;
  255.         var
  256.             err:OSErr;
  257.     begin
  258.         err := LaunchApplication(@launchThis);
  259.         if err = memFullErr then begin
  260.             launchThis.launchControlFlags := BOR(launchThis.launchControlFlags, launchUseMinimum);
  261.             err := LaunchApplication(@launchThis);
  262.         end;
  263.         LaunchApplicationOptionallyMinimum:=err;
  264.     end;
  265.     
  266.     function LaunchWithDocument (creator, typ: OSType; fs: FSSpec; tofront: boolean):OSErr;
  267.         var
  268.             psn: ProcessSerialNumber;
  269.             targetAddress: AEDesc;
  270.             theEvent, theReply: AppleEvent;
  271.             fileList: AEDescList;
  272.             app_fs: FSSpec;
  273.             launchThis: LaunchParamBlockRec;
  274.             oe: OSErr;
  275.             sendmode: AESendMode;
  276.             t, c: longint;
  277.     begin
  278.         LaunchWithDocument := -1;
  279.         PurgeSpace(t, c);
  280.         if has_LaunchControl & (c > 4096) then begin
  281.             if FindProcess(creator, typ, psn, app_fs) then begin
  282.                 oe := CreateProcessSerialNumberDesc(psn, targetAddress);
  283.                 oe := AECreateAppleEvent(kCoreEventClass, kAEOpenDocuments, targetAddress, kAutoGenerateReturnID, kAnyTransactionID, theEvent);
  284.                 AEDestroy(targetAddress);
  285.                 
  286.                 oe := AECreateList(nil, 0, false, fileList);
  287.                 AddFSSToAEList(fileList, 1, fs);
  288.                 oe := AEPutParamDesc(theEvent, keyDirectObject, fileList);
  289.                 AEDestroy(fileList);
  290.                 
  291.                 sendmode := kAENoReply;
  292.                 if not tofront then begin
  293.                     sendmode := sendmode + kAENeverInteract;
  294.                 end;
  295.                 oe := AESend(theEvent, theReply, sendmode, kAEHighPriority, kNoTimeOut, nil, nil);
  296.                 AEDestroy(theEvent);
  297.                 AEDestroy(theReply);
  298.                 if tofront then begin
  299.                     LaunchWithDocument := SetFrontProcess(psn);
  300.                 end;
  301.             end else begin
  302.                 if FindApplication(creator, app_fs) = noErr then begin
  303.                     oe := CreateSignatureDesc(creator, targetAddress);
  304.                     oe := AECreateAppleEvent(kCoreEventClass, kAEOpenDocuments, targetAddress, kAutoGenerateReturnID, kAnyTransactionID, theEvent);
  305.                     AEDestroy(targetAddress);
  306.                     
  307.                     oe := AECreateList(nil, 0, false, fileList);
  308.                     AddFSSToAEList(fileList, 1, fs);
  309.                     oe := AEPutParamDesc(theEvent, keyDirectObject, fileList);
  310.                     AEDestroy(fileList);
  311.                     
  312.                     launchThis.launchAppSpec := @app_fs;
  313.                     PrepareToLaunch(theEvent, tofront, launchThis);
  314.                     LaunchWithDocument := LaunchApplicationOptionallyMinimum(launchThis);
  315.                     AEDestroy(theEvent);
  316.                 end;
  317.             end;
  318.         end;
  319.     end;
  320.  
  321.     function LaunchFSSpec (var fs: FSSpec; tofront: boolean):OSErr;
  322.         var
  323.             launchThis: LaunchParamBlockRec;
  324.     begin
  325.         LaunchFSSpec := -1;
  326.         if has_LaunchControl then begin
  327.             launchThis.launchBlockID := extendedBlock;
  328.             launchThis.launchEPBLength := extendedBlockLen;
  329.             launchThis.launchFileFlags := 0;
  330.             launchThis.launchControlFlags := launchContinue + launchNoFileFlags + launchUseMinimum;
  331.             if not tofront then begin
  332.                 launchThis.launchControlFlags := launchThis.launchControlFlags + launchDontSwitch;
  333.             end;
  334.             launchThis.launchAppSpec := @fs;
  335.             launchThis.launchAppParameters := nil;
  336.             LaunchFSSpec := LaunchApplicationOptionallyMinimum(launchThis);
  337.         end;
  338.     end;
  339.  
  340.     function LaunchApp (creator, typ: OSType; tofront: boolean):OSErr;
  341.         var
  342.             psn: ProcessSerialNumber;
  343.             app: FSSpec;
  344.     begin
  345.         LaunchApp := -1;
  346.         if has_LaunchControl then begin
  347.             if FindProcess(creator, typ, psn, app) then begin
  348.                 if tofront then begin
  349.                     LaunchApp := SetFrontProcess(psn);
  350.                 end else begin
  351.                     LaunchApp := noErr;
  352.                 end;
  353.             end else begin
  354.                 if FindApplication(creator, app) = noErr then begin
  355.                     LaunchApp := LaunchFSSpec(app, tofront);
  356.                 end;
  357.             end;
  358.         end;
  359.     end;
  360.  
  361.     function FindAppWithHint(vrn:integer; dirID:longint; creator, typ: OSType; var app:FSSpec; var psn: ProcessSerialNumber; var isrunning:Boolean):OSErr;
  362.         var
  363.             err:OSErr;
  364.     begin
  365.         err := -1;
  366.         if has_LaunchControl then begin
  367.             if FindProcess(creator, typ, psn, app) then begin
  368.                 isrunning := true;
  369.                 err := noErr;
  370.             end else begin
  371.                 isrunning := false;
  372.                 err := FindInFolder(vrn, dirID, creator, typ, app);
  373.                 if err <> noErr then begin
  374.                     err := FindApplication(creator, app);
  375.                 end;
  376.             end;
  377.         end;
  378.         FindAppWithHint := err;
  379.     end;
  380.     
  381.     function LaunchAppWithHint(vrn:integer; dirID:longint; creator, typ: OSType; tofront: boolean):OSErr;
  382.         var
  383.             err:OSErr;
  384.             psn: ProcessSerialNumber;
  385.             app: FSSpec;
  386.             isrunning: Boolean;
  387.     begin
  388.         err := FindAppWithHint(vrn, dirID, creator, typ,  app, psn, isrunning);
  389.         if err = noErr then begin
  390.             if isrunning then begin
  391.                 if tofront then begin
  392.                     err := SetFrontProcess(psn);
  393.                 end;
  394.             end else begin
  395.                 err := LaunchFSSpec(app, tofront);
  396.             end;
  397.         end;
  398.         LaunchAppWithHint := err;
  399.     end;
  400.     
  401.     function SendQuitToApplication(process: ProcessSerialNumber):OSErr;
  402.         var
  403.             err, junk: OSErr;
  404.             targetAddress: AEAddressDesc;
  405.             AEvent, AReply: AppleEvent;
  406.     begin
  407.         junk := CreateProcessSerialNumberDesc(process, targetAddress);
  408.         junk := AECreateAppleEvent(kCoreEventClass, kAEQuitApplication, targetAddress, kAutoGenerateReturnID, kAnyTransactionID, AEvent);
  409.         AEDestroy(targetAddress);
  410.         err := AESend(AEvent, AReply, kAENoReply, kAEHighPriority, 5 * second_in_ticks, nil, nil);
  411.         AEDestroy(AEvent);
  412.         AEDestroy(AReply);
  413.         SendQuitToApplication := err;
  414.     end;
  415.     
  416.     procedure QuitApplication (creator, typ: OSType);
  417.         var
  418.             junk:OSErr;
  419.             process: ProcessSerialNumber;
  420.             fs: FSSpec;
  421.     begin
  422.         if FindProcess(creator, typ, process, fs) then begin
  423.             junk:=SendQuitToApplication(process);
  424.         end;
  425.     end;
  426.  
  427. end.