mirror of
https://github.com/elliotnunn/boot3.git
synced 2024-11-18 15:07:14 +00:00
1508 lines
47 KiB
Plaintext
1508 lines
47 KiB
Plaintext
|
;
|
|||
|
; File: PromptForUser.a
|
|||
|
;
|
|||
|
; Copyright: <09> 1986-1992 by Apple Computer, Inc. All rights reserved.
|
|||
|
;
|
|||
|
; Change History (most recent first):
|
|||
|
;
|
|||
|
; <SM9> 11/3/92 SWC Fixed the change comment in <SM8>.
|
|||
|
; <SM8> 11/3/92 SWC Changed ATalkEqu.a->AppleTalk.a.
|
|||
|
; <24> 6/29/92 DTY For ROM and System builds, access IKeyScriptDone through
|
|||
|
; ExpandMem.
|
|||
|
; <23> 6/25/92 AC When entering passwords, change KeyScript to Roman if RomanOnly
|
|||
|
; bit in resource is set. Re-sync selection with actual password
|
|||
|
; when entire password gets selected after you've mistyped it.
|
|||
|
; (This corrects bugs with two-byte passwords.)
|
|||
|
; <22> 6/9/92 JSM Nuke systemCentersWindow conditional, it<69>s always true.
|
|||
|
; Integrate changes from SuperMario: In ROM builds or in TheFuture
|
|||
|
; for System builds, use emPPCPromptForUserGlobals instead of
|
|||
|
; pGlobals.
|
|||
|
; <21> 4/2/92 FM #1020547 The password filter used to hardcode the bullet '<27>'
|
|||
|
; character which isn't internationally friendly. Now I set up the
|
|||
|
; bullet character using the itl4 table. The routines to lookup
|
|||
|
; the character are now in PromptForUser.c and were written by
|
|||
|
; Kevin MacDonell
|
|||
|
; <20> 2/11/91 EMT VC,82495: Fix bug that prevents backspacing after 8 characters
|
|||
|
; have been typed, Arrow keys now function properly in password,
|
|||
|
; Function keys are now ignored.
|
|||
|
; <19> 1/14/91 EMT <VC> Fix more bugs in PromptForUser
|
|||
|
; <18> 1/4/91 EMT <VC> Fixed bug that caused some items be be partially drawn when
|
|||
|
; they are supposed to be hidden. Also found and fixed cursor bug.
|
|||
|
; Wrote new efficeint routine MySetCursor.
|
|||
|
; <17> 12/13/90 EMT <JSM> Support 0 Length String to mean DefaultPrompt in
|
|||
|
; StartSecureSession
|
|||
|
; <16> 8/23/90 VC Fixed the handling of "Command-G" in the filter proc. (It was
|
|||
|
; checking the wrong bit for whether trhe guest is disbaled.)
|
|||
|
; <15> 8/21/90 VC Disabled "Command-G" when guest is disabled.
|
|||
|
; <14> 8/18/90 dba get rid of centering, because Window Mgr. does it now; also, I
|
|||
|
; noticed a lot of stuff (at least two things) that is not
|
|||
|
; internationally friendly, and I marked it with ***; this code
|
|||
|
; desperately needs code review
|
|||
|
; <13> 8/14/90 VC Added the handling of Command-G and Command-R.
|
|||
|
; <12> 8/9/90 S Changed cmdKey to cmdKeyMask (the cmdKey in SYSEQU.A seemd to
|
|||
|
; be wrong)
|
|||
|
; <11> 8/9/90 VC Implemented the "Command-." option to cancel.
|
|||
|
; <10> 5/27/90 JSM Use DCB.B again, now that LinkPatch supports it.
|
|||
|
; <9> 5/15/90 VC In CopyPassword, set the string to NIL when the typed password
|
|||
|
; is Nil.
|
|||
|
; <8> 5/9/90 JSM Don't use DCB.B for pGlobals until LinkPatch supports it.
|
|||
|
; <7> 4/26/90 VC Select the proper field after the Callback routine returns.
|
|||
|
; <6> 3/26/90 S Fixed the crash of the dialog when guset is selected after a
|
|||
|
; connection attemped is failed.
|
|||
|
; <5> 3/20/90 S Fix the bug in StartSecureSession to return proper flag when
|
|||
|
; guest is selected.
|
|||
|
; <4> 2/27/90 S Fix Guest Selection Bug.
|
|||
|
; <3> 1/30/90 S Condional Compile for Init and Patch resource IDs.
|
|||
|
; 1/22/90 CVC 1.2 Combine PromptAndStart with PromptForUser
|
|||
|
; <1.1> 11/28/89 CVC Added PromptAndStart call.
|
|||
|
; 11/22/89 CVC 1.1 Added PromptAndStart
|
|||
|
; <1.0> 10/12/89 CVC Adding Access Control for the first time.
|
|||
|
; 10/11/89 RH 1.0d2 Save registers in the promptForUser routine
|
|||
|
; 9/18/89 RH 1.0d1 Added glue code
|
|||
|
; 9/15/89 RH 1.0d1 More fixes and changes to displaying code
|
|||
|
; 9/6/89 RH 1.0d1 Made changes in the PromptForUser routine to fix bugs when
|
|||
|
; entering a password
|
|||
|
; 9/3/89 RH 1.0d1 New Today
|
|||
|
;
|
|||
|
|
|||
|
TITLE 'Prompt For User'
|
|||
|
|
|||
|
; Utility login window routine that can be called by any app to
|
|||
|
; bring up a 'standard' dialog that prompts for user name and password.
|
|||
|
;
|
|||
|
; Ruth Hennigar (code stolen from AppleShare Workstation)
|
|||
|
|
|||
|
BLANKS ON
|
|||
|
STRING ASIS
|
|||
|
|
|||
|
LOAD 'StandardEqu.d'
|
|||
|
INCLUDE 'AppleTalk.a'
|
|||
|
INCLUDE 'PromptForUserEqu.a'
|
|||
|
PRINT ON
|
|||
|
PRINT NOGEN
|
|||
|
|
|||
|
if &trim(&type('INIT')) = 'UNDEFINED' then
|
|||
|
pswdStrStart EQU -16409 ; password text string resource ID start
|
|||
|
PrmtDlogID EQU -16409 ; dialog resource ID
|
|||
|
|
|||
|
else
|
|||
|
pswdStrStart EQU -930 ; password text string resource ID start (Init)
|
|||
|
PrmtDlogID EQU -930 ; dialog resource ID
|
|||
|
|
|||
|
endif
|
|||
|
|
|||
|
PWDRmolyR equ 'GNRL' ; Password Roman Only Resource
|
|||
|
PWDRmolyID equ -16490 ; Password Roman Only Resource ID
|
|||
|
|
|||
|
|
|||
|
PrmtFUser PROC EXPORT
|
|||
|
EXPORT PromptForUser
|
|||
|
IMPORT GetPasswordBullet
|
|||
|
;________________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: PromptForUser
|
|||
|
;
|
|||
|
; Function: Glue code that calls the PromptUser routine that brings up a
|
|||
|
; dialog that asks for userName and Password
|
|||
|
;
|
|||
|
; Pascal interface:
|
|||
|
; Function PromptForUser (PromptStr: ^STR;
|
|||
|
; IconHdl: Handle;
|
|||
|
; UserName: ^Str[32]
|
|||
|
; Password: ^Str[8];
|
|||
|
; SelectedItem: INTEGER; {5=userName, 7=password}
|
|||
|
; GuestOk: BOOLEAN;
|
|||
|
; VAR loginMethod: INTEGER {1=guest, 2=Cleartext pswd, 3=RandNum Exchange pswd}
|
|||
|
; int (*callBack)();
|
|||
|
; startPb: PPCStartParam)
|
|||
|
;
|
|||
|
; : INTEGER;
|
|||
|
;________________________________________________________________________________
|
|||
|
;
|
|||
|
;
|
|||
|
PromptForUser
|
|||
|
LINK A6,#0 ; Set up A6 -> stack
|
|||
|
MOVEM.L D2-D5/A2-A5,-(SP) ; save some registers
|
|||
|
|
|||
|
; At this point, the stack looks as follows:
|
|||
|
;
|
|||
|
; (A6) --> Old A6
|
|||
|
; 4(A6) --> Return address
|
|||
|
; 8(A6) --> Start PB
|
|||
|
; 12(A6) --> callBack proc
|
|||
|
; 16(A6) --> login method
|
|||
|
; 20(A6) --> guestOK
|
|||
|
; 22(A6) --> selected item
|
|||
|
; 24(A6) --> password
|
|||
|
; 28(A6) --> username
|
|||
|
; 32(A6) --> icon handle
|
|||
|
; 36(A6) --> prompt string
|
|||
|
; 40(A6) --> Return value
|
|||
|
;
|
|||
|
MOVE.L 8(A6),D5 ; Copy PB into D5
|
|||
|
MOVE.L 12(A6),D4 ; Copy callBack proc into D4
|
|||
|
MOVE.L 16(A6),A4 ; A4 -> address of login method
|
|||
|
MOVE.W (A4),D1 ; Copy login method into D1
|
|||
|
MOVE.B 20(A6),D3 ; Copy guest ok? into D3
|
|||
|
MOVE.W 22(A6),D2 ; Copy selected item into D2
|
|||
|
MOVE.L 24(A6),A3 ; Copy password address into A3
|
|||
|
MOVE.L 28(A6),A2 ; Copy user name address into A2
|
|||
|
MOVE.L 32(A6),A0 ; Copy icon handle into A0
|
|||
|
MOVE.L 36(A6),A1 ; Copy prompt string into A1
|
|||
|
BSR.S PromptUser ; call routine
|
|||
|
MOVE.W D0,40(A6) ; Return final result
|
|||
|
MOVE.L 16(A6),A0 ; A0 -> address of login method
|
|||
|
MOVE.W D1,(A0) ; return method selected
|
|||
|
|
|||
|
MOVEM.L (SP)+,D2-D5/A2-A5 ; restore registers
|
|||
|
UNLK A6 ; Pop off the call frame
|
|||
|
MOVE.L (SP)+,A0 ; Save the return address
|
|||
|
ADDA.W #32,SP ; Pop off the incoming arguments
|
|||
|
JMP (A0) ; And call it a day.
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: PromptUser
|
|||
|
;
|
|||
|
; This routine brings up the 'same' window as the Chooser's file server
|
|||
|
; device package. It's purpose is to allow the user to enter his/her
|
|||
|
; password and UAM (if this makes sense).
|
|||
|
;
|
|||
|
; Note that since this dialog is just like the device pkg's, we use the
|
|||
|
; same DLOG and DITL resource.
|
|||
|
;
|
|||
|
; Entry: D1 = login method (2=Cleartext pswd, 3=RandNum Exchange pswd)
|
|||
|
; D2 = selected item (user name=5 or password=7)
|
|||
|
; D3 = guest login okay? (0=no, 1=yes) (byte)
|
|||
|
; A0 -> icon handle
|
|||
|
; A1 -> prompting string
|
|||
|
; A2 -> user name string (optional)
|
|||
|
; A3 -> password string (optional)
|
|||
|
; D4 -> CallBack proc
|
|||
|
; D5 -> Start PB
|
|||
|
; Exit: D0 = negative if error or Cancel occurred
|
|||
|
; D1 = login method (1=Guest, 2=Cleartext pswd, 3=RandNum Exchange pswd)
|
|||
|
; A2 -> user name string (blank if guest is selected)
|
|||
|
; A3 -> password character string (blank if guest is selected)
|
|||
|
;
|
|||
|
; All registers preserved.
|
|||
|
;
|
|||
|
|
|||
|
; Stack frame equates
|
|||
|
|
|||
|
pswType EQU -2 ; item type used by Dialog Mgr calls (don't move this!)
|
|||
|
pswIHandle EQU pswType-4 ; handle to item (don't move this!)
|
|||
|
pswBox EQU pswIHandle-8 ; item rect (don't move this!)
|
|||
|
pswSavePort EQU pswBox-4 ; saved grafport
|
|||
|
pswDialogPtr EQU pswSavePort-4 ; PW dialog ptr
|
|||
|
pswItemHit EQU pswDialogPtr-2 ; item selected from Modal dialog
|
|||
|
pswUname EQU pswItemHit-4 ; pointer to user name storage
|
|||
|
pswPwdPtr EQU pswUname-4 ; storage for passward chars pointer
|
|||
|
pswIcon EQU pswPwdPtr-4 ; storage for icon pointer
|
|||
|
pswSelItem EQU pswIcon-2 ; item to be selected
|
|||
|
pswMethod EQU pswSelItem-2 ; temporary storage for login method
|
|||
|
pswPbPtr EQU pswMethod-4 ; temporary storage for Pb
|
|||
|
pswCallbackPtr EQU pswPbPtr-4 ; temporary storage for Callback Proc
|
|||
|
pswSize EQU pswCallbackPtr ; size of local variables
|
|||
|
|
|||
|
PromptUser
|
|||
|
LINK A6,#pswSize ; stack frame
|
|||
|
MOVEM.L D2-D5/A0-A4,-(SP) ; save registers
|
|||
|
MOVE.L A4,pswIcon(A6) ; save the ptr to the icon
|
|||
|
MOVE.L A2,pswUname(A6) ; save the ptr to the user name
|
|||
|
MOVE.L A3,pswPwdPtr(A6) ; save the ptr to the password
|
|||
|
MOVE.W D2,pswSelItem(A6) ; save the item to be selected
|
|||
|
MOVE.L D5,pswPbPtr(A6) ; save the pb pointer
|
|||
|
MOVE.L D4,pswCallbackPtr(A6) ; save the Callback pointer
|
|||
|
|
|||
|
IF forROM or TheFuture THEN ; can<61>t have data inside code in ROM <22>
|
|||
|
|
|||
|
MOVE.L ExpandMem,A4 ; A4 -> Expanded Low Memory <22>
|
|||
|
MOVE.L ExpandMemRec.emPPCPromptForUserGlobals(A4),A4 ; A4-> ptr to globals <22>
|
|||
|
|
|||
|
ELSE ; <22>
|
|||
|
|
|||
|
LEA pGlobals,A4 ; A4 -> our globals
|
|||
|
|
|||
|
ENDIF ; forROM or TheFuture <22>
|
|||
|
|
|||
|
MOVE D1,pMethod(A4) ; save the login method
|
|||
|
MOVE D1,pswMethod(A6) ; save the login method in temp storage
|
|||
|
MOVE.B D3,pGuestAllowed(A4) ; save the guest boolean
|
|||
|
MOVE.L A1,pPrompt(A4) ; save the prompt string
|
|||
|
MOVE.L A0,pIconHdl(A4) ; save the icon handle
|
|||
|
PEA pswSavePort(A6) ; save area for port
|
|||
|
_GetPort
|
|||
|
;
|
|||
|
; Bring up the dialog
|
|||
|
;
|
|||
|
@10 SUBQ #4,SP ; room for result
|
|||
|
MOVE #PrmtDlogID,-(SP) ; dialog ID
|
|||
|
CLR.L -(SP) ; no storage
|
|||
|
MOVE.L #-1,-(SP) ; behind param
|
|||
|
_GetNewDialog ; initially invisible
|
|||
|
MOVE.L (SP),A3 ; copy dialog hdl into A3
|
|||
|
MOVE.L A3,pswDialogPtr(A6) ; save it away
|
|||
|
_SetPort
|
|||
|
|
|||
|
;
|
|||
|
; Set the prompt string in the dialog
|
|||
|
;
|
|||
|
MOVE.L pPrompt(A4),D0 ; Set condition code
|
|||
|
BEQ.S @12 ; Don't set item text if NIL
|
|||
|
MOVE.L D0,A2 ; A2 -> prompt string
|
|||
|
MOVE #fItemPromptText,D0 ; item number
|
|||
|
BSR SetDIText ; set item text
|
|||
|
@12 MOVE #sysFont,-(SP) ; set font to system (Chicago)
|
|||
|
_TextFont
|
|||
|
;
|
|||
|
; put icon in dialog
|
|||
|
;
|
|||
|
MOVE.L pIconHdl(A4),D0 ; move handle into D0
|
|||
|
BEQ.S @15 ; it's NIL, don't plot it
|
|||
|
PEA IconRect ; push the icon rect location
|
|||
|
MOVE.L pIconHdl(A4),-(SP) ; push handle to icon
|
|||
|
_PlotIcon
|
|||
|
;
|
|||
|
; Put user name in dialog;
|
|||
|
;
|
|||
|
@15 MOVE #fItemUNameEdit,D0 ; item number
|
|||
|
MOVE.L pswUname(A6),A2 ; get the ptr to the user name
|
|||
|
BSR SetDIText ; set item text
|
|||
|
;
|
|||
|
; get a handle to the text edit item for later
|
|||
|
;
|
|||
|
MOVE.L A3,-(SP) ; dialog ptr
|
|||
|
MOVE #fItemUNameEdit,-(SP) ; item number
|
|||
|
PEA pswType(A6) ; type storage
|
|||
|
PEA pswIHandle(A6) ; item handle storage
|
|||
|
PEA pswBox(A6) ; rect storage
|
|||
|
_GetDItem
|
|||
|
MOVE.L pswIHandle(A6),pPWDlogUNameHdl(A4) ; save hdl to user name text
|
|||
|
;
|
|||
|
; Create a TERecord for the password characters
|
|||
|
;
|
|||
|
SUBQ #4,SP ; room for result
|
|||
|
PEA OffScrRect ; dest rect
|
|||
|
PEA OffScrRect ; view rect
|
|||
|
_TENew
|
|||
|
MOVE.L (SP)+,pPwdTEHandle(A4) ; save TEHandle
|
|||
|
|
|||
|
;
|
|||
|
; Set up the bullet character the international way<61> <21>
|
|||
|
;
|
|||
|
SUBQ #2,SP ; room for return char '<27>' <21>
|
|||
|
JSR GetPasswordBullet ; go get it<69> <21>
|
|||
|
MOVE.B (SP)+,pBulletChar(A4) ; save the bullet for later <21>
|
|||
|
;
|
|||
|
; If the password was passed, then put it in the edit records
|
|||
|
;
|
|||
|
MOVE.L pPwdTEHandle(A4),D2 ; D2 -> TE handle
|
|||
|
MOVE.L pswPwdPtr(A6),A2 ; A2 -> callers string storage
|
|||
|
BSR PutPswdInDlog ; insert the password if it was specified
|
|||
|
;
|
|||
|
; If we're in the password edit text, switch to Roman script. - AMC/AKN 6/24/92
|
|||
|
; This feature can be disabled with a bit in a resource.
|
|||
|
;
|
|||
|
movem.l d0-d2/a0-a2,-(sp) ; Save some reg's
|
|||
|
|
|||
|
if (forROM or theFuture) then
|
|||
|
move.l ExpandMem,a0 ; <24>
|
|||
|
move.l ExpandMemRec.emPPCPromptForUserGlobals(a0),a0 ; <24> Pointer to PPC globals
|
|||
|
lea PromptForUserGlobalsRec.IKeyScriptDone(a0),a0 ; <24> Pointer to IKeyScriptDone
|
|||
|
else
|
|||
|
lea IKeyScriptDone,a0 ; IKeyScriptDone indicates already switched to Roman
|
|||
|
endif
|
|||
|
|
|||
|
move.w #0,(a0) ; Initialize the flag KeyScriptDone
|
|||
|
move pswSelItem(a6),d0 ; Get selected item
|
|||
|
cmp.w #fItemPEdit,d0 ; Is it Password Item?
|
|||
|
bnz @17 ; No, don't switch script to Roman
|
|||
|
|
|||
|
subq #4,sp ; Room for result
|
|||
|
move.l #PWDRmolyR,-(sp) ; Push resource type
|
|||
|
move.w #PWDRmolyID,-(sp) ; Push resouce ID
|
|||
|
_GetResource ; Fetch the resource
|
|||
|
move.l (sp)+,a0 ; Pop resource handle
|
|||
|
cmpa.l #0,a0 ; Is there an address there?
|
|||
|
beq @17 ; No, don't switch script to Roman
|
|||
|
move.l (a0),a1 ; Otherwise, get pointer
|
|||
|
move.b (a1),d0 ; Get resource data
|
|||
|
cmpi.b #1,d0 ; If the switch is 1, call KeyScript
|
|||
|
bne @17 ; Otherwise don't switch to Roman
|
|||
|
move.w #smRoman,-(sp) ; Set KeyScript Roman in Password EditText
|
|||
|
_KeyScript
|
|||
|
|
|||
|
if (forROM or theFuture) then
|
|||
|
move.l ExpandMem,a0 ; <24>
|
|||
|
move.l ExpandMemRec.emPPCPromptForUserGlobals(a0),a0 ; <24> Pointer to PPC globals
|
|||
|
lea PromptForUserGlobalsRec.IKeyScriptDone(a0),a0 ; <24> Pointer to IKeyScriptDone
|
|||
|
else
|
|||
|
lea IKeyScriptDone,a0 ; IKeyScriptDone indicates already switched to Roman
|
|||
|
endif
|
|||
|
|
|||
|
move.w #1,(a0) ; Don't need to set KeyScript anymore
|
|||
|
@17 movem.l (sp)+,d0-d2/a0-a2 ; Restore reg's
|
|||
|
;
|
|||
|
; select the text item specified
|
|||
|
;
|
|||
|
MOVE pswSelItem(A6),D0 ; D0 = item number to be selected
|
|||
|
BSR SelText ; select the text
|
|||
|
;
|
|||
|
; highlight the correct buttons in the dialog
|
|||
|
;
|
|||
|
TST.B D3 ; is guest login allowed
|
|||
|
BNE.S @20 ; yep, branch
|
|||
|
MOVE #fItemGuest,D0 ; which one to dim
|
|||
|
MOVE #255,D1 ; control will be set to this (dim)
|
|||
|
BSR HiliteItem ; dim the guest radio button
|
|||
|
@20 MOVE pMethod(A4),D1 ; D1 = method (cleartext, scrambled..)
|
|||
|
BSR SetPswdType ; set up the string for password type
|
|||
|
MOVE #fItemRegistered,D0 ; which one to hilite
|
|||
|
MOVE #1,D1 ; control set to 1
|
|||
|
BSR SetCtlItem ; set control
|
|||
|
MOVE.L A3,-(SP) ; push window ptr
|
|||
|
_ShowWindow
|
|||
|
;
|
|||
|
; This is the modal dialog loop
|
|||
|
;
|
|||
|
DialogLoop
|
|||
|
MOVE.L pswDialogPtr(A6),A3 ; Restore the dialog pointer
|
|||
|
BSR SetArrowCurs ; set the arrow cursor
|
|||
|
PEA PSWFilter ; set filter proc
|
|||
|
PEA pswItemHit(A6) ; item hit variable
|
|||
|
_ModalDialog
|
|||
|
;
|
|||
|
; If we're in the password edit text, switch to Roman script. - AMC/AKN 6/24/92
|
|||
|
; This feature can be disabled with a bit in a resource.
|
|||
|
;
|
|||
|
movem.l d0-d2/a0-a2,-(sp) ; Save some reg's
|
|||
|
cmp #fItemPEdit,pswItemHit(A6) ; Password EditText hit?
|
|||
|
bne.s @189 ; No, don't switch to Roman script
|
|||
|
subq #4,sp ; Check resource switch
|
|||
|
move.l #PWDRmolyR,-(sp) ; Push resource type
|
|||
|
move.w #PWDRmolyID,-(sp) ; Push resource ID
|
|||
|
_GetResource ; Fetch the resource
|
|||
|
move.l (sp)+,a0 ; Pop resource handle
|
|||
|
cmpa.l #0,a0 ; Is there an address there?
|
|||
|
beq @190 ; No, don't switch to Roman script
|
|||
|
move.l (a0),a1 ; Otherwise, get pointer
|
|||
|
move.b (a1),d0 ; Get resource data
|
|||
|
cmpi.b #1,d0 ; If the switch is 1, call KeyScript
|
|||
|
bne @190 ; Otherwise don't switch to Roman
|
|||
|
|
|||
|
if (forROM or theFuture) then
|
|||
|
move.l ExpandMem,a0 ; <24>
|
|||
|
move.l ExpandMemRec.emPPCPromptForUserGlobals(a0),a0 ; <24> Pointer to PPC globals
|
|||
|
lea PromptForUserGlobalsRec.IKeyScriptDone(a0),a0 ; <24> Pointer to IKeyScriptDone
|
|||
|
else
|
|||
|
lea IKeyScriptDone,a0 ; IKeyScriptDone indicates already switched to Roman
|
|||
|
endif
|
|||
|
|
|||
|
move.w (a0),d0 ; Get its value
|
|||
|
bnz @190 ; Already set, we're done
|
|||
|
move.w #1,(a0) ; Don't need to set KeyScript anymore
|
|||
|
|
|||
|
move.w #smRoman,-(sp) ; Set KeyScript Roman in Password EditText
|
|||
|
_KeyScript
|
|||
|
bra @190 ; We're done with Roman script switch
|
|||
|
|
|||
|
@189
|
|||
|
cmp #fItemUNameEdit,pswItemHit(A6) ; User name EditText hit?
|
|||
|
bne.s @190 ; No, get out
|
|||
|
if (forROM or theFuture) then
|
|||
|
move.l ExpandMem,a0 ; <24>
|
|||
|
move.l ExpandMemRec.emPPCPromptForUserGlobals(a0),a0 ; <24> Pointer to PPC globals
|
|||
|
lea PromptForUserGlobalsRec.IKeyScriptDone(a0),a0 ; <24> Pointer to IKeyScriptDone
|
|||
|
else
|
|||
|
lea IKeyScriptDone,a0 ; IKeyScriptDone indicates already switched to Roman
|
|||
|
endif
|
|||
|
|
|||
|
move.w #0,(a0) ; May need to set KeyScript now
|
|||
|
@190
|
|||
|
movem.l (sp)+,d0-d2/a0-a2 ; Restore reg's
|
|||
|
|
|||
|
CMP #fItemGuest,pswItemHit(A6) ; control hit?
|
|||
|
BNE.S @200 ; nope, branch
|
|||
|
BSR ClearMethButtons ; zero out all buttons
|
|||
|
MOVE #fItemGuest,D0 ; D0 = button to set
|
|||
|
MOVE #1,D1 ; control set to 1
|
|||
|
BSR SetCtlItem ; set it
|
|||
|
BSR HideUName
|
|||
|
MOVE #noUserAuth,pswMethod(A6) ; save guest as the method
|
|||
|
BRA.S @250 ; branch
|
|||
|
@200 CMP #fItemRegistered,pswItemHit(A6) ; button hit?
|
|||
|
BNE.S @220 ; nope, branch
|
|||
|
BSR ClearMethButtons ; zero out all radio buttons
|
|||
|
MOVE #fItemRegistered,D0 ; D0 = button to set
|
|||
|
MOVE #1,D1 ; control set to 1
|
|||
|
BSR SetCtlItem ; set it
|
|||
|
BSR RestoreUName
|
|||
|
MOVE pMethod(A4),pswMethod(A6) ; save password method passed as the method
|
|||
|
BRA.S @250 ; branch
|
|||
|
;
|
|||
|
; Test to see if a button was hit
|
|||
|
;
|
|||
|
@220 CMP #fItemOKButton,pswItemHit(A6) ; button hit?
|
|||
|
BLT.S @250 ; nope, branch (ignore it)
|
|||
|
BEQ.S ButtonOK ; if OK was hit then branch
|
|||
|
CMP #fItemCancelButton,pswItemHit(A6) ; cancel button hit?
|
|||
|
BEQ.S ButtonCancel ; if it was then branch
|
|||
|
@250 BRA.S DialogLoop ; branch to loop place
|
|||
|
;
|
|||
|
; The OK button was hit. Do the action.
|
|||
|
;
|
|||
|
ButtonOK
|
|||
|
;
|
|||
|
; Put user name and password chars into buffers
|
|||
|
;
|
|||
|
MOVE.L pswUName(A6),A2 ; A2 -> string to be returned to caller
|
|||
|
MOVE pswMethod(A6),D1 ; D1 = login method chosen
|
|||
|
BSR CopyUName ; copy the string in the dialog back to the caller
|
|||
|
MOVE.L pPwdTEHandle(A4),A1
|
|||
|
MOVE.L pswPwdPtr(A6),A3 ; A3 -> callers string storage
|
|||
|
MOVE pswMethod(A6),D1 ; D1 = login method chosen
|
|||
|
BSR CopyPassword ; copy password into the buffer the caller provided
|
|||
|
MOVEQ #noErr,D0 ; set no errors
|
|||
|
CMPI.L #0,pswCallbackPtr(A6)
|
|||
|
BEQ.S DialogDone
|
|||
|
;
|
|||
|
; !!!!!!!!!!!!!!!!!!!!!!!!!!
|
|||
|
;
|
|||
|
MOVE.L pswPbPtr(A6),-(SP)
|
|||
|
MOVEQ #0,D1
|
|||
|
MOVE.W pswMethod(A6),D1
|
|||
|
EXT.L D1
|
|||
|
MOVE.L D1,-(SP)
|
|||
|
MOVE.L pswUName(A6),-(SP)
|
|||
|
MOVE.L pswPwdPtr(A6),-(SP)
|
|||
|
MOVE.L pswCallbackPtr(A6),A0
|
|||
|
JSR (A0)
|
|||
|
;
|
|||
|
; Upon return D0 should contain one of the following info:
|
|||
|
; 0= if want to close the dialog.
|
|||
|
; 5= select the userName
|
|||
|
; 7= select the password
|
|||
|
;
|
|||
|
TST.W D0
|
|||
|
BEQ.S DialogDone
|
|||
|
CMP #fItemUNameEdit,D0
|
|||
|
BEQ SelectItem
|
|||
|
CMP #fItemPEdit,D0
|
|||
|
BEQ SelectItem
|
|||
|
BRA DialogLoop ; branch to loop place
|
|||
|
SelectItem
|
|||
|
MOVE.L pswDialogPtr(A6),A3 ; Restore the dialog pointer
|
|||
|
BSR SelText ; select the text
|
|||
|
BRA DialogLoop ; branch to loop place
|
|||
|
;
|
|||
|
; An error occurred somewhere...
|
|||
|
;
|
|||
|
ButtonCancel
|
|||
|
MOVEQ #-1,D0 ; set error code
|
|||
|
;
|
|||
|
; All done. Close up the dialog.
|
|||
|
;
|
|||
|
DialogDone
|
|||
|
MOVE D0,-(SP) ; save error code
|
|||
|
MOVE.L pswDialogPtr(A6),-(SP) ; push the dialog pointer
|
|||
|
_DisposDialog ; get rid of it
|
|||
|
MOVE.L pswSavePort(A6),-(SP) ; get saved graf port
|
|||
|
_SetPort
|
|||
|
MOVE.L pPwdTEHandle(A4),-(SP) ; password TERecord
|
|||
|
_TEDispose
|
|||
|
MOVE (SP)+,D0 ; restore error code
|
|||
|
MOVE pswMethod(A6),D1 ; D1 = login method chosen
|
|||
|
MOVEM.L (SP)+,D2-D5/A0-A4 ; save registers
|
|||
|
UNLK A6 ; no more stack frame
|
|||
|
RTS
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: PSWFilter
|
|||
|
;
|
|||
|
; Filter procedure for the Password window. It tests to see if a password
|
|||
|
; character is being typed in. If so, it replaces it with a '<27>' char
|
|||
|
; and saves it away.
|
|||
|
;
|
|||
|
; Note that this routine is called from the Dialog manager and not from
|
|||
|
; this device package. That means that there are no local variables. There
|
|||
|
; are, however, globals.
|
|||
|
;
|
|||
|
|
|||
|
; Parameters
|
|||
|
|
|||
|
;fItemHit .EQU 8 ; item hit var ptr
|
|||
|
;fEventRec .EQU fItemHit+4 ; event record ptr
|
|||
|
;fDlogPtr .EQU fEventRec+4 ; dialog ptr
|
|||
|
;fBoolean .EQU fDlogPtr+4 ; boolean result
|
|||
|
|
|||
|
pwFLclMouse EQU -4 ; space for mouse pt
|
|||
|
pwFLclSize EQU pwFLclMouse ; size of locals
|
|||
|
|
|||
|
PSWFilter
|
|||
|
LINK A6,#pwFLclSize ; set up stack frame
|
|||
|
MOVEM.L D0-D4/A0-A4,-(SP) ; save registers
|
|||
|
MOVE.L fEventRec(A6),A1 ; A1 -> event record
|
|||
|
MOVE.L fItemHit(A6),A2 ; A2 -> item hit variable
|
|||
|
|
|||
|
IF forROM or TheFuture THEN ; can<61>t have data inside code in ROM <22>
|
|||
|
|
|||
|
MOVE.L ExpandMem,A4 ; A4 -> Expanded Low Memory <22>
|
|||
|
MOVE.L ExpandMemRec.emPPCPromptForUserGlobals(A4),A4 ; A4-> ptr to globals <22>
|
|||
|
|
|||
|
ELSE ; <22>
|
|||
|
|
|||
|
LEA pGlobals,A4 ; A4 -> globals
|
|||
|
|
|||
|
ENDIF ; forROM or TheFuture <22>
|
|||
|
|
|||
|
CLR (A2) ; by default return itemHit as 0.
|
|||
|
CLR fBoolean(A6) ; assume False
|
|||
|
|
|||
|
|
|||
|
MOVE.L fDlogPtr(A6),A3 ; dialog window to be updated?
|
|||
|
BSR MySetCursor ; First things first, make our cursor the right one.
|
|||
|
MOVE evtNum(A1),D0 ; what is the event code?
|
|||
|
CMP #keyDwnEvt,D0 ; is it keydown?
|
|||
|
BEQ @10 ; yes, branch
|
|||
|
CMP #autoKeyEvt,D0 ; how about auto key?
|
|||
|
BEQ @10 ; yes, branch
|
|||
|
CMP #updatEvt,D0 ; what about an update?
|
|||
|
BEQ.S @04 ; yes, branch
|
|||
|
BRA @90 ; nothing more to do, just exit
|
|||
|
;
|
|||
|
; An update has occurred. Redraw the misc information in the window.
|
|||
|
;
|
|||
|
@04 MOVE.L evtMessage(A1),A3 ; A3 -> window to be updated
|
|||
|
CMP.L fDlogPtr(A6),A3 ; dialog window to be updated?
|
|||
|
BNE @90 ; if not then just exit
|
|||
|
;
|
|||
|
; Continue updating screen: bold the OK button
|
|||
|
;
|
|||
|
MOVE #fItemOKButton,D0 ; button item number
|
|||
|
BSR BoldButton ; make the button bold
|
|||
|
MOVE.L pIconHdl(A4),A0 ; A0 -> icon handle
|
|||
|
BSR DisplayIcon ; display the icon
|
|||
|
MOVE.L fDlogPtr(A6),A3 ; dialog window ptr
|
|||
|
BRA @90 ; pretend like I was never here.
|
|||
|
;
|
|||
|
; Process the key event
|
|||
|
;
|
|||
|
@10 MOVE.L evtMessage(A1),D1 ; D1 low byte = character
|
|||
|
AND #$FF,D1 ; clear out all except the low byte
|
|||
|
MOVE.W evtMeta(A1),D0
|
|||
|
AND.W #cmdKeyMask,D0
|
|||
|
BEQ @15 ; No Command Key
|
|||
|
; Process the command key.
|
|||
|
CLR D0 ; clear item number
|
|||
|
CMP #rChar,D1 ; Is it Command-R?
|
|||
|
BEQ @DoCmdR
|
|||
|
CMP #gChar,D1 ; Is it Command-G?
|
|||
|
BEQ @DoCmdG
|
|||
|
CMP #periodChar,D1 ; Is it Command-.?
|
|||
|
BEQ @DoCmdStop
|
|||
|
|
|||
|
; Last of all handle the edit functions.
|
|||
|
CMP #'x',D1 ; Is it Command-X?
|
|||
|
BEQ @IsEdit
|
|||
|
CMP #'c',D1 ; Is it Command-C?
|
|||
|
BEQ @IsEdit
|
|||
|
CMP #'v',D1 ; Is it Command-V?
|
|||
|
BEQ @IsEdit
|
|||
|
BRA @BeepAndExit ; Ignore all other command keys.
|
|||
|
|
|||
|
; Handle Command-R
|
|||
|
@DoCmdR
|
|||
|
MOVE #fItemRegistered,D0 ; get the Guest button item
|
|||
|
BRA @ExitCmdKey
|
|||
|
|
|||
|
; Handle Command-G
|
|||
|
@DoCmdG
|
|||
|
TST.B pGuestAllowed(A4) ; test the guest boolean
|
|||
|
BEQ @ExitCmdKey ; no guest allowed, just blow off event.
|
|||
|
MOVE #fItemGuest,D0 ; get the Guest button item
|
|||
|
BRA @ExitCmdKey ;
|
|||
|
|
|||
|
; Handle Command-.
|
|||
|
@DoCmdStop
|
|||
|
MOVE #fItemCancelButton,D0 ; get the Cancel button item
|
|||
|
BRA @ExitCmdKey
|
|||
|
|
|||
|
@IsEdit
|
|||
|
MOVE.L fDlogPtr(A6),A3 ; A3 -> dialog
|
|||
|
MOVE editField(A3),D0 ; D0 = edit text item field minus 1
|
|||
|
ADDQ #1,D0 ; increment it
|
|||
|
CMP #fItemPEdit,D0 ; is it in the password box?
|
|||
|
BNE @ExitFilter ; Let Dialog Manager handle it.
|
|||
|
|
|||
|
@BeepAndExit
|
|||
|
MOVE.W #2,-(SP) ; Push the duration onto the stack
|
|||
|
_SysBeep
|
|||
|
@ExitCmdKey
|
|||
|
MOVE D0,(A2) ; set the item to be returned
|
|||
|
BRA @80 ; exit with TRUE.
|
|||
|
|
|||
|
; Process a normal key stroke
|
|||
|
@15 MOVE.L fDlogPtr(A6),A3 ; A3 -> dialog
|
|||
|
MOVE editField(A3),D0 ; D0 = edit text item field minus 1
|
|||
|
ADDQ #1,D0 ; increment it
|
|||
|
CMP #crChar,D1 ; return key?
|
|||
|
BEQ @70
|
|||
|
CMP #enterChar,D1 ; enter key?
|
|||
|
BEQ @70
|
|||
|
CMP #noUserAuth,pMethod(A4) ; is the method OK?
|
|||
|
BNE.S @20 ; if so then branch
|
|||
|
BRA @80 ; all done, exit with TRUE.
|
|||
|
;
|
|||
|
; A key has been pressed for an active text edit box
|
|||
|
;
|
|||
|
@20 CMP #tabChar,D1 ; tab key?
|
|||
|
BEQ @90 ; just ignore it if it was
|
|||
|
CMP #clrChar,D1 ; is it a clear key?
|
|||
|
BNE.S @25 ; no, branch
|
|||
|
MOVE #bsChar,D1 ; else set character to backspace key
|
|||
|
MOVE.L D1,evtMessage(A1) ; set character to bsKey
|
|||
|
@25 CMP #fItemPEdit,D0 ; is it the password box?
|
|||
|
BNE @60 ; if not then branch
|
|||
|
|
|||
|
; process char that was entered in the password box.
|
|||
|
;
|
|||
|
MOVE.L pPwdTEHandle(A4),A1 ; A1 = real char password handle
|
|||
|
BSR TESelCopy ; copy the selection from the masked TE rec to the real one
|
|||
|
|
|||
|
CMP.B #funcKey,D1
|
|||
|
BEQ @BeepAndExit
|
|||
|
CMP.B #fwdDelete,D1 ; If I had time, this would work.
|
|||
|
BEQ @BeepAndExit
|
|||
|
CMP.B #leftArrow,D1
|
|||
|
BEQ @90 ; Let Dialog Mangager handle it.
|
|||
|
CMP.B #rightArrow,D1
|
|||
|
BEQ @90
|
|||
|
CMP.B #upArrow,D1
|
|||
|
BEQ @90
|
|||
|
CMP.B #downArrow,D1
|
|||
|
BEQ @90
|
|||
|
; Check for selection
|
|||
|
MOVE.L teHandle(A3),A0 ; A0 = handle to dialog text edit record
|
|||
|
MOVE.L (A0),A0 ; A0 -> text edit record
|
|||
|
MOVE teSelEnd(A0),D2 ; get selection end
|
|||
|
SUB teSelStart(A0),D2 ; any selection made
|
|||
|
BNE @35 ; Don't check for max length if selection is made.
|
|||
|
MOVE D0,(A2) ; return the item hit in the variable
|
|||
|
CMP.B #bsChar,D1 ; is it a backspace?
|
|||
|
BEQ @35 ; if so, don't bother checking for maximum length.
|
|||
|
MOVE #maxUsrPwdLen,D0 ; D0 = maximum password length
|
|||
|
BSR ChkLength ; check the password length
|
|||
|
BNE @80 ; if error then branch
|
|||
|
@35 MOVE D1,-(SP) ; Save a copy for later.
|
|||
|
|
|||
|
; Re-Sync password TE and maskChar TE for 2 byte code 6/20/92 AKN
|
|||
|
; If the entire bullet-char-TE is selected, select all of real password TE
|
|||
|
|
|||
|
move.w d1,-(sp) ; Save d1
|
|||
|
|
|||
|
move.w teSelStart(a0),d0 ; Get start of selection
|
|||
|
bnz @40 ; Not all of TE selected, then don't re-sync
|
|||
|
|
|||
|
move.w teSelEnd(a0),d0 ; Get end of selection
|
|||
|
cmp.w teLength(a0),d0 ; Make sure selection goes to end of string
|
|||
|
bnz @40 ; If it doesn't, don't re-sync
|
|||
|
|
|||
|
move.l #0,-(sp) ; Push SelStart
|
|||
|
move.l #30000,-(sp) ; Push SelEnd
|
|||
|
move.l pPwdTEHandle(A4),-(sp) ; Push actual password TE Handle
|
|||
|
_TESetSelect ; Select entire string
|
|||
|
|
|||
|
; If theChar is two byte char, call TEDelete. This forces two byte password
|
|||
|
; to start at beginning of actual password string.
|
|||
|
|
|||
|
movea.l sp,a0 ; A0 -> theChar
|
|||
|
add.l #1,a0 ; Get low byte
|
|||
|
sub #2,sp ; Room for result of CharByte
|
|||
|
move.l a0,-(sp) ; Push address of theChar
|
|||
|
move.w #0,-(sp) ; Push offset 0
|
|||
|
_CharByte ; What kind of Char?
|
|||
|
move.w (sp)+,d0 ; Get result
|
|||
|
cmp.w #smFirstByte,d0 ; Is it 1st byte of two byte char?
|
|||
|
bnz @40 ; No, don't do resync
|
|||
|
|
|||
|
move.l pPwdTEHandle(A4),-(sp) ; Push actual password TE Handle
|
|||
|
_TEDelete ; Clear actual password
|
|||
|
|
|||
|
@40 move.w (sp)+,d1 ; restore D1
|
|||
|
|
|||
|
MOVE D1,-(SP) ; normal character
|
|||
|
MOVE.L pPwdTEHandle(A4),-(SP) ; push handle to actual password characters
|
|||
|
_TEKey ; update our hidden password.
|
|||
|
MOVE (SP)+,D1 ; restore D1.
|
|||
|
CMP #bsChar,D1 ; backspace key?
|
|||
|
BEQ.S @90 ; Let Dialog Mangager handle backspace.
|
|||
|
MOVE.L fEventRec(A6),A1 ; A1 -> event record
|
|||
|
MOVE.B pBulletChar(A4),D1 ; Set D1 to the maskChar. <21>
|
|||
|
MOVE.L D1,evtMessage(A1) ; change the event record so it shows up as a maskchar.
|
|||
|
BRA.S @90 ; Have Dialog Manager handle the rest.
|
|||
|
;
|
|||
|
; A key was pressed for the user name edit box. Make sure it's a maximum of 31 characters or else
|
|||
|
; a beep is sounded.
|
|||
|
;
|
|||
|
@60 CMP.B #bsChar,D1 ; backspace character?
|
|||
|
BEQ.S @90 ; if so then exit (don't process it)
|
|||
|
MOVE #uNameSize,D0 ; maximum length of name
|
|||
|
BSR ChkLength ; calculate the text length
|
|||
|
BNE.S @80 ; if over limit then exit (eat the event)
|
|||
|
BRA.S @90 ; all done (let the dialog mgr take care of the event)
|
|||
|
;
|
|||
|
; A return or enter key was hit
|
|||
|
;
|
|||
|
@70 CLR D0 ; clear item number
|
|||
|
MOVE #fItemOKButton,D0 ; get the OK button item
|
|||
|
BSR HiliteOKButton ; hilite the OK button for a short time
|
|||
|
MOVE D0,(A2) ; set the item to be returned
|
|||
|
|
|||
|
; Return TRUE.
|
|||
|
@80 MOVE #$0100,fBoolean(A6) ; set function result to TRUE (eat the event)
|
|||
|
;
|
|||
|
; All done
|
|||
|
;
|
|||
|
@ExitFilter
|
|||
|
@90 MOVEM.L (SP)+,D0-D4/A0-A4 ; restore registers
|
|||
|
UNLK A6
|
|||
|
MOVE.L (SP)+,A0 ; get return address
|
|||
|
ADD.L #fPSize,SP ; strip parameters
|
|||
|
JMP (A0) ; and return
|
|||
|
|
|||
|
;_________________________________________________________
|
|||
|
;
|
|||
|
; Routine : AbbreviateString
|
|||
|
;
|
|||
|
; Given a string and a max string length, shorten the string until it
|
|||
|
; fits in the given space and append '...' to it if it is shortened.
|
|||
|
;
|
|||
|
; Entry: A0 -> source string
|
|||
|
; A1 -> dest string
|
|||
|
; D0 = max string length
|
|||
|
;
|
|||
|
AbbreviateString
|
|||
|
MOVEM.L D0-D4/A0-A2,-(SP) ; save some registers
|
|||
|
SF D4 ; clear shrink flag
|
|||
|
MOVE D0,D3 ; save max str length
|
|||
|
MOVE.L A1,D2 ; save str ptr
|
|||
|
ADD #1,D2 ; D2 actually points to the text of the string
|
|||
|
CLR D1
|
|||
|
MOVE.B (A0),D1 ; D1 = length of current string
|
|||
|
BSR StrCopy ; copy string into A1
|
|||
|
@10 MOVEM.L D1-D2/A0-A1,-(SP) ; save registers
|
|||
|
SUBQ #2,SP ; func result
|
|||
|
MOVE.L D2,-(SP) ; push string text ptr
|
|||
|
CLR -(SP) ; firstByte is always zero
|
|||
|
MOVE D1,-(SP) ; push byteCount (string length)
|
|||
|
_TextWidth ; check string length
|
|||
|
MOVE (SP)+,D0 ; get string length
|
|||
|
MOVEM.L (SP)+,D1-D2/A0-A1 ; restore registers
|
|||
|
CMP D0,D3 ; how big is it currently?
|
|||
|
BGE.S @20 ; if within range then branch
|
|||
|
ST D4 ; set shrink flag
|
|||
|
SUB #1,D1 ; decrement string length
|
|||
|
BRA.S @10 ; and do it again
|
|||
|
;
|
|||
|
; First see if we shrunk the string down. If we did then append the ... to the string
|
|||
|
;
|
|||
|
@20 TST.B D4 ; shrink flag set?
|
|||
|
BEQ.S @90 ; if cleared then branch
|
|||
|
MOVE.L D2,A1 ; A1 -> new string text area
|
|||
|
SUB #1,A1 ; A1 -> new string
|
|||
|
MOVE.B D1,(A1) ; set new string length
|
|||
|
LEA ThreeDotStr,A0 ; A0 -> our three dot string
|
|||
|
BSR.S AppendString ; append string onto end
|
|||
|
@90 MOVEM.L (SP)+,D0-D4/A0-A2 ; restore registers
|
|||
|
RTS
|
|||
|
;_________________________________________________________
|
|||
|
;
|
|||
|
; Routine : AppendString
|
|||
|
;
|
|||
|
; Append a string to the end of the string.
|
|||
|
;
|
|||
|
; Entry: A0 -> string to append
|
|||
|
; A1 -> dest string
|
|||
|
; Exit: A1 -> new string
|
|||
|
;
|
|||
|
; Called by: AbbrieviateString, MakePrompt
|
|||
|
;
|
|||
|
AppendString
|
|||
|
MOVEM.L D0-D2/A0-A2,-(SP) ; save some registers
|
|||
|
MOVE.L A1,A2 ; save start of string in A2
|
|||
|
CLR D1 ; clear word
|
|||
|
MOVE.B (A1),D1 ; D1 = length of dest string
|
|||
|
BEQ.S @10 ; if zero length then branch
|
|||
|
LEA 0(A1,D1),A1 ; point to end of string
|
|||
|
@10 MOVE.B (A1),D2 ; save byte
|
|||
|
MOVE.L A1,-(SP) ; save start of string
|
|||
|
BSR StrCopy ; copy the string into temp storage
|
|||
|
MOVE.L (SP)+,A1 ; A1 -> place in new string where append string is
|
|||
|
TST.B D1 ; what's then length of the string
|
|||
|
BEQ.S @20 ; if zero length then branch
|
|||
|
MOVE.B (A0),D1 ; get length of appended string
|
|||
|
ADD.B D1,(A2) ; fix length of new string
|
|||
|
MOVE.B D2,(A1) ; restore byte saved earlier
|
|||
|
@20 MOVEM.L (SP)+,D0-D2/A0-A2 ; restore registers
|
|||
|
RTS
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: BoldButton
|
|||
|
;
|
|||
|
; This code outlines a button to be the default selection. This code is
|
|||
|
; taken directly from ROM sources. Note that the button will not be
|
|||
|
; bolded if the related button is in the dimmed mode.
|
|||
|
;
|
|||
|
; Entry: D0 = button item number in dialog
|
|||
|
; A3 -> dialog
|
|||
|
;
|
|||
|
; All registers preserved.
|
|||
|
;
|
|||
|
bbType EQU -2 ; item type used by Dialog Mgr calls
|
|||
|
bbIHandle EQU bbType-4 ; handle to item
|
|||
|
bbBox EQU bbIHandle-8 ; item rect
|
|||
|
BBSize EQU bbBox ; size of local variables
|
|||
|
|
|||
|
BoldButton
|
|||
|
LINK A6,#BBSize ; set up stack frame
|
|||
|
MOVEM.L A0-A2/D0-D3,-(SP) ; save registers
|
|||
|
MOVE.L A3,-(SP) ; dialog ptr
|
|||
|
MOVE D0,-(SP) ; item number
|
|||
|
PEA bbType(A6) ; type storage
|
|||
|
PEA bbIHandle(A6) ; item handle storage
|
|||
|
PEA bbBox(A6) ; rect storage
|
|||
|
_GetDItem
|
|||
|
MOVE.L bbIHandle(A6),A0 ; A0 = handle to control
|
|||
|
MOVE.L (A0),A0 ; A0 -> control record
|
|||
|
CMP.B #$FE,contrlHilite(A0) ; test control hilite state
|
|||
|
BLT.S @90 ; if inactive then branch
|
|||
|
LEA bbBox(A6),A0 ; A0 -> OK button rect
|
|||
|
MOVEQ #3,D0
|
|||
|
MOVEQ #16,D1
|
|||
|
MOVEQ #4,D2
|
|||
|
MOVE.L A0,-(SP) ; rect
|
|||
|
MOVE D2,-(SP) ; size for re-insetting
|
|||
|
MOVE D2,-(SP)
|
|||
|
MOVE.L A0,-(SP) ; rect
|
|||
|
MOVE D1,-(SP) ; roundness
|
|||
|
MOVE D1,-(SP)
|
|||
|
MOVE.L A0,-(SP) ; rect
|
|||
|
NEG D2
|
|||
|
MOVE D2,-(SP) ; push size
|
|||
|
MOVE D2,-(SP) ; push size
|
|||
|
MOVE D0,-(SP) ; pensize
|
|||
|
MOVE D0,-(SP)
|
|||
|
_PenSize
|
|||
|
_InsetRect
|
|||
|
_FrameRoundRect
|
|||
|
_InsetRect
|
|||
|
_PenNormal ; back to the way it was
|
|||
|
@90 MOVEM.L (SP)+,A0-A2/D0-D3 ; restore registers
|
|||
|
UNLK A6
|
|||
|
RTS
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: CheckForCursKey
|
|||
|
;
|
|||
|
; Check to see if the key passed in D1 was a cursor key. If it was then
|
|||
|
; clear the returned flag.
|
|||
|
;
|
|||
|
; Entry: D1.B = key hit
|
|||
|
; Exit: D0 = status of key hit: (ccr's set)
|
|||
|
; zero = cursor key hit
|
|||
|
; non-zero = no cursor key hit
|
|||
|
;
|
|||
|
; Called by: PWFilter, VPFilter
|
|||
|
;
|
|||
|
CheckForCursKey
|
|||
|
MOVEQ #-1,D0 ; assume no cursor key hit
|
|||
|
CMP.B #$1C,D1 ; cursor key range?
|
|||
|
BLT.S @10 ; if less then branch
|
|||
|
CMP.B #$1F,D1 ; check upper range
|
|||
|
BGT.S @10 ; if out of bounds then branch
|
|||
|
MOVEQ #0,D0 ; clear flag indicating cursor key hit
|
|||
|
@10 RTS
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: ChkLength
|
|||
|
;
|
|||
|
; Check to make sure the text is within the required length. Beep if
|
|||
|
; it isn't
|
|||
|
;
|
|||
|
; Entry: A3 -> dialog record ptr
|
|||
|
; D0 = maximum length of text
|
|||
|
; Exit: CCR's set (z-bit set if no errors)
|
|||
|
;
|
|||
|
ChkLength
|
|||
|
MOVEM.L A0-A4/D0-D2,-(SP) ; save registers
|
|||
|
MOVE.L teHandle(A3),A0 ; A0 -> te Handle
|
|||
|
MOVE.L (A0),A0 ; A0 -> te record
|
|||
|
MOVE teLength(A0),D2 ; D2 = length of text
|
|||
|
CMP D0,D2 ; is it within range?
|
|||
|
BLT.S @05 ; yes, branch
|
|||
|
;
|
|||
|
; Password already 8 chars long, but if there's a selection then OK it
|
|||
|
;
|
|||
|
MOVE teSelEnd(A0),D1 ; D1 = selection start range
|
|||
|
SUB teSelStart(A0),D1 ; D1 = number of bytes in selection
|
|||
|
BLE.S @10 ; if there's no selection then branch
|
|||
|
@05 CLR D2 ; set ccr's (no error)
|
|||
|
BRA.S @20
|
|||
|
@10 MOVE #beepLen,-(SP) ; length of beep
|
|||
|
_SysBeep
|
|||
|
MOVEQ #-1,D2 ; set ccr's
|
|||
|
@20 MOVEM.L (SP)+,A0-A4/D0-D2 ; save registers
|
|||
|
RTS
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: ClearMethButtons
|
|||
|
;
|
|||
|
; Clear all active user authentication buttons to zero.
|
|||
|
;
|
|||
|
; Entry: A3 -> PSW dialog
|
|||
|
;
|
|||
|
; Called by : PromptUser
|
|||
|
;
|
|||
|
ClearMethButtons
|
|||
|
MOVEM.L D0-D1,-(SP) ; save registers
|
|||
|
MOVE #fItemGuest,D0 ; initial button number
|
|||
|
CLR D1 ; hilite value = no
|
|||
|
BSR SetCtlItem ; set control to zero
|
|||
|
MOVE #fItemRegistered,D0 ; initial button number
|
|||
|
CLR D1 ; hilite value = no
|
|||
|
BSR SetCtlItem ; set control to zero
|
|||
|
MOVEM.L (SP)+,D0-D1 ; restore registers
|
|||
|
RTS
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: CopyPassword
|
|||
|
;
|
|||
|
; Entry: A1 -> TE Handle
|
|||
|
; A3 -> buffer to copy password into
|
|||
|
; D1 = login method chosen
|
|||
|
; Exit: A3 -> buffer filled with password
|
|||
|
;
|
|||
|
; Called by : PromptUser
|
|||
|
;
|
|||
|
CopyPassword
|
|||
|
CMP #noUserAuth,D1 ; guest?
|
|||
|
BNE.S @05 ; nope.. branch
|
|||
|
MOVE.B #0,(A3) ; return NIL string
|
|||
|
BRA.S @40 ; return
|
|||
|
@05 MOVEM.L A0/A1/A3/D0/D3,-(SP) ; save registers
|
|||
|
MOVE.L (A1),A0 ; A0 -> te rec ptr
|
|||
|
MOVE teLength(A0),D3 ; D3 = length of text
|
|||
|
BNE.S @06
|
|||
|
MOVE.B #0,(A3)
|
|||
|
BEQ.S @20 ; if nothing there then branch
|
|||
|
@06 SUBQ #4,SP ; make space
|
|||
|
MOVE.L A1,-(SP) ; push te handle
|
|||
|
_TEGetText
|
|||
|
MOVE.L (SP)+,A0 ; A0 -> te char ptr
|
|||
|
MOVE.L (A0),A0 ; A0 -> characters
|
|||
|
CLR.L D0 ; clear D0 long word
|
|||
|
MOVE D3,D0 ; set length of data
|
|||
|
MOVE.L A3,A1 ; get back ptr to storage
|
|||
|
MOVE.B D3,(A1)+ ; set length into the string
|
|||
|
_BlockMove
|
|||
|
@20 MOVEM.L (SP)+,A0/A1/A3/D0/D3 ; restore registers
|
|||
|
@40 RTS
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: CopyUName
|
|||
|
;
|
|||
|
; Copies user name from dialog into a string buffer. If the user name
|
|||
|
; is greater than uNameSize, then truncate it.
|
|||
|
;
|
|||
|
; Entry: A4 -> globals
|
|||
|
; A2 -> buffer to copy name into
|
|||
|
; D1 = login method chosen
|
|||
|
;
|
|||
|
; Called by : PromptUser
|
|||
|
;
|
|||
|
cunStr EQU -256 ; string
|
|||
|
cunSize EQU cunStr ; size of locals
|
|||
|
|
|||
|
CopyUName
|
|||
|
CMP #noUserAuth,D1 ; guest?
|
|||
|
BNE.S @05 ; nope.. branch
|
|||
|
MOVE.B #0,(A2) ; return NIL string
|
|||
|
BRA.S @40 ; return
|
|||
|
@05 LINK A6,#cunSize ; allocate locals
|
|||
|
MOVEM.L D0-D3/A0-A2,-(SP) ; save some registers
|
|||
|
MOVE.L pPWDlogUNameHdl(A4),-(SP) ; A0 = handle to user name Dlog text record
|
|||
|
PEA cunStr(A6) ; push ptr to space
|
|||
|
_GetIText ; get that text!
|
|||
|
LEA cunStr(A6),A0 ; A0 -> name string user typed in
|
|||
|
MOVEQ #0,D0 ; clear length
|
|||
|
CMP.B #uNameSize,(A0) ; get length byte
|
|||
|
BLE.S @10 ; if less or equal then branch
|
|||
|
MOVE.B #uNameSize,(A0) ; else set uName size
|
|||
|
@10 MOVE.L A2,A1 ; A1 -> dest buffer
|
|||
|
BSR StrCopy ; copy user name into buffer
|
|||
|
MOVEM.L (SP)+,D0-D3/A0-A2 ; restore registers
|
|||
|
UNLK A6
|
|||
|
@40 RTS
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: MySetCursor
|
|||
|
;
|
|||
|
; Setup the cursor as appropriate
|
|||
|
;
|
|||
|
; Entry: A3 -> dialog ptr
|
|||
|
;
|
|||
|
; All registers preserved
|
|||
|
;
|
|||
|
MySetCursor
|
|||
|
MOVEM.L A0-A3/D0-D4,-(SP) ; save registers
|
|||
|
LINK A6,#-4 ; set up stack frame.
|
|||
|
PEA -4(A6) ; VAR mouseLoc : Point
|
|||
|
_GetMouse ; get mouse local coordinates.
|
|||
|
MOVE.L A3,-(SP) ; Push Dialog Pointer
|
|||
|
MOVE.L -4(A6),-(SP) ; mouseLoc moved onto stack.
|
|||
|
_FindDItem ; Which item is the point over.
|
|||
|
MOVE.W (SP)+,D0 ; Pop the item into D0.
|
|||
|
CMP #fItemUNameEdit-1,D0 ; is mouse over user name edit box?
|
|||
|
BEQ @25 ; yes it is.
|
|||
|
CMP #fItemPEdit-1,D0 ; is mouse over password edit box?
|
|||
|
BEQ @25
|
|||
|
_InitCursor ; set cursor to arrow
|
|||
|
BRA.S @26 ; branch to sub exit pt
|
|||
|
@25 SUBQ #4,SP ; make room for curs handle
|
|||
|
MOVE #iBeamCursor,-(SP) ; set cursor ID
|
|||
|
_GetCursor
|
|||
|
MOVE.L (SP)+,A0 ; A0 = curs handle
|
|||
|
MOVE.L (A0),A0 ; A0 -> cursor
|
|||
|
MOVE.L A0,-(SP) ; push cursor
|
|||
|
_SetCursor ; set cursor to i-beam
|
|||
|
@26 UNLK A6 ; restore stack frame
|
|||
|
MOVEM.L (SP)+,A0-A3/D0-D4 ; restore registers
|
|||
|
RTS
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: DisplayIcon
|
|||
|
;
|
|||
|
; Display an icon in the top left corner of the current grafport
|
|||
|
;
|
|||
|
; Entry: A0 -> icon handle
|
|||
|
;
|
|||
|
; All registers preserved
|
|||
|
;
|
|||
|
|
|||
|
DisplayIcon
|
|||
|
MOVEM.L A0-A3/D0-D4,-(SP) ; save registers
|
|||
|
PEA IconRect ; push the icon rect location
|
|||
|
MOVE.L A0,-(SP) ; push handle to icon
|
|||
|
_PlotIcon
|
|||
|
MOVEM.L (SP)+,A0-A3/D0-D4 ; restore registers
|
|||
|
RTS
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: HideControlItem
|
|||
|
;
|
|||
|
; Hide the control item.
|
|||
|
;
|
|||
|
; Entry: D0 = control item number
|
|||
|
; A3 -> dialog
|
|||
|
; A6 -> local storage for item information
|
|||
|
;
|
|||
|
; Called by : PromptUser
|
|||
|
;
|
|||
|
HideControlItem
|
|||
|
MOVEM.L A0-A1/D0-D3,-(SP) ; save registers
|
|||
|
MOVE.L A3,-(SP) ; dialog ptr
|
|||
|
MOVE D0,-(SP) ; item number
|
|||
|
PEA pswType(A6) ; type storage
|
|||
|
PEA pswIHandle(A6) ; item handle storage
|
|||
|
PEA pswBox(A6) ; rect storage
|
|||
|
_GetDItem
|
|||
|
MOVE.L pswIHandle(A6),-(SP) ; push handle to control
|
|||
|
_HideControl
|
|||
|
MOVEM.L (SP)+,A0-A1/D0-D3 ; restore registers
|
|||
|
RTS
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: HideUName
|
|||
|
;
|
|||
|
; Entry: A3 -> PSW dialog record
|
|||
|
;
|
|||
|
; Called by : PromptUser, PSWFilter
|
|||
|
;
|
|||
|
HideUName
|
|||
|
MOVEM.L A0-A2/D0-D3,-(SP) ; save registers
|
|||
|
|
|||
|
MOVE.L A3,-(SP)
|
|||
|
MOVE #fItemUserTextLine,-(SP) ; hide the static string "Name".
|
|||
|
_HideDItem
|
|||
|
|
|||
|
MOVE.L A3,-(SP)
|
|||
|
MOVE #fItemUNameEdit,-(SP) ; hide the edit field for user name.
|
|||
|
_HideDItem
|
|||
|
|
|||
|
MOVE.L A3,-(SP)
|
|||
|
MOVE #fItemPTextLine,-(SP) ; hide the static string "Password".
|
|||
|
_HideDItem
|
|||
|
|
|||
|
MOVE.L A3,-(SP)
|
|||
|
MOVE #fItemPEdit,-(SP) ; hide edit field for password.
|
|||
|
_HideDItem
|
|||
|
|
|||
|
MOVEM.L (SP)+,A0-A2/D0-D3 ; restore registers
|
|||
|
RTS
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: HiliteItem
|
|||
|
;
|
|||
|
; Highlight the control. This can be used to dim an item.
|
|||
|
;
|
|||
|
; Entry: D0 = item number
|
|||
|
; D1 = value
|
|||
|
; A3 -> dialog
|
|||
|
; A6 -> local storage for item information
|
|||
|
;
|
|||
|
HiliteItem
|
|||
|
MOVEM.L A0-A1/D0-D3,-(SP) ; save registers
|
|||
|
MOVE D1,D3 ; save value in D3
|
|||
|
MOVE.L A3,-(SP) ; dialog ptr
|
|||
|
MOVE D0,-(SP) ; item number
|
|||
|
PEA pswType(A6) ; type storage
|
|||
|
PEA pswIHandle(A6) ; item handle storage
|
|||
|
PEA pswBox(A6) ; rect storage
|
|||
|
_GetDItem
|
|||
|
MOVE.L pswIHandle(A6),-(SP) ; push handle to control
|
|||
|
MOVE D3,-(SP) ; make inactive
|
|||
|
_HiliteControl
|
|||
|
MOVEM.L (SP)+,A0-A1/D0-D3 ; restore registers
|
|||
|
RTS
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: HiliteOKButton
|
|||
|
;
|
|||
|
; Hilite the OK button in the dialog box. This is used when the user
|
|||
|
; types the Return or Enter key and the application wants to make it
|
|||
|
; appear as though the mouse was pressed in the button.
|
|||
|
;
|
|||
|
; Entry: D0 = item number
|
|||
|
; A3 -> dialog
|
|||
|
;
|
|||
|
hOKType EQU -2 ; item type used by Dialog Mgr calls
|
|||
|
hOKIHandle EQU hOKType-4 ; handle to item
|
|||
|
hOKBox EQU hOKIHandle-8 ; item rect
|
|||
|
hOKSize EQU hOKBox ; size of locals
|
|||
|
|
|||
|
HiliteOKButton
|
|||
|
LINK A6,#hOKSize ; make some space
|
|||
|
MOVEM.L A0-A2/D0-D3,-(SP) ; save registers
|
|||
|
MOVE.L A3,-(SP) ; dialog ptr
|
|||
|
MOVE D0,-(SP) ; item number
|
|||
|
PEA hOKType(A6) ; type storage
|
|||
|
PEA hOKIHandle(A6) ; item handle storage
|
|||
|
PEA hOKBox(A6) ; rect storage
|
|||
|
_GetDItem
|
|||
|
MOVE.L hOKIHandle(A6),-(SP) ; push handle to control
|
|||
|
MOVE #1,-(SP) ; set on
|
|||
|
_HiliteControl
|
|||
|
MOVE.L #5,A0 ; delay time
|
|||
|
_Delay ; short delay
|
|||
|
MOVE.L hOKIHandle(A6),-(SP) ; push handle to control
|
|||
|
MOVE #0,-(SP) ; set off
|
|||
|
_HiliteControl
|
|||
|
MOVEM.L (SP)+,A0-A2/D0-D3 ; restore registers
|
|||
|
UNLK A6
|
|||
|
RTS
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: PutPswdInDlog
|
|||
|
;
|
|||
|
; This routine puts the password in dialog if there is one
|
|||
|
;
|
|||
|
; Entry: D2 = TE handle
|
|||
|
; A2 -> password string
|
|||
|
;
|
|||
|
; Called by: PromptUser
|
|||
|
;
|
|||
|
PutPswdInDlog
|
|||
|
MOVEM.L D0/D3,-(SP) ; save registers
|
|||
|
CLR.L D3 ; clear out D3
|
|||
|
MOVE.B (A2)+,D3 ; get length of string
|
|||
|
BEQ.S @20 ; if nothing there then branch
|
|||
|
;
|
|||
|
; Insert the password into the actual TE record
|
|||
|
;
|
|||
|
MOVE.L A2,-(SP) ; push ptr to text chars
|
|||
|
MOVE.L D3,-(SP) ; push length
|
|||
|
MOVE.L D2,-(SP) ; push TE handle
|
|||
|
_TESetText ; put password chars into text edit record
|
|||
|
;
|
|||
|
; Change the password characters and pad them with maskChars
|
|||
|
;
|
|||
|
@05 SUBQ #1,D3 ; set index value
|
|||
|
@10 MOVE.B pBulletChar(A4),0(A2,D3) ; set password string with maskChars <21>
|
|||
|
DBRA D3,@10 ; loop if necessary
|
|||
|
SUBQ #1,A2 ; A2 -> masked password char string
|
|||
|
MOVE #fItemPEdit,D0 ; item number
|
|||
|
BSR SetDIText ; set password into dialog edit record
|
|||
|
@20 MOVEM.L (SP)+,D0/D3 ; restore registers
|
|||
|
RTS
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: RestoreUName
|
|||
|
;
|
|||
|
; Set the password editable text edit box to be the one activated and
|
|||
|
; cause a redraw of the name and password fields.
|
|||
|
;
|
|||
|
; Entry: A3 -> Dialog record
|
|||
|
; A6 -> Dialog locals
|
|||
|
;
|
|||
|
; Called by : PromptUser
|
|||
|
;
|
|||
|
RestoreUName
|
|||
|
MOVEM.L A0-A2/D0-D3,-(SP) ; save registers
|
|||
|
|
|||
|
MOVE.L A3,-(SP)
|
|||
|
MOVE #fItemUserTextLine,-(SP) ; show the static string "Name".
|
|||
|
_ShowDItem
|
|||
|
|
|||
|
MOVE.L A3,-(SP)
|
|||
|
MOVE #fItemUNameEdit,-(SP) ; show the edit field for user name.
|
|||
|
_ShowDItem
|
|||
|
|
|||
|
MOVE.L A3,-(SP)
|
|||
|
MOVE #fItemPTextLine,-(SP) ; show the static string "Password".
|
|||
|
_ShowDItem
|
|||
|
|
|||
|
MOVE.L A3,-(SP)
|
|||
|
MOVE #fItemPEdit,-(SP) ; show edit field for password.
|
|||
|
_ShowDItem
|
|||
|
|
|||
|
MOVE.L A3,-(SP)
|
|||
|
MOVE #fItemPEdit,-(SP) ; Highlite user name.
|
|||
|
CLR -(SP)
|
|||
|
MOVE #1000,-(SP)
|
|||
|
_SelIText
|
|||
|
|
|||
|
MOVEM.L (SP)+,A0-A2/D0-D3 ; restore registers
|
|||
|
RTS
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: SelText
|
|||
|
;
|
|||
|
; Select the entire dialog text edit record.
|
|||
|
;
|
|||
|
; Entry: A3 -> Dialog Ptr
|
|||
|
; A6 -> local storage for item information
|
|||
|
; D0 = edit text item number
|
|||
|
;
|
|||
|
SelText
|
|||
|
MOVEM.L D0-D3/A0-A2,-(SP) ; save registers
|
|||
|
MOVE D0,D3 ; save item number in D2
|
|||
|
MOVE.L A3,-(SP) ; dialog ptr
|
|||
|
MOVE D3,-(SP) ; item number (user name edit rect)
|
|||
|
PEA pswType(A6) ; type storage
|
|||
|
PEA pswIHandle(A6) ; item handle storage
|
|||
|
PEA pswBox(A6) ; rect storage
|
|||
|
_GetDItem
|
|||
|
MOVE.L A3,-(SP) ; dialog ptr
|
|||
|
MOVE D3,-(SP) ; item number
|
|||
|
CLR -(SP) ; sel start = 0
|
|||
|
MOVE #1000,-(SP) ; some large number for sel end
|
|||
|
_SelIText
|
|||
|
MOVEM.L (SP)+,D0-D3/A0-A2 ; restore registers
|
|||
|
RTS
|
|||
|
|
|||
|
;_________________________________________________________
|
|||
|
;
|
|||
|
; Routine : SetArrowCurs
|
|||
|
;
|
|||
|
; Set the cursor back to an arrow. We are doing this in a subroutine
|
|||
|
; just to ensure that all our registers don't get munged.
|
|||
|
;
|
|||
|
; Called by : PromptUser
|
|||
|
;
|
|||
|
SetArrowCurs
|
|||
|
MOVEM.L A0-A2/D0-D3,-(SP) ; save registers
|
|||
|
_InitCursor
|
|||
|
MOVEM.L (SP)+,A0-A2/D0-D3 ; save registers
|
|||
|
RTS
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: SetCtlItem
|
|||
|
;
|
|||
|
; Set the value of the requested control. This can be used to either
|
|||
|
; dim an item or just to turn an item on or off.
|
|||
|
;
|
|||
|
; Entry: D0 = item number
|
|||
|
; D1 = value
|
|||
|
; A3 -> dialog
|
|||
|
; A6 -> local storage for item information
|
|||
|
; Exit: locals modified
|
|||
|
;
|
|||
|
; Called by : PromptUser, ClearMethButtons
|
|||
|
;
|
|||
|
SetCtlItem
|
|||
|
MOVEM.L A0-A1/D0-D3,-(SP) ; save registers
|
|||
|
MOVE D1,D3 ; save value in D3
|
|||
|
MOVE.L A3,-(SP) ; dialog ptr
|
|||
|
MOVE D0,-(SP) ; item number
|
|||
|
PEA pswType(A6) ; type storage
|
|||
|
PEA pswIHandle(A6) ; item handle storage
|
|||
|
PEA pswBox(A6) ; rect storage
|
|||
|
_GetDItem
|
|||
|
MOVE.L pswIHandle(A6),-(SP) ; push handle to control
|
|||
|
MOVE D3,-(SP) ; value to set
|
|||
|
_SetCtlValue
|
|||
|
MOVEM.L (SP)+,A0-A1/D0-D3 ; restore registers
|
|||
|
RTS
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: SetDIText
|
|||
|
;
|
|||
|
; Entry: A3 -> dialog record
|
|||
|
; A2 -> text string to enter
|
|||
|
; D0 = item number
|
|||
|
; A6 -> local storage for item information
|
|||
|
;
|
|||
|
; All registers preserved.
|
|||
|
;
|
|||
|
; Called by : PromptUser, PutPswdInDlog, SetPswdType
|
|||
|
;
|
|||
|
SetDIText
|
|||
|
MOVEM.L A0-A2/D0-D3,-(SP) ; save registers
|
|||
|
MOVE.L A3,-(SP) ; dialog ptr
|
|||
|
MOVE D0,-(SP) ; item number
|
|||
|
PEA pswType(A6) ; type storage
|
|||
|
PEA pswIHandle(A6) ; item handle storage
|
|||
|
PEA pswBox(A6) ; rect storage
|
|||
|
_GetDItem
|
|||
|
MOVE.L pswIHandle(A6),-(SP) ; push item handle
|
|||
|
MOVE.L A2,-(SP) ; string ptr
|
|||
|
_SetIText
|
|||
|
MOVEM.L (SP)+,A0-A2/D0-D3 ; save registers
|
|||
|
RTS
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: SetPswdType
|
|||
|
;
|
|||
|
; Set the dialog stat text item to the appropriate password UAM.
|
|||
|
;
|
|||
|
; Entry: A3 -> dialog
|
|||
|
; D1 = which UAM to set string to
|
|||
|
; A6 -> local storage for item information
|
|||
|
;
|
|||
|
; All registers preserved.
|
|||
|
;
|
|||
|
; Called by : PromptUser
|
|||
|
;
|
|||
|
SetPswdType
|
|||
|
MOVEM.L A0-A2/D0-D3,-(SP) ; save registers
|
|||
|
SUBQ #4,SP ; space for result
|
|||
|
NEG D1 ; make D1 negative so the next add does the right thing {RH}
|
|||
|
ADD #pswdStrStart,D1 ; compute rsrc ID of string {RH}
|
|||
|
MOVE D1,-(SP) ; ID of password type string
|
|||
|
_GetString
|
|||
|
MOVE.L (SP),A0 ; get handle
|
|||
|
TST.L (SP)+ ; is it valid?
|
|||
|
BEQ.S @10 ; if not then branch
|
|||
|
_HLock ; lock the string down
|
|||
|
MOVE.L (A0),A2 ; A2 -> text string
|
|||
|
MOVE #fItemPwdType,D0 ; item number
|
|||
|
BSR.S SetDIText ; set the dialog text
|
|||
|
_HUnlock ; unlock the string
|
|||
|
@10 MOVEM.L (SP)+,A0-A2/D0-D3 ; save registers
|
|||
|
RTS
|
|||
|
|
|||
|
;_________________________________________________________
|
|||
|
;
|
|||
|
; Routine : StrCopy
|
|||
|
;
|
|||
|
; Copy a string. We have to special case for NIL source strings.
|
|||
|
;
|
|||
|
; Entry: A0 -> source string (incl length byte)
|
|||
|
; A1 -> dest buffer
|
|||
|
; Exit: A1 -> past buffer where string was copied
|
|||
|
;
|
|||
|
StrCopy
|
|||
|
MOVEM.L A0/A2-A3/D0-D1,-(SP) ; save registers
|
|||
|
MOVE.L A0,D0 ; is the string NIL?
|
|||
|
BNE.S @10 ; if not then branch
|
|||
|
MOVE.B #0,(A1)+ ; stuff a null pathname
|
|||
|
BRA.S @30 ; and jump to completion
|
|||
|
@10 CLR.L D0 ; clear out D0 longword
|
|||
|
MOVE.B (A0),D0 ; length of string in D0
|
|||
|
ADDQ #1,D0 ; includes the length byte too
|
|||
|
MOVE.L A1,A3 ; save A1
|
|||
|
ADD D0,A3 ; A3 -> after dest string
|
|||
|
_BlockMove ; copy string to buffer
|
|||
|
EXG A3,A1 ; on exit: A1 -> past copied string; A3 -> start of string
|
|||
|
@30 MOVEM.L (SP)+,A0/A2-A3/D0-D1 ; restore registers
|
|||
|
RTS ; go home
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Routine: TESelCopy
|
|||
|
;
|
|||
|
; Set the selection range of the actual password character TE record the same
|
|||
|
; as the masked dialog TE password character record. This routine does not
|
|||
|
; copy the data, only the selection range.
|
|||
|
;
|
|||
|
; Entry: A1 = real Char TE handle
|
|||
|
; A3 -> dialog record
|
|||
|
; A4 -> globals
|
|||
|
;
|
|||
|
; Called by PSWFilter
|
|||
|
;
|
|||
|
TESelCopy
|
|||
|
MOVEM.L D0-D3/A0-A2,-(SP) ; save registers
|
|||
|
MOVE.L teHandle(A3),A2 ; A2 = handle to dialog text edit record
|
|||
|
MOVE.L (A2),A2 ; A2 -> text edit record
|
|||
|
MOVE teSelStart(A2),D0 ; get selection start
|
|||
|
EXT.L D0
|
|||
|
MOVE.L D0,-(SP) ; push selection start pt of masked TERecord
|
|||
|
MOVE teSelEnd(A2),D0 ; get selection end pt of masked TERecord
|
|||
|
EXT.L D0
|
|||
|
MOVE.L D0,-(SP) ; push selection end pt of masked TERecord
|
|||
|
MOVE.L A1,-(SP) ; push handle to real password chars
|
|||
|
_TESetSelect ; set the selection range of the real pswd chars
|
|||
|
MOVEM.L (SP)+,D0-D3/A0-A2 ; save registers
|
|||
|
RTS
|
|||
|
|
|||
|
;___________________________________________________________________________
|
|||
|
;
|
|||
|
; Our Globals and other constants
|
|||
|
;
|
|||
|
|
|||
|
IF NOT (forROM or TheFuture) THEN ; can<61>t use data inside code in ROM <22>
|
|||
|
pGlobals DCB.B pGlobSize,0 ; our block of globals
|
|||
|
|
|||
|
IKeyScriptDone ds.w 1
|
|||
|
|
|||
|
ENDIF
|
|||
|
|
|||
|
ALIGN 2
|
|||
|
|
|||
|
OffScrRect DC.W $1000,$1000,$1100,$1100 ; rect or the offscreen password box
|
|||
|
IconRect DC.W $0005,$0005,$0025,$0025 ; rect in the psw dialog box for icon
|
|||
|
|
|||
|
STRING PASCAL
|
|||
|
ThreeDotStr
|
|||
|
DC.B '...' ; three dot string *** NOT INTERNATIONAL FRIENDLY
|
|||
|
ALIGN 2
|
|||
|
|
|||
|
END
|