mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-25 09:30:50 +00:00
1508 lines
47 KiB
Plaintext
1508 lines
47 KiB
Plaintext
;
|
||
; File: PromptForUser.a
|
||
;
|
||
; Copyright: © 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’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 '•'
|
||
; 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’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… <21>
|
||
;
|
||
SUBQ #2,SP ; room for return char '•' <21>
|
||
JSR GetPasswordBullet ; go get it… <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 '•' 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’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’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
|