Esempio n. 1
0
 def make_return_list(packet):
     return_list = ''
     for element in packet.get_elements('out'):
         sf = make_short_form(packet.get_underscore_name())
         if element[1] == 'string':
             temp = '\tstrcpy(ret_{0}, {1}r->{0});\n'
             return_list += temp.format(element[0], sf)
         elif element[2] > 1:
             if common.get_type_size(element[1]) > 1:
                 return_list += '\tfor (int i = 0; i < {3}; i++) ret_{0}[i] = ipcon_leconvert_{2}_from({1}r->{0}[i]);\n' \
                                .format(element[0], sf, element[1], element[2])
             else:
                 temp = '\tmemcpy(ret_{0}, {1}r->{0}, {2}*sizeof({3}));\n'
                 return_list += temp.format(element[0],
                                            sf,
                                            element[2],
                                            get_c_type(element[1]))
         elif common.get_type_size(element[1]) > 1:
             return_list += '\t*ret_{0} = ipcon_leconvert_{2}_from({1}r->{0});\n'.format(element[0], sf, element[1])
         else:
             return_list += '\t*ret_{0} = {1}r->{0};\n'.format(element[0], sf)
     return return_list
Esempio n. 2
0
 def make_struct_list(packet):
     struct_list = ''
     for element in packet.get_elements('in'):
         sf = make_short_form(packet.get_underscore_name())
         if element[1] == 'string':
             temp = '\n\tstrncpy({0}.{1}, {1}, {2});\n'
             struct_list += temp.format(sf, element[0], element[2])
         elif element[2] > 1:
             if common.get_type_size(element[1]) > 1:
                 struct_list += '\n\tfor (int i = 0; i < {3}; i++) {0}.{1}[i] = ipcon_leconvert_{2}_to({1}[i]);' \
                                .format(sf, element[0], element[1], element[2])
             else:
                 temp = '\n\tmemcpy({0}.{1}, {1}, {2}*sizeof({3}));'
                 struct_list += temp.format(sf,
                                            element[0],
                                            element[2],
                                            get_c_type(element[1]))
         elif common.get_type_size(element[1]) > 1:
             struct_list += '\n\t{0}.{1} = ipcon_leconvert_{2}_to({1});'.format(sf, element[0], element[1])
         else:
             struct_list += '\n\t{0}.{1} = {1};'.format(sf, element[0])
     return struct_list
Esempio n. 3
0
 def make_return_list(packet):
     return_list = ''
     needs_i = False
     for element in packet.get_elements('out'):
         sf = 'response'
         if element[1] == 'string':
             temp = '\tstrncpy(ret_{0}, {1}->{0}, {2});\n'
             return_list += temp.format(element[0], sf, element[2])
         elif element[2] > 1:
             if common.get_type_size(element[1]) > 1:
                 needs_i = True
                 return_list += '\tfor (i = 0; i < {3}; i++) ret_{0}[i] = leconvert_{2}_from({1}->{0}[i]);\n' \
                                .format(element[0], sf, element[1], element[2])
             else:
                 temp = '\tmemcpy(ret_{0}, {1}->{0}, {2} * sizeof({3}));\n'
                 return_list += temp.format(element[0],
                                            sf,
                                            element[2],
                                            get_c_type(element[1]))
         elif common.get_type_size(element[1]) > 1:
             return_list += '\t*ret_{0} = leconvert_{2}_from({1}->{0});\n'.format(element[0], sf, element[1])
         else:
             return_list += '\t*ret_{0} = {1}->{0};\n'.format(element[0], sf)
     return return_list, needs_i
Esempio n. 4
0
 def make_struct_list(packet):
     struct_list = ''
     needs_i = False
     for element in packet.get_elements('in'):
         sf = 'request'
         if element[1] == 'string':
             temp = '\n\tstrncpy({0}.{1}, {1}, {2});\n'
             struct_list += temp.format(sf, element[0], element[2])
         elif element[2] > 1:
             if common.get_type_size(element[1]) > 1:
                 needs_i = True
                 struct_list += '\n\tfor (i = 0; i < {3}; i++) {0}.{1}[i] = leconvert_{2}_to({1}[i]);' \
                                .format(sf, element[0], element[1], element[2])
             else:
                 temp = '\n\tmemcpy({0}.{1}, {1}, {2}*sizeof({3}));'
                 struct_list += temp.format(sf,
                                            element[0],
                                            element[2],
                                            get_c_type(element[1]))
         elif common.get_type_size(element[1]) > 1:
             struct_list += '\n\t{0}.{1} = leconvert_{2}_to({1});'.format(sf, element[0], element[1])
         else:
             struct_list += '\n\t{0}.{1} = {1};'.format(sf, element[0])
     return struct_list, needs_i
Esempio n. 5
0
def make_callback_wrapper_funcs():
    func = """
static void {0}_callback_wrapper_{1}({2} *{0}, Packet *packet) {{
\t{3}CallbackFunction callback_function = ({3}CallbackFunction){0}->registered_callbacks[{7}];
\tvoid *user_data = {0}->registered_callback_user_data[{7}];{9}{8}
{6}
\tif (callback_function != NULL) {{
\t\tcallback_function({5}{4}user_data);
\t}}
}}
"""

    funcs = ''
    for packet in device.get_packets('callback'):
        a = device.get_underscore_name()
        b = packet.get_underscore_name()
        c = device.get_camel_case_name()
        d = packet.get_camel_case_name()
        e = ''
        f_list = []
        for element in packet.get_elements():
            f_list.append("callback->{0}".format(element[0]))
        f = ', '.join(f_list)
        if len(f_list) > 0:
            e = ', '
        endian_list = []
        i = ''
        for element in packet.get_elements():
            if common.get_type_size(element[1]) > 1:
                if element[2] > 1:
                    i = '\n\tint i;'
                    endian_list.append('\tfor (i = 0; i < {2}; i++) callback->{0}[i] = leconvert_{1}_from(callback->{0}[i]);' \
                                       .format(element[0], element[1], element[2]))
                else:
                    endian_list.append('\tcallback->{0} = leconvert_{1}_from(callback->{0});'.format(element[0], element[1]))
        endian = '\n'.join(endian_list)
        if len(endian) > 0:
            endian = '\n' + endian + '\n'
        fid = '{0}_CALLBACK_{1}'.format(device.get_upper_case_name(),
                                        packet.get_upper_case_name())
        if len(f_list) > 0:
            cb = '\n\t{0}Callback_ *callback = ({0}Callback_ *)packet;'.format(d)
        else:
            cb = '\n\t(void)packet;'

        funcs += func.format(a, b, c, d, e, f, endian, fid, cb, i)

    return funcs
Esempio n. 6
0
def make_callback_wrapper_funcs():
    func = """
static int {0}_callback_wrapper_{1}({2} *{0}, const unsigned char *buffer) {{
\t{3}Callback_ *{4}c = ({3}Callback_ *)buffer;
{6}
\t(({1}_func_t){0}->registered_callbacks[{4}c->function_id])({5});
\treturn sizeof({3}Callback_);
}}
"""

    funcs = ''
    for packet in device.get_packets('callback'):
        a = device.get_underscore_name()
        b = packet.get_underscore_name()
        c = device.get_camel_case_name()
        d = packet.get_camel_case_name()
        e = make_short_form(b)
        f_list = []
        for element in packet.get_elements():
            f_list.append("{0}c->{1}".format(e, element[0]))
        f = ', '.join(f_list)
        endian_list = []
        for element in packet.get_elements():
            if common.get_type_size(element[1]) > 1:
                if element[2] > 1:
                    endian_list.append('\tfor (int i = 0; i < {3}; i++) {0}c->{1}[i] = ipcon_leconvert_{2}_from({0}c->{1}[i]);' \
                                      .format(e, element[0], element[1], element[2]))
                else:
                    endian_list.append('\t{0}c->{1} = ipcon_leconvert_{2}_from({0}c->{1});'.format(e, element[0], element[1]))
        endian = '\n'.join(endian_list)
        if len(endian) > 0:
            endian += ''

        funcs += func.format(a, b, c, d, e, f, endian)

    return funcs
def make_callback_wrappers():
    wrappers = ''

    for packet in device.get_packets('callback'):
        wrapper = 'procedure T{0}{1}.CallbackWrapper{2}(const packet: TByteArray);\n'.format(device.get_category(),
                                                                                             device.get_camel_case_name(),
                                                                                             packet.get_camel_case_name())

        if len(packet.get_elements('out')) > 0:
            wrapper += 'var ' + delphi_common.make_parameter_list(packet, False, False) + ';\n'

        wrapper += 'begin\n'

        if len(packet.get_elements('out')) == 0:
            wrapper += '  Assert(packet <> nil); { Avoid \'Parameter not used\' warning }\n'

        wrapper += '  if (Assigned({0}Callback)) then begin\n'.format(packet.get_headless_camel_case_name())

        offset = 8
        parameter_names = []
        for element in packet.get_elements('out'):
            parameter_names.append(common.underscore_to_headless_camel_case(element[0]))

            if element[2] > 1 and element[1] != 'string':
                prefix = 'for i := 0 to {0} do '.format(element[2] - 1)
                wrapper += '    {0}{1}[i] := LEConvert{2}From({3} + (i * {4}), packet);\n'.format(prefix,
                                                                                                  common.underscore_to_headless_camel_case(element[0]),
                                                                                                  get_convert_type(element),
                                                                                                  offset,
                                                                                                  common.get_type_size(element[1]))
            else:
                wrapper += '    {0} := LEConvert{1}From({2}, packet);\n'.format(common.underscore_to_headless_camel_case(element[0]),
                                                                                get_convert_type(element),
                                                                                offset)

            offset += common.get_element_size(element)



        wrapper += '    {0}Callback({1});\n'.format(packet.get_headless_camel_case_name(), ', '.join(['self'] + parameter_names))
        wrapper += '  end;\n'
        wrapper += 'end;\n\n'

        wrappers += wrapper

    return wrappers + 'end.\n'
def make_methods():
    methods = ''
    function = 'function {0}.{1}{2}: {3};\n'
    procedure = 'procedure {0}.{1}{2};\n'

    cls = 'T{0}{1}'.format(device.get_category(), device.get_camel_case_name())
    for packet in device.get_packets('function'):
        ret_type = delphi_common.get_return_type(packet, False)
        out_count = len(packet.get_elements('out'))
        name = packet.get_camel_case_name()
        params = delphi_common.make_parameter_list(packet, False)
        function_id = '{0}_{1}_FUNCTION_{2}'.format(device.get_category().upper(),
                                                    device.get_upper_case_name(),
                                                    packet.get_upper_case_name())
        if len(params) > 0:
            params = '(' + params + ')'

        if len(ret_type) > 0:
            method = function.format(cls, name, params, ret_type)
        else:
            method = procedure.format(cls, name, params)

        if out_count > 0:
            method += 'var request, response: TByteArray;'
        else:
            method += 'var request: TByteArray;'

        has_array = False
        for element in packet.get_elements():
            if element[2] > 1 and element[1] != 'string':
                has_array = True
                break

        if has_array:
            method += ' i: longint;'

        method += '\n'
        method += 'begin\n'
        method += '  request := (ipcon as TIPConnection).CreateRequestPacket(self, {0}, {1});\n'.format(function_id, packet.get_request_length())

        # Serialize request
        offset = 8
        for element in packet.get_elements('in'):
            if element[2] > 1 and element[1] != 'string':
                prefix = 'for i := 0 to Length({0}) - 1 do '.format(common.underscore_to_headless_camel_case(element[0]))
                method += '  {0}LEConvert{1}To({2}[i], {3} + (i * {4}), request);\n'.format(prefix,
                                                                                            get_convert_type(element),
                                                                                            common.underscore_to_headless_camel_case(element[0]),
                                                                                            offset,
                                                                                            common.get_type_size(element[1]))
            elif element[1] == 'string':
                method += '  LEConvertStringTo({0}, {1}, {2}, request);\n'.format(common.underscore_to_headless_camel_case(element[0]),
                                                                                  offset,
                                                                                  element[2])
            else:
                method += '  LEConvert{0}To({1}, {2}, request);\n'.format(get_convert_type(element),
                                                                          common.underscore_to_headless_camel_case(element[0]),
                                                                          offset)

            offset += common.get_element_size(element)

        if out_count > 0:
            method += '  response := SendRequest(request);\n'
        else:
            method += '  SendRequest(request);\n'

        # Deserialize response
        offset = 8
        for element in packet.get_elements('out'):
            if out_count > 1:
                result = common.underscore_to_headless_camel_case(element[0])
            else:
                result = 'result'

            if element[2] > 1 and element[1] != 'string':
                prefix = 'for i := 0 to {0} do '.format(element[2] - 1)
                method += '  {0}{1}[i] := LEConvert{2}From({3} + (i * {4}), response);\n'.format(prefix,
                                                                                                 result,
                                                                                                 get_convert_type(element),
                                                                                                 offset,
                                                                                                 common.get_type_size(element[1]))
            elif element[1] == 'string':
                method += '  {0} := LEConvertStringFrom({1}, {2}, response);\n'.format(result,
                                                                                       offset,
                                                                                       element[2])
            else:
                method += '  {0} := LEConvert{1}From({2}, response);\n'.format(result,
                                                                               get_convert_type(element),
                                                                               offset)

            offset += common.get_element_size(element)

        method += 'end;\n\n'

        methods += method

    return methods