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

  1.  
  2. ;
  3. ;  GetCreator.a,  assembly language support for Launch
  4. ;    ⌐Apple Computer, Inc. 1987
  5. ;    All Rights Reserved.
  6. ;
  7.  
  8.  
  9.     BLANKS    ON
  10.     STRING    PASCAL
  11.  
  12.     PRINT    OFF
  13.     INCLUDE    'FSEqu.a'
  14.     INCLUDE    'FSPrivate.a'
  15.     INCLUDE    'SysEqu.a'
  16.     INCLUDE    'ToolEqu.a'
  17.     INCLUDE    'Traps.a'
  18.     PRINT    ON
  19.  
  20. Debug    EQU    1    ; Set to 1 for debugging code, 0 for none
  21.  
  22.     MACRO
  23. &Label    NewProc    &PType=ENTRY,&Size=0,&Bug='None'
  24. &Label    PROC    &PType
  25.     GBLA    &ProcDB
  26.     GBLC    &ProcName
  27. &ProcDB    SETA    0
  28.     IF    Debug>0|&UPCASE(&Bug)='DEBUG' THEN
  29. &ProcDB    SETA    2
  30. &ProcName    SETC    &CONCAT(&UPCASE(&Label),'        ')
  31.     ELSEIF    &Size<>0 THEN
  32. &ProcDB    SETA    1
  33.     ENDIF
  34.     IF    &ProcDB<>0 THEN
  35.     LCLA    &Sz
  36. &Sz    SETA    0-&ABS(&Size)
  37.     LINK    A6,#&Sz
  38.     ENDIF
  39.     ENDM
  40.  
  41.     MACRO
  42.     ProcExit    &Size=0
  43.     GBLA    &ProcDB
  44.     GBLC    &ProcName
  45.     IF    &ProcDB>0 THEN
  46.     UNLK    A6
  47.     ENDIF
  48.     IF    &Size<>0 THEN
  49.     LCLA    &Sz
  50. &Sz    SETA    &ABS(&Size)
  51.     MOVE.L    (SP),&Sz(SP)
  52.     ADD.L    #&Sz,SP
  53.     ENDIF
  54.     RTS
  55.     IF    &ProcDB=2 THEN
  56.     LCLC    &StrSet
  57. &StrSet    SETC    &SETTING('STRING')
  58.     STRING    ASIS
  59.     DC.B    '&ProcName[1:8]'
  60.     STRING    &StrSet
  61.     ENDIF
  62.     ENDM
  63.  
  64.     MACRO
  65.     XIT    &Where
  66.     GBLA    &ProcDB
  67.     IF    &ProcDB>0 THEN
  68.     BRA.S    &Where
  69.     ELSE
  70.     RTS
  71.     ENDIF
  72.     ENDM
  73.  
  74.  
  75.  
  76. ScanOneDeskTop NewProc
  77. ;----------------------------------------------------------------
  78. ;
  79. ;  Scan the desktop file of the specified volume looking for an 
  80. ;  application creator.  If the volume is offline, return false
  81. ;  immediately.
  82. ;
  83. ;
  84. ;    On entry:
  85. ;        D3 = creator to locate
  86. ;        A2 = pointer to volume VCB
  87. ;        A3 = address of area for short filename 
  88. ;    
  89. ;    On exit:
  90. ;        D0 = 0 if not found, non-zero if found
  91. ;        D1 = directory in which found or zero
  92.  
  93. DTApplRec    RECORD    0,INCR
  94. dtCreator    DS.L    1
  95. dtDir    DS.L    1
  96. dtFilName    DS.B    66
  97.     ENDR
  98.  
  99.     WITH    DTApplRec
  100.  
  101.     MOVEM.L    D4/A2-A4,-(SP)    ; Save registers
  102.  
  103.     CMP    #TSigWord,vcbSigWord(A2) ; Is this an HFS volume?
  104.     BNE    @9        ; No, no point in continuing
  105.  
  106.     TST    vcbDrvNum(A2)    ; Is the volume off-line?
  107.     BEQ    @9        ; Branch to exit if so
  108.  
  109.     CLR    -(SP)        ; Disable SetResLoad to
  110.     _SetResLoad        ; prevent un-necessary preloads
  111.  
  112.     CLR    -(SP)        ; Open the desktop file
  113.     PEA    #'DeskTop'
  114.     MOVE    vcbVRefNum(A2),-(SP)
  115.     MOVE.B    #fsRdPerm,-(SP)
  116.     _OpenRFPerm
  117.  
  118.     MOVE    (SP)+,D4        ; Save the returned value
  119.  
  120.     MOVE    #-1,-(SP)        ; Enable SetResLoad
  121.     _SetResLoad
  122.  
  123.     CMP    #-1,D4        ; Was there an open error?
  124.     BNE.S    @1        ; Branch onwards if no error
  125.  
  126.     MOVEQ    #0,D0        ; Return false
  127.     MOVEQ    #0,D1
  128.     BRA.S    @9        ; and exit
  129.  
  130. @1    CLR.L    -(SP)        ; Get list of APPLs on volume
  131.     MOVE.L    #'APPL',-(SP)
  132.     CLR    -(SP)
  133.     _GetResource
  134.  
  135.     MOVE.L    (SP)+,D0        ; Get returned handle to data
  136.     BEQ.S    @8        ; Exit if NIL
  137.  
  138.     MOVE.L    D0,A2        ; Save starting point of search
  139.     MOVE.L    (A2),A2
  140.  
  141.     CLR.L    -(SP)        ; Get size of APPL data
  142.     MOVE.L    D0,-(SP)
  143.     _SizeRsrc
  144.  
  145.     MOVE.L    A2,A4        ; Create ending point of search
  146.     ADD.L    (SP)+,A4
  147.  
  148. @2    CMP.L    #'APPL',D3    ; Searching for filename?
  149.     BNE.S    @3        ; Branch if not
  150.  
  151.     MOVEQ    #0,D0        ; Compare filenames
  152.     MOVE.L    A3,A0
  153.     MOVE.B    (A0)+,D0
  154.     SWAP    D0
  155.     LEA    dtFilName(A2),A1
  156.     MOVE.B    (A1)+,D0
  157.     _CmpString
  158.  
  159.     BNE.S    @4        ; If not equal, get next entry
  160.  
  161.     MOVE.L    dtDir(A2),D1    ; Get directory in which found
  162.     MOVEQ    #1,D0        ; Mark as found
  163.     BRA.S    @8
  164.  
  165. @3    CMP.L    dtCreator(A2),D3    ; Compare creators
  166.     BNE.S    @4        ; If not equal, get next entry
  167.  
  168.     LEA    dtFilName(A2),A0    ; Copy filename
  169.     MOVE.L    A3,A1
  170.     MOVEQ    #1,D0
  171.     ADD.B    (A0),D0
  172.     _BlockMove
  173.  
  174.     MOVE.L    dtDir(A2),D1    ; Get directory in which found    
  175.     MOVEQ    #1,D0        ; Mark as found
  176.     BRA.S    @8
  177.  
  178. @4    MOVEQ    #10,D0        ; Move to next entry
  179.     ADD.B    dtFilName(A2),D0
  180.     BCLR    #0,D0
  181.     ADD    D0,A2
  182.  
  183.     CMP    A2,A4        ; At end of APPL list?
  184.     BLO.S    @2        ; Yes, branch back to test next one
  185.  
  186.     MOVEQ    #0,D0        ; Clear result fields
  187.     MOVEQ    #0,D1
  188.  
  189. @8    MOVEM.L    D0-D1,-(SP)    ; Save results
  190.  
  191.     MOVE    D4,-(SP)        ; Close the desktop file
  192.     _CloseResFile
  193.  
  194.     MOVEM.L    (SP)+,D0-D1    ; Restore results
  195.  
  196. @9    TST    D0        ; Set success/fail flag
  197.     MOVEM.L    (SP)+,D4/A2-A4    ; Restore registers
  198.     ProcExit
  199.  
  200.  
  201.  
  202. ScanDeskTop NewProc EXPORT,2
  203. ;----------------------------------------------------------------
  204. ;
  205. ;  FUNCTION  ScanDeskTop(creator: ResType; VAR appVol: INTEGER; 
  206. ;                VAR appDir: LongInt; VAR appName: Str255): BOOLEAN;    EXTERNAL;
  207. ;
  208. ;  Scan the desktop file of every on-line volume starting with
  209. ;  the default volume, then in VCB order.
  210.  
  211. StkFrame    RECORD    {A6Link},DECR
  212. Result    DS.W    1
  213. Creator    DS.L    1
  214. appVolPtr    DS.L    1
  215. appDirPtr    DS.L    1
  216. appNamPtr    DS.L    1
  217. Return    DS.L    1
  218. A6Link    DS.L    1
  219. DefVol    DS.W    1
  220.     ENDR
  221.  
  222.     WITH    StkFrame
  223.  
  224.     MOVEM.L    D0-D7/A0-A4,-(SP)    ; Save the registers
  225.     CLR    Result(A6)    ; Set result false
  226.  
  227.     MOVE.L    Creator(A6),D3    ; Search default volume
  228.     MOVE.L    DefVCBPtr,A2
  229.     MOVE.L    appNamPtr(A6),A3
  230.     JSR    ScanOneDeskTop
  231.     BNE.S    @3        ; If found, just to exit routine
  232.  
  233.     MOVE.L    DefVCBPtr,D4    ; Get default (already searched)
  234.     MOVE.L    VCBQHdr+2,D0    ; Search volumes in turn
  235.     BRA.S    @2
  236.  
  237. @1    MOVE.L    (A2),D0        ; Get next VCB pointer
  238.     BEQ.S    @4        ; Exit if end of list
  239.  
  240. @2    MOVE.L    D0,A2        ; Move it to somewhere useful
  241.     CMP.L    D0,D4        ; Is it the default volume?
  242.     BEQ.S    @1        ; Ignore if so, already searched
  243.  
  244.     JSR    ScanOneDeskTop    ; Search this volume
  245.     BEQ.S    @1        ; If not found, search next volume
  246.  
  247. @3    MOVE.L    appVolPtr(A6),A0    ; Store vRefNum
  248.     MOVE    vcbVRefNum(A2),(A0)
  249.  
  250.     MOVE.L    appDirPtr(A6),A0    ; Store directory number
  251.     MOVE.L    D1,(A0)
  252.  
  253.     MOVE    #$0100,Result(A6)    ; Set function true
  254.  
  255. @4    MOVEM.L    (SP)+,D0-D7/A0-A4    ; Restore the registers
  256.     ProcExit    16
  257.  
  258.  
  259.  
  260.     END
  261.