2008-06-19 11:08 UTC+0200 Viktor Szakats (harbour.01 syenar hu)

* contrib/hbtip/cgi.prg
   * contrib/hbtip/encoder.prg
   * contrib/hbtip/ftpcln.prg
   * contrib/hbtip/httpcln.prg
   * contrib/hbtip/mail.prg
   * contrib/hbtip/popcln.prg
   * contrib/hbtip/sendmail.prg
   * contrib/hbtip/sessid.prg
   * contrib/hbtip/smtpcln.prg
   * contrib/hbtip/thtml.prg
   * contrib/hbtip/url.prg
     * Some formatting, cleanups, <> -> !=

   * contrib/hbtip/sendmail.prg
     + hb_SendMail(): Added <cReplyTo> parameter.

   * contrib/hbtip/thtml.prg
     ! Removed five remaining _SET_EXACT dependent 
       string comparisons. Exact comparisons were 
       used for all these cases, with a NOTE added.
This commit is contained in:
Viktor Szakats
2008-06-19 09:13:02 +00:00
parent 9470c0cd02
commit 5e9ffda2b2
12 changed files with 193 additions and 166 deletions

View File

@@ -8,6 +8,28 @@
2008-12-31 13:59 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
2008-06-19 11:08 UTC+0200 Viktor Szakats (harbour.01 syenar hu)
* contrib/hbtip/cgi.prg
* contrib/hbtip/encoder.prg
* contrib/hbtip/ftpcln.prg
* contrib/hbtip/httpcln.prg
* contrib/hbtip/mail.prg
* contrib/hbtip/popcln.prg
* contrib/hbtip/sendmail.prg
* contrib/hbtip/sessid.prg
* contrib/hbtip/smtpcln.prg
* contrib/hbtip/thtml.prg
* contrib/hbtip/url.prg
* Some formatting, cleanups, <> -> !=
* contrib/hbtip/sendmail.prg
+ hb_SendMail(): Added <cReplyTo> parameter.
* contrib/hbtip/thtml.prg
! Removed five remaining _SET_EXACT dependent
string comparisons. Exact comparisons were
used for all these cases, with a NOTE added.
2008-06-19 02:25 UTC+0200 Viktor Szakats (harbour.01 syenar hu)
* contrib/hbtip/common.mak
! Added missing sendmail.prg

View File

@@ -61,15 +61,15 @@
*
*/
#include 'hbclass.ch'
#include 'tip.ch'
#include 'common.ch'
#include 'fileio.ch'
#include "hbclass.ch"
#include "tip.ch"
#include "common.ch"
#include "fileio.ch"
#define CGI_IN 0
#define CGI_OUT 1
#define _CRLF chr(13)+chr(10)
#define _BR '<br />'
#define _BR "<br />"
CLASS TIpCgi
@@ -121,22 +121,22 @@ METHOD New() CLASS TIpCgi
::bSavedErrHandler := ErrorBlock( { |e| ::ErrHandler( e ) } )
::cCgiHeader := ''
::cHtmlPage := ''
::cCgiHeader := ""
::cHtmlPage := ""
lPost := ( 'POST' $ Upper( getenv( 'REQUEST_METHOD' ) ) )
lPost := ( "POST" $ Upper( getenv( "REQUEST_METHOD" ) ) )
if lPost
nLen := val( getenv( 'CONTENT_LENGTH' ) )
nLen := val( getenv( "CONTENT_LENGTH" ) )
cTemp := space( nLen )
if ( ( nRead := fread( CGI_IN, @cTemp, nLen, 0 ) ) != nLen )
::ErrHandler( 'post error read ' + str( nRead ) + ' instead of ' + str( nLen ) )
::ErrHandler( "post error read " + str( nRead ) + " instead of " + str( nLen ) )
else
::HTTP_RAW_POST_DATA := cTemp
aTemp := HB_ATOKENS( cTemp, '&' )
aTemp := HB_ATOKENS( cTemp, "&" )
nLen := Len( aTemp )
if nLen > 0
for nCount := 1 TO nLen
aVar := HB_ATOKENS( aTemp[ nCount ], '=' )
aVar := HB_ATOKENS( aTemp[ nCount ], "=" )
if Len( aVar ) == 2
::hPosts[ alltrim( TipEncoderUrl_Decode( aVar[ 1 ] ) ) ] := TipEncoderUrl_Decode( aVar[ 2 ] )
endif
@@ -144,13 +144,13 @@ METHOD New() CLASS TIpCgi
endif
endif
else
cTemp := getenv( 'QUERY_STRING' )
cTemp := getenv( "QUERY_STRING" )
if !empty( cTemp )
aTemp := HB_ATOKENS( cTemp, '&' )
aTemp := HB_ATOKENS( cTemp, "&" )
nLen := Len( aTemp )
if nLen > 0
for nCount := 1 TO nLen
aVar := HB_ATOKENS( aTemp[ nCount ], '=' )
aVar := HB_ATOKENS( aTemp[ nCount ], "=" )
if Len( aVar ) == 2
::hGets[ alltrim( TipEncoderUrl_Decode( aVar[ 1 ] ) ) ] := TipEncoderUrl_Decode( aVar[ 2 ] )
endif
@@ -159,13 +159,13 @@ METHOD New() CLASS TIpCgi
endif
endif
cTemp := getenv( 'HTTP_COOKIE' )
cTemp := getenv( "HTTP_COOKIE" )
if !empty( cTemp )
aTemp := HB_ATOKENS( cTemp, ';' )
aTemp := HB_ATOKENS( cTemp, ";" )
nLen := Len( aTemp )
if nLen > 0
for nCount := 1 TO nLen
aVar := HB_ATOKENS( aTemp[ nCount ], '=' )
aVar := HB_ATOKENS( aTemp[ nCount ], "=" )
if Len( aVar ) == 2
::hCookies[ alltrim( TipEncoderUrl_Decode( aVar[ 1 ] ) ) ] := TipEncoderUrl_Decode( aVar[ 2 ] )
endif
@@ -178,7 +178,7 @@ METHOD New() CLASS TIpCgi
METHOD Header( cValue ) CLASS TIpCgi
if empty( cValue )
::cCgiHeader += 'Content-Type: text/html' + _CRLF
::cCgiHeader += "Content-Type: text/html" + _CRLF
else
::cCgiHeader += cValue + _CRLF
endif
@@ -187,7 +187,7 @@ METHOD Header( cValue ) CLASS TIpCgi
METHOD Redirect( cUrl ) CLASS TIpCgi
::cCgiHeader += 'Location: ' + cUrl + _CRLF
::cCgiHeader += "Location: " + cUrl + _CRLF
RETURN Self
@@ -210,7 +210,7 @@ METHOD Flush() CLASS TIpCgi
local cSID := ::cSID
local cSession
hb_hEval( ::hCookies, { |k,v| ::cCgiHeader += 'Set-Cookie: ' + k + '=' + v + ';' + _CRLF } )
hb_hEval( ::hCookies, { |k,v| ::cCgiHeader += "Set-Cookie: " + k + "=" + v + ";" + _CRLF } )
cStream := ::cCgiHeader + _CRLF + ::cHtmlPage + _CRLF
@@ -228,8 +228,8 @@ METHOD Flush() CLASS TIpCgi
fclose( nH )
endif
::cCgiHeader := ''
::cHtmlPage := ''
::cCgiHeader := ""
::cHtmlPage := ""
if !empty( cSID )
@@ -271,10 +271,10 @@ METHOD DestroySession( cID ) CLASS TIpCgi
if !( lRet := ( FErase( cFile ) == 0 ) )
::Print( "ERROR: On deleting session file : " + cFile + ", File error : " + hb_cStr( FError() ) )
else
::hCookies[ 'SESSIONID' ] := cSID + "; expires= " + TIP_DateToGMT( DATE() - 1 )
::hCookies[ "SESSIONID" ] := cSID + "; expires= " + TIP_DateToGMT( DATE() - 1 )
::CreateSID()
cSID := ::cSID
::hCookies[ 'SESSIONID' ] := cSID
::hCookies[ "SESSIONID" ] := cSID
endif
endif
@@ -389,11 +389,11 @@ METHOD StartSession( cSID ) CLASS TIpCgi
if empty( cSID )
if ( nH := hb_HPos( ::hGets, 'SESSIONID' ) ) != 0
if ( nH := hb_HPos( ::hGets, "SESSIONID" ) ) != 0
cSID := hb_HValueAt( ::hGets, nH )
elseif ( nH := hb_HPos( ::hPosts, 'SESSIONID' ) ) != 0
elseif ( nH := hb_HPos( ::hPosts, "SESSIONID" ) ) != 0
cSID := hb_HValueAt( ::hPosts, nH )
elseif ( nH := hb_HPos( ::hCookies, 'SESSIONID' ) ) != 0
elseif ( nH := hb_HPos( ::hCookies, "SESSIONID" ) ) != 0
cSID := hb_HValueAt( ::hCookies, nH )
endif
@@ -432,7 +432,7 @@ METHOD StartSession( cSID ) CLASS TIpCgi
endif
::hCookies[ 'SESSIONID' ] := ::cSID
::hCookies[ "SESSIONID" ] := ::cSID
RETURN Self
@@ -448,9 +448,9 @@ METHOD SessionDecode( cData ) CLASS TIpCgi
STATIC FUNCTION HtmlTag( xVal, cKey, cDefault )
local cVal := ''
local cVal := ""
DEFAULT cDefault TO ''
DEFAULT cDefault TO ""
if !empty( xVal ) .and. !empty( cKey )
if hb_hHasKey( xVal, cKey )
@@ -459,21 +459,21 @@ STATIC FUNCTION HtmlTag( xVal, cKey, cDefault )
endif
endif
if cVal == ''
if cVal == ""
cVal := cDefault
endif
if !( cVal == '' )
cVal := '<' + cKey + '>' + cVal + '</' + cKey + '>'
if !( cVal == "" )
cVal := "<" + cKey + ">" + cVal + "</" + cKey + ">"
endif
return cVal
STATIC FUNCTION HtmlAllTag( hTags, cSep )
local cVal := ''
local cVal := ""
DEFAULT cSep TO ' '
DEFAULT cSep TO " "
hb_hEval( hTags, { |k| cVal += HtmlTag( hTags, k ) + cSep } )
@@ -481,7 +481,7 @@ STATIC FUNCTION HtmlAllTag( hTags, cSep )
STATIC FUNCTION HtmlOption( xVal, cKey, cPre, cPost, lScan )
local cVal := ''
local cVal := ""
if !empty( xVal )
if empty( cKey )
@@ -505,9 +505,9 @@ STATIC FUNCTION HtmlOption( xVal, cKey, cPre, cPost, lScan )
STATIC FUNCTION HtmlAllOption( hOptions, cSep )
local cVal := ''
local cVal := ""
DEFAULT cSep TO ' '
DEFAULT cSep TO " "
if !empty( hOptions )
hb_hEval( hOptions, { |k| cVal += HtmlOption( hOptions, k,,, .t. ) + cSep } )
@@ -517,9 +517,9 @@ STATIC FUNCTION HtmlAllOption( hOptions, cSep )
STATIC FUNCTION HtmlValue( xVal, cKey, cDefault )
local cVal := ''
local cVal := ""
DEFAULT cDefault TO ''
DEFAULT cDefault TO ""
if !empty( xVal ) .and. !empty( cKey )
if hb_hHasKey( xVal, cKey )
@@ -528,7 +528,7 @@ STATIC FUNCTION HtmlValue( xVal, cKey, cDefault )
endif
endif
if cVal == ''
if cVal == ""
cVal := cDefault
endif
@@ -536,9 +536,9 @@ STATIC FUNCTION HtmlValue( xVal, cKey, cDefault )
STATIC FUNCTION HtmlAllValue( hValues, cSep )
local cVal := ''
local cVal := ""
DEFAULT cSep TO ' '
DEFAULT cSep TO " "
if !empty( hValues )
hb_hEval( hValues, { |k| cVal += HtmlValue( hValues, k ) + cSep } )
@@ -548,34 +548,34 @@ STATIC FUNCTION HtmlAllValue( hValues, cSep )
STATIC FUNCTION HtmlScript( xVal, cKey )
local cVal := ''
local cVal := ""
local nPos
local cTmp
DEFAULT cKey TO 'script'
DEFAULT cKey TO "script"
if !empty( xVal )
if ( nPos := hb_HPos( xVal, cKey ) ) != 0
cVal := hb_HValueAt( xVal, nPos )
if valtype( cVal ) == "H"
if ( nPos := hb_HPos( cVal, 'src' ) ) != 0
if ( nPos := hb_HPos( cVal, "src" ) ) != 0
cVal := hb_HValueAt( cVal, nPos )
if valtype( cVal ) == "C"
cVal := { cVal }
endif
if valtype( cVal ) == "A"
cTmp := ''
cTmp := ""
ascan( cVal, { |cFile| cTmp += '<script src="' + cFile + '" type="text/javascript">' + _CRLF } )
cVal := cTmp
endif
endif
if ( nPos := hb_HPos( cVal, 'var' ) ) != 0
if ( nPos := hb_HPos( cVal, "var" ) ) != 0
cVal := hb_HValueAt( cVal, nPos )
if valtype( cVal ) == "C"
cVal := { cVal }
endif
if valtype( cVal ) == "A"
cTmp := ''
cTmp := ""
ascan( cVal, { |cVar| cTmp += cVar } )
cVal := '<script type="text/javascript">' + _CRLF + '<!--' + _CRLF + cTmp + _CRLF + '-->' + _CRLF + '</script>' + _CRLF
endif
@@ -589,34 +589,34 @@ STATIC FUNCTION HtmlScript( xVal, cKey )
STATIC FUNCTION HtmlStyle( xVal, cKey )
local cVal := ''
local cVal := ""
local nPos
local cTmp
DEFAULT cKey TO 'style'
DEFAULT cKey TO "style"
if !empty( xVal )
if ( nPos := hb_HPos( xVal, cKey ) ) != 0
cVal := hb_HValueAt( xVal, nPos )
if valtype( cVal ) == "H"
if ( nPos := hb_HPos( cVal, 'src' ) ) != 0
if ( nPos := hb_HPos( cVal, "src" ) ) != 0
cVal := hb_HValueAt( cVal, nPos )
if valtype( cVal ) == "C"
cVal := { cVal }
endif
if valtype( cVal ) == "A"
cTmp := ''
cTmp := ""
ascan( cVal, { |cFile| cTmp += '<link rel="StyleSheet" href="' + cFile + '" type="text/css" />' + _CRLF } )
cVal := cTmp
endif
endif
if ( nPos := hb_HPos( cVal, 'var' ) ) != 0
if ( nPos := hb_HPos( cVal, "var" ) ) != 0
cVal := hb_HValueAt( cVal, nPos )
if valtype( cVal ) == "C"
cVal := { cVal }
endif
if valtype( cVal ) == "A"
cTmp := ''
cTmp := ""
ascan( cVal, { |cVar| cTmp += cVar } )
cVal := '<style type="text/css">' + _CRLF + '<!--' + _CRLF + cTmp + _CRLF + '-->' + _CRLF + '</style>' + _CRLF
endif
@@ -627,5 +627,3 @@ STATIC FUNCTION HtmlStyle( xVal, cKey )
endif
return cVal

View File

@@ -69,7 +69,7 @@
FUNCTION TIp_GetEncoder( cModel )
LOCAL oEncoder
IF Valtype( cModel ) <> "C"
IF !( Valtype( cModel ) == "C" )
cModel := "as-is"
ENDIF
@@ -108,7 +108,7 @@ ENDCLASS
METHOD New( cModel ) class TIPEncoder
IF Valtype( cModel ) <> "C"
IF !( Valtype( cModel ) == "C" )
cModel := "as-is"
ENDIF
::cName := cModel

View File

@@ -237,14 +237,14 @@ METHOD GetReply() CLASS tIPClientFTP
RETURN .F.
ENDIF
// now, if the reply has a '-' as fourth character, we need to proceed...
DO WHILE .not. Empty(cRep) .and. SubStr( cRep, 4, 1 ) == '-'
// now, if the reply has a "-" as fourth character, we need to proceed...
DO WHILE .not. Empty(cRep) .and. SubStr( cRep, 4, 1 ) == "-"
::cReply := ::InetRecvLine( ::SocketCon, @nLen, 128 )
cRep := IIf(ValType(::cReply) == "C", ::cReply, "")
ENDDO
// 4 and 5 are error codes
IF ::InetErrorCode( ::SocketCon ) != 0 .or. SubStr( ::cReply, 1, 1) >= '4'
IF ::InetErrorCode( ::SocketCon ) != 0 .or. SubStr( ::cReply, 1, 1) >= "4"
RETURN .F.
ENDIF
RETURN .T.
@@ -299,7 +299,7 @@ RETURN ::GetReply()
METHOD Rest( nPos ) CLASS tIPClientFTP
::InetSendall( ::SocketCon, "REST " + alltrim( Str( If( Empty( nPos ), 0, nPos ) ) ) + ::cCRLF )
::InetSendall( ::SocketCon, "REST " + alltrim( Str( iif( Empty( nPos ), 0, nPos ) ) ) + ::cCRLF )
RETURN ::GetReply()
@@ -384,9 +384,9 @@ METHOD List( cSpec ) CLASS tIPClientFTP
LOCAL cStr
IF cSpec == nil
cSpec := ''
cSpec := ""
ELSE
cSpec := ' ' + cSpec
cSpec := " " + cSpec
ENDIF
IF ::bUsePasv
IF .not. ::Pasv()
@@ -611,10 +611,10 @@ METHOD MGET( cSpec,cLocalPath ) CLASS tIPClientFTP
LOCAL cStr,cfile,aFiles
IF cSpec == nil
cSpec := ''
cSpec := ""
ENDIF
IF cLocalPath=nil
cLocalPath:=''
cLocalPath:=""
ENDIF
IF ::bUsePasv
IF .not. ::Pasv()
@@ -627,7 +627,7 @@ METHOD MGET( cSpec,cLocalPath ) CLASS tIPClientFTP
cStr := ::ReadAuxPort()
IF !empty(cStr)
aFiles:=hb_atokens(strtran(cStr,chr(13),''),chr(10))
aFiles:=hb_atokens(strtran(cStr,chr(13),""),chr(10))
FOR each cFile in aFiles
IF !Empty(cFile) //PM:09-08-2007 Needed because of the new HB_aTokens()
::downloadfile( cLocalPath+trim(cFile), trim(cFile) )
@@ -644,7 +644,7 @@ METHOD MPUT( cFileSpec, cAttr ) CLASS tIPClientFTP
LOCAL nCount := 0
LOCAL cStr := ""
IF Valtype( cFileSpec ) <> "C"
IF !( Valtype( cFileSpec ) == "C" )
RETURN 0
ENDIF
@@ -707,7 +707,7 @@ METHOD LS( cSpec ) CLASS tIPClientFTP
LOCAL cStr
IF cSpec == nil
cSpec := ''
cSpec := ""
ENDIF
IF ::bUsePasv .AND. ! ::Pasv()
@@ -723,7 +723,7 @@ METHOD LS( cSpec ) CLASS tIPClientFTP
IF ::GetReply()
cStr := ::ReadAuxPort()
ELSE
cStr := ''
cStr := ""
ENDIF
RETURN cStr
@@ -815,7 +815,7 @@ METHOD listFiles( cFileSpec ) CLASS tIPClientFTP
RETURN {}
ENDIF
aList := HB_ATokens( StrTran( cList, Chr(13),''), Chr(10) )
aList := HB_ATokens( StrTran( cList, Chr(13),""), Chr(10) )
FOR EACH cEntry IN aList

View File

@@ -356,7 +356,7 @@ RETURN cData
METHOD ReadAll() CLASS tIPClientHTTP
local cOut:='', cChunk
local cOut:="", cChunk
IF .not. ::bInitialized
::bInitialized := .T.
IF .not. ::Get()
@@ -382,12 +382,12 @@ METHOD setCookie(cLine) CLASS tIPClientHTTP
local cDefaultHost:=::oUrl:cServer, cDefaultPath:=::oUrl:cPath
local x,y
IF empty(cDefaultPath)
cDefaultPath:='/'
cDefaultPath:="/"
ENDIF
//this function currently ignores expires, secure and other tags that may be in the cookie for now...
// ?'Setting COOKIE:',cLine
// ?"Setting COOKIE:",cLine
aParam := HB_RegexSplit( ";", cLine )
cName:=cValue:=''
cName:=cValue:=""
cHost:=cDefaultHost
cPath:=cDefaultPath
y:=len(aParam)
@@ -400,10 +400,10 @@ METHOD setCookie(cLine) CLASS tIPClientHTTP
else
cElement:=upper(alltrim(aElements[1]))
do case
//case cElement=='EXPIRES'
case cElement=='PATH'
//case cElement=="EXPIRES"
case cElement=="PATH"
cPath:=alltrim(aElements[2])
case cElement=='DOMAIN'
case cElement=="DOMAIN"
cHost:=alltrim(aElements[2])
endcase
ENDIF
@@ -424,14 +424,14 @@ return NIL
METHOD getcookies(cHost,cPath) CLASS tIPClientHTTP
local x,y,aDomKeys:={},aKeys,z,cKey,aPathKeys,nPath
local a,b,cOut:='',c,d
local a,b,cOut:="",c,d
IF cHost=nil
cHost:=::oUrl:cServer
ENDIF
IF cPath=nil
cPath:=::oUrl:cPath
IF empty(cPath)
cPath:='/'
cPath:="/"
ENDIF
ENDIF
IF empty(cHost)
@@ -445,7 +445,7 @@ METHOD getcookies(cHost,cPath) CLASS tIPClientHTTP
cHost:=upper(cHost)
FOR x := 1 TO y
cKey:=upper(aKeys[x])
IF upper(right(cKey,z))==cHost.and.(len(cKey)=z .OR. substr(aKeys[x],0-z,1)=='.')
IF upper(right(cKey,z))==cHost.and.(len(cKey)=z .OR. substr(aKeys[x],0-z,1)==".")
aadd(aDomKeys,aKeys[x])
ENDIF
NEXT
@@ -461,7 +461,7 @@ METHOD getcookies(cHost,cPath) CLASS tIPClientHTTP
FOR a:= 1 TO b
cKey:=aKeys[a]
z:=len(cKey)
IF cKey=='/'.or.(z<=nPath.and.substr(cKey,1,nPath)==cKey)
IF cKey=="/".or.(z<=nPath.and.substr(cKey,1,nPath)==cKey)
aadd(aPathKeys,aKeys[a])
ENDIF
NEXT
@@ -472,9 +472,9 @@ METHOD getcookies(cHost,cPath) CLASS tIPClientHTTP
d:=len(aKeys)
FOR c := 1 TO d
IF !empty(cOut)
cOut+='; '
cOut+="; "
ENDIF
cOut+=aKeys[c]+'='+::hCookies[aDomKeys[x]][aPathKeys[a]][aKeys[c]]
cOut+=aKeys[c]+"="+::hCookies[aDomKeys[x]][aPathKeys[a]][aKeys[c]]
NEXT
NEXT
NEXT
@@ -497,13 +497,13 @@ METHOD Boundary(nType) CLASS tIPClientHTTP
nType=0
ENDIF
IF empty(cBound)
cBound:=replicate('-',27)+space(11)
cBound:=replicate("-",27)+space(11)
FOR i := 28 TO 38
cBound := Stuff( cBound, i, 1, str(int(HB_Random(0, 9 )),1,0) )
NEXT
::cBoundary:=cBound
endif
cBound:=if(nType<2,'--','')+cBound+if(nType=1,'--','')
cBound:=iif(nType<2,"--","")+cBound+if(nType=1,"--","")
RETURN(cBound)
METHOD Attach(cName,cFileName,cType) CLASS tIPClientHTTP
@@ -553,7 +553,7 @@ METHOD PostMultiPart( cPostData, cQuery ) CLASS tIPClientHTTP
cName:=oSub[1]
cFile:=oSub[2]
cType:=oSub[3]
cTmp:=strtran(cFile,'/','\')
cTmp:=strtran(cFile,"/","\")
if ( nPos := rat( "\", cTmp ) ) != 0
cFilePath := substr( cTmp, 1, nPos )
elseif ( nPos := rat( ":", cTmp ) ) != 0
@@ -563,7 +563,7 @@ METHOD PostMultiPart( cPostData, cQuery ) CLASS tIPClientHTTP
endif
cTmp:=substr(cFile,Len(cFilePath)+1)
IF empty(cType)
cType:='text/html'
cType:="text/html"
ENDIF
cData += cBound+cCrlf+'Content-Disposition: form-data; name="'+cName +'"; filename="'+cTmp+'"'+cCrlf+'Content-Type: '+cType+cCrLf+cCrLf
//hope this is not a big file....
@@ -584,7 +584,7 @@ METHOD PostMultiPart( cPostData, cQuery ) CLASS tIPClientHTTP
fClose(nFile)
cData+=cCrlf
NEXT
cData+=cBound+'--'+cCrlf
cData+=cBound+"--"+cCrlf
IF .not. HB_IsString( cQuery )
cQuery := ::oUrl:BuildQuery()
ENDIF

View File

@@ -250,7 +250,7 @@ METHOD Attach( oSubPart ) CLASS TipMail
IF HB_IsObject( oSubPart ) .and. oSubPart:ClassName == "TIPMAIL"
// reset wrong content-type
IF At( "multipart/", Lower( ::GetFieldPart("Content-Type")) ) == 0
::hHeaders["Content-Type"] := "multipart/mixed"
::hHeaders[ "Content-Type" ] := "multipart/mixed"
ENDIF
AAdd( ::aAttachments, oSubPart )
@@ -287,13 +287,13 @@ METHOD ToString() CLASS TipMail
LOCAL cRet := ""
// this is a multipart message; we need a boundary
IF Len( ::aAttachments ) > 0
::hHeaders["Mime-Version"] :="1.0"
::hHeaders[ "Mime-Version" ] :="1.0"
endif
IF Len( ::aAttachments ) > 0
//Reset failing content type
IF At( "multipart/", Lower( ::GetFieldPart("Content-Type")) ) == 0
::hHeaders["Content-Type"] := "multipart/mixed"
::hHeaders[ "Content-Type" ] := "multipart/mixed"
ENDIF
// have we got it already?
@@ -310,29 +310,29 @@ METHOD ToString() CLASS TipMail
// Begin output the fields
// Presenting them in a "well-known" order
IF "Return-Path" $ ::hHeaders
cRet+= "Return-Path: "+::hHeaders[ "Return-Path"] + e"\r\n"
cRet += "Return-Path: "+::hHeaders[ "Return-Path" ] + e"\r\n"
ENDIF
IF "Delivered-To" $ ::hHeaders
cRet+= "Delivered-To: "+::hHeaders[ "Delivered-To"] + e"\r\n"
cRet += "Delivered-To: "+::hHeaders[ "Delivered-To" ] + e"\r\n"
ENDIF
FOR EACH cElem IN ::aReceived
cRet+= "Received: "+ cElem+ e"\r\n"
cRet += "Received: "+ cElem+ e"\r\n"
NEXT
IF "Date" $ ::hHeaders
cRet+= "Date: "+::hHeaders[ "Date"] + e"\r\n"
cRet += "Date: "+::hHeaders[ "Date" ] + e"\r\n"
ENDIF
IF "From" $ ::hHeaders
cRet+= "From: "+::hHeaders[ "From"] + e"\r\n"
cRet += "From: "+::hHeaders[ "From" ] + e"\r\n"
ENDIF
IF "To" $ ::hHeaders
cRet+= "To: "+::hHeaders[ "To"] + e"\r\n"
cRet += "To: "+::hHeaders[ "To" ] + e"\r\n"
ENDIF
IF "Subject" $ ::hHeaders
cRet+= "Subject: "+ ::hHeaders[ "Subject"] + e"\r\n"
cRet += "Subject: "+ ::hHeaders[ "Subject" ] + e"\r\n"
ENDIF
IF Len( ::aAttachments ) > 0
cRet += "Mime-Version:" + ::hHeaders[ "Mime-Version" ] + e"\r\n"
ENDIF
IF Len( ::aAttachments ) > 0
cRet+= "Mime-Version:" + ::hHeaders["Mime-Version"] + e"\r\n"
endif
FOR i := 1 TO Len( ::hHeaders )
cElem := Lower(hb_HKeyAt( ::hHeaders, i ))
@@ -354,8 +354,8 @@ METHOD ToString() CLASS TipMail
//Body
IF .not. Empty( ::cBody )
IF empty(::aAttachments)
//cRet += ::cBody +if(lAttachment,'', e"\r\n")
cRet += ::cBody + if(::lBodyEncoded,'', e"\r\n")
//cRet += ::cBody +iif(lAttachment,"", e"\r\n")
cRet += ::cBody + iif(::lBodyEncoded,"", e"\r\n")
else
//GD - if there are attachements the body of the message has to be treated as an attachment.
cRet += "--" + cBoundary + e"\r\n"
@@ -438,7 +438,7 @@ METHOD FromString( cMail, cBoundary, nPos ) CLASS TipMail
// boundary.
IF "Content-Transfer-Encoding" $ ::hHeaders
::oEncoder := TIp_GetEncoder( ::hHeaders["Content-Transfer-Encoding"] )
::oEncoder := TIp_GetEncoder( ::hHeaders[ "Content-Transfer-Encoding" ] )
ENDIF
// se if we have subparts:
@@ -534,11 +534,11 @@ RETURN cBound
METHOD setHeader( cSubject, cFrom, cTo, cCC, cBCC ) CLASS TipMail
LOCAL aTo, aCC, aBCC, i, imax
IF Valtype( csubject ) <> "C"
IF !( Valtype( csubject ) == "C" )
cSubject := ""
ENDIF
IF Valtype( cFrom ) <> "C"
IF !( Valtype( cFrom ) == "C" )
RETURN .F.
ENDIF
@@ -582,7 +582,7 @@ METHOD setHeader( cSubject, cFrom, cTo, cCC, cBCC ) CLASS TipMail
RETURN .F.
ENDIF
IF aCC <> NIL
IF aCC != NIL
cCC := aCC[1]
imax := Len( aCC )
FOR i:=2 TO imax
@@ -594,7 +594,7 @@ METHOD setHeader( cSubject, cFrom, cTo, cCC, cBCC ) CLASS TipMail
ENDIF
ENDIF
IF aBCC <> NIL
IF aBCC != NIL
cBCC := aBCC[1]
imax := Len( aBCC )
FOR i:=2 TO imax
@@ -638,7 +638,7 @@ METHOD detachFile( cPath ) CLASS TipMail
LOCAL cDelim := HB_OsPathSeparator()
LOCAL nFileHandle
IF EMpty( cFileName )
IF Empty( cFileName )
RETURN .F.
ENDIF
@@ -647,22 +647,22 @@ METHOD detachFile( cPath ) CLASS TipMail
ENDIF
nFileHandle := FCreate( cFileName )
IF FError() <> 0
IF FError() != 0
RETURN .F.
ENDIF
FWrite( nFileHandle, cContent )
FClose( nFileHandle )
RETURN ( FError() == 0 )
RETURN FError() == 0
METHOD getFileName() CLASS TipMail
RETURN StrTran( ::getFieldOption( "Content-Type", "name" ), '"', '' )
RETURN StrTran( ::getFieldOption( "Content-Type", "name" ), '"', "" )
METHOD isMultiPart CLASS TipMail
RETURN ( "multipart/" $ Lower( ::GetFieldPart("Content-Type")) )
RETURN "multipart/" $ Lower( ::GetFieldPart("Content-Type"))
METHOD getMultiParts( aParts ) CLASS TipMail
@@ -674,7 +674,7 @@ METHOD getMultiParts( aParts ) CLASS TipMail
aParts := {}
ENDIF
DO WHILE ( oSubPart := ::nextAttachment() ) <> NIL
DO WHILE ( oSubPart := ::nextAttachment() ) != NIL
lReset := .T.
AAdd( aParts, oSubPart )
IF oSubPart:countAttachments() > 0

View File

@@ -133,7 +133,7 @@ METHOD GetOk() CLASS tIPClientPOP
LOCAL nLen
::cReply := ::InetRecvLine( ::SocketCon, @nLen, 128 )
IF ::InetErrorCode( ::SocketCon ) != 0 .or. !( SubStr( ::cReply, 1, 1 ) == '+' )
IF ::InetErrorCode( ::SocketCon ) != 0 .or. !( SubStr( ::cReply, 1, 1 ) == "+" )
RETURN .F.
ENDIF
RETURN .T.
@@ -318,7 +318,7 @@ METHOD Retrieve( nId, nLen ) CLASS tIPClientPOP
otherwise if response breaks EOM in two, it will never
be found
*/
IF ( nPos := hb_At( cEOM, cRet, Max( nRetLen - Len( cEOM ), 1 ) ) ) <> 0
IF ( nPos := hb_At( cEOM, cRet, Max( nRetLen - Len( cEOM ), 1 ) ) ) != 0
// Remove ".CRLF"
cRet := Left( cRet, nPos + 1 )
::bEof := .T.
@@ -337,7 +337,7 @@ METHOD Retrieve( nId, nLen ) CLASS tIPClientPOP
RETURN NIL
ENDIF
// Remove byte-stuffed termination octet(s) if any
// Remove byte-stuffed termination octet(s) if any
RETURN StrTran( cRet, ::cCRLF + "..", ::cCRLF + "." )
@@ -352,7 +352,7 @@ METHOD countMail CLASS TIpClientPop
LOCAL aMails
IF ::isOpen
::reset()
aMails := HB_ATokens( StrTran( ::list(), Chr(13),''), Chr(10) )
aMails := HB_ATokens( StrTran( ::list(), Chr(13),""), Chr(10) )
RETURN Len( aMails )
ENDIF
RETURN -1
@@ -361,7 +361,7 @@ RETURN -1
METHOD retrieveAll( lDelete )
LOCAL aMails, i, imax, cMail
IF Valtype( lDelete ) <> "L"
IF !( Valtype( lDelete ) == "L" )
lDelete := .F.
ENDIF
@@ -384,4 +384,4 @@ METHOD retrieveAll( lDelete )
ENDIF
NEXT
RETURN aMails
RETURN aMails

View File

@@ -56,7 +56,7 @@
#translate ( <exp1> LIKE <exp2> ) => ( HB_REGEXLIKE( (<exp2>), (<exp1>) ) )
FUNCTION HB_SendMail( cServer, nPort, cFrom, aTo, aCC, aBCC, cBody, cSubject, aFiles, cUser, cPass, cPopServer, nPriority, lRead, lTrace, lPopAuth, lNoAuth, nTimeOut)
FUNCTION HB_SendMail( cServer, nPort, cFrom, aTo, aCC, aBCC, cBody, cSubject, aFiles, cUser, cPass, cPopServer, nPriority, lRead, lTrace, lPopAuth, lNoAuth, nTimeOut, cReplyTo )
/*
cServer -> Required. IP or domain name of the mail server
nPort -> Optional. Port used my email server
@@ -75,6 +75,7 @@ FUNCTION HB_SendMail( cServer, nPort, cFrom, aTo, aCC, aBCC, cBody, cSubject, aF
lTrace -> Optional. If set to .T., a log file is created (sendmail<nNr>.log). Standard setting is .F.
lNoAuth -> Optional. Disable Autentication methods
nTimeOut -> Optional. Number os ms to wait default 20000 (20s)
cReplyTo -> Optional.
*/
LOCAL oInMail, cBodyTemp, oUrl, oMail, oAttach, aThisFile, cFile, cFname, cFext, cData, oUrl1
@@ -91,6 +92,7 @@ FUNCTION HB_SendMail( cServer, nPort, cFrom, aTo, aCC, aBCC, cBody, cSubject, aF
LOCAL lAuthPlain := .F.
LOCAL lConnect := .T.
LOCAL oPop
DEFAULT cUser TO ""
DEFAULT cPass TO ""
DEFAULT nPort TO 25
@@ -98,9 +100,10 @@ FUNCTION HB_SendMail( cServer, nPort, cFrom, aTo, aCC, aBCC, cBody, cSubject, aF
DEFAULT nPriority TO 3
DEFAULT lRead TO .F.
DEFAULT lTrace TO .F.
DEFAULT lPopAuth to .T.
DEFAULT lNoAuth TO .F.
DEFAULT nTimeOut to 100
DEFAULT lPopAuth TO .T.
DEFAULT lNoAuth TO .F.
DEFAULT nTimeOut TO 100
DEFAULT cReplyTo TO ""
cUser := StrTran( cUser, "@", "&at;" )
@@ -175,9 +178,9 @@ FUNCTION HB_SendMail( cServer, nPort, cFrom, aTo, aCC, aBCC, cBody, cSubject, aF
ENDIF
BEGIN SEQUENCE
oUrl := tUrl():New( "smtp://" + cUser + "@" + cServer + '/' + cTo )
oUrl := tUrl():New( "smtp://" + cUser + "@" + cServer + "/" + cTo )
RECOVER
lReturn := .F.
lReturn := .F.
END
IF !lReturn
@@ -203,7 +206,7 @@ FUNCTION HB_SendMail( cServer, nPort, cFrom, aTo, aCC, aBCC, cBody, cSubject, aF
oAttach:SetBody( cBody )
oMail:Attach( oAttach )
oUrl:cFile := cTo + If( Empty(cCC), "", "," + cCC ) + If( Empty(cBCC), "", "," + cBCC)
oUrl:cFile := cTo + iif( Empty(cCC), "", "," + cCC ) + iif( Empty(cBCC), "", "," + cBCC)
oMail:hHeaders[ "Date" ] := tip_Timestamp()
oMail:hHeaders[ "From" ] := cFrom
@@ -214,6 +217,9 @@ FUNCTION HB_SendMail( cServer, nPort, cFrom, aTo, aCC, aBCC, cBody, cSubject, aF
IF !Empty(cBCC)
oMail:hHeaders[ "Bcc" ] := cBCC
ENDIF
IF !Empty(cReplyTo)
oMail:hHeaders[ "Reply-To" ] := cReplyTo
ENDIF
BEGIN SEQUENCE
oInmail := tIPClientSMTP():New( oUrl, lTrace)

View File

@@ -126,7 +126,7 @@ FUNCTION TIP_CHECKSID( cSID, cCRCKey )
cSIDCRC += SubStr( cCRCKey, Val( SubStr( cTemp, n, 1 ) ) + 1, 1 )
next
RETURN ( Right( cSID, 5 ) == cSIDCRC )
RETURN Right( cSID, 5 ) == cSIDCRC
FUNCTION TIP_DATETOGMT( dDate, cTime )
LOCAL cStr := ""

View File

@@ -126,7 +126,7 @@ METHOD GetOk() CLASS tIPClientSMTP
LOCAL nLen
::cReply := ::InetRecvLine( ::SocketCon, @nLen, 512 )
IF ::InetErrorCode( ::SocketCon ) != 0 .or. Substr( ::cReply, 1, 1 ) == '5'
IF ::InetErrorCode( ::SocketCon ) != 0 .or. Substr( ::cReply, 1, 1 ) == "5"
RETURN .F.
ENDIF
RETURN .T.
@@ -193,14 +193,14 @@ RETURN ::getOk()
METHOD AUTH( cUser, cPass) CLASS tIPClientSMTP
Local cs:=''
Local cs:=""
Local cEncodedUser
Local cEncodedPAss
cUser := StrTran( cUser,"&at;", "@")
cEncodedUser := alltrim(HB_BASE64(cuser,len(cuser)))
cEncodedPAss :=alltrim(HB_BASE64(cPass,len(cpass)))
cEncodedPAss := alltrim(HB_BASE64(cPass,len(cpass)))
::InetSendall( ::SocketCon, "AUTH LOGIN" +::ccrlf )
@@ -212,7 +212,7 @@ METHOD AUTH( cUser, cPass) CLASS tIPClientSMTP
endif
endif
return ( ::isAuth := ::GetOk() )
return ::isAuth := ::GetOk()
METHOD AuthPlain( cUser, cPass) CLASS tIPClientSMTP
@@ -220,7 +220,7 @@ METHOD AuthPlain( cUser, cPass) CLASS tIPClientSMTP
Local cen := HB_BASE64( cBase, 2 + Len( cUser ) + Len( cPass ) )
::InetSendall( ::SocketCon, "AUTH PLAIN" + cen + ::cCrlf)
return ( ::isAuth := ::GetOk() )
return ::isAuth := ::GetOk()
METHOD Write( cData, nLen, bCommit ) CLASS tIPClientSMTP
@@ -304,4 +304,3 @@ METHOD sendMail( oTIpMail ) CLASS TIpClientSmtp
NEXT
RETURN ::data( oTIpMail:toString() )

View File

@@ -143,7 +143,7 @@ METHOD new( cHtmlString ) CLASS THtmlDocument
' </body>' + hb_OSNewLine() +;
'</html>'
IF Valtype( cHtmlString ) <> "C"
IF !( Valtype( cHtmlString ) == "C" )
::root := THtmlNode():new( cEmptyHtmlDoc )
ELSE
IF .NOT. "<html" $ Lower( Left( cHtmlString, 4096 ) )
@@ -245,14 +245,14 @@ METHOD writeFile( cFileName ) CLASS THtmlDocument
LOCAL cHtml := ::toString()
LOCAL nFileHandle := FCreate( cFileName )
IF FError() <> 0
IF FError() != 0
RETURN .F.
ENDIF
FWrite( nFileHandle, cHtml, Len(cHtml) )
FClose( nFileHandle )
::changed := .F.
RETURN ( FError()==0 )
RETURN FError() == 0
// builds a one dimensional array of all nodes contained in the HTML document
@@ -450,14 +450,15 @@ METHOD MatchCriteria( oFound ) CLASS THtmlIteratorScan
IF ::cValue != NIL
xData := oFound:getAttributes()
IF hb_HScan( xData, {| xKey,cValue| HB_SYMBOL_UNUSED(xKey), Lower(::cValue) == Lower(cValue) }) == 0
IF hb_HScan( xData, {| xKey, cValue | HB_SYMBOL_UNUSED(xKey), Lower(::cValue) == Lower(cValue) }) == 0
RETURN .F.
ENDIF
ENDIF
IF ::cData != NIL
xData := oFound:getText(" ")
IF Empty(xData) .OR. ( Alltrim(::cData) <> Alltrim(xData) )
/* NOTE: != changed to !( == ) */
IF Empty(xData) .OR. !( Alltrim(::cData) == Alltrim(xData) )
RETURN .F.
ENDIF
ENDIF
@@ -663,7 +664,7 @@ RETURN hb_bitAnd( ::htmlTagType[2], CM_OPT ) > 0
// checks if this is a node (leafs contain no further nodes, e.g. <br>,<hr>,_text_)
METHOD isNode CLASS THtmlNode
RETURN ( Valtype( ::htmlContent ) == "A" .AND. Len( ::htmlContent ) > 0 )
RETURN Valtype( ::htmlContent ) == "A" .AND. Len( ::htmlContent ) > 0
// checks if this is a block node that must be closed with an ending tag: eg: <table></table>, <ul></ul>
@@ -704,10 +705,10 @@ METHOD parseHtml( parser ) CLASS THtmlNode
// ending tag of previous node
cText := Lower( Alltrim( SubStr( CutStr( ">", @cText ), 3 ) ) )
oLastTag := oThisTag:parent
DO WHILE oLastTag <> NIL .AND. Lower( oLastTag:htmlTagName ) <> cText
DO WHILE oLastTag != NIL .AND. !( Lower( oLastTag:htmlTagName ) == cText ) /* NOTE: != changed to !( == ) */
oLastTag := oLastTag:parent
ENDDO
IF oLastTag <> NIL
IF oLastTag != NIL
oLastTag:htmlEndTagName := "/" + oLastTag:htmlTagName
ENDIF
@@ -743,7 +744,7 @@ METHOD parseHtml( parser ) CLASS THtmlNode
ELSE
oNextTag := oThisTag:parent
DO WHILE oNextTag <> NIL .AND. Lower( oNextTag:htmlTagName ) <> Lower( SubStr(cTagName,2) )
DO WHILE oNextTag != NIL .AND. !( Lower( oNextTag:htmlTagName ) == Lower( SubStr(cTagName,2) ) ) /* NOTE: != changed to !( == ) */
oNextTag := oNextTag:parent
ENDDO
@@ -858,7 +859,7 @@ METHOD parseHtmlFixed( parser ) CLASS THtmlNode
ENDIF
// back to "<"
DO WHILE P_PREV( parser ) <> "<" ; ENDDO
DO WHILE !( P_PREV( parser ) == "<" ) ; ENDDO /* NOTE: != changed to !( == ) */
nEnd := parser:p_pos
::addNode( THtmlNode():new( self, "_text_", , SubStr( parser:p_Str, nStart, nEnd - nStart ) ) )
@@ -870,7 +871,7 @@ RETURN self
// adds a new CHILD node to the current one
METHOD addNode( oTHtmlNode ) CLASS THtmlNode
IF oTHtmlNode:parent <> NIL .AND. .NOT. oTHtmlNode:parent == self
IF oTHtmlNode:parent != NIL .AND. .NOT. oTHtmlNode:parent == self
oTHtmlNode:delete()
ENDIF
@@ -879,7 +880,7 @@ METHOD addNode( oTHtmlNode ) CLASS THtmlNode
AAdd( ::htmlContent, oTHtmlNode )
IF ::root <> NIL .AND. ::root:_document <> NIL
IF ::root != NIL .AND. ::root:_document != NIL
::root:_document:changed := .T.
ENDIF
@@ -892,14 +893,14 @@ METHOD insertBefore( oTHtmlNode ) CLASS THtmlNode
RETURN ::error( "Cannot insert before root node", ::className(), ":insertBefore()", EG_ARG, HB_AParams() )
ENDIF
IF oTHtmlNode:parent <> NIL .AND. .NOT. oTHtmlNode:parent == self
IF oTHtmlNode:parent != NIL .AND. .NOT. oTHtmlNode:parent == self
oTHtmlNode:delete()
ENDIF
oTHtmlNode:parent := ::parent
oTHtmlNode:root := ::root
IF ::root <> NIL .AND. ::root:_document <> NIL
IF ::root != NIL .AND. ::root:_document != NIL
::root:_document:changed := .T.
ENDIF
@@ -913,14 +914,14 @@ RETURN oTHtmlNode
METHOD insertAfter( oTHtmlNode ) CLASS THtmlNode
LOCAL nPos
IF oTHtmlNode:parent <> NIL .AND. .NOT. oTHtmlNode:parent == self
IF oTHtmlNode:parent != NIL .AND. .NOT. oTHtmlNode:parent == self
oTHtmlNode:delete()
ENDIF
oTHtmlNode:parent := ::parent
oTHtmlNode:root := ::root
IF ::root <> NIL .AND. ::root:_document <> NIL
IF ::root != NIL .AND. ::root:_document != NIL
::root:_document:changed := .T.
ENDIF
@@ -942,7 +943,7 @@ METHOD delete() CLASS THtmlNode
RETURN self
ENDIF
IF ::root <> NIL .AND. ::root:_document <> NIL
IF ::root != NIL .AND. ::root:_document != NIL
::root:_document:changed := .T.
ENDIF
@@ -958,7 +959,7 @@ RETURN self
// returns first node in subtree (.F.) or first node of entire tree (.T.)
METHOD firstNode( lRoot ) CLASS THtmlNode
IF Valtype( lRoot ) <> "L"
IF !( Valtype( lRoot ) == "L" )
lRoot := .F.
ENDIF
@@ -974,7 +975,7 @@ RETURN IIF( Empty(::htmlContent), NIL, ::htmlContent[1] )
// returns last node in subtree (.F.) or last node of entire tree (.T.)
METHOD lastNode( lRoot ) CLASS THtmlNode
LOCAL aNodes
IF Valtype( lRoot ) <> "L"
IF !( Valtype( lRoot ) == "L" )
lRoot := .F.
ENDIF
IF ::htmlTagName == "_text_"
@@ -992,7 +993,8 @@ METHOD nextNode() CLASS THtmlNode
RETURN ::htmlContent[1]
ENDIF
IF ::htmlTagName <> "_text_" .AND. .NOT. Empty( ::htmlContent )
/* NOTE: != changed to !( == ) */
IF !( ::htmlTagName == "_text_" ) .AND. .NOT. Empty( ::htmlContent )
RETURN ::htmlContent[1]
ENDIF
@@ -1073,11 +1075,11 @@ METHOD toString( nIndent ) CLASS THtmlNode
cHtml += ::htmlContent
ENDIF
IF ::htmlEndTagName <> NIL
IF ::htmlEndTagName != NIL
IF ::isInline() .OR. ::keepFormatting() .OR. ::isType( CM_HEADING ) .OR. ::isType( CM_HEAD )
RETURN cHtml += IIf( ::htmlEndTagName == "/", " />", "<" + ::htmlEndTagName + ">" )
ENDIF
IF Right( cHtml, 1 ) <> Chr(10)
IF !( Right( cHtml, 1 ) == Chr(10) )
cHtml += Chr(13)+Chr(10)
ENDIF
RETURN cHtml += cIndent + IIf( ::htmlEndTagName == "/", " />", "<" + ::htmlEndTagName + ">" )
@@ -1221,7 +1223,7 @@ METHOD getAttribute( cName ) CLASS THtmlNode
LOCAL hHash := ::getAttributes()
LOCAL cValue
IF Valtype( hHash ) <> "H"
IF !( Valtype( hHash ) == "H" )
RETURN hHash
ENDIF
@@ -1363,7 +1365,7 @@ METHOD setAttribute( cName, cValue ) CLASS THtmlNode
LOCAL nType
LOCAL hHash := ::getAttributes()
IF Valtype( hHash ) <> "H"
IF !( Valtype( hHash ) == "H" )
// Tag doesn't have any attribute
RETURN ::error( "Invalid HTML attribute for: <" + ::htmlTagName + ">", ::className(), cName, EG_ARG, {cName, cValue} )
ENDIF
@@ -1399,7 +1401,7 @@ RETURN ::getAttributes()
METHOD delAttribute( cName ) CLASS THtmlNode
LOCAL xVal := ::getAttribute( cName )
LOCAL lRet := .F.
IF xVal <> NIL
IF xVal != NIL
BEGIN SEQUENCE WITH {|oErr| Break( oErr )}
hb_HDel( ::htmlAttributes, cName )
lRet := .T.
@@ -1636,7 +1638,7 @@ FUNCTION THtmlIsValid( cTagName, cAttrName )
BEGIN SEQUENCE WITH {|oErr| Break( oErr )}
aValue := shTagTypes[ cTagName ]
IF cAttrName <> NIL
IF cAttrName != NIL
aValue := HB_Exec( aValue[1] )
lRet := ( Ascan( aValue, {|a| Lower(a[1]) == Lower( cAttrName ) } ) > 0 )
ENDIF

View File

@@ -114,7 +114,7 @@ METHOD SetAddress( cUrl ) CLASS tURL
// TOPLEVEL url parsing
aMatch:= HB_Regex( ::cREuri, cUrl )
//May fail
// May fail
IF Empty( aMatch )
RETURN .F.
ENDIF
@@ -200,7 +200,7 @@ METHOD BuildQuery( ) CLASS tURL
RETURN cLine
METHOD AddGetForm( cPostData )
LOCAL cData:='', nI, cTmp,y, cRet
LOCAL cData:="", nI, cTmp,y, cRet
IF HB_IsHash( cPostData )
FOR nI := 1 TO Len( cPostData )
@@ -239,7 +239,7 @@ METHOD AddGetForm( cPostData )
ENDIF
IF !empty(cData)
cRet := ::cQuery+=if(empty(::cQuery),'','&')+cData
cRet := ::cQuery += iif(empty(::cQuery),"","&") + cData
ENDIF
RETURN cRet