2010-11-24 01:48 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)

* examples/uhttpd2/umain.prg
  * examples/uhttpd2/uhttpd2.hbp
  * examples/uhttpd2/uwidgets.prg
  - examples/uhttpd2/uhbext.prg
    * Formatting.
    * Cleanups.

  * examples/httpsrv/uhttpd.prg
    * Formatting.

  * doc/en/garbage.txt
    * Applied patch from Tamas.
This commit is contained in:
Viktor Szakats
2010-11-24 00:49:15 +00:00
parent afa82f20e1
commit 5f95b29918
7 changed files with 156 additions and 154 deletions

View File

@@ -16,6 +16,20 @@
The license applies to all entries newer than 2009-04-28.
*/
2010-11-24 01:48 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* examples/uhttpd2/umain.prg
* examples/uhttpd2/uhttpd2.hbp
* examples/uhttpd2/uwidgets.prg
- examples/uhttpd2/uhbext.prg
* Formatting.
* Cleanups.
* examples/httpsrv/uhttpd.prg
* Formatting.
* doc/en/garbage.txt
* Applied patch from Tamas.
2010-11-24 01:09 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* examples/uhttpd2/uhttpd2.hbp
* Converted uhttpd2 core to a lib.

View File

@@ -154,7 +154,7 @@
* $TEMPLATE$
* Function
* $NAME$
* hb_gcAlloc()
* hb_gcFree()
* $CATEGORY$
* API
* $SUBCATEGORY$
@@ -190,7 +190,7 @@
* $TEMPLATE$
* Function
* $NAME$
* hb_gcAlloc()
* hb_gcCollectAll()
* $CATEGORY$
* API
* $SUBCATEGORY$
@@ -225,7 +225,7 @@
* $TEMPLATE$
* Function
* $NAME$
* hb_gcAlloc()
* hb_gcItemRef()
* $CATEGORY$
* API
* $SUBCATEGORY$
@@ -269,7 +269,7 @@
* $TEMPLATE$
* Procedure
* $NAME$
* hb_gcAlloc()
* HB_GCALL()
* $CATEGORY$
* API
* $SUBCATEGORY$

View File

@@ -1809,13 +1809,13 @@ FUNCTION uhttpd_join( cSeparator, aData )
LOCAL cRet := "", nI
FOR nI := 1 TO LEN( aData )
IF nI > 1; cRet += cSeparator
ENDIF
IF VALTYPE(aData[nI]) $ "CM"; cRet += aData[nI]
ELSEIF VALTYPE(aData[nI]) == "N"; cRet += LTRIM(STR(aData[nI]))
ELSEIF VALTYPE(aData[nI]) == "D"; cRet += IF(!EMPTY(aData[nI]), DTOC(aData[nI]), "")
ELSE
ENDIF
IF nI > 1; cRet += cSeparator
ENDIF
IF VALTYPE(aData[nI]) $ "CM"; cRet += aData[nI]
ELSEIF VALTYPE(aData[nI]) == "N"; cRet += LTRIM(STR(aData[nI]))
ELSEIF VALTYPE(aData[nI]) == "D"; cRet += IF(!EMPTY(aData[nI]), DTOC(aData[nI]), "")
ELSE
ENDIF
NEXT
RETURN cRet
@@ -1987,7 +1987,7 @@ STATIC PROCEDURE Define_Env( hmServer )
LOCAL v
FOR EACH v IN hmServer
hb_SetEnv( v:__enumKey(), v )
hb_SetEnv( v:__enumKey(), v )
NEXT
RETURN
@@ -2751,70 +2751,68 @@ STATIC FUNCTION Handler_CgiScript( cFileName )
RETURN MakeResponse()
STATIC FUNCTION LoadMimeTypes()
LOCAL hMimeTypes
// TODO: load mime types from file
hMimeTypes := { ;
"css" => "text/css" ,;
"htm" => "text/html" ,;
"html" => "text/html" ,;
"txt" => "text/plain" ,;
"text" => "text/plain" ,;
"asc" => "text/plain" ,;
"c" => "text/plain" ,;
"h" => "text/plain" ,;
"cpp" => "text/plain" ,;
"hpp" => "text/plain" ,;
"log" => "text/plain" ,;
"rtf" => "text/rtf" ,;
"xml" => "text/xml" ,;
"xsl" => "text/xsl" ,;
"bmp" => "image/bmp" ,;
"gif" => "image/gif" ,;
"jpg" => "image/jpeg" ,;
"jpe" => "image/jpeg" ,;
"jpeg" => "image/jpeg" ,;
"png" => "image/png" ,;
"tif" => "image/tiff" ,;
"tiff" => "image/tiff" ,;
"djv" => "image/vnd.djvu" ,;
"djvu" => "image/vnd.djvu" ,;
"ico" => "image/x-icon" ,;
"xls" => "application/excel" ,;
"doc" => "application/msword" ,;
"pdf" => "application/pdf" ,;
"ps" => "application/postscript" ,;
"eps" => "application/postscript" ,;
"ppt" => "application/powerpoint" ,;
"bz2" => "application/x-bzip2" ,;
"gz" => "application/x-gzip" ,;
"tgz" => "application/x-gtar" ,;
"js" => "application/x-javascript" ,;
"tar" => "application/x-tar" ,;
"tex" => "application/x-tex" ,;
"zip" => "application/zip" ,;
"midi" => "audio/midi" ,;
"mp3" => "audio/mpeg" ,;
"wav" => "audio/x-wav" ,;
"qt" => "video/quicktime" ,;
"mov" => "video/quicktime" ,;
"avi" => "video/x-msvideo" ;
}
RETURN hMimeTypes
RETURN { ;
"css" => "text/css" ,;
"htm" => "text/html" ,;
"html" => "text/html" ,;
"txt" => "text/plain" ,;
"text" => "text/plain" ,;
"asc" => "text/plain" ,;
"c" => "text/plain" ,;
"h" => "text/plain" ,;
"cpp" => "text/plain" ,;
"hpp" => "text/plain" ,;
"log" => "text/plain" ,;
"rtf" => "text/rtf" ,;
"xml" => "text/xml" ,;
"xsl" => "text/xsl" ,;
"bmp" => "image/bmp" ,;
"gif" => "image/gif" ,;
"jpg" => "image/jpeg" ,;
"jpe" => "image/jpeg" ,;
"jpeg" => "image/jpeg" ,;
"png" => "image/png" ,;
"tif" => "image/tiff" ,;
"tiff" => "image/tiff" ,;
"djv" => "image/vnd.djvu" ,;
"djvu" => "image/vnd.djvu" ,;
"ico" => "image/x-icon" ,;
"xls" => "application/excel" ,;
"doc" => "application/msword" ,;
"pdf" => "application/pdf" ,;
"ps" => "application/postscript" ,;
"eps" => "application/postscript" ,;
"ppt" => "application/powerpoint" ,;
"bz2" => "application/x-bzip2" ,;
"gz" => "application/x-gzip" ,;
"tgz" => "application/x-gtar" ,;
"js" => "application/x-javascript" ,;
"tar" => "application/x-tar" ,;
"tex" => "application/x-tex" ,;
"zip" => "application/zip" ,;
"midi" => "audio/midi" ,;
"mp3" => "audio/mpeg" ,;
"wav" => "audio/x-wav" ,;
"qt" => "video/quicktime" ,;
"mov" => "video/quicktime" ,;
"avi" => "video/x-msvideo" }
STATIC FUNCTION GT_notifier( nEvent, xParams )
LOCAL nReturn := 0
DO CASE
LOCAL nReturn := 0
DO CASE
CASE nEvent == HB_GTE_CLOSE
IF hb_mutexLock( s_hmtxBusy )
s_lQuitRequest := TRUE
nReturn := 1
hb_mutexUnlock( s_hmtxBusy )
ENDIF
ENDCASE
IF hb_mutexLock( s_hmtxBusy )
s_lQuitRequest := TRUE
nReturn := 1
hb_mutexUnlock( s_hmtxBusy )
ENDIF
ENDCASE
HB_SYMBOL_UNUSED( xParams )
HB_SYMBOL_UNUSED( xParams )
RETURN nReturn
RETURN nReturn
STATIC FUNCTION UHTTPD_UTCOFFSET()
LOCAL nOffset := HB_UTCOFFSET()

View File

@@ -1,42 +0,0 @@
/*
* $Id$
*/
/************************************************************
*
* Functions candidates to be a part of Harbour's core or RTL
*
*************************************************************/
FUNCTION split( cSeparator, cString )
LOCAL aRet := {}
LOCAL nI
DO WHILE ( nI := At( cSeparator, cString ) ) > 0
AAdd( aRet, Left( cString, nI - 1 ) )
cString := SubStr( cString, nI + Len( cSeparator ) )
ENDDO
AAdd( aRet, cString )
RETURN aRet
FUNCTION join( cSeparator, aData )
LOCAL cRet := ""
LOCAL nI
FOR nI := 1 TO Len( aData )
IF nI > 1
cRet += cSeparator
ENDIF
IF ValType( aData[ nI ] ) $ "CM" ; cRet += aData[ nI ]
ELSEIF ValType( aData[ nI ] ) == "N" ; cRet += hb_ntos( aData[ nI ] )
ELSEIF ValType( aData[ nI ] ) == "D" ; cRet += iif( ! Empty( aData[ nI ] ), DToC( aData[ nI ] ), "" )
ELSE
ENDIF
NEXT
RETURN cRet

View File

@@ -9,6 +9,5 @@
-w3 -es2
uhbext.prg
umain.prg
uwidgets.prg

View File

@@ -32,18 +32,18 @@ MEMVAR server, get, post, cookie, session
CREATE CLASS UHttpd
// Settings
/* Settings */
DATA nPort INIT 80
DATA cBindAddress INIT "0.0.0.0"
DATA cAccessLog INIT "uhttpd_access.log"
DATA cErrorLog INIT "uhttpd_error.log"
DATA bIdle INIT { || NIL }
DATA bIdle INIT {|| NIL }
DATA aMount INIT { => }
// Results
/* Results */
DATA cError INIT ""
// Private
/* Private */
DATA hAccessLog
DATA hErrorLog
@@ -59,7 +59,7 @@ CREATE CLASS UHttpd
METHOD RUN()
METHOD Stop()
// Private
/* Private */
METHOD LogAccess()
METHOD LogError( cError )
@@ -160,12 +160,12 @@ METHOD RUN() CLASS UHttpd
ENDDO
hb_socketClose( Self:hListen )
// End child threads
/* End child threads */
hb_mutexLock( Self:hmtxSession )
HB_HEVAL( Self:aSession, { |k, v| hb_mutexNotify( v[2], NIL ), HB_SYMBOL_UNUSED( k ) } )
HB_HEVAL( Self:aSession, {|k, v| hb_mutexNotify( v[2], NIL ), HB_SYMBOL_UNUSED( k ) } )
hb_mutexUnlock( Self:hmtxSession )
AEval( aThreads, { || hb_mutexNotify( Self:hmtxQueue, NIL ) } )
AEval( aThreads, { |h| hb_threadJoin( h ) } )
AEval( aThreads, {|| hb_mutexNotify( Self:hmtxQueue, NIL ) } )
AEval( aThreads, {|h| hb_threadJoin( h ) } )
FClose( Self:hErrorLog )
FClose( Self:hAccessLog )
@@ -370,7 +370,7 @@ STATIC FUNCTION ProcessRequest( oServer, hSocket, cBuffer )
t_aHeader := {}
t_nStatusCode := 200
t_lSessionDestroy := .F.
BEGIN SEQUENCE WITH { |oErr| UErrorHandler( oErr, oServer ) }
BEGIN SEQUENCE WITH {|oErr| UErrorHandler( oErr, oServer ) }
Eval( bEval, cPath )
RECOVER
USetStatusCode( 500 )
@@ -448,7 +448,7 @@ STATIC FUNCTION ProcessRequest( oServer, hSocket, cBuffer )
RETURN .F.
ELSE
/* not sessioned */
BEGIN SEQUENCE WITH { |oErr| UErrorHandler( oErr, oServer ) }
BEGIN SEQUENCE WITH {|oErr| UErrorHandler( oErr, oServer ) }
Eval( bEval, cPath )
RECOVER
USetStatusCode( 500 )
@@ -464,8 +464,8 @@ STATIC FUNCTION ParseRequestHeader( cRequest )
LOCAL aRequest, aLine, nI, nJ, cI, nK, nContentLength := 0
aRequest := split( CR_LF, cRequest )
aLine := split( " ", aRequest[1] )
aRequest := uhttpd_split( CR_LF, cRequest )
aLine := uhttpd_split( " ", aRequest[1] )
server["REQUEST_ALL"] := aRequest[1]
IF Len( aLine ) == 3 .AND. Left( aLine[3], 5 ) == "HTTP/"
@@ -511,25 +511,25 @@ STATIC FUNCTION ParseRequestHeader( cRequest )
SWITCH Upper( Left( aRequest[nI], nJ - 1 ) )
CASE "COOKIE"
IF ( nK := At( ";", cI ) ) == 0
nK := Len( Trim( cI ) )
nK := Len( RTrim( cI ) )
ENDIF
cI := Left( cI, nK )
IF ( nK := At( "=", cI ) ) > 0
/* cookie names are case insensitive, uppercase it */
cookie[UPPER(LEFT(cI, nK - 1))] := SubStr( cI, nK + 1 )
cookie[ UPPER( LEFT( cI, nK - 1 ) ) ] := SubStr( cI, nK + 1 )
ENDIF
EXIT
CASE "CONTENT-LENGTH"
nContentLength := Val( cI )
EXIT
OTHERWISE
server["HTTP_" + STRTRAN(UPPER(LEFT(aRequest[nI], nJ - 1 ) ), "-", "_" )] := cI
server[ "HTTP_" + STRTRAN( UPPER( LEFT( aRequest[nI], nJ - 1 ) ), "-", "_" ) ] := cI
EXIT
ENDSWITCH
ENDIF
NEXT
IF !( server["QUERY_STRING"] == "" )
FOR EACH cI IN split( "&", server["QUERY_STRING"] )
FOR EACH cI IN uhttpd_split( "&", server["QUERY_STRING"] )
IF ( nI := At( "=", cI ) ) > 0
get[UUrlDecode(LEFT(cI, nI - 1))] := UUrlDecode( SubStr( cI, nI + 1 ) )
ELSE
@@ -546,7 +546,7 @@ STATIC FUNCTION ParseRequestBody( cRequest )
LOCAL nI, cPart
IF server["HTTP_CONTENT_TYPE"] == "application/x-www-form-urlencoded"
FOR EACH cPart IN split( "&", cRequest )
FOR EACH cPart IN uhttpd_split( "&", cRequest )
IF ( nI := At( "=", cPart ) ) > 0
post[UUrlDecode(LEFT(cPart, nI - 1))] := UUrlDecode( SubStr( cPart, nI + 1 ) )
ELSE
@@ -628,7 +628,7 @@ STATIC FUNCTION MakeResponse()
ENDSWITCH
cRet += CR_LF
UAddHeader( "Content-Length", hb_ntos( Len( t_cResult ) ) )
AEval( t_aHeader, { |x| cRet += x[1] + ": " + x[2] + CR_LF } )
AEval( t_aHeader, {|x| cRet += x[1] + ": " + x[2] + CR_LF } )
cRet += CR_LF
? cRet
cRet += t_cResult
@@ -708,9 +708,9 @@ STATIC FUNCTION GetErrorDesc( oErr )
ENDIF
IF !Empty( oErr:osCode ); cRet += "OS error: " + hb_ntos( oErr:osCode ) + hb_eol()
ENDIF
IF ValType( oErr:args ) == "A"
IF hb_isArray( oErr:args )
cRet += "Arguments:" + hb_eol()
AEval( oErr:args, { |X, Y| cRet += Str( Y, 5 ) + ": " + HB_CStr( X ) + hb_eol() } )
AEval( oErr:args, {|X, Y| cRet += Str( Y, 5 ) + ": " + HB_CStr( X ) + hb_eol() } )
ENDIF
cRet += hb_eol()
@@ -731,13 +731,13 @@ STATIC FUNCTION GetErrorDesc( oErr )
cRet += "Database areas:" + hb_eol()
cRet += " Current: " + hb_ntos( Select() ) + " " + Alias() + hb_eol()
BEGIN SEQUENCE WITH { |o| BREAK( o ) }
BEGIN SEQUENCE WITH {|o| BREAK( o ) }
IF !Empty( Alias() )
cRet += " Filter: " + dbFilter() + hb_eol()
cRet += " Relation: " + dbRelation() + hb_eol()
cRet += " Index expression: " + OrdKey( OrdSetFocus() ) + hb_eol()
cRet += hb_eol()
BEGIN SEQUENCE WITH { |o| BREAK( o ) }
BEGIN SEQUENCE WITH {|o| BREAK( o ) }
FOR nI := 1 TO FCount()
cRet += Str( nI, 6 ) + " " + PadR( FieldName( nI ), 14 ) + ": " + HB_VALTOEXP( FieldGet( nI ) ) + hb_eol()
NEXT
@@ -751,7 +751,7 @@ STATIC FUNCTION GetErrorDesc( oErr )
END SEQUENCE
FOR nI := 1 TO 250
BEGIN SEQUENCE WITH { |o| BREAK( o ) }
BEGIN SEQUENCE WITH {|o| BREAK( o ) }
IF ! Empty( Alias( nI ) )
dbSelectArea( nI )
cRet += Str( nI, 6 ) + " " + rddName() + " " + PadR( Alias(), 15 ) + ;
@@ -799,7 +799,7 @@ FUNCTION UGetHeader( cType )
LOCAL nI
IF ( nI := ASCAN( t_aHeader, { |x| Upper(x[1] ) == Upper(cType ) } ) ) > 0
IF ( nI := ASCAN( t_aHeader, {|x| Upper(x[1] ) == Upper(cType ) } ) ) > 0
RETURN t_aHeader[nI, 2]
ENDIF
@@ -809,7 +809,7 @@ PROCEDURE UAddHeader( cType, cValue )
LOCAL nI
IF ( nI := ASCAN( t_aHeader, { |x| Upper(x[1] ) == Upper(cType ) } ) ) > 0
IF ( nI := ASCAN( t_aHeader, {|x| Upper(x[1] ) == Upper(cType ) } ) ) > 0
t_aHeader[nI, 2] := cValue
ELSE
AAdd( t_aHeader, { cType, cValue } )
@@ -986,7 +986,7 @@ PROCEDURE UProcFiles( cFileName, lIndex )
RETURN
ENDIF
IF ASCAN( { "index.html", "index.htm" }, ;
{ |x| iif( HB_FileExists( UOSFileName(cFileName + X ) ), ( cFileName += X, .T. ), .F. ) } ) > 0
{|x| iif( HB_FileExists( UOSFileName(cFileName + X ) ), ( cFileName += X, .T. ), .F. ) } ) > 0
UAddHeader( "Content-Type", "text/html" )
UWrite( HB_MEMOREAD( UOsFileName(cFileName ) ) )
RETURN
@@ -1001,17 +1001,17 @@ PROCEDURE UProcFiles( cFileName, lIndex )
aDir := Directory( UOsFileName( cFileName ), "D" )
IF HB_HHasKey( get, "s" )
IF get["s"] == "s"
ASort( aDir, , , { |X, Y| iif( X[5] == "D", iif(Y[5] == "D", X[1] < Y[1], .T. ), ;
ASort( aDir, , , {|X, Y| iif( X[5] == "D", iif(Y[5] == "D", X[1] < Y[1], .T. ), ;
iif( Y[5] == "D", .F. , X[2] < Y[2] ) ) } )
ELSEIF get["s"] == "m"
ASort( aDir, , , { |X, Y| iif( X[5] == "D", iif(Y[5] == "D", X[1] < Y[1], .T. ), ;
ASort( aDir, , , {|X, Y| iif( X[5] == "D", iif(Y[5] == "D", X[1] < Y[1], .T. ), ;
iif( Y[5] == "D", .F. , DToS( X[3] ) + X[4] < DToS( Y[3] ) + Y[4] ) ) } )
ELSE
ASort( aDir, , , { |X, Y| iif( X[5] == "D", iif(Y[5] == "D", X[1] < Y[1], .T. ), ;
ASort( aDir, , , {|X, Y| iif( X[5] == "D", iif(Y[5] == "D", X[1] < Y[1], .T. ), ;
iif( Y[5] == "D", .F. , X[1] < Y[1] ) ) } )
ENDIF
ELSE
ASort( aDir, , , { |X, Y| iif( X[5] == "D", iif(Y[5] == "D", X[1] < Y[1], .T. ), ;
ASort( aDir, , , {|X, Y| iif( X[5] == "D", iif(Y[5] == "D", X[1] < Y[1], .T. ), ;
iif( Y[5] == "D", .F. , X[1] < Y[1] ) ) } )
ENDIF
@@ -1050,28 +1050,61 @@ PROCEDURE UProcInfo()
UWrite( '<h2>Capabilities</h2>' )
UWrite( '<table border=1 cellspacing=0>' )
UWrite( '<tr><td>RDD</td><td>' + UHtmlEncode( join(", ", rddList() ) ) + '</td></tr>' )
UWrite( '<tr><td>RDD</td><td>' + UHtmlEncode( uhttpd_join(", ", rddList() ) ) + '</td></tr>' )
UWrite( '</table>' )
UWrite( '<h2>Variables</h2>' )
UWrite( '<h3>server</h3>' )
UWrite( '<table border=1 cellspacing=0>' )
HB_HEval( server, { |k, v| UWrite( '<tr><td>' + k + '</td><td>' + UHtmlEncode(HB_CStr(v ) ) + '</td></tr>' ) } )
HB_HEval( server, {|k, v| UWrite( '<tr><td>' + k + '</td><td>' + UHtmlEncode(HB_CStr(v ) ) + '</td></tr>' ) } )
UWrite( '</table>' )
IF !Empty( get )
UWrite( '<h3>get</h3>' )
UWrite( '<table border=1 cellspacing=0>' )
HB_HEval( get, { |k, v| UWrite( '<tr><td>' + k + '</td><td>' + UHtmlEncode(HB_CStr(v ) ) + '</td></tr>' ) } )
HB_HEval( get, {|k, v| UWrite( '<tr><td>' + k + '</td><td>' + UHtmlEncode(HB_CStr(v ) ) + '</td></tr>' ) } )
UWrite( '</table>' )
ENDIF
IF !Empty( post )
UWrite( '<h3>post</h3>' )
UWrite( '<table border=1 cellspacing=0>' )
HB_HEval( post, { |k, v| UWrite( '<tr><td>' + k + '</td><td>' + UHtmlEncode(HB_CStr(v ) ) + '</td></tr>' ) } )
HB_HEval( post, {|k, v| UWrite( '<tr><td>' + k + '</td><td>' + UHtmlEncode(HB_CStr(v ) ) + '</td></tr>' ) } )
UWrite( '</table>' )
ENDIF
RETURN
FUNCTION uhttpd_split( cSeparator, cString )
LOCAL aRet := {}
LOCAL nI
DO WHILE ( nI := At( cSeparator, cString ) ) > 0
AAdd( aRet, Left( cString, nI - 1 ) )
cString := SubStr( cString, nI + Len( cSeparator ) )
ENDDO
AAdd( aRet, cString )
RETURN aRet
FUNCTION uhttpd_join( cSeparator, aData )
LOCAL cRet := ""
LOCAL nI
FOR nI := 1 TO Len( aData )
IF nI > 1
cRet += cSeparator
ENDIF
IF ValType( aData[ nI ] ) $ "CM" ; cRet += aData[ nI ]
ELSEIF ValType( aData[ nI ] ) == "N" ; cRet += hb_ntos( aData[ nI ] )
ELSEIF ValType( aData[ nI ] ) == "D" ; cRet += iif( ! Empty( aData[ nI ] ), DToC( aData[ nI ] ), "" )
ELSE
ENDIF
NEXT
RETURN cRet

View File

@@ -33,7 +33,7 @@ METHOD Paint() CLASS UWMain
UWrite( '<meta http-equiv="content-type" content="text/html; charset=windows-1257">' )
UWrite( '<script language="javascript" src="/files/main.js"></script>' )
UWrite( '<body>' )
AEval( Self:aChilds, { |x| X:Paint() } )
AEval( Self:aChilds, {|x| X:Paint() } )
UWrite( '</body></html>' )
RETURN Self
@@ -70,7 +70,7 @@ METHOD Paint() CLASS UWLayoutGrid
UWrite( '<tr>' )
FOR EACH aCell IN aRow
UWrite( '<td>' )
AEval( aCell, { |o| o:Paint() } )
AEval( aCell, {|o| o:Paint() } )
UWrite( '</td>' )
NEXT
UWrite( '</tr>' )
@@ -94,7 +94,7 @@ METHOD Add( oWidget, nRow, nCol ) CLASS UWLayoutGrid
ENDIF
IF nCol > Len( Self:aChilds[1] )
FOR nI := Len( Self:aChilds[1] ) + 1 TO nCol
AEval( Self:aChilds, { |x| AAdd( x, {} ) } )
AEval( Self:aChilds, {|x| AAdd( x, {} ) } )
NEXT
ENDIF
AAdd( Self:aChilds[nRow, nCol], oWidget )
@@ -185,7 +185,7 @@ METHOD Add( oWidget ) CLASS UWForm
METHOD Paint() CLASS UWForm
UWrite( '<form action="' + Self:cAction + '" method="' + Self:cMethod + '">' )
AEval( Self:aChilds, { |x| X:Paint() } )
AEval( Self:aChilds, {|x| X:Paint() } )
UWrite( '</form>' )
RETURN Self
@@ -498,7 +498,7 @@ PROCEDURE UProcWidgets( cURL, aMap )
session["_ustack"] := aStack := {}
ENDIF
aURL := split( "/", cURL )
aURL := uhttpd_split( "/", cURL )
nI := 1
nL := Min( Len( aURL ), Len( aStack ) )
DO WHILE nI <= nL
@@ -524,7 +524,7 @@ PROCEDURE UProcWidgets( cURL, aMap )
lRet := .T.
// Enter procedures
DO WHILE nI <= Len( aURL )
cI := join( "/", ASize( AClone(aURL ), nI ) )
cI := uhttpd_join( "/", ASize( AClone(aURL ), nI ) )
IF HB_HHasKey( aMap, cI )
session["_uthis"] := { "idhash" => { => } }
IF ( lRet := Eval( aMap[cI], "INIT" ) ) == .T.