HISTORY.TXT (for DosLynx v0.30b, December 2005) by Fred C. Macall Introduction This is for my ninth release of DosLynx. This is a special release, not only because it is the first of what I hope will be a fruitful series of v0.3x releases. But, of course, also because this is the first release of a DosLynx Protected Mode version. In this document, I'll try to take up where I left off in the last history.txt and not rehash the history of the previous versions. However, there is a cumulative list of unresolved bugs, issues, and To Do(s) at the end. If you want to know everything else there is to know about my previous releases of DosLynx, you can now get that history from: http://users.ohiohills.com/fmacall/dlx2xdoc.zip . This archive collects the info.htm and history.txt documents for all of my DosLynx v0.2xb releases. Although I haven't got it connected to my home network, yet, I again have a '386 based PC for testing. It is a big Zenith box, from 1990, that I call Willy. It is a cached 5 Bogo MIPS system with 4 MB of RAM, a 200 MB disk, and a Numeric Processor. So, it is well qualified for running Windows v3.x and, perhaps, Windows 95. This has proven to be a very comfortable minimum system target for the DosLynx Protected Mode version. What would make a more rigorous target, of course, would be a '286 based system with 4 MB of RAM. I am still looking for one of these. Old Business Well, the work done to activate the Command Status Indicators, in the last release, hasn't been entirely trouble free. That can be pretty obvious when a Command Status Indicator like Prior sits there with the wrong indication, at times. But, most bothersome was the arrangement made in TURLView::draw( ), in TURLVIE6.CPP, for issuing a cmUpComs command upon finding a change in its TURLView::TAp_selected's value. The processing time added to 'draw( ), when it did issue a cmUpComs command, seemed to aggravate Turbo Vision's flakiness in interpreting the keyboard, on systems with a slower processor. In the interests of keeping TURLView::draw( )'s processing time from getting much longer than it had been, I've revised it to only set a global indicator, itapschd, when it finds 'TAp_selected changed. itapschd is defined in GLOBALS.H and instanciated in GLOBALS.CPP. TDosLynx::idle( ), in TDOSLYNX6.CPP, now checks itapschd and issues a cmUpComs command upon finding it set. This way, the time for processing that command doesn't get expended unless or until the system is free enough to be running in its idle loop. A small complication is that TURLWindow::URLoader( ), in TURLWIND.CPP, needs to clear itapschd in order to keep a possibly pending cmUpComs command from getting issued while loading a document. Of course, I have also added some more setComs(1) calls to TURLWindow::handleEvent( ), in TURLWIN4.CPP. These plug loopholes I've found in the Command Status Indicators' updating. However, I still haven't found a good solution for the unresolved issue with the Command Status Indicators, acknowledged in the last history.txt. I am still not sure where TURLWindow::handleEvent( )'s 'clearEvent( ) calls should go. I first acknowledged this under the heading: Hangs Deep Into DosLynx Sessions, in the history.txt for DosLynx v0.28b. However, the change reported there, for case cmLoadChild's 'clearEvent( ) call, has seemed to have only helped. So, I decided to move all the rest of the early 'clearEvent( ) calls to the ends of their containing cases. I checked the 'clearEvent( ) calls in all of the DosLynx 'handleEvent( ) functions. But, found them needing this movement only in TURLWindow::handleEvent( ). I've moved several 'clearEvent( ) calls, there, and added a few more where logic branching leads to one or more break(s). I haven't seen any sign of this hurting anything. The Navigate|Go To (Alt-G) menu entry or command, also added in the last release, seems to be working well. However, I noticed that the new dialog's initial cursor position was a little less than completely satisfactory, from the user's standpoint. That dialog's cursor should start at the end of the list, shouldn't it? To make it do that, I've added a TLBHp->setFocus(nrurls - 1) call to TURLWindow::navGo( ), in TURLWI14.CPP. Additional User Interface Touches Even after having worked on HTHnSGut( ), in HTFWRITE.CPP, for many of my previous releases, the local file name suggestion it offered still wasn't right in some cases. This problem came from URLs with names containing multiple periods. In those cases, the suggested name often wound up with the wrong suffix. I've added another small loop to HTHnSGut( ) to fix that. It works through the suggested name and replaces all period(s), other than the last one, with under bars. I've occasionally had trouble understanding the error message(s) delivered after trying to access a URL with a service type or protocol name that DosLynx doesn't recognize. For example: https: , which DosLynx still doesn't handle. The message(s) seemed to say that the URL wasn't available, i.e.: didn't exist, when I sometimes knew that not to be the case. I decided to add a new message making the trouble clear, when DosLynx can't handle the service type given. A URL's service type gets recognized in get_physical( ), in HTACCESS.C. It returns the value: HT_NO_ACCESS when it can't recognize the service type. get_physical( ) gets called from HTLoad( ), also in HTACCESS.C. It was checking get_physical( )'s return for the value: HT_FORBIDDEN. That's a value that get_physical( ) doesn't return. So, I've revised HTLoad( ), to check get_physical( )'s return for the value: HT_NO_ACCESS. I've also changed HTLoad( )'s previously unseen message, for this case, to something a little more appropriate for the HT_NO_ACCESS case. Character Entities in URLs Character Entities, such as > and & , are sequences used to encode special characters in HTML. Character Entity sequences always start with ampersand. So, that makes ampersand a special character. These commonly appear in URLs because ampersand has an additional special meaning in URLs! Ampersand(s) are used to separate name=value sequences in URLs developed to express Form content. When such a URL is included in an HTML document, it is felt that its ampersand(s) must encoded in & Character Entity sequences, to avoid any ambiguity. However, most servers probably don't expect to see those & Character Entity sequences in submitted URLs. So, it is up to a browser to interpret any Character Entity sequence(s) in an HTML document's URL(s) before submitting any of those URL(s) to a server. DosLynx hasn't been doing this. The natural place to take care of this omission was HTML_start_element( ), in HTML.C. HTML.C also contained an UnEscapeEntities( ) function, for interpreting the Character Entity sequence(s) in a string. But, HTML_start_element( ) was only calling HTSimplify( ) in the eight places where it also should have been calling UnEscapeEntities( ). To avoid having to add eight UnEscapeEntities( ) calls to HTML_start_element( ), I added the following short wrapper to HTML.C: /* Wrapper for a pair of UnEscapeEntities( ) and HTSimplify( ) calls. */ PUBLIC void uneensim ARGS1(char *, s) { HTSimplify(UnEscapeEntities(s)) ; } Then, I changed all eight of HTML_start_element( )'s HTSimplify( ) calls to uneensim( ) calls. This story might have ended here. But, while testing, I came across an HTML document containing a Character Entity sequence in a URL's #fragment part. This is used to refer to a label in the URL's document. Sure enough, the label in question also contained a Character Entity sequence. Once the URL's Character Entity sequence had been interpreted, it no longer matched the label! To correct this, I've extended HTML_start_element( )'s case HTML_A processing to give value[HTML_A_NAME] UnEscapeEntities( ) treatment. TCP/IP Timeouts at Midnight You may recall my eventual triumph over the heap corruption stemming from a small omission in tcp_ProcessData( ), in PCTCP.C. That was reported in the history.txt for DosLynx v0.28b. Well, that episode's result encouraged me to tackle this issue, finally. This one turned-out to be a lot easier for me to figure out. The bug found here amounted to another small omission. cpublic functions set_timeout( ), set_ttimeout( ), and chk_timeout( ) are all contained in TIMEOUT.ASM. set_timeout( ) and set_ttimeout( ) were dependent on chk_timeout( ), for handling the BIOSCLK's midnight rollover. But, they weren't calling chk_timeout( ), nor doing anything else, to get it called when necessary. They produced an incorrect result when run, without an intervening chk_timeout( ) run, after the midnight BIOS Time-Of-Day Clock rollover. In that case, their result was way low and produced a time-out as soon as it got checked. As TCP/IP being done at midnight often may be part of a long download, the occasional midnight time-outs that resulted were usually quite frustrating and memorable. I've fixed this issue by moving chk_timeout( )'s midnight rollover handling sequence into a GETOD PROC NEAR that I've added to the beginning of TIMEOUT.ASM. Now, all three of TIMEOUT.ASM's cpublic functions are able to call GETOD( ), to handle the midnight rollover possibility, for themselves. Interrupts have to be masked and restored at the beginning and end of GETOD( )'s processing. And, TIMEOUT.ASM's functions kept their local data in their Code Segment. As a result, this module later came in for a little more work, in support of the DosLynx Protected Mode version. That is described under the heading: Protected Mode Packet Driver Interface, below. Form Textarea Handling The first time I ran into http://www.softhome.net/signup/signup.fcg with Zeke, its behavior seemed pretty strange. The document's loading went very slowly and eventually timed-out. I was able to make a Save Source type copy of this document, however. With the document in hand for study, I soon recognized its distinguishing characteristic. It contains a Form