diff --git a/src/utils/zcl_abapgit_convert.clas.abap b/src/utils/zcl_abapgit_convert.clas.abap index c395457e0..f85d5f97e 100644 --- a/src/utils/zcl_abapgit_convert.clas.abap +++ b/src/utils/zcl_abapgit_convert.clas.abap @@ -85,7 +85,7 @@ CLASS zcl_abapgit_convert DEFINITION VALUE(rv_xstr) TYPE xstring . CLASS-METHODS xstring_to_bintab IMPORTING - !iv_xstr TYPE xstring + !iv_xstr TYPE xsequence EXPORTING !ev_size TYPE i !et_bintab TYPE STANDARD TABLE . @@ -144,6 +144,7 @@ ENDCLASS. CLASS zcl_abapgit_convert IMPLEMENTATION. + METHOD base64_to_xstring. rv_xstr = cl_http_utility=>decode_x_base64( iv_base64 ). @@ -207,32 +208,6 @@ CLASS zcl_abapgit_convert IMPLEMENTATION. ENDMETHOD. - METHOD language_sap1_to_bcp47. - DATA lv_converter_instance TYPE REF TO object. - DATA lv_converter_class_name TYPE string VALUE `CL_AFF_LANGUAGE_CONVERTER`. - - TRY. - CALL METHOD (lv_converter_class_name)=>create_instance - RECEIVING - result = lv_converter_instance. - - TRY. - CALL METHOD lv_converter_instance->(`IF_AFF_LANGUAGE_CONVERTER~SAP1_TO_BCP47`) - EXPORTING - language = im_lang_sap1 - RECEIVING - result = re_lang_bcp47. - CATCH cx_static_check. - RAISE no_assignment. - ENDTRY. - CATCH cx_sy_dyn_call_error. - TRY. - re_lang_bcp47 = lcl_bcp47_language_table=>sap1_to_bcp47( im_lang_sap1 ). - CATCH zcx_abapgit_exception. - RAISE no_assignment. - ENDTRY. - ENDTRY. - ENDMETHOD. METHOD language_bcp47_to_sap1. DATA lv_converter_instance TYPE REF TO object. @@ -289,6 +264,35 @@ CLASS zcl_abapgit_convert IMPLEMENTATION. ENDTRY. ENDMETHOD. + + METHOD language_sap1_to_bcp47. + DATA lv_converter_instance TYPE REF TO object. + DATA lv_converter_class_name TYPE string VALUE `CL_AFF_LANGUAGE_CONVERTER`. + + TRY. + CALL METHOD (lv_converter_class_name)=>create_instance + RECEIVING + result = lv_converter_instance. + + TRY. + CALL METHOD lv_converter_instance->(`IF_AFF_LANGUAGE_CONVERTER~SAP1_TO_BCP47`) + EXPORTING + language = im_lang_sap1 + RECEIVING + result = re_lang_bcp47. + CATCH cx_static_check. + RAISE no_assignment. + ENDTRY. + CATCH cx_sy_dyn_call_error. + TRY. + re_lang_bcp47 = lcl_bcp47_language_table=>sap1_to_bcp47( im_lang_sap1 ). + CATCH zcx_abapgit_exception. + RAISE no_assignment. + ENDTRY. + ENDTRY. + ENDMETHOD. + + METHOD language_sap1_to_sap2. TRY. @@ -381,6 +385,42 @@ CLASS zcl_abapgit_convert IMPLEMENTATION. ENDMETHOD. + METHOD uccp. + + DATA lv_class TYPE string. + DATA lv_xstr TYPE xstring. + DATA lo_instance TYPE REF TO object. + + lv_class = 'CL_ABAP_CONV_IN_CE'. + + TRY. + CALL METHOD (lv_class)=>uccp + EXPORTING + uccp = iv_uccp + RECEIVING + char = rv_char. + CATCH cx_sy_dyn_call_illegal_class. + lv_xstr = iv_uccp. + + CALL METHOD ('CL_ABAP_CONV_CODEPAGE')=>create_in + EXPORTING + codepage = 'UTF-16' + RECEIVING + instance = lo_instance. + +* convert endianness + CONCATENATE lv_xstr+1(1) lv_xstr(1) INTO lv_xstr IN BYTE MODE. + + CALL METHOD lo_instance->('IF_ABAP_CONV_IN~CONVERT') + EXPORTING + source = lv_xstr + RECEIVING + result = rv_char. + ENDTRY. + + ENDMETHOD. + + METHOD xstring_remove_bom. rv_xstr = iv_xstr. @@ -405,10 +445,13 @@ CLASS zcl_abapgit_convert IMPLEMENTATION. FIELD-SYMBOLS TYPE any. - CLEAR et_bintab. ev_size = xstrlen( iv_xstr ). + IF iv_xstr IS INITIAL. + RETURN. + ENDIF. + APPEND INITIAL LINE TO et_bintab ASSIGNING . lv_struct = boolc( cl_abap_typedescr=>describe_by_data( )->type_kind = cl_abap_typedescr=>typekind_struct1 ). @@ -418,7 +461,9 @@ CLASS zcl_abapgit_convert IMPLEMENTATION. = iv_xstr. lv_length = cl_abap_typedescr=>describe_by_data( )->length. - lv_iterations = ev_size DIV lv_length. + ASSERT lv_length > 0. + + lv_iterations = ( ev_size - 1 ) DIV lv_length. DO lv_iterations TIMES. lv_offset = sy-index * lv_length. @@ -493,39 +538,4 @@ CLASS zcl_abapgit_convert IMPLEMENTATION. GET BIT 8 OF iv_x INTO rv_bitbyte+7(1). ENDMETHOD. - - METHOD uccp. - - DATA lv_class TYPE string. - DATA lv_xstr TYPE xstring. - DATA lo_instance TYPE REF TO object. - - lv_class = 'CL_ABAP_CONV_IN_CE'. - - TRY. - CALL METHOD (lv_class)=>uccp - EXPORTING - uccp = iv_uccp - RECEIVING - char = rv_char. - CATCH cx_sy_dyn_call_illegal_class. - lv_xstr = iv_uccp. - - CALL METHOD ('CL_ABAP_CONV_CODEPAGE')=>create_in - EXPORTING - codepage = 'UTF-16' - RECEIVING - instance = lo_instance. - -* convert endianness - CONCATENATE lv_xstr+1(1) lv_xstr(1) INTO lv_xstr IN BYTE MODE. - - CALL METHOD lo_instance->('IF_ABAP_CONV_IN~CONVERT') - EXPORTING - source = lv_xstr - RECEIVING - result = rv_char. - ENDTRY. - - ENDMETHOD. ENDCLASS. diff --git a/src/utils/zcl_abapgit_convert.clas.testclasses.abap b/src/utils/zcl_abapgit_convert.clas.testclasses.abap index 2ee5633a2..dab67ed4e 100644 --- a/src/utils/zcl_abapgit_convert.clas.testclasses.abap +++ b/src/utils/zcl_abapgit_convert.clas.testclasses.abap @@ -19,6 +19,9 @@ CLASS ltcl_convert DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FIN METHODS string_to_xstring FOR TESTING RAISING zcx_abapgit_exception. METHODS xstring_to_bintab FOR TESTING. METHODS xstring_to_bintab_with_field FOR TESTING. + METHODS xstring_to_bintab_initial FOR TESTING. + METHODS xstring_to_bintab_long FOR TESTING. + METHODS xstring_to_bintab_exact FOR TESTING. ENDCLASS. @@ -74,6 +77,87 @@ CLASS ltcl_convert IMPLEMENTATION. ENDMETHOD. + METHOD xstring_to_bintab_initial. + + DATA lt_bintab TYPE TABLE OF w3mime. + DATA lv_size TYPE i. + DATA lv_xstr TYPE xstring. + + zcl_abapgit_convert=>xstring_to_bintab( + EXPORTING + iv_xstr = lv_xstr + IMPORTING + ev_size = lv_size + et_bintab = lt_bintab ). + + cl_abap_unit_assert=>assert_equals( + act = lv_size + exp = 0 ). + + cl_abap_unit_assert=>assert_equals( + act = lines( lt_bintab ) + exp = 0 ). + + ENDMETHOD. + + METHOD xstring_to_bintab_long. + + DATA lt_bintab TYPE TABLE OF w3mime. " x(255) + DATA lv_bin LIKE LINE OF lt_bintab. + DATA lv_size TYPE i. + DATA lv_xstr TYPE xstring. + + lv_xstr = repeat( val = '1122334455' occ = 200 ). + + zcl_abapgit_convert=>xstring_to_bintab( + EXPORTING + iv_xstr = lv_xstr + IMPORTING + ev_size = lv_size + et_bintab = lt_bintab ). + + cl_abap_unit_assert=>assert_equals( + act = lv_size + exp = 1000 ). + + cl_abap_unit_assert=>assert_equals( + act = lines( lt_bintab ) + exp = 4 ). + + READ TABLE lt_bintab INTO lv_bin INDEX 4. + + cl_abap_unit_assert=>assert_equals( + act = lv_bin-line+230(10) + exp = '11223344550000000000' ). + + ENDMETHOD. + + METHOD xstring_to_bintab_exact. + + TYPES ty_line TYPE x LENGTH 5. + DATA lv_xdata TYPE x LENGTH 10. + DATA lt_bintab TYPE TABLE OF ty_line. + DATA lv_size TYPE i. + + lv_xdata = '1122334455FFEEDDCCBB'. + + " must not dump if content fits exactly into bintab + zcl_abapgit_convert=>xstring_to_bintab( + EXPORTING + iv_xstr = lv_xdata + IMPORTING + ev_size = lv_size + et_bintab = lt_bintab ). + + cl_abap_unit_assert=>assert_equals( + act = lv_size + exp = 10 ). + + cl_abap_unit_assert=>assert_equals( + act = lines( lt_bintab ) + exp = 2 ). + + ENDMETHOD. METHOD string_to_xstring.