Please enable JavaScript to view this site.

A-Shell Development History

952.4.1   ATE

Eliminate disconnect warning message box if disconnect occurs within 15 seconds of a keyboard operation. The warning was only meant for cases where a host-initiated disconnect occurs when the user is not attending to the session. Also, fix a problem in which the ATE window would appear to go dead after disconnecting.

952.4.2   Printing

(Windows) The printer init option DEVICE=DISK:{directory} now supports environment variables using the standard %ENVVAR% syntax. For example:

DEVICE=DISK:%ATECACHEDIR%

This would copy the print file to the ATE Cache directory rather than print it.

952.4.3   ATE

A new TAB(-10,x) command allows the host to adjust two attributes of a subsequent auxiliary port print operation:

PRINT TAB(-10,54);File$,Ptr$;chr(127);

Where File$ is an optional filename to use for the print operation on the client side. This is handled automatically by the AUXLOC: driver so is only of use when you are going to use TAB(-1,82) directly to output text to the aux port (rather than indirectly via spooling to the AUXLOC: driver).

Ptr$ is an optional printer name, which temporarily overrides the printer choice in the ATE connection properties. This allows the application to have some control over the way ATE prints, which is sometimes useful since otherwise the ATE user must manually change the printer choice in synchronicity with the needs of the application.

One example of this would be if the app wanted to export a report to PDF, and it "knew" that all ATE clients had a PDF printer whose name started with "PDF":

PRINT TAB(-10,54)",PDF";chr(127);

XCALL SPOOL,FILE$,"AUXLOC"

 

Assuming that there is a printer init file on the server called "AUXLOC" that contained DEVICE=AUXLOC:, this would transfer the file to the PC, and send it to the "PDF" printer regardless of (and without changing) the current printer setting for the ATE connection. We don't need to specify the filename above in the TAB(-10,54) statement because the AUXLOC: driver handles that automatically (but we do need the comma so that PDF is properly recognized as the Ptr$ parameter).

Another example would be to use the DISK: pseudo-printer to simulate an FTP transfer:

PRINT TAB(-10,54);",DISK:%ATECACHEDIR%";chr(127);

XCALL SPOOL,FILE$,"AUXLOC"

 

This would transfer FILE$ from the server to the ATE client %ATECACHEDIR% directory, which might be handy if FTP was not available on the server.

NOTE that this technique currently only works for ASCII files, but binary support may be on the way.

952.4.4   ATE

SHIFT-DEL and SHIFT-INS are now distinguishable from DEL and INS and thus can be programmed accordingly with FIXTRN.

952.3.1  MSGBOX.SBR

The text version of MSGBOX.SBR now supports the SBRMSG.xxx language entries for the button labels. (The external MSGBOX.SBX previously supported these, but when we folded it back into an internal routine they were temporarily lost.)

952.3.2   INFLD

INFLD no longer displays forms background characters (TYPE f) unless the field contains data characters up to that point. This eliminates the strange appearance of a blank field with, for example, just dashes for social security field format.

952.3.3   ATE

When printing to the ATE client using DEVICE=AUXLOC:, the filename is passed from the server to ATE so that ATE can use the real filename rather than a randomly generated one. (This probably only matters when using a pseudo-driver that generates an output file based on the name of the printed file, such as PDF995.)

952.3.4   ATE

Fix a problem in which ATE would get stuck in a kbd lock after a PolyShell swap. (Note that PolyShell only works with non-GUI screens.)

952.1.1  ATE

Close loophole in which Settings|Reset cleared the disconnect/terminate password. Also, fix missing default title on the disconnect dialog.

952.1.2  ATE

Fix spurious character sent to host on ^C abort from GUI INFLD.

952.1.3  ATE

Clicking on an INFLD field now triggers the click string immediately (on the down-click instead of waiting for the up-click.)

952.1.4  ATE

File|Save now saves AutoMouse setting.

952.1.5  MIAMEX GETENV

Improvements/cleanup in the MIAMEX_31 function:

Previously it was not recognizing the environment variable MIAME unless it had been explicitly defined at the OS level outside of A-Shell. Now it is always recognized (as pointing to the directory where the ini file is).
Use of the % delimiters is now optional, i.e. "MIAME" and "%MIAME%" (as well as "miame" and "%miame%" are all equivalent.
Under Windows previously, if the variable was not defined, the return parameter may not have been updated or may have contained a message such as "retrieve environment variable", which could have caused some confusion in the application. Now it always returns a null result string if the environment variable is not defined.

952.1.6  ISAM-A

Updated to version 6.11i to fix a loophole which allowed a memory access fault to occur when traversing a badly corrupted index. Under Windows, this could have caused the A-Shell process to just disappear. Under UNIX, it would have caused a segmentation fault.

952.0.1   XTREE

Implement radio buttons. These are exactly like checkboxes except that when you select one of them (with the mouse or spacebar), the others on that row are automatically cleared. Use column type code R (instead of T) for an editable radio button, or r (instead of t) for a display-only radio button. As with checkboxes, you can also use the X code to cause an immediate exit for validation when changing a radio button. An example of where you might want to use this is in a survey form with multiple choice questions. The questions could occupy one column, with each of the multiple choice options (A,B,C,D,E) consisting of a separate column with a radio button in it.

Note that the logic that forces only one radio button in a row to be set only takes place in response to user changes; it does not happen when loading data into the XTREE from the application. In the example above, you might want to start with none of the buttons set.

952.0.2   XTREE

Improve the user interface and validation logic for editable checkboxes and radio buttons. Previously, when the focus was on a checkbox, a new checkbox was created which was slightly out of alignment with the original one. Now, the cell is highlighted by emphasizing its border, but the checkbox itself does not change.

When the validation option (X) is set, previously the control would exit every time a checkbox lost focus. This was not only confusing but interfered with the updating of the checkbox which was clicked on, in some cases making it difficult to change the state of the checkbox. Now, checkbox validation occurs only when the value of the checkbox changes, and this always happens while a particular checkbox maintains the focus, so this eliminates the confusion of validating the checkbox that previously had the focus rather than the new one you just clicked on.

Also, you can now use the TAB key to tab from the first (non-editable) cell to the first editable cell, provided that XTF_TAB is not set. Previously you had to use the right arrow, which was inconsistent since you couldn't use that key to advance beyond an editable text cell.

952.0.3   ATS

The A-Shell/Windows Telnet Service (ATS) now sends keep alive probes to the client every 15 seconds, so that if the client disconnects surreptitiously, the server side of the connection will realize it and terminate the process.

952.0.4   ATSD

ATSD.EXE 1.2.4 now checks the job table when a process is disconnected, to make sure that it cleaned up after itself, and if not, it takes out the cyber mop to tidy up. (This, combined with the keep alive, should eliminate nearly all of the cases where processes or job table entries were hanging around long past their welcome.)

952.0.5   ATE

ATE is now somewhat better about detecting dropped connections from its side, and reports them rather than just closing the window—sometimes leaving you wondering what happened to the connection.

952.0.6   Windows/ATE

A new TAB command allows the application to establish a disconnect/terminate password, which the user must enter in order to disconnect (from ATE) or terminate (from a local A-Shell/Windows session). When established, this supersedes the big dialog/warning message that otherwise appears when you click on the "X". And perhaps more importantly, it also gets triggered when the "Disconnect" menu option is clicked, which previously exited without any fanfare whatsoever. Syntax is any of the following:

PRINT TAB(-10,53);PW$;chr(127);

 

PRINT TAB(-10,53);PW$;"~";MSG$;chr(127);

 

PRINT TAB(-10,53);PW$;"~";MSG$;"~";TITLE$;chr(127);

 

PW$ (string, up to 15 bytes)

If null, the password feature is disabled and disconnect behavior reverts to the way it was before.

MSG$ (string, up to 248 bytes,)

can be used to replace the standard message which otherwise appears on the password dialog:

This is a potentially unsafe way to terminate or disconnect. Please use the normal procedure to log out of the application, or enter the disconnect password below:

The MSG$ may include a CRLF to force a line break; otherwise it is wrapped to fit the space. Since the space is designed for about 200 lower case characters, if you have a lot less, you might want to use a leading CRLF just to vertically center it.

TITLE$ is a string which replaces the default title ("ATE Disconnect" or "Terminate A-Shell Session?") of the dialog box that prompts for the password. If specified, then the combined total length of MSG$ and TITLE$ is limited to 248 characters.

Suggestions and Notes

If you want to enable this feature all the time, then just add the TAB command to your main menu or startup command file.
Since you can set the password any way you like, some people use a formula, perhaps based on the date, or on any information you can obtain programmatically about the environment, job, etc., so that it can be given out as needed without necessarily revealing the formula.
If want to allow the user to disconnect from certain "safe" places (like the main menu), then you can clear the password.
The password is not encrypted, because no matter how secretive we make it, there is no way to stop the user from forcefully disconnecting by such brutal methods as rebooting, pulling the Ethernet cable, powering down, etc. So this is at best a merely a way to discourage sloppiness rather than a way to prevent it entirely.

952.0.7   XTREE

XTREE: XTR'SKEY (pre-select item(s) by searching for matching text in the column defined by XTR'COLUMNACTIVE) now works for multi-select as well as single-select XTREE.

952.0.8   XTREE

A new feature which allows the display order of the columns (from left to right) to be different from the "real" order (as defined on COLDEF). Previously, the user could reorder the columns while XTREE was active (provided that the XTF_REORD flag was set), but there was no way for the application to remember the reordering, and thus users could not maintain their own preferred column ordering. The new feature returns the order of the columns in a new field in XTRCTL, which is can be saved by the application and used on subsequent calls to XTREE to maintain the user's preferred column ordering.

To support the new field, the XTRCTL structure has been increased in size from 64 to 128 bytes, with the new fields as follows:

...

MAP2 NEXTROW,B,4        ! (preexisting)

MAP2 DELCTLID,B,4       ! (preexisting)

MAP2 USECOLORDER,B,1    ! (new) 1=load/save column order from COLORDER()

MAP2 COLORDER(31),B,1   ! (new) real column # to display in position (x)

MAP2 UNUSED,X,36       ! (new) for expansion

 

XTREE.MAP has been updated as shown above, but if you are using your own mapping, you'll need to update it if you want to use the new features. (There is no harm if you don't update the map, but the new features won't be available.)

USECOLORDER must be set to 1 to activate the new feature.

When USECOLORDER is set, on return from XTREE, the display column order will be stored into the COLORDER() array. COLORDER(1) specifies the "real" column which is now displayed in the first position; COLORDER(2) specifies the "real" column now displayed in the second position, etc.

The array can keep track of the order of up to 31 display columns. If you have more than 31 columns, the user will still be able to maintain their ordering preference for the first 31 display columns; the remaining columns will always be displayed based on the order they appear in COLDEF.

When XTREE is called, COLORDER() contains non-zero values, these will determine the new display order. (Unless you manually change them, the result will be that the new display order matches the order of the previous call to XTREE, which is probably exactly what you want, unless the previous call to XTREE was for a different logical tree but shared the same XTRCTL map, in which case you want to either set USECOLORDER=0 or clear out the COLORDER() array when switching logical tree structures.

The simplest way to use this feature is just to set USECOLORDER=1, in which case the user's column order will be maintained across consecutive calls to XTREE, but not beyond that. If you want to maintain the user's order between application sessions, then you'll need to save the COLORDER() array somewhere and restore it as required.

Note that if you are manually using COLORDER() to set a column order, you don't have to specify all the columns. For example, if there were 10 columns defined, you could determine which of the 10 displayed in the first three positions as follows:

COLORDER(1) = 5     ! real column #5 will be displayed first

COLORDER(2) = 8     ! real column #8 will be displayed second

COLORDER(3) = 2     ! real column #2 will be displayed third

COLORDER(4) = 0     ! remaining columns will retain their natural

                    ! order, i.e. 1,3,4,6,7,9,10

 

(The first zero in the COLORDER() array effectively terminates the forced part of the ordering, with the remaining columns using "natural" ordering.)

Notes

Unless you set the XTF_REORD bit in the FLAGS parameter, the user will not be able to reorder the columns by drag-and-drop, but that wouldn't stop the application from using USECOLORDER and COLORDER() to override the natural (or "real") column ordering.

Changing the display order of the columns does not affect the way columns are numbered in any of the other parameters (such as XTR'COLUMNSORT(), XTR'COLUMNACTIVE, etc.) In other words, the application doesn't need to be "aware" of how the columns are ordered.

952.0.9   Locking

You can now lock users out of A-Shell by creating a file ashell.lok (with a particular structure described below) in the directory where the miame.ini is. The plan is to create an SBX that will create this file for you (as well as force existing users out), but until that happens, you can still use this capability by manually creating the file as follows:

Line 1: <# of seconds to wait before exiting, or 0 for unlimited>

Lines 2-N: <Any text that you want to display>

 

An example will make this more clear:

0

A-Shell is currently locked for maintenance by the Big Kahuna

(starting at 5:30 PM and expected to last until 6 PM).

You can wait here, or hit ESC at any time to exit and try again later.

 

In the above example, the 0 on the first line indicates that A-Shell will wait indefinitely (until the user hits ESC, in which case it exits, or until the ashell.lok file is removed, in which case it proceeds as normal). If the 0 had been, say, 10, then the message would appear for 10 seconds but then A-Shell would exit.

While waiting, the process had not been assigned a job, but it is using the ashell (or ashw32.exe) executable, and has the jobtbl and qflock files open, so if your maintenance requires exclusive access to those files, you may want to set the wait to just a few seconds (just long enough to see the message) so that you'll get an opportunity at exclusive access (even if it takes a few tries). On the other hand, if the maintenance does not require exclusive access to those files, you may want to allow the users to just wait indefinitely in this mode until you signal that it is ok to proceed by removing the ashell.lok file.

Note that the message should indicate the ESC option (unless the wait time is set to just a few seconds), since it isn't otherwise obvious. (This scheme allows for the maximum in site/language customization.)

To force the existing users to exit, you may be able to use KILL.LIT or FORCE.LIT, and SEND.LIT (to send a message), although this will soon be simplified via an SBX. Or, you could modify your application to check for the existence of the ashell.lok file periodically and handle its own graceful shutdown.