LPARAMETERS INP lcRemoteFile,INP lcData,OPT_INP liData,OPT_INP liRStart,OPT_INP liLStart,OPT_INP liFlags,OPT_INP lnFlag
LOCAL fResult,lihFTP,lcBuffer,liData,liRead,lihFile,llFast,lcAll,llAppend,liFSize,liModeFile,llErr
lihFile=0
liData=IIF(PCOUNT()<3,512,m.liData)
liData=IIF(liData<=0,512,m.liData)
liRStart=IIF(PCOUNT()<4,0,m.liRStart)
liLStart=IIF(PCOUNT()<5,0,m.liLStart)
liFlags=IIF(PCOUNT()<6,_FTPS_RWF_Resume+_FTPS_RWF_File,m.liFlags)
lnFlag=IIF(PCOUNT()<7,FTP_TRANSFER_TYPE_UNKNOWN,m.lnFlag)
liModeFile=IIF(TYPE("m.lnFlag("+LTRIM(STR(_FTPS_FA_ModeFile,11))+")")="N",m.lnFlag(_FTPS_FA_ModeFile),0)
IF !BITTEST(m.liFlags,0) && File?
llFast=VAL(STRTRAN(SUBS(VERSION(),LEN("Visual FoxPro ")+1,2),"0",""))>6
IF !m.llFast
lihFile=FOPEN(m.lcData,0)
IF m.lihFile<=0
IF m.liModeFile=_FTPS_FA_MF_Error
This.SetExtendedError(_FTPS_UE_FNEXISTS,m.lcData)
RETURN .F.
ENDIF
lihFile=FCREATE(m.lcData,0)
DO CASE
CASE m.liModeFile=_FTPS_FA_MF_New OR IIF(BITTEST(m.liFlags,1),m.liLStart,m.liRStart)=0
CASE m.lihFile<=0
This.SetExtendedError(_FTPS_UE_CCF,m.lcData)
RETURN .F.
CASE m.liModeFile=_FTPS_FA_MF_Append
IF BITTEST(m.liFlags,1) && rewrite, skip to new position
=FCHSIZE(m.lihFile,m.liLStart+1)
=FSEEK(m.lihFile,m.liLStart,0)
ELSE
=FCHSIZE(m.lihFile,m.liRStart+1)
=FSEEK(m.lihFile,m.liRStart,0) && resume native mode
ENDIF
ENDCASE
ELSE
IF m.lihFile<=0
This.SetExtendedError(_FTPS_UE_COF,m.lcData)
RETURN .F.
ENDIF
=IIF(BITTEST(m.liFlags,1),; && rewrite, skip to new position
FSEEK(m.lihFile,m.liLStart,0),;
FSEEK(m.lihFile,m.liRStart,0)) && resume native mode
ENDIF
ELSE
IF LEN(SYS(2000,m.lcData))=0 && local file not exist
DO CASE
CASE m.liModeFile=_FTPS_FA_MF_New OR IIF(BITTEST(m.liFlags,1),m.liLStart,m.liRStart)=0
lcAll=""
CASE m.liModeFile=_FTPS_FA_MF_Error
This.SetExtendedError(_FTPS_UE_FNEXISTS,m.lcData)
RETURN .F.
CASE m.liModeFile=_FTPS_FA_MF_Append
lcAll=IIF(BITTEST(m.liFlags,1),; && rewrite, skip to new position
REPL(CHR(0),m.liLStart),REPL(CHR(0),m.liRStart))
OTHERWISE
ENDCASE
ELSE
lcAll=FILETOSTR(m.lcData)
lcAll=IIF(BITTEST(m.liFlags,1),; && rewrite, skip to new position
LEFT(m.lcAll,m.liLStart),LEFT(m.lcAll,m.liRStart))
ENDIF
ENDIF
ELSE
IF TYPE("m.lcData")#"C"
This.SetExtendedError(11,"Function argument value, type, or count is invalid.")
RETURN .F.
ENDIF
lcData=IIF(BITTEST(m.liFlags,1),; && rewrite, skip to new position
LEFT(m.lcData,m.liLStart),LEFT(m.lcData,m.liRStart))
llFast=.T.
ENDIF
IF This.OpenFTPConnection(This.cCurrentDir) && Open an FTP Handle
lcRemoteFile = m.lcRemoteFile + cNULL
=This.BeforeReadFTPFile(@m.lcRemoteFile, @m.lcData,m.liData,m.liRStart,m.liLStart,m.liFlags,m.lnFlag)
IF m.liRStart>0 && Part data
=This._FTPCommand("REST "+LTRIM(STR(m.liRStart,11)), FTP_TRANSFER_TYPE_BINARY,0,.NULL.)
ENDIF
STORE FtpOpenFile(This.nConnect_Handle, @m.lcRemoteFile, GENERIC_READ, ;
BITOR(This.nCachingType,m.lnFlag), 0) TO fResult,lihFTP
=This.GetExtendedError()
IF m.fResult #0 && OK, FTP file is openned
lii=0
STORE 1 TO fResult,liRead
DO WHILE m.liRead>0
liRead=0
lcBuffer=SPACE(m.liData)
fResult = InternetReadFile(m.lihFTP, @m.lcBuffer, m.liData, @m.liRead)
=This.GetExtendedError()
=This.AtReadFTPFile(@m.lcRemoteFile, @m.lcData,m.liData,m.liRStart,m.liLStart,m.liFlags,m.lnFlag,@m.lcBuffer,m.fResult)
IF !BITTEST(m.liFlags,0) && File?
IF m.llFast AND m.liRead>0
IF LEN(m.lcAll)+m.liRead>_FTPS_MaxFileSize
IF STRTOFILE(m.lcAll,m.lcData,m.llAppend)=0
This.SetExtendedError(_FTPS_UE_CWF,"")
fResult=0
EXIT
ENDIF
llAppend=.T.
lcAll=""
ENDIF
lcAll=m.lcAll+LEFT(m.lcBuffer,m.liRead)
ELSE
IF m.liRead>0
IF FWRITE(m.lihFile,LEFT(m.lcBuffer,m.liRead),m.liRead)=0
This.SetExtendedError(_FTPS_UE_CWF,STR(FERROR()))
fResult=0
EXIT
ENDIF
ENDIF
ENDIF
ELSE
lcData=m.lcData+LEFT(m.lcBuffer,m.liRead)
ENDIF
lii=m.lii+m.liRead
ENDDO
IF !BITTEST(m.liFlags,0)
=IIF(m.llFast AND LEN(m.lcAll)>0,; && File?
STRTOFILE(m.lcAll,m.lcData,m.llAppend),.T.)
=IIF(m.lihFile>0 AND !m.llFast,FCLOSE(m.lihFile),.T.)
ENDIF
=InternetCloseHandle(m.lihFTP)
=IIF(m.liRStart>0,This._FTPCommand("NOOP", FTP_TRANSFER_TYPE_BINARY,0,.NULL.),.T.)
ENDIF
=This.AfterReadFTPFile(@m.lcRemoteFile, @m.lcData,m.liData,m.liRStart,m.liLStart,m.liFlags,m.lnFlag,m.fResult)
=IIF(This.lMultiOperations,.T.,This.CloseFTPConnection()) && Close FTP Handle
RETURN m.fResult = 1
ENDIF
RETURN .F.