LPARAMETERS lcRemoteFile, lcData,liData,liRStart,liLStart,liFlags
LOCAL fResult,lihFTP,lcBuffer,liData,liWrite,lihFile,llFast,lcAll
LOCAL ARRAY laFile(1)
IF ADIR(laFile,lcLocalFile,"RSHA")=0
RETURN .F.
ENDIF
liData=IIF(PCOUNT()<3,512,liData)
liData=IIF(liData<=0,512,liData)
liRStart=IIF(PCOUNT()<4,0,liRStart)
liLStart=IIF(PCOUNT()<5,0,liLStart)
liFlags=IIF(PCOUNT()<6,_FTPS_RWF_Resume+_FTPS_RWF_File,liFlags)
IF !BITTEST(liFlags,0) && File?
llFast=VAL(STRTRAN(SUBS(VERSION(),LEN("Visual FoxPro ")+1,2),"0",""))>5 AND laFile(1,2)<=_FTPS_MaxFileSize
*** old
IF llFast
lcAll=FILETOSTR(lcLocalFile)
ELSE
lihFile=FOPEN(lcLocalFile,2)
ENDIF
*** old
IF !llFast
lihFile=FOPEN(lcData,0)
lihFile=IIF(lihFile<=0,FCREATE(lcData,0),lihFile)
=IIF(BITTEST(liFlags,1),; && rewrite, skip to new position
FSEEK(lihFile,liLStart,0),;
FSEEK(lihFile,liRStart,0)) && resume native mode, skip to end file (by remote position)
ELSE
lcAll=FILETOSTR(lcData)
lcAll=IIF(BITTEST(liFlags,1),; && rewrite, skip to new position
LEFT(lcAll,liLStart),LEFT(lcAll,liRStart))
ENDIF
ELSE
lcData=IIF(TYPE("lcData")#"C","",lcdata)
lcData=IIF(BITTEST(liFlags,1),; && rewrite, skip to new position
LEFT(lcData,liLStart),LEFT(lcData,liRStart))
llFast=.T.
ENDIF
liData=IIF(PCOUNT()<3,512,liData)
liStart=IIF(PCOUNT()<4,0,liStart)
IF This.OpenFtpConnection(This.cStartupFolder) AND IIF(llFast,.T.,lihFile>0) && Open an FTP Handle
liData=IIF(PCOUNT()<3,100,liData)
lcRemoteFile = lcRemoteFile + cNULL
lcLocalFile = lcLocalFile
=This.BeforeWriteFtpFile(lcRemoteFile, lcData,liData,liRStart,liLStart,liFlags)
STORE FtpOpenFile(This.nConnect_Handle, @lcRemoteFile, GENERIC_WRITE, ;
FTP_TRANSFER_TYPE_BINARY, 0) TO fResult,lihFTP
=This.GetExtendedError()
IF fResult #0 && OK, FTP file is openned
DO CASE
CASE laFile(1,2)=0
lcBuffer=""
liData=LEN(lcBuffer)
liWrite=0
fResult = InternetWriteFile(lihFTP, @lcBuffer, liData, @liWrite)
=This.GetExtendedError()
=This.AtWriteFtpFile(@lcRemoteFile, @lcData,liData,liRStart,liLStart,liFlags,liWrite,fResult)
IF fResult#1
EXIT
ENDIF
CASE llFast
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,liRStart,liLStart,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,liRStart,liLStart,liFlags,liWrite,fResult)
IF fResult#1
EXIT
ENDIF
ENDDO
ENDCASE
=InternetCloseHandle(lihFTP)
ENDIF
=This.AfterWriteFtpFile(lcRemoteFile, lcData,liData,liRStart,liLStart,liFlags,fResult)
=IIF(This.lMultiOperations,.T.,This.CloseFtpConnection()) && Close FTP Handle
RETURN fResult = 1
ENDIF
=IIF(lihFile>0 AND !llFast,FCLOSE(lihFile),.T.)
RETURN .F.