*SET STEP ON set safe off clear **m**mydate is public PUBLIC sz_ftp ,; mypass ,; root_file ,; mdir ,; laDirArray * Reset the variable to hold the file array. * The Object redefines the variable to an array. laDirArray = "" myftp = "xxxx" mypass = "1234" root_file = mydate + ".zip" mdir = "c:\d\option\" * Make it so Foxpro can find our FTP Class SET PROCEDURE TO ftp.prg ADDITIVE * Create a FTP Object sz_ftp = CREATEOBJECT('ftp_service') *SET STEP ON IF sz_ftp.OpenInternet(mypass , mypass, myftp , "21") *MessageBox( ?"Successful Connection" ListDir() * Change to that directory ? "--- Changing Directory to Quotes Daily" IF !sz_ftp.ChangeFtpDirectory("Quotes_Daily") ?sz_ftp.GetErrorCode(.T.) ENDIF ListDir() *wait * Change to that directory ? "--- Changing Directory to daily_stocks" IF !sz_ftp.ChangeFtpDirectory("daily_stocks") ?sz_ftp.GetErrorCode(.T.) ENDIF *ListDir() *wait get_file = "s" + root_file return_file = alltrim(mdir + "s" + root_file ) ? "does it exist on harddrive -->",return_File if file(return_file) ? "yes, so delete",return_file dele file &return_file ?file(return_file) endif *wait ? "--- Receiving File -->", get_file, " to -- > ", return_file IF !sz_ftp.GetFtpFile(get_file, return_file, .T.) ?sz_ftp.GetErrorCode(.T.) ENDIF *ListDir() * Change back the Original Directory ? "--- Changing Directory back on Level" IF !sz_ftp.ChangeFtpDirectory("..") ?sz_ftp.GetErrorCode(.T.) ENDIF ListDir() *wait * Change to that directory ? "--- Changing Directory to Dir_Test" IF !sz_ftp.ChangeFtpDirectory("daily_options_BA") ?sz_ftp.GetErrorCode(.T.) ENDIF *ListDir() get_file = "oa" + root_file return_file = alltrim(mdir + "oa" + root_file ) ? "does it exist on harddrive -->",return_File if file(return_file) ? "yes, so delete",return_file dele file &return_file ?file(return_file) endif *wait ? "--- Receiving File to FTP Server" IF !sz_ftp.GetFtpFile(get_file, return_file, .T.) ?sz_ftp.GetErrorCode(.T.) ENDIF *ListDir() ? "closing copnnectipon" sz_ftp.CloseInternet() ELSE MessageBox("No Connection Made", 64, "FTP Message") sz_ftp.CloseInternet() ?sz_ftp.GetErrorCode(.T.) ENDIF RETURN *************************************************** PROCEDURE ListDir LOCAL lcOutput, lcDirName * Reset the variable to hold the file array. * The Object redefines the variable to an array. *laDirArray = "" * Get the Current Directory Name IF !sz_ftp.GetFtpDirectory(@lcDirName) sz_ftp.GetErrorCode(.T.) lcDirName = '' ENDIF * Get the Files in the Current Directory * This one always returns an Error. When the API Function that gets the files * can't find any more files, it return the Error 'ERROR_NO_MORE_FILES' IF !sz_ftp.GetFtpDirectoryArray(@laDirArray, "*.*") * Error 18 always returns if the directory is empty IF !EMPTY(laDirArray) OR sz_ftp.GetErrorCode(.F.) != 18 sz_ftp.GetErrorCode(.T.) ENDIF ENDIF * Output the Current Directory ? ? 'FTP Directory: ' + lcDirName * Interate through our array of files IF !EMPTY(laDirArray) && If Empty, there were no files found in the current Directory. FOR x = 1 TO ALEN(laDirArray, 1) * Pad up a String with some file information. lcOutput = ' ' + PADR(laDirArray[x, 1], 25) + PADL(STR(laDirArray[x, 3]), 12) + ; ' ' + PADR(DTOC(laDirArray[x, 6]), 14) + laDirArray[x, 7] * Output the File Information ? lcOutput ENDFOR ENDIF * Just move a line down. ? RETURN*****Also here is Abrams FTP.prg
********************************************************** * FTP Services for Visual Foxpro 5.0+ * * Written by: Robert Abram * * Date: Sept 1998 * * * * Revision 1.1a * * * * wininet.dll needs to be in the windows/system * * directory. * * * * Updated 3/16/99 - Changed Date Usage to comply with * * Strict Date handling. * * * * Added 3/16/99 Functions - AutoDialInternet * * AutoDialHangUp * * DialInternet * * DialHangUp * * GetConnectedState * * GoOnline * ********************************************************** * * Internet API Returns * #define ERROR_SUCCESS 0 #define ERROR_FILE_NOT_FOUND 2 #define ERROR_PATH_NOT_FOUND 3 #define ERROR_ACCESS_DENIED 5 #define ERROR_INVALID_HANDLE 6 #define ERROR_NO_MORE_FILES 18 #define ERROR_FILE_EXISTS 80 #define ERROR_INVALID_PARAMETER 87 #define ERROR_INTERNET_BASE 12000 #define ERROR_INTERNET_OUT_OF_HANDLES (ERROR_INTERNET_BASE + 1) #define ERROR_INTERNET_TIMEOUT (ERROR_INTERNET_BASE + 2) #define ERROR_INTERNET_EXTENDED_ERROR (ERROR_INTERNET_BASE + 3) #define ERROR_INTERNET_INTERNAL_ERROR (ERROR_INTERNET_BASE + 4) #define ERROR_INTERNET_INVALID_URL (ERROR_INTERNET_BASE + 5) #define ERROR_INTERNET_UNRECOGNIZED_SCHEME (ERROR_INTERNET_BASE + 6) #define ERROR_INTERNET_NAME_NOT_RESOLVED (ERROR_INTERNET_BASE + 7) #define ERROR_INTERNET_PROTOCOL_NOT_FOUND (ERROR_INTERNET_BASE + 8) #define ERROR_INTERNET_INVALID_OPTION (ERROR_INTERNET_BASE + 9) #define ERROR_INTERNET_BAD_OPTION_LENGTH (ERROR_INTERNET_BASE + 10) #define ERROR_INTERNET_OPTION_NOT_SETTABLE (ERROR_INTERNET_BASE + 11) #define ERROR_INTERNET_SHUTDOWN (ERROR_INTERNET_BASE + 12) #define ERROR_INTERNET_INCORRECT_USER_NAME (ERROR_INTERNET_BASE + 13) #define ERROR_INTERNET_INCORRECT_PASSWORD (ERROR_INTERNET_BASE + 14) #define ERROR_INTERNET_LOGIN_FAILURE (ERROR_INTERNET_BASE + 15) #define ERROR_INTERNET_INVALID_OPERATION (ERROR_INTERNET_BASE + 16) #define ERROR_INTERNET_OPERATION_CANCELLED (ERROR_INTERNET_BASE + 17) #define ERROR_INTERNET_INCORRECT_HANDLE_TYPE (ERROR_INTERNET_BASE + 18) #define ERROR_INTERNET_INCORRECT_HANDLE_STATE (ERROR_INTERNET_BASE + 19) #define ERROR_INTERNET_NOT_PROXY_REQUEST (ERROR_INTERNET_BASE + 20) #define ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND (ERROR_INTERNET_BASE + 21) #define ERROR_INTERNET_BAD_REGISTRY_PARAMETER (ERROR_INTERNET_BASE + 22) #define ERROR_INTERNET_NO_DIRECT_ACCESS (ERROR_INTERNET_BASE + 23) #define ERROR_INTERNET_NO_CONTEXT (ERROR_INTERNET_BASE + 24) #define ERROR_INTERNET_NO_CALLBACK (ERROR_INTERNET_BASE + 25) #define ERROR_INTERNET_REQUEST_PENDING (ERROR_INTERNET_BASE + 26) #define ERROR_INTERNET_INCORRECT_FORMAT (ERROR_INTERNET_BASE + 27) #define ERROR_INTERNET_ITEM_NOT_FOUND (ERROR_INTERNET_BASE + 28) #define ERROR_INTERNET_CANNOT_CONNECT (ERROR_INTERNET_BASE + 29) #define ERROR_INTERNET_CONNECTION_ABORTED (ERROR_INTERNET_BASE + 30) #define ERROR_INTERNET_CONNECTION_RESET (ERROR_INTERNET_BASE + 31) #define ERROR_INTERNET_FORCE_RETRY (ERROR_INTERNET_BASE + 32) #define ERROR_INTERNET_INVALID_PROXY_REQUEST (ERROR_INTERNET_BASE + 33) #define ERROR_INTERNET_NEED_UI (ERROR_INTERNET_BASE + 34) #define ERROR_INTERNET_HANDLE_EXISTS (ERROR_INTERNET_BASE + 36) #define ERROR_INTERNET_SEC_CERT_DATE_INVALID (ERROR_INTERNET_BASE + 37) #define ERROR_INTERNET_SEC_CERT_CN_INVALID (ERROR_INTERNET_BASE + 38) #define ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR (ERROR_INTERNET_BASE + 39) #define ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR (ERROR_INTERNET_BASE + 40) #define ERROR_INTERNET_MIXED_SECURITY (ERROR_INTERNET_BASE + 41) #define ERROR_INTERNET_CHG_POST_IS_NON_SECURE (ERROR_INTERNET_BASE + 42) #define ERROR_INTERNET_POST_IS_NON_SECURE (ERROR_INTERNET_BASE + 43) #define ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED (ERROR_INTERNET_BASE + 44) #define ERROR_INTERNET_INVALID_CA (ERROR_INTERNET_BASE + 45) #define ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP (ERROR_INTERNET_BASE + 46) #define ERROR_INTERNET_ASYNC_THREAD_FAILED (ERROR_INTERNET_BASE + 47) #define ERROR_INTERNET_REDIRECT_SCHEME_CHANGE (ERROR_INTERNET_BASE + 48) #define ERROR_INTERNET_DIALOG_PENDING (ERROR_INTERNET_BASE + 49) #define ERROR_INTERNET_RETRY_DIALOG (ERROR_INTERNET_BASE + 50) #define ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR (ERROR_INTERNET_BASE + 52) #define ERROR_INTERNET_INSERT_CDROM (ERROR_INTERNET_BASE + 53) * * FTP API errors * #define FTP_TRANSFER_IN_PROGRESS (ERROR_INTERNET_BASE + 110) #define FTP_DROPPED (ERROR_INTERNET_BASE + 111) #define FTP_NO_PASSIVE_MODE (ERROR_INTERNET_BASE + 112) * * additional Internet API error codes * #define ERROR_INTERNET_SECURITY_CHANNEL_ERROR (ERROR_INTERNET_BASE + 157) #define ERROR_INTERNET_UNABLE_TO_CACHE_FILE (ERROR_INTERNET_BASE + 158) #define ERROR_INTERNET_TCPIP_NOT_INSTALLED (ERROR_INTERNET_BASE + 159) #define ERROR_INTERNET_DISCONNECTED (ERROR_INTERNET_BASE + 163) #define ERROR_INTERNET_SERVER_UNREACHABLE (ERROR_INTERNET_BASE + 164) #define ERROR_INTERNET_PROXY_SERVER_UNREACHABLE (ERROR_INTERNET_BASE + 165) #define ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT (ERROR_INTERNET_BASE + 166) #define ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT (ERROR_INTERNET_BASE + 167) #define ERROR_INTERNET_SEC_INVALID_CERT (ERROR_INTERNET_BASE + 169) #define ERROR_INTERNET_SEC_CERT_REVOKED (ERROR_INTERNET_BASE + 170) * * handle types * #define ERROR_INTERNET_HANDLE_TYPE_INTERNET 1 #define ERROR_INTERNET_HANDLE_TYPE_CONNECT_FTP 2 #define ERROR_INTERNET_HANDLE_TYPE_CONNECT_GOPHER 3 #define ERROR_INTERNET_HANDLE_TYPE_CONNECT_HTTP 4 #define ERROR_INTERNET_HANDLE_TYPE_FTP_FIND 5 #define ERROR_INTERNET_HANDLE_TYPE_FTP_FIND_HTML 6 #define ERROR_INTERNET_HANDLE_TYPE_FTP_FILE 7 #define ERROR_INTERNET_HANDLE_TYPE_FTP_FILE_HTML 8 #define ERROR_INTERNET_HANDLE_TYPE_GOPHER_FIND 9 #define ERROR_INTERNET_HANDLE_TYPE_GOPHER_FIND_HTML 10 #define ERROR_INTERNET_HANDLE_TYPE_GOPHER_FILE 11 #define ERROR_INTERNET_HANDLE_TYPE_GOPHER_FILE_HTML 12 #define ERROR_INTERNET_HANDLE_TYPE_HTTP_REQUEST 13 #define BYTE_1 1 #define BYTE_2 256 #define BYTE_3 65536 #define BYTE_4 16777216 #define MAXDWORD 4294967295 * * File Caching Flags * #define INTERNET_FLAG_DONT_CACHE 67108864 #define INTERNET_FLAG_HYPERLINK 1024 #define INTERNET_FLAG_MAKE_PERSISTENT 33554432 #define INTERNET_FLAG_MUST_CACHE_REQUEST 16 #define INTERNET_FLAG_RELOAD 2147483648 #define INTERNET_FLAG_NO_CACHE_WRITE 67108864 #define INTERNET_FLAG_RESYNCHRONIZE 2048 * * File Attributes * #define FILE_ATTRIBUTE_READONLY 1 #define FILE_ATTRIBUTE_HIDDEN 2 #define FILE_ATTRIBUTE_SYSTEM 4 #define FILE_ATTRIBUTE_DIRECTORY 16 #define FILE_ATTRIBUTE_ARCHIVE 32 #define FILE_ATTRIBUTE_ENCRYPTED 64 #define FILE_ATTRIBUTE_NORMAL 128 #define FILE_ATTRIBUTE_TEMPORARY 256 #define FILE_ATTRIBUTE_SPARSE_FILE 512 #define FILE_ATTRIBUTE_REPARSE_POINT 1024 #define FILE_ATTRIBUTE_COMPRESSED 2048 #define FILE_ATTRIBUTE_OFFLINE 4096 #define BIT_ATTRIBUTE_READONLY 0 #define BIT_ATTRIBUTE_HIDDEN 1 #define BIT_ATTRIBUTE_SYSTEM 2 #define BIT_ATTRIBUTE_DIRECTORY 4 #define BIT_ATTRIBUTE_ARCHIVE 5 #define BIT_ATTRIBUTE_ENCRYPTED 6 #define BIT_ATTRIBUTE_NORMAL 7 #define BIT_ATTRIBUTE_TEMPORARY 8 #define BIT_ATTRIBUTE_SPARSE_FILE 9 #define BIT_ATTRIBUTE_REPARSE_POINT 10 #define BIT_ATTRIBUTE_COMPRESSED 11 #define BIT_ATTRIBUTE_OFFLINE 12 * Flags for InternetAutodial #define INTERNET_AUTODIAL_FORCE_ONLINE 1 #define INTERNET_AUTODIAL_FORCE_UNATTENDED 2 #define INTERNET_AUTODIAL_FAILIFSECURITYCHECK 4 * * FTP *TYPE #define FTP_TRANSFER_TYPE_UNKNOWN 0 #define FTP_TRANSFER_TYPE_ASCII 1 #define FTP_TRANSFER_TYPE_BINARY 2 * Flags for InternetGetConnectedState #define INTERNET_CONNECTION_MODEM 1 #define INTERNET_CONNECTION_LAN 2 #define INTERNET_CONNECTION_PROXY 4 #define INTERNET_CONNECTION_MODEM_BUSY 8 #define FTP_TRANSFER_TYPE_MASK 3 && (FTP_TRANSFER_TYPE_ASCII | FTP_TRANSFER_TYPE_BINARY) * * Internet Variables #define INTERNET_DEFAULT FTP_PORT 21 #define INTERNET_SERVICE_FTP 1 #define INTERNET_OPEN_TYPE_DIRECT 1 #define INTERNET_CONNECT_FLAG_PASSIVE #define cNULL CHR(0) #define MAX_PATH 260 **************************************************** * Class Ftp_Service * **************************************************** DEFINE CLASS ftp_Service AS custom cIPAddress = "" cUserName = "" cPassword = "" cPort = "21" && Default FTP PORT nInet_Handle = 0 nConnect_Handle = 0 lDLL_Loaded = .F. nResult_Code = 0 nExtended_Result = 0 cExtended_Message = "" cCurrentDir = "" nCachingType = INTERNET_FLAG_DONT_CACHE cAgent = "Visual FoxPro" + cNULL **************************************************** PROCEDURE Init IF _DOS OR _UNIX OR _MAC RETURN .F. ENDIF ENDPROC **************************************************** PROCEDURE LoadAPIFuncs * Variables need for defines LOCAL lpcAgent, nAccessType, lpcProxyName, lpcProxyBypass, nFlags LOCAL nInet_Handle, nConnect_Handle, lpcServer, nPort, lpcUserName LOCAL lpcPassword, nService, nContext, nMax_Path LOCAL lpcDirectory, lpcFileName, lpcSearchStr, lpcWIN32_FIND_DATA LOCAL lpcRemoteFile, lpcNewFile, nFailIfExists, nAttributes LOCAL nError, lpcBuffer, nHandle, lpcDialUp * Check to see if We have already declared functions and loaded the DLL IF THIS.lDLL_Loaded RETURN ERROR_SUCCESS ENDIF * Declare a Kernel32 Functions DECLARE Integer GetLastError IN Kernel32 DECLARE Integer FileTimeToSystemTime IN Kernel32 ; String @lpcBuffer, String @lpcBuffer * Declare DLL functions used by Program DECLARE Integer InternetAutodial IN WinInet ; Integer nAccessType, Integer nHandle DECLARE Integer InternetAutodialHangup IN WinInet ; Integer nFlags DECLARE Integer InternetDial IN WinInet ; Integer nHandle, String @lpcDialUp, Integer nAccessType, Integer @nConnect_Handle, ; Integer nFlags DECLARE Integer InternetHangUp IN WinInet ; Integer nConnect_Handle, Integer nFlags DECLARE Integer InternetGetConnectedState IN WinInet ; Integer @nContext, Integer nFlags DECLARE Integer InternetGoOnline IN WinInet ; String @lpcURL, Integer nHandle, Integer nFlags DECLARE Integer InternetOpen IN WinInet ; String @lpcAgent, Integer nAccessType, String @lpcProxyName, ; String @lpcProxyBypass, Integer nFlags DECLARE Integer InternetConnect IN WinInet ; Integer nInet_Handle, String @lpcServer, Short nPort, String @lpcUserName, ; String @lpcPassword, Integer nService, Integer nFlags, Integer nContext DECLARE Integer InternetCloseHandle IN WinInet ; Integer nConnect_Handle * FTP Functions DECLARE Integer FtpCreateDirectory IN WinInet ; Integer nConnect_Handle, String @lpcDirectory DECLARE Integer FtpDeleteFile IN WinInet ; Integer nConnect_Handle, String @lpcFileName DECLARE Integer FtpFindFirstFile IN WinInet ; Integer nConnect_Handle, String @lpcSearchStr, String @lpcWIN32_FIND_DATA, ; Integer nFlags, Integer nContext DECLARE Integer InternetFindNextFile IN WinInet ; Integer nConnect_Handle, String @lpcWIN32_FIND_DATA DECLARE Integer FtpGetCurrentDirectory IN WinInet ; Integer nConnect_Handle, String @lpcDirectory, Integer @nMax_Path DECLARE Integer FtpGetFile IN WinInet ; Integer nConnect_Handle, String @lpcRemoteFile, String @lpcNewFile, ; Integer nFailIfExists, Integer nAttributes, Integer nFlags, ; Integer nContext DECLARE Integer FtpOpenFile IN WinInet ; Integer nConnect_Handle, String @lpcRemoteFile, Integer nAccessType, ; Integer nFlags, Integer nContext DECLARE Integer FtpPutFile IN WinInet ; Integer nConnect_Handle, String @lpcNewFile, String @lpcRemoteFile, ; Integer nFlags, Integer nContext DECLARE Integer FtpRemoveDirectory IN WinInet ; Integer nConnect_Handle, String @lpcDirectory DECLARE Integer FtpRenameFile IN WinInet ; Integer nConnect_Handle, String @lpcRemoteFile, String @lpcNewFile DECLARE Integer FtpSetCurrentDirectory IN WinInet ; Integer nConnect_Handle, String @lpcDirectory DECLARE Integer InternetGetLastResponseInfo IN WinInet ; Integer @nError, String @lpcBuffer, Integer @nMax_Path THIS.lDLL_Loaded = .T. RETURN ERROR_SUCCESS ENDPROC **************************************************** PROCEDURE AutoDialInternet LPARAMETERS lnType LOCAL lnHWNDHandle, fResult IF THIS.LoadAPIFuncs() != ERROR_SUCCESS RETURN .F. ENDIF IF TYPE(lnType) != "N" RETURN .F. ENDIF lnHWNDHandle = 0 fResult = InternetAutodial(lnType, lnHWNDHandle) THIS.GetExtendedError() IF fResult = 0 RETURN .F. ENDIF RETURN .T. ENDPROC **************************************************** PROCEDURE AutoDialHangUp LOCAL fResult IF THIS.LoadAPIFuncs() != ERROR_SUCCESS RETURN .F. ENDIF fResult = InternetAutoDialHangUp(0) THIS.GetExtendedError() IF fResult = 0 RETURN .F. ENDIF RETURN .T. ENDPROC **************************************************** PROCEDURE DialInternet LPARAMETERS lcDialUpName, lnFlag LOCAL fResult, lnConnectionID, lnHWNDHandle IF THIS.LoadAPIFuncs() != ERROR_SUCCESS RETURN -1 ENDIF lnConnectionID = 0 lnHWNDHandle = 0 IF TYPE("lcDialUpName") != "C" OR ; TYPE("lnFlag") != "N" RETURN -1 ENDIF IF LEN(ALLTRIM(lcDialUpName)) = 0 RETURN -1 ENDIF lcDialUpName = lcDialUpName + cNULL fResult = InternetDial(lnHWNDHandle, @lcDialUpName, lnFlag, @lnConnectionID, 0) THIS.GetExtendedError() RETURN lnConnectionID ENDPROC **************************************************** PROCEDURE DialHangUp LPARAMETERS lnConnectionID LOCAL fResult IF THIS.LoadAPIFuncs() != ERROR_SUCCESS RETURN -1 ENDIF IF TYPE("lnConnectionID") != "N" RETURN .F. ENDIF fResult = InternetHangUp(@lnConnectionID, 0) THIS.GetExtendedError() IF fResult = 0 RETURN .F. ELSE RETURN .T. ENDIF ENDPROC **************************************************** PROCEDURE GetConnectedState LOCAL fResult, lnConnectionState IF THIS.LoadAPIFuncs() != ERROR_SUCCESS RETURN -1 ENDIF lnConnectionState = 0 fResult = InternetGetConnectedState(@lnConnectionState, 0) THIS.GetExtendedError() IF fResult = 0 RETURN -1 ENDIF RETURN lnConnectionState ENDPROC **************************************************** PROCEDURE GoOnline LPARAMETERS lcURL LOCAL lnHWNDHandle, fResult IF THIS.LoadAPIFuncs() != ERROR_SUCCESS RETURN -1 ENDIF IF TYPE("lcURL") != "C" RETURN .F. ENDIF lcURL = lcURL + cNULL lnHWNDHandle = 0 fResult = InternetGoOnline(@lcURL, lnHWNDHandle, 0) THIS.GetExtendedError() IF fResult = 0 RETURN .F. ELSE RETURN .T. ENDIF ENDPROC **************************************************** PROCEDURE OpenInternet LPARAMETERS lcUserName, lcPassword, lcIPAddress, lcPort LOCAL lnPCount, fResult, lcTempDir, lnConnectHandle * Check Passed Parameters lnPCount = PARAMETERS() IF lnPCount <> 4 nResult_Code = ERROR_INTERNET_BAD_OPTION_LENGTH RETURN .F. ENDIF * Make sure parameters are of the correct type IF (TYPE("lcUserName") != "C") OR ; (TYPE("lcPassword") != "C") OR ; (TYPE("lcIPAddress") != "C") OR ; (TYPE("lcPort") != "C") nResult_Code = ERROR_INVALID_PARAMETER RETURN .F. ENDIF * Check Parameter Values IF EMPTY(lcUserName) OR EMPTY(lcPassword) OR EMPTY(lcIPAddress) nResult_Code = ERROR_INTERNET_BAD_OPTION_LENGTH RETURN .F. ENDIF IF THIS.LoadAPIFuncs() != ERROR_SUCCESS RETURN .F. ENDIF * Open Handle to Internet * Set Parameters THIS.cUserName = lcUserName + cNULL && Store FTP Connection information THIS.cPassword = lcPassword + cNULL THIS.cIPAddress = lcIPAddress + cNULL THIS.cPort = lcPort THIS.nInet_Handle = InternetOpen((THIS.cAgent), INTERNET_OPEN_TYPE_DIRECT, cNULL, cNULL, 0) THIS.GetExtendedError() * Unable to Get a Connection into the Internet IF THIS.nInet_Handle = 0 THIS.CloseFtp() RETURN .F. ENDIF * This Opens the FTP site and Gets the Current Directory. The handle to the FTP site is opened * and closed for each call to any function. * Open FTP Site lnConnect_Handle = InternetConnect(THIS.nInet_Handle, (THIS.cIPAddress), VAL(lcPort), ; (THIS.cUserName), (THIS.cPassword), INTERNET_SERVICE_FTP, 0, 0) THIS.GetExtendedError() IF lnConnect_Handle != 0 lcTempDir = SPACE(MAX_PATH) fResult = FtpGetCurrentDirectory(lnConnect_Handle, @lcTempDir, MAX_PATH) THIS.GetExtendedError() IF fResult != 0 THIS.cCurrentDir = lcTempDir InternetCloseHandle(lnConnect_Handle) ELSE RETURN .F. ENDIF ELSE RETURN .F. ENDIF RETURN .T. ENDPROC **************************************************** PROCEDURE OpenFtpConnection LOCAL nHandle, lnConnect_Handle, lcCurrentDir * Open FTP Site lnConnect_Handle = InternetConnect(THIS.nInet_Handle, (THIS.cIPAddress), VAL(THIS.cPort), ; (THIS.cUserName), (THIS.cPassword), INTERNET_SERVICE_FTP, 0, 0) THIS.GetExtendedError() lcCurrentDir = THIS.cCurrentDir IF lnConnect_Handle != 0 fResult = FtpSetCurrentDirectory(lnConnect_Handle, @lcCurrentDir) IF fResult = 1 THIS.nConnect_Handle = lnConnect_Handle RETURN .T. ELSE THIS.GetExtendedError() && Only Get extended Error information when there is an error RETURN .F. ENDIF ELSE RETURN .F. ENDIF ENDPROC **************************************************** PROCEDURE CloseFtpConnection IF THIS.nConnect_Handle != 0 InternetCloseHandle(THIS.nConnect_Handle) ENDIF THIS.nConnect_Handle = 0 RETURN ENDPROC **************************************************** PROCEDURE CloseInternet * Handles have a Hierarchy. Closing the Top Handle will close all child handles also. IF THIS.nInet_Handle != 0 InternetCloseHandle(THIS.nInet_Handle) THIS.nInet_Handle = 0 ENDIF ENDPROC **************************************************** PROCEDURE SetCachingMethod LPARAMETERS nCacheType LOCAL fResult fResult = .F. * only change caching type if we have a valid new cache type DO CASE CASE nCacheType = INTERNET_FLAG_DONT_CACHE THIS.nCachingType = INTERNET_FLAG_DONT_CACHE fResult = .T. CASE nCacheType = INTERNET_FLAG_HYPERLINK THIS.nCachingType = INTERNET_FLAG_HYPERLINK fResult = .T. CASE nCacheType = INTERNET_FLAG_MAKE_PERSISTENT THIS.nCachingType = INTERNET_FLAG_MAKE_PERSISTENT fResult = .T. CASE nCacheType = INTERNET_FLAG_MUST_CACHE_REQUEST THIS.nCachingType = INTERNET_FLAG_MUST_CACHE_REQUEST fResult = .T. CASE nCacheType = INTERNET_FLAG_RELOAD THIS.nCachingType = INTERNET_FLAG_RELOAD fResult = .T. CASE nCacheType = INTERNET_FLAG_NO_CACHE_WRITE THIS.nCachingType = INTERNET_FLAG_NO_CACHE_WRITE fResult = .T. CASE nCacheType = INTERNET_FLAG_RESYNCHRONIZE THIS.nCachingType = INTERNET_FLAG_RESYNCHRONIZE fResult = .T. ENDCASE RETURN fResult ENDPROC **************************************************** PROCEDURE GetCachingMethod RETURN THIS.nCachingType ENDPROC **************************************************** PROCEDURE GetFtpFile LPARAMETERS lcRemoteFile, lcNewFile, llFailIfExists LOCAL fResult, lnFail IF THIS.OpenFtpConnection() && Open an FTP Handle IF llFailIfExists lnFail = 1 ELSE lnFail = 0 ENDIF lcNewFile = lcNewFile + cNULL lcRemoteFile = lcRemoteFile + cNULL fResult = FtpGetFile(THIS.nConnect_Handle, @lcRemoteFile, @lcNewFile, lnFail, ; FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY + THIS.nCachingType, 0) THIS.GetExtendedError() THIS.CloseFtpConnection() && Close FTP Handle IF fResult = 1 RETURN .T. ELSE RETURN .F. ENDIF ENDIF ENDPROC **************************************************** PROCEDURE PutFtpFile LPARAMETERS lcRemoteFile, lclocalFile LOCAL fResult IF THIS.OpenFtpConnection() && Open an FTP Handle lcRemoteFile = lcRemoteFile + cNULL lcLocalFile = lcLocalFile + cNULL fResult = FtpPutFile(THIS.nConnect_Handle, @lcLocalFile, @lcRemoteFile, ; FTP_TRANSFER_TYPE_BINARY, 0) THIS.GetExtendedError() THIS.CloseFtpConnection() IF fResult = 1 RETURN .T. ELSE RETURN .F. ENDIF ENDIF ENDPROC **************************************************** PROCEDURE DeleteFtpFile LPARAMETERS lcRemoteFile LOCAL fResult IF THIS.OpenFtpConnection() && Open an FTP Handle lcRemoteFile = lcRemoteFile + cNULL fResult = FtpDeleteFile(THIS.nConnect_Handle, @lcRemoteFile) THIS.GetExtendedError() THIS.CloseFtpConnection() IF fResult = 1 RETURN .T. ELSE RETURN .F. ENDIF ENDIF ENDPROC **************************************************** PROCEDURE RenameFtpFile LPARAMETERS lcOldFile, lcNewFile LOCAL fResult IF THIS.OpenFtpConnection() && Open an FTP Handle lcOldFile = lcOldFile + cNULL lcNewFile = lcNewFile + cNULL fResult = FtpRenameFile(THIS.nConnect_Handle, @lcOldFile, @lcNewFile) THIS.GetExtendedError() THIS.CloseFtpConnection() IF fResult = 1 RETURN .T. ELSE RETURN .F. ENDIF ENDIF ENDPROC **************************************************** PROCEDURE CreateFtpDirectory LPARAMETERS lcNewDir LOCAL fResult IF THIS.OpenFtpConnection() && Open an FTP Handle lcNewDir = lcNewDir + cNULL fResult = FtpCreateDirectory(THIS.nConnect_Handle, @lcNewDir) THIS.GetExtendedError() THIS.CloseFtpConnection() IF fResult = 1 RETURN .T. ELSE RETURN .F. ENDIF ENDIF ENDPROC **************************************************** PROCEDURE RemoveFtpDirectory LPARAMETERS lcNewDir LOCAL fResult IF THIS.OpenFtpConnection() && Open an FTP Handle lcNewDir = lcNewDir + cNULL fResult = FtpRemoveDirectory(THIS.nConnect_Handle, @lcNewDir) THIS.GetExtendedError() THIS.CloseFtpConnection() IF fResult = 1 RETURN .T. ELSE RETURN .F. ENDIF ENDIF ENDPROC **************************************************** PROCEDURE ChangeFtpDirectory LPARAMETERS lcNewDir LOCAL fResult, lcTempDir, llResult IF THIS.OpenFtpConnection() && Open an FTP Handle llResult = .F. lcNewDir = lcNewDir + cNULL lcTempDir = SPACE(MAX_PATH) fResult = FtpSetCurrentDirectory(THIS.nConnect_Handle, @lcNewDir) THIS.GetExtendedError() IF fResult = 1 fResult = FtpGetCurrentDirectory(THIS.nConnect_Handle, @lcTempDir, MAX_PATH) THIS.GetExtendedError() IF fResult = 1 THIS.cCurrentDir = lcTempDir llResult = .T. ENDIF ENDIF THIS.CloseFtpConnection() RETURN llResult ENDIF ENDPROC **************************************************** PROCEDURE GetFtpDirectory LPARAMETERS lcDirectory LOCAL fResult, lcTempDir IF THIS.OpenFtpConnection() && Open an FTP Handle lcTempDir = SPACE(MAX_PATH) fResult = FtpGetCurrentDirectory(THIS.nConnect_Handle, @lcTempDir, MAX_PATH) THIS.GetExtendedError() lcDirectory = LEFT(lcTempDir, AT(cNULL, lcTempDir) - 1) THIS.CloseFtpConnection() IF fResult = 1 RETURN .T. ELSE RETURN .F. ENDIF ENDIF ENDPROC **************************************************** PROCEDURE GetFtpDirectoryArray LPARAMETERS laDirectory, lcMask LOCAL cStruct, llResult, lnCount, fResult, lffHandle IF THIS.OpenFtpConnection() && Open an FTP Handle lcMask = lcMask + cNULL * Dimension the array to store the directory * [x, 1] = FileName * [x, 2] = Alternate FileName * [x, 3] = File Size * [x, 4] = File Create Date * [x, 5] = File Last Access Time * [x, 6] = File Last Write Time * [x, 7] = File Attributes DIMENSION laDirectory [1, 7] laDirectory [1, 1] = .F. * This is for a FoxPro Quirk. lcStruct = SPACE(319) && Allocate space for the returned structure * Get the first file or find out if lffHandle = FtpFindFirstFile(THIS.nConnect_Handle, @lcMask, @lcStruct, 0, 0) THIS.GetExtendedError() IF lffHandle = 0 OR THIS.nResult_Code = ERROR_NO_MORE_FILES THIS.CloseFtpConnection() RETURN .F. ENDIF * Parse out First File Information THIS.CrackFile(lcStruct, @laDirectory) llResult = 1 DO WHILE THIS.nResult_Code != ERROR_NO_MORE_FILES AND llResult != 0 lcStruct = SPACE(319) * Get next files llResult = InternetFindNextFile(lffHandle, @lcStruct) THIS.GetExtendedError() * If we got good information, go ahead and parse it IF THIS.nResult_Code != ERROR_NO_MORE_FILES AND llResult != 0 THIS.CrackFile(lcStruct, @laDirectory) ENDIF ENDDO THIS.CloseFtpConnection() ELSE RETURN .F. && Unable to get FTP Connection ENDIF RETURN .T. ENDPROC **************************************************** PROCEDURE GetErrorCode LPARAMETERS llShowMessage LOCAL lcMessage IF llShowMessage = .T. * Build Error Message Here lcMessage = "Error (" + ALLTRIM(STR(THIS.nResult_Code)) + ") - " + ; THIS.GetErrorText(THIS.nResult_Code) IF !EMPTY(THIS.cExtended_Message) lcMessage = lcMessage + CHR(13) + CHR(13) + "Extended Error Info - (" + ; ALLTRIM(STR(THIS.nExtended_Result)) + ; ") - " + THIS.cExtended_Message ENDIF MessageBox(lcMessage, 48, "FTP Error Message") ENDIF RETURN THIS.nResult_Code ENDPROC **************************************************** PROCEDURE GetExtendedErrorCode RETURN THIS.nExtended_Result ENDPROC **************************************************** PROCEDURE GetExtendedErrorMsg RETURN THIS.cExtended_Message ENDPROC **************************************************** PROCEDURE CrackFile LPARAMETERS lcString, laDirectory LOCAL lcFileName, lcAlterName, lnSizeHigh, lnSizeLow, lnFileSize, ; lcAttributes, lnArrayLen, lcTimeBuff, ; ldCreateDate, ldAccessDate, ldWriteDate, laNewArray, lnResult IF TYPE('laDirectory[1, 1]') = 'L' && Array Has Not Been Filed * Force Record size of 1 DIMENSION laDirectory [1, 7] ELSE * Expand Array DIMENSION laDirectory [ALEN(laDirectory, 1) + 1, 7] ENDIF * Get new Array Position lnArrayLen = ALEN(laDirectory, 1) lcFileName = SUBSTR(lcString, 45, MAX_PATH) lcAlterName = RIGHT(lcString, 14) lcFileName = LEFT(lcFileName, AT(cNull, lcFileName) - 1) && Copy out just the File Name Text lcAlterName = LEFT(lcAlterName, AT(cNull, lcAlterName) - 1) * Convert File Size DWORDs lnSizeHigh = (ASC(SUBSTR(lcString, 29, 1)) * BYTE_1) + ; (ASC(SUBSTR(lcString, 30, 1)) * BYTE_2) + ; (ASC(SUBSTR(lcString, 31, 1)) * BYTE_3) + ; (ASC(SUBSTR(lcString, 32, 1)) * BYTE_4) lnSizeLow = (ASC(SUBSTR(lcString, 33, 1)) * BYTE_1) + ; (ASC(SUBSTR(lcString, 34, 1)) * BYTE_2) + ; (ASC(SUBSTR(lcString, 35, 1)) * BYTE_3) + ; (ASC(SUBSTR(lcString, 36, 1)) * BYTE_4) * Build File Size lnFileSize = (lnSizeHigh * MAXDWORD) + lnSizeLow * Convert File Date * Get File Create DateTime lcTimeBuff = SUBSTR(lcString, 5, 8) ldCreateDate = THIS.CrackDate(lcTimeBuff) * Get File Create DateTime lcTimeBuff = SUBSTR(lcString, 13, 8) ldAccessDate = THIS.CrackDate(lcTimeBuff) * Get File Create DateTime lcTimeBuff = SUBSTR(lcString, 21, 8) ldWriteDate = THIS.CrackDate(lcTimeBuff) * Get File Attributes lcAttributes = THIS.CrackAttributes(LEFT(lcString, 4)) laDirectory[lnArrayLen, 1] = ALLTRIM(lcFileName) laDirectory[lnArrayLen, 2] = ALLTRIM(lcAlterName) laDirectory[lnArrayLen, 3] = lnFileSize laDirectory[lnArrayLen, 4] = ldCreateDate laDirectory[lnArrayLen, 5] = ldAccessDate laDirectory[lnArrayLen, 6] = ldWriteDate laDirectory[lnArrayLen, 7] = lcAttributes RETURN ENDPROC **************************************************** PROCEDURE CrackDate LPARAMETERS lcOutBuffer LOCAL lcInBuffer, ldDateTime, fResult, lcBuild, ; lnDay, lnMonth, lnYear, lnHour, lnMinute, lnSecond lcInBuffer = SPACE(16) fResult = FileTimeToSystemTime(@lcOutBuffer, @lcInBuffer) THIS.GetExtendedError() IF fResult = 0 && Failed ldDateTime = {^1901/01/01 00:00:01} && Default Time RETURN ldDateTime ENDIF lnYear = ASC(SUBSTR(lcInBuffer, 1, 1)) + (ASC(SUBSTR(lcInBuffer, 2, 1)) * BYTE_2) lnMonth = ASC(SUBSTR(lcInBuffer, 3, 1)) + (ASC(SUBSTR(lcInBuffer, 4, 1)) * BYTE_2) lnDay = ASC(SUBSTR(lcInBuffer, 7, 1)) + (ASC(SUBSTR(lcInBuffer, 8, 1)) * BYTE_2) lnHour = ASC(SUBSTR(lcInBuffer, 9, 1)) + (ASC(SUBSTR(lcInBuffer, 10, 1)) * BYTE_2) lnMinute = ASC(SUBSTR(lcInBuffer, 11, 1)) + (ASC(SUBSTR(lcInBuffer, 12, 1)) * BYTE_2) lnSecond = ASC(SUBSTR(lcInBuffer, 13, 1)) + (ASC(SUBSTR(lcInBuffer, 13, 1)) * BYTE_2) lcBuild = "^" + ALLTRIM(STR(lnYear)) + '/' + ALLTRIM(STR(lnMonth)) + '/' + ALLTRIM(STR(lnDay)) + ' ' + ; ALLTRIM(STR(lnHour)) + ':' + ALLTRIM(STR(lnMinute)) + ':' + ALLTRIM(STR(lnSecond)) ldDateTime = {&lcBuild} RETURN ldDateTime ENDPROC **************************************************** PROCEDURE CrackAttributes LPARAMETERS lcBuffer LOCAL lcAttributes, lnValue lcAttributes = '' lnValue = (ASC(SUBSTR(lcBuffer, 1, 1)) * BYTE_1) + ; (ASC(SUBSTR(lcBuffer, 2, 1)) * BYTE_2) + ; (ASC(SUBSTR(lcBuffer, 3, 1)) * BYTE_3) + ; (ASC(SUBSTR(lcBuffer, 4, 1)) * BYTE_4) DO CASE CASE BITTEST(lnValue, BIT_ATTRIBUTE_READONLY) lcAttributes = lcAttributes + 'R' CASE BITTEST(lnValue, BIT_ATTRIBUTE_HIDDEN) lcAttributes = lcAttributes + 'H' CASE BITTEST(lnValue, BIT_ATTRIBUTE_SYSTEM) lcAttributes = lcAttributes + 'S' CASE BITTEST(lnValue, BIT_ATTRIBUTE_DIRECTORY) lcAttributes = lcAttributes + 'D' CASE BITTEST(lnValue, BIT_ATTRIBUTE_ARCHIVE) lcAttributes = lcAttributes + 'A' CASE BITTEST(lnValue, BIT_ATTRIBUTE_NORMAL) lcAttributes = lcAttributes + 'N' CASE BITTEST(lnValue, BIT_ATTRIBUTE_TEMPORARY) lcAttributes = lcAttributes + 'T' CASE BITTEST(lnValue, BIT_ATTRIBUTE_COMPRESSED) lcAttributes = lcAttributes + 'C' CASE BITTEST(lnValue, BIT_ATTRIBUTE_OFFLINE) lcAttributes = lcAttributes + 'O' ENDCASE RETURN lcAttributes ENDPROC **************************************************** PROCEDURE GetExtendedError LOCAL lcMessage, lnError, lcBuffer THIS.nResult_Code = GetLastError() lnError = 0 lcBuffer = SPACE(MAX_PATH) InternetGetLastResponseInfo(lnError, @lcBuffer, MAX_PATH) THIS.nExtended_Result = lnError THIS.cExtended_Message = LEFT(lcBuffer, AT(cNULL, lcBuffer) - 1) RETURN ENDPROC **************************************************** PROCEDURE GetErrorText LPARAMETERS lnError LOCAL lcMessage DO CASE CASE lnError = ERROR_INTERNET_OUT_OF_HANDLES lcMessage = "ERROR_INTERNET_OUT_OF_HANDLES" CASE lnError = ERROR_INTERNET_TIMEOUT lcMessage = "ERROR_INTERNET_TIMEOUT" CASE lnError = ERROR_INTERNET_EXTENDED_ERROR lcMessage = "ERROR_INTERNET_EXTENDED_ERROR" CASE lnError = ERROR_INTERNET_INTERNAL_ERROR lcMessage = "ERROR_INTERNET_INTERNAL_ERROR" CASE lnError = ERROR_INTERNET_INVALID_URL lcMessage = "ERROR_INTERNET_INVALID_URL" CASE lnError = ERROR_INTERNET_UNRECOGNIZED_SCHEME lcMessage = "ERROR_INTERNET_UNRECOGNIZED_SCHEME" CASE lnError = ERROR_INTERNET_NAME_NOT_RESOLVED lcMessage = "ERROR_INTERNET_NAME_NOT_RESOLVED" CASE lnError = ERROR_INTERNET_PROTOCOL_NOT_FOUND lcMessage = "ERROR_INTERNET_PROTOCOL_NOT_FOUND" CASE lnError = ERROR_INTERNET_INVALID_OPTION lcMessage = "ERROR_INTERNET_INVALID_OPTION" CASE lnError = ERROR_INTERNET_BAD_OPTION_LENGTH lcMessage = "ERROR_INTERNET_BAD_OPTION_LENGTH" CASE lnError = ERROR_INTERNET_OPTION_NOT_SETTABLE lcMessage = "ERROR_INTERNET_OPTION_NOT_SETTABLE" CASE lnError = ERROR_INTERNET_SHUTDOWN lcMessage = "ERROR_INTERNET_SHUTDOWN" CASE lnError = ERROR_INTERNET_INCORRECT_USER_NAME lcMessage = "ERROR_INTERNET_INCORRECT_USER_NAME" CASE lnError = ERROR_INTERNET_INCORRECT_PASSWORD lcMessage = "ERROR_INTERNET_INCORRECT_PASSWORD" CASE lnError = ERROR_INTERNET_LOGIN_FAILURE lcMessage = "ERROR_INTERNET_LOGIN_FAILURE" CASE lnError = ERROR_INTERNET_INVALID_OPERATION lcMessage = "ERROR_INTERNET_INVALID_OPERATION" CASE lnError = ERROR_INTERNET_OPERATION_CANCELLED lcMessage = "ERROR_INTERNET_OPERATION_CANCELLED" CASE lnError = ERROR_INTERNET_INCORRECT_HANDLE_TYPE lcMessage = "ERROR_INTERNET_INCORRECT_HANDLE_TYPE" CASE lnError = ERROR_INTERNET_INCORRECT_HANDLE_STATE lcMessage = "ERROR_INTERNET_INCORRECT_HANDLE_STATE" CASE lnError = ERROR_INTERNET_NOT_PROXY_REQUEST lcMessage = "ERROR_INTERNET_NOT_PROXY_REQUEST" CASE lnError = ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND lcMessage = "ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND" CASE lnError = ERROR_INTERNET_BAD_REGISTRY_PARAMETER lcMessage = "ERROR_INTERNET_BAD_REGISTRY_PARAMETER" CASE lnError = ERROR_INTERNET_NO_DIRECT_ACCESS lcMessage = "ERROR_INTERNET_NO_DIRECT_ACCESS" CASE lnError = ERROR_INTERNET_NO_CONTEXT lcMessage = "ERROR_INTERNET_NO_CONTEXT" CASE lnError = ERROR_INTERNET_NO_CALLBACK lcMessage = "ERROR_INTERNET_NO_CALLBACK" CASE lnError = ERROR_INTERNET_REQUEST_PENDING lcMessage = "ERROR_INTERNET_REQUEST_PENDING" CASE lnError = ERROR_INTERNET_INCORRECT_FORMAT lcMessage = "ERROR_INTERNET_INCORRECT_FORMAT" CASE lnError = ERROR_INTERNET_ITEM_NOT_FOUND lcMessage = "ERROR_INTERNET_ITEM_NOT_FOUND" CASE lnError = ERROR_INTERNET_CANNOT_CONNECT lcMessage = "ERROR_INTERNET_CANNOT_CONNECT" CASE lnError = ERROR_INTERNET_CONNECTION_ABORTED lcMessage = "ERROR_INTERNET_CONNECTION_ABORTED" CASE lnError = ERROR_INTERNET_CONNECTION_RESET lcMessage = "ERROR_INTERNET_CONNECTION_RESET" CASE lnError = ERROR_INTERNET_FORCE_RETRY lcMessage = "ERROR_INTERNET_FORCE_RETRY" CASE lnError = ERROR_INTERNET_INVALID_PROXY_REQUEST lcMessage = "ERROR_INTERNET_INVALID_PROXY_REQUEST" CASE lnError = ERROR_INTERNET_NEED_UI lcMessage = "ERROR_INTERNET_NEED_UI" CASE lnError = ERROR_INTERNET_HANDLE_EXISTS lcMessage = "ERROR_INTERNET_HANDLE_EXISTS" CASE lnError = ERROR_INTERNET_SEC_CERT_DATE_INVALID lcMessage = "ERROR_INTERNET_SEC_CERT_DATE_INVALID" CASE lnError = ERROR_INTERNET_SEC_CERT_CN_INVALID lcMessage = "ERROR_INTERNET_SEC_CERT_CN_INVALID" CASE lnError = ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR lcMessage = "ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR" CASE lnError = ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR lcMessage = "ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR" CASE lnError = ERROR_INTERNET_MIXED_SECURITY lcMessage = "ERROR_INTERNET_MIXED_SECURITY" CASE lnError = ERROR_INTERNET_CHG_POST_IS_NON_SECURE lcMessage = "ERROR_INTERNET_CHG_POST_IS_NON_SECURE" CASE lnError = ERROR_INTERNET_POST_IS_NON_SECURE lcMessage = "ERROR_INTERNET_POST_IS_NON_SECURE" CASE lnError = ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED lcMessage = "ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED" CASE lnError = ERROR_INTERNET_INVALID_CA lcMessage = "ERROR_INTERNET_INVALID_CA" CASE lnError = ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP lcMessage = "ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP" CASE lnError = ERROR_INTERNET_ASYNC_THREAD_FAILED lcMessage = "ERROR_INTERNET_ASYNC_THREAD_FAILED" CASE lnError = ERROR_INTERNET_REDIRECT_SCHEME_CHANGE lcMessage = "ERROR_INTERNET_REDIRECT_SCHEME_CHANGE" CASE lnError = ERROR_INTERNET_DIALOG_PENDING lcMessage = "ERROR_INTERNET_DIALOG_PENDING" CASE lnError = ERROR_INTERNET_RETRY_DIALOG lcMessage = "ERROR_INTERNET_RETRY_DIALOG" CASE lnError = ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR lcMessage = "ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR" CASE lnError = ERROR_INTERNET_INSERT_CDROM lcMessage = "ERROR_INTERNET_INSERT_CDROM" CASE lnError = FTP_TRANSFER_IN_PROGRESS lcMessage = "FTP_TRANSFER_IN_PROGRESS" CASE lnError = FTP_DROPPED lcMessage = "FTP_DROPPED" CASE lnError = FTP_NO_PASSIVE_MODE lcMessage = "FTP_NO_PASSIVE_MODE" CASE lnError = ERROR_INTERNET_SECURITY_CHANNEL_ERROR lcMessage = "ERROR_INTERNET_SECURITY_CHANNEL_ERROR" CASE lnError = ERROR_INTERNET_UNABLE_TO_CACHE_FILE lcMessage = "ERROR_INTERNET_UNABLE_TO_CACHE_FILE" CASE lnError = ERROR_INTERNET_TCPIP_NOT_INSTALLED lcMessage = "ERROR_INTERNET_TCPIP_NOT_INSTALLED" CASE lnError = ERROR_INTERNET_DISCONNECTED lcMessage = "ERROR_INTERNET_DISCONNECTED" CASE lnError = ERROR_INTERNET_SERVER_UNREACHABLE lcMessage = "ERROR_INTERNET_SERVER_UNREACHABLE" CASE lnError = ERROR_INTERNET_PROXY_SERVER_UNREACHABLE lcMessage = "ERROR_INTERNET_PROXY_SERVER_UNREACHABLE" CASE lnError = ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT lcMessage = "ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT" CASE lnError = ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT lcMessage = "ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT" CASE lnError = ERROR_INTERNET_SEC_INVALID_CERT lcMessage = "ERROR_INTERNET_SEC_INVALID_CERT" CASE lnError = ERROR_INTERNET_SEC_CERT_REVOKED lcMessage = "ERROR_INTERNET_SEC_CERT_REVOKED" CASE lnError = ERROR_NO_MORE_FILES lcMessage = "ERROR_NO_MORE_FILES" CASE lnError = ERROR_INVALID_HANDLE lcMessage = "ERROR_INVALID_HANDLE" CASE lnError = ERROR_FILE_NOT_FOUND lcMessage = "ERROR_FILE_NOT_FOUND" CASE lnError = ERROR_PATH_NOT_FOUND lcMessage = "ERROR_PATH_NOT_FOUND" CASE lnError = ERROR_ACCESS_DENIED lcMessage = "ERROR_ACCESS_DENIED" CASE lnError = ERROR_FILE_EXISTS lcMessage = "ERROR_FILE_EXISTS" CASE lnError = ERROR_INVALID_PARAMETER lcMessage = "ERROR_INVALID_PARAMETER" OTHERWISE lcMessage = "Unknown Error Message" ENDCASE RETURN lcMessage ENDPROC ENDDEFINE && End Class Define