ReactOS  0.4.14-dev-342-gdc047f9
proxy.c File Reference
#include "config.h"
#include "wine/port.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "widl.h"
#include "utils.h"
#include "parser.h"
#include "header.h"
#include "typegen.h"
#include "expr.h"
Include dependency graph for proxy.c:

Go to the source code of this file.

Functions

static void print_proxy (const char *format,...) __attribute__((format(printf
 
static void write_stubdescproto (void)
 
static void write_stubdesc (int expr_eval_routines)
 
static void init_proxy (const statement_list_t *stmts)
 
static void clear_output_vars (const var_list_t *args)
 
static int need_delegation (const type_t *iface)
 
static int get_delegation_indirect (const type_t *iface, const type_t **delegate_to)
 
static int need_delegation_indirect (const type_t *iface)
 
static void free_variable (const var_t *arg, const char *local_var_prefix)
 
static void proxy_free_variables (var_list_t *args, const char *local_var_prefix)
 
static void gen_proxy (type_t *iface, const var_t *func, int idx, unsigned int proc_offset)
 
static void gen_stub (type_t *iface, const var_t *func, const char *cas, unsigned int proc_offset)
 
static void gen_stub_thunk (type_t *iface, const var_t *func, unsigned int proc_offset)
 
int count_methods (const type_t *iface)
 
static const statement_tget_callas_source (const type_t *iface, const var_t *def)
 
static void write_proxy_procformatstring_offsets (const type_t *iface, int skip)
 
static int write_proxy_methods (type_t *iface, int skip)
 
static int write_stub_methods (type_t *iface, int skip)
 
static void write_thunk_methods (type_t *iface, int skip)
 
static void write_proxy (type_t *iface, unsigned int *proc_offset)
 
static int does_any_iface (const statement_list_t *stmts, type_pred_t pred)
 
int need_proxy (const type_t *iface)
 
int need_stub (const type_t *iface)
 
int need_proxy_file (const statement_list_t *stmts)
 
int need_proxy_delegation (const statement_list_t *stmts)
 
int need_inline_stubs (const type_t *iface)
 
static int need_proxy_and_inline_stubs (const type_t *iface)
 
int need_stub_files (const statement_list_t *stmts)
 
int need_inline_stubs_file (const statement_list_t *stmts)
 
static void write_proxy_stmts (const statement_list_t *stmts, unsigned int *proc_offset)
 
static int cmp_iid (const void *ptr1, const void *ptr2)
 
static void build_iface_list (const statement_list_t *stmts, type_t **ifaces[], int *count)
 
static type_t ** sort_interfaces (const statement_list_t *stmts, int *count)
 
static void write_proxy_routines (const statement_list_t *stmts)
 
void write_proxies (const statement_list_t *stmts)
 

Variables

static FILEproxy
 
static int indent = 0
 

Function Documentation

◆ build_iface_list()

static void build_iface_list ( const statement_list_t stmts,
type_t **  ifaces[],
int count 
)
static

Definition at line 887 of file proxy.c.

888 {
889  const statement_t *stmt;
890 
891  if (!stmts) return;
892  LIST_FOR_EACH_ENTRY( stmt, stmts, const statement_t, entry )
893  {
894  if (stmt->type == STMT_TYPE && type_get_type(stmt->u.type) == TYPE_INTERFACE)
895  {
896  type_t *iface = stmt->u.type;
897  if (type_iface_get_inherit(iface) && need_proxy(iface))
898  {
899  *ifaces = xrealloc( *ifaces, (*count + 1) * sizeof(**ifaces) );
900  (*ifaces)[(*count)++] = iface;
901  if (iface->details.iface->async_iface)
902  {
903  iface = iface->details.iface->async_iface;
904  *ifaces = xrealloc( *ifaces, (*count + 1) * sizeof(**ifaces) );
905  (*ifaces)[(*count)++] = iface;
906  }
907  }
908  }
909  }
910 }
GLuint GLuint GLsizei count
Definition: gl.h:1545
union _type_t::@4052 details
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
void * xrealloc(void *oldmem, size_t size)
Definition: uimain.c:736
statement_type_t type
Definition: parser.h:124
static enum type_type type_get_type(const type_t *type)
Definition: typetree.h:68
struct iface_details * iface
Definition: widltypes.h:427
static type_t * type_iface_get_inherit(const type_t *type)
Definition: typetree.h:158
uint32_t entry
Definition: isohybrid.c:63
union _statement_t::@4053 u
int need_proxy(const type_t *iface)
Definition: proxy.c:796

Referenced by sort_interfaces().

◆ clear_output_vars()

static void clear_output_vars ( const var_list_t args)
static

Definition at line 105 of file proxy.c.

106 {
107  const var_t *arg;
108 
109  if (!args) return;
111  {
112  if (is_attr(arg->attrs, ATTR_IN)) continue;
113  if (!is_attr(arg->attrs, ATTR_OUT)) continue;
114  if (is_ptr(arg->type))
115  {
116  if (type_get_type(type_pointer_get_ref(arg->type)) == TYPE_BASIC) continue;
117  if (type_get_type(type_pointer_get_ref(arg->type)) == TYPE_ENUM) continue;
118  }
119  print_proxy( "if (%s) MIDL_memset( %s, 0, ", arg->name, arg->name );
120  if (is_array(arg->type) && type_array_has_conformance(arg->type))
121  {
122  write_expr( proxy, type_array_get_conformance(arg->type), 1, 1, NULL, NULL, "" );
123  fprintf( proxy, " * " );
124  }
125  fprintf( proxy, "sizeof( *%s ));\n", arg->name );
126  }
127 }
void * arg
Definition: msvc.h:12
static void print_proxy(const char *format,...) __attribute__((format(printf
Definition: proxy.c:44
Definition: match.c:390
static type_t * type_pointer_get_ref(const type_t *type)
Definition: typetree.h:292
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
static int is_ptr(const type_t *t)
Definition: header.h:59
smooth NULL
Definition: ftsmooth.c:416
static int is_array(const type_t *t)
Definition: header.h:64
static enum type_type type_get_type(const type_t *type)
Definition: typetree.h:68
static FILE * proxy
Definition: proxy.c:40
uint32_t entry
Definition: isohybrid.c:63
void write_expr(FILE *h, const expr_t *e, int brackets, int toplevel, const char *toplevel_prefix, const type_t *cont_type, const char *local_var_prefix)
Definition: expr.c:691
static int type_array_has_conformance(const type_t *type)
Definition: typetree.h:218
static expr_t * type_array_get_conformance(const type_t *type)
Definition: typetree.h:239
int is_attr(const attr_list_t *list, enum attr_type t)
Definition: header.c:99

Referenced by gen_proxy().

◆ cmp_iid()

static int cmp_iid ( const void ptr1,
const void ptr2 
)
static

Definition at line 878 of file proxy.c.

879 {
880  const type_t * const *iface1 = ptr1;
881  const type_t * const *iface2 = ptr2;
882  const UUID *uuid1 = get_attrp( (*iface1)->attrs, ATTR_UUID );
883  const UUID *uuid2 = get_attrp( (*iface2)->attrs, ATTR_UUID );
884  return memcmp( uuid1, uuid2, sizeof(UUID) );
885 }
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
void * get_attrp(const attr_list_t *list, enum attr_type t)
Definition: header.c:107

Referenced by sort_interfaces().

◆ count_methods()

int count_methods ( const type_t iface)

Definition at line 465 of file proxy.c.

466 {
467  const statement_t *stmt;
468  int count = 0;
469 
470  if (type_iface_get_inherit(iface))
472 
474  const var_t *func = stmt->u.var;
475  if (!is_callas(func->attrs)) count++;
476  }
477  return count;
478 }
#define STATEMENTS_FOR_EACH_FUNC(stmt, stmts)
Definition: widltypes.h:596
GLenum func
Definition: glext.h:6028
var_t * var
Definition: widltypes.h:538
GLuint GLuint GLsizei count
Definition: gl.h:1545
int count_methods(const type_t *iface)
Definition: proxy.c:465
static type_t * type_iface_get_inherit(const type_t *type)
Definition: typetree.h:158
union _statement_t::@4053 u
const var_t * is_callas(const attr_list_t *a)
Definition: header.c:943
static statement_list_t * type_iface_get_stmts(const type_t *type)
Definition: typetree.h:151

Referenced by write_iface_procformatstring(), write_interface(), and write_proxy().

◆ does_any_iface()

static int does_any_iface ( const statement_list_t stmts,
type_pred_t  pred 
)
static

Definition at line 779 of file proxy.c.

780 {
781  const statement_t *stmt;
782 
783  if (stmts)
784  LIST_FOR_EACH_ENTRY(stmt, stmts, const statement_t, entry)
785  {
786  if (stmt->type == STMT_TYPE && type_get_type(stmt->u.type) == TYPE_INTERFACE)
787  {
788  if (pred(stmt->u.type))
789  return TRUE;
790  }
791  }
792 
793  return FALSE;
794 }
#define TRUE
Definition: types.h:120
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
statement_type_t type
Definition: parser.h:124
static enum type_type type_get_type(const type_t *type)
Definition: typetree.h:68
uint32_t entry
Definition: isohybrid.c:63
union _statement_t::@4053 u

Referenced by need_inline_stubs_file(), need_proxy_delegation(), need_proxy_file(), need_stub_files(), and write_proxy_routines().

◆ free_variable()

static void free_variable ( const var_t arg,
const char local_var_prefix 
)
static

Definition at line 153 of file proxy.c.

154 {
155  unsigned int type_offset = arg->typestring_offset;
156  type_t *type = arg->type;
157 
159 
161  {
162  case TGT_ENUM:
163  case TGT_BASIC:
164  break;
165 
166  case TGT_STRUCT:
167  if (get_struct_fc(type) != FC_STRUCT)
168  print_proxy("/* FIXME: %s code for %s struct type 0x%x missing */\n", __FUNCTION__, arg->name, get_struct_fc(type) );
169  break;
170 
171  case TGT_IFACE_POINTER:
172  case TGT_POINTER:
173  case TGT_ARRAY:
174  print_proxy( "NdrClearOutParameters( &__frame->_StubMsg, ");
175  fprintf(proxy, "&__MIDL_TypeFormatString.Format[%u], ", type_offset );
176  fprintf(proxy, "(void *)%s );\n", arg->name );
177  break;
178 
179  default:
180  print_proxy("/* FIXME: %s code for %s type %d missing */\n", __FUNCTION__, arg->name, type_get_type(type) );
181  }
182 }
enum typegen_type typegen_detect_type(const type_t *type, const attr_list_t *attrs, unsigned int flags)
Definition: typegen.c:329
static int indent
Definition: proxy.c:41
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
static void print_proxy(const char *format,...) __attribute__((format(printf
Definition: proxy.c:44
void write_parameter_conf_or_var_exprs(FILE *file, int indent, const char *local_var_prefix, enum remoting_phase phase, const var_t *var, int valid_variance)
Definition: typegen.c:4110
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
static enum type_type type_get_type(const type_t *type)
Definition: typetree.h:68
static FILE * proxy
Definition: proxy.c:40
#define __FUNCTION__
Definition: types.h:112
static unsigned char get_struct_fc(ITypeInfo *typeinfo, TYPEATTR *attr)
Definition: ndr_typelib.c:197

Referenced by proxy_free_variables().

◆ gen_proxy()

static void gen_proxy ( type_t iface,
const var_t func,
int  idx,
unsigned int  proc_offset 
)
static

Definition at line 197 of file proxy.c.

199 {
200  var_t *retval = type_function_get_retval(func->type);
201  int has_ret = !is_void(retval->type);
202  int has_full_pointer = is_full_pointer_function(func);
203  const char *callconv = get_attrp(func->type->attrs, ATTR_CALLCONV);
204  const var_list_t *args = type_get_function_args(func->type);
205  if (!callconv) callconv = "STDMETHODCALLTYPE";
206 
207  indent = 0;
208  if (is_interpreted_func( iface, func ))
209  {
210  if (get_stub_mode() == MODE_Oif && !is_callas( func->attrs )) return;
211  write_type_decl_left(proxy, retval->type);
212  print_proxy( " %s %s_%s_Proxy(\n", callconv, iface->name, get_name(func));
213  write_args(proxy, args, iface->name, 1, TRUE);
214  print_proxy( ")\n");
215  write_client_call_routine( proxy, iface, func, "Object", proc_offset );
216  return;
217  }
218  print_proxy( "static void __finally_%s_%s_Proxy( struct __proxy_frame *__frame )\n",
219  iface->name, get_name(func) );
220  print_proxy( "{\n");
221  indent++;
222  if (has_full_pointer) write_full_pointer_free(proxy, indent, func);
223  print_proxy( "NdrProxyFreeBuffer( __frame->This, &__frame->_StubMsg );\n" );
224  indent--;
225  print_proxy( "}\n");
226  print_proxy( "\n");
227 
228  write_type_decl_left(proxy, retval->type);
229  print_proxy( " %s %s_%s_Proxy(\n", callconv, iface->name, get_name(func));
230  write_args(proxy, args, iface->name, 1, TRUE);
231  print_proxy( ")\n");
232  print_proxy( "{\n");
233  indent ++;
234  print_proxy( "struct __proxy_frame __f, * const __frame = &__f;\n" );
235  /* local variables */
236  if (has_ret) {
237  print_proxy( "%s", "" );
238  write_type_decl(proxy, retval->type, retval->name);
239  fprintf( proxy, ";\n" );
240  }
241  print_proxy( "RPC_MESSAGE _RpcMessage;\n" );
242  if (has_ret) {
243  if (decl_indirect(retval->type))
244  print_proxy("void *_p_%s = &%s;\n", retval->name, retval->name);
245  }
246  print_proxy( "\n");
247 
248  print_proxy( "RpcExceptionInit( __proxy_filter, __finally_%s_%s_Proxy );\n", iface->name, get_name(func) );
249  print_proxy( "__frame->This = This;\n" );
250 
251  if (has_full_pointer)
253 
254  /* FIXME: trace */
256 
257  print_proxy( "RpcTryExcept\n" );
258  print_proxy( "{\n" );
259  indent++;
260  print_proxy( "NdrProxyInitialize(This, &_RpcMessage, &__frame->_StubMsg, &Object_StubDesc, %d);\n", idx);
262 
263  print_proxy( "RpcTryFinally\n" );
264  print_proxy( "{\n" );
265  indent++;
266 
268 
269  print_proxy( "NdrProxyGetBuffer(This, &__frame->_StubMsg);\n" );
270 
272 
273  print_proxy( "NdrProxySendReceive(This, &__frame->_StubMsg);\n" );
274  fprintf(proxy, "\n");
275  print_proxy( "__frame->_StubMsg.BufferStart = _RpcMessage.Buffer;\n" );
276  print_proxy( "__frame->_StubMsg.BufferEnd = __frame->_StubMsg.BufferStart + _RpcMessage.BufferLength;\n\n" );
277 
278  print_proxy("if ((_RpcMessage.DataRepresentation & 0xffff) != NDR_LOCAL_DATA_REPRESENTATION)\n");
279  indent++;
280  print_proxy("NdrConvert( &__frame->_StubMsg, &__MIDL_ProcFormatString.Format[%u]);\n", proc_offset );
281  indent--;
282  fprintf(proxy, "\n");
283 
285 
286  if (has_ret)
287  {
288  if (decl_indirect(retval->type))
289  print_proxy("MIDL_memset(&%s, 0, sizeof(%s));\n", retval->name, retval->name);
290  else if (is_ptr(retval->type) || is_array(retval->type))
291  print_proxy("%s = 0;\n", retval->name);
293  }
294 
295  indent--;
296  print_proxy( "}\n");
297  print_proxy( "RpcFinally\n" );
298  print_proxy( "{\n" );
299  indent++;
300  print_proxy( "__finally_%s_%s_Proxy( __frame );\n", iface->name, get_name(func) );
301  indent--;
302  print_proxy( "}\n");
303  print_proxy( "RpcEndFinally\n" );
304  indent--;
305  print_proxy( "}\n" );
306  print_proxy( "RpcExcept(__frame->_StubMsg.dwStubPhase != PROXY_SENDRECEIVE)\n" );
307  print_proxy( "{\n" );
308  if (has_ret) {
309  indent++;
311  print_proxy( "_RetVal = NdrProxyErrorHandler(RpcExceptionCode());\n" );
312  indent--;
313  }
314  print_proxy( "}\n" );
315  print_proxy( "RpcEndExcept\n" );
316 
317  if (has_ret) {
318  print_proxy( "return _RetVal;\n" );
319  }
320  indent--;
321  print_proxy( "}\n");
322  print_proxy( "\n");
323 }
GLenum func
Definition: glext.h:6028
static int indent
Definition: proxy.c:41
static var_list_t * type_get_function_args(const type_t *func_type)
Definition: widltypes.h:584
#define TRUE
Definition: types.h:120
void * get_attrp(const attr_list_t *list, enum attr_type t)
Definition: header.c:107
void write_client_call_routine(FILE *file, const type_t *iface, const var_t *func, const char *prefix, unsigned int proc_offset)
Definition: typegen.c:4955
int is_interpreted_func(const type_t *iface, const var_t *func)
Definition: typegen.c:1240
enum stub_mode get_stub_mode(void)
Definition: widl.c:211
void write_full_pointer_free(FILE *file, int indent, const var_t *func)
Definition: typegen.c:2084
static var_t * type_function_get_retval(const type_t *type)
Definition: typetree.h:101
static void print_proxy(const char *format,...) __attribute__((format(printf
Definition: proxy.c:44
Definition: match.c:390
int is_full_pointer_function(const var_t *func)
Definition: typegen.c:2064
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
static int is_ptr(const type_t *t)
Definition: header.h:59
void write_full_pointer_init(FILE *file, int indent, const var_t *func, int is_server)
Definition: typegen.c:2077
unsigned int idx
Definition: utils.c:41
int get_name(unsigned char **pos, uint32_t *remaining, const char **out_name)
Definition: util.c:55
static int is_array(const type_t *t)
Definition: header.h:64
void write_type_decl(FILE *f, type_t *t, const char *name)
Definition: header.c:561
void write_args(FILE *h, const var_list_t *args, const char *name, int method, int do_indent)
Definition: header.c:1058
int decl_indirect(const type_t *t)
Definition: typegen.c:948
static FILE * proxy
Definition: proxy.c:40
type_t * type
Definition: widltypes.h:452
void write_type_decl_left(FILE *f, type_t *t)
Definition: header.c:566
void write_remoting_arguments(FILE *file, int indent, const var_t *func, const char *local_var_prefix, enum pass pass, enum remoting_phase phase)
Definition: typegen.c:4540
static void proxy_free_variables(var_list_t *args, const char *local_var_prefix)
Definition: proxy.c:184
const char * name
Definition: widltypes.h:418
Definition: _list.h:228
char * name
Definition: widltypes.h:451
static void clear_output_vars(const var_list_t *args)
Definition: proxy.c:105
const var_t * is_callas(const attr_list_t *a)
Definition: header.c:943
void write_pointer_checks(FILE *file, int indent, const var_t *func)
Definition: typegen.c:4826
static int is_void(const type_t *t)
Definition: header.h:69
Definition: widl.h:89

Referenced by write_proxy().

◆ gen_stub()

static void gen_stub ( type_t iface,
const var_t func,
const char cas,
unsigned int  proc_offset 
)
static

Definition at line 325 of file proxy.c.

327 {
328  const var_t *arg;
329  int has_ret = !is_void(type_function_get_rettype(func->type));
330  int has_full_pointer = is_full_pointer_function(func);
331 
332  if (is_interpreted_func( iface, func )) return;
333 
334  indent = 0;
335  print_proxy( "struct __frame_%s_%s_Stub\n{\n", iface->name, get_name(func));
336  indent++;
337  print_proxy( "__DECL_EXCEPTION_FRAME\n" );
338  print_proxy( "MIDL_STUB_MESSAGE _StubMsg;\n");
339  print_proxy( "%s * _This;\n", iface->name );
341  indent--;
342  print_proxy( "};\n\n" );
343 
344  print_proxy( "static void __finally_%s_%s_Stub(", iface->name, get_name(func) );
345  print_proxy( " struct __frame_%s_%s_Stub *__frame )\n{\n", iface->name, get_name(func) );
346  indent++;
348  if (has_full_pointer)
350  indent--;
351  print_proxy( "}\n\n" );
352 
353  print_proxy( "void __RPC_STUB %s_%s_Stub(\n", iface->name, get_name(func));
354  indent++;
355  print_proxy( "IRpcStubBuffer* This,\n");
356  print_proxy( "IRpcChannelBuffer *_pRpcChannelBuffer,\n");
357  print_proxy( "PRPC_MESSAGE _pRpcMessage,\n");
358  print_proxy( "DWORD* _pdwStubPhase)\n");
359  indent--;
360  print_proxy( "{\n");
361  indent++;
362  print_proxy( "struct __frame_%s_%s_Stub __f, * const __frame = &__f;\n\n",
363  iface->name, get_name(func) );
364 
365  print_proxy("__frame->_This = (%s*)((CStdStubBuffer*)This)->pvServerObject;\n\n", iface->name);
366 
367  /* FIXME: trace */
368 
369  print_proxy("NdrStubInitialize(_pRpcMessage, &__frame->_StubMsg, &Object_StubDesc, _pRpcChannelBuffer);\n");
370  fprintf(proxy, "\n");
371  print_proxy( "RpcExceptionInit( 0, __finally_%s_%s_Stub );\n", iface->name, get_name(func) );
372 
373  write_parameters_init(proxy, indent, func, "__frame->");
374 
375  print_proxy("RpcTryFinally\n");
376  print_proxy("{\n");
377  indent++;
378  if (has_full_pointer)
380  print_proxy("if ((_pRpcMessage->DataRepresentation & 0xffff) != NDR_LOCAL_DATA_REPRESENTATION)\n");
381  indent++;
382  print_proxy("NdrConvert( &__frame->_StubMsg, &__MIDL_ProcFormatString.Format[%u]);\n", proc_offset );
383  indent--;
384  fprintf(proxy, "\n");
385 
387  fprintf(proxy, "\n");
388 
389  assign_stub_out_args( proxy, indent, func, "__frame->" );
390 
391  print_proxy("*_pdwStubPhase = STUB_CALL_SERVER;\n");
392  fprintf(proxy, "\n");
393  print_proxy( "%s", has_ret ? "__frame->_RetVal = " : "" );
394  if (cas) fprintf(proxy, "%s_%s_Stub", iface->name, cas);
395  else fprintf(proxy, "__frame->_This->lpVtbl->%s", get_name(func));
396  fprintf(proxy, "(__frame->_This");
397 
398  if (type_get_function_args(func->type))
399  {
401  fprintf(proxy, ", %s__frame->%s", is_array(arg->type) && !type_array_is_decl_as_ptr(arg->type) ? "*" :"" , arg->name);
402  }
403  fprintf(proxy, ");\n");
404  fprintf(proxy, "\n");
405  print_proxy("*_pdwStubPhase = STUB_MARSHAL;\n");
406  fprintf(proxy, "\n");
407 
409 
412 
413  print_proxy("NdrStubGetBuffer(This, _pRpcChannelBuffer, &__frame->_StubMsg);\n");
414 
416  fprintf(proxy, "\n");
417 
418  /* marshall the return value */
421 
422  indent--;
423  print_proxy("}\n");
424  print_proxy("RpcFinally\n");
425  print_proxy("{\n");
426  indent++;
427  print_proxy( "__finally_%s_%s_Stub( __frame );\n", iface->name, get_name(func) );
428  indent--;
429  print_proxy("}\n");
430  print_proxy("RpcEndFinally\n");
431 
432  print_proxy("_pRpcMessage->BufferLength = __frame->_StubMsg.Buffer - (unsigned char *)_pRpcMessage->Buffer;\n");
433  indent--;
434 
435  print_proxy("}\n");
436  print_proxy("\n");
437 }
GLenum func
Definition: glext.h:6028
static int indent
Definition: proxy.c:41
static var_list_t * type_get_function_args(const type_t *func_type)
Definition: widltypes.h:584
#define TRUE
Definition: types.h:120
int is_interpreted_func(const type_t *iface, const var_t *func)
Definition: typegen.c:1240
void assign_stub_out_args(FILE *file, int indent, const var_t *func, const char *local_var_prefix)
Definition: typegen.c:4657
void write_full_pointer_free(FILE *file, int indent, const var_t *func)
Definition: typegen.c:2084
void * arg
Definition: msvc.h:12
static void print_proxy(const char *format,...) __attribute__((format(printf
Definition: proxy.c:44
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
int is_full_pointer_function(const var_t *func)
Definition: typegen.c:2064
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
void write_full_pointer_init(FILE *file, int indent, const var_t *func, int is_server)
Definition: typegen.c:2077
int get_name(unsigned char **pos, uint32_t *remaining, const char **out_name)
Definition: util.c:55
static int is_array(const type_t *t)
Definition: header.h:64
void write_parameters_init(FILE *file, int indent, const var_t *func, const char *local_var_prefix)
Definition: typegen.c:903
static FILE * proxy
Definition: proxy.c:40
void write_remoting_arguments(FILE *file, int indent, const var_t *func, const char *local_var_prefix, enum pass pass, enum remoting_phase phase)
Definition: typegen.c:4540
const char * name
Definition: widltypes.h:418
uint32_t entry
Definition: isohybrid.c:63
void declare_stub_args(FILE *file, int indent, const var_t *func)
Definition: typegen.c:4596
static int type_array_is_decl_as_ptr(const type_t *type)
Definition: typetree.h:260
static int is_void(const type_t *t)
Definition: header.h:69
static type_t * type_function_get_rettype(const type_t *type)
Definition: typetree.h:108

Referenced by write_proxy().

◆ gen_stub_thunk()

static void gen_stub_thunk ( type_t iface,
const var_t func,
unsigned int  proc_offset 
)
static

Definition at line 439 of file proxy.c.

440 {
441  int has_ret = !is_void( type_function_get_rettype( func->type ));
442  const var_t *arg, *callas = is_callas( func->attrs );
443  const var_list_t *args = type_get_function_args( func->type );
444 
445  indent = 0;
446  print_proxy( "void __RPC_API %s_%s_Thunk( PMIDL_STUB_MESSAGE pStubMsg )\n",
447  iface->name, get_name(func) );
448  print_proxy( "{\n");
449  indent++;
450  write_func_param_struct( proxy, iface, func->type,
451  "*pParamStruct = (struct _PARAM_STRUCT *)pStubMsg->StackTop", has_ret );
452  print_proxy( "%s%s_%s_Stub( pParamStruct->This",
453  has_ret ? "pParamStruct->_RetVal = " : "", iface->name, callas->name );
454  indent++;
455  if (args) LIST_FOR_EACH_ENTRY( arg, args, const var_t, entry )
456  {
457  fprintf( proxy, ",\n%*spParamStruct->%s", 4 * indent, "", arg->name );
458  }
459  fprintf( proxy, " );\n" );
460  indent--;
461  indent--;
462  print_proxy( "}\n\n");
463 }
GLenum func
Definition: glext.h:6028
static int indent
Definition: proxy.c:41
static var_list_t * type_get_function_args(const type_t *func_type)
Definition: widltypes.h:584
void write_func_param_struct(FILE *file, const type_t *iface, const type_t *func, const char *var_decl, int add_retval)
Definition: typegen.c:4770
void * arg
Definition: msvc.h:12
static void print_proxy(const char *format,...) __attribute__((format(printf
Definition: proxy.c:44
Definition: match.c:390
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
int get_name(unsigned char **pos, uint32_t *remaining, const char **out_name)
Definition: util.c:55
static FILE * proxy
Definition: proxy.c:40
const char * name
Definition: widltypes.h:418
uint32_t entry
Definition: isohybrid.c:63
Definition: _list.h:228
char * name
Definition: widltypes.h:451
const var_t * is_callas(const attr_list_t *a)
Definition: header.c:943
static int is_void(const type_t *t)
Definition: header.h:69
static type_t * type_function_get_rettype(const type_t *type)
Definition: typetree.h:108

Referenced by write_proxy().

◆ get_callas_source()

static const statement_t* get_callas_source ( const type_t iface,
const var_t def 
)
static

Definition at line 480 of file proxy.c.

481 {
482  const statement_t * source;
484  const var_t * cas = is_callas(source->u.var->attrs );
485  if (cas && !strcmp(def->name, cas->name))
486  return source;
487  }
488  return NULL;
489 }
#define STATEMENTS_FOR_EACH_FUNC(stmt, stmts)
Definition: widltypes.h:596
smooth NULL
Definition: ftsmooth.c:416
char * name
Definition: widltypes.h:451
GLsizei GLsizei GLchar * source
Definition: glext.h:6048
const var_t * is_callas(const attr_list_t *a)
Definition: header.c:943
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
static statement_list_t * type_iface_get_stmts(const type_t *type)
Definition: typetree.h:151

Referenced by write_proxy_methods(), write_proxy_procformatstring_offsets(), write_stub_methods(), and write_thunk_methods().

◆ get_delegation_indirect()

static int get_delegation_indirect ( const type_t iface,
const type_t **  delegate_to 
)
static

Definition at line 135 of file proxy.c.

136 {
137  const type_t * cur_iface;
138  for (cur_iface = iface; cur_iface != NULL; cur_iface = type_iface_get_inherit(cur_iface))
139  if (need_delegation(cur_iface))
140  {
141  if(delegate_to)
142  *delegate_to = type_iface_get_inherit(cur_iface);
143  return 1;
144  }
145  return 0;
146 }
smooth NULL
Definition: ftsmooth.c:416
static type_t * type_iface_get_inherit(const type_t *type)
Definition: typetree.h:158
static int need_delegation(const type_t *iface)
Definition: proxy.c:129

Referenced by need_delegation_indirect(), and write_proxy_routines().

◆ init_proxy()

static void init_proxy ( const statement_list_t stmts)
static

Definition at line 83 of file proxy.c.

84 {
85  if (proxy) return;
86  if(!(proxy = fopen(proxy_name, "w")))
87  error("Could not open %s for output\n", proxy_name);
88  print_proxy( "/*** Autogenerated by WIDL %s from %s - Do not edit ***/\n", PACKAGE_VERSION, input_name);
89  print_proxy( "\n");
90  print_proxy( "#define __midl_proxy\n\n");
91 
92  print_proxy( "#ifdef __REACTOS__\n");
93  print_proxy( "#define WIN32_NO_STATUS\n");
94  print_proxy( "#define WIN32_LEAN_AND_MEAN\n");
95  print_proxy( "#endif\n\n");
96 
97  print_proxy( "#include \"objbase.h\"\n");
98  print_proxy( "\n");
99  print_proxy( "#ifndef DECLSPEC_HIDDEN\n");
100  print_proxy( "#define DECLSPEC_HIDDEN\n");
101  print_proxy( "#endif\n");
102  print_proxy( "\n");
103 }
#define error(str)
Definition: mkdosfs.c:1605
#define PACKAGE_VERSION
Definition: config.h:835
static void print_proxy(const char *format,...) __attribute__((format(printf
Definition: proxy.c:44
char * proxy_name
Definition: widl.c:141
static FILE * proxy
Definition: proxy.c:40
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
char * input_name
Definition: parser.yy.c:774

Referenced by write_proxies().

◆ need_delegation()

static int need_delegation ( const type_t iface)
static

Definition at line 129 of file proxy.c.

130 {
131  const type_t *parent = type_iface_get_inherit( iface );
132  return parent && type_iface_get_inherit(parent) && (parent->ignore || is_local( parent->attrs ));
133 }
int is_local(const attr_list_t *a)
Definition: header.c:938
r parent
Definition: btrfs.c:2869
static type_t * type_iface_get_inherit(const type_t *type)
Definition: typetree.h:158

Referenced by get_delegation_indirect(), need_proxy_delegation(), write_proxy(), write_proxy_methods(), write_proxy_procformatstring_offsets(), write_stub_methods(), and write_thunk_methods().

◆ need_delegation_indirect()

static int need_delegation_indirect ( const type_t iface)
static

Definition at line 148 of file proxy.c.

149 {
150  return get_delegation_indirect(iface, NULL);
151 }
smooth NULL
Definition: ftsmooth.c:416
static int get_delegation_indirect(const type_t *iface, const type_t **delegate_to)
Definition: proxy.c:135

Referenced by write_proxy().

◆ need_inline_stubs()

int need_inline_stubs ( const type_t iface)

Definition at line 819 of file proxy.c.

820 {
821  const statement_t *stmt;
822 
823  if (get_stub_mode() == MODE_Os) return 1;
824 
826  {
827  const var_t *func = stmt->u.var;
828  if (is_local( func->attrs )) continue;
829  if (!is_interpreted_func( iface, func )) return 1;
830  }
831  return 0;
832 }
#define STATEMENTS_FOR_EACH_FUNC(stmt, stmts)
Definition: widltypes.h:596
GLenum func
Definition: glext.h:6028
int is_interpreted_func(const type_t *iface, const var_t *func)
Definition: typegen.c:1240
var_t * var
Definition: widltypes.h:538
enum stub_mode get_stub_mode(void)
Definition: widl.c:211
int is_local(const attr_list_t *a)
Definition: header.c:938
union _statement_t::@4053 u
Definition: widl.h:87
static statement_list_t * type_iface_get_stmts(const type_t *type)
Definition: typetree.h:151

Referenced by need_inline_stubs_file(), and write_proxy().

◆ need_inline_stubs_file()

int need_inline_stubs_file ( const statement_list_t stmts)

Definition at line 855 of file proxy.c.

856 {
857  return does_any_iface(stmts, need_inline_stubs);
858 }
int need_inline_stubs(const type_t *iface)
Definition: proxy.c:819
static int does_any_iface(const statement_list_t *stmts, type_pred_t pred)
Definition: proxy.c:779

Referenced by write_client_routines(), and write_server_routines().

◆ need_proxy()

int need_proxy ( const type_t iface)

Definition at line 796 of file proxy.c.

797 {
798  if (!is_object( iface )) return 0;
799  if (is_local( iface->attrs )) return 0;
800  if (is_attr( iface->attrs, ATTR_DISPINTERFACE )) return 0;
801  return 1;
802 }
int is_local(const attr_list_t *a)
Definition: header.c:938
attr_list_t * attrs
Definition: widltypes.h:421
int is_object(const type_t *iface)
Definition: header.c:928
int is_attr(const attr_list_t *list, enum attr_type t)
Definition: header.c:99

Referenced by build_iface_list(), need_proxy_and_inline_stubs(), need_proxy_file(), write_proxy_routines(), and write_proxy_stmts().

◆ need_proxy_and_inline_stubs()

static int need_proxy_and_inline_stubs ( const type_t iface)
static

Definition at line 834 of file proxy.c.

835 {
836  const statement_t *stmt;
837 
838  if (!need_proxy( iface )) return 0;
839  if (get_stub_mode() == MODE_Os) return 1;
840 
842  {
843  const var_t *func = stmt->u.var;
844  if (is_local( func->attrs )) continue;
845  if (!is_interpreted_func( iface, func )) return 1;
846  }
847  return 0;
848 }
#define STATEMENTS_FOR_EACH_FUNC(stmt, stmts)
Definition: widltypes.h:596
GLenum func
Definition: glext.h:6028
int is_interpreted_func(const type_t *iface, const var_t *func)
Definition: typegen.c:1240
var_t * var
Definition: widltypes.h:538
enum stub_mode get_stub_mode(void)
Definition: widl.c:211
int is_local(const attr_list_t *a)
Definition: header.c:938
union _statement_t::@4053 u
int need_proxy(const type_t *iface)
Definition: proxy.c:796
Definition: widl.h:87
static statement_list_t * type_iface_get_stmts(const type_t *type)
Definition: typetree.h:151

Referenced by write_proxy_routines().

◆ need_proxy_delegation()

int need_proxy_delegation ( const statement_list_t stmts)

Definition at line 814 of file proxy.c.

815 {
816  return does_any_iface(stmts, need_delegation);
817 }
static int need_delegation(const type_t *iface)
Definition: proxy.c:129
static int does_any_iface(const statement_list_t *stmts, type_pred_t pred)
Definition: proxy.c:779

Referenced by write_dlldata().

◆ need_proxy_file()

int need_proxy_file ( const statement_list_t stmts)

Definition at line 809 of file proxy.c.

810 {
811  return does_any_iface(stmts, need_proxy);
812 }
int need_proxy(const type_t *iface)
Definition: proxy.c:796
static int does_any_iface(const statement_list_t *stmts, type_pred_t pred)
Definition: proxy.c:779

Referenced by write_dlldata(), write_proxies(), and write_regscript().

◆ need_stub()

int need_stub ( const type_t iface)

Definition at line 804 of file proxy.c.

805 {
806  return !is_object(iface) && !is_local(iface->attrs);
807 }
int is_local(const attr_list_t *a)
Definition: header.c:938
attr_list_t * attrs
Definition: widltypes.h:421
int is_object(const type_t *iface)
Definition: header.c:928

Referenced by need_stub_files(), write_client_ifaces(), write_client_routines(), write_server_routines(), and write_server_stmts().

◆ need_stub_files()

int need_stub_files ( const statement_list_t stmts)

Definition at line 850 of file proxy.c.

851 {
852  return does_any_iface(stmts, need_stub);
853 }
int need_stub(const type_t *iface)
Definition: proxy.c:804
static int does_any_iface(const statement_list_t *stmts, type_pred_t pred)
Definition: proxy.c:779

Referenced by write_client(), and write_server().

◆ print_proxy()

static void static void print_proxy ( const char format,
  ... 
)
static

Definition at line 44 of file proxy.c.

45 {
46  va_list va;
47  va_start( va, format );
48  print( proxy, indent, format, va );
49  va_end( va );
50 }
static int indent
Definition: proxy.c:41
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
#define va_end(ap)
Definition: acmsvcex.h:90
char * va_list
Definition: acmsvcex.h:78
static FILE * proxy
Definition: proxy.c:40
static void print(LPPRINTDLGW pd, LPWSTR wszFileName)
Definition: print.c:440
#define va_start(ap, A)
Definition: acmsvcex.h:91

Referenced by clear_output_vars(), free_variable(), gen_proxy(), gen_stub(), gen_stub_thunk(), init_proxy(), write_proxy(), write_proxy_methods(), write_proxy_procformatstring_offsets(), write_proxy_routines(), write_stub_methods(), write_stubdesc(), write_stubdescproto(), and write_thunk_methods().

◆ proxy_free_variables()

static void proxy_free_variables ( var_list_t args,
const char local_var_prefix 
)
static

Definition at line 184 of file proxy.c.

185 {
186  const var_t *arg;
187 
188  if (!args) return;
190  if (is_attr(arg->attrs, ATTR_OUT))
191  {
192  free_variable( arg, local_var_prefix );
193  fprintf(proxy, "\n");
194  }
195 }
void * arg
Definition: msvc.h:12
Definition: match.c:390
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
static FILE * proxy
Definition: proxy.c:40
uint32_t entry
Definition: isohybrid.c:63
int is_attr(const attr_list_t *list, enum attr_type t)
Definition: header.c:99
static void free_variable(const var_t *arg, const char *local_var_prefix)
Definition: proxy.c:153

Referenced by gen_proxy().

◆ sort_interfaces()

static type_t** sort_interfaces ( const statement_list_t stmts,
int count 
)
static

Definition at line 912 of file proxy.c.

913 {
914  type_t **ifaces = NULL;
915 
916  *count = 0;
917  build_iface_list( stmts, &ifaces, count );
918  qsort( ifaces, *count, sizeof(*ifaces), cmp_iid );
919  return ifaces;
920 }
static int cmp_iid(const void *ptr1, const void *ptr2)
Definition: proxy.c:878
GLuint GLuint GLsizei count
Definition: gl.h:1545
static void build_iface_list(const statement_list_t *stmts, type_t **ifaces[], int *count)
Definition: proxy.c:887
void __cdecl qsort(_Inout_updates_bytes_(_NumOfElements *_SizeOfElements) void *_Base, _In_ size_t _NumOfElements, _In_ size_t _SizeOfElements, _In_ int(__cdecl *_PtFuncCompare)(const void *, const void *))
smooth NULL
Definition: ftsmooth.c:416

Referenced by write_proxy_routines().

◆ write_proxies()

void write_proxies ( const statement_list_t stmts)

Definition at line 1077 of file proxy.c.

1078 {
1079  if (!do_proxies) return;
1080  if (do_everything && !need_proxy_file(stmts)) return;
1081 
1082  init_proxy(stmts);
1083  if(!proxy) return;
1084 
1085  write_proxy_routines( stmts );
1086  fclose(proxy);
1087 }
static FILE * proxy
Definition: proxy.c:40
static void write_proxy_routines(const statement_list_t *stmts)
Definition: proxy.c:922
int do_proxies
Definition: widl.c:119
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
int need_proxy_file(const statement_list_t *stmts)
Definition: proxy.c:809
int do_everything
Definition: widl.c:114
static void init_proxy(const statement_list_t *stmts)
Definition: proxy.c:83

Referenced by yyparse().

◆ write_proxy()

static void write_proxy ( type_t iface,
unsigned int proc_offset 
)
static

Definition at line 612 of file proxy.c.

613 {
614  int count;
615  const statement_t *stmt;
616  int first_func = 1;
617  int needs_stub_thunks = 0;
618  int needs_inline_stubs = need_inline_stubs( iface ) || need_delegation( iface );
619 
621  var_t *func = stmt->u.var;
622  if (first_func) {
623  fprintf(proxy, "/*****************************************************************************\n");
624  fprintf(proxy, " * %s interface\n", iface->name);
625  fprintf(proxy, " */\n");
626  first_func = 0;
627  }
628  if (!is_local(func->attrs)) {
629  const var_t *cas = is_callas(func->attrs);
630  const char *cname = cas ? cas->name : NULL;
631  int idx = func->type->details.function->idx;
632  if (cname) {
633  const statement_t *stmt2;
635  const var_t *m = stmt2->u.var;
636  if (!strcmp(m->name, cname))
637  {
638  idx = m->type->details.function->idx;
639  break;
640  }
641  }
642  }
643  func->procstring_offset = *proc_offset;
644  gen_proxy(iface, func, idx, *proc_offset);
645  gen_stub(iface, func, cname, *proc_offset);
646  if (cas && is_interpreted_func( iface, func ))
647  {
648  needs_stub_thunks = 1;
649  gen_stub_thunk(iface, func, *proc_offset);
650  }
651  *proc_offset += get_size_procformatstring_func( iface, func );
652  }
653  }
654 
655  count = count_methods(iface);
656 
657  print_proxy( "static const unsigned short %s_FormatStringOffsetTable[] =\n", iface->name );
658  print_proxy( "{\n" );
659  indent++;
660 #ifdef __REACTOS__ /* r57019 / c3be8a3 */
661  if (write_proxy_procformatstring_offsets( iface, 0 ) == 0)
662  {
663  print_proxy( "0\n" );
664  }
665 #else
667 #endif
668  indent--;
669  print_proxy( "};\n\n" );
670 
671  /* proxy info */
672  if (get_stub_mode() == MODE_Oif)
673  {
674  print_proxy( "static const MIDL_STUBLESS_PROXY_INFO %s_ProxyInfo =\n", iface->name );
675  print_proxy( "{\n" );
676  indent++;
677  print_proxy( "&Object_StubDesc,\n" );
678  print_proxy( "__MIDL_ProcFormatString.Format,\n" );
679  print_proxy( "&%s_FormatStringOffsetTable[-3],\n", iface->name );
680  print_proxy( "0,\n" );
681  print_proxy( "0,\n" );
682  print_proxy( "0\n" );
683  indent--;
684  print_proxy( "};\n\n" );
685  }
686 
687  /* proxy vtable */
688  print_proxy( "static %sCINTERFACE_PROXY_VTABLE(%d) _%sProxyVtbl =\n",
689  (get_stub_mode() != MODE_Os || need_delegation_indirect(iface)) ? "" : "const ",
690  count, iface->name);
691  print_proxy( "{\n");
692  indent++;
693  print_proxy( "{\n");
694  indent++;
695  if (get_stub_mode() == MODE_Oif) print_proxy( "&%s_ProxyInfo,\n", iface->name );
696  print_proxy( "&IID_%s,\n", iface->name);
697  indent--;
698  print_proxy( "},\n");
699  print_proxy( "{\n");
700  indent++;
701  write_proxy_methods(iface, FALSE);
702  indent--;
703  print_proxy( "}\n");
704  indent--;
705  print_proxy( "};\n\n");
706 
707  /* stub thunk table */
708  if (needs_stub_thunks)
709  {
710  print_proxy( "static const STUB_THUNK %s_StubThunkTable[] =\n", iface->name);
711  print_proxy( "{\n");
712  indent++;
713  write_thunk_methods( iface, 0 );
714  indent--;
715  print_proxy( "};\n\n");
716  }
717 
718  /* server info */
719  print_proxy( "static const MIDL_SERVER_INFO %s_ServerInfo =\n", iface->name );
720  print_proxy( "{\n" );
721  indent++;
722  print_proxy( "&Object_StubDesc,\n" );
723  print_proxy( "0,\n" );
724  print_proxy( "__MIDL_ProcFormatString.Format,\n" );
725  print_proxy( "&%s_FormatStringOffsetTable[-3],\n", iface->name );
726  if (needs_stub_thunks)
727  print_proxy( "&%s_StubThunkTable[-3],\n", iface->name );
728  else
729  print_proxy( "0,\n" );
730  print_proxy( "0,\n" );
731  print_proxy( "0,\n" );
732  print_proxy( "0\n" );
733  indent--;
734  print_proxy( "};\n\n" );
735 
736  /* stub vtable */
737  if (needs_inline_stubs)
738  {
739  print_proxy( "static const PRPC_STUB_FUNCTION %s_table[] =\n", iface->name);
740  print_proxy( "{\n");
741  indent++;
742 #ifdef __REACTOS__ /* r57019 / c3be8a3 */
743  if (write_stub_methods(iface, FALSE) == 0)
744  {
745  fprintf(proxy, "0");
746  }
747 #else
748  write_stub_methods(iface, FALSE);
749 #endif
750  fprintf(proxy, "\n");
751  indent--;
752  fprintf(proxy, "};\n\n");
753  }
754  print_proxy( "static %sCInterfaceStubVtbl _%sStubVtbl =\n",
755  need_delegation_indirect(iface) ? "" : "const ", iface->name);
756  print_proxy( "{\n");
757  indent++;
758  print_proxy( "{\n");
759  indent++;
760  print_proxy( "&IID_%s,\n", iface->name);
761  print_proxy( "&%s_ServerInfo,\n", iface->name );
762  print_proxy( "%d,\n", count);
763  if (needs_inline_stubs) print_proxy( "&%s_table[-3]\n", iface->name );
764  else print_proxy( "0\n" );
765  indent--;
766  print_proxy( "},\n");
767  print_proxy( "{\n");
768  indent++;
769  print_proxy( "%s_%s\n",
770  iface->details.iface->async_iface == iface ? "CStdAsyncStubBuffer" : "CStdStubBuffer",
771  need_delegation_indirect(iface) ? "DELEGATING_METHODS" : "METHODS");
772  indent--;
773  print_proxy( "}\n");
774  indent--;
775  print_proxy( "};\n");
776  print_proxy( "\n");
777 }
static int write_proxy_methods(type_t *iface, int skip)
Definition: proxy.c:530
#define STATEMENTS_FOR_EACH_FUNC(stmt, stmts)
Definition: widltypes.h:596
GLenum func
Definition: glext.h:6028
static int indent
Definition: proxy.c:41
static void write_proxy_procformatstring_offsets(const type_t *iface, int skip)
Definition: proxy.c:494
int is_interpreted_func(const type_t *iface, const var_t *func)
Definition: typegen.c:1240
var_t * var
Definition: widltypes.h:538
enum stub_mode get_stub_mode(void)
Definition: widl.c:211
GLuint GLuint GLsizei count
Definition: gl.h:1545
int is_local(const attr_list_t *a)
Definition: header.c:938
union _type_t::@4052 details
static void print_proxy(const char *format,...) __attribute__((format(printf
Definition: proxy.c:44
const GLfloat * m
Definition: glext.h:10848
static int need_delegation_indirect(const type_t *iface)
Definition: proxy.c:148
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
int count_methods(const type_t *iface)
Definition: proxy.c:465
unsigned int idx
Definition: utils.c:41
smooth NULL
Definition: ftsmooth.c:416
unsigned int get_size_procformatstring_func(const type_t *iface, const var_t *func)
Definition: typegen.c:4565
static void gen_stub_thunk(type_t *iface, const var_t *func, unsigned int proc_offset)
Definition: proxy.c:439
static void gen_stub(type_t *iface, const var_t *func, const char *cas, unsigned int proc_offset)
Definition: proxy.c:325
static FILE * proxy
Definition: proxy.c:40
struct iface_details * iface
Definition: widltypes.h:427
const char * name
Definition: widltypes.h:418
union _statement_t::@4053 u
int need_inline_stubs(const type_t *iface)
Definition: proxy.c:819
char * name
Definition: widltypes.h:451
static int need_delegation(const type_t *iface)
Definition: proxy.c:129
Definition: widl.h:87
const var_t * is_callas(const attr_list_t *a)
Definition: header.c:943
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
static void write_thunk_methods(type_t *iface, int skip)
Definition: proxy.c:588
static void gen_proxy(type_t *iface, const var_t *func, int idx, unsigned int proc_offset)
Definition: proxy.c:197
static int write_stub_methods(type_t *iface, int skip)
Definition: proxy.c:555
static statement_list_t * type_iface_get_stmts(const type_t *type)
Definition: typetree.h:151
Definition: widl.h:89

Referenced by write_proxy_stmts().

◆ write_proxy_methods()

static int write_proxy_methods ( type_t iface,
int  skip 
)
static

Definition at line 530 of file proxy.c.

531 {
532  const statement_t *stmt;
533  int i = 0;
534 
535  if (type_iface_get_inherit(iface))
537  need_delegation(iface));
539  const var_t *func = stmt->u.var;
540  if (!is_callas(func->attrs)) {
541  if (skip || (is_local(func->attrs) && !get_callas_source(iface, func)))
542  print_proxy( "0, /* %s::%s */\n", iface->name, get_name(func));
543  else if (is_interpreted_func( iface, func ) &&
544  !is_local( func->attrs ) &&
545  type_iface_get_inherit(iface))
546  print_proxy( "(void *)-1, /* %s::%s */\n", iface->name, get_name(func));
547  else
548  print_proxy( "%s_%s_Proxy,\n", iface->name, get_name(func));
549  i++;
550  }
551  }
552  return i;
553 }
static int write_proxy_methods(type_t *iface, int skip)
Definition: proxy.c:530
#define STATEMENTS_FOR_EACH_FUNC(stmt, stmts)
Definition: widltypes.h:596
GLenum func
Definition: glext.h:6028
int is_interpreted_func(const type_t *iface, const var_t *func)
Definition: typegen.c:1240
var_t * var
Definition: widltypes.h:538
int is_local(const attr_list_t *a)
Definition: header.c:938
static const statement_t * get_callas_source(const type_t *iface, const var_t *def)
Definition: proxy.c:480
static void print_proxy(const char *format,...) __attribute__((format(printf
Definition: proxy.c:44
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
int get_name(unsigned char **pos, uint32_t *remaining, const char **out_name)
Definition: util.c:55
const char * name
Definition: widltypes.h:418
static type_t * type_iface_get_inherit(const type_t *type)
Definition: typetree.h:158
union _statement_t::@4053 u
static int need_delegation(const type_t *iface)
Definition: proxy.c:129
const var_t * is_callas(const attr_list_t *a)
Definition: header.c:943
#define skip(...)
Definition: atltest.h:64
static statement_list_t * type_iface_get_stmts(const type_t *type)
Definition: typetree.h:151

Referenced by write_proxy().

◆ write_proxy_procformatstring_offsets()

static void write_proxy_procformatstring_offsets ( const type_t iface,
int  skip 
)
static

Definition at line 494 of file proxy.c.

496 {
497  const statement_t *stmt;
498  int i = 0;
499 
500  if (type_iface_get_inherit(iface))
502  else
503  return 0;
504 
506  {
507  const var_t *func = stmt->u.var;
508  int missing = 0;
509 
510  if (is_callas(func->attrs)) continue;
511  if (is_local(func->attrs))
512  {
513  const statement_t * callas_source = get_callas_source(iface, func);
514  if (!callas_source)
515  missing = 1;
516  else
517  func = callas_source->u.var;
518  }
519  if (skip || missing)
520  print_proxy( "(unsigned short)-1, /* %s::%s */\n", iface->name, get_name(func));
521  else
522  print_proxy( "%u, /* %s::%s */\n", func->procstring_offset, iface->name, get_name(func));
523  i++;
524  }
525 #ifdef __REACTOS__ /* r57019 / c3be8a3 */
526  return i;
527 #endif
528 }
#define STATEMENTS_FOR_EACH_FUNC(stmt, stmts)
Definition: widltypes.h:596
GLenum func
Definition: glext.h:6028
static void write_proxy_procformatstring_offsets(const type_t *iface, int skip)
Definition: proxy.c:494
var_t * var
Definition: widltypes.h:538
int is_local(const attr_list_t *a)
Definition: header.c:938
static const statement_t * get_callas_source(const type_t *iface, const var_t *def)
Definition: proxy.c:480
static void print_proxy(const char *format,...) __attribute__((format(printf
Definition: proxy.c:44
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
int get_name(unsigned char **pos, uint32_t *remaining, const char **out_name)
Definition: util.c:55
const char * name
Definition: widltypes.h:418
static type_t * type_iface_get_inherit(const type_t *type)
Definition: typetree.h:158
union _statement_t::@4053 u
static int need_delegation(const type_t *iface)
Definition: proxy.c:129
const var_t * is_callas(const attr_list_t *a)
Definition: header.c:943
#define skip(...)
Definition: atltest.h:64
static statement_list_t * type_iface_get_stmts(const type_t *type)
Definition: typetree.h:151

Referenced by write_proxy().

◆ write_proxy_routines()

static void write_proxy_routines ( const statement_list_t stmts)
static

Definition at line 922 of file proxy.c.

923 {
924  int expr_eval_routines;
925  unsigned int proc_offset = 0;
926  char *file_id = proxy_token;
927  int i, count, have_baseiid = 0;
928  unsigned int table_version;
929  type_t **interfaces;
930  const type_t * delegate_to;
931 
932  print_proxy( "#ifndef __REDQ_RPCPROXY_H_VERSION__\n");
933  print_proxy( "#define __REQUIRED_RPCPROXY_H_VERSION__ %u\n", get_stub_mode() == MODE_Oif ? 475 : 440);
934  print_proxy( "#endif\n");
935  print_proxy( "\n");
936  if (get_stub_mode() == MODE_Oif) print_proxy( "#define USE_STUBLESS_PROXY\n");
937  print_proxy( "#include \"rpcproxy.h\"\n");
938  print_proxy( "#ifndef __RPCPROXY_H_VERSION__\n");
939  print_proxy( "#error This code needs a newer version of rpcproxy.h\n");
940  print_proxy( "#endif /* __RPCPROXY_H_VERSION__ */\n");
941  print_proxy( "\n");
942  print_proxy( "#include \"%s\"\n", header_name);
943  print_proxy( "\n");
944 
946  {
948  print_proxy( "\n");
949  print_proxy( "struct __proxy_frame\n");
950  print_proxy( "{\n");
951  print_proxy( " __DECL_EXCEPTION_FRAME\n");
952  print_proxy( " MIDL_STUB_MESSAGE _StubMsg;\n");
953  print_proxy( " void *This;\n");
954  print_proxy( "};\n");
955  print_proxy( "\n");
956  print_proxy("static int __proxy_filter( struct __proxy_frame *__frame )\n");
957  print_proxy( "{\n");
958  print_proxy( " return (__frame->_StubMsg.dwStubPhase != PROXY_SENDRECEIVE);\n");
959  print_proxy( "}\n");
960  print_proxy( "\n");
961  }
962 
965  write_proxy_stmts(stmts, &proc_offset);
966 
968  if (expr_eval_routines)
972 
973  print_proxy( "#if !defined(__RPC_WIN%u__)\n", pointer_size == 8 ? 64 : 32);
974  print_proxy( "#error Invalid build platform for this proxy.\n");
975  print_proxy( "#endif\n");
976  print_proxy( "\n");
979 
980  interfaces = sort_interfaces(stmts, &count);
981  fprintf(proxy, "static const CInterfaceProxyVtbl* const _%s_ProxyVtblList[] =\n", file_id);
982  fprintf(proxy, "{\n");
983  for (i = 0; i < count; i++)
984  fprintf(proxy, " (const CInterfaceProxyVtbl*)&_%sProxyVtbl,\n", interfaces[i]->name);
985  fprintf(proxy, " 0\n");
986  fprintf(proxy, "};\n");
987  fprintf(proxy, "\n");
988 
989  fprintf(proxy, "static const CInterfaceStubVtbl* const _%s_StubVtblList[] =\n", file_id);
990  fprintf(proxy, "{\n");
991  for (i = 0; i < count; i++)
992  fprintf(proxy, " &_%sStubVtbl,\n", interfaces[i]->name);
993  fprintf(proxy, " 0\n");
994  fprintf(proxy, "};\n");
995  fprintf(proxy, "\n");
996 
997  fprintf(proxy, "static PCInterfaceName const _%s_InterfaceNamesList[] =\n", file_id);
998  fprintf(proxy, "{\n");
999  for (i = 0; i < count; i++)
1000  fprintf(proxy, " \"%s\",\n", interfaces[i]->name);
1001  fprintf(proxy, " 0\n");
1002  fprintf(proxy, "};\n");
1003  fprintf(proxy, "\n");
1004 
1005  for (i = 0; i < count; i++)
1006  if ((have_baseiid = get_delegation_indirect( interfaces[i], NULL ))) break;
1007 
1008  if (have_baseiid)
1009  {
1010  fprintf(proxy, "static const IID * _%s_BaseIIDList[] =\n", file_id);
1011  fprintf(proxy, "{\n");
1012  for (i = 0; i < count; i++)
1013  {
1014  if (get_delegation_indirect(interfaces[i], &delegate_to))
1015  fprintf( proxy, " &IID_%s, /* %s */\n", delegate_to->name, interfaces[i]->name );
1016  else
1017  fprintf( proxy, " 0,\n" );
1018  }
1019  fprintf(proxy, " 0\n");
1020  fprintf(proxy, "};\n");
1021  fprintf(proxy, "\n");
1022  }
1023 
1024  fprintf(proxy, "static int __stdcall _%s_IID_Lookup(const IID* pIID, int* pIndex)\n", file_id);
1025  fprintf(proxy, "{\n");
1026  fprintf(proxy, " int low = 0, high = %d;\n", count - 1);
1027  fprintf(proxy, "\n");
1028  fprintf(proxy, " while (low <= high)\n");
1029  fprintf(proxy, " {\n");
1030  fprintf(proxy, " int pos = (low + high) / 2;\n");
1031  fprintf(proxy, " int res = IID_GENERIC_CHECK_IID(_%s, pIID, pos);\n", file_id);
1032  fprintf(proxy, " if (!res) { *pIndex = pos; return 1; }\n");
1033  fprintf(proxy, " if (res > 0) low = pos + 1;\n");
1034  fprintf(proxy, " else high = pos - 1;\n");
1035  fprintf(proxy, " }\n");
1036  fprintf(proxy, " return 0;\n");
1037  fprintf(proxy, "}\n");
1038  fprintf(proxy, "\n");
1039 
1040  table_version = get_stub_mode() == MODE_Oif ? 2 : 1;
1041  for (i = 0; i < count; i++)
1042  {
1043  if (interfaces[i]->details.iface->async_iface != interfaces[i]) continue;
1044  if (table_version != 6)
1045  {
1046  fprintf(proxy, "static const IID *_AsyncInterfaceTable[] =\n");
1047  fprintf(proxy, "{\n");
1048  table_version = 6;
1049  }
1050  fprintf(proxy, " &IID_%s,\n", interfaces[i]->name);
1051  fprintf(proxy, " (IID*)(LONG_PTR)-1,\n");
1052  }
1053  if (table_version == 6)
1054  {
1055  fprintf(proxy, " 0\n");
1056  fprintf(proxy, "};\n");
1057  fprintf(proxy, "\n");
1058  }
1059 
1060  fprintf(proxy, "const ExtendedProxyFileInfo %s_ProxyFileInfo DECLSPEC_HIDDEN =\n", file_id);
1061  fprintf(proxy, "{\n");
1062  fprintf(proxy, " (const PCInterfaceProxyVtblList*)_%s_ProxyVtblList,\n", file_id);
1063  fprintf(proxy, " (const PCInterfaceStubVtblList*)_%s_StubVtblList,\n", file_id);
1064  fprintf(proxy, " _%s_InterfaceNamesList,\n", file_id);
1065  if (have_baseiid) fprintf(proxy, " _%s_BaseIIDList,\n", file_id);
1066  else fprintf(proxy, " 0,\n");
1067  fprintf(proxy, " _%s_IID_Lookup,\n", file_id);
1068  fprintf(proxy, " %d,\n", count);
1069  fprintf(proxy, " %u,\n", table_version);
1070  fprintf(proxy, " %s,\n", table_version == 6 ? "_AsyncInterfaceTable" : "0");
1071  fprintf(proxy, " 0,\n");
1072  fprintf(proxy, " 0,\n");
1073  fprintf(proxy, " 0\n");
1074  fprintf(proxy, "};\n");
1075 }
static struct list expr_eval_routines
Definition: typegen.c:53
static int indent
Definition: proxy.c:41
void write_typeformatstring(FILE *file, const statement_list_t *stmts, type_pred_t pred)
Definition: typegen.c:3742
void write_user_quad_list(FILE *file)
Definition: typegen.c:4899
enum stub_mode get_stub_mode(void)
Definition: widl.c:211
GLuint GLuint GLsizei count
Definition: gl.h:1545
char * proxy_token
Definition: widl.c:142
static void print_proxy(const char *format,...) __attribute__((format(printf
Definition: proxy.c:44
static int need_proxy_and_inline_stubs(const type_t *iface)
Definition: proxy.c:834
char * header_name
Definition: widl.c:136
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
static type_t ** sort_interfaces(const statement_list_t *stmts, int *count)
Definition: proxy.c:912
static void write_stubdesc(int expr_eval_routines)
Definition: proxy.c:58
smooth NULL
Definition: ftsmooth.c:416
void write_procformatstring(FILE *file, const statement_list_t *stmts, type_pred_t pred)
Definition: typegen.c:1502
int write_expr_eval_routines(FILE *file, const char *iface)
Definition: typegen.c:4838
static FILE * proxy
Definition: proxy.c:40
const char * name
Definition: widltypes.h:418
void write_formatstringsdecl(FILE *f, int indent, const statement_list_t *stmts, type_pred_t pred)
Definition: typegen.c:929
unsigned int pointer_size
Definition: widl.c:158
static int get_delegation_indirect(const type_t *iface, const type_t **delegate_to)
Definition: proxy.c:135
int need_proxy(const type_t *iface)
Definition: proxy.c:796
void write_expr_eval_routine_list(FILE *file, const char *iface)
Definition: typegen.c:4877
static int does_any_iface(const statement_list_t *stmts, type_pred_t pred)
Definition: proxy.c:779
static void write_stubdescproto(void)
Definition: proxy.c:52
static void write_proxy_stmts(const statement_list_t *stmts, unsigned int *proc_offset)
Definition: proxy.c:860
Definition: name.c:36
int details
Definition: msacm.c:1365
void write_exceptions(FILE *file)
Definition: typegen.c:5014
Definition: widl.h:89

Referenced by write_proxies().

◆ write_proxy_stmts()

static void write_proxy_stmts ( const statement_list_t stmts,
unsigned int proc_offset 
)
static

Definition at line 860 of file proxy.c.

861 {
862  const statement_t *stmt;
863  if (stmts) LIST_FOR_EACH_ENTRY( stmt, stmts, const statement_t, entry )
864  {
865  if (stmt->type == STMT_TYPE && type_get_type(stmt->u.type) == TYPE_INTERFACE)
866  {
867  type_t *iface = stmt->u.type;
868  if (need_proxy(iface))
869  {
870  write_proxy(iface, proc_offset);
871  if (iface->details.iface->async_iface)
872  write_proxy(iface->details.iface->async_iface, proc_offset);
873  }
874  }
875  }
876 }
union _type_t::@4052 details
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
statement_type_t type
Definition: parser.h:124
static enum type_type type_get_type(const type_t *type)
Definition: typetree.h:68
struct iface_details * iface
Definition: widltypes.h:427
uint32_t entry
Definition: isohybrid.c:63
union _statement_t::@4053 u
int need_proxy(const type_t *iface)
Definition: proxy.c:796
static void write_proxy(type_t *iface, unsigned int *proc_offset)
Definition: proxy.c:612

Referenced by write_proxy_routines().

◆ write_stub_methods()

static int write_stub_methods ( type_t iface,
int  skip 
)
static

Definition at line 555 of file proxy.c.

556 {
557  const statement_t *stmt;
558  int i = 0;
559 
560  if (type_iface_get_inherit(iface))
562  else
563  return i; /* skip IUnknown */
564 
566  const var_t *func = stmt->u.var;
567  if (!is_callas(func->attrs)) {
568  int missing = 0;
569  const char * fname = get_name(func);
570  if(is_local(func->attrs)) {
571  const statement_t * callas_source = get_callas_source(iface, func);
572  if(!callas_source)
573  missing = 1;
574  else
575  fname = get_name(callas_source->u.var);
576  }
577  if (i) fprintf(proxy,",\n");
578  if (skip || missing) print_proxy("STUB_FORWARDING_FUNCTION");
579  else if (is_interpreted_func( iface, func ))
580  print_proxy( "(PRPC_STUB_FUNCTION)%s", get_stub_mode() == MODE_Oif ? "NdrStubCall2" : "NdrStubCall" );
581  else print_proxy( "%s_%s_Stub", iface->name, fname);
582  i++;
583  }
584  }
585  return i;
586 }
#define STATEMENTS_FOR_EACH_FUNC(stmt, stmts)
Definition: widltypes.h:596
GLenum func
Definition: glext.h:6028
int is_interpreted_func(const type_t *iface, const var_t *func)
Definition: typegen.c:1240
var_t * var
Definition: widltypes.h:538
enum stub_mode get_stub_mode(void)
Definition: widl.c:211
int is_local(const attr_list_t *a)
Definition: header.c:938
static const statement_t * get_callas_source(const type_t *iface, const var_t *def)
Definition: proxy.c:480
static void print_proxy(const char *format,...) __attribute__((format(printf
Definition: proxy.c:44
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
int get_name(unsigned char **pos, uint32_t *remaining, const char **out_name)
Definition: util.c:55
static FILE * proxy
Definition: proxy.c:40
const char * name
Definition: widltypes.h:418
static type_t * type_iface_get_inherit(const type_t *type)
Definition: typetree.h:158
union _statement_t::@4053 u
static int need_delegation(const type_t *iface)
Definition: proxy.c:129
const var_t * is_callas(const attr_list_t *a)
Definition: header.c:943
#define skip(...)
Definition: atltest.h:64
static int write_stub_methods(type_t *iface, int skip)
Definition: proxy.c:555
static statement_list_t * type_iface_get_stmts(const type_t *type)
Definition: typetree.h:151
Definition: widl.h:89

Referenced by write_proxy().

◆ write_stubdesc()

static void write_stubdesc ( int  expr_eval_routines)
static

Definition at line 58 of file proxy.c.

59 {
60  print_proxy( "static const MIDL_STUB_DESC Object_StubDesc =\n{\n");
61  indent++;
62  print_proxy( "0,\n");
63  print_proxy( "NdrOleAllocate,\n");
64  print_proxy( "NdrOleFree,\n");
65  print_proxy( "{0}, 0, 0, %s, 0,\n", expr_eval_routines ? "ExprEvalRoutines" : "0");
66  print_proxy( "__MIDL_TypeFormatString.Format,\n");
67  print_proxy( "1, /* -error bounds_check flag */\n");
68  print_proxy( "0x%x, /* Ndr library version */\n", get_stub_mode() == MODE_Oif ? 0x50002 : 0x10001);
69  print_proxy( "0,\n");
70  print_proxy( "0x50100a4, /* MIDL Version 5.1.164 */\n");
71  print_proxy( "0,\n");
72  print_proxy("%s,\n", list_empty(&user_type_list) ? "0" : "UserMarshalRoutines");
73  print_proxy( "0, /* notify & notify_flag routine table */\n");
74  print_proxy( "1, /* Flags */\n");
75  print_proxy( "0, /* Reserved3 */\n");
76  print_proxy( "0, /* Reserved4 */\n");
77  print_proxy( "0 /* Reserved5 */\n");
78  indent--;
79  print_proxy( "};\n");
80  print_proxy( "\n");
81 }
static struct list expr_eval_routines
Definition: typegen.c:53
static int indent
Definition: proxy.c:41
enum stub_mode get_stub_mode(void)
Definition: widl.c:211
static void print_proxy(const char *format,...) __attribute__((format(printf
Definition: proxy.c:44
user_type_list_t user_type_list
Definition: header.c:42
__WINE_SERVER_LIST_INLINE int list_empty(const struct list *list)
Definition: list.h:143
Definition: widl.h:89

Referenced by write_proxy_routines().

◆ write_stubdescproto()

static void write_stubdescproto ( void  )
static

Definition at line 52 of file proxy.c.

53 {
54  print_proxy( "static const MIDL_STUB_DESC Object_StubDesc;\n");
55  print_proxy( "\n");
56 }
static void print_proxy(const char *format,...) __attribute__((format(printf
Definition: proxy.c:44

Referenced by write_proxy_routines().

◆ write_thunk_methods()

static void write_thunk_methods ( type_t iface,
int  skip 
)
static

Definition at line 588 of file proxy.c.

589 {
590  const statement_t *stmt;
591 
592  if (type_iface_get_inherit( iface ))
594  else
595  return; /* skip IUnknown */
596 
598  {
599  var_t *func = stmt->u.var;
600  const statement_t * callas_source = NULL;
601 
602  if (is_callas(func->attrs)) continue;
603  if (is_local(func->attrs)) callas_source = get_callas_source(iface, func);
604 
605  if (!skip && callas_source && is_interpreted_func( iface, func ))
606  print_proxy( "%s_%s_Thunk,\n", iface->name, get_name(callas_source->u.var) );
607  else
608  print_proxy( "0, /* %s::%s */\n", iface->name, get_name(func) );
609  }
610 }
#define STATEMENTS_FOR_EACH_FUNC(stmt, stmts)
Definition: widltypes.h:596
GLenum func
Definition: glext.h:6028
int is_interpreted_func(const type_t *iface, const var_t *func)
Definition: typegen.c:1240
var_t * var
Definition: widltypes.h:538
int is_local(const attr_list_t *a)
Definition: header.c:938
static const statement_t * get_callas_source(const type_t *iface, const var_t *def)
Definition: proxy.c:480
static void print_proxy(const char *format,...) __attribute__((format(printf
Definition: proxy.c:44
int get_name(unsigned char **pos, uint32_t *remaining, const char **out_name)
Definition: util.c:55
smooth NULL
Definition: ftsmooth.c:416
const char * name
Definition: widltypes.h:418
static type_t * type_iface_get_inherit(const type_t *type)
Definition: typetree.h:158
union _statement_t::@4053 u
static int need_delegation(const type_t *iface)
Definition: proxy.c:129
const var_t * is_callas(const attr_list_t *a)
Definition: header.c:943
#define skip(...)
Definition: atltest.h:64
static void write_thunk_methods(type_t *iface, int skip)
Definition: proxy.c:588
static statement_list_t * type_iface_get_stmts(const type_t *type)
Definition: typetree.h:151

Referenced by write_proxy().

Variable Documentation

◆ indent

◆ proxy