From a78ac579425cb262acf13be033bd33b6b54bbb42 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Sat, 17 Nov 2012 15:30:46 +0000 Subject: [PATCH] c2012-11-17 16:29 UTC+0100 Viktor Szakats (vszakats syenar.net) * website/samples.html - website/samples/dosshell.html - website/samples/dosshell.prg.html - website/samples/screenshots/dosshell_linux.png - website/samples/screenshots/dosshell_w32.png + website/samples/osshell.html + website/samples/osshell.prg.html + website/samples/screenshots/osshell_linux.png + website/samples/screenshots/osshell_w32.png - website/samples/dates4.html - website/samples/dates4.prg.html - website/samples/testcgi.html - website/samples/testcgi.prg.html - website/samples/screenshots/testcgi.gif * synced files with /tests dir --- harbour/ChangeLog | 17 + harbour/website/samples.html | 4 +- harbour/website/samples/dates4.html | 124 ----- harbour/website/samples/dates4.prg.html | 59 --- .../samples/{dosshell.html => osshell.html} | 12 +- .../{dosshell.prg.html => osshell.prg.html} | 0 .../{dosshell_linux.png => osshell_linux.png} | Bin .../{dosshell_w32.png => osshell_w32.png} | Bin .../website/samples/screenshots/testcgi.gif | Bin 39799 -> 0 bytes harbour/website/samples/testcgi.html | 127 ----- harbour/website/samples/testcgi.prg.html | 494 ------------------ 11 files changed, 24 insertions(+), 813 deletions(-) delete mode 100644 harbour/website/samples/dates4.html delete mode 100644 harbour/website/samples/dates4.prg.html rename harbour/website/samples/{dosshell.html => osshell.html} (93%) rename harbour/website/samples/{dosshell.prg.html => osshell.prg.html} (100%) rename harbour/website/samples/screenshots/{dosshell_linux.png => osshell_linux.png} (100%) rename harbour/website/samples/screenshots/{dosshell_w32.png => osshell_w32.png} (100%) delete mode 100644 harbour/website/samples/screenshots/testcgi.gif delete mode 100644 harbour/website/samples/testcgi.html delete mode 100644 harbour/website/samples/testcgi.prg.html diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 579aac189a..da1dea083d 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,23 @@ The license applies to all entries newer than 2009-04-28. */ +c2012-11-17 16:29 UTC+0100 Viktor Szakats (vszakats syenar.net) + * website/samples.html + - website/samples/dosshell.html + - website/samples/dosshell.prg.html + - website/samples/screenshots/dosshell_linux.png + - website/samples/screenshots/dosshell_w32.png + + website/samples/osshell.html + + website/samples/osshell.prg.html + + website/samples/screenshots/osshell_linux.png + + website/samples/screenshots/osshell_w32.png + - website/samples/dates4.html + - website/samples/dates4.prg.html + - website/samples/testcgi.html + - website/samples/testcgi.prg.html + - website/samples/screenshots/testcgi.gif + * synced files with /tests dir + 2012-11-17 14:56 UTC+0100 Viktor Szakats (vszakats syenar.net) * contrib/hbodbc/hbodbc.hbp * contrib/hbodbc/odbc.c diff --git a/harbour/website/samples.html b/harbour/website/samples.html index 516fdfa384..a8ae3f8868 100644 --- a/harbour/website/samples.html +++ b/harbour/website/samples.html @@ -96,11 +96,10 @@
  • Codeblock support sample (codebloc.prg)
  • Codeblock advanced sample (codebl.prg)
  • Manipulation of date values (dates3.prg)
  • -
  • Dates values with hbct.lib & hbmisc.lib (dates4.prg)
  • Manipulating variables by reference (byref.prg)
  • Test for Ini file reading/writing (parseini.prg)
  • INIT and EXIT functions support (initexit.prg)
  • -
  • Run command: About to shell to DOS (dosshell.prg)
  • +
  • Run command: About to shell to OS (osshell.prg)
  • Testing long string handling support (longdev.prg)
  • Mouse sample support (mousetst.prg)
  • @@ -274,7 +273,6 @@     diff --git a/harbour/website/samples/dates4.html b/harbour/website/samples/dates4.html deleted file mode 100644 index eb57c8a1bb..0000000000 --- a/harbour/website/samples/dates4.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - -Harbour Project - Samples -> dates3 - - - - - - - -
    - - - - - - - - - - - - -
    - - - - - - -
    - - - - -
    - - - - - -
     
    - - - - - - - - -
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - - -
    Manipulation of date values
    Example of dates with several functions of hbct.lib & hbmisc.lib
       
     Files: 
      
     Screenshot: 
     
     
       
     How to compile: 
     To learn how to compile/link this example see our specific section on this link. 
     
    - - - - - -
    - - diff --git a/harbour/website/samples/dates4.prg.html b/harbour/website/samples/dates4.prg.html deleted file mode 100644 index 8384bde289..0000000000 --- a/harbour/website/samples/dates4.prg.html +++ /dev/null @@ -1,59 +0,0 @@ - -dates4.prg - - - - - -
    // Testing Harbour dates management.
    -#include "set.ch"
    -
    -STATIC s_cNewLine
    -
    -function main()
    -   LOCAL i
    -   LOCAL dDate := date()
    -
    -   s_cNewLine := hb_eol()
    -
    -   set( _SET_DATEFORMAT, "dd/mm/yyyy" )
    -
    -   for i := 7 to 49 step 7
    -      CheckDate( dDate )
    -      dDate += i
    -   next
    -
    -return nil
    -
    -function CheckDate( dDate )
    -   OutStd( "Testing date:", dDate , s_cNewLine )
    -   OutStd( "Days in month..:", daysinmonth( dDate ), s_cNewLine )
    -   OutStd( "Day of year....:", doy( dDate ), s_cNewLine )
    -   OutStd( "Begin of month.:", bom( dDate ), s_cNewLine )
    -   OutStd( "End of month...:", eom( dDate ), s_cNewLine )
    -   OutStd( "Week of month..:", wom( dDate ), s_cNewLine )
    -   OutStd( "Week of year...:", woy( dDate ), s_cNewLine )
    -   OutStd( "Begin of year..:", boy( dDate ), s_cNewLine )
    -   OutStd( "End of year....:", eoy( dDate ), s_cNewLine )
    -   __Accept( "Press ENTER to continue..." )
    -   OutStd( chr( 10 ), chr( 10 ) )
    -
    -return nil
    - diff --git a/harbour/website/samples/dosshell.html b/harbour/website/samples/osshell.html similarity index 93% rename from harbour/website/samples/dosshell.html rename to harbour/website/samples/osshell.html index d154c06cb8..2644776717 100644 --- a/harbour/website/samples/dosshell.html +++ b/harbour/website/samples/osshell.html @@ -2,7 +2,7 @@ -Harbour Project - Samples -> dosshell +Harbour Project - Samples -> osshell @@ -64,7 +64,7 @@     @@ -81,11 +81,11 @@   -

    -dosshell sample running on Windows Vista
    +

    +osshell sample running on Windows Vista

    -
    -dosshell sample running on Linux
    +
    +osshell sample running on Linux

    Note: To get the same result on Linux, you could execute a command "run bash"
    to forcing the beginning of a new shell.
    diff --git a/harbour/website/samples/dosshell.prg.html b/harbour/website/samples/osshell.prg.html similarity index 100% rename from harbour/website/samples/dosshell.prg.html rename to harbour/website/samples/osshell.prg.html diff --git a/harbour/website/samples/screenshots/dosshell_linux.png b/harbour/website/samples/screenshots/osshell_linux.png similarity index 100% rename from harbour/website/samples/screenshots/dosshell_linux.png rename to harbour/website/samples/screenshots/osshell_linux.png diff --git a/harbour/website/samples/screenshots/dosshell_w32.png b/harbour/website/samples/screenshots/osshell_w32.png similarity index 100% rename from harbour/website/samples/screenshots/dosshell_w32.png rename to harbour/website/samples/screenshots/osshell_w32.png diff --git a/harbour/website/samples/screenshots/testcgi.gif b/harbour/website/samples/screenshots/testcgi.gif deleted file mode 100644 index e95d10d93752d8daab8ac0716ee92b38d7270f13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39799 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 diff --git a/harbour/website/samples/testcgi.html b/harbour/website/samples/testcgi.html deleted file mode 100644 index e0619dfa66..0000000000 --- a/harbour/website/samples/testcgi.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - -Harbour Project - Samples -> testcgi - - - - - - - -
    - - - - - - - - - - - - -
    - - - - - - -
    - - - - -
    - - - - - -
     
    - - - - - - - - -
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - - - - - -
    Harbour Test of a CGI/HTML-Generator class
    This example shows how to work with Web pages using a custom class to manipulate data coming from a file and returns it to web browser.
       
     Files: 
      
     Screenshot: 
     
     
       
     How to compile: 
     To learn how to compile/link this example see our specific section on this link. 
     
    - - - - - -
    - - diff --git a/harbour/website/samples/testcgi.prg.html b/harbour/website/samples/testcgi.prg.html deleted file mode 100644 index 0721b81b52..0000000000 --- a/harbour/website/samples/testcgi.prg.html +++ /dev/null @@ -1,494 +0,0 @@ - -testcgi.prg - - - - - -
    /*
    - *
    - * Harbour Test of a CGI/HTML-Generator class.
    - *
    - * 1999/05/30  First implementation.
    - *
    - *             Tips: - Use ShowResults to make dynamic html (to test dynamic
    - *                     results, put the exe file on CGI-BIN dir or equivalent);
    - *                   - Use SaveToFile to make static html page
    - *
    - * 1999/05/31  Initial CGI functionality.
    - * 1999/06/01  Translated %nn to correct chars.
    - * 1999/06/02  Dynamic TAG matching routines (inspired on Delphi).
    - *             First attempt to convert Delphi's ISAPI dll of WebSites'
    - *             Function List
    - *             (See http://www.flexsys-ci.com/harbour-project/functions.htm)
    - * 1999/06/11  List can be viewed online at
    - *             http://www.flexsys-ci.com/cgi-bin/testcgi.exe
    - * 1999/07/29  Changed qOut() calls to OutStd() calls.
    - *
    - */
    -
    -#define CGI_SERVER_SOFTWARE     01
    -#define CGI_SERVER_NAME         02
    -#define CGI_GATEWAY_INTERFACE   03
    -#define CGI_SERVER_PROTOCOL     04
    -#define CGI_SERVER_PORT         05
    -#define CGI_REQUEST_METHOD      06
    -#define CGI_HTTP_ACCEPT         07
    -#define CGI_HTTP_USER_AGENT     08
    -#define CGI_HTTP_REFERER        09
    -#define CGI_PATH_INFO           10
    -#define CGI_PATH_TRANSLATED     11
    -#define CGI_SCRIPT_NAME         12
    -#define CGI_QUERY_STRING        13
    -#define CGI_REMOTE_HOST         14
    -#define CGI_REMOTE_ADDR         15
    -#define CGI_REMOTE_USER         16
    -#define CGI_AUTH_TYPE           17
    -#define CGI_CONTENT_TYPE        18
    -#define CGI_CONTENT_LENGTH      19
    -#define CGI_ANNOTATION_SERVER   20
    -
    -#define IF_BUFFER 65535
    -
    -FUNCTION Main()
    -
    -   LOCAL oHTML := THTML():New()
    -   LOCAL hFile, nPos, cString, cBuf, i, cTable, cLine
    -
    -   oHTML:SetHTMLFile( "function.cfm" )
    -
    -   hFile := fOpen( "list.txt", 0 )
    -
    -   cString := space( IF_BUFFER )
    -   cBuf    := ""
    -   cTable  := ""
    -
    -   // Builds dynamic table replacement
    -   WHILE hFile != -1 .AND. (nPos := fRead( hFile, @cString, IF_BUFFER )) > 0
    -      i := 1
    -      DO WHILE i <= nPos
    -
    -         IF substr( cString, i, 1 ) = chr( 13 )
    -            i := i + 1
    -            cLine := cBuf
    -            cBuf  := ""
    -
    -            IF left( cLine, 1 ) <> ';'
    -               cTable += '<TR>' + chr(10)+chr(13) + ;
    -                 '<TD WIDTH="50%"><FONT SIZE="2" FACE="Tahoma">' +                 ;
    -                 ParseString( cLine, ';', 1 ) + '</FONT></TD>' + chr(10)+chr(13) + ;
    -                 '<TD WIDTH="16%">' +                                              ;
    -                 if( ParseString( cLine, ';', 2 ) = 'R',                           ;
    -                    '<CENTER><IMG SRC="images/purple-m.gif">',                     ;
    -                    '&nbsp' ) +                                                    ;
    -                 '</TD>' + chr(10)+chr(13) +                                       ;
    -                 '<TD WIDTH="16%">' +                                              ;
    -                 if( ParseString( cLine, ';', 2 ) = 'S',                           ;
    -                    '<CENTER><IMG SRC="images/purple-m.gif">',                     ;
    -                    '&nbsp' ) +                                                    ;
    -                 '</TD>' + chr(10)+chr(13) +                                       ;
    -                 '<TD WIDTH="16%">' +                                              ;
    -                 if( ParseString( cLine, ';', 2 ) = 'N',                           ;
    -                    '<CENTER><IMG SRC="images/purple-m.gif">',                     ;
    -                    '&nbsp' ) +                                                    ;
    -                 '</TD>' + chr(10)+chr(13) +                                       ;
    -                 '</TR>'
    -            ENDIF
    -         ELSE
    -            cBuf := cBuf + substr( cString, i, 1 )
    -         ENDIF
    -
    -         i++
    -      ENDDO
    -   ENDDO
    -
    -   fClose( hFile )
    -
    -   oHTML:AddReplaceTag( "Functions", cTable )
    -   oHTML:Generate()
    -
    -   // Uncomment the following if you don't have a Web Server to test
    -   // this sample
    -
    -//   oHTML:SaveToFile( "test.htm" )
    -
    -   // If the above is uncommented, you may comment this line:
    -
    -   oHTML:ShowResult()
    -
    -   RETURN( NIL )
    -
    -FUNCTION ParseString( cString, cDelim, nRet )
    -
    -   LOCAL cBuf, aElem, nPosFim, nSize, i
    -
    -   nSize := len( cString ) - len( StrTran( cString, cDelim, '' ) ) + 1
    -   aElem := array( nSize )
    -
    -   cBuf := cString
    -   i := 1
    -   FOR i := 1 TO nSize
    -      nPosFim := at( cDelim, cBuf )
    -
    -      IF nPosFim > 0
    -         aElem[i] := substr( cBuf, 1, nPosFim - 1 )
    -      ELSE
    -         aElem[i] := cBuf
    -      ENDIF
    -
    -      cBuf := substr( cBuf, nPosFim + 1, len( cBuf ) )
    -
    -   NEXT i
    -
    -   RETURN( aElem[ nRet ] )
    -
    -FUNCTION Hex2Dec( cHex )
    -
    -   LOCAL aHex := { { "0", 00 }, ;
    -                   { "1", 01 }, ;
    -                   { "2", 02 }, ;
    -                   { "3", 03 }, ;
    -                   { "4", 04 }, ;
    -                   { "5", 05 }, ;
    -                   { "6", 06 }, ;
    -                   { "7", 07 }, ;
    -                   { "8", 08 }, ;
    -                   { "9", 09 }, ;
    -                   { "A", 10 }, ;
    -                   { "B", 11 }, ;
    -                   { "C", 12 }, ;
    -                   { "D", 13 }, ;
    -                   { "E", 14 }, ;
    -                   { "F", 15 } }
    -   LOCAL nRet
    -   LOCAL nRes
    -
    -   nRet := ascan( aHex, {| x | upper( x[1] ) = upper( left( cHex, 1 ) ) } )
    -   nRes := aHex[nRet, 2] * 16
    -   nRet := ascan( aHex, {| x | upper( x[1] ) = upper( right( cHex, 1 ) ) } )
    -   nRes += aHex[nRet, 2]
    -
    -   RETURN( nRes )
    -
    -/*-------------------------------------------------------------------------*/
    -
    -FUNCTION THTML
    -
    -   STATIC oClass
    -
    -   IF oClass == NIL
    -      oClass = HBClass():New( "THTML" )
    -
    -      oClass:AddData( "cTitle" )                       // Page Title
    -      oClass:AddData( "cBody" )                        // HTML Body Handler
    -      oClass:AddData( "cBGColor" )                     // Background Color
    -      oClass:AddData( "cLinkColor" )                   // Link Color
    -      oClass:AddData( "cvLinkColor" )                  // Visited Link Color
    -      oClass:AddData( "cContent" )                     // Page Content Handler
    -
    -      oClass:AddData( "aCGIContents" )
    -      oClass:AddData( "aQueryFields" )
    -      oClass:AddData( "cHTMLFile" )
    -      oClass:AddData( "aReplaceTags" )
    -
    -      oClass:AddMethod( "New",        @New() )         // New Method
    -      oClass:AddMethod( "SetTitle",   @SetTitle() )    // Set Page Title
    -      oClass:AddMethod( "AddHead",    @AddHead() )     // Add <H1> Header
    -      oClass:AddMethod( "AddLink",    @AddLink() )     // Add Hyperlink
    -      oClass:AddMethod( "AddPara",    @AddPara() )     // Add Paragraph
    -      oClass:AddMethod( "SaveToFile", @SaveToFile() )  // Saves Content to File
    -      oClass:AddMethod( "ShowResult", @ShowResult() )  // Show Result - SEE Fcn
    -      oClass:AddMethod( "Generate",   @Generate() )    // Generate HTML
    -      oClass:AddMethod( "SetHTMLFile",@SetHTMLFile() ) // Sets source HTML file
    -
    -      oClass:AddMethod( "ProcessCGI",    @ProcessCGI() )
    -      oClass:AddMethod( "GetCGIParam",   @GetCGIParam() )
    -      oClass:AddMethod( "QueryFields",   @QueryFields() )
    -      oClass:AddMethod( "AddReplaceTag", @AddReplaceTag() )
    -
    -      oClass:Create()
    -
    -   ENDIF
    -
    -   RETURN( oClass:Instance() )
    -
    -STATIC FUNCTION New()
    -
    -   LOCAL Self := QSelf()
    -
    -   ::cTitle       := "Untitled"
    -   ::cBGColor     := "#FFFFFF"
    -   ::cLinkColor   := "#0000FF"
    -   ::cvLinkColor  := "#FF0000"
    -   ::cContent     := ""
    -   ::cBody        := ""
    -   ::aCGIContents := {}
    -   ::aQueryFields := {}
    -   ::aReplaceTags := {}
    -   ::cHTMLFile    := ""
    -
    -   RETURN( Self )
    -
    -STATIC FUNCTION SetTitle( cTitle )
    -
    -   LOCAL Self := QSelf()
    -
    -   ::cTitle := cTitle
    -
    -   RETURN( Self )
    -
    -STATIC FUNCTION AddLink( cLinkTo, cLinkName )
    -
    -   LOCAL Self := QSelf()
    -
    -   ::cBody := ::cBody + ;
    -      "<A HREF='" + cLinkTo + "'>" + cLinkName + "</A>"
    -
    -   RETURN( Self )
    -
    -STATIC FUNCTION AddHead( cDescr )
    -
    -   LOCAL Self := QSelf()
    -
    -   // Why this doesn't work?
    -   // ::cBody += ...
    -   // ???
    -
    -   ::cBody := ::cBody + ;
    -      "<H1>" + cDescr + "</H1>"
    -
    -   RETURN( NIL )
    -
    -STATIC FUNCTION AddPara( cPara, cAlign )
    -
    -   LOCAL Self := QSelf()
    -
    -   ::cBody := ::cBody + ;
    -      "<P ALIGN='" + cAlign + "'>" + hb_eol() + ;
    -      cPara + hb_eol() + ;
    -      "</P>"
    -
    -   RETURN( Self )
    -
    -STATIC FUNCTION Generate()
    -
    -   LOCAL Self := QSelf()
    -   LOCAL cFile, i, hFile, nPos, cRes := ""
    -   LOCAL lFlag := .f.
    -
    -   // Is this a meta file or hand generated script?
    -   IF empty( ::cHTMLFile )
    -      ::cContent :=                                                        ;
    -         "<HTML><HEAD>"                                        + hb_eol() + ;
    -         "<TITLE>" + ::cTitle + "</TITLE>"                     + hb_eol() + ;
    -         "<BODY link='" + ::cLinkColor + "' " +                            ;
    -         "vlink='" + ::cvLinkColor + "'>" +                    + hb_eol() + ;
    -         ::cBody                                               + hb_eol() + ;
    -         "</BODY></HTML>"
    -   ELSE
    -      ::cContent := ""
    -
    -      // Does cHTMLFile exists?
    -      IF !File( ::cHTMLFile )
    -         ::cContent := "<H1>Server Error</H1><P><I>No such file: " + ;
    -           ::cHTMLFile
    -      ELSE
    -         // Read from file
    -         hFile := fOpen( ::cHTMLFile, 0 )
    -         cFile := space( IF_BUFFER )
    -         DO WHILE (nPos := fRead( hFile, @cFile, IF_BUFFER )) > 0
    -
    -            cFile := left( cFile, nPos )
    -            cRes += cFile
    -            cFile := space( IF_BUFFER )
    -
    -         ENDDO
    -
    -         fClose( hFile )
    -
    -         // Replace matched tags
    -         i := 1
    -         ::cContent := cRes
    -         /* TODO: Replace this DO WHILE with FOR..NEXT */
    -         DO WHILE i <= len( ::aReplaceTags )
    -            ::cContent := strtran( ::cContent, ;
    -               "<#" + ::aReplaceTags[i, 1] + ">", ::aReplaceTags[i, 2] )
    -            i++
    -         ENDDO
    -
    -         /* TODO: Clear remaining (not matched) tags */
    -         /*
    -         cRes := ""
    -         FOR i := 1 TO Len( ::cContent )
    -            IF SubStr( ::cContent, i, 1 ) == "<" .AND. ;
    -               SubStr( ::cContent, i + 1, 1 ) == "#"
    -               lFlag := .t.
    -            ELSEIF SubStr( ::cContent, i, 1 ) == ">" .AND. lFlag
    -               lFlag := .f.
    -            ELSEIF ! lFlag
    -               cRes += SubStr( ::cContent, i, 1 )
    -            ENDIF
    -         NEXT
    -
    -         ::cContent := cRes
    -         */
    -
    -      ENDIF
    -   ENDIF
    -
    -   RETURN( Self )
    -
    -STATIC FUNCTION ShowResult()
    -
    -   LOCAL Self := QSelf()
    -
    -   OutStd(                                                                 ;
    -      "HTTP/1.0 200 OK"                                        + hb_eol() + ;
    -      "CONTENT-TYPE: TEXT/HTML"                      + hb_eol() + hb_eol() + ;
    -      ::cContent )
    -
    -   RETURN( Self )
    -
    -STATIC FUNCTION SaveToFile( cFile )
    -
    -   LOCAL Self  := QSelf()
    -   LOCAL hFile := fCreate( cFile )
    -
    -   fWrite( hFile, ::cContent )
    -   fClose( hFile )
    -
    -   RETURN( Self )
    -
    -STATIC FUNCTION ProcessCGI()
    -
    -   LOCAL Self   := QSelf()
    -   LOCAL cQuery := ""
    -   LOCAL cBuff  := ""
    -   LOCAL nBuff  := 0
    -   LOCAL i
    -
    -   IF empty( ::aCGIContents )
    -      ::aCGIContents := {               ;
    -         GetEnv( "SERVER_SOFTWARE"   ), ;
    -         GetEnv( "SERVER_NAME"       ), ;
    -         GetEnv( "GATEWAY_INTERFACE" ), ;
    -         GetEnv( "SERVER_PROTOCOL"   ), ;
    -         GetEnv( "SERVER_PORT"       ), ;
    -         GetEnv( "REQUEST_METHOD"    ), ;
    -         GetEnv( "HTTP_ACCEPT"       ), ;
    -         GetEnv( "HTTP_USER_AGENT"   ), ;
    -         GetEnv( "HTTP_REFERER"      ), ;
    -         GetEnv( "PATH_INFO"         ), ;
    -         GetEnv( "PATH_TRANSLATED"   ), ;
    -         GetEnv( "SCRIPT_NAME"       ), ;
    -         GetEnv( "QUERY_STRING"      ), ;
    -         GetEnv( "REMOTE_HOST"       ), ;
    -         GetEnv( "REMOTE_ADDR"       ), ;
    -         GetEnv( "REMOTE_USER"       ), ;
    -         GetEnv( "AUTH_TYPE"         ), ;
    -         GetEnv( "CONTENT_TYPE"      ), ;
    -         GetEnv( "CONTENT_LENGTH"    ), ;
    -         GetEnv( "ANNOTATION_SERVER" )  ;
    -          }
    -
    -      cQuery := ::GetCGIParam( CGI_QUERY_STRING )
    -
    -      IF !empty( cQuery )
    -
    -        ::aQueryFields := {}
    -
    -        FOR i := 1 TO len( cQuery ) + 1
    -
    -          IF i > len( cQuery ) .OR. substr( cQuery, i, 1 ) == "&"
    -
    -             aadd( ::aQueryFields,                          ;
    -                { substr( cBuff, 1, at( "=", cBuff ) - 1 ), ;
    -                  strtran( substr( cBuff, at( "=", cBuff ) + 1,      ;
    -                     len( cBuff ) - at( "=", cBuff ) + 1 ), "+", " " ) } )
    -             cBuff := ""
    -          ELSE
    -             IF substr( cQuery, i, 1 ) = "%"
    -                cBuff += chr( Hex2Dec( substr( cQuery, i + 1, 2 ) ) )
    -                nBuff := 3
    -             ENDIF
    -
    -             IF nBuff = 0
    -                cBuff += substr( cQuery, i, 1 )
    -             ELSE
    -                nBuff--
    -             ENDIF
    -          ENDIF
    -
    -        NEXT
    -
    -      ENDIF
    -
    -   ENDIF
    -
    -   RETURN( Self )
    -
    -STATIC FUNCTION GetCGIParam( nParam )
    -
    -   LOCAL Self := QSelf()
    -
    -   ::ProcessCGI()
    -
    -   IF nParam > 20 .OR. nParam < 1
    -      outerr( "Invalid CGI parameter" )
    -      RETURN( NIL )
    -   ENDIF
    -
    -   RETURN( ::aCGIContents[nParam] )
    -
    -STATIC FUNCTION QueryFields( cQueryName )
    -
    -   LOCAL Self := QSelf()
    -   LOCAL cRet := ""
    -   LOCAL nRet
    -
    -   ::ProcessCGI()
    -
    -   nRet := aScan( ::aQueryFields, ;
    -      {| x | upper( x[1] ) = upper( cQueryName ) } )
    -
    -   IF nRet > 0
    -      cRet := ::aQueryFields[nRet, 2]
    -   ENDIF
    -
    -   RETURN( cRet )
    -
    -STATIC FUNCTION SetHTMLFile( cFile )
    -
    -   LOCAL Self := QSelf()
    -
    -   ::cHTMLFile := cFile
    -
    -   RETURN( Self )
    -
    -STATIC FUNCTION AddReplaceTag( cTag, cReplaceText )
    -
    -   LOCAL Self := QSelf()
    -
    -   aAdd( ::aReplaceTags, { cTag, cReplaceText } )
    -
    -   RETURN( Self )
    -
    -
    -