+ return (prefix_str, lenfield_prefix)
+# _c_serialize_helper_prefix
+
+def _c_serialize_helper_insert_padding(context, code_lines, space, count=0):
+ code_lines.append('%s /* padding */' % space)
+ code_lines.append('%s xcb_pad = -xcb_block_len & 3;' % space)
+ code_lines.append('%s if (0 != xcb_pad) {' % space)
+
+ if 'serialize' == context:
+ code_lines.append('%s xcb_parts[xcb_parts_idx].iov_base = xcb_pad0;' % space)
+ code_lines.append('%s xcb_parts[xcb_parts_idx].iov_len = xcb_pad;' % space)
+ code_lines.append('%s xcb_parts_idx++;' % space)
+ elif 'unserialize' == context:
+ code_lines.append('%s xcb_tmp += xcb_pad;' % space)
+ code_lines.append('%s xcb_buffer_len += xcb_pad;' % space)
+
+ code_lines.append('%s xcb_pad = 0;' % space)
+ code_lines.append('%s }' % space)
+ code_lines.append('%s xcb_buffer_len += xcb_block_len + xcb_pad;' % space)
+ code_lines.append('%s xcb_block_len = 0;' % space)
+ return count + 1
+# _c_serialize_helper_insert_padding()
+
+def _c_serialize_helper_switch(self, context, complex_name, code_lines, temp_vars, space, prefix, prefix_str):
+ switch_expr = _c_accessor_get_expr(self.expr)
+ for b in self.bitcases:
+ bitcase_expr = _c_accessor_get_expr(b.type.expr, prefix)
+ code_lines.append(' if(%s & %s) {' % (switch_expr, bitcase_expr))
+ # FIXME: change function call depending on context
+ if 'unserialize' == context:
+ unserialize_fields(b.type, code_lines, temp_vars, space="%s " % space,
+ prefix="%s%s" % (prefix_str, complex_name), bitcase=True)
+ elif 'serialize' == context:
+ count += serialize_fields(b.type, code_lines, temp_vars, '%s ' % space,
+ prefix="%s%s" % (prefix_str, complex_name),
+ serialize_fixed_size_fields=True, bitcase=True)
+ code_lines.append(' }')
+
+ if 'serialize' == context:
+ count = insert_padding(count)
+ return count
+ if 'unserialize' == context:
+ # padding
+ code_lines.append('%s xcb_pad = -xcb_block_len & 3;' % space)
+ #code_lines.append('%s xcb_tmp += xcb_block_len;' % space)
+ code_lines.append('%s xcb_buffer_len += xcb_block_len + xcb_pad;' % space)
+# _c_serialize_helper_switch
+
+def _c_serialize_helper_switch_field(self, field):
+ # switch is handled by this function as a special case
+ args = get_switch_expr_fields(field.type)
+ field_mapping = _c_field_mapping(self, 'unserialize')
+ c_field_names = ''
+ for a in args:
+ c_field_names += "%s, " % field_mapping[a.field_name][0]
+ switch_field_name = field_mapping[field.field_name][0]
+ length = "%s(xcb_tmp, %s&%s)" % (field.type.c_unserialize_name,
+ c_field_names, switch_field_name)
+ return length
+# _c_serialize_helper_switch_field()
+
+def _c_serialize_helper_list_field(context, self, field, lenfield_prefix, code_lines, temp_vars, space):
+ expr = field.type.expr
+ param_fields, wire_fields, params = get_serialize_params(self, unserialize=True)
+ param_names = [p[2] for p in params]
+
+ # look if the list's lenfield is a struct member or a function argument
+ # special case: if the list has a length field, its name will returned
+ # unchanged by calling c_accessor_get_length(expr)
+ if expr.lenfield_name == _c_accessor_get_length(expr):
+ if expr.lenfield_name in param_names:
+ # the length field appears as separate argument in unserialize,
+ # so no need for a prefix
+ lenfield_prefix = ''
+ list_length = _c_accessor_get_expr(field.type.expr, lenfield_prefix)
+
+ if 'unserialize' == context:
+ length = '%s * sizeof(%s)' % (list_length, field.type.member.c_wiretype)
+ # FIXME? - list with variable-sized elements
+ if field.type.size is None:
+ length = ''
+ temp_vars.add(' unsigned int i, xcb_tmp_len;')
+ code_lines.append("%s for(i=0; i<%s; i++) {" % (space, list_length))
+ code_lines.append("%s xcb_tmp_len = %s(xcb_tmp);" %
+ (space, field.type.c_unserialize_name))
+ code_lines.append("%s xcb_block_len += xcb_tmp_len;" % space)
+ code_lines.append("%s xcb_tmp += xcb_tmp_len;" % space)
+ code_lines.append("%s }" % space)
+ # errmsg = '%s: warning: list object with variable-sized members not supported for field %s\n'
+ # raise Exception(errmsg % (self.c_type, field.c_field_name))
+
+ return length
+# _c_serialize_helper_list_field()
+
+def unserialize_fields(complex_type, code_lines=[], temp_vars=set(), space='', prefix='', bitcase=False):
+ need_padding = False
+
+ prefix_str, lenfield_prefix = _c_serialize_helper_prefix(prefix)