diff --git a/ACP.e b/ACP.e index 18dc532..7ebc05d 100644 --- a/ACP.e +++ b/ACP.e @@ -46,6 +46,8 @@ ENUM ERR_NONE,ERR_ALREADY_RUNNING,ERR_STARTUP, ERR_VALIDATE,ERR_NO_DISKFONT,ERR_FDS_RANGE +CONST AX_SETUP_TOOL='BBS:Utils/axSetupTool' + CONST LISTENQ=100 CONST EINTR=4 CONST MAX_LINE=255 @@ -297,6 +299,7 @@ DEF nodeIdle[MAX_NODES]:ARRAY OF CHAR DEF startUp=FALSE/*** Set startup scripts to none ***/ DEF zipOn=FALSE/*** Turn ZIPPED window off ***/ DEF notDone=1 +DEF shuttingDown=0 DEF down[MAX_NODES]:ARRAY OF CHAR DEF activeNodes[MAX_NODES]:ARRAY OF CHAR DEF publicName[200]:STRING @@ -329,6 +332,8 @@ DEF dosCheckTime=60 DEF dosCheckTrigger=5 DEF dosBanTime=60 +DEF menuSelect=FALSE + DEF masterPort[100]:STRING DEF cmds[MAX_NODES]:ARRAY OF LONG @@ -1036,10 +1041,8 @@ PROC createCustomMenus(nodes) maddNodes(nodes) maddItem( NM_ITEM, 'Instant Login',0, 0, 0, 0) maddNodes(nodes) - IF shellMode - maddItem( NM_ITEM, 'AEShell',0, 0, 0, 0) - maddNodes(nodes) - ENDIF + maddItem( NM_ITEM, 'Shell',0, 0, 0, 0) + maddNodes(nodes) maddItem( NM_ITEM, 'Toggle Chat',0, 0, 0, 0) maddNodes(nodes) maddItem( NM_ITEM, 'Exit Node',0, 0, 0, 0) @@ -1062,6 +1065,7 @@ PROC createCustomMenus(nodes) maddNodes(nodes) maddItem( NM_ITEM,'Set NRAMS',0,0,0,0) maddNodes(nodes) + maddItem( NM_ITEM,'Config Editor',0,IF FileLength(AX_SETUP_TOOL)>=0 THEN 0 ELSE ITEMENABLED,0,0) maddItem( NM_TITLE, 'Custom Control',0,0,0,0) @@ -1280,12 +1284,10 @@ PROC doControl(node) DisplayBeep(scr) ENDIF CASE SV_AESHELL - IF shellMode - IF(users[node].actionVal=ENV_AWAITCONNECT) - callNode(node,SV_AESHELL) - ELSE - DisplayBeep(scr) - ENDIF + IF(users[node].actionVal=ENV_AWAITCONNECT) + callNode(node,SV_AESHELL) + ELSE + DisplayBeep(scr) ENDIF CASE SV_CHATTOGGLE cd:=users[node].actionVal @@ -1443,10 +1445,14 @@ PROC handleEditGadget(im:PTR TO intuimessage,ig) IF(button) IF(nutton(2)=FALSE) THEN doButton(2,0) ELSE - IF shellMode + IF shellMode OR menuSelect IF(control) THEN control:=0 ELSE control:=SV_AESHELL ELSE - selectAndRunConfig('','','') + IF FileLength(AX_SETUP_TOOL)>=0 + Execute(AX_SETUP_TOOL,0,0) + ELSE + selectAndRunConfig('','','') + ENDIF ENDIF ENDIF CASE GAD_TOGGLECHAT @@ -1586,6 +1592,8 @@ PROC updateNode(name:PTR TO CHAR,location:PTR TO CHAR,action:PTR TO CHAR,baud:PT StrCopy(action2,'Node Inactive ') IF activeNodes[node] THEN activeNodeCount-- activeNodes[node]:=FALSE + down[node]:=TRUE + IF (activeNodeCount=0) AND (shuttingDown) THEN notDone:=0 /*if(ActiveNodeCount==0) notDone=0;*/ CASE ENV_MULTICHAT StrCopy(action2,'MultiNode Chat ') @@ -2026,6 +2034,9 @@ PROC checkMasterSig(signals) ELSEIF(cpymsg.command=SV_ACPALERT) myrequest(cpymsg.user) ReplyMsg(cpymsg) + ELSEIF(cpymsg.command=SV_ACPSHUTDOWN) + attemptShutdown() + ReplyMsg(cpymsg) ELSEIF(cpymsg.command=SV_STARTNODE) StringF(temp,'AmiExpress_Node.\d',cpymsg.node) IF(FindPort(temp))=FALSE @@ -2747,6 +2758,18 @@ PROC readStartUp(s:PTR TO CHAR) dobj,cfg:=getToolTypes(s) IF (dobj=NIL) + acpError:=1 + ELSEIF(FindToolType(dobj.tooltypes,'SYSOP_NAME')=0) OR (FindToolType(dobj.tooltypes,'BBS_NAME')=0) OR + (FindToolType(dobj.tooltypes,'BBS_LOCATION')=0) OR (FindToolType(dobj.tooltypes,'BBS_GEOGRAPHIC')=0) + acpError:=1 + ENDIF + + IF acpError + IF FileLength(AX_SETUP_TOOL)>=0 + Execute(AX_SETUP_TOOL,0,0) + RETURN + ENDIF + acpError:=0 selectAndRunConfig('','s:','aeicon.json') dobj,cfg:=getToolTypes(s) @@ -2757,7 +2780,7 @@ PROC readStartUp(s:PTR TO CHAR) ENDIF ENDIF oldtooltypes:=dobj.tooltypes - + IF(t:=FindToolType(oldtooltypes,'ACPFONT')) StrCopy(fontName,t) ENDIF @@ -3229,7 +3252,8 @@ ENDPROC PROC attemptShutdown() DEF i - + + shuttingDown:=TRUE IF(activeNodeCount=0) notDone:=0 ELSE @@ -3237,7 +3261,7 @@ PROC attemptShutdown() IF(StrLen(startNode[i])>0) IF((users[i].actionVal=ENV_AWAITCONNECT) AND (down[i])=FALSE) control:=SV_NODEOFFHOOK - down[i]:=TRUE + ->down[i]:=TRUE doControl(i) ENDIF ELSE @@ -4155,13 +4179,19 @@ PROC main() HANDLE CASE MENUPICK ->quit menu item IF(menunum(im.code)=0) AND (itemnum(im.code)=5) THEN attemptShutdown() + + IF(menunum(im.code)=1) AND (itemnum(im.code)=14) + IF FileLength(AX_SETUP_TOOL)>=0 THEN Execute(AX_SETUP_TOOL,0,0) + ENDIF IF(menunum(im.code)=1) i:=button button:=0 + menuSelect:=TRUE handleEditGadget(NIL,GAD_SYSOPLOGIN+itemnum(im.code)) handleEditGadget(NIL,GAD_NODES+subnum(im.code)) button:=i + menuSelect:=FALSE ENDIF IF(menunum(im.code)=2) num:=itemnum(im.code) diff --git a/Install Ami-Express b/Install Ami-Express index 8499ac7..673d97c 100644 --- a/Install Ami-Express +++ b/Install Ami-Express @@ -8,19 +8,26 @@ (set @app-name "Ami-Express") (if (exists "BBS:" (noreq)) (set @default-dest "bbs:") - (set @default-dest "Work:") + (set @default-dest "sys:bbs") ) ; + +(if (< (getversion) (* 37 65536)) + (abort (cat + "Ami-Express requires operating system " + "version 2.04 or higher to work." + )) +) + (welcome "Welcome to the Ami-Express installation utility.\nThis will install or upgrade your installation to AmiExpress " #appver) - (set #muiver (/ (getversion "libs:muimaster.library" ) 65536) ) + (set #muiver (/ (getversion "mui:mui" ) 65536) ) (set #owndevunitver (/ (getversion "libs:owndevunit.library" ) 65536) ) (set #fifolibver (/ (getversion "libs:fifo.library" ) 65536) ) (set #amissllibver (/ (getversion "libs:amisslmaster.library" ) 65536) ) - (set #asynclibver (/ (getversion "libs:async.library" ) 65536) ) (if ( <> #muiver 0) @@ -34,8 +41,8 @@ ) (if ( <> #fifolibver 0) - ( set #fifolibmsg "fifo handler: installed\n" ) - ( set #fifolibmsg "fifo handler: not installed\n" ) + ( set #fifolibmsg "fifo library: installed\n" ) + ( set #fifolibmsg "fifo library: not installed\n" ) ) (if ( <> #amissllibver 0) @@ -44,16 +51,16 @@ ) (if ( <> #asynclibver 0) - ( set #ibmcondevmsg "async.library: installed\n" ) - ( set #ibmcondevmsg "async.library: not installed\n" ) + ( set #asynclibmsg "async.library: installed\n" ) + ( set #asynclibmsg "async.library: not installed\n" ) ) ; -( if (exists "sys:wbstartup/acp" (noreq)) - ( set #acpname "sys:wbstartup/acp") +( if (exists "sys:wbstartup/ACP" (noreq)) + ( set #acpname "sys:wbstartup/ACP") ( - ( if (exists "bbs:wbstartup/acp" (noreq)) - ( set #acpname "bbs:wbstartup/acp") + ( if (exists "bbs:wbstartup/ACP" (noreq)) + ( set #acpname "bbs:wbstartup/ACP") ( set #acpname "") ) ) @@ -63,8 +70,6 @@ (exists "BBS:Express" (noreq)) ) -(set expexists 0) - ; (if (= expexists 0) ( @@ -76,7 +81,7 @@ ; (set #default-dest-installergen-temp (askdir - (prompt "Select where you want Ami-Express installed") + (prompt "Select where you want Ami-Express installed (create a folder if you need one)") (help "Select where you want Ami-Express installed.\nNo folder will be created so please ensure that you have created one if needed.") (default @default-dest) ) @@ -89,7 +94,7 @@ (set #acpchoice (askchoice (choices "WBStartup (for auto startup)" "BBS: (for manual startup)" "Select a different location") (prompt "Where would you like to install the ACP program?") - (help #cpu-help) + (help "") (default 0) )) ( if ( = #acpchoice 0) @@ -110,21 +115,20 @@ ) ) -(copylib +(copyfiles + (prompt "Copying Express") + (help @copyfiles-help) (source "AmiExpress/BBS/Express") (dest @default-dest) - (prompt "Copying Express") - (help @copylib-help) - (confirm "expert") + (confirm ) ) - ( complete 30) -(copylib - (source "AmiExpress/Wbstartup/ACP") +(copyfiles + (source "AmiExpress/ACP") (dest #acppath) (prompt "Copying ACP") - (help @copylib-help) + (help @copyfiles-help) (infos) (confirm "expert") @@ -141,8 +145,39 @@ (all) ) +( complete 45) + +(copyfiles + (prompt "Copying aedoor library") + (help @copyfiles-help) + (confirm "expert") + (source "AmiExpress/libs") + (dest "libs:") + (all) +) + ( complete 50) +(copyfiles + (prompt "Copying extras") + (help @copyfiles-help) + (confirm "expert") + (source "AmiExpress/c") + (dest "c:") + (all) +) + +(copyfiles + (prompt "Copying extras") + (help @copyfiles-help) + (confirm "expert") + (source "AmiExpress/l") + (dest "l:") + (all) +) + +( complete 55) + (copyfiles (prompt "Copying storage") (help @copyfiles-help) @@ -154,18 +189,24 @@ ( complete 60) ; -(run (cat "LHA x AmiExpress/defaultbbs.lha " @default-dest) +(copyfiles (prompt "Copying default bbs configuration") - (help ) + (help @copyfiles-help) (confirm "expert") + (source "AmiExpress/defaultbbs") + (dest @default-dest) + (all) ) - ( complete 70) -(run (cat "setenv axsetupeditor_prefs save 11" #acppath) +(run (cat "setenv axsetupeditor_prefs 11" (tackon #acppath "acp")) + (prompt "Saving configuration") + (help ) +) + +(run (cat "copy env:axsetupeditor_prefs envarc:") (prompt "Saving configuration") (help ) - (confirm "expert") ) ( complete 80) @@ -180,7 +221,6 @@ (prompt "Add startup items") (help @startup-help) (command #startup) - (confirm "expert") ) ; @@ -190,21 +230,19 @@ ; (set install-dest bbs:) -; -(set #expressver (getversion "bbs:express" ) ) - - -(set #acpver (getversion #acpname ) ) - -(set #expressverMajor (/ #expressver 65536) ) -(set #expressverMinor (bitand #expressver 65535) ) -(set #expressver ("%ld.%ld" #expressverMajor #expressverMinor) ) +(run (cat "version full >env:tmpver " #acpname)) +(set #acpver (getenv "tmpver") ) +(if (= (substr #acpver 0 4) "ACP ") + (set #acpver (substr #acpver 4 (- (strlen #acpver) 4))) +) -(set #acpMajor (/ #expressver 65536) ) -(set #acpMinor (bitand #expressver 65535) ) -(set #acpver ("%ld.%ld" #expressverMajor #expressverMinor) ) +(run (cat "version full >env:tmpver bbs:express")) +(set #expressver (getenv "tmpver") ) +(if (= (substr #expressver 0 13) "Ami-Express ") + (set #expressver (substr #expressver 13 (- (strlen #expressver) 13))) +) -(message ("An existing installation of Ami-Express was found.\n\nThe currently installed version information is \n\nACP: %s\nExpress: %s\n\nPress proceed if you wish to continue upgrading Ami-Express.\n\nThe configuration of your bbs will not be affected and only the updated\napplication files will be overwritten.\n" #expressver #acpver) +(message ("An existing installation of Ami-Express was found.\n\nThe currently installed version information is \n\nACP: %sExpress: %s\nPress proceed if you wish to continue upgrading Ami-Express.\n\nThe configuration of your bbs will not be affected and only the updated\napplication files will be overwritten.\n" #acpver #expressver) ) ( complete 10) @@ -213,11 +251,11 @@ ; ( complete 20) -(copylib +(copyfiles (source "AmiExpress/BBS/Express") (dest "bbs:") - (prompt "Copying Express") - (help @copylib-help) + (prompt "Upgrading Express") + (help @copyfiles-help) (confirm "expert") ) @@ -232,11 +270,11 @@ ( if (exists (tackon #axprefs "acp") (noreq)) ( - (copylib - (source "AmiExpress/wbstartup/acp") + (copyfiles + (source "AmiExpress/ACP") (dest #axprefs) - (prompt "Copying ACP") - (help @copylib-help) + (prompt "Upgrading ACP") + (help @copyfiles-help) (confirm "expert") ) (set #acpdone 1) @@ -244,15 +282,15 @@ ) ) ) - -( if (and (exists "sys:wbstartup/acp" (noreq)) - (<> #axprefs "sys:wbstartup") ) +(message #axprefs) +( if (and (exists "sys:wbstartup/ACP" (noreq)) + (<> #axprefs "sys:wbstartup/") ) ( - (copylib - (source "AmiExpress/wbstartup/acp") + (copyfiles + (source "AmiExpress/ACP") (dest "sys:wbstartup") - (prompt "Copying ACP") - (help @copylib-help) + (prompt "Upgrading ACP") + (help @copyfiles-help) (confirm "expert") ) (set #acpdone 1) @@ -262,11 +300,11 @@ ( if (and (exists "bbs:acp" (noreq)) (<> #axprefs "bbs:") ) ( - (copylib - (source "AmiExpress/wbstartup/acp") + (copyfiles + (source "AmiExpress/ACP") (dest "bbs:") - (prompt "Copying ACP") - (help @copylib-help) + (prompt "Upgrading ACP") + (help @copyfiles-help) (confirm "expert") ) (set #acpdone 1) @@ -283,11 +321,11 @@ ( if (exists (tackon #acppath "acp" ) (noreq)) ( - (copylib - (source "AmiExpress/wbstartup/acp") + (copyfiles + (source "AmiExpress/ACP") (dest #acppath) - (prompt "Copying ACP") - (help @copylib-help) + (prompt "Upgrading ACP") + (help @copyfiles-help) (confirm "expert") ) ( set #acpdone 1 ) @@ -299,7 +337,7 @@ ( complete 60) (copyfiles - (prompt "Copying utils") + (prompt "Upgrading utils") (help @copyfiles-help) (confirm "expert") (source "AmiExpress/BBS/Utils") @@ -312,6 +350,6 @@ ) ) ; End If -( message "The MUI system is required by the Ami-Express configuration tool\nand is recommended to be installed. In addition there are optional extras that\ncan be used by Ami-Express which should be installed manually if required.\n\n" #muimsg #owndevunitmsg #fifolibmsg #amissllibmsg #ibmcondevmsg #kalacondevmsg "\nThese extras are all freely available for download on the aminet.") +( message "The MUI system is required by the Ami-Express configuration tool and is recommended to be installed. In addition there are optional extras that can be used by Ami-Express which should be installed manually if required.\n\n" #muimsg #owndevunitmsg #fifolibmsg #amissllibmsg #asynclibmsg "\nThese extras are all freely available for download on the aminet.") (exit) \ No newline at end of file diff --git a/axcommon.e b/axcommon.e index f1396c9..da49048 100644 --- a/axcommon.e +++ b/axcommon.e @@ -174,6 +174,7 @@ EXPORT CONST SV_STARTNODE=185 EXPORT CONST SV_INFO=199 EXPORT CONST INCOMING_TELNET=200 EXPORT CONST INCOMING_FTP=201 +EXPORT CONST SV_ACPSHUTDOWN=202 EXPORT CONST GETKEY=500 diff --git a/express.e b/express.e index fec5b05..5b86f95 100644 --- a/express.e +++ b/express.e @@ -22476,12 +22476,10 @@ PROC makeFtpDirCache(confLoc:PTR TO CHAR, confnum, dirnum, dlpath:PTR TO CHAR, s t:=dateStampToDateTime(f_info.datestamp) s:=f_info.size IF (f_info.direntrytype>0) - IF s=0 - StringF(tempstr,'\s\s/',dlpath,f_info.filename) - StringF(tempstr2,'\s\s\s',subdir,IF StrLen(subdir)>0 THEN '_' ELSE '',f_info.filename) - makeFtpDirCache(confLoc,confnum,dirnum,tempstr,tempstr2) - s:=-1 - ENDIF + StringF(tempstr,'\s\s/',dlpath,f_info.filename) + StringF(tempstr2,'\s\s\s',subdir,IF StrLen(subdir)>0 THEN '_' ELSE '',f_info.filename) + makeFtpDirCache(confLoc,confnum,dirnum,tempstr,tempstr2) + s:=-1 ENDIF StringF(tempstr,'\z\h[8] \z\h[8] \s\n',t,s,f_info.filename) WriteF(tempstr) @@ -25501,7 +25499,7 @@ ENDPROC RESULT_SUCCESS PROC internalCommandVER() DEF tempStr[255]:STRING - StringF(tempStr,'\b\nAmiExpress \s (\s) Copyright ©2018-2022 Darren Coles\b\n\b\n',expressVer,expressDate) + StringF(tempStr,'\b\nAmiExpress \s (\s) Copyright ©2018-2023 Darren Coles\b\n\b\n',expressVer,expressDate) aePuts(tempStr) aePuts('Original Version:\b\n') aePuts(' (C)1989-91 Mike Thomas, Synthetic Technologies\b\n') @@ -28554,7 +28552,7 @@ PROC processFtpLogon() ENDIF telnetSend(sendStr,EstrLen(sendStr)) - StringF(sendStr,'230-\b\n230-Running AmiExpress \s Copyright ©2018-2022 Darren Coles\b\n',expressVer) + StringF(sendStr,'230-\b\n230-Running AmiExpress \s Copyright ©2018-2023 Darren Coles\b\n',expressVer) telnetSend(sendStr,EstrLen(sendStr)) StringF(sendStr,'230-Registration \s. You are connected to Node \d\b\n',regKey,node) telnetSend(sendStr,EstrLen(sendStr)) @@ -29284,7 +29282,7 @@ PROC processLogon() ENDIF aePuts(tempStr) - StringF(tempStr,'\b\n\b\nRunning AmiExpress \s Copyright ©2018-2022 Darren Coles\b\n',expressVer) + StringF(tempStr,'\b\n\b\nRunning AmiExpress \s Copyright ©2018-2023 Darren Coles\b\n',expressVer) aePuts(tempStr) StringF(tempStr,'Registration \s. You are connected to Node \d at \d baud',regKey,node,onlineBaud) aePuts(tempStr) @@ -29684,7 +29682,7 @@ PROC processAwait() send017() sendCLS() - StringF(tempstr,'\b\n ©2018-2022 AmiExpress by Darren Coles\b\n\b\n') + StringF(tempstr,'\b\n ©2018-2023 AmiExpress by Darren Coles\b\n\b\n') aePuts(tempstr) StringF(tempstr,'  Original Version:\b\n\b\n') diff --git a/stringlist.e b/stringlist.e index 1dcafb1..e2005f9 100644 --- a/stringlist.e +++ b/stringlist.e @@ -11,7 +11,7 @@ EXPORT OBJECT stringlist PRIVATE initialMax:LONG ENDOBJECT -EXPORT PROC end() OF stringlist -> destructor +EXPORT PROC end() OF stringlist -> destructor self.clear() DisposeLink(self.items) ENDPROC @@ -66,6 +66,12 @@ EXPORT PROC insert(pos,stringVal:PTR TO CHAR) OF stringlist self.items[pos]:=s ENDPROC +EXPORT PROC contains(stringVal:PTR TO CHAR) OF stringlist + DEF i + FOR i:=0 TO ListLen(self.items)-1 + IF StriCmp(self.items[i],stringVal) THEN RETURN TRUE + ENDFOR +ENDPROC FALSE EXPORT PROC add(stringVal:PTR TO CHAR) OF stringlist DEF s,c @@ -110,6 +116,37 @@ EXPORT PROC count() OF stringlist IS ListLen(self.items) EXPORT PROC maxSize() OF stringlist IS ListMax(self.items) +PROC partition(first, last) OF stringlist + DEF splitv, up, down, i + splitv:=self.items[first] + up:=first + down:=last + REPEAT + WHILE (StrCompare(self.items[up],splitv)<=0) AND (up0) AND (down>first) DO down-- + IF up=down + i:=self.items[first] + self.items[first]:=self.items[down] + self.items[down]:=i +ENDPROC down + +PROC quicksort(first, last) OF stringlist + DEF index + IF first destructor +EXPORT PROC end() OF stdlist -> destructor DisposeLink(self.items) ENDPROC diff --git a/tooltypes.e b/tooltypes.e index 1ca7aeb..7de6f6f 100644 --- a/tooltypes.e +++ b/tooltypes.e @@ -223,6 +223,7 @@ ENDPROC result EXPORT PROC getOrCreateCacheItem(fileName:PTR TO CHAR) DEF i,cnt,found=FALSE DEF cacheObj: PTR TO diskObjectCacheItem + DEF oldCacheObj: PTR TO diskObjectCacheItem DEF do=NIL:PTR TO diskobject DEF fn2[255]:STRING DEF ownToolTypes @@ -319,9 +320,9 @@ EXPORT PROC getOrCreateCacheItem(fileName:PTR TO CHAR) IF diskObjectCache.count()<(diskObjectCache.maxSize()-1) diskObjectCache.add(cacheObj) ELSE - cacheObj:=diskObjectCache.item(0) - DisposeLink(cacheObj.fileName) - FreeDiskObject(cacheObj.diskObject) + oldCacheObj:=diskObjectCache.item(0) + DisposeLink(oldCacheObj.fileName) + FreeDiskObject(oldCacheObj.diskObject) diskObjectCache.remove(0) diskObjectCache.add(cacheObj) ENDIF