; ; File: PromptForUser.a ; ; Copyright: © 1986-1992 by Apple Computer, Inc. All rights reserved. ; ; Change History (most recent first): ; ; 11/3/92 SWC Fixed the change comment in . ; 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 Fix more bugs in PromptForUser ; <18> 1/4/91 EMT 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 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