LPARAMETERS INP lcRemoteFile, INP lcData,OPT_INP liData,OPT_INP liStart,OPT_INP liFlags,OPT_INP lnFlag
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)
lnFlag=IIF(PCOUNT()<6,FTP_TRANSFER_TYPE_UNKNOWN,lnFlag)
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
IF LEN(SYS(2000,lcData))=0
RETURN .F.
ENDIF
lcAll=FILETOSTR(lcData)
lcAll=SUBST(lcAll,liStart+1)
ENDIF
ELSE
IF TYPE("lcData")#"C"
RETURN .F.
ENDIF
lcData=SUBST(lcData,liStart+1)
llFast=.T.
ENDIF
IF This.OpenFTPConnection(This.cCurrentDir) && Open an FTP Handle
lcRemoteFile = lcRemoteFile + cNULL
=This.BeforeWriteFTPFile(@lcRemoteFile, @lcData,liData,liStart,liFlags,lnFlag)
IF liStart<=0 && All data
STORE FtpOpenFile(This.nConnect_Handle, @lcRemoteFile, GENERIC_WRITE, ;
BITOR(This.nCachingType,lnFlag), 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 && prázndý soubor nebo prázdná data
lcBuffer=""
liData=LEN(lcBuffer)
liWrite=0
fResult = InternetWriteFile(lihFTP, @lcBuffer, liData, @liWrite)
=This.GetExtendedError()
=This.AtWriteFTPFile(@lcRemoteFile, @lcData,liData,liStart,liFlags,lnFlag,0,liWrite,fResult)
CASE llFast AND !BITTEST(liFlags,0) && File from string
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,lnFlag,lii,liWrite,fResult)
IF fResult#1
EXIT
ENDIF
lii=lii+liData
ENDDO
CASE BITTEST(liFlags,0) && String data
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,lnFlag,lii,liWrite,fResult)
IF fResult#1
EXIT
ENDIF
lii=lii+liData
ENDDO
OTHERWISE && File native
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,lnFlag,FSEEK(lihFile,0,1),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,lnFlag,fResult)
=IIF(This.lMultiOperations,.T.,This.CloseFTPConnection()) && Close FTP Handle
RETURN fResult = 1
ENDIF
RETURN .F.