home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / hc / xcmd_glu.sit / GetCreator.p < prev    next >
Text File  |  1987-08-06  |  3KB  |  120 lines

  1. {$R-}
  2.  
  3. (*
  4.     GetCreator -- map OSType to creator name
  5.     By Dan Winkler.  DO NOT call the author!  Contact Apple Developer 
  6.     Support on AppleLink "MacDst" or on MCI "MacTech".
  7.  
  8.     ⌐Apple Computer, Inc. 1987
  9.     All Rights Reserved.
  10.  
  11.     pascal GetCreator.p
  12.     link -m ENTRYPOINT -o {BOOT}documents -rt XFCN=1 -sn Main=GetCreator ╢
  13.       GetCreator.p.o {MPW}Libraries:Interface.o {MPW}PLibraries:PasLib.o 
  14.  
  15.  
  16. *)
  17.  
  18. {$S GetCreator }     { Segment name must be the same as the command name. }
  19.  
  20. UNIT DummyUnit;
  21.  
  22. INTERFACE
  23.  
  24. USES MemTypes, QuickDraw, OSIntf, ToolIntf, HyperXCmd;
  25.  
  26. PROCEDURE EntryPoint(paramPtr: XCmdPtr);
  27.     
  28. IMPLEMENTATION
  29.  
  30. TYPE Str31 = String[31];
  31.  
  32. PROCEDURE GetCreator(paramPtr: XCmdPtr);                         FORWARD;
  33.  
  34.   PROCEDURE EntryPoint(paramPtr: XCmdPtr);
  35.   BEGIN
  36.     GetCreator(paramPtr);
  37.   END;
  38.  
  39.   PROCEDURE GetCreator(paramPtr: XCmdPtr);
  40.   VAR creator: OSType;
  41.       appName: Str255;
  42.       
  43.   {$I XCmdGlue.inc }
  44.  
  45.     FUNCTION CreatorToString(creator: OsType): Str255;
  46.     
  47.     {  Given a document's 4-byte creator, find the application's name.    }
  48.     {  Opens APPL resource 0 in DeskTop, and scans table for first match.    }
  49.     {  Returns empty string if can't open desktop or creator not found.      }
  50.     
  51.     LABEL 9;
  52.     
  53.     TYPE ApplRecord =  RECORD
  54.              creator:     OsType;
  55.              directory: LongInt;
  56.              fileName:    Str255;
  57.                END;
  58.     
  59.     VAR refNum:     INTEGER;
  60.     errNum:     INTEGER;
  61.     hndl:     HANDLE;
  62.     applPtr:     ^ApplRecord;
  63.     size,limit: LongInt;
  64.     bump:      INTEGER;
  65.     wdParams:    WDPBRec;
  66.     result:   INTEGER;
  67.     
  68.     BEGIN
  69.       CreatorToString := '';
  70.       IF creator = 'APPL' THEN EXIT(CreatorToString);
  71.       SetResLoad(FALSE);   { avoid slow preloads }
  72.       
  73.       (** refNum := OpenResFile('DeskTop'); **)
  74.       
  75.       { set up working directory for current path }
  76.       ZeroBytes(@wdParams,SizeOf(wdParams));
  77.       WITH wdParams DO
  78.     BEGIN
  79.       ioWDProcID := $4552494B;          { 'ERIK' so finder will delete later }
  80.       ioWDDirID := 2;                { root }
  81.     END;
  82.       result := PBOpenWD(@wdParams,FALSE);
  83.       refNum := OpenRFPerm('DeskTop',wdParams.ioVRefNum,fsRdPerm);
  84.       
  85.       SetResLoad(TRUE);
  86.       IF refnum = -1 THEN EXIT(CreatorToString);
  87.       hndl := GetResource('APPL',0);
  88.       IF hndl = NIL THEN GOTO 9;
  89.       size := SizeResource(hndl);
  90.       applPtr := Pointer(hndl^);
  91.       limit := ORD(applPtr) + size;
  92.       REPEAT
  93.     IF applPtr^.creator = creator THEN  { we found it }
  94.       BEGIN
  95.         CreatorToString := applPtr^.fileName;
  96.         GOTO 9;
  97.       END;
  98.     bump := 9 + Length(applPtr^.fileName);
  99.     IF ODD(bump) THEN bump := bump + 1;
  100.     applPtr := Pointer(ORD(applPtr) + bump);
  101.       UNTIL ORD(applPtr) >= limit;
  102.     9: CloseResFile(refNum);
  103.     END;      
  104.   
  105.   BEGIN
  106.     WITH paramPtr^ DO
  107.       BEGIN
  108.         IF paramCount < 1 THEN EXIT(GetCreator);
  109.     BlockMove(params[1]^,@creator,4);
  110.     appName := CreatorToString(creator);
  111.         IF appName <> '' THEN returnValue := PasToZero(appName);
  112.       END;
  113.   END;
  114.  
  115.  
  116. END.
  117.  
  118.  
  119.  
  120.