| 1 | #include <FTPEx.au3> |
|---|
| 2 | ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
|---|
| 3 | ; This var would need to be addded to FTPEx.au3. It is used to store the dll "handle" from the callback |
|---|
| 4 | ; so that it can be freed later during _FTP_Close(). |
|---|
| 5 | Global $__ghCallback_FTP = -1 |
|---|
| 6 | ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX |
|---|
| 7 | |
|---|
| 8 | |
|---|
| 9 | $server = 'ftp.mozilla.org' |
|---|
| 10 | $username = '' |
|---|
| 11 | $pass = '' |
|---|
| 12 | |
|---|
| 13 | $Open = _FTP_Open('MyFTP Control') |
|---|
| 14 | $Callback = _FTP_SetStatusCallback($Open, '_FTPStatus') |
|---|
| 15 | $Conn = _FTP_Connect($Open, $server, $username, $pass, 0, 21, 1, 0, $Callback) |
|---|
| 16 | $Ftpc = __FTP_Close($Open) |
|---|
| 17 | |
|---|
| 18 | |
|---|
| 19 | ;Example Callback Function |
|---|
| 20 | Func _FTPStatus($hInternet, $dwContent, $dwInternetStatus, $lpvStatusInformation, $dwStatusInformationLength) |
|---|
| 21 | |
|---|
| 22 | Switch $dwInternetStatus |
|---|
| 23 | Case 50; $INTERNET_STATUS_CLOSING_CONNECTION |
|---|
| 24 | ConsoleWrite('CLOSING_CONNECTION.....'& @CRLF) |
|---|
| 25 | Case 51; $INTERNET_STATUS_CONNECTION_CLOSED |
|---|
| 26 | ConsoleWrite('CONNECTION_CLOSED' & @CRLF) |
|---|
| 27 | Case 20; $INTERNET_STATUS_CONNECTING_TO_SERVER |
|---|
| 28 | ConsoleWrite('CONNECTING_TO_SERVER.....'& @CRLF) |
|---|
| 29 | Case 21; $INTERNET_STATUS_CONNECTED_TO_SERVER |
|---|
| 30 | ConsoleWrite('CONNECTED_TO_SERVER' & @CRLF) |
|---|
| 31 | Case 42; $INTERNET_STATUS_CTL_RESPONSE_RECEIVED |
|---|
| 32 | ConsoleWrite('CTL_RESPONSE_RECEIVED' & @CRLF) |
|---|
| 33 | Case 120; $INTERNET_STATUS_INTERMEDIATE_RESPONSE |
|---|
| 34 | ConsoleWrite('INTERMEDIATE_RESPONSE' & @CRLF) |
|---|
| 35 | Case 43; $INTERNET_STATUS_PREFETCH |
|---|
| 36 | ConsoleWrite('PREFETCH' & @CRLF) |
|---|
| 37 | Case 110;$INTERNET_STATUS_REDIRECT |
|---|
| 38 | ConsoleWrite('REDIRECT' & @CRLF) |
|---|
| 39 | Case 100; $INTERNET_STATUS_REQUEST_COMPLETE |
|---|
| 40 | ConsoleWrite('REQUEST_COMPLETE' & @CRLF) |
|---|
| 41 | Case 60 ;$INTERNET_STATUS_HANDLE_CREATED |
|---|
| 42 | ConsoleWrite('HANDLE_CREATED ' & @CRLF) |
|---|
| 43 | Case 70 ;$INTERNET_STATUS_HANDLE_CLOSING |
|---|
| 44 | ConsoleWrite('HANDLE_CLOSING' & @CRLF) |
|---|
| 45 | Case 30; $INTERNET_STATUS_SENDING_REQUEST |
|---|
| 46 | ConsoleWrite('SENDING_REQUEST.....' & @CRLF) |
|---|
| 47 | Case 31; $INTERNET_STATUS_REQUEST_SENT |
|---|
| 48 | Local $Size, $iBytesRead |
|---|
| 49 | $Size = DllStructCreate('dword') |
|---|
| 50 | _WinAPI_ReadProcessMemory(_WinAPI_GetCurrentProcess(), $lpvStatusInformation, DllStructGetPtr($Size), $dwStatusInformationLength, $iBytesRead) |
|---|
| 51 | ConsoleWrite('REQUEST_SENT | Size = ' & DllStructGetData($Size, 1) & ' Bytes Bytes read = ' & $iBytesRead & @CRLF) |
|---|
| 52 | Case 40; $INTERNET_STATUS_RECEIVING_RESPONSE |
|---|
| 53 | ConsoleWrite('RECEIVING_RESPONSE.....'& @CRLF) |
|---|
| 54 | Case 41;$INTERNET_STATUS_RESPONSE_RECEIVED |
|---|
| 55 | Local $Size, $iBytesRead |
|---|
| 56 | $Size = DllStructCreate('dword') |
|---|
| 57 | _WinAPI_ReadProcessMemory(_WinAPI_GetCurrentProcess(), $lpvStatusInformation, DllStructGetPtr($Size), $dwStatusInformationLength, $iBytesRead) |
|---|
| 58 | ConsoleWrite('REQUEST_SENT | Size = ' & DllStructGetData($Size, 1) & ' Bytes Bytes read = ' & $iBytesRead & @CRLF) |
|---|
| 59 | Case 200; $INTERNET_STATUS_STATE_CHANGE |
|---|
| 60 | ConsoleWrite('STATE_CHANGE' & @CRLF) |
|---|
| 61 | Case 10; $INTERNET_STATUS_RESOLVING_NAME |
|---|
| 62 | ConsoleWrite('RESOLVING_NAME.....'& @CRLF) |
|---|
| 63 | Case 11; $INTERNET_STATUS_NAME_RESOLVED |
|---|
| 64 | ConsoleWrite('NAME_RESOLVED' & @CRLF) |
|---|
| 65 | Case Else |
|---|
| 66 | ConsoleWrite($dwInternetStatus & @CRLF) |
|---|
| 67 | EndSwitch |
|---|
| 68 | EndFunc ;==>_InternetStatusCallback |
|---|
| 69 | #EndRegion |
|---|
| 70 | |
|---|
| 71 | |
|---|
| 72 | ;FUNCTION# ==================================================================================================================== |
|---|
| 73 | ; Name...........: _FTP_SetStatusCallback |
|---|
| 74 | ; Description ...: Registers callback function that WinINet functions can call as progress is made during an operation. |
|---|
| 75 | ; Syntax.........: _InternetSetStatusCallback($l_InternetSession, $sFunctionName) |
|---|
| 76 | ; Parameters ....: $l_FTPSession - as returned by _FTP_Open(). |
|---|
| 77 | ; $sFunctionName - Function Name |
|---|
| 78 | ; Return values .: Success - Pointer to callback function |
|---|
| 79 | ; Failure - 0 |
|---|
| 80 | ; Author ........: Beege |
|---|
| 81 | ; Modified.......: |
|---|
| 82 | ; Remarks .......: User Callback function MUST have five parameters. Ex: _Callback(parm1,parm2,parm3,parm4,parm5) |
|---|
| 83 | ; Because callbacks are made during processing of the request, the application should spend little time in |
|---|
| 84 | ; the callback function to avoid degrading data throughput on the network. For example, displaying a dialog |
|---|
| 85 | ; box in a callback function can be such a lengthy operation that the server terminates the request. |
|---|
| 86 | ; Related .......: |
|---|
| 87 | ; Link ..........: @@MsdnLink@@ InternetSetStatusCallback |
|---|
| 88 | ; Example .......: Yes |
|---|
| 89 | ; =============================================================================================================================== |
|---|
| 90 | Func _FTP_SetStatusCallback($l_FTPSession, $s_FunctionName) |
|---|
| 91 | If $__ghWinInet_FTP = -1 Then Return SetError(-2, 0, 0) |
|---|
| 92 | |
|---|
| 93 | Local $CallBack_Register = DllCallbackRegister($s_FunctionName, "none", "ptr;ptr;dword;ptr;dword") |
|---|
| 94 | If @error Then Return SetError(-1, 0, 0) |
|---|
| 95 | |
|---|
| 96 | Local $ah_CallBackFunction = DllCall($__ghWinInet_FTP, "ptr", "InternetSetStatusCallback", "ptr", $l_FTPSession, "ulong_ptr", DllCallbackGetPtr($CallBack_Register)) |
|---|
| 97 | If @error Then Return SetError(-1, 0, 0) |
|---|
| 98 | |
|---|
| 99 | $__ghCallback_FTP = $ah_CallBackFunction[1] |
|---|
| 100 | Return $ah_CallBackFunction[1] |
|---|
| 101 | |
|---|
| 102 | EndFunc ;==>_InternetSetStatusCallback |
|---|
| 103 | |
|---|
| 104 | ;A modified _FTP_Close() that releases Dllcallback if it has been registered. (Function taken from v3.3.1.3 beta) |
|---|
| 105 | Func __FTP_Close($l_InternetSession) |
|---|
| 106 | If $__ghWinInet_FTP = -1 Then Return SetError(-2, 0, 0) |
|---|
| 107 | Local $ai_InternetCloseHandle = DllCall($__ghWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $l_InternetSession) |
|---|
| 108 | If @error Or $ai_InternetCloseHandle[0] = 0 Then Return SetError(-1, _WinAPI_GetLastError(), 0) |
|---|
| 109 | |
|---|
| 110 | If $__ghCallback_FTP <> -1 Then DllCallbackFree($__ghCallback_FTP);<<<<< This is the only part that has been changed from the original. |
|---|
| 111 | |
|---|
| 112 | Return $ai_InternetCloseHandle[0] |
|---|
| 113 | |
|---|
| 114 | EndFunc ;==>_FTP_Close |
|---|