home *** CD-ROM | disk | FTP | other *** search
/ business-86-101-185-173.business.broadband.hu / business-86-101-185-173.business.broadband.hu.zip / business-86-101-185-173.business.broadband.hu / ftpclass.zip / ftp.PRG < prev    next >
Text File  |  2004-03-23  |  49KB  |  1,358 lines

  1. **********************************************************
  2. *  FTP Services for Visual Foxpro 5.0+                   *
  3. *  Written by: Robert Abram                              *
  4. *  Date: Sept 1998                                       *
  5. *                                                        *
  6. *  Revision 1.1a                                         *
  7. *                                                        *
  8. *  wininet.dll needs to be in the windows/system         *
  9. *  directory.                                            *
  10. *                                                        *
  11. *  Updated 8/6/02 - Minor Fixes                          *
  12. *                                                        *
  13. *  Updated 3/16/99 - Changed Date Usage to comply with   *
  14. *                    Strict Date handling.               *
  15. *                                                         *
  16. *  Added 3/16/99 Functions - AutoDialInternet            *
  17. *                            AutoDialHangUp              *
  18. *                            DialInternet                *
  19. *                            DialHangUp                  *
  20. *                            GetConnectedState           *
  21. *                            GoOnline                    *
  22. **********************************************************
  23.  
  24.      *
  25.     * Internet API Returns
  26.     *
  27.     #define ERROR_SUCCESS                              0
  28.     #define ERROR_FILE_NOT_FOUND                       2
  29.     #define ERROR_PATH_NOT_FOUND                       3
  30.     #define ERROR_ACCESS_DENIED                        5
  31.     #define ERROR_INVALID_HANDLE                       6
  32.     #define ERROR_NO_MORE_FILES                          18
  33.     #define ERROR_FILE_EXISTS                          80
  34.     #define ERROR_INVALID_PARAMETER                    87
  35.  
  36.  
  37.     #define ERROR_INTERNET_BASE                       12000
  38.  
  39.     #define ERROR_INTERNET_OUT_OF_HANDLES             (ERROR_INTERNET_BASE + 1)
  40.     #define ERROR_INTERNET_TIMEOUT                    (ERROR_INTERNET_BASE + 2)
  41.     #define ERROR_INTERNET_EXTENDED_ERROR             (ERROR_INTERNET_BASE + 3)
  42.     #define ERROR_INTERNET_INTERNAL_ERROR             (ERROR_INTERNET_BASE + 4)
  43.     #define ERROR_INTERNET_INVALID_URL                (ERROR_INTERNET_BASE + 5)
  44.     #define ERROR_INTERNET_UNRECOGNIZED_SCHEME        (ERROR_INTERNET_BASE + 6)
  45.     #define ERROR_INTERNET_NAME_NOT_RESOLVED          (ERROR_INTERNET_BASE + 7)
  46.     #define ERROR_INTERNET_PROTOCOL_NOT_FOUND         (ERROR_INTERNET_BASE + 8)
  47.     #define ERROR_INTERNET_INVALID_OPTION             (ERROR_INTERNET_BASE + 9)
  48.     #define ERROR_INTERNET_BAD_OPTION_LENGTH          (ERROR_INTERNET_BASE + 10)
  49.     #define ERROR_INTERNET_OPTION_NOT_SETTABLE        (ERROR_INTERNET_BASE + 11)
  50.     #define ERROR_INTERNET_SHUTDOWN                   (ERROR_INTERNET_BASE + 12)
  51.     #define ERROR_INTERNET_INCORRECT_USER_NAME        (ERROR_INTERNET_BASE + 13)
  52.     #define ERROR_INTERNET_INCORRECT_PASSWORD         (ERROR_INTERNET_BASE + 14)
  53.     #define ERROR_INTERNET_LOGIN_FAILURE              (ERROR_INTERNET_BASE + 15)
  54.     #define ERROR_INTERNET_INVALID_OPERATION          (ERROR_INTERNET_BASE + 16)
  55.     #define ERROR_INTERNET_OPERATION_CANCELLED        (ERROR_INTERNET_BASE + 17)
  56.     #define ERROR_INTERNET_INCORRECT_HANDLE_TYPE      (ERROR_INTERNET_BASE + 18)
  57.     #define ERROR_INTERNET_INCORRECT_HANDLE_STATE     (ERROR_INTERNET_BASE + 19)
  58.     #define ERROR_INTERNET_NOT_PROXY_REQUEST          (ERROR_INTERNET_BASE + 20)
  59.     #define ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND   (ERROR_INTERNET_BASE + 21)
  60.     #define ERROR_INTERNET_BAD_REGISTRY_PARAMETER     (ERROR_INTERNET_BASE + 22)
  61.     #define ERROR_INTERNET_NO_DIRECT_ACCESS           (ERROR_INTERNET_BASE + 23)
  62.     #define ERROR_INTERNET_NO_CONTEXT                 (ERROR_INTERNET_BASE + 24)
  63.     #define ERROR_INTERNET_NO_CALLBACK                (ERROR_INTERNET_BASE + 25)
  64.     #define ERROR_INTERNET_REQUEST_PENDING            (ERROR_INTERNET_BASE + 26)
  65.     #define ERROR_INTERNET_INCORRECT_FORMAT           (ERROR_INTERNET_BASE + 27)
  66.     #define ERROR_INTERNET_ITEM_NOT_FOUND             (ERROR_INTERNET_BASE + 28)
  67.     #define ERROR_INTERNET_CANNOT_CONNECT             (ERROR_INTERNET_BASE + 29)
  68.     #define ERROR_INTERNET_CONNECTION_ABORTED         (ERROR_INTERNET_BASE + 30)
  69.     #define ERROR_INTERNET_CONNECTION_RESET           (ERROR_INTERNET_BASE + 31)
  70.     #define ERROR_INTERNET_FORCE_RETRY                (ERROR_INTERNET_BASE + 32)
  71.     #define ERROR_INTERNET_INVALID_PROXY_REQUEST      (ERROR_INTERNET_BASE + 33)
  72.     #define ERROR_INTERNET_NEED_UI                    (ERROR_INTERNET_BASE + 34)
  73.  
  74.     #define ERROR_INTERNET_HANDLE_EXISTS              (ERROR_INTERNET_BASE + 36)
  75.     #define ERROR_INTERNET_SEC_CERT_DATE_INVALID      (ERROR_INTERNET_BASE + 37)
  76.     #define ERROR_INTERNET_SEC_CERT_CN_INVALID        (ERROR_INTERNET_BASE + 38)
  77.     #define ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR     (ERROR_INTERNET_BASE + 39)
  78.     #define ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR     (ERROR_INTERNET_BASE + 40)
  79.     #define ERROR_INTERNET_MIXED_SECURITY             (ERROR_INTERNET_BASE + 41)
  80.     #define ERROR_INTERNET_CHG_POST_IS_NON_SECURE     (ERROR_INTERNET_BASE + 42)
  81.     #define ERROR_INTERNET_POST_IS_NON_SECURE         (ERROR_INTERNET_BASE + 43)
  82.     #define ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED    (ERROR_INTERNET_BASE + 44)
  83.     #define ERROR_INTERNET_INVALID_CA                 (ERROR_INTERNET_BASE + 45)
  84.     #define ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP      (ERROR_INTERNET_BASE + 46)
  85.     #define ERROR_INTERNET_ASYNC_THREAD_FAILED        (ERROR_INTERNET_BASE + 47)
  86.     #define ERROR_INTERNET_REDIRECT_SCHEME_CHANGE     (ERROR_INTERNET_BASE + 48)
  87.     #define ERROR_INTERNET_DIALOG_PENDING             (ERROR_INTERNET_BASE + 49)
  88.     #define ERROR_INTERNET_RETRY_DIALOG               (ERROR_INTERNET_BASE + 50)
  89.     #define ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR    (ERROR_INTERNET_BASE + 52)
  90.     #define ERROR_INTERNET_INSERT_CDROM               (ERROR_INTERNET_BASE + 53)
  91.  
  92.  
  93.     *
  94.     * FTP API errors
  95.     *
  96.  
  97.     #define FTP_TRANSFER_IN_PROGRESS                  (ERROR_INTERNET_BASE + 110)
  98.     #define FTP_DROPPED                               (ERROR_INTERNET_BASE + 111)
  99.     #define FTP_NO_PASSIVE_MODE                       (ERROR_INTERNET_BASE + 112)
  100.  
  101.  
  102.     *
  103.     * additional Internet API error codes
  104.     *
  105.  
  106.     #define ERROR_INTERNET_SECURITY_CHANNEL_ERROR     (ERROR_INTERNET_BASE + 157)
  107.     #define ERROR_INTERNET_UNABLE_TO_CACHE_FILE       (ERROR_INTERNET_BASE + 158)
  108.     #define ERROR_INTERNET_TCPIP_NOT_INSTALLED        (ERROR_INTERNET_BASE + 159)
  109.     #define ERROR_INTERNET_DISCONNECTED               (ERROR_INTERNET_BASE + 163)
  110.     #define ERROR_INTERNET_SERVER_UNREACHABLE         (ERROR_INTERNET_BASE + 164)
  111.     #define ERROR_INTERNET_PROXY_SERVER_UNREACHABLE   (ERROR_INTERNET_BASE + 165)
  112.  
  113.     #define ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT      (ERROR_INTERNET_BASE + 166)
  114.     #define ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT  (ERROR_INTERNET_BASE + 167)
  115.     #define ERROR_INTERNET_SEC_INVALID_CERT              (ERROR_INTERNET_BASE + 169)
  116.     #define ERROR_INTERNET_SEC_CERT_REVOKED              (ERROR_INTERNET_BASE + 170)
  117.  
  118.     *
  119.     * handle types
  120.     *
  121.  
  122.     #define ERROR_INTERNET_HANDLE_TYPE_INTERNET              1
  123.     #define ERROR_INTERNET_HANDLE_TYPE_CONNECT_FTP           2
  124.     #define ERROR_INTERNET_HANDLE_TYPE_CONNECT_GOPHER        3
  125.     #define ERROR_INTERNET_HANDLE_TYPE_CONNECT_HTTP          4
  126.     #define ERROR_INTERNET_HANDLE_TYPE_FTP_FIND              5
  127.     #define ERROR_INTERNET_HANDLE_TYPE_FTP_FIND_HTML         6
  128.     #define ERROR_INTERNET_HANDLE_TYPE_FTP_FILE              7
  129.     #define ERROR_INTERNET_HANDLE_TYPE_FTP_FILE_HTML         8
  130.     #define ERROR_INTERNET_HANDLE_TYPE_GOPHER_FIND           9
  131.     #define ERROR_INTERNET_HANDLE_TYPE_GOPHER_FIND_HTML      10
  132.     #define ERROR_INTERNET_HANDLE_TYPE_GOPHER_FILE           11
  133.     #define ERROR_INTERNET_HANDLE_TYPE_GOPHER_FILE_HTML      12
  134.     #define ERROR_INTERNET_HANDLE_TYPE_HTTP_REQUEST          13
  135.  
  136.     
  137.     
  138.     #define BYTE_1                                             1
  139.     #define BYTE_2                                           256
  140.     #define BYTE_3                                           65536
  141.     #define BYTE_4                                           16777216
  142.     #define MAXDWORD                                         4294967295
  143.     
  144.     *
  145.     * File Caching Flags
  146.     *
  147.     
  148.     #define INTERNET_FLAG_DONT_CACHE                         67108864
  149.     #define INTERNET_FLAG_HYPERLINK                             1024
  150.     #define INTERNET_FLAG_MAKE_PERSISTENT                     33554432
  151.     #define INTERNET_FLAG_MUST_CACHE_REQUEST                 16
  152.     #define INTERNET_FLAG_RELOAD                             2147483648
  153.     #define INTERNET_FLAG_NO_CACHE_WRITE                     67108864
  154.     #define INTERNET_FLAG_RESYNCHRONIZE                         2048
  155.     
  156.     *
  157.     * File Attributes
  158.     *
  159.     
  160.     #define FILE_ATTRIBUTE_READONLY                          1
  161.     #define FILE_ATTRIBUTE_HIDDEN                            2
  162.     #define FILE_ATTRIBUTE_SYSTEM                               4
  163.     #define FILE_ATTRIBUTE_DIRECTORY                         16  
  164.     #define FILE_ATTRIBUTE_ARCHIVE                              32  
  165.     #define FILE_ATTRIBUTE_ENCRYPTED                         64 
  166.     #define FILE_ATTRIBUTE_NORMAL                            128  
  167.     #define FILE_ATTRIBUTE_TEMPORARY                         256  
  168.     #define FILE_ATTRIBUTE_SPARSE_FILE                       512
  169.     #define FILE_ATTRIBUTE_REPARSE_POINT                     1024    
  170.     #define FILE_ATTRIBUTE_COMPRESSED                        2048  
  171.     #define FILE_ATTRIBUTE_OFFLINE                           4096
  172.     
  173.     
  174.     #define BIT_ATTRIBUTE_READONLY                               0
  175.     #define BIT_ATTRIBUTE_HIDDEN                                 1
  176.     #define BIT_ATTRIBUTE_SYSTEM                               2
  177.     #define BIT_ATTRIBUTE_DIRECTORY                              4  
  178.     #define BIT_ATTRIBUTE_ARCHIVE                                   5
  179.     #define BIT_ATTRIBUTE_ENCRYPTED                             6  
  180.     #define BIT_ATTRIBUTE_NORMAL                                 7  
  181.     #define BIT_ATTRIBUTE_TEMPORARY                              8
  182.     #define BIT_ATTRIBUTE_SPARSE_FILE                         9
  183.     #define BIT_ATTRIBUTE_REPARSE_POINT                      10  
  184.     #define BIT_ATTRIBUTE_COMPRESSED                             11  
  185.     #define BIT_ATTRIBUTE_OFFLINE                                12  
  186.     
  187.     
  188.     * Flags for InternetAutodial
  189.     #define INTERNET_AUTODIAL_FORCE_ONLINE                   1
  190.     #define INTERNET_AUTODIAL_FORCE_UNATTENDED               2
  191.     #define INTERNET_AUTODIAL_FAILIFSECURITYCHECK            4
  192.     
  193.     *
  194.     * FTP
  195.     *TYPE
  196.  
  197.     #define FTP_TRANSFER_TYPE_UNKNOWN                        0
  198.     #define FTP_TRANSFER_TYPE_ASCII                          1
  199.     #define FTP_TRANSFER_TYPE_BINARY                         2
  200.     
  201.     * Flags for InternetGetConnectedState
  202.     #define INTERNET_CONNECTION_MODEM                        1
  203.     #define INTERNET_CONNECTION_LAN                          2
  204.     #define INTERNET_CONNECTION_PROXY                        4
  205.     #define INTERNET_CONNECTION_MODEM_BUSY                   8
  206.  
  207.  
  208.     #define FTP_TRANSFER_TYPE_MASK                           3  && (FTP_TRANSFER_TYPE_ASCII | FTP_TRANSFER_TYPE_BINARY)
  209.  
  210.     *
  211.     * Internet Variables
  212.     
  213.     #define INTERNET_DEFAULT FTP_PORT                            21
  214.     #define INTERNET_SERVICE_FTP                             1
  215.     #define INTERNET_OPEN_TYPE_DIRECT                         1
  216.     
  217.     #define INTERNET_FLAG_PASSIVE                            0x08000000  
  218.     
  219.     #define cNULL                                             CHR(0)
  220.     #define MAX_PATH                                          260
  221.     
  222.  
  223.  
  224.   ****************************************************
  225.   * Class Ftp_Service                                *
  226.   ****************************************************
  227.     DEFINE CLASS ftp_Service AS custom OLEPUBLIC
  228.     
  229.         
  230.         cIPAddress             = ""
  231.         cUserName           = ""
  232.         cPassword           = ""
  233.         cPort                = "21"         && Default FTP PORT
  234.  
  235.         lPassive            = .T.        && Set to Passive Mode
  236.         
  237.         nInet_Handle         = 0
  238.         nConnect_Handle     = 0
  239.         lDLL_Loaded         = .F.
  240.         nResult_Code        = 0
  241.         nExtended_Result    = 0
  242.         cExtended_Message   = ""
  243.         cCurrentDir            = ""
  244.         
  245.         nCachingType        = INTERNET_FLAG_DONT_CACHE
  246.         
  247.         cAgent                 = "Visual FoxPro" + cNULL
  248.         
  249.                 
  250.       ****************************************************
  251.         PROCEDURE Init
  252.             IF _DOS OR _UNIX OR _MAC
  253.                 RETURN .F.
  254.             ENDIF
  255.         ENDPROC    
  256.     
  257.       ****************************************************
  258.         PROCEDURE LoadAPIFuncs
  259.         
  260.           * Variables need for defines
  261.            LOCAL lpcAgent, nAccessType, lpcProxyName, lpcProxyBypass, nFlags
  262.            LOCAL nInet_Handle, nConnect_Handle, lpcServer, nPort, lpcUserName
  263.            LOCAL lpcPassword, nService, nContext, nMax_Path
  264.            LOCAL lpcDirectory, lpcFileName, lpcSearchStr, lpcWIN32_FIND_DATA
  265.            LOCAL lpcRemoteFile, lpcNewFile, nFailIfExists, nAttributes
  266.            LOCAL nError, lpcBuffer, nHandle, lpcDialUp
  267.            
  268.            * Check to see if We have already declared functions and loaded the DLL
  269.                IF THIS.lDLL_Loaded  
  270.                    RETURN ERROR_SUCCESS
  271.                ENDIF
  272.                
  273.            * Declare a Kernel32 Functions
  274.                DECLARE Integer GetLastError IN Kernel32
  275.                
  276.                DECLARE Integer FileTimeToSystemTime IN Kernel32 ;
  277.                        String @lpcBuffer, String @lpcBuffer
  278.            
  279.            * Declare DLL functions used by Program
  280.                DECLARE Integer InternetAutodial IN WinInet ;
  281.                        Integer nAccessType, Integer nHandle
  282.                    
  283.                DECLARE Integer InternetAutodialHangup IN WinInet ;
  284.                        Integer nFlags
  285.                        
  286.                DECLARE Integer InternetDial IN WinInet ;
  287.                        Integer nHandle, String @lpcDialUp, Integer nAccessType, Integer @nConnect_Handle, ;
  288.                        Integer nFlags
  289.                
  290.                DECLARE Integer InternetHangUp IN WinInet ;
  291.                        Integer nConnect_Handle, Integer nFlags
  292.                        
  293.                DECLARE Integer InternetGetConnectedState IN WinInet ;
  294.                        Integer @nContext, Integer nFlags
  295.                        
  296.                DECLARE Integer InternetGoOnline IN WinInet ;
  297.                        String @lpcURL, Integer nHandle, Integer nFlags
  298.                        
  299.                DECLARE Integer InternetOpen IN WinInet ;
  300.                        String @lpcAgent, Integer nAccessType, String @lpcProxyName, ;
  301.                        String @lpcProxyBypass, Integer nFlags
  302.                        
  303.                DECLARE Integer InternetConnect IN WinInet ;
  304.                        Integer nInet_Handle, String @lpcServer, Short nPort, String @lpcUserName, ;
  305.                        String @lpcPassword, Integer nService, Integer nFlags, Integer nContext
  306.  
  307.                DECLARE Integer InternetCloseHandle IN WinInet ;
  308.                        Integer nConnect_Handle
  309.                        
  310.            * FTP Functions
  311.                DECLARE Integer FtpCreateDirectory IN WinInet ;
  312.                        Integer nConnect_Handle, String @lpcDirectory
  313.                        
  314.                DECLARE Integer FtpDeleteFile IN WinInet ;
  315.                        Integer nConnect_Handle, String @lpcFileName
  316.                
  317.                DECLARE Integer FtpFindFirstFile IN WinInet ;
  318.                        Integer nConnect_Handle, String @lpcSearchStr, String @lpcWIN32_FIND_DATA, ;
  319.                        Integer nFlags, Integer nContext
  320.                        
  321.                DECLARE Integer InternetFindNextFile IN WinInet ;
  322.                        Integer nConnect_Handle, String @lpcWIN32_FIND_DATA
  323.                        
  324.                DECLARE Integer FtpGetCurrentDirectory IN WinInet ;
  325.                        Integer nConnect_Handle, String @lpcDirectory, Integer @nMax_Path
  326.            
  327.                DECLARE Integer FtpGetFile IN WinInet ;
  328.                        Integer nConnect_Handle, String @lpcRemoteFile, String @lpcNewFile, ;
  329.                        Integer nFailIfExists, Integer nAttributes, Integer nFlags, ;
  330.                        Integer nContext
  331.                        
  332.                DECLARE Integer FtpOpenFile IN WinInet ;
  333.                        Integer nConnect_Handle, String @lpcRemoteFile, Integer nAccessType, ;
  334.                        Integer nFlags, Integer nContext
  335.                        
  336.                DECLARE Integer FtpPutFile IN WinInet ;
  337.                        Integer nConnect_Handle, String @lpcNewFile, String @lpcRemoteFile, ;
  338.                        Integer nFlags, Integer nContext
  339.                        
  340.                DECLARE Integer FtpRemoveDirectory IN WinInet ;
  341.                        Integer nConnect_Handle, String @lpcDirectory
  342.                        
  343.                DECLARE Integer FtpRenameFile IN WinInet ;
  344.                        Integer nConnect_Handle, String @lpcRemoteFile, String @lpcNewFile
  345.                        
  346.                DECLARE Integer FtpSetCurrentDirectory IN WinInet ;
  347.                        Integer nConnect_Handle, String @lpcDirectory
  348.                        
  349.                DECLARE Integer InternetGetLastResponseInfo IN WinInet ;
  350.                        Integer @nError, String @lpcBuffer, Integer @nMax_Path
  351.                        
  352.                THIS.lDLL_Loaded = .T.
  353.                
  354.                RETURN ERROR_SUCCESS    
  355.                    
  356.         ENDPROC
  357.         
  358.       ****************************************************
  359.           PROCEDURE AutoDialInternet
  360.               LPARAMETERS lnType
  361.               
  362.               LOCAL lnHWNDHandle, fResult
  363.                     
  364.                 IF THIS.LoadAPIFuncs() != ERROR_SUCCESS
  365.                       RETURN .F.
  366.                  ENDIF    
  367.                  
  368.                  IF TYPE(lnType) != "N" 
  369.                         RETURN .F.
  370.                  ENDIF
  371.                  
  372.                 lnHWNDHandle = 0              
  373.               
  374.                 fResult = InternetAutodial(lnType, lnHWNDHandle)
  375.                 THIS.GetExtendedError()
  376.               
  377.                 IF fResult = 0 
  378.                       RETURN .F.
  379.                 ENDIF
  380.                     
  381.               RETURN .T.
  382.                 
  383.           ENDPROC    
  384.           
  385.       ****************************************************
  386.           PROCEDURE AutoDialHangUp
  387.           
  388.               LOCAL fResult
  389.               
  390.                 IF THIS.LoadAPIFuncs() != ERROR_SUCCESS
  391.                       RETURN .F.
  392.                  ENDIF    
  393.               
  394.                 fResult = InternetAutoDialHangUp(0)
  395.                 THIS.GetExtendedError()
  396.                 
  397.                 IF fResult = 0 
  398.                       RETURN .F.
  399.                 ENDIF
  400.                     
  401.               RETURN .T.                
  402.           
  403.           ENDPROC
  404.                 
  405.       
  406.         ****************************************************    
  407.             PROCEDURE DialInternet
  408.                 LPARAMETERS lcDialUpName, lnFlag
  409.                 
  410.                 LOCAL fResult, lnConnectionID, lnHWNDHandle
  411.                 
  412.                   IF THIS.LoadAPIFuncs() != ERROR_SUCCESS
  413.                       RETURN -1
  414.                  ENDIF
  415.                 
  416.                   lnConnectionID = 0
  417.                   lnHWNDHandle = 0
  418.                                                       
  419.                   IF TYPE("lcDialUpName") != "C" OR ;
  420.                        TYPE("lnFlag") != "N"
  421.                         RETURN -1
  422.                   ENDIF
  423.                 
  424.                   IF LEN(ALLTRIM(lcDialUpName)) = 0 
  425.                       RETURN -1
  426.                   ENDIF
  427.                   
  428.                   lcDialUpName = lcDialUpName + cNULL
  429.                   
  430.                   fResult = InternetDial(lnHWNDHandle, @lcDialUpName, lnFlag, @lnConnectionID, 0)
  431.                   THIS.GetExtendedError()
  432.                                   
  433.                 RETURN lnConnectionID
  434.             ENDPROC  
  435.  
  436.  
  437.       ****************************************************
  438.         PROCEDURE DialHangUp
  439.             LPARAMETERS lnConnectionID
  440.           
  441.             LOCAL fResult
  442.             
  443.                 IF THIS.LoadAPIFuncs() != ERROR_SUCCESS
  444.                       RETURN -1
  445.                  ENDIF
  446.                  
  447.                  IF TYPE("lnConnectionID") != "N"
  448.                          RETURN .F.
  449.                  ENDIF
  450.                  
  451.                  fResult = InternetHangUp(@lnConnectionID, 0)
  452.                  THIS.GetExtendedError()
  453.                  
  454.                  IF fResult = 0 
  455.                            RETURN .F.
  456.                       ELSE
  457.                           RETURN .T.
  458.                  ENDIF                 
  459.           
  460.         ENDPROC
  461.         
  462.         
  463.       ****************************************************
  464.           PROCEDURE GetConnectedState
  465.         
  466.             LOCAL fResult, lnConnectionState
  467.             
  468.               IF THIS.LoadAPIFuncs() != ERROR_SUCCESS
  469.                       RETURN -1
  470.                  ENDIF
  471.             
  472.               lnConnectionState = 0
  473.         
  474.               fResult = InternetGetConnectedState(@lnConnectionState, 0)
  475.               THIS.GetExtendedError()
  476.               
  477.               IF fResult = 0 
  478.                       RETURN -1
  479.               ENDIF
  480.  
  481.             RETURN lnConnectionState
  482.  
  483.         ENDPROC
  484.         
  485.               
  486.       ****************************************************    
  487.           PROCEDURE GoOnline
  488.               LPARAMETERS lcURL
  489.               
  490.               LOCAL lnHWNDHandle, fResult
  491.               
  492.                 IF THIS.LoadAPIFuncs() != ERROR_SUCCESS
  493.                       RETURN -1
  494.                  ENDIF
  495.                  
  496.                  IF TYPE("lcURL") != "C"
  497.                         RETURN .F.
  498.                  ENDIF
  499.                   
  500.                 lcURL = lcURL + cNULL
  501.                 
  502.                 lnHWNDHandle = 0
  503.                 
  504.                 fResult = InternetGoOnline(@lcURL, lnHWNDHandle, 0)
  505.                 THIS.GetExtendedError()
  506.                  
  507.                  IF fResult = 0 
  508.                            RETURN .F.
  509.                       ELSE
  510.                           RETURN .T.
  511.                  ENDIF        
  512.               
  513.           ENDPROC    
  514.  
  515.         
  516.       ****************************************************
  517.         PROCEDURE OpenInternet
  518.            LPARAMETERS lcUserName, lcPassword, lcIPAddress, lcPort
  519.              
  520.            LOCAL lnPCount, fResult, lcTempDir, lnConnectHandle
  521.            
  522.            * Check Passed Parameters
  523.                lnPCount = PARAMETERS()
  524.                       
  525.                IF lnPCount <> 4
  526.                    nResult_Code = ERROR_INTERNET_BAD_OPTION_LENGTH
  527.                    RETURN .F.
  528.                ENDIF
  529.                
  530.            * Make sure parameters are of the correct type
  531.                IF (TYPE("lcUserName") != "C") OR ;
  532.                   (TYPE("lcPassword") != "C") OR ;
  533.                   (TYPE("lcIPAddress") != "C") OR ;
  534.                   (TYPE("lcPort") != "C")
  535.                        nResult_Code = ERROR_INVALID_PARAMETER
  536.                        RETURN .F.
  537.                ENDIF
  538.                
  539.                
  540.                
  541.               * Check Parameter Values
  542.                IF EMPTY(lcUserName) OR EMPTY(lcPassword) OR EMPTY(lcIPAddress)
  543.                    nResult_Code = ERROR_INTERNET_BAD_OPTION_LENGTH            
  544.                    RETURN .F.
  545.                ENDIF
  546.                
  547.                IF THIS.LoadAPIFuncs() != ERROR_SUCCESS
  548.                    RETURN .F.
  549.                ENDIF
  550.                
  551.                
  552.            * Open Handle to Internet
  553.            * Set Parameters
  554.                                     
  555.             THIS.cUserName = lcUserName + cNULL           && Store FTP Connection information
  556.             THIS.cPassword = lcPassword + cNULL
  557.             THIS.cIPAddress = lcIPAddress + cNULL
  558.             THIS.cPort = lcPort
  559.                                                       
  560.                THIS.nInet_Handle = InternetOpen((THIS.cAgent), INTERNET_OPEN_TYPE_DIRECT, cNULL, cNULL, 0)
  561.                THIS.GetExtendedError()
  562.                
  563.                
  564.            * Unable to Get a Connection into the Internet
  565.                IF THIS.nInet_Handle = 0
  566.                    THIS.CloseFtp()
  567.                    RETURN .F.
  568.                ENDIF
  569.            
  570.     
  571.            * This Opens the FTP site and Gets the Current Directory.  The handle to the FTP site is opened
  572.            * and closed for each call to any function.    
  573.            * Open FTP Site 
  574.                lnConnect_Handle = InternetConnect(THIS.nInet_Handle, (THIS.cIPAddress), VAL(lcPort), ;
  575.                                        (THIS.cUserName), (THIS.cPassword), INTERNET_SERVICE_FTP, ;
  576.                                     IIF(THIS.lPassive = .T., INTERNET_FLAG_PASSIVE, 0), 0)
  577.                THIS.GetExtendedError()
  578.                
  579.                IF lnConnect_Handle != 0
  580.                           
  581.                    lcTempDir = SPACE(MAX_PATH)       
  582.                           
  583.                    fResult = FtpGetCurrentDirectory(lnConnect_Handle, @lcTempDir, MAX_PATH)
  584.                    THIS.GetExtendedError()
  585.                        
  586.                    IF fResult != 0
  587.                        THIS.cCurrentDir = lcTempDir
  588.                        InternetCloseHandle(lnConnect_Handle)
  589.                      ELSE
  590.                          RETURN .F.
  591.                    ENDIF
  592.                    
  593.                  ELSE
  594.                      RETURN .F.
  595.                
  596.                ENDIF
  597.                                   
  598.             RETURN .T.
  599.         
  600.         ENDPROC
  601.         
  602.         
  603.       ****************************************************
  604.           PROCEDURE OpenFtpConnection
  605.             
  606.             LOCAL nHandle, lnConnect_Handle, lcCurrentDir
  607.           
  608.             * Open FTP Site 
  609.                lnConnect_Handle = InternetConnect(THIS.nInet_Handle, (THIS.cIPAddress), VAL(THIS.cPort), ;
  610.                                        (THIS.cUserName), (THIS.cPassword), INTERNET_SERVICE_FTP, 0, 0)
  611.                THIS.GetExtendedError()
  612.                
  613.                lcCurrentDir = THIS.cCurrentDir
  614.                    
  615.             IF lnConnect_Handle != 0
  616.                   fResult = FtpSetCurrentDirectory(lnConnect_Handle, @lcCurrentDir)
  617.                   
  618.                   IF fResult = 1
  619.                       THIS.nConnect_Handle = lnConnect_Handle
  620.                       RETURN .T.
  621.                     ELSE
  622.                         THIS.GetExtendedError()     && Only Get extended Error information when there is an error
  623.                         RETURN .F.
  624.                   ENDIF
  625.               ELSE
  626.                   RETURN .F.
  627.             ENDIF
  628.                    
  629.         ENDPROC
  630.         
  631.       ****************************************************
  632.         PROCEDURE CloseFtpConnection
  633.             
  634.             IF THIS.nConnect_Handle != 0
  635.                 InternetCloseHandle(THIS.nConnect_Handle)
  636.             ENDIF
  637.             
  638.             THIS.nConnect_Handle = 0
  639.             
  640.           RETURN
  641.         ENDPROC
  642.         
  643.         
  644.       ****************************************************
  645.         PROCEDURE CloseInternet
  646.         
  647.           * Handles have a Hierarchy.  Closing the Top Handle will close all child handles also.
  648.             IF THIS.nInet_Handle != 0
  649.                 InternetCloseHandle(THIS.nInet_Handle)
  650.                 THIS.nInet_Handle = 0
  651.             ENDIF
  652.                                                 
  653.         ENDPROC
  654.         
  655.         
  656.       ****************************************************
  657.         PROCEDURE SetCachingMethod
  658.           LPARAMETERS nCacheType
  659.           
  660.           LOCAL fResult
  661.         
  662.             fResult = .F.
  663.             
  664.           * only change caching type if we have a valid new cache type
  665.               DO CASE               
  666.                   CASE nCacheType = INTERNET_FLAG_DONT_CACHE
  667.                           THIS.nCachingType = INTERNET_FLAG_DONT_CACHE
  668.                           fResult = .T.
  669.                   CASE nCacheType = INTERNET_FLAG_HYPERLINK
  670.                           THIS.nCachingType = INTERNET_FLAG_HYPERLINK
  671.                           fResult = .T.
  672.                   CASE nCacheType = INTERNET_FLAG_MAKE_PERSISTENT
  673.                           THIS.nCachingType = INTERNET_FLAG_MAKE_PERSISTENT
  674.                           fResult = .T.
  675.                   CASE nCacheType = INTERNET_FLAG_MUST_CACHE_REQUEST
  676.                           THIS.nCachingType = INTERNET_FLAG_MUST_CACHE_REQUEST
  677.                           fResult = .T.
  678.                   CASE nCacheType = INTERNET_FLAG_RELOAD
  679.                           THIS.nCachingType = INTERNET_FLAG_RELOAD
  680.                           fResult = .T.
  681.                   CASE nCacheType = INTERNET_FLAG_NO_CACHE_WRITE
  682.                           THIS.nCachingType = INTERNET_FLAG_NO_CACHE_WRITE
  683.                           fResult = .T.
  684.                   CASE nCacheType = INTERNET_FLAG_RESYNCHRONIZE
  685.                           THIS.nCachingType = INTERNET_FLAG_RESYNCHRONIZE
  686.                           fResult = .T.
  687.               ENDCASE
  688.                 
  689.             RETURN fResult                                
  690.         ENDPROC
  691.         
  692.       ****************************************************
  693.         PROCEDURE GetCachingMethod
  694.             
  695.             RETURN THIS.nCachingType          
  696.           
  697.         ENDPROC
  698.          
  699.       ****************************************************
  700.           PROCEDURE GetFtpFile
  701.           LPARAMETERS lcRemoteFile, lcNewFile, llFailIfExists
  702.           
  703.             LOCAL fResult, lnFail
  704.             
  705.                 IF THIS.OpenFtpConnection()     && Open an FTP Handle
  706.             
  707.                     IF llFailIfExists
  708.                         lnFail = 1
  709.                       ELSE
  710.                           lnFail = 0
  711.                     ENDIF                
  712.                     
  713.                     lcNewFile = lcNewFile + cNULL
  714.                     lcRemoteFile = lcRemoteFile + cNULL
  715.                 
  716.                     fResult = FtpGetFile(THIS.nConnect_Handle, @lcRemoteFile, @lcNewFile, lnFail, ;
  717.                                 FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY + THIS.nCachingType, 0)
  718.                     THIS.GetExtendedError()
  719.                     
  720.                     THIS.CloseFtpConnection()   && Close FTP Handle
  721.                     
  722.                     IF fResult = 1
  723.                         RETURN .T.
  724.                       ELSE
  725.                           RETURN .F.
  726.                     ENDIF
  727.                     
  728.               ENDIF
  729.                               
  730.           ENDPROC
  731.           
  732.       ****************************************************
  733.           PROCEDURE PutFtpFile
  734.           LPARAMETERS lcRemoteFile, lclocalFile
  735.           
  736.             LOCAL fResult
  737.             
  738.                 IF THIS.OpenFtpConnection()     && Open an FTP Handle
  739.             
  740.                     lcRemoteFile = lcRemoteFile + cNULL
  741.                     lcLocalFile = lcLocalFile + cNULL
  742.                                 
  743.                     fResult = FtpPutFile(THIS.nConnect_Handle, @lcLocalFile, @lcRemoteFile, ;
  744.                                 FTP_TRANSFER_TYPE_BINARY, 0)
  745.                     THIS.GetExtendedError()
  746.                                           
  747.                   THIS.CloseFtpConnection()
  748.                   
  749.                   IF fResult = 1
  750.                         RETURN .T.
  751.                       ELSE
  752.                           RETURN .F.
  753.                     ENDIF
  754.                     
  755.               ENDIF
  756.                   
  757.           ENDPROC
  758.           
  759.       ****************************************************
  760.           PROCEDURE DeleteFtpFile
  761.           LPARAMETERS lcRemoteFile
  762.           
  763.             LOCAL fResult
  764.             
  765.                 IF THIS.OpenFtpConnection()     && Open an FTP Handle
  766.             
  767.                     lcRemoteFile = lcRemoteFile + cNULL
  768.                                                 
  769.                     fResult = FtpDeleteFile(THIS.nConnect_Handle, @lcRemoteFile)
  770.                     THIS.GetExtendedError()
  771.                     
  772.                     THIS.CloseFtpConnection()
  773.                     
  774.                     IF fResult = 1
  775.                         RETURN .T.
  776.                       ELSE
  777.                           RETURN .F.
  778.                     ENDIF
  779.                     
  780.               ENDIF
  781.                               
  782.           ENDPROC
  783.         
  784.         
  785.       ****************************************************
  786.           PROCEDURE RenameFtpFile
  787.           LPARAMETERS lcOldFile, lcNewFile
  788.           
  789.             LOCAL fResult
  790.                  
  791.                 IF THIS.OpenFtpConnection()     && Open an FTP Handle
  792.                            
  793.                     lcOldFile = lcOldFile + cNULL
  794.                     lcNewFile = lcNewFile + cNULL
  795.                                 
  796.                     fResult = FtpRenameFile(THIS.nConnect_Handle, @lcOldFile, @lcNewFile)
  797.                     THIS.GetExtendedError()
  798.                     
  799.                     THIS.CloseFtpConnection()
  800.                     
  801.                     IF fResult = 1
  802.                         RETURN .T.
  803.                       ELSE
  804.                           RETURN .F.
  805.                     ENDIF
  806.                     
  807.               ENDIF
  808.                               
  809.           ENDPROC
  810.         
  811.         
  812.         
  813.       ****************************************************
  814.           PROCEDURE CreateFtpDirectory
  815.            LPARAMETERS lcNewDir
  816.            
  817.            LOCAL fResult
  818.                                   
  819.                  IF THIS.OpenFtpConnection()     && Open an FTP Handle                 
  820.                               
  821.                      lcNewDir = lcNewDir + cNULL
  822.                                                     
  823.                    fResult = FtpCreateDirectory(THIS.nConnect_Handle, @lcNewDir)
  824.                    THIS.GetExtendedError()
  825.                    
  826.                    THIS.CloseFtpConnection()
  827.                    
  828.                    IF fResult = 1
  829.                        RETURN .T.
  830.                      ELSE
  831.                          RETURN .F.
  832.                    ENDIF
  833.                    
  834.                ENDIF
  835.                           
  836.           ENDPROC
  837.           
  838.       ****************************************************
  839.           PROCEDURE RemoveFtpDirectory
  840.            LPARAMETERS lcNewDir
  841.            
  842.            LOCAL fResult
  843.                                     
  844.                  IF THIS.OpenFtpConnection()     && Open an FTP Handle                   
  845.                                                
  846.                      lcNewDir = lcNewDir + cNULL
  847.                                                     
  848.                    fResult = FtpRemoveDirectory(THIS.nConnect_Handle, @lcNewDir)
  849.                    THIS.GetExtendedError()
  850.               
  851.                   THIS.CloseFtpConnection()
  852.                    
  853.                    IF fResult = 1
  854.                        RETURN .T.
  855.                      ELSE
  856.                          RETURN .F.
  857.                    ENDIF
  858.                           
  859.                ENDIF
  860.                
  861.           ENDPROC
  862.              
  863.       ****************************************************
  864.           PROCEDURE ChangeFtpDirectory
  865.            LPARAMETERS lcNewDir
  866.            
  867.            LOCAL fResult, lcTempDir, llResult
  868.                                     
  869.                  IF THIS.OpenFtpConnection()     && Open an FTP Handle                  
  870.                                                 
  871.                        llResult = .F.     
  872.                                            
  873.                      lcNewDir = lcNewDir + cNULL  
  874.                      lcTempDir = SPACE(MAX_PATH)                            
  875.                                                     
  876.                    fResult = FtpSetCurrentDirectory(THIS.nConnect_Handle, @lcNewDir)
  877.                    THIS.GetExtendedError()
  878.                                   
  879.                    IF fResult = 1
  880.                        fResult = FtpGetCurrentDirectory(THIS.nConnect_Handle, @lcTempDir, MAX_PATH)
  881.                        THIS.GetExtendedError()
  882.                                       
  883.                        IF fResult = 1
  884.                            THIS.cCurrentDir = lcTempDir
  885.                            llResult = .T.
  886.                        ENDIF
  887.                        
  888.                    ENDIF
  889.                    
  890.                    THIS.CloseFtpConnection()
  891.                    
  892.                    RETURN llResult
  893.                ENDIF           
  894.                           
  895.           ENDPROC
  896.           
  897.       ****************************************************
  898.           PROCEDURE GetFtpDirectory
  899.           LPARAMETERS lcDirectory
  900.           
  901.             LOCAL fResult, lcTempDir
  902.             
  903.               IF THIS.OpenFtpConnection()     && Open an FTP Handle
  904.             
  905.                     lcTempDir = SPACE(MAX_PATH)
  906.                     
  907.                     fResult = FtpGetCurrentDirectory(THIS.nConnect_Handle, @lcTempDir, MAX_PATH)
  908.                     THIS.GetExtendedError()
  909.                     
  910.                     lcDirectory = LEFT(lcTempDir, AT(cNULL, lcTempDir) - 1)
  911.                     
  912.                     THIS.CloseFtpConnection()
  913.                     
  914.                     IF fResult = 1
  915.                        RETURN .T.
  916.                      ELSE
  917.                          RETURN .F.
  918.                    ENDIF
  919.                    
  920.               ENDIF
  921.                               
  922.           ENDPROC
  923.         
  924.                 
  925.       ****************************************************
  926.         PROCEDURE GetFtpDirectoryArray
  927.           LPARAMETERS laDirectory, lcMask
  928.           
  929.           LOCAL cStruct, llResult, lnCount, fResult, lffHandle
  930.           
  931.               IF THIS.OpenFtpConnection()     && Open an FTP Handle
  932.           
  933.                 lcMask = lcMask + cNULL
  934.               
  935.                * Dimension the array to store the directory
  936.                * [x, 1] = FileName
  937.                * [x, 2] = Alternate FileName
  938.                * [x, 3] = File Size
  939.                * [x, 4] = File Create Date
  940.                * [x, 5] = File Last Access Time
  941.                * [x, 6] = File Last Write Time
  942.                * [x, 7] = File Attributes
  943.                 DIMENSION laDirectory [1, 7]
  944.                 laDirectory [1, 1] = .F.
  945.                           
  946.                * This is for a FoxPro Quirk.
  947.                                   
  948.                   lcStruct = SPACE(319)   && Allocate space for the returned structure
  949.                   
  950.                * Get the first file or find out if 
  951.                   lffHandle = FtpFindFirstFile(THIS.nConnect_Handle, @lcMask, @lcStruct, INTERNET_FLAG_RELOAD, 0)
  952.                    THIS.GetExtendedError()
  953.                   
  954.                   IF lffHandle = 0 OR THIS.nResult_Code = ERROR_NO_MORE_FILES
  955.                       THIS.CloseFtpConnection()
  956.                       RETURN .F.
  957.                   ENDIF
  958.               
  959.                * Parse out First File Information
  960.                   THIS.CrackFile(lcStruct, @laDirectory)
  961.                   
  962.                       llResult = 1
  963.                                                   
  964.                     DO WHILE THIS.nResult_Code != ERROR_NO_MORE_FILES AND llResult != 0
  965.                     
  966.                         lcStruct = SPACE(319)
  967.                       * Get next files
  968.                         llResult = InternetFindNextFile(lffHandle, @lcStruct)
  969.                         THIS.GetExtendedError()
  970.                         
  971.                       * If we got good information, go ahead and parse it
  972.                         IF THIS.nResult_Code != ERROR_NO_MORE_FILES AND llResult != 0
  973.                                THIS.CrackFile(lcStruct, @laDirectory)
  974.                            ENDIF
  975.                         
  976.                       ENDDO
  977.                  
  978.                  THIS.CloseFtpConnection()
  979.                  
  980.               ELSE
  981.                 RETURN .F.     && Unable to get FTP Connection    
  982.             ENDIF
  983.         
  984.         
  985.             RETURN .T.
  986.         ENDPROC
  987.         
  988.       ****************************************************
  989.          PROCEDURE GetErrorCode
  990.            LPARAMETERS llShowMessage
  991.  
  992.           LOCAL lcMessage
  993.  
  994.             IF llShowMessage = .T.
  995.             
  996.                * Build Error Message Here
  997.                 lcMessage = "Error (" + ALLTRIM(STR(THIS.nResult_Code)) + ")  -  " + ;
  998.                                     THIS.GetErrorText(THIS.nResult_Code)
  999.                 IF !EMPTY(THIS.cExtended_Message)
  1000.                     lcMessage = lcMessage + CHR(13) + CHR(13) + "Extended Error Info - (" + ;
  1001.                                 ALLTRIM(STR(THIS.nExtended_Result)) + ;
  1002.                                 ") - " + THIS.cExtended_Message
  1003.                 ENDIF
  1004.                 
  1005.                 MessageBox(lcMessage, 48, "FTP Error Message")
  1006.             ENDIF
  1007.                           
  1008.              RETURN THIS.nResult_Code
  1009.          
  1010.          ENDPROC
  1011.          
  1012.          
  1013.       ****************************************************
  1014.         PROCEDURE GetExtendedErrorCode
  1015.         
  1016.          
  1017.            RETURN THIS.nExtended_Result
  1018.          ENDPROC
  1019.          
  1020.          
  1021.       ****************************************************
  1022.         PROCEDURE GetExtendedErrorMsg
  1023.         
  1024.          
  1025.            RETURN THIS.cExtended_Message
  1026.          ENDPROC
  1027.          
  1028.          
  1029.       ****************************************************
  1030.         PROCEDURE CrackFile
  1031.           LPARAMETERS lcString, laDirectory
  1032.               
  1033.           LOCAL lcFileName, lcAlterName, lnSizeHigh, lnSizeLow, lnFileSize, ;
  1034.                   lcAttributes, lnArrayLen, lcTimeBuff, ;
  1035.                   ldCreateDate, ldAccessDate, ldWriteDate, laNewArray, lnResult
  1036.               
  1037.  
  1038.             IF TYPE('laDirectory[1, 1]') = 'L'    && Array Has Not Been Filed      
  1039.                * Force Record size of 1
  1040.                 DIMENSION laDirectory [1, 7]
  1041.               ELSE    
  1042.                * Expand Array
  1043.                 DIMENSION laDirectory [ALEN(laDirectory, 1) + 1, 7]
  1044.             ENDIF
  1045.             
  1046.               * Get new Array Position
  1047.               lnArrayLen = ALEN(laDirectory, 1)
  1048.                                    
  1049.               lcFileName = SUBSTR(lcString, 45, MAX_PATH)
  1050.               lcAlterName = RIGHT(lcString, 14)
  1051.               
  1052.               lcFileName = LEFT(lcFileName, AT(cNull, lcFileName) - 1)  && Copy out just the File Name Text
  1053.               lcAlterName = LEFT(lcAlterName, AT(cNull, lcAlterName) - 1)
  1054.               
  1055.            * Convert File Size DWORDs
  1056.               lnSizeHigh = (ASC(SUBSTR(lcString, 29, 1)) * BYTE_1) + ;
  1057.                            (ASC(SUBSTR(lcString, 30, 1)) * BYTE_2) + ;
  1058.                            (ASC(SUBSTR(lcString, 31, 1)) * BYTE_3) + ;
  1059.                            (ASC(SUBSTR(lcString, 32, 1)) * BYTE_4) 
  1060.                            
  1061.               lnSizeLow =  (ASC(SUBSTR(lcString, 33, 1)) * BYTE_1) + ;
  1062.                            (ASC(SUBSTR(lcString, 34, 1)) * BYTE_2) + ;
  1063.                            (ASC(SUBSTR(lcString, 35, 1)) * BYTE_3) + ;
  1064.                            (ASC(SUBSTR(lcString, 36, 1)) * BYTE_4) 
  1065.                            
  1066.            * Build File Size
  1067.               lnFileSize = (lnSizeHigh * MAXDWORD) + lnSizeLow
  1068.               
  1069.           * Convert File Date
  1070.            
  1071.            * Get File Create DateTime
  1072.             lcTimeBuff = SUBSTR(lcString, 5, 8)
  1073.             ldCreateDate = THIS.CrackDate(lcTimeBuff)
  1074.             
  1075.            * Get File Create DateTime
  1076.             lcTimeBuff = SUBSTR(lcString, 13, 8)
  1077.             ldAccessDate = THIS.CrackDate(lcTimeBuff)
  1078.             
  1079.            * Get File Create DateTime
  1080.             lcTimeBuff = SUBSTR(lcString, 21, 8)
  1081.             ldWriteDate = THIS.CrackDate(lcTimeBuff)
  1082.             
  1083.            * Get File Attributes
  1084.             lcAttributes = THIS.CrackAttributes(LEFT(lcString, 4))
  1085.             
  1086.             laDirectory[lnArrayLen, 1] = ALLTRIM(lcFileName)
  1087.             laDirectory[lnArrayLen, 2] = ALLTRIM(lcAlterName)
  1088.             laDirectory[lnArrayLen, 3] = lnFileSize
  1089.             laDirectory[lnArrayLen, 4] = ldCreateDate
  1090.             laDirectory[lnArrayLen, 5] = ldAccessDate
  1091.             laDirectory[lnArrayLen, 6] = ldWriteDate
  1092.             laDirectory[lnArrayLen, 7] = lcAttributes
  1093.        
  1094.           RETURN 
  1095.                
  1096.         ENDPROC
  1097.         
  1098.       ****************************************************
  1099.         PROCEDURE CrackDate
  1100.           LPARAMETERS lcOutBuffer
  1101.           
  1102.           LOCAL lcInBuffer, ldDateTime, fResult, lcBuild, ;
  1103.                   lnDay, lnMonth, lnYear, lnHour, lnMinute, lnSecond
  1104.         
  1105.             lcInBuffer = SPACE(16)
  1106.         
  1107.             fResult = FileTimeToSystemTime(@lcOutBuffer, @lcInBuffer)
  1108.             THIS.GetExtendedError()
  1109.             
  1110.             IF fResult = 0   && Failed
  1111.                 ldDateTime = {^1901/01/01 00:00:01}   && Default Time
  1112.                 RETURN ldDateTime
  1113.             ENDIF
  1114.             
  1115.             lnYear = ASC(SUBSTR(lcInBuffer, 1, 1)) + (ASC(SUBSTR(lcInBuffer, 2, 1)) * BYTE_2)
  1116.             lnMonth = ASC(SUBSTR(lcInBuffer, 3, 1)) + (ASC(SUBSTR(lcInBuffer, 4, 1)) * BYTE_2)
  1117.             lnDay = ASC(SUBSTR(lcInBuffer, 7, 1)) + (ASC(SUBSTR(lcInBuffer, 8, 1)) * BYTE_2)
  1118.             lnHour = ASC(SUBSTR(lcInBuffer, 9, 1)) + (ASC(SUBSTR(lcInBuffer, 10, 1)) * BYTE_2)
  1119.             lnMinute = ASC(SUBSTR(lcInBuffer, 11, 1)) + (ASC(SUBSTR(lcInBuffer, 12, 1)) * BYTE_2)
  1120.             lnSecond = ASC(SUBSTR(lcInBuffer, 13, 1)) + (ASC(SUBSTR(lcInBuffer, 13, 1)) * BYTE_2)
  1121.             
  1122.             lcBuild = "^" + ALLTRIM(STR(lnYear)) + '/' + ALLTRIM(STR(lnMonth)) + '/' + ALLTRIM(STR(lnDay)) + ' ' + ;
  1123.                       ALLTRIM(STR(lnHour)) + ':' + ALLTRIM(STR(lnMinute)) + ':' + ALLTRIM(STR(lnSecond))
  1124.                       
  1125.             ldDateTime = {&lcBuild}
  1126.                           
  1127.           RETURN ldDateTime
  1128.            
  1129.         ENDPROC
  1130.           
  1131.       ****************************************************
  1132.         PROCEDURE CrackAttributes
  1133.           LPARAMETERS lcBuffer
  1134.         
  1135.           LOCAL lcAttributes, lnValue
  1136.              
  1137.              lcAttributes = ''
  1138.                       
  1139.             lnValue = (ASC(SUBSTR(lcBuffer, 1, 1)) * BYTE_1) + ;
  1140.                       (ASC(SUBSTR(lcBuffer, 2, 1)) * BYTE_2) + ;
  1141.                       (ASC(SUBSTR(lcBuffer, 3, 1)) * BYTE_3) + ;
  1142.                       (ASC(SUBSTR(lcBuffer, 4, 1)) * BYTE_4) 
  1143.                       
  1144.             DO CASE
  1145.                 CASE BITTEST(lnValue, BIT_ATTRIBUTE_READONLY) 
  1146.                     lcAttributes = lcAttributes + 'R'
  1147.                 CASE BITTEST(lnValue, BIT_ATTRIBUTE_HIDDEN) 
  1148.                     lcAttributes = lcAttributes + 'H'
  1149.                 CASE BITTEST(lnValue, BIT_ATTRIBUTE_SYSTEM) 
  1150.                     lcAttributes = lcAttributes + 'S'
  1151.                 CASE BITTEST(lnValue, BIT_ATTRIBUTE_DIRECTORY) 
  1152.                     lcAttributes = lcAttributes + 'D'
  1153.                 CASE BITTEST(lnValue, BIT_ATTRIBUTE_ARCHIVE) 
  1154.                     lcAttributes = lcAttributes + 'A'
  1155.                 CASE BITTEST(lnValue, BIT_ATTRIBUTE_NORMAL) 
  1156.                     lcAttributes = lcAttributes + 'N'
  1157.                 CASE BITTEST(lnValue, BIT_ATTRIBUTE_TEMPORARY) 
  1158.                     lcAttributes = lcAttributes + 'T'
  1159.                 CASE BITTEST(lnValue, BIT_ATTRIBUTE_COMPRESSED) 
  1160.                     lcAttributes = lcAttributes + 'C'
  1161.                 CASE BITTEST(lnValue, BIT_ATTRIBUTE_OFFLINE) 
  1162.                     lcAttributes = lcAttributes + 'O'
  1163.             ENDCASE
  1164.                         
  1165.            RETURN lcAttributes
  1166.         ENDPROC
  1167.         
  1168.       ****************************************************
  1169.         PROCEDURE GetExtendedError
  1170.         
  1171.           LOCAL lcMessage, lnError, lcBuffer
  1172.           
  1173.             THIS.nResult_Code = GetLastError()
  1174.             
  1175.               lnError = 0
  1176.             lcBuffer = SPACE(MAX_PATH)
  1177.             
  1178.             InternetGetLastResponseInfo(lnError, @lcBuffer, MAX_PATH)
  1179.             
  1180.             THIS.nExtended_Result = lnError
  1181.             THIS.cExtended_Message = LEFT(lcBuffer, AT(cNULL, lcBuffer) - 1)
  1182.                                 
  1183.           RETURN 
  1184.         ENDPROC
  1185.                 
  1186.       ****************************************************
  1187.         PROCEDURE GetErrorText
  1188.           LPARAMETERS lnError
  1189.  
  1190.           LOCAL lcMessage
  1191.   
  1192.               DO CASE
  1193.         
  1194.                CASE lnError =  ERROR_INTERNET_OUT_OF_HANDLES                
  1195.                         lcMessage = "ERROR_INTERNET_OUT_OF_HANDLES"
  1196.                CASE lnError =  ERROR_INTERNET_TIMEOUT                       
  1197.                         lcMessage = "ERROR_INTERNET_TIMEOUT"
  1198.                CASE lnError =  ERROR_INTERNET_EXTENDED_ERROR                
  1199.                         lcMessage = "ERROR_INTERNET_EXTENDED_ERROR"
  1200.                CASE lnError =  ERROR_INTERNET_INTERNAL_ERROR                
  1201.                         lcMessage = "ERROR_INTERNET_INTERNAL_ERROR"
  1202.                CASE lnError =  ERROR_INTERNET_INVALID_URL                   
  1203.                         lcMessage = "ERROR_INTERNET_INVALID_URL"
  1204.                CASE lnError =  ERROR_INTERNET_UNRECOGNIZED_SCHEME           
  1205.                         lcMessage = "ERROR_INTERNET_UNRECOGNIZED_SCHEME"
  1206.                CASE lnError =  ERROR_INTERNET_NAME_NOT_RESOLVED             
  1207.                         lcMessage = "ERROR_INTERNET_NAME_NOT_RESOLVED"
  1208.                CASE lnError =  ERROR_INTERNET_PROTOCOL_NOT_FOUND            
  1209.                         lcMessage = "ERROR_INTERNET_PROTOCOL_NOT_FOUND"
  1210.                CASE lnError =  ERROR_INTERNET_INVALID_OPTION                
  1211.                         lcMessage = "ERROR_INTERNET_INVALID_OPTION"
  1212.                CASE lnError =  ERROR_INTERNET_BAD_OPTION_LENGTH             
  1213.                         lcMessage = "ERROR_INTERNET_BAD_OPTION_LENGTH"    
  1214.                CASE lnError =  ERROR_INTERNET_OPTION_NOT_SETTABLE           
  1215.                         lcMessage = "ERROR_INTERNET_OPTION_NOT_SETTABLE"
  1216.                CASE lnError =  ERROR_INTERNET_SHUTDOWN                      
  1217.                         lcMessage = "ERROR_INTERNET_SHUTDOWN"
  1218.                CASE lnError =  ERROR_INTERNET_INCORRECT_USER_NAME           
  1219.                         lcMessage = "ERROR_INTERNET_INCORRECT_USER_NAME"
  1220.                CASE lnError =  ERROR_INTERNET_INCORRECT_PASSWORD            
  1221.                         lcMessage = "ERROR_INTERNET_INCORRECT_PASSWORD"
  1222.                CASE lnError =  ERROR_INTERNET_LOGIN_FAILURE                 
  1223.                         lcMessage = "ERROR_INTERNET_LOGIN_FAILURE"
  1224.                CASE lnError =  ERROR_INTERNET_INVALID_OPERATION             
  1225.                         lcMessage = "ERROR_INTERNET_INVALID_OPERATION"
  1226.                CASE lnError =  ERROR_INTERNET_OPERATION_CANCELLED           
  1227.                         lcMessage = "ERROR_INTERNET_OPERATION_CANCELLED"
  1228.                CASE lnError =  ERROR_INTERNET_INCORRECT_HANDLE_TYPE         
  1229.                         lcMessage = "ERROR_INTERNET_INCORRECT_HANDLE_TYPE"
  1230.                CASE lnError =  ERROR_INTERNET_INCORRECT_HANDLE_STATE        
  1231.                            lcMessage = "ERROR_INTERNET_INCORRECT_HANDLE_STATE"
  1232.                CASE lnError =  ERROR_INTERNET_NOT_PROXY_REQUEST             
  1233.                         lcMessage = "ERROR_INTERNET_NOT_PROXY_REQUEST"
  1234.                CASE lnError =  ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND      
  1235.                         lcMessage = "ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND"
  1236.                CASE lnError =  ERROR_INTERNET_BAD_REGISTRY_PARAMETER        
  1237.                         lcMessage = "ERROR_INTERNET_BAD_REGISTRY_PARAMETER"
  1238.                CASE lnError =  ERROR_INTERNET_NO_DIRECT_ACCESS              
  1239.                         lcMessage = "ERROR_INTERNET_NO_DIRECT_ACCESS"
  1240.                CASE lnError =  ERROR_INTERNET_NO_CONTEXT                    
  1241.                          lcMessage = "ERROR_INTERNET_NO_CONTEXT"
  1242.                CASE lnError =  ERROR_INTERNET_NO_CALLBACK                   
  1243.                         lcMessage = "ERROR_INTERNET_NO_CALLBACK"
  1244.                CASE lnError =  ERROR_INTERNET_REQUEST_PENDING               
  1245.                         lcMessage = "ERROR_INTERNET_REQUEST_PENDING"
  1246.                CASE lnError =  ERROR_INTERNET_INCORRECT_FORMAT              
  1247.                         lcMessage = "ERROR_INTERNET_INCORRECT_FORMAT"
  1248.                CASE lnError =  ERROR_INTERNET_ITEM_NOT_FOUND                
  1249.                         lcMessage = "ERROR_INTERNET_ITEM_NOT_FOUND"
  1250.                CASE lnError =  ERROR_INTERNET_CANNOT_CONNECT                
  1251.                         lcMessage = "ERROR_INTERNET_CANNOT_CONNECT"
  1252.                CASE lnError =  ERROR_INTERNET_CONNECTION_ABORTED            
  1253.                         lcMessage = "ERROR_INTERNET_CONNECTION_ABORTED"
  1254.                CASE lnError =  ERROR_INTERNET_CONNECTION_RESET              
  1255.                         lcMessage = "ERROR_INTERNET_CONNECTION_RESET"
  1256.                CASE lnError =  ERROR_INTERNET_FORCE_RETRY                   
  1257.                         lcMessage = "ERROR_INTERNET_FORCE_RETRY"
  1258.                CASE lnError =  ERROR_INTERNET_INVALID_PROXY_REQUEST         
  1259.                         lcMessage = "ERROR_INTERNET_INVALID_PROXY_REQUEST"
  1260.                CASE lnError =  ERROR_INTERNET_NEED_UI                       
  1261.                          lcMessage = "ERROR_INTERNET_NEED_UI"
  1262.                CASE lnError =  ERROR_INTERNET_HANDLE_EXISTS                 
  1263.                         lcMessage = "ERROR_INTERNET_HANDLE_EXISTS"
  1264.                CASE lnError =  ERROR_INTERNET_SEC_CERT_DATE_INVALID         
  1265.                         lcMessage = "ERROR_INTERNET_SEC_CERT_DATE_INVALID"
  1266.                CASE lnError =  ERROR_INTERNET_SEC_CERT_CN_INVALID           
  1267.                         lcMessage = "ERROR_INTERNET_SEC_CERT_CN_INVALID"
  1268.                CASE lnError =  ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR        
  1269.                          lcMessage = "ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR"
  1270.                CASE lnError =  ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR        
  1271.                         lcMessage = "ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR"
  1272.                CASE lnError =  ERROR_INTERNET_MIXED_SECURITY                
  1273.                         lcMessage = "ERROR_INTERNET_MIXED_SECURITY"
  1274.                CASE lnError =  ERROR_INTERNET_CHG_POST_IS_NON_SECURE        
  1275.                         lcMessage = "ERROR_INTERNET_CHG_POST_IS_NON_SECURE"
  1276.                CASE lnError =  ERROR_INTERNET_POST_IS_NON_SECURE            
  1277.                         lcMessage = "ERROR_INTERNET_POST_IS_NON_SECURE"
  1278.                CASE lnError =  ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED       
  1279.                         lcMessage = "ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED"
  1280.                CASE lnError =  ERROR_INTERNET_INVALID_CA                    
  1281.                         lcMessage = "ERROR_INTERNET_INVALID_CA"
  1282.                CASE lnError =  ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP         
  1283.                         lcMessage = "ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP"
  1284.                CASE lnError =  ERROR_INTERNET_ASYNC_THREAD_FAILED           
  1285.                         lcMessage = "ERROR_INTERNET_ASYNC_THREAD_FAILED"
  1286.                CASE lnError =  ERROR_INTERNET_REDIRECT_SCHEME_CHANGE        
  1287.                         lcMessage = "ERROR_INTERNET_REDIRECT_SCHEME_CHANGE"
  1288.                CASE lnError =  ERROR_INTERNET_DIALOG_PENDING                
  1289.                           lcMessage = "ERROR_INTERNET_DIALOG_PENDING"
  1290.                CASE lnError =  ERROR_INTERNET_RETRY_DIALOG                  
  1291.                         lcMessage = "ERROR_INTERNET_RETRY_DIALOG"
  1292.                CASE lnError =  ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR       
  1293.                         lcMessage = "ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR"
  1294.                CASE lnError =  ERROR_INTERNET_INSERT_CDROM                  
  1295.                         lcMessage = "ERROR_INTERNET_INSERT_CDROM"
  1296.                CASE lnError =  FTP_TRANSFER_IN_PROGRESS                     
  1297.                         lcMessage = "FTP_TRANSFER_IN_PROGRESS"
  1298.                CASE lnError =  FTP_DROPPED                                  
  1299.                         lcMessage = "FTP_DROPPED"
  1300.                CASE lnError =  FTP_NO_PASSIVE_MODE                          
  1301.                         lcMessage = "FTP_NO_PASSIVE_MODE"
  1302.                CASE lnError =  ERROR_INTERNET_SECURITY_CHANNEL_ERROR        
  1303.                         lcMessage = "ERROR_INTERNET_SECURITY_CHANNEL_ERROR"
  1304.                CASE lnError =  ERROR_INTERNET_UNABLE_TO_CACHE_FILE          
  1305.                          lcMessage = "ERROR_INTERNET_UNABLE_TO_CACHE_FILE"
  1306.                CASE lnError =  ERROR_INTERNET_TCPIP_NOT_INSTALLED           
  1307.                         lcMessage = "ERROR_INTERNET_TCPIP_NOT_INSTALLED"
  1308.                CASE lnError =  ERROR_INTERNET_DISCONNECTED                  
  1309.                         lcMessage = "ERROR_INTERNET_DISCONNECTED"
  1310.                CASE lnError =  ERROR_INTERNET_SERVER_UNREACHABLE            
  1311.                         lcMessage = "ERROR_INTERNET_SERVER_UNREACHABLE"
  1312.                CASE lnError =  ERROR_INTERNET_PROXY_SERVER_UNREACHABLE      
  1313.                         lcMessage = "ERROR_INTERNET_PROXY_SERVER_UNREACHABLE"
  1314.                CASE lnError =  ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT         
  1315.                         lcMessage = "ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT"
  1316.                CASE lnError =  ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT     
  1317.                          lcMessage = "ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT"
  1318.                CASE lnError =  ERROR_INTERNET_SEC_INVALID_CERT                 
  1319.                         lcMessage = "ERROR_INTERNET_SEC_INVALID_CERT"
  1320.                CASE lnError =  ERROR_INTERNET_SEC_CERT_REVOKED                 
  1321.                         lcMessage = "ERROR_INTERNET_SEC_CERT_REVOKED"
  1322.                CASE lnError =  ERROR_NO_MORE_FILES
  1323.                            lcMessage = "ERROR_NO_MORE_FILES"
  1324.                CASE lnError =  ERROR_INVALID_HANDLE
  1325.                            lcMessage = "ERROR_INVALID_HANDLE"
  1326.                CASE lnError =  ERROR_FILE_NOT_FOUND
  1327.                            lcMessage = "ERROR_FILE_NOT_FOUND"
  1328.                CASE lnError =  ERROR_PATH_NOT_FOUND
  1329.                            lcMessage = "ERROR_PATH_NOT_FOUND"
  1330.                CASE lnError =  ERROR_ACCESS_DENIED
  1331.                            lcMessage = "ERROR_ACCESS_DENIED"
  1332.                CASE lnError =  ERROR_FILE_EXISTS
  1333.                            lcMessage = "ERROR_FILE_EXISTS"
  1334.                CASE lnError =  ERROR_INVALID_PARAMETER
  1335.                            lcMessage = "ERROR_INVALID_PARAMETER"
  1336.                OTHERWISE    
  1337.                        lcMessage = "Unknown Error Message"
  1338.           ENDCASE
  1339.           
  1340.           RETURN lcMessage
  1341.         ENDPROC    
  1342.         
  1343.         
  1344.     
  1345.     ENDDEFINE     && End Class Define
  1346.  
  1347.  
  1348.  
  1349.  
  1350.  
  1351.  
  1352.  
  1353.  
  1354.  
  1355.  
  1356.  
  1357.  
  1358.