Improve proxy code generated for oaidl.idl.
This commit is contained in:
parent
4cf764f503
commit
2d8d1e2f74
|
@ -1063,6 +1063,16 @@ static type_t *reg_type(type_t *type, char *name, int t)
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* determine pointer type from attrs */
|
||||||
|
static unsigned char get_pointer_type( type_t *type )
|
||||||
|
{
|
||||||
|
if( is_attr( type->attrs, ATTR_SIZEIS ) )
|
||||||
|
return RPC_FC_CARRAY;
|
||||||
|
if( type->fields )
|
||||||
|
return RPC_FC_CSTRUCT;
|
||||||
|
return RPC_FC_FP;
|
||||||
|
}
|
||||||
|
|
||||||
static type_t *reg_types(type_t *type, var_t *names, int t)
|
static type_t *reg_types(type_t *type, var_t *names, int t)
|
||||||
{
|
{
|
||||||
type_t *ptr = type;
|
type_t *ptr = type;
|
||||||
|
@ -1075,7 +1085,8 @@ static type_t *reg_types(type_t *type, var_t *names, int t)
|
||||||
int cptr = names->ptr_level;
|
int cptr = names->ptr_level;
|
||||||
if (cptr > ptrc) {
|
if (cptr > ptrc) {
|
||||||
while (cptr > ptrc) {
|
while (cptr > ptrc) {
|
||||||
cur = ptr = make_type(RPC_FC_FP, cur); /* FIXME: pointer type from attrs? */
|
int t = get_pointer_type( cur );
|
||||||
|
cur = ptr = make_type(t, cur);
|
||||||
ptrc++;
|
ptrc++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -36,6 +36,14 @@
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
#include "header.h"
|
#include "header.h"
|
||||||
|
|
||||||
|
#define END_OF_LIST(list) \
|
||||||
|
do { \
|
||||||
|
if (list) { \
|
||||||
|
while (NEXT_LINK(list)) \
|
||||||
|
list = NEXT_LINK(list); \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
static FILE* proxy;
|
static FILE* proxy;
|
||||||
static int indent = 0;
|
static int indent = 0;
|
||||||
|
|
||||||
|
@ -56,7 +64,7 @@ int print_proxy( char *format, ... )
|
||||||
|
|
||||||
static type_t *get_base_type( type_t *type )
|
static type_t *get_base_type( type_t *type )
|
||||||
{
|
{
|
||||||
while( type->ref )
|
while( (type->type == 0) && type->ref )
|
||||||
type = type->ref;
|
type = type->ref;
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
@ -151,10 +159,7 @@ static void init_proxy(void)
|
||||||
|
|
||||||
static void clear_output_vars( var_t *arg )
|
static void clear_output_vars( var_t *arg )
|
||||||
{
|
{
|
||||||
if (arg) {
|
END_OF_LIST(arg);
|
||||||
while (NEXT_LINK(arg))
|
|
||||||
arg = NEXT_LINK(arg);
|
|
||||||
}
|
|
||||||
while (arg) {
|
while (arg) {
|
||||||
if (is_attr(arg->attrs, ATTR_OUT) && !is_attr(arg->attrs, ATTR_IN)) {
|
if (is_attr(arg->attrs, ATTR_OUT) && !is_attr(arg->attrs, ATTR_IN)) {
|
||||||
print_proxy( "if(%s)\n", arg->name );
|
print_proxy( "if(%s)\n", arg->name );
|
||||||
|
@ -168,14 +173,34 @@ static void clear_output_vars( var_t *arg )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int is_pointer(var_t *arg)
|
||||||
|
{
|
||||||
|
if (arg->ptr_level)
|
||||||
|
return 1;
|
||||||
|
if (arg->type->type == RPC_FC_FP )
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void proxy_check_pointers( var_t *arg )
|
||||||
|
{
|
||||||
|
END_OF_LIST(arg);
|
||||||
|
while (arg) {
|
||||||
|
if (is_pointer(arg)) {
|
||||||
|
print_proxy( "if(!%s)\n", arg->name );
|
||||||
|
indent++;
|
||||||
|
print_proxy( "RpcRaiseException(RPC_X_NULL_REF_POINTER);\n");
|
||||||
|
indent--;
|
||||||
|
}
|
||||||
|
arg = PREV_LINK(arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void proxy_gen_marshall_size( var_t *arg )
|
static void proxy_gen_marshall_size( var_t *arg )
|
||||||
{
|
{
|
||||||
print_proxy( "_StubMsg.BufferLength = 0U;\n" );
|
print_proxy( "_StubMsg.BufferLength = 0U;\n" );
|
||||||
|
|
||||||
if (arg) {
|
END_OF_LIST(arg);
|
||||||
while (NEXT_LINK(arg))
|
|
||||||
arg = NEXT_LINK(arg);
|
|
||||||
}
|
|
||||||
while (arg) {
|
while (arg) {
|
||||||
if (is_attr(arg->attrs, ATTR_IN)) {
|
if (is_attr(arg->attrs, ATTR_IN)) {
|
||||||
int index = 0;
|
int index = 0;
|
||||||
|
@ -188,6 +213,7 @@ static void proxy_gen_marshall_size( var_t *arg )
|
||||||
print_proxy( "_StubMsg.BufferLength += %d; /* %s */\n", 1, arg->name );
|
print_proxy( "_StubMsg.BufferLength += %d; /* %s */\n", 1, arg->name );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RPC_FC_WCHAR:
|
||||||
case RPC_FC_SHORT:
|
case RPC_FC_SHORT:
|
||||||
case RPC_FC_USHORT:
|
case RPC_FC_USHORT:
|
||||||
case RPC_FC_ENUM16:
|
case RPC_FC_ENUM16:
|
||||||
|
@ -205,6 +231,11 @@ static void proxy_gen_marshall_size( var_t *arg )
|
||||||
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d] );\n", index );
|
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d] );\n", index );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RPC_FC_FP:
|
||||||
|
print_proxy( "NdrConformantArrayBufferSize( &_StubMsg, (unsigned char*)%s, ", arg->name );
|
||||||
|
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d]);\n", index );
|
||||||
|
break;
|
||||||
|
|
||||||
case RPC_FC_IP:
|
case RPC_FC_IP:
|
||||||
print_proxy( "NdrPointerBufferSize( &_StubMsg, (unsigned char*)%s, ", arg->name );
|
print_proxy( "NdrPointerBufferSize( &_StubMsg, (unsigned char*)%s, ", arg->name );
|
||||||
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d]);\n", index );
|
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d]);\n", index );
|
||||||
|
@ -220,10 +251,7 @@ static void proxy_gen_marshall_size( var_t *arg )
|
||||||
|
|
||||||
static void gen_marshall_copydata( var_t *arg )
|
static void gen_marshall_copydata( var_t *arg )
|
||||||
{
|
{
|
||||||
if (arg) {
|
END_OF_LIST(arg);
|
||||||
while (NEXT_LINK(arg))
|
|
||||||
arg = NEXT_LINK(arg);
|
|
||||||
}
|
|
||||||
while (arg) {
|
while (arg) {
|
||||||
if (is_attr(arg->attrs, ATTR_IN)) {
|
if (is_attr(arg->attrs, ATTR_IN)) {
|
||||||
int index = 0;
|
int index = 0;
|
||||||
|
@ -233,6 +261,7 @@ static void gen_marshall_copydata( var_t *arg )
|
||||||
{
|
{
|
||||||
case RPC_FC_BYTE:
|
case RPC_FC_BYTE:
|
||||||
case RPC_FC_CHAR:
|
case RPC_FC_CHAR:
|
||||||
|
case RPC_FC_WCHAR:
|
||||||
case RPC_FC_SHORT:
|
case RPC_FC_SHORT:
|
||||||
case RPC_FC_USHORT:
|
case RPC_FC_USHORT:
|
||||||
case RPC_FC_ENUM16:
|
case RPC_FC_ENUM16:
|
||||||
|
@ -250,6 +279,11 @@ static void gen_marshall_copydata( var_t *arg )
|
||||||
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d]);\n", index );
|
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d]);\n", index );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RPC_FC_FP:
|
||||||
|
print_proxy( "NdrConformantArrayMarshall( &_StubMsg, (unsigned char*)%s, ", arg->name );
|
||||||
|
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d]);\n", index );
|
||||||
|
break;
|
||||||
|
|
||||||
case RPC_FC_IP:
|
case RPC_FC_IP:
|
||||||
print_proxy( "NdrPointerMarshall( &_StubMsg, (unsigned char*)%s, ", arg->name );
|
print_proxy( "NdrPointerMarshall( &_StubMsg, (unsigned char*)%s, ", arg->name );
|
||||||
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d]);\n", index );
|
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d]);\n", index );
|
||||||
|
@ -279,26 +313,53 @@ static void gen_marshall( var_t *arg )
|
||||||
|
|
||||||
static void gen_unmarshall( var_t *arg )
|
static void gen_unmarshall( var_t *arg )
|
||||||
{
|
{
|
||||||
if (arg) {
|
END_OF_LIST(arg);
|
||||||
while (NEXT_LINK(arg))
|
|
||||||
arg = NEXT_LINK(arg);
|
|
||||||
}
|
|
||||||
while (arg) {
|
while (arg) {
|
||||||
if (is_attr(arg->attrs, ATTR_IN)) {
|
if (is_attr(arg->attrs, ATTR_OUT)) {
|
||||||
int index = 0;
|
int index = 0;
|
||||||
|
type_t *type = get_base_type(arg->type);
|
||||||
|
|
||||||
|
switch( type->type )
|
||||||
|
{
|
||||||
|
case RPC_FC_BYTE:
|
||||||
|
case RPC_FC_CHAR:
|
||||||
|
case RPC_FC_WCHAR:
|
||||||
|
case RPC_FC_SHORT:
|
||||||
|
case RPC_FC_USHORT:
|
||||||
|
case RPC_FC_ENUM16:
|
||||||
|
case RPC_FC_LONG:
|
||||||
|
case RPC_FC_ULONG:
|
||||||
|
case RPC_FC_ENUM32:
|
||||||
|
print_proxy( "%s = *((", arg->name );
|
||||||
|
write_type(proxy, arg->type, arg, arg->tname);
|
||||||
|
fprintf(proxy,"*)_StubMsg.Buffer)++;\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RPC_FC_STRUCT:
|
||||||
|
print_proxy( "NdrSimpleStructUnmarshall(&_StubMsg, (unsigned char**)%s, ", arg->name );
|
||||||
|
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d], 0);\n", index );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RPC_FC_FP:
|
||||||
|
print_proxy( "NdrSimpleStructUnmarshall(&_StubMsg, (unsigned char**)%s, ", arg->name );
|
||||||
|
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d], 0);\n", index );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RPC_FC_IP:
|
||||||
print_proxy( "NdrPointerUnmarshall(&_StubMsg, (unsigned char**)&%s, ", arg->name );
|
print_proxy( "NdrPointerUnmarshall(&_StubMsg, (unsigned char**)&%s, ", arg->name );
|
||||||
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d], 0);\n", index );
|
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d], 0);\n", index );
|
||||||
}
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
printf("FIXME: arg %s has unknown type %d\n", arg->name, type->type );
|
||||||
|
} }
|
||||||
arg = PREV_LINK(arg);
|
arg = PREV_LINK(arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void proxy_free_variables( var_t *arg )
|
static void proxy_free_variables( var_t *arg )
|
||||||
{
|
{
|
||||||
if (arg) {
|
END_OF_LIST(arg);
|
||||||
while (NEXT_LINK(arg))
|
|
||||||
arg = NEXT_LINK(arg);
|
|
||||||
}
|
|
||||||
while (arg) {
|
while (arg) {
|
||||||
if (is_attr(arg->attrs, ATTR_OUT)) {
|
if (is_attr(arg->attrs, ATTR_OUT)) {
|
||||||
var_t *constraint;
|
var_t *constraint;
|
||||||
|
@ -309,6 +370,7 @@ static void proxy_free_variables( var_t *arg )
|
||||||
{
|
{
|
||||||
case RPC_FC_BYTE:
|
case RPC_FC_BYTE:
|
||||||
case RPC_FC_CHAR:
|
case RPC_FC_CHAR:
|
||||||
|
case RPC_FC_WCHAR:
|
||||||
case RPC_FC_SHORT:
|
case RPC_FC_SHORT:
|
||||||
case RPC_FC_USHORT:
|
case RPC_FC_USHORT:
|
||||||
case RPC_FC_ENUM16:
|
case RPC_FC_ENUM16:
|
||||||
|
@ -318,6 +380,7 @@ static void proxy_free_variables( var_t *arg )
|
||||||
case RPC_FC_STRUCT:
|
case RPC_FC_STRUCT:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RPC_FC_FP:
|
||||||
case RPC_FC_IP:
|
case RPC_FC_IP:
|
||||||
constraint = get_attrp( arg->attrs, ATTR_IIDIS );
|
constraint = get_attrp( arg->attrs, ATTR_IIDIS );
|
||||||
if( constraint )
|
if( constraint )
|
||||||
|
@ -342,7 +405,7 @@ static void gen_proxy(type_t *iface, func_t *cur, int idx)
|
||||||
|
|
||||||
indent = 0;
|
indent = 0;
|
||||||
write_type(proxy, def->type, def, def->tname);
|
write_type(proxy, def->type, def, def->tname);
|
||||||
print_proxy( " CALLBACK %s_", iface->name);
|
print_proxy( " STDMETHODCALLTYPE %s_", iface->name);
|
||||||
write_name(proxy, def);
|
write_name(proxy, def);
|
||||||
print_proxy( "_Proxy(\n");
|
print_proxy( "_Proxy(\n");
|
||||||
write_args(proxy, cur->args, iface->name, 1, TRUE);
|
write_args(proxy, cur->args, iface->name, 1, TRUE);
|
||||||
|
@ -366,6 +429,7 @@ static void gen_proxy(type_t *iface, func_t *cur, int idx)
|
||||||
print_proxy( "{\n" );
|
print_proxy( "{\n" );
|
||||||
indent++;
|
indent++;
|
||||||
print_proxy( "NdrProxyInitialize(This, &_Msg, &_StubMsg, &Object_StubDesc, %d);\n", idx);
|
print_proxy( "NdrProxyInitialize(This, &_Msg, &_StubMsg, &Object_StubDesc, %d);\n", idx);
|
||||||
|
proxy_check_pointers( cur->args );
|
||||||
|
|
||||||
print_proxy( "RpcTryFinally\n" );
|
print_proxy( "RpcTryFinally\n" );
|
||||||
print_proxy( "{\n" );
|
print_proxy( "{\n" );
|
||||||
|
@ -444,7 +508,6 @@ static void stub_write_locals( var_t *arg )
|
||||||
write_type(proxy, arg->type, arg, arg->tname);
|
write_type(proxy, arg->type, arg, arg->tname);
|
||||||
fprintf(proxy, " ");
|
fprintf(proxy, " ");
|
||||||
write_name(proxy, arg);
|
write_name(proxy, arg);
|
||||||
/* if (outptr) fprintf(proxy, " = &_M%d;\n",n++); */
|
|
||||||
fprintf(proxy, ";\n");
|
fprintf(proxy, ";\n");
|
||||||
arg = NEXT_LINK(arg);
|
arg = NEXT_LINK(arg);
|
||||||
}
|
}
|
||||||
|
@ -453,19 +516,17 @@ static void stub_write_locals( var_t *arg )
|
||||||
static void stub_unmarshall( var_t *arg )
|
static void stub_unmarshall( var_t *arg )
|
||||||
{
|
{
|
||||||
int n = 0;
|
int n = 0;
|
||||||
if (arg) {
|
END_OF_LIST(arg);
|
||||||
while (NEXT_LINK(arg))
|
|
||||||
arg = NEXT_LINK(arg);
|
|
||||||
}
|
|
||||||
while (arg) {
|
while (arg) {
|
||||||
|
type_t *type = get_base_type(arg->type);
|
||||||
if (is_attr(arg->attrs, ATTR_IN)) {
|
if (is_attr(arg->attrs, ATTR_IN)) {
|
||||||
int index = 0;
|
int index = 0;
|
||||||
type_t *type = get_base_type(arg->type);
|
|
||||||
|
|
||||||
switch( type->type )
|
switch( type->type )
|
||||||
{
|
{
|
||||||
case RPC_FC_BYTE:
|
case RPC_FC_BYTE:
|
||||||
case RPC_FC_CHAR:
|
case RPC_FC_CHAR:
|
||||||
|
case RPC_FC_WCHAR:
|
||||||
case RPC_FC_SHORT:
|
case RPC_FC_SHORT:
|
||||||
case RPC_FC_USHORT:
|
case RPC_FC_USHORT:
|
||||||
case RPC_FC_ENUM16:
|
case RPC_FC_ENUM16:
|
||||||
|
@ -477,10 +538,11 @@ static void stub_unmarshall( var_t *arg )
|
||||||
fprintf(proxy,"*)_StubMsg.Buffer)++;\n");
|
fprintf(proxy,"*)_StubMsg.Buffer)++;\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RPC_FC_FP:
|
||||||
case RPC_FC_STRUCT:
|
case RPC_FC_STRUCT:
|
||||||
/* FIXME: add the format string, and set the index below */
|
/* FIXME: add the format string, and set the index below */
|
||||||
print_proxy( "NdrSimpleStructUnmarshall(&_StubMsg, (unsigned char**)&%s, ", arg->name );
|
print_proxy( "NdrSimpleStructUnmarshall(&_StubMsg, (unsigned char**)&%s, ", arg->name );
|
||||||
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d],0);\n", index );
|
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d], 0);\n", index );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -488,10 +550,22 @@ static void stub_unmarshall( var_t *arg )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (is_attr(arg->attrs, ATTR_OUT)) {
|
else if (is_attr(arg->attrs, ATTR_OUT)) {
|
||||||
|
switch( type->type )
|
||||||
|
{
|
||||||
|
case RPC_FC_STRUCT:
|
||||||
|
print_proxy("MIDL_memset(");
|
||||||
|
write_name(proxy, arg);
|
||||||
|
fprintf(proxy,", 0, sizeof(");
|
||||||
|
write_type(proxy, arg->type, arg, arg->tname);
|
||||||
|
fprintf(proxy,"));\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
print_proxy("");
|
print_proxy("");
|
||||||
write_name(proxy, arg);
|
write_name(proxy, arg);
|
||||||
fprintf(proxy," = &_M%d;\n", n);
|
fprintf(proxy," = &_M%d;\n", n);
|
||||||
print_proxy("_M%d = 0;\n", n++);
|
print_proxy("_M%d = 0;\n", n++);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
arg = PREV_LINK(arg);
|
arg = PREV_LINK(arg);
|
||||||
}
|
}
|
||||||
|
@ -501,10 +575,7 @@ static void stub_gen_marshall_size( var_t *arg )
|
||||||
{
|
{
|
||||||
print_proxy( "_StubMsg.BufferLength = 0U;\n" );
|
print_proxy( "_StubMsg.BufferLength = 0U;\n" );
|
||||||
|
|
||||||
if (arg) {
|
END_OF_LIST(arg);
|
||||||
while (NEXT_LINK(arg))
|
|
||||||
arg = NEXT_LINK(arg);
|
|
||||||
}
|
|
||||||
while (arg) {
|
while (arg) {
|
||||||
if (is_attr(arg->attrs, ATTR_OUT)) {
|
if (is_attr(arg->attrs, ATTR_OUT)) {
|
||||||
int index = 0;
|
int index = 0;
|
||||||
|
@ -518,6 +589,7 @@ static void stub_gen_marshall_size( var_t *arg )
|
||||||
print_proxy( "_StubMsg.BufferLength += %d; /* %s */\n", 1, arg->name );
|
print_proxy( "_StubMsg.BufferLength += %d; /* %s */\n", 1, arg->name );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RPC_FC_WCHAR:
|
||||||
case RPC_FC_SHORT:
|
case RPC_FC_SHORT:
|
||||||
case RPC_FC_USHORT:
|
case RPC_FC_USHORT:
|
||||||
case RPC_FC_ENUM16:
|
case RPC_FC_ENUM16:
|
||||||
|
@ -530,6 +602,9 @@ static void stub_gen_marshall_size( var_t *arg )
|
||||||
print_proxy( "_StubMsg.BufferLength += %d; /* %s */\n", 4, arg->name );
|
print_proxy( "_StubMsg.BufferLength += %d; /* %s */\n", 4, arg->name );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RPC_FC_FP:
|
||||||
|
print_proxy( "/*FIXME %s*/\n", arg->name );
|
||||||
|
break;
|
||||||
case RPC_FC_STRUCT:
|
case RPC_FC_STRUCT:
|
||||||
print_proxy( "NdrSimpleStructBufferSize(&_StubMsg, (unsigned char*)%s, ", arg->name );
|
print_proxy( "NdrSimpleStructBufferSize(&_StubMsg, (unsigned char*)%s, ", arg->name );
|
||||||
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d] );\n", index );
|
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d] );\n", index );
|
||||||
|
@ -553,20 +628,22 @@ static void stub_gen_marshall_size( var_t *arg )
|
||||||
|
|
||||||
static void stub_gen_marshall_copydata( var_t *arg )
|
static void stub_gen_marshall_copydata( var_t *arg )
|
||||||
{
|
{
|
||||||
if (arg) {
|
END_OF_LIST(arg);
|
||||||
while (NEXT_LINK(arg))
|
|
||||||
arg = NEXT_LINK(arg);
|
|
||||||
}
|
|
||||||
while (arg) {
|
while (arg) {
|
||||||
if (is_attr(arg->attrs, ATTR_OUT)) {
|
if (is_attr(arg->attrs, ATTR_OUT)) {
|
||||||
var_t *constraint;
|
var_t *constraint;
|
||||||
int index = 0;
|
int index = 0;
|
||||||
type_t *type = get_base_type(arg->type);
|
type_t *type = get_base_type(arg->type);
|
||||||
|
|
||||||
switch( type->type )
|
if( arg->array )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"FIXME: param %s is an array\n", arg->name);
|
||||||
|
}
|
||||||
|
else switch( type->type )
|
||||||
{
|
{
|
||||||
case RPC_FC_BYTE:
|
case RPC_FC_BYTE:
|
||||||
case RPC_FC_CHAR:
|
case RPC_FC_CHAR:
|
||||||
|
case RPC_FC_WCHAR:
|
||||||
case RPC_FC_SHORT:
|
case RPC_FC_SHORT:
|
||||||
case RPC_FC_USHORT:
|
case RPC_FC_USHORT:
|
||||||
case RPC_FC_ENUM16:
|
case RPC_FC_ENUM16:
|
||||||
|
@ -584,6 +661,11 @@ static void stub_gen_marshall_copydata( var_t *arg )
|
||||||
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d]);\n", index );
|
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d]);\n", index );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RPC_FC_FP:
|
||||||
|
print_proxy( "NdrConformantArrayBufferSize( &_StubMsg, (unsigned char*)%s, ", arg->name );
|
||||||
|
fprintf(proxy, "&__MIDL_TypeFormatString.Format[%d]);\n", index );
|
||||||
|
break;
|
||||||
|
|
||||||
case RPC_FC_IP:
|
case RPC_FC_IP:
|
||||||
constraint = get_attrp( arg->attrs, ATTR_IIDIS );
|
constraint = get_attrp( arg->attrs, ATTR_IIDIS );
|
||||||
if( constraint )
|
if( constraint )
|
||||||
|
@ -634,7 +716,7 @@ static void gen_stub(type_t *iface, func_t *cur, char *cas)
|
||||||
write_type(proxy, def->type, def, def->tname);
|
write_type(proxy, def->type, def, def->tname);
|
||||||
fprintf(proxy, " _RetVal;\n");
|
fprintf(proxy, " _RetVal;\n");
|
||||||
}
|
}
|
||||||
print_proxy("%s* _This = (%s*)((CStdStubBuffer*)This)->pvServerObject;\n", iface->name, iface->name);
|
print_proxy("%s * _This = (%s*)((CStdStubBuffer*)This)->pvServerObject;\n", iface->name, iface->name);
|
||||||
print_proxy("MIDL_STUB_MESSAGE _StubMsg;\n");
|
print_proxy("MIDL_STUB_MESSAGE _StubMsg;\n");
|
||||||
stub_write_locals( cur->args );
|
stub_write_locals( cur->args );
|
||||||
fprintf(proxy, "\n");
|
fprintf(proxy, "\n");
|
||||||
|
@ -666,7 +748,7 @@ static void gen_stub(type_t *iface, func_t *cur, char *cas)
|
||||||
fprintf(proxy, "(_This");
|
fprintf(proxy, "(_This");
|
||||||
arg = cur->args;
|
arg = cur->args;
|
||||||
if (arg) {
|
if (arg) {
|
||||||
while (NEXT_LINK(arg)) arg = NEXT_LINK(arg);
|
END_OF_LIST(arg);
|
||||||
while (arg) {
|
while (arg) {
|
||||||
fprintf(proxy, ", ");
|
fprintf(proxy, ", ");
|
||||||
write_name(proxy, arg);
|
write_name(proxy, arg);
|
||||||
|
@ -712,7 +794,8 @@ static int write_proxy_methods(type_t *iface)
|
||||||
{
|
{
|
||||||
func_t *cur = iface->funcs;
|
func_t *cur = iface->funcs;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (NEXT_LINK(cur)) cur = NEXT_LINK(cur);
|
|
||||||
|
END_OF_LIST(cur);
|
||||||
|
|
||||||
if (iface->ref) i = write_proxy_methods(iface->ref);
|
if (iface->ref) i = write_proxy_methods(iface->ref);
|
||||||
while (cur) {
|
while (cur) {
|
||||||
|
@ -733,7 +816,8 @@ static int write_stub_methods(type_t *iface)
|
||||||
{
|
{
|
||||||
func_t *cur = iface->funcs;
|
func_t *cur = iface->funcs;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (NEXT_LINK(cur)) cur = NEXT_LINK(cur);
|
|
||||||
|
END_OF_LIST(cur);
|
||||||
|
|
||||||
if (iface->ref) i = write_stub_methods(iface->ref);
|
if (iface->ref) i = write_stub_methods(iface->ref);
|
||||||
else return i; /* skip IUnknown */
|
else return i; /* skip IUnknown */
|
||||||
|
@ -757,14 +841,11 @@ static void write_proxy(type_t *iface)
|
||||||
func_t *cur = iface->funcs;
|
func_t *cur = iface->funcs;
|
||||||
|
|
||||||
if (!cur) return;
|
if (!cur) return;
|
||||||
if (!do_everything) return;
|
|
||||||
|
|
||||||
while (NEXT_LINK(cur)) cur = NEXT_LINK(cur);
|
END_OF_LIST(cur);
|
||||||
|
|
||||||
/* FIXME: check for [oleautomation], shouldn't generate proxies/stubs if specified */
|
/* FIXME: check for [oleautomation], shouldn't generate proxies/stubs if specified */
|
||||||
|
|
||||||
init_proxy();
|
|
||||||
|
|
||||||
fprintf(proxy, "/*****************************************************************************\n");
|
fprintf(proxy, "/*****************************************************************************\n");
|
||||||
fprintf(proxy, " * %s interface\n", iface->name);
|
fprintf(proxy, " * %s interface\n", iface->name);
|
||||||
fprintf(proxy, " */\n");
|
fprintf(proxy, " */\n");
|
||||||
|
@ -789,8 +870,6 @@ static void write_proxy(type_t *iface)
|
||||||
cur = PREV_LINK(cur);
|
cur = PREV_LINK(cur);
|
||||||
}
|
}
|
||||||
|
|
||||||
write_stubdesc();
|
|
||||||
|
|
||||||
/* proxy vtable */
|
/* proxy vtable */
|
||||||
print_proxy( "const CINTERFACE_PROXY_VTABLE(%d) %sProxyVtbl =\n", midx, iface->name);
|
print_proxy( "const CINTERFACE_PROXY_VTABLE(%d) %sProxyVtbl =\n", midx, iface->name);
|
||||||
print_proxy( "{\n");
|
print_proxy( "{\n");
|
||||||
|
@ -821,12 +900,6 @@ static void write_proxy(type_t *iface)
|
||||||
indent--;
|
indent--;
|
||||||
print_proxy( "};\n");
|
print_proxy( "};\n");
|
||||||
print_proxy( "\n");
|
print_proxy( "\n");
|
||||||
print_proxy( "#if !defined(__RPC_WIN32__)\n");
|
|
||||||
print_proxy( "#error Currently only Wine and WIN32 are supported.\n");
|
|
||||||
print_proxy( "#endif\n");
|
|
||||||
print_proxy( "\n");
|
|
||||||
write_formatstring( 1 );
|
|
||||||
write_formatstring( 0 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void write_proxies(ifref_t *ifaces)
|
void write_proxies(ifref_t *ifaces)
|
||||||
|
@ -836,8 +909,11 @@ void write_proxies(ifref_t *ifaces)
|
||||||
char *file_id = proxy_token;
|
char *file_id = proxy_token;
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
|
if (!do_everything) return;
|
||||||
if (!lcur) return;
|
if (!lcur) return;
|
||||||
while (NEXT_LINK(lcur)) lcur = NEXT_LINK(lcur);
|
END_OF_LIST(lcur);
|
||||||
|
|
||||||
|
init_proxy();
|
||||||
|
|
||||||
cur = lcur;
|
cur = lcur;
|
||||||
while (cur) {
|
while (cur) {
|
||||||
|
@ -848,11 +924,21 @@ void write_proxies(ifref_t *ifaces)
|
||||||
|
|
||||||
if (!proxy) return;
|
if (!proxy) return;
|
||||||
|
|
||||||
|
write_stubdesc();
|
||||||
|
|
||||||
|
print_proxy( "#if !defined(__RPC_WIN32__)\n");
|
||||||
|
print_proxy( "#error Currently only Wine and WIN32 are supported.\n");
|
||||||
|
print_proxy( "#endif\n");
|
||||||
|
print_proxy( "\n");
|
||||||
|
write_formatstring( 1 );
|
||||||
|
write_formatstring( 0 );
|
||||||
|
|
||||||
fprintf(proxy, "const CInterfaceProxyVtbl* _%s_ProxyVtblList[] =\n", file_id);
|
fprintf(proxy, "const CInterfaceProxyVtbl* _%s_ProxyVtblList[] =\n", file_id);
|
||||||
fprintf(proxy, "{\n");
|
fprintf(proxy, "{\n");
|
||||||
cur = lcur;
|
cur = lcur;
|
||||||
while (cur) {
|
while (cur) {
|
||||||
if(cur->iface->ref)
|
if(cur->iface->ref && cur->iface->funcs &&
|
||||||
|
is_object(cur->iface->attrs) && !is_local(cur->iface->attrs))
|
||||||
fprintf(proxy, " (CInterfaceProxyVtbl*)&%sProxyVtbl,\n", cur->iface->name);
|
fprintf(proxy, " (CInterfaceProxyVtbl*)&%sProxyVtbl,\n", cur->iface->name);
|
||||||
cur = PREV_LINK(cur);
|
cur = PREV_LINK(cur);
|
||||||
}
|
}
|
||||||
|
@ -864,7 +950,8 @@ void write_proxies(ifref_t *ifaces)
|
||||||
fprintf(proxy, "{\n");
|
fprintf(proxy, "{\n");
|
||||||
cur = lcur;
|
cur = lcur;
|
||||||
while (cur) {
|
while (cur) {
|
||||||
if(cur->iface->ref)
|
if(cur->iface->ref && cur->iface->funcs &&
|
||||||
|
is_object(cur->iface->attrs) && !is_local(cur->iface->attrs))
|
||||||
fprintf(proxy, " (CInterfaceStubVtbl*)&%sStubVtbl,\n", cur->iface->name);
|
fprintf(proxy, " (CInterfaceStubVtbl*)&%sStubVtbl,\n", cur->iface->name);
|
||||||
cur = PREV_LINK(cur);
|
cur = PREV_LINK(cur);
|
||||||
}
|
}
|
||||||
|
@ -876,7 +963,8 @@ void write_proxies(ifref_t *ifaces)
|
||||||
fprintf(proxy, "{\n");
|
fprintf(proxy, "{\n");
|
||||||
cur = lcur;
|
cur = lcur;
|
||||||
while (cur) {
|
while (cur) {
|
||||||
if(cur->iface->ref)
|
if(cur->iface->ref && cur->iface->funcs &&
|
||||||
|
is_object(cur->iface->attrs) && !is_local(cur->iface->attrs))
|
||||||
fprintf(proxy, " \"%s\",\n", cur->iface->name);
|
fprintf(proxy, " \"%s\",\n", cur->iface->name);
|
||||||
cur = PREV_LINK(cur);
|
cur = PREV_LINK(cur);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue