264 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			264 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 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<HDL_UIPARAM_POS_PARENTWIN$>
 | |
|    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<HDL_UIPARAM_POS_CALLBACKPROC$>
 | |
|    if blen( procID ) then
 | |
|       procInfo = rti_Get_Proc_Info( procID )
 | |
|       if get_Status() then
 | |
|          return FALSE$
 | |
|       end
 | |
|       
 | |
|       if ( procInfo<GPI_ARGCOUNT$> < 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<HDL_UIPARAM_POS_DOWNLOADTEXT$>
 | |
|    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<HDL_UIPARAM_POS_HIDEUI$> 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$
 | |
| 
 | |
| ///////////////////////////////////////////////////////////////////////////////
 | |
| ///////////////////////////////////////////////////////////////////////////////
 |