*&---------------------------------------------------------------------**& Report  ZTEST_XY_ZIP*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*REPORT  ztest_xy_zip.CLASS: gcl_data_process DEFINITION DEFERRED.DATA: go_data_proc  TYPE REF TO gcl_data_process.*----------------------------------------------------------------------**       CLASS gcl_data_process DEFINITION*----------------------------------------------------------------------*CLASS gcl_data_process DEFINITION.  PUBLIC SECTION.    METHODS:*   Instance class constructor    constructor    EXCEPTIONS      ex_file_sel_err      ex_file_upload,*   Zip the files    zip_file      EXCEPTIONS        ex_bin_conv_error        ex_zip_error,*   Download the Zip file to the PC folder    download_file      EXPORTING        y_filesize TYPE i      EXCEPTIONS        ex_dwld_error.  PRIVATE SECTION.    TYPES:    BEGIN OF ps_bin_file,      name TYPE string,      size TYPE i,      data TYPE solix_tab,    END OF ps_bin_file.    DATA: pt_bindata        TYPE STANDARD TABLE OF ps_bin_file,          pt_filetab        TYPE filetable,          pv_dest_filepath  TYPE string,          pt_zip_bin_data   TYPE STANDARD TABLE OF raw255,          pv_zip_size       TYPE i.    METHODS:*   Select the files to be zipped    select_files      EXCEPTIONS        ex_file_sel_err,*   Select the destination file    save_file_dialog.ENDCLASS.                    "gcl_data_process DEFINITION*----------------------------------------------------------------------**       CLASS gcl_data_process IMPLEMENTATION*----------------------------------------------------------------------*CLASS gcl_data_process IMPLEMENTATION.  METHOD select_files.    DATA: lv_ret_code TYPE i,          lv_usr_axn  TYPE i.    cl_gui_frontend_services=>file_open_dialog(      EXPORTING        window_title            = 'Select file'        multiselection          = 'X'      CHANGING        file_table              = me->pt_filetab        rc                      = lv_ret_code        user_action             = lv_usr_axn      EXCEPTIONS        file_open_dialog_failed = 1        cntl_error              = 2        error_no_gui            = 3        not_supported_by_gui    = 4        OTHERS                  = 5           ).    IF sy-subrc <> 0 OR       lv_usr_axn = cl_gui_frontend_services=>action_cancel.      RAISE ex_file_sel_err.    ENDIF.  ENDMETHOD.                    "select_files  METHOD constructor.    DATA: lwa_file    TYPE file_table,          lv_filename TYPE string,          lwa_bindata TYPE me->ps_bin_file.*   Select the files    me->select_files( EXCEPTIONS ex_file_sel_err = 1 ).    IF sy-subrc <> 0.      RAISE ex_file_sel_err.    ENDIF.*   Loop on the selected files & populate the internal table    LOOP AT me->pt_filetab INTO lwa_file.      lv_filename = lwa_file-filename.*     Upload the PDF data in binary format      cl_gui_frontend_services=>gui_upload(        EXPORTING          filename                = lv_filename          filetype                = 'BIN'        IMPORTING          filelength              = lwa_bindata-size        CHANGING          data_tab                = lwa_bindata-data        EXCEPTIONS          file_open_error         = 1          file_read_error         = 2          no_batch                = 3          gui_refuse_filetransfer = 4          invalid_type            = 5          no_authority            = 6          unknown_error           = 7          bad_data_format         = 8          header_not_allowed      = 9          separator_not_allowed   = 10          header_too_long         = 11          unknown_dp_error        = 12          access_denied           = 13          dp_out_of_memory        = 14          disk_full               = 15          dp_timeout              = 16          not_supported_by_gui    = 17          error_no_gui            = 18          OTHERS                  = 19             ).      IF sy-subrc <> 0.        RAISE ex_file_upload.      ENDIF.*     Get the filename      CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'        EXPORTING          full_name     = lv_filename        IMPORTING          stripped_name = lwa_bindata-name        EXCEPTIONS          x_error       = 1          OTHERS        = 2.      IF sy-subrc <> 0.*       SUBRC check is not reqd.      ENDIF.*     Add the PDF data to the internal table      APPEND lwa_bindata TO me->pt_bindata.    ENDLOOP.  ENDMETHOD.                    "constructor  METHOD zip_file.    DATA: lo_zip          TYPE REF TO cl_abap_zip,          lv_xstring      TYPE xstring,          lv_zip_xstring  TYPE xstring.    FIELD-SYMBOLS: <lwa_bindata> TYPE me->ps_bin_file.    CREATE OBJECT lo_zip. "Create instance of Zip Class    LOOP AT me->pt_bindata ASSIGNING <lwa_bindata>.*     Convert the data from Binary format to XSTRING      CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'        EXPORTING          input_length = <lwa_bindata>-size        IMPORTING          buffer       = lv_xstring        TABLES          binary_tab   = <lwa_bindata>-data        EXCEPTIONS          failed       = 1          OTHERS       = 2.      IF sy-subrc <> 0.        RAISE ex_bin_conv_error.      ENDIF.*     Add file to the zip folder      lo_zip->add(  name    = <lwa_bindata>-name                    content = lv_xstring ).    ENDLOOP.*   Get the binary stream for ZIP file    lv_zip_xstring = lo_zip->save( ).*   Convert the XSTRING to Binary table    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'      EXPORTING        buffer        = lv_zip_xstring      IMPORTING        output_length = me->pv_zip_size      TABLES        binary_tab    = me->pt_zip_bin_data.  ENDMETHOD.                    "zip_file  METHOD download_file.    DATA: lv_dest_path TYPE string.*   Get the Zip filepath    me->save_file_dialog( ).    CHECK me->pv_dest_filepath IS NOT INITIAL.*   Download the Zip file    cl_gui_frontend_services=>gui_download(      EXPORTING        bin_filesize              = me->pv_zip_size        filename                  = me->pv_dest_filepath        filetype                  = 'BIN'      IMPORTING        filelength                = y_filesize      CHANGING        data_tab                  = me->pt_zip_bin_data      EXCEPTIONS        file_write_error          = 1        no_batch                  = 2        gui_refuse_filetransfer   = 3        invalid_type              = 4        no_authority              = 5        unknown_error             = 6        header_not_allowed        = 7        separator_not_allowed     = 8        filesize_not_allowed      = 9        header_too_long           = 10        dp_error_create           = 11        dp_error_send             = 12        dp_error_write            = 13        unknown_dp_error          = 14        access_denied             = 15        dp_out_of_memory          = 16        disk_full                 = 17        dp_timeout                = 18        file_not_found            = 19        dataprovider_exception    = 20        control_flush_error       = 21        not_supported_by_gui      = 22        error_no_gui              = 23        OTHERS                    = 24           ).    IF sy-subrc <> 0.      RAISE ex_dwld_error.    ENDIF.  ENDMETHOD.                    "download_file  METHOD save_file_dialog.    DATA: lv_filename TYPE string,          lv_path     TYPE string.    cl_gui_frontend_services=>file_save_dialog(      EXPORTING        window_title         = 'Select the File Save Location'        file_filter = '(*.zip)|*.zip|'      CHANGING        filename             = lv_filename        path                 = lv_path        fullpath             = me->pv_dest_filepath      EXCEPTIONS        cntl_error           = 1        error_no_gui         = 2        not_supported_by_gui = 3        OTHERS               = 4           ).    IF sy-subrc <> 0.*     SUBRC check is not reqd.    ENDIF.  ENDMETHOD.                    "save_file_dialogENDCLASS.                    "gcl_data_process IMPLEMENTATIONSTART-OF-SELECTION.* Get the local instance of file processing class  CREATE OBJECT go_data_proc    EXCEPTIONS      ex_file_sel_err = 1      ex_file_upload  = 2.  IF sy-subrc <> 0.    MESSAGE 'Error Uploading files' TYPE 'I'.    LEAVE LIST-PROCESSING.  ENDIF.* Add the selected files to the ZIP folder  go_data_proc->zip_file(  EXCEPTIONS    ex_bin_conv_error = 1    ex_zip_error = 2  ).  IF sy-subrc <> 0.    MESSAGE 'Error Zipping the files' TYPE 'I'.    LEAVE LIST-PROCESSING.  ENDIF.END-OF-SELECTION.  DATA: gv_filesize TYPE i.* Download the file to the selected folder  go_data_proc->download_file(    IMPORTING      y_filesize = gv_filesize    EXCEPTIONS      ex_dwld_error = 1 ).  IF sy-subrc <> 0.    MESSAGE 'Error downloading the Zip file' TYPE 'E'.  ELSE.    MESSAGE s000(ykg_test) WITH gv_filesize 'bytes downloaded'(001).  ENDIF.