compile function rti_HTTP_Download( uiParams, url, method, payload, credentials, headers, timeoutInfo, responseFile ) /* ** Copyright (C) 2013-2019 Revelation Software Inc. All Rights Reserved ** Author : Mr C Date : June 2019 Purpose : Stored procedure to initiate an asynchronous HTTP download Parameters ========== uiParams - [required] This is an @fm delimited array of UI info for the download process: <1> Parent Window [optional] ID of the parent window for the download dialog. If not specified the caller must provide a CallBackID to receive the returned response content. <2> Modal Flag [optional]. If TRUE then the parent window will be disabled for the duration of the download. <3> EndDialogAsyncID [optional] Callback token for the download to return to the parent window's ENDDIALOG event as the AsyncID parameter. <4> CallbackProc [optional] Name of a stored procedure to call with the response data if EndDialogAsyncID is not specified. The Callback proc must support the following interface: proc( callbackID, responseContent ) <5> CallbackID [optional, required for CallbackProc] If a CallBackProc is specified this field contains a token returned to the CallBackProc with the response content <6> Info text [optional] Contains text to display in the dialog - defaults to the URL <7> Show Progress in Taskbar [optional] If TRUE$ then sync the progress bar to the parent window's task bar icon. Defaults to FALSE$. <8> Hide UI [optional] If TRUE$ then don't show the progress dialog. url - [required] Contains the URL to download from method - [optional] HTTP verb (GET,POST,HEAD,DELETE etc). Defaults to "GET payload - [optional] Content to send to the server as part of the request credentials - [optional] Username and password to send to the server <1> Username <2> Password> headers - [optional] - Dynamic array of request headers to send to the server in the format: <1> @vm'd list of header names <2> @vm'd list of header values timeoutInfo - [optional] Timeout in milliseconds. responseFile- [optional] Name of a file to download the response content to Returns ======= TRUE$ if the download was started sucessfully, or FALSE$ otherwise. Error information is returned via Get/Set_Status(). Comments ======== This function is designed to mimic the existing OLE_GETWEBPAGE stored proc and provide an example of how to use the HTTPCLIENT control to provide a UI for a download. As such the arguments passed have been kept to the same format as much as possible. Changes from OLE_GETWEBPAGE are: 1) "parentID" has been added so we can specify a parent window for the progress dialog 2) "timeoutInfo" only supports a single value - the HTTPCLIENT control does not have separate timeout parameters for different states 3) "responseBody" has been removed - the actual response content is returned directly from this this proc - there is no separate responseText property as per the XMLHTTPRequest object Amended Date Reason ======= ==== ====== Mr C 09 Mar 22 Implemented HDL_UIPARAM_POS_HIDEUI$ uiParam option */ #pragma precomp event_precomp declare function get_Property, set_Property, exec_Method, get_Status declare function rti_UC, start_Window $insert rti_HTTP_Download_Equates $insert ps_HttpClient_Equates $insert msWin_ShowWindow_Equates $insert rti_Get_Proc_Info_Equates $insert rti_SSP_Equates $insert logical if assigned( uiParams ) else uiParams = "" if assigned( url ) else url = "" if assigned( method ) else method = "" if assigned( payload ) else payload = "" if assigned( credentials ) else credentials = "" if assigned( headers ) else headers = "" if assigned( timeoutInfo ) else timeoutInfo = "" if assigned( responseFile ) else responseFile = "" if bLen( url ) else call set_Status( TRUE$, "No URL passed to the RTI_HTTP_DOWNLOAD procedure" ) return FALSE$ end if bLen( method ) else method = "GET" end parentID = uiParams if bLen( parentID ) then if get_Property( parentID, "HANDLE" ) else call set_Status( TRUE$, "Invalid parent ID " : quote( parentID ) : " passed to the RTI_HTTP_DOWNLOAD procedure" ) return FALSE$ end end procID = uiParams if blen( procID ) then procInfo = rti_Get_Proc_Info( procID ) if get_Status() then return FALSE$ end if ( procInfo < 2 ) then call set_Status( TRUE$, "Invalid proc ID " : quote( procID ) : " passed to the RTI_HTTP_DOWNLOAD procedure [Invalid interface]" ) return FALSE$ end end call set_Status( FALSE$ ) winID = start_Window( "RTI_HTTP_DOWNLOAD_UI", parentID, uiParams ) if bLen( winID ) else // Error information is in SSP status return FALSE$ end objxArray = winID : ".HCL_DOWNLOAD" propArray = "URL" dataArray = url objxArray := @rm : winID : ".HCL_DOWNLOAD" propArray := @rm : "VERB" dataArray := @rm : rti_UC( method : "" ) if bLen( credentials ) then objxArray := @rm : winID : ".HCL_DOWNLOAD" propArray := @rm : "USERNAME" dataArray := @rm : credentials<1> objxArray := @rm : winID : ".HCL_DOWNLOAD" propArray := @rm : "PASSWORD" dataArray := @rm : credentials<2> end if bLen( headers ) then // This is in "ARRAY" format - the control wants this in // "LIST" format objxArray := @rm : winID : ".HCL_DOWNLOAD" propArray := @rm : "REQUESTHEADERS" dataArray := @rm : exec_Method( "SYSTEM", "ARRAY2LIST", headers ) end if bLen( timeoutInfo ) then objxArray := @rm : winID : ".HCL_DOWNLOAD" propArray := @rm : "TIMEOUT" dataArray := @rm : timeoutInfo<1> end if bLen( responseFile ) then objxArray := @rm : winID : ".HCL_DOWNLOAD" propArray := @rm : "RESPONSEFILE" dataArray := @rm : responseFile end tmp = uiParams if blen( tmp ) else tmp = get_Property( winID : ".TXT_DOWNLOAD", "TEXT" ) end swap "%1%" with url in tmp call set_Property_Only( winID : ".TXT_DOWNLOAD", "TEXT", tmp ) if uiParams else objxArray := @rm : winID propArray := @rm : "VISIBLE" dataArray := @rm : SW_SHOWNORMAL$ end call set_Property( objxArray, propArray, dataArray ) bVal = exec_Method( winID : ".HCL_DOWNLOAD", "OPEN" ) if bVal else errorText = trim( get_Property( winID : ".HCL_DOWNLOAD", "ERRORTEXT" ) ) call exec_Method( winID, "CLOSE" ) if bLen( errorText ) else errorText = "Unknown HTTPCLIENT OPEN error" end call set_Status( TRUE$, errorText ) return FALSE$ end bVal = exec_Method( winID : ".HCL_DOWNLOAD", "SEND", payload ) if bVal else errorText = trim( get_Property( winID : ".HCL_DOWNLOAD", "ERRORTEXT" ) ) call exec_Method( winID, "CLOSE" ) if bLen( errorText ) else errorText = "Unknown HTTPCLIENT SEND error" end call set_Status( TRUE$, errorText ) return FALSE$ end return TRUE$ /////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////