msi: Properly release the record.
[wine] / dlls / rpcrt4 / tests / server.idl
1 /*
2  * A simple interface to test the RPC server.
3  *
4  * Copyright (C) Google 2007 (Dan Hipschman)
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include "server_defines.h"
22
23 typedef struct tag_vector
24 {
25   int x;
26   int y;
27   int z;
28 } vector_t;
29
30 [
31   uuid(00000000-4114-0704-2301-000000000000),
32 #ifndef __midl
33   implicit_handle(handle_t IServer_IfHandle)
34 #endif
35 ]
36 interface IServer
37 {
38 cpp_quote("#if 0")
39   typedef wchar_t WCHAR;
40 cpp_quote("#endif")
41
42   typedef [string] char *str_t;
43   typedef [string] WCHAR *wstr_t;
44
45   typedef struct
46   {
47     int *pi;
48     int **ppi;
49     int ***pppi;
50   } pints_t;
51
52   typedef struct
53   {
54     char *pc;
55     short *ps;
56     long *pl;
57     float *pf;
58     double *pd;
59   } ptypes_t;
60
61   typedef struct
62   {
63     vector_t *pu;
64     vector_t **pv;
65   } pvectors_t;
66
67   typedef struct
68   {
69     [switch_is(s)] union
70     {
71       [case(SUN_I)] int i;
72       [case(SUN_F1, SUN_F2)] float f;
73       [case(SUN_PI)] int *pi;
74     } u;
75
76     int s;
77   } sun_t;
78
79   int int_return(void);
80   int square(int x);
81   int sum(int x, int y);
82   void square_out(int x, [out] int *y);
83   void square_ref([in, out] int *x);
84   int str_length([string] const char *s);
85   int cstr_length([string, size_is(n)] const char *s, int n);
86   int dot_self(vector_t *v);
87   double square_half(double x, [out] double *y);
88   float square_half_float(float x, [out] float *y);
89   long square_half_long(long x, [out] long *y);
90   int sum_fixed_array(int a[5]);
91   int pints_sum(pints_t *pints);
92   double ptypes_sum(ptypes_t *ptypes);
93   int dot_pvectors(pvectors_t *pvectors);
94
95   /* don't use this anywhere except in sp_t */
96   typedef struct
97   {
98     int x;
99   } sp_inner_t;
100
101   typedef struct
102   {
103     int x;
104     sp_inner_t *s;
105   } sp_t;
106
107   int sum_sp(sp_t *sp);
108   double square_sun(sun_t *su);
109
110   typedef struct test_list
111   {
112     int t;
113     [switch_is(t)] union
114     {
115       [case(TL_NULL)] int x;  /* end of list */
116       [case(TL_LIST)] struct test_list *tail;
117     } u;
118   } test_list_t;
119
120   int test_list_length(test_list_t *ls);
121   int sum_fixed_int_3d(int m[2][3][4]);
122   int sum_conf_array([size_is(n)] int x[], int n);
123   int sum_unique_conf_array([size_is(n), unique] int x[], int n);
124   int sum_unique_conf_ptr([size_is(n), unique] int *x, int n);
125   int sum_var_array([length_is(n)] int x[20], int n);
126   int dot_two_vectors(vector_t vs[2]);
127
128   typedef struct
129   {
130     int n;
131     [size_is(n)] int ca[];
132   } cs_t;
133
134   typedef struct
135   {
136     int *pn;
137     [size_is(*pn)] int *ca1;
138     [size_is(n * 2)] int *ca2;
139     int n;
140   } cps_t;
141
142   typedef struct
143   {
144     [size_is(c ? a : b)] int *ca;
145     int a;
146     int b;
147     int c;
148   } cpsc_t;
149
150   int sum_cs(cs_t *cs);
151   int sum_cps(cps_t *cps);
152   int sum_cpsc(cpsc_t *cpsc);
153
154   typedef [wire_marshal(int)] void *puint_t;
155   int square_puint(puint_t p);
156
157   typedef struct
158   {
159     [size_is(n)] puint_t *ps;
160     int n;
161   } puints_t;
162
163   /* Same thing as puints_t, but make it complex (needs padding).  */
164   typedef struct
165   {
166     [size_is(n)] puint_t *ps;
167     char n;
168   } cpuints_t;
169
170   int sum_puints(puints_t *p);
171   int sum_cpuints(cpuints_t *p);
172   int dot_copy_vectors(vector_t u, vector_t v);
173
174   typedef struct wire_us *wire_us_t;
175   typedef [wire_marshal(wire_us_t)] struct us us_t;
176   struct us
177   {
178     void *x;
179   };
180   struct wire_us
181   {
182     int x;
183   };
184   typedef struct
185   {
186     us_t us;
187   } test_us_t;
188
189   int square_test_us(test_us_t *tus);
190
191   typedef union encu switch (int t)
192   {
193   case ENCU_I: int i;
194   case ENCU_F: float f;
195   } encu_t;
196
197   typedef enum
198   {
199     E1 = 23,
200     E2 = 4,
201     E3 = 0,
202     E4 = 64
203   } e_t;
204
205   typedef union encue switch (e_t t)
206   {
207   case E1: int i1;
208   case E2: float f2;
209   } encue_t;
210
211   double square_encu(encu_t *eu);
212   int sum_parr(int *a[3]);
213   int sum_pcarr([size_is(n)] int *a[], int n);
214   int enum_ord(e_t e);
215   double square_encue(encue_t *eue);
216
217   int sum_toplev_conf_2n([size_is(n * 2)] int *x, int n);
218   int sum_toplev_conf_cond([size_is(c ? a : b)] int *x, int a, int b, int c);
219
220   typedef struct
221   {
222     char c;
223     int i;
224     short s;
225     double d;
226   } aligns_t;
227
228   double sum_aligns(aligns_t *a);
229
230   typedef struct
231   {
232     int i;
233     char c;
234   } padded_t;
235
236   int sum_padded(padded_t *p);
237   int sum_padded2(padded_t ps[2]);
238   int sum_padded_conf([size_is(n)] padded_t *ps, int n);
239
240   typedef struct
241   {
242     int *p1;
243   } bogus_helper_t;
244
245   typedef struct
246   {
247     bogus_helper_t h;
248     int *p2;
249     int *p3;
250     char c;
251   } bogus_t;
252
253   int sum_bogus(bogus_t *b);
254   void check_null([unique] int *null);
255
256   typedef struct
257   {
258     str_t s;
259   } str_struct_t;
260
261   typedef struct
262   {
263     wstr_t s;
264   } wstr_struct_t;
265
266   int str_struct_len(str_struct_t *s);
267   int wstr_struct_len(wstr_struct_t *s);
268
269   typedef struct
270   {
271     unsigned int n;
272     [size_is(n)] byte a[];
273   } doub_carr_1_t;
274
275   typedef struct
276   {
277     int n;
278     [size_is(n)] doub_carr_1_t *a[];
279   } doub_carr_t;
280
281   int sum_doub_carr(doub_carr_t *dc);
282   void make_pyramid_doub_carr(unsigned char n, [out] doub_carr_t **dc);
283
284   typedef struct
285   {
286     short n;
287     [size_is(n)] short data[];
288   } wire_bstr_t;
289
290   typedef [wire_marshal(wire_bstr_t)] short *bstr_t;
291   unsigned hash_bstr(bstr_t s);
292
293   typedef struct
294   {
295     [string, size_is(size)] char *name;
296     unsigned int size;
297   } name_t;
298   void get_name([in,out] name_t *name);
299
300   int sum_pcarr2(int n, [size_is(, n)] int **pa);
301   int sum_L1_norms(int n, [size_is(n)] vector_t *vs);
302
303   str_t get_filename(void);
304
305   void stop(void);
306 }