From 84042f1370003b2917deda2dcfaf499215efb3b7 Mon Sep 17 00:00:00 2001 From: Thomas B <49310055+kwaishang@users.noreply.github.com> Date: Tue, 11 Jun 2019 17:57:08 +0200 Subject: [PATCH] Enhance 'Transport to ZIP' to process multiple transport requests (#2683) * New Program : Mass Transport to local zip file Create new program ZMASSGIT in order to convert multiple tranport request to local zip files ( by giving output folder ). Timestamped subfolder will be created in the input folder. * Add files via upload * Update zmassgit.prog.abap * Add files via upload * Add files via upload * Delete zmassgit.prog.xml * Delete zmassgit.prog.abap * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Delete zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2zipf01.abap * Delete zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2zipf01.xml * Delete zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2zipplc.abap * Delete zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2zipplc.xml * Delete zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2zipscr.abap * Rename zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2zipscr.xml to src/zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2zipscr.xml * Rename zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2ziptop.abap to src/zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2ziptop.abap * Rename zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2ziptop.xml to src/zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2ziptop.xml * Rename zabapgit_masstransp2zip.fugr.saplzabapgit_masstransp2zip.abap to src/zabapgit_masstransp2zip.fugr.saplzabapgit_masstransp2zip.abap * Rename zabapgit_masstransp2zip.fugr.saplzabapgit_masstransp2zip.xml to src/zabapgit_masstransp2zip.fugr.saplzabapgit_masstransp2zip.xml * Rename zabapgit_masstransp2zip.fugr.xml to src/zabapgit_masstransp2zip.fugr.xml * Rename zabapgit_masstransp2zip.fugr.z_abapgit_transports_2_zip.abap to src/zabapgit_masstransp2zip.fugr.z_abapgit_transports_2_zip.abap * Rename zcl_abapgit_transport_mass.clas.abap to src/zcl_abapgit_transport_mass.clas.abap * Rename zcl_abapgit_transport_mass.clas.xml to src/zcl_abapgit_transport_mass.clas.xml * Delete zcl_abapgit_zip.clas.abap * Delete zcl_abapgit_zip.clas.xml * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Update zcl_abapgit_zip.clas.abap * Update zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2zipf01.abap * Update zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2zipf01.abap * Update zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2zipf01.abap * Update zcl_abapgit_transport_mass.clas.xml * Update zcl_abapgit_transport_mass.clas.abap * Update zabapgit_masstransp2zip.fugr.saplzabapgit_masstransp2zip.abap * Update zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2zipplc.abap * Update zabapgit_masstransp2zip.fugr.saplzabapgit_masstransp2zip.xml * Update zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2zipplc.abap * Update zabapgit_masstransp2zip.fugr.lzabapgit_masstransp2zipplc.abap * Update zabapgit_masstransp2zip.fugr.saplzabapgit_masstransp2zip.abap * New version without function group * Cleanup * Abaplint * AbapLint Fixes * Remove plugins objects from master * Skip log flag in ZIP export * Popup to ask the Export logic ( FULL / PREFIX ..) * line length for abaplint * Refactoring of code Avoid redundancy of code and remove unused constant. * Reduce line 50 length for abaplint ( < 120 ) * Change by the review of code Refactoring of code * AbapLint Fix --- src/ui/zcl_abapgit_gui_router.clas.abap | 6 +- src/zcl_abapgit_transport.clas.abap | 28 +- src/zcl_abapgit_transport_mass.clas.abap | 69 +++++ ...bapgit_transport_mass.clas.locals_imp.abap | 263 ++++++++++++++++++ src/zcl_abapgit_transport_mass.clas.xml | 16 ++ src/zcl_abapgit_zip.clas.abap | 98 ++++--- 6 files changed, 428 insertions(+), 52 deletions(-) create mode 100644 src/zcl_abapgit_transport_mass.clas.abap create mode 100644 src/zcl_abapgit_transport_mass.clas.locals_imp.abap create mode 100644 src/zcl_abapgit_transport_mass.clas.xml diff --git a/src/ui/zcl_abapgit_gui_router.clas.abap b/src/ui/zcl_abapgit_gui_router.clas.abap index 071dd8145..1bd502246 100644 --- a/src/ui/zcl_abapgit_gui_router.clas.abap +++ b/src/ui/zcl_abapgit_gui_router.clas.abap @@ -647,10 +647,8 @@ CLASS ZCL_ABAPGIT_GUI_ROUTER IMPLEMENTATION. file_download( iv_package = lv_package iv_xstr = lv_xstr ). ev_state = zcl_abapgit_gui=>c_event_state-no_more_act. - WHEN zif_abapgit_definitions=>c_action-zip_transport. " Export transport as ZIP - lv_xstr = zcl_abapgit_transport=>zip( ). - file_download( iv_package = 'TRANSPORT' - iv_xstr = lv_xstr ). + WHEN zif_abapgit_definitions=>c_action-zip_transport. " Export transports as ZIP + zcl_abapgit_transport_mass=>run( ). ev_state = zcl_abapgit_gui=>c_event_state-no_more_act. WHEN zif_abapgit_definitions=>c_action-zip_object. " Export object as ZIP zcl_abapgit_zip=>export_object( ). diff --git a/src/zcl_abapgit_transport.clas.abap b/src/zcl_abapgit_transport.clas.abap index 8b05ce20b..f1d5975fb 100644 --- a/src/zcl_abapgit_transport.clas.abap +++ b/src/zcl_abapgit_transport.clas.abap @@ -1,13 +1,16 @@ CLASS zcl_abapgit_transport DEFINITION PUBLIC - FINAL CREATE PUBLIC . PUBLIC SECTION. CLASS-METHODS zip + IMPORTING + !iv_show_log_popup TYPE abap_bool DEFAULT abap_true + !iv_logic TYPE string OPTIONAL + !is_trkorr TYPE trwbo_request_header OPTIONAL RETURNING - VALUE(rv_xstr) TYPE xstring + VALUE(rv_xstr) TYPE xstring RAISING zcx_abapgit_exception . CLASS-METHODS to_tadir @@ -17,7 +20,7 @@ CLASS zcl_abapgit_transport DEFINITION VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt RAISING zcx_abapgit_exception . - PRIVATE SECTION. + PROTECTED SECTION. CLASS-METHODS read_requests IMPORTING @@ -38,6 +41,7 @@ CLASS zcl_abapgit_transport DEFINITION VALUE(rt_tadir) TYPE zif_abapgit_definitions=>ty_tadir_tt RAISING zcx_abapgit_exception . + PRIVATE SECTION. ENDCLASS. @@ -168,7 +172,12 @@ CLASS ZCL_ABAPGIT_TRANSPORT IMPLEMENTATION. lt_trkorr TYPE trwbo_request_headers. - lt_trkorr = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_transports( ). + IF is_trkorr IS SUPPLIED. + APPEND is_trkorr TO lt_trkorr. + ELSE. + lt_trkorr = zcl_abapgit_ui_factory=>get_popups( )->popup_to_select_transports( ). + ENDIF. + IF lines( lt_trkorr ) = 0. RETURN. ENDIF. @@ -188,15 +197,20 @@ CLASS ZCL_ABAPGIT_TRANSPORT IMPLEMENTATION. ls_data-package = lv_package. ls_data-dot_abapgit = zcl_abapgit_dot_abapgit=>build_default( )->get_data( ). - ls_data-dot_abapgit-folder_logic = zcl_abapgit_ui_factory=>get_popups( )->popup_folder_logic( ). + IF iv_logic IS SUPPLIED AND iv_logic IS NOT INITIAL. + ls_data-dot_abapgit-folder_logic = iv_logic. + ELSE. + ls_data-dot_abapgit-folder_logic = zcl_abapgit_ui_factory=>get_popups( )->popup_folder_logic( ). + ENDIF. CREATE OBJECT lo_repo EXPORTING is_data = ls_data. rv_xstr = zcl_abapgit_zip=>export( - io_repo = lo_repo - it_filter = lt_tadir ). + io_repo = lo_repo + it_filter = lt_tadir + iv_show_log = iv_show_log_popup ). ENDMETHOD. ENDCLASS. diff --git a/src/zcl_abapgit_transport_mass.clas.abap b/src/zcl_abapgit_transport_mass.clas.abap new file mode 100644 index 000000000..f27294110 --- /dev/null +++ b/src/zcl_abapgit_transport_mass.clas.abap @@ -0,0 +1,69 @@ +CLASS zcl_abapgit_transport_mass DEFINITION + PUBLIC + INHERITING FROM zcl_abapgit_transport + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + CLASS-METHODS run . + PROTECTED SECTION. + PRIVATE SECTION. + +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_TRANSPORT_MASS IMPLEMENTATION. + + + METHOD run. + + DATA: + lt_trkorr TYPE trwbo_request_headers. + + DATA: + lo_transport_zipper TYPE REF TO lcl_transport_zipper, + lo_except TYPE REF TO cx_root, + lv_folder TYPE string. + + TRY. + + lt_trkorr = lcl_gui=>select_tr_requests( ). + + IF lt_trkorr[] IS NOT INITIAL. + + lv_folder = lcl_gui=>f4_folder( ). + + IF lv_folder IS INITIAL. +* Empty folder + zcx_abapgit_exception=>raise( 'Empty destination folder' ). + ENDIF. + +* Instantiate transport zipper object that will also create the timestamped output folder + CREATE OBJECT lo_transport_zipper TYPE lcl_transport_zipper + EXPORTING + iv_folder = lv_folder. + +* Generate the local zip files from the given list of transport requests + lo_transport_zipper->generate_files( + it_trkorr = lt_trkorr + iv_logic = zcl_abapgit_ui_factory=>get_popups( )->popup_folder_logic( ) ). + +* Open output folder if user asked it + lcl_gui=>open_folder_frontend( lo_transport_zipper->gv_full_folder ). + + ELSE. +* No data found for the provided selection criterias + zcx_abapgit_exception=>raise( 'No transport requests selected' ). + ENDIF. + + CATCH cx_wrong_data + zcx_abapgit_exception INTO lo_except. + + MESSAGE lo_except->get_text( ) TYPE 'S' DISPLAY LIKE 'E'. + + ENDTRY. + + ENDMETHOD. +ENDCLASS. diff --git a/src/zcl_abapgit_transport_mass.clas.locals_imp.abap b/src/zcl_abapgit_transport_mass.clas.locals_imp.abap new file mode 100644 index 000000000..38f54c67b --- /dev/null +++ b/src/zcl_abapgit_transport_mass.clas.locals_imp.abap @@ -0,0 +1,263 @@ +CLASS lcl_gui DEFINITION FINAL. + + PUBLIC SECTION. + + CLASS-METHODS f4_folder RETURNING VALUE(rv_folder) TYPE string RAISING zcx_abapgit_exception. + CLASS-METHODS open_folder_frontend IMPORTING iv_folder TYPE string. + CLASS-METHODS select_tr_requests RETURNING VALUE(rt_trkorr) TYPE trwbo_request_headers. + + PRIVATE SECTION. + CLASS-DATA: gv_last_folder TYPE string. + +ENDCLASS. + +CLASS lcl_gui IMPLEMENTATION. + + METHOD f4_folder. + + DATA: lv_title TYPE string. + + lv_title = 'Choose the destination folder for the ZIP files'. + + cl_gui_frontend_services=>directory_browse( + EXPORTING + window_title = lv_title + initial_folder = gv_last_folder + CHANGING + selected_folder = rv_folder + EXCEPTIONS + cntl_error = 1 + error_no_gui = 2 + not_supported_by_gui = 3 + OTHERS = 4 ). + + IF sy-subrc = 0. + gv_last_folder = rv_folder. "Store the last directory for user friendly UI + ELSE. + zcx_abapgit_exception=>raise( 'Folder matchcode exception' ). + ENDIF. + + ENDMETHOD. + + METHOD open_folder_frontend. + + IF NOT iv_folder IS INITIAL. + + cl_gui_frontend_services=>execute( + EXPORTING + document = iv_folder + EXCEPTIONS + cntl_error = 1 + error_no_gui = 2 + bad_parameter = 3 + file_not_found = 4 + path_not_found = 5 + file_extension_unknown = 6 + error_execute_failed = 7 + OTHERS = 8 ). + IF sy-subrc <> 0. + MESSAGE 'Problem when opening output folder' TYPE 'S' DISPLAY LIKE 'E'. + ENDIF. + + ENDIF. + + ENDMETHOD. + + METHOD select_tr_requests. + + DATA: ls_popup TYPE strhi_popup, + ls_selection TYPE trwbo_selection. + + ls_popup-start_column = 5. + ls_popup-start_row = 5. + +*- Prepare the selection ----------------------------------------------* + ls_selection-trkorrpattern = space. + ls_selection-client = space. + ls_selection-stdrequest = space. + ls_selection-reqfunctions = 'K'. + ls_selection-reqstatus = 'RNODL'. + +*- Call transport selection popup -------------------------------------* + CALL FUNCTION 'TRINT_SELECT_REQUESTS' + EXPORTING + iv_username_pattern = '*' + iv_via_selscreen = 'X' + is_selection = ls_selection + iv_complete_projects = space + iv_title = 'ABAPGit Transport Mass Downloader' + is_popup = ls_popup + IMPORTING + et_requests = rt_trkorr + EXCEPTIONS + action_aborted_by_user = 1 + OTHERS = 2. + IF sy-subrc <> 0. + CLEAR rt_trkorr. + ELSE. + SORT rt_trkorr BY trkorr. + DELETE ADJACENT DUPLICATES FROM rt_trkorr COMPARING trkorr. + ENDIF. + + ENDMETHOD. + +ENDCLASS. + +CLASS lcl_transport_zipper DEFINITION FINAL. + + PUBLIC SECTION. +* Folder + TYPES ty_folder TYPE string. +* Filename + TYPES ty_filename TYPE string. + +* File extension + CONSTANTS gc_zip_ext TYPE string VALUE '.zip' ##NO_TEXT. + + DATA: gv_timestamp TYPE string, + gv_separator TYPE c, + gv_full_folder TYPE ty_folder READ-ONLY. + + METHODS constructor IMPORTING iv_folder TYPE ty_folder + RAISING zcx_abapgit_exception. + + METHODS generate_files IMPORTING it_trkorr TYPE trwbo_request_headers + iv_logic TYPE any + RAISING zcx_abapgit_exception. + + CLASS-METHODS does_folder_exist IMPORTING iv_folder TYPE string + RETURNING VALUE(rv_folder_exist) TYPE abap_bool + RAISING zcx_abapgit_exception. + + PRIVATE SECTION. + + METHODS get_full_folder IMPORTING iv_folder TYPE ty_folder + RETURNING VALUE(rv_full_folder) TYPE ty_folder + RAISING zcx_abapgit_exception. + + METHODS get_filename IMPORTING is_trkorr TYPE trwbo_request_header + RETURNING VALUE(rv_filename) TYPE ty_filename. + +ENDCLASS. + +CLASS lcl_transport_zipper IMPLEMENTATION. + + METHOD constructor. + + CONCATENATE sy-datlo sy-timlo INTO me->gv_timestamp SEPARATED BY '_'. + + me->gv_full_folder = get_full_folder( iv_folder = iv_folder ). + + cl_gui_frontend_services=>get_file_separator( + CHANGING + file_separator = gv_separator + EXCEPTIONS + cntl_error = 1 + error_no_gui = 2 + not_supported_by_gui = 3 + OTHERS = 4 ). + IF sy-subrc <> 0. + gv_separator = '\'. "Default MS Windows separator + ENDIF. + + ENDMETHOD. + + METHOD does_folder_exist. + + cl_gui_frontend_services=>directory_exist( + EXPORTING + directory = iv_folder + RECEIVING + result = rv_folder_exist + EXCEPTIONS + cntl_error = 1 + error_no_gui = 2 + wrong_parameter = 3 + not_supported_by_gui = 4 + OTHERS = 5 ). + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'Error from cl_gui_frontend_services=>directory_exist' ). + ENDIF. + + ENDMETHOD. + + METHOD get_full_folder. + + DATA: lv_sep TYPE c, + lv_rc TYPE i. + +*-obtain file separator character--------------------------------------- + cl_gui_frontend_services=>get_file_separator( + CHANGING + file_separator = lv_sep + EXCEPTIONS + cntl_error = 1 + error_no_gui = 2 + not_supported_by_gui = 3 + OTHERS = 4 ). + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'Internal error getting file separator' ). + ENDIF. + + CONCATENATE iv_folder + gv_timestamp + INTO rv_full_folder SEPARATED BY lv_sep. + + IF does_folder_exist( iv_folder = rv_full_folder ) = abap_false. + + cl_gui_frontend_services=>directory_create( + EXPORTING + directory = rv_full_folder + CHANGING + rc = lv_rc " Return Code + EXCEPTIONS + directory_create_failed = 1 + cntl_error = 2 + error_no_gui = 3 + directory_access_denied = 4 + directory_already_exists = 5 + path_not_found = 6 + unknown_error = 7 + not_supported_by_gui = 8 + wrong_parameter = 9 + OTHERS = 10 ). + IF sy-subrc <> 0 AND sy-subrc <> 5. + zcx_abapgit_exception=>raise( 'Error from cl_gui_frontend_services=>directory_create' ). + ENDIF. + + ENDIF. + + ENDMETHOD. + + METHOD get_filename . + +* Generate filename + CONCATENATE is_trkorr-trkorr '_' is_trkorr-as4text '_' gv_timestamp gc_zip_ext + INTO rv_filename. + +* Remove reserved characters (for Windows based systems) + TRANSLATE rv_filename USING '/ \ : " * > < ? | '. + + CONCATENATE gv_full_folder rv_filename INTO rv_filename SEPARATED BY gv_separator. + + ENDMETHOD. + + METHOD generate_files. + + DATA: ls_trkorr LIKE LINE OF it_trkorr, + lv_zipbinstring TYPE xstring. + + LOOP AT it_trkorr INTO ls_trkorr. + + lv_zipbinstring = zcl_abapgit_transport_mass=>zip( is_trkorr = ls_trkorr + iv_logic = iv_logic + iv_show_log_popup = abap_false ). + + zcl_abapgit_zip=>save_binstring_to_localfile( iv_binstring = lv_zipbinstring + iv_filename = get_filename( ls_trkorr ) ). + + ENDLOOP. "it_trkorr + + ENDMETHOD. + +ENDCLASS. diff --git a/src/zcl_abapgit_transport_mass.clas.xml b/src/zcl_abapgit_transport_mass.clas.xml new file mode 100644 index 000000000..4aaf10e54 --- /dev/null +++ b/src/zcl_abapgit_transport_mass.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_TRANSPORT_MASS + E + Mass Transport to ZIP + 1 + X + X + X + + + + diff --git a/src/zcl_abapgit_zip.clas.abap b/src/zcl_abapgit_zip.clas.abap index db8448984..675e1ffc3 100644 --- a/src/zcl_abapgit_zip.clas.abap +++ b/src/zcl_abapgit_zip.clas.abap @@ -7,6 +7,7 @@ CLASS zcl_abapgit_zip DEFINITION CLASS-METHODS export IMPORTING !io_repo TYPE REF TO zcl_abapgit_repo + !iv_show_log TYPE abap_bool DEFAULT abap_true !it_filter TYPE zif_abapgit_definitions=>ty_tadir_tt OPTIONAL RETURNING VALUE(rv_xstr) TYPE xstring @@ -14,13 +15,13 @@ CLASS zcl_abapgit_zip DEFINITION zcx_abapgit_exception . CLASS-METHODS export_object RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . CLASS-METHODS export_package EXPORTING !ev_xstr TYPE xstring !ev_package TYPE devclass RAISING - zcx_abapgit_exception. + zcx_abapgit_exception . CLASS-METHODS load IMPORTING !iv_xstr TYPE xstring @@ -28,6 +29,11 @@ CLASS zcl_abapgit_zip DEFINITION VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_tt RAISING zcx_abapgit_exception . + CLASS-METHODS save_binstring_to_localfile + IMPORTING iv_filename TYPE string + iv_binstring TYPE xstring + RAISING zcx_abapgit_exception. + PROTECTED SECTION. PRIVATE SECTION. @@ -50,7 +56,7 @@ CLASS zcl_abapgit_zip DEFINITION CHANGING !ct_files TYPE zif_abapgit_definitions=>ty_files_tt RAISING - zcx_abapgit_exception . + zcx_abapgit_exception. CLASS-METHODS unzip_file IMPORTING !iv_xstr TYPE xstring @@ -104,7 +110,7 @@ CLASS ZCL_ABAPGIT_ZIP IMPLEMENTATION. lt_zip = io_repo->get_files_local( ii_log = li_log it_filter = it_filter ). - IF li_log->count( ) > 0. + IF li_log->count( ) > 0 AND iv_show_log = abap_true. zcl_abapgit_log_viewer=>show_log( iv_header_text = 'Zip Export Log' ii_log = li_log ). ENDIF. @@ -119,7 +125,6 @@ CLASS ZCL_ABAPGIT_ZIP IMPLEMENTATION. DATA: ls_tadir TYPE zif_abapgit_definitions=>ty_tadir, lv_folder TYPE string, lv_fullpath TYPE string, - lt_rawdata TYPE solix_tab, lv_sep TYPE c LENGTH 1, ls_files_item TYPE zcl_abapgit_objects=>ty_serialization. @@ -162,43 +167,9 @@ CLASS ZCL_ABAPGIT_ZIP IMPLEMENTATION. LOOP AT ls_files_item-files ASSIGNING . CONCATENATE lv_folder lv_sep -filename INTO lv_fullpath. - lt_rawdata = cl_bcs_convert=>xstring_to_solix( -data ). + save_binstring_to_localfile( iv_filename = lv_fullpath + iv_binstring = -data ). - cl_gui_frontend_services=>gui_download( - EXPORTING - bin_filesize = xstrlen( -data ) - filename = lv_fullpath - filetype = 'BIN' - CHANGING - data_tab = lt_rawdata - 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. - zcx_abapgit_exception=>raise( 'error from gui_download' ). - ENDIF. ENDLOOP. ENDMETHOD. @@ -305,6 +276,51 @@ CLASS ZCL_ABAPGIT_ZIP IMPLEMENTATION. ENDMETHOD. + METHOD save_binstring_to_localfile. + + DATA lt_rawdata TYPE solix_tab. + + lt_rawdata = cl_bcs_convert=>xstring_to_solix( iv_binstring ). + + cl_gui_frontend_services=>gui_download( + EXPORTING + bin_filesize = xstrlen( iv_binstring ) + filename = iv_filename + filetype = 'BIN' + CHANGING + data_tab = lt_rawdata + 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. + zcx_abapgit_exception=>raise( 'error from gui_download' ). + ENDIF. + + ENDMETHOD. + + METHOD unzip_file. DATA: lo_zip TYPE REF TO cl_abap_zip,