Commit 3aec63c0 authored by Zebediah Figura's avatar Zebediah Figura Committed by Alexandre Julliard

rpcrt4: Write type format strings for fixed structs.

parent 5a4af94f
...@@ -189,6 +189,24 @@ static unsigned char get_array_fc(ITypeInfo *typeinfo, TYPEDESC *desc) ...@@ -189,6 +189,24 @@ static unsigned char get_array_fc(ITypeInfo *typeinfo, TYPEDESC *desc)
return FC_BOGUS_ARRAY; return FC_BOGUS_ARRAY;
} }
static size_t write_struct_tfs(ITypeInfo *typeinfo, unsigned char *str,
size_t *len, TYPEATTR *attr)
{
unsigned char fc = get_struct_fc(typeinfo, attr);
size_t off = *len;
if (fc != FC_STRUCT)
FIXME("fc %02x not implemented\n", fc);
WRITE_CHAR (str, *len, FC_STRUCT);
WRITE_CHAR (str, *len, attr->cbAlignment - 1);
WRITE_SHORT(str, *len, attr->cbSizeInstance);
WRITE_CHAR (str, *len, FC_PAD);
WRITE_CHAR (str, *len, FC_END);
return off;
}
static size_t write_array_tfs(ITypeInfo *typeinfo, unsigned char *str, static size_t write_array_tfs(ITypeInfo *typeinfo, unsigned char *str,
size_t *len, ARRAYDESC *desc) size_t *len, ARRAYDESC *desc)
{ {
...@@ -264,6 +282,14 @@ static size_t write_pointer_tfs(ITypeInfo *typeinfo, unsigned char *str, ...@@ -264,6 +282,14 @@ static size_t write_pointer_tfs(ITypeInfo *typeinfo, unsigned char *str,
WRITE_CHAR(str, *len, FC_ENUM32); WRITE_CHAR(str, *len, FC_ENUM32);
WRITE_CHAR(str, *len, FC_PAD); WRITE_CHAR(str, *len, FC_PAD);
break; break;
case TKIND_RECORD:
assert(!toplevel); /* toplevel struct pointers should use IsSimpleRef */
ref = write_struct_tfs(refinfo, str, len, attr);
off = *len;
WRITE_CHAR (str, *len, FC_UP);
WRITE_CHAR (str, *len, 0);
WRITE_SHORT(str, *len, ref - *len);
break;
case TKIND_INTERFACE: case TKIND_INTERFACE:
case TKIND_DISPATCH: case TKIND_DISPATCH:
write_ip_tfs(str, len, &attr->guid); write_ip_tfs(str, len, &attr->guid);
...@@ -309,6 +335,8 @@ static size_t write_pointer_tfs(ITypeInfo *typeinfo, unsigned char *str, ...@@ -309,6 +335,8 @@ static size_t write_pointer_tfs(ITypeInfo *typeinfo, unsigned char *str,
static size_t write_type_tfs(ITypeInfo *typeinfo, unsigned char *str, static size_t write_type_tfs(ITypeInfo *typeinfo, unsigned char *str,
size_t *len, TYPEDESC *desc, BOOL toplevel, BOOL onstack) size_t *len, TYPEDESC *desc, BOOL toplevel, BOOL onstack)
{ {
ITypeInfo *refinfo;
TYPEATTR *attr;
size_t off; size_t off;
TRACE("vt %d%s\n", desc->vt, toplevel ? " (toplevel)" : ""); TRACE("vt %d%s\n", desc->vt, toplevel ? " (toplevel)" : "");
...@@ -319,6 +347,25 @@ static size_t write_type_tfs(ITypeInfo *typeinfo, unsigned char *str, ...@@ -319,6 +347,25 @@ static size_t write_type_tfs(ITypeInfo *typeinfo, unsigned char *str,
return write_pointer_tfs(typeinfo, str, len, desc->lptdesc, toplevel, onstack); return write_pointer_tfs(typeinfo, str, len, desc->lptdesc, toplevel, onstack);
case VT_CARRAY: case VT_CARRAY:
return write_array_tfs(typeinfo, str, len, desc->lpadesc); return write_array_tfs(typeinfo, str, len, desc->lpadesc);
case VT_USERDEFINED:
ITypeInfo_GetRefTypeInfo(typeinfo, desc->hreftype, &refinfo);
ITypeInfo_GetTypeAttr(refinfo, &attr);
switch (attr->typekind)
{
case TKIND_RECORD:
off = write_struct_tfs(refinfo, str, len, attr);
break;
default:
FIXME("unhandled kind %u\n", attr->typekind);
off = *len;
WRITE_SHORT(str, *len, 0);
break;
}
ITypeInfo_ReleaseTypeAttr(refinfo, attr);
ITypeInfo_Release(refinfo);
break;
default: default:
/* base types are always embedded directly */ /* base types are always embedded directly */
assert(!get_base_type(desc->vt)); assert(!get_base_type(desc->vt));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment