LPARAMETERS INP lcRemoteFile, INP lcData,OPT_INP liData,OPT_INP liStart,OPT_INP liFlags,OPT_INP lnFlag
LOCAL fResult,lihFTP,lcBuffer,liData,liWrite,lihFile,lcAll,lcAlias,liSele,llErr,lcError
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)
liSele=SELECT()
lcAlias=SYS(2015)
IF !BITTEST(liFlags,0) && File?
IF ADIR(laFile,lcData,"RSHA")=0 && safety than FILE()
This.SetExtendedError(_FTPS_UE_FNEXISTS,lcData)
RETURN .F.
ENDIF
CREATE CURSOR (lcAlias) (XX000 M NOCPTRANS)
APPEND BLANK
#IF VAL(STRTRAN(SUBS(VERSION(),LEN("Visual FoxPro ")+1,2),"0",""))>=8
TRY
APPEND MEMO XX000 FROM (lcData)
CATCH
llErr=.T.
FINALLY
ENDTRY
#ELSE
lcError=ON("ERROR")
ON ERROR llErr=.T.
APPEND MEMO XX000 FROM (lcData)
#ENDIF
IF llErr && bug at reading file from disk
This.SetExtendedError(_FTPS_UE_CNF,lcData)
RETURN .F.
ENDIF
ELSE
IF TYPE("lcData")#"C"
This.SetExtendedError(11,"Function argument value, type, or count is invalid.")
RETURN .F.
ENDIF
* lcData=SUBST(lcData,liStart+1)
ENDIF
IF This.OpenFTPConnection(This.cCurrentDir) && Open an FTP Handle
lcRemoteFile = lcRemoteFile + cNULL
=This.BeforeWriteFTPFile(@lcRemoteFile, @lcData,liData,liStart,liFlags,lnFlag)
IF liStart>0 && Part data
* Append file
=This._FTPCommand("REST "+LTRIM(STR(liStart,11)), lnFlag,0,.NULL.)
fResult=IIF(This._FTPCommand("APPE "+lcRemoteFile, lnFlag,0,@lihFTP),1,0)
ENDIF
STORE FtpOpenFile(This.nConnect_Handle, @lcRemoteFile, GENERIC_WRITE, ;
BITOR(This.nCachingType,lnFlag), 0) TO fResult,lihFTP
=This.GetExtendedError()
IF fResult #0 && OK, FTP file is openned
DO CASE
CASE !BITTEST(liFlags,0) AND liStart>=LEN(XX000) OR;
BITTEST(liFlags,0) AND LEN(lcData)=0 && prázdný 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 !BITTEST(liFlags,0) && File from string
lii=liStart+1
DO WHILE lii<LEN(XX000)
lcBuffer=SUBST(XX000,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=liStart+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
ENDCASE
=IIF(liStart>0,This._FTPCommand("NOOP", FTP_TRANSFER_TYPE_BINARY,0,.NULL.),.T.)
=InternetCloseHandle(lihFTP)
ENDIF
IF USED(lcAlias)
USE IN (lcAlias)
ENDIF
SELECT (liSele)
=This.AfterWriteFTPFile(@lcRemoteFile, @lcData,liData,liStart,liFlags,lnFlag,fResult)
=IIF(This.lMultiOperations,.T.,This.CloseFTPConnection()) && Close FTP Handle
RETURN fResult = 1
ENDIF
RETURN .F.