As I was the one to ask for this section, let me start it off.
I am certainly not the best coder by any means and I do not beleive that there is only one way to do things, this is just my take on it.
Here is a quick and simple password keeper. It does not have a lot of security except the password to get into the program. The password is inbedded in the program so once compiled will be very difficult to workout.
In this example the Password is "Amiga".
Code: Select all
@VERSION 6,0
@REQUIRE "MUIRoyale"
@APPTITLE "Keeper"
@APPVERSION "$VER: 1.0.0 (01.03.15)"
@APPCOPYRIGHT "©2015, George Leo den Hollander"
@APPAUTHOR "Leo den Hollander"
@APPDESCRIPTION "Login and Password Storage Program"
@DISPLAY {Hidden = True}
mui.CreateGui([[
<?xml version="1.0" encoding="iso-8859-1"?>
<application base="KEPR">
<window title="Keeper - Login and Password Storage Program" id="window" width="500" open="false" notify="closerequest" >
<vgroup background="pre_ShadowFill">
<vgroup>
<colgroup columns="1" frame="group">
<listview Id="Found">
<column Title="Application">
</column>
<column Title="UserName">
</column>
<column Title="Password">
</column>
</listview>
</colgroup>
<colgroup columns="4" frame="group">
<button id="Add" weight="25" notify="pressed">ADD</button>
<button id="Edit" weight="25" notify="pressed">EDIT</button>
<button id="Remove" weight="25" notify="pressed">DELETE</button>
<button id="Quit" weight="25" notify="pressed">QUIT</button>
</colgroup>
</vgroup>
</vgroup>
</window>
<window title="Add New Application" width="500" muiid="NewA" id="wi_NewA" notify="closerequest" open="false">
<vgroup>
<colgroup columns="1" frame="group">
<hgroup>
<vgroup>
<label> Application </label>
<label> Login </label>
<label> Password </label>
</vgroup>
<vgroup>
<string id="NewApp" Contents=""/>
<string id="NewLog" Contents=""/>
<string id="NewPass" Contents=""/>
</vgroup>
</hgroup>
<hgroup>
<button id="NewSave" notify="Pressed"> _Save </button>
<rectangle/>
<button id="NewCancel" notify="Pressed"> _Cancel </button>
</hgroup>
</colgroup>
</vgroup>
</window>
<window title="Edit New Application" width="500" muiid="EdtA" id="wi_EdtA" notify="closerequest" open="false">
<vgroup>
<colgroup columns="1" frame="group">
<hgroup>
<vgroup>
<label> Application </label>
<label> Login </label>
<label> Password </label>
</vgroup>
<vgroup>
<string id="EdApp" Contents=""/>
<string id="EdLog" Contents=""/>
<string id="EdPass" Contents=""/>
</vgroup>
</hgroup>
<hgroup>
<button id="EditSave" notify="Pressed"> _Save </button>
<rectangle/>
<button id="EditCancel" notify="Pressed"> _Cancel </button>
</hgroup>
</colgroup>
</vgroup>
</window>
</application>
]])
Function RemoveDetails() ; **********************************************************************************
Pick = mui.get("Found","Active")
Applic$ = mui.DoMethod("Found","GetEntry",Pick)
Result = systemrequest(" DELETE DETAILS ! ","You are about to DELETE "..Applic$,"CONTINUE|CANCEL",#REQICON_WARNING)
Switch Result
Case 1
Pick = mui.get("Found","Active")
mui.DoMethod("Found","Remove",Pick)
WriteNewFile()
EndSwitch
EndFunction
Function AddDetails() ; *************************************************************************************
mui.Set("wi_NewA", "open", true)
EndFunction
Function EditDetails() ; ************************************************************************************
mui.Set("wi_EdtA", "open", true)
Pick = mui.get("Found","Active")
LA$,LL$,LP$ = mui.DoMethod("Found","GetEntry",Pick)
mui.set("EdApp","contents",LA$)
mui.set("EdLog","contents",LL$)
mui.set("EdPass","contents",LP$)
EndFunction
Function WriteNewFile() ; ***********************************************************************************
DeleteFile(Dir$.."/keeper.dat")
NOE = mui.get("Found","Entries")
OpenFile(1,Dir$.."/keeper.dat",#MODE_WRITE)
For C = 0 to NOE -1
LA$,LL$,LP$ = mui.DoMethod("Found","GetEntry",c)
BLA$ = Base64Str(LA$,False)
BLL$ = Base64Str(LL$,False)
BLP$ = Base64Str(LP$,False)
WriteLine(1,BLA$)
WriteLine(1,BLL$)
WriteLine(1,BLP$)
Next
CloseFile(1)
EndFunction
Function p_EventFunc(msg) ; EVENT HANDLER ===================================================================
Switch msg.action
Case "MUIRoyale"
Switch msg.attribute
Case "CloseRequest"
Switch msg.id
case "wi_NewA"
mui.Set("wi_NewA","open",False)
case "window"
End
EndSwitch
Case "Pressed":
p_MUIEvent(msg.id)
EndSwitch
Case "HideWindow"
mui.Set("app", "iconified", True)
Case "ShowWindow"
mui.Set("app", "iconified", False)
EndSwitch
EndFunction
Function p_MUIEvent(id) ; MUI EVENTS ========================================================================
Switch id
Case "Add"
AddDetails()
Case "Edit"
EditDetails()
Case "Remove"
RemoveDetails()
Case "NewSave"
NA$ = mui.get("NewApp","Contents")
NL$ = mui.get("NewLog","Contents")
NP$ = mui.get("NewPass","Contents")
mui.DoMethod("Found","Insert","Bottom",NA$,NL$,NP$)
mui.Set("wi_NewA","open",False)
WriteNewFile()
Case "NewCancel"
mui.Set("wi_NewA","open",False)
Case "EditSave"
NA$ = mui.get("EdApp","Contents")
NL$ = mui.get("EdLog","Contents")
NP$ = mui.get("EdPass","Contents")
mui.DoMethod("Found","Rename","Active",NA$,NL$,NP$)
mui.Set("wi_EdtA","open",False)
WriteNewFile()
Case "EditCancel"
mui.Set("wi_EdtA","open",False)
Case "Quit"
End
EndSwitch
EndFunction
; listen to these events!
InstallEventHandler({MUIRoyale = p_EventFunc, HideWindow = p_EventFunc, ShowWindow = p_EventFunc})
Dir$= getcurrentdirectory()
PWC$ = MD5str("Amiga")
Password$,OK = StringRequest(" KEEPER ","Enter Keeper Password.","",#All,8,True)
if Password$ <> ""
PWE$ = MD5str(Password$)
if PWE$ = PWC$
openfile(1,Dir$.."/keeper.dat")
while EOF(1) = False
LA$ = readline(1)
LL$ = readline(1)
LP$ = readline(1)
BLA$ = Base64Str(LA$,true)
BLL$ = Base64Str(LL$,true)
BLP$ = Base64Str(LP$,true)
mui.DoMethod("Found", "Insert", "Bottom",BLA$,BLL$,BLP$)
wend
closefile(1)
mui.Set("window","Open",True)
Else
End
endif
else
End
endif
; main loop!
Repeat
WaitEvent
Forever
Hope it is useful to someone and I hope this section becomes full of short example code to compliment the documentation and help people learn more Hollywood coding techniques.
If you think that you have made some improvements ( or fix a bug ) to this code please post them so other can benefit as well.
Enjoy, Leo
PS. more to come.