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
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
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
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
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
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