LPARAMETERS lcRemoteFile, lcData,liData,liStart,liFlags
LOCAL fResult,lihFTP,lcBuffer,liData,liWrite,lihFile,llFast,lcAll
LOCAL ARRAY laFile(1)
lihFile=0
liData=IIF(PCOUNT()<3,512,liData)
liData=IIF(liData<=0,512,liData)
liStart=IIF(PCOUNT()<4,0,liStart)
liFlags=IIF(PCOUNT()<5,_FTPS_RWF_File,liFlags)
IF !BITTEST(liFlags,0) && File?
IF ADIR(laFile,lcData,"RSHA")=0
RETURN .F.
ENDIF
llFast=VAL(STRTRAN(SUBS(VERSION(),LEN("Visual FoxPro ")+1,2),"0",""))>5 AND laFile(1,2)<=_FTPS_MaxFileSize
IF !llFast
lihFile=FOPEN(lcData,0)
IF lihFile<=0
RETURN .F.
ENDIF
=FSEEK(lihFile,liStart,0)
ELSE
lcAll=FILETOSTR(lcData)
lcAll=SUBST(lcAll,liStart+1)
ENDIF
ELSE
lcData=IIF(TYPE("lcData")#"C","",lcData)
lcData=SUBST(lcData,liStart+1)
llFast=.T.
ENDIF
IF This.OpenFTPConnection(This.cStartupFolder) && Open an FTP Handle
lcRemoteFile = lcRemoteFile + cNULL
=This.BeforeWriteFTPFile(lcRemoteFile, lcData,liData,liStart,liFlags)
IF liStart<=0 && All data
STORE FtpOpenFile(This.nConnect_Handle, @lcRemoteFile, GENERIC_WRITE, ;
FTP_TRANSFER_TYPE_BINARY, 0) TO fResult,lihFTP
=This.GetExtendedError()
ELSE
* Append file
fResult=IIF(This.FTPCommand("APPE "+lcRemoteFile, FTP_TRANSFER_TYPE_BINARY,0,@lihFTP),1,0)
ENDIF
IF fResult #0 && OK, FTP file is openned
DO CASE
CASE !BITTEST(liFlags,0) AND (laFile(1,2)=0 OR LEN(lcAll)=0) OR;
BITTEST(liFlags,0) AND LEN(lcData)=0
lcBuffer=""
liData=LEN(lcBuffer)
liWrite=0
fResult = InternetWriteFile(lihFTP, @lcBuffer, liData, @liWrite)
=This.GetExtendedError()
=This.AtWriteFTPFile(@lcRemoteFile, @lcData,liData,liStart,liFlags,liWrite,fResult)
IF fResult#1
EXIT
ENDIF
CASE llFast AND !BITTEST(liFlags,0) && File
lii=1
DO WHILE lii<LEN(lcAll)
lcBuffer=SUBST(lcAll,lii,liData)
liData=LEN(lcBuffer)
liWrite=0
fResult = InternetWriteFile(lihFTP, @lcBuffer, liData, @liWrite)
=This.GetExtendedError()
=This.AtWriteFTPFile(@lcRemoteFile, @lcData,liData,liStart,liFlags,liWrite,fResult)
IF fResult#1
EXIT
ENDIF
lii=lii+liData
ENDDO
CASE BITTEST(liFlags,0) && String
lii=1
DO WHILE lii<LEN(lcData)
lcBuffer=SUBST(lcData,lii,liData)
liData=LEN(lcBuffer)
liWrite=0
fResult = InternetWriteFile(lihFTP, @lcBuffer, liData, @liWrite)
=This.GetExtendedError()
=This.AtWriteFTPFile(@lcRemoteFile, @lcData,liData,liStart,liFlags,liWrite,fResult)
IF fResult#1
EXIT
ENDIF
lii=lii+liData
ENDDO
OTHERWISE
DO WHILE !FEOF(lihFile)
lcBuffer=FREAD(lihFile,liData)
liData=LEN(lcBuffer)
liWrite=0
fResult = InternetWriteFile(lihFTP, @lcBuffer, liData, @liWrite)
=This.GetExtendedError()
=This.AtWriteFTPFile(@lcRemoteFile, @lcData,liData,liStart,liFlags,liWrite,fResult)
IF fResult#1
EXIT
ENDIF
ENDDO
=FCLOSE(lihFile)
ENDCASE
=IIF(liStart>0,This.FTPCommand("NOOP", FTP_TRANSFER_TYPE_BINARY,0,.NULL.),.T.)
=InternetCloseHandle(lihFTP)
ENDIF
=This.AfterWriteFTPFile(lcRemoteFile, lcData,liData,liStart,liFlags,fResult)
=IIF(This.lMultiOperations,.T.,This.CloseFTPConnection()) && Close FTP Handle
RETURN fResult = 1
ENDIF
RETURN .F.